حساب الوقت المنقضي في الآكسيس تلعب التواريخ والأوقات دورًا حيويًا في معظم تطبيقات قواعد البيانات. سنتعلم كيف يقوم Access بتخزين قيم التاريخ/الوقت وكيفية حساب الوقت المنقضي، مثلما قد يكون مطلوبًا في تطبيق صحيفة الدوام. إننا نوفر نموذج من قاعدة بيانات قابلة للتحميل تحتوي على ثلاثة من عينات الوظائف التي يمكنك نسخها ولصقها. هناك أشياء معينة تعد أساسية في تطبيق قاعدة البيانات، من ضمنها، الحاجة إلى تتبع التواريخ والأوقات. إنك تعمل في التواريخ والأوقات في Access باستخدام نوع البيانات "تاريخ/وقت". تقوم أولاً بتحديد الجداول المستندة إلى المادة التي تحتاجها. ومن ثم، تحدد الحقول التي تحتاجها في تلك الجداول. في كل حقل، تقوم باختيار نوع بيانات. يدعم Access عددًا من أنواع البيانات الأساسية، مثل "نص" و"مذكرة" و"رقم" و"عملة"، و"ترقيم تلقائي" و"نعم/لا" و"كائن OLE" و"ارتباط تشعبي"، وأخيرًا وليس اخرًا، "تاريخ/وقت". لذلك، فإن "تاريخ/وقت" هي نوع بيانات أساسي. فإنك تستخدمه لتخزين تواريخ وأوقات التقويم حتى تستفيد من مجموعة الميزات الثرية ذات الصلة في Access. على سبيل المثال، يمكن لـ Access إجراء الحسابات على التواريخ؛ مثلاً، يمكنك حساب عدد الأيام التي انقضت منذ تاريخ الفاتورة حتى تقوم بتحديد حسابات المقبوضات لديك. ويوجد أيضًا أداة تحقق من البيانات مضمنة بحيث لا يمكن أن تقوم أنت أو المستخدمين لديك بإدخال تاريخ غير صالح، مثل 31/2. بعض أمثلة الاستخدامات لحقول "تاريخ/وقت" تتضمن تواريخ الفواتير وتواريخ الإدخال الخاصة بالطلبات والطوابع الزمنية وتواريخ توظيف الموظفين وأوقات بدء وانتهاء العمل وأوقات الدخول والخروج لبطاقات الدوام. ستحتاج غالبًا إلى تحديد تنسيق بحيث يقوم Access بعرض تاريخ أو وقت بالطريقة التي تريدها. عندما تقوم بإنشاء حقل في أحد الجداول، على سبيل المثال، يمكنك إدخال تنسيق عرض في خاصية التنسيق الخاصة بالحقل. يمكنك اختيار واحدًا من التنسيقات الكثيرة المعرفة مسبقًا أو إنشاء تنسيق مخصص حيث تقوم بدقة بتحديد موضع الشهر واليوم والسنة والساعات والدقائق، وهكذا. إن أحد أكثر الأسئلة شيوعًا حول استخدام قيم "تاريخ/وقت" هو كيفية القيام بحساب الوقت المنقضي وتنسيق النتيجة بشكل صحيح. يتم عرض حلين هنا، ولكن قبل متابعتهما، فلنقم بمراجعة كيفية قيام Access بتخزين قيم "تاريخ/وقت". كيفية تخزين قيم "تاريخ/وقت" يقوم Access بتخزين قيم "تاريخ/وقت" داخليًا كأرقام نقاط متغيرة مزدوجة الدقة . يحتوي كل رقم من هذه الأرقام على مكون تاريخ ومكون وقت. يمثل جزء العدد الصحيح، الموجود إلى يسار النقطة العشرية، التاريخ. ويمثل الجزء الكسري، الموجود إلى يمين النقطة العشرية، الوقت. إن الرقم ذا الدقة المزدوجة الذي يظهر هنا يمثل 24 ديسمبر عام 2003، في الساعة 9:00 مساءً بالرقم 37979.875. وذلك لأن Access يقوم بتخزين عدد الأيام المنقضية منذ التاريخ الأساسي 30/12/1899 كمكون التاريخ. سوف تجد أن عدد الأيام من التاريخ الأساسي (30/12/1899) إلى 24 ديسمبر 2003 هو 37979 يومًا القيم السالبة في مكوّن التاريخ تمثل التواريخ قبل التاريخ الأساسي. على سبيل المثال، فإن القيمة -1 كمكون تاريخ تشير إلى يوم واحد سابق على التاريخ الأساسي، أو 29/12/1899. ويعد مكوّن الوقت كسرًا من اليوم ذا الـ 24 ساعة. لذلك، فإن مكون الوقت البالغ (875.) يساوي 21 ساعة، أو 9:00 مساءً. ولأن الطريقة التي يستخدمها Access لتمثيل قيم "تاريخ/وقت" داخليًا (كما في المثال، 37979.875) ليست هي الطريقة المعتادة التي تعمل بها، فمن الضروري أن يكون لديك القدرة على تحويل قيمة "تاريخ/وقت" ذات تنسيق الدقة المزدوجة الداخلي إلى تنسيق مألوف. يمكنك القيام بذلك باستخدام CDate()، وهي دالة مضمنة في Access. إن الدالة هي إجراء يقوم بتنفيذ وحدة من العمل وغالبًا ما يتم إرجاع نتيجة. يتضمن Access قائمة طويلة من الدوال المضمنة التي يمكنك توظيفها في تطبيقات قواعد البيانات لديك للقيام بأشياء مثل أداء الحسابات، أو كما في هذه الحالة، التحويل من نوع بيانات إلى الآخر. تقوم الدالة CDate() بتحويل القيمة ذات الدقة المزدوجة إلى قيمة "تاريخ/وقت". يمكنك استخدام الدالة CDbl() للقيام بالعكس وتحويل قيمة "تاريخ/وقت" إلى الرقم مزدوج الدقة الذي يعادلها. حساب الوقت المنقضي يعد حساب الوقت المنقضي عملية بسيطة. فيمكن لبرنامج Access القيام بحساب الفاصل الزمني بين تاريخين، حتى بالنسبة للفواصل الزمنية الكبيرة التي تمتد إلى شهور أو سنوات. ورغم ذلك، فإن تنسيق القيمة الناتجة بالطريقة التي تريدها وعرضها، غالبًا ما يتطلب بعض الابتكار في Microsoft Visual Basic® for Applications (VBA)، وهي لغة البرمجة التي يستخدمها برنامج Access. إن الدالة HoursAndMinutes التي تظهر هنا هي دالة مخصصة تقوم بتنسيق الفاصل الزمني بتنسيق ساعات:دقائق. وهي مصممة لتقوم بمعالجة الأوقات المتراكمة بشكل صحيح مثل الجمع في تقرير ورقة الدوام الأسبوعية. فتقوم أنت بتمرير فاصل زمني للدالة أو عملية حساب "تاريخ/وقت" (على سبيل المثال، #12/24/2003 11:00م# - #12/10/2003 6:00ص#), وتقوم الدالة بإرجاع سلسلة ذات تنسيق صحيح (في هذه الحالة 353:00). لتحديد سلسلة "تاريخ/وقت" واضحة، فيجب أن تقوم بتضمين أجزاء التاريخ والوقت بين علامات الجنيه (#). يجب أن تحدد كل من مكوني التاريخ والوقت عند تقديم سلسلة حرفية، من أجل التوضيح ولتجنب الأخطاء.
Public Function HoursAndMinutes(interval As Variant) As String'***********************************************************************' Function HoursAndMinutes(interval As Variant) As String' Returns time interval formatted as a hours:minutes string'***********************************************************************Dim totalminutes As Long, totalseconds As LongDim hours As Long, minutes As Long, seconds As LongIf IsNull(interval) = True Then Exit Functionhours = Int(CSng(interval * 24))totalminutes = Int(CSng(interval * 1440)) ' 1440 = 24 hrs * 60 minsminutes = totalminutes Mod 60totalseconds = Int(CSng(interval * 86400)) ' 86400 = 1440 * 60 secsseconds = totalseconds Mod 60If seconds > 30 Then minutes = minutes + 1 ' round up the minutes andIf minutes > 59 Then hours = hours + 1: minutes = 0 ' adjust hoursHoursAndMinutes = hours & ":" & Format(minutes, "00")End Function
Public Function ElapsedTimeString(dateTimeStart As Date, dateTimeEnd As Date) As String'**********************************************************************************************' Function ElapsedTimeString(dateTimeStart As Date, dateTimeEnd As Date) As String' Returns the time elapsed between a starting Date/Time and an ending' Date/Time formatted as a string that looks like this:' "10 days, 20 hours, 30 minutes, 40 seconds".'**********************************************************************************************Dim interval As Double, str As String, days As VariantDim hours As String, minutes As String, seconds As StringIf IsNull(dateTimeStart) = True Or _ IsNull(dateTimeEnd) = True Then Exit Functioninterval = dateTimeEnd - dateTimeStartdays = Fix(CSng(interval))hours = Format(interval, "h")minutes = Format(interval, "n")seconds = Format(interval, "s")' Days part of the stringstr = IIf(days = 0, "", _ IIf(days = 1, days & " Day", days & " Days"))str = str & IIf(days = 0, "", _ IIf(hours & minutes & seconds <> "000", ", ", " "))' Hours part of the stringstr = str & IIf(hours = "0", "", _ IIf(hours = "1", hours & " Hour", hours & " Hours"))str = str & IIf(hours = "0", "", _ IIf(minutes & seconds <> "00", ", ", " "))' Minutes part of the stringstr = str & IIf(minutes = "0", "", _ IIf(minutes = "1", minutes & " Minute", minutes & " Minutes"))str = str & IIf(minutes = "0", "", IIf(seconds <> "0", ", ", " "))' Seconds part of the stringstr = str & IIf(seconds = "0", "", _ IIf(seconds = "1", seconds & " Second", seconds & " Seconds"))ElapsedTimeString = IIf(str = "", "0", str)End Function
Public Function ElapsedDays(dateTimeStart As Date, dateTimeEnd As Date) As String'****************************************************************************************' Function ElapsedDays(dateTimeStart As Date, dateTimeEnd As Date) As String' Returns the time elapsed in days between a starting Date/Time and' an ending Date/Time formatted as a string that looks like this:' "10 days" or "1 day".'****************************************************************************************Dim interval As Double, days As VariantIf IsNull(dateTimeStart) = True Or _ IsNull(dateTimeEnd) = True Then Exit Functioninterval = dateTimeEnd - dateTimeStartdays = Fix(CSng(interval))ElapsedDays = IIf(days = 1, days & " Day", days & " Days")End Function
=ElapsedTimeString([OrderDate],[ShippedDate])
=HoursAndMinutes([TimeOut]-[TimeIn])
=HoursAndMinutes(Sum([TimeOut]-[TimeIn]))
=[TimeSheet Subform].Form!SummedHoursMinutes