الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الشهر الموجود بين تاريخين

بدأه al.sheen في 22 يناير 2016 · 4 رد · 766 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته 

فضالا منكم يا اخوان الله يعطيكم العافية 

عندي جدول مخزن فيه تاريخ مباشرة الموظف  وهذا التاريخ ثابت 

ولديه جدول اخر يتم فيه اعداد الرواتب لكل شهر 

اللذي اريده استعلام او كود يعطيني الاشهر التي لم  يتم اعداد راتب للموظف فبها والتي تقع بين تاريخ المباشرة وتاريخ اليوم 

بناء على جدوال اعداد الرواتب 

مثال ( تاريخ المباشرة 1/11/2014

تم اعداد الراتب  اشهر 12/2014      وشهر 1/2015   وشهر 5/2015 

معني ان هناك ثلاثة اشهر  لم يتم اعداد الراتب لها وهي  

11/2014         و 3/2015         و 4/2015 

اشكرك الجميع وجزاكم الله بكل حرف حسنة 

الشهر الغير موجود.rar

تم تعديل هذه المشاركة بواسطة al.sheen في 22 يناير 2016 في 02:26

#2

السلام عليكم

ماقمت باضافته لقاعدة البيانات هو جدولين وحقل واحد فقط في جدول من الجداول الخاصة بك.

الجدول الاول هو: SarfRatabMonth 

يجب تسجيل الاشهر التي تريد صرف مرتبات عنها في هذا الجدول؛ مع مرعاة ان تسجيل الشهر يكون الشهر والسنة فقط.

مثلا صرف مرتبات عن شهر: 11-2015 أو 12-2015

الجدول الثاني هو: SarfRatabMonthTemp

وهو جدول مؤقت يتم مسح محتوياته في كل مرة تريد الاستعلام عن الاشهر التي لم تصرف لموظف او للموظفين. لذلك لا تقم بإدخال أي بيانات بداخله لانه سوف تحذف في كل مرة نقوم فيها بشغيل الكود المسئول عن تحضير البيانات.

 

الحقل الذي قمت باضافته وهو حقل SarfRatabMonthFK في جدول raetb_tamb

فائدة هذا الحقل لكي نستطيع الربط مع الجدول المؤقت الذي قمنا بانشانه ؛ مع مرعاة ان تقوم بتسجيل الشهر الذي قمت بصرف مرتب عنه في هذا الحقل. كذلك يجب الانتباه ان تسجيل البيانات في هذا الحقل عن طريق الشهر والسنة فقط إيضا كما في الجدول السابق. مثال: 11-2015 أو 12-2015 ... وهكذا

 

الكود المستخدم كالتالي:

Function CalcNullMnthes()


    DoCmd.SetWarnings False
        
        DoCmd.RunSQL "DELETE SarfRatabMonthTemp.*FROM SarfRatabMonthTemp;"
            
    DoCmd.SetWarnings True
    
    
    Dim StrtFrom, EndIn As Long
    
    StrtFrom = Nz(DMin("w_code", "workers"), 0)
    EndIn = Nz(DMax("w_code", "workers"), 0)
    
    
            While StrtFrom <= EndIn
            
                    DoCmd.SetWarnings False
                        DoCmd.RunSQL "INSERT INTO SarfRatabMonthTemp ( SarfRatabMonth ) SELECT SarfRatabMonth.SarfRatabMonth FROM SarfRatabMonth;"
                        DoCmd.RunSQL "UPDATE SarfRatabMonthTemp SET SarfRatabMonthTemp.EmpID = " & StrtFrom & " WHERE SarfRatabMonthTemp.EmpID=0;"
                    DoCmd.SetWarnings True
                    StrtFrom = Nz(DMin("w_code", "workers", "w_code >" & StrtFrom), 0)
                    If StrtFrom = 0 Then StrtFrom = EndIn + 1
                    
                    
            Wend
 
 DoCmd.OpenQuery "الاشهر التي لم تصرف للموظفين"
 
End Function

الكود يعمل الاتي:

يقوم الكود بإيقاف التنبيهات التي تقوم عند حذف البيانات الموجودة ف الجدول المؤقت الذي قمنا باإنشائه  SarfRatabMonthTemp

ثم يقوم بالبحث في جدول المرظفين workers عن رقم الموظف الاول "أصغر رقم كود للموظف" ثم يقوم بالاستعلام عن أكبر رقم للموظف

يقوم بعد ذلك بإدراج جميع البيانات "الاشهر" المسجلة في جدول SarfRatabMonth الجديد الذي قمنا بإنشائة والذي تقوم فيه بتسجيل الاشهر التي تريد صرف مرتبات عنها

ثم يقوم الكود بعد ذلك بتحديث قيمة رقم الموظف في هذا الجدول المؤقت الي الموظف الذي عليه الدور في تعريف قاعدة البيانات به.

بحيث يكون النتائج النهائي لدينا هو جدول به جميع الاشهر التي تريد صرف مرتبات عنها ؛ وامام كل شهر أرقام الموظفين الموجودين فعليا لديك في المنشأة.

 

بعد تجهيز جدول بهذه البيانات يمكننا ببساطة عمل مقارنة بينه وبين جدول صرف المرتبات الفعلي الموجود تحت أسم raetb_tamb

وذلك من خلال إستعلام إنشائته أسمه "الاشهر التي لم تصرف للموظفين" ... عذرا قمت بإنشائه باللغة العربية للتوضيح طبعا.. أرجو تغير هذا الاسم عند العمل به

 

بعد ذلك قمت بإنشاء ماكرو صغير يقوم بهذه العميلة تحت أسم "المرتبات التي لم تصرف"

فقط كل ما عليك هو الضغط مرتين علي أسم الماكرو وسوف تجد كل شئ يظهر سريعا...

يمكنك تغير الاوامر من خلال التعديل علي الدالة: CalcNullMnthes

 

 

الملف بعد التعديل

الشهر الغير موجود.rar

 

أتمني لك التوفيق

تم تعديل هذه المشاركة بواسطة Hisham_wz في 22 يناير 2016 في 06:18 — السبب: خطأ في اللغة العربية

1
#3

اشكرك جزيل الشكر 

وهل يوجد طريقة انني استغني عن جدول الاشهر الذي اقوم بتسجيل الشهر فيه   والاعتماد علي الجدول الموقت 

تحياتي 

#4

بالتأكيد يوجد أكثر من طريق ؛

قمت بحذف الجدول ثم قمت باضافة بعد التعديلات علي الدالة ؛ بحيث أصبحت بالشكل التالي

Function CalcNullMnthes()


    DoCmd.SetWarnings False
        
        DoCmd.RunSQL "DELETE SarfRatabMonthTemp.*FROM SarfRatabMonthTemp;"
            
    DoCmd.SetWarnings True
    
' ===================================
Dim TheFMonth, TheLMonth, TempValueToU As Date
Dim CountNub As Long

TheFMonth = DMin("ordermanth", "raetb_tamb")
TheLMonth = DMax("ordermanth", "raetb_tamb")

While TheFMonth <= TheLMonth
    
    CountNub = 1
    
    If CountNub <> 1 Then
        TempValueToU = DateAdd("m", 1, TheFMonth)
        
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO SarfRatabMonthTemp ( SarfRatabMonth, EmpID ) SELECT #" & TempValueToU & "#;"
        DoCmd.SetWarnings True
        
    Else
    
        TempValueToU = TheFMonth
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO SarfRatabMonthTemp ( SarfRatabMonth, EmpID ) SELECT #" & TempValueToU & "#, 0;"
        DoCmd.SetWarnings True
        TempValueToU = DateAdd("m", 1, TheFMonth)
        
    End If
    
    
    CountNub = CountNub + 1
    TheFMonth = TempValueToU

Wend
'====================================

    
    Dim StrtFrom, EndIn As Long
    
    StrtFrom = Nz(DMin("w_code", "workers"), 0)
    EndIn = Nz(DMax("w_code", "workers"), 0)
    
    
            While StrtFrom <= EndIn
            
                    DoCmd.SetWarnings False
                        'DoCmd.RunSQL "INSERT INTO SarfRatabMonthTemp ( SarfRatabMonth ) SELECT SarfRatabMonth.SarfRatabMonth FROM SarfRatabMonth;"
                        DoCmd.RunSQL "UPDATE SarfRatabMonthTemp SET SarfRatabMonthTemp.EmpID = " & StrtFrom & " WHERE SarfRatabMonthTemp.EmpID=0;"
                    DoCmd.SetWarnings True
                    StrtFrom = Nz(DMin("w_code", "workers", "w_code >" & StrtFrom), 0)
                    If StrtFrom = 0 Then StrtFrom = EndIn + 1
                    
                    
            Wend
 
 DoCmd.OpenQuery "الاشهر التي لم تصرف للموظفين"
 
End Function

 

ما قمت باضافته يقع بين هذين العلامتين:

'====================================

 

توضيح الاضافة:

قمت بالاستعلام من جدول raetb_tamb عن اصغر شهر تم صرف مرتبات عنه ؛ وكذلك قمت بالاستعلام عن أكبر شهر تم صرف مرتبات عنه من خلال الدالتين DMin  و DMax

قمت بعد ذلك باستخدام دالة التكرار While حتي اقوم في كل مرة بتنفيذ أمر معين وهو ترحيل الشهر الي الجدول المؤقت

قمت باستخدام قاعدة IF بحيث إذا كانت اول مرة يتم تشغيل الدالة While يقم بنقل السجل دون اضافة أشهر عليه

أما إذا لم تكن هذه اول مرة لتشغيل الدالة While يقوم باضافة شهر الي الشهر السابق باستخدام الدالة DateAdd

ثم في النهاية قمت بتزويد القيمة حتي استطيع الخروج من While

 

مرفق الملف بعد التعديل الاخير

الشهر الغير موجود.rar

 

 

أتمني لك التوفيق

#5

اشكرك جزيل الشكر 

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…