احتساب ايام العمل الفعلية بين تاريخين

احتساب ايام العمل الفعلية بين تاريخين
لاحتساب ايام العمل الفعلية بين تاريخين يجب الانتباه الى صيغة التاريخ المستخدمة في جهاز الكمبيوتر واذا كان البرنام الذي يتم العمل علية سيستخدم في اكثر من جهاز فانه يجب الانتباه الى اعدادات الاجهزة والسبب هو ان برنامج الاكسس سيتعامل مع التاريخ بصيغة التاريخ المستخدم في امريكا (mm/dd/yyyy)  وبالتالي فان تاريخ 7 فبراير سيتم قرأته على انه 2 يوليو ومن هنا يجب الانتباه جيدا لهذا الموضوع في بناء البرنامج.
ان الطريقة التي سنعمل بها هي كما يلي:
  1. سيتم احساب عدد الايام بين تاريخ البداية وتاريخ النهاية
  2. سيتم احتساب عدد ايام اجازة نهاية الاسبوع بين التاريخين (ايام الجمعة والسبت)
  3. سيتم احتساب ايام العطل الرسمية عدا ايام نهاية الاسبوع وهذا سيتطلب انشاء جدول للمناسبات والعطل الرسمية
لا بد من انشاء جدول باسم (tblHolidays) ويحتوي على الحقول التالية :
  1. HolidayDate وهذا الحقل يخص تاريخ العطلة
  2. HolidayDescription وهذا التاريخ يخص اسم العطلة وهو اختياري
  3. Ndat ملاحضات على العطلة وهو اختياري
وسيكون شكل الجدول كما يلي:

tblHolidays
HolidayDate
HolidayDescription
ndat
Tue 16/Aug/2016
عطلة رسمية


يتم و ضع الكود في وحدة نمطية ومن ثم استدعاؤة في الاستعلام او في النماذج او التقارير حسب الحاجة وسيكون الكود بهذا الشكل :

Option Compare Database Option Explicit Public Function WorkDays(Startdate As Date, EndDate As Date) As Integer Dim intHolidays As Integer Dim intTotalDays As Integer Dim intWeekendDays As Integer Dim rst As DAO.Recordset Dim strSQL As String Dim sTRD As Date, eNDD As Date Dim ddz, mmz, yyyyz As Integer Dim dds, mms, yyyys As Integer ddz = Day(EndDate) mmz = Month(EndDate) yyyyz = Year(EndDate) eNDD = DateValue(Format(ddz & "/" & mmz & "/" & yyyyz, "dd/mm/yyyy")) dds = Day(Startdate) mms = Month(Startdate) yyyys = Year(Startdate) sTRD = DateValue(Format(dds & "/" & mms & "/" & yyyys, "dd/mm/yyyy")) strSQL = "Select Count(*) as HolidayCount From tblHolidays " & _ "Where HolidayDate BETWEEN #" & sTRD & "#" & _ " AND " & "#" & DateValue(eNDD) & "#;" Set rst = CurrentDb.OpenRecordset(strSQL) intHolidays = rst!HolidayCount 'Count Holidays between dates intTotalDays = DateDiff("d", sTRD, eNDD) + 1 'Calc dif in days intWeekendDays = DateDiff("ww", sTRD - 1, eNDD, vbFriday) + DateDiff("ww", sTRD - 1, eNDD, vbSaturday) 'Calc Count of Fryda + saturday WorkDays = intTotalDays - intWeekendDays - intHolidays Set rst = Nothing End Function


وفي الاستعلام او النموذج او التقرير يتم استدعاء الوظيفة او الكود وكما يلي:
WorkDays (start date , end date )




تعليقات

المشاركات الشائعة من هذه المدونة

الشروط في الاستعلامات

اخفاء اطار/ شاشة مايكروسوفت اكسس

انواع الاستعلامات في اكسس