بتـــــاريخ : 2/15/2011 12:41:32 AM
الفــــــــئة
  • التربيــــــــــة
  • التعليقات المشاهدات التقييمات
    0 2356 0


    حساب الوقت المنقضي في أكسيس

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : zahrah | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :
    حساب الوقت المنقضي أكسيس

    حساب الوقت المنقضي في الآكسيس

    تلعب التواريخ والأوقات دورًا حيويًا في معظم تطبيقات قواعد البيانات. سنتعلم كيف يقوم 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 يومًا
    Posted Image
    القيم السالبة في مكوّن التاريخ تمثل التواريخ قبل التاريخ الأساسي. على سبيل المثال، فإن القيمة -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 Long
    Dim hours As Long, minutes As Long, seconds As Long
    If IsNull(interval) = True Then Exit Function

    hours = Int(CSng(interval * 24))

    totalminutes = Int(CSng(interval * 1440)) ' 1440 = 24 hrs * 60 mins
    minutes = totalminutes Mod 60

    totalseconds = Int(CSng(interval * 86400))  ' 86400 = 1440 * 60 secs
    seconds = totalseconds Mod 60

    If seconds > 30 Then minutes = minutes + 1 ' round up the minutes and
    If minutes > 59 Then hours = hours + 1: minutes = 0 ' adjust hours

    HoursAndMinutes = hours & ":" & Format(minutes, "00")
    End Function

    تعمل الدالة HoursAndMinutes بواسطة حساب الأجزاء الفردية للساعات، والدقائق، والثواني قيد المعالجة للحصول على المكونات الفردية للفاصل. عندما تقوم بطرح إحدى قيم "تاريخ/وقت" من الأخرى للحصول على فاصل زمني، ينتهي بك الأمر برقم ذو دقة مزدوجة مع كون عدد الأيام موجود إلى يسار النقطة العشرية والكسر الخاص بالمتبقي من اليوم إلى اليمين. للحصول على مكون الساعات، قم بضرب الفاصل الزمني في 24. يتم الحصول على ناتج مكون الدقائق بواسطة ضرب الفاصل في 1440 أولاً، وهو عدد الدقائق في اليوم الواحد. ينتج عن ذلك العدد الكلي للدقائق الممثلة في الفاصل. قم بعد ذلك بقسمة ذلك الرقم على 60 لإزالة الدقائق المضمنة مسبقًا في ناتج الساعات، وينتج عن ذلك الباقي الذي يعطينا الرقم الذي نحتاجه (يقوم مشغل Mod بهذه العملية). وبنفس الطريقة، قم بحساب إجمالي اليوم ثم بالقسمة للحصول على المتبقي، لينتج عن ذلك مكون الثواني.
    يتكون باقي الدالة من تقريب الناتج إلى ساعات ودقائق وبناء سلسلة النتيجة.
    قد تحتاج في بعض الأحيان إلى سلسلة نتيجة لفظية وأكثر قابلية للقراءة. وهنا بديلاً يقبل قيمتين لـ "تاريخ/وقت" ويُرجع الوقت المنقضي كسلسلة واحدة طويلة تبدو هكذا: "10 أيام، 20 ساعة، 30 دقيقة، 40 ثانية".
    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 Variant
    Dim hours As String, minutes As String, seconds As String
    If IsNull(dateTimeStart) = True Or _
       IsNull(dateTimeEnd) = True Then Exit Function

    interval = dateTimeEnd - dateTimeStart

    days = Fix(CSng(interval))
    hours = Format(interval, "h")
    minutes = Format(interval, "n")
    seconds = Format(interval, "s")

    ' Days part of the string
    str = IIf(days = 0, "", _
       IIf(days = 1, days & " Day", days & " Days"))
    str = str & IIf(days = 0, "", _
       IIf(hours & minutes & seconds <> "000", ", ", " "))
    ' Hours part of the string
    str = str & IIf(hours = "0", "", _
       IIf(hours = "1", hours & " Hour", hours & " Hours"))
    str = str & IIf(hours = "0", "", _
       IIf(minutes & seconds <> "00", ", ", " "))
    ' Minutes part of the string
    str = str & IIf(minutes = "0", "", _
       IIf(minutes = "1", minutes & " Minute", minutes & " Minutes"))
    str = str & IIf(minutes = "0", "", IIf(seconds <> "0", ", ", " "))
    ' Seconds part of the string
    str = str & IIf(seconds = "0", "", _
       IIf(seconds = "1", seconds & " Second", seconds & " Seconds"))
    ElapsedTimeString = IIf(str = "", "0", str)
    End Function

    تعمل الدالة ElapsedTimeString بواسطة القيام أولاً بطرح وقت البدء من وقت الانتهاء للحصول على الفاصل الزمني. ثم بعد ذلك تقوم بتحديد المكونات الفردية للأيام والساعات والدقائق والثواني بواسطة استخدام الدالة تنسيق. ومن ثم، تقوم الدالة ببناء سلسلة ناتجة باستخدام القطع التي يتم تجميعها بالطريقة التي نريدها، باستخدام النتائج الفردية ("يوم" بدلاً من "أيام") وإزالة المكونات غير الضرورية مثل "صفر من الثواني".
    إنشاء الدوال
    يمكنك تحميل نموذج قاعدة البيانات الخاصة بهذا العمود. سوف تجد في قاعدة البيانات وحدة التعليمة البرمجية VBA النمطية الخاصة "بالوقت المنقضي" وهي تحتوي على الدالتين HoursAndMinutes وElapsedTimeString. لإنشاء الدالتين بنفسك، قم بتشغيل برنامج Microsoft Access واتبع هذه الخطوات:
    1.على القائمة ملف، انقر فوق فتح، ثم انقر فوق قاعدة البيانات حيث تريد إدراج الدالتين.
    2.في إطار "قاعدة البيانات"، انقر فوق وحدات نمطية.
    3.انقر فوق جديد لإنشاء وحدة جديدة.
    4.قم بكتابة الدالتين HoursAndMinutes وElapsedTimeString كما تراهم هنا تمامًا. أو، إذا كنت قد قمت بتحميل عينة قاعدة البيانات، فقم بنسخ الدالتين ولصقهما من الوحدة النمطية "الوقت المنقضي".
    5.على القائمة File، انقر فوق Save.
    6.اكتب اسم الوحدة النمطية، مثل الوقت المنقضي، ومن ثم اضغط على ENTER.
    7.على القائمة Debug، انقر فوق Compile.
    8.على القائمة File، انقر فوق Close and Return to Microsoft Office Access.
    بعد أن تقوم بوضع الدالتين في قاعدة البيانات الخاصة بك، يمكنك استخدامهما في كائنات Access مثل الاستعلامات والنماذج والتقارير.
    توظيف الوقت المنقضي في الاستعلامات والنماذج والتقارير
    فلنفترض أنك تريد معرفة الوقت الذي يستغرقه شحن طلب كل منتج. لذا فإنك تقوم بإنشاء استعلام يستخدم جدول "الفواتير" وجدول "العملاء". يتضمن جدول "الفواتير" الحقول "تاريخ الطلب" و"تاريخ الشحن". فأنت تحتاجهم لوضع القيم الموجودة بهم في الدالة ElapsedTimeString، ومن ثم يمكنك معرفة متى تم تقديم الطلب ومتى تم شحنه. ويحتوي جدول "العملاء" على معلومات مثل "اسم العميل"، بحيث يمكنك التعرف على العميل الخاص بكل طلب.
    لإضافة حساب TimeToShip "وقت الشحن" إلى الاستعلام، فإنك تقوم بإضافة مصطلح إلى شبكة الاستعلام. والمصطلح هو مجموعة من عوامل التشغيل (مثل = و+)، وأسماء عناصر التحكم، وأسماء الحقول، والدوال التي ترجع قيمة فردية، والقيم الثابتة. على سبيل المثال، لإضافة حساب TimeToShip (وقت الشحن)، فإنك تقوم بوضع المصطلح التالي في خلية "الحقل" الخاصة بعمود جديد في شبكة "الاستعلام".
    TimeToShip: ElapsedTimeString([OrderDate],[ShippedDate])
    يشير هذا المصطلح إلى شيئين لبرنامج Access: أولاً، أنك تريد أن يكون عنوان العمود الناتج "TimeToShip" (وقت الشحن). ثانيًا، أنك تريد أن يحتوي هذا العمود على نتيجة تقييم دالة ElapsedTimeString، مع تمرير OrderDate (تاريخ الطلب) وShippedDate (تاريخ الشحن) كمعلمات. عندما يقوم Access بمعالجة الاستعلام، فإنه يقوم بتقييم المصطلح لكل صف في نتيجة الاستعلام. يبدو مثال الناتج كما يلي.
    Posted Image
    تحتوي الحقول OrderDate (تاريخ الطلب) وShippedDate (تاريخ الشحن) على قيم "تاريخ/وقت"، ولكن لا يتم تسجيل الأوقات فعليًا؛ فهم بشكل افتراضي 00:00:00 أو 12:00 بعد منتصف الليل. وطالما أن هذه هي الحالة، فإن قيمة وقت الشحن سوف تكون دائمًا عددًا من الأيام حيث أن الساعات، والدقائق، والثواني تكون غير مطلوبة. عندما تكون مهتمًا فقط بالأيام، يمكنك استخدام الدالة التالية ElapsedDays، والتي تقوم بإزالة بعض التعليمات البرمجية الغير ضرورية من الدالة ElapsedTimeString
    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 Variant
    If IsNull(dateTimeStart) = True Or _
       IsNull(dateTimeEnd) = True Then Exit Function
    interval = dateTimeEnd - dateTimeStart
    days = Fix(CSng(interval))
    ElapsedDays = IIf(days = 1, days & " Day", days & " Days")
    End Function

    قد ترغب أيضًا في عرض الوقت المنقضي في نموذج أو تقرير. فلتبدأ بوضع عنصر تحكم مربع النص على سطح التصميم الخاص بالنموذج أو التقرير الخاص بك. ويعد عنصر التحكم كائنًا يعرض البيانات، أو يقوم بتنفيذ إجراء، أو يقوم بتزيين النموذج أو التقرير الخاص بك. ويمكنك في عنصر التحكم الخاص بمربع النص إدخال أو عرض النص، مثل نتيجة إحدى العمليات الحسابية.
    لإضافة العملية الحسابية TimeToShip (وقت الشحن) إلى التقرير، قم بإضافة مصطلح إلى خاصية "مصدر عنصر التحكم" الخاصة بمربع النص لديك. إن الخصائص تعد سمات مقترنة بعناصر التحكم، ويحتوي Access على الكثير منها. تقوم خاصية "مصدر عنصر التحكم" بتوجيه Access إلى مكان الحصول على البيانات لعنصر التحكم. لوضع الوقت المنقضي في مربع النص، قم بإدراج المصطلح التالي في خاصية "مصدر عنصر التحكم" الخاصة بمربع النص.
    =ElapsedTimeString([OrderDate],[ShippedDate])

    يجب ملاحظة العلامة (=) التي تبدأ المصطلح. عندما تقوم بتعيين خاصية "مصدر عنصر التحكم"، تكون هذه العلامة مطلوبة لأنها تشير إلى مصطلح ، وليس اسم حقل، بالنسبة لبرنامج Access.
    أو فلنفترض أنك تريد إنشاء نموذج صحيفة دوام لتتبع عدد ساعات ودقائق العمل لكافة الموظفين لديك. فإنك تقوم بإنشاء النموذج بحيث يعرض حقل TimeIn (وقت الدخول) وحقل TimeOut (وقت الخروج). والآن أنت بحاجة لحساب ساعات ودقائق العمل في اليوم. إنها فرصة عظيمة لاستخدام الدالة TimeandMinutes. قم أولاً بإنشاء مربع النص HoursWorked (ساعات العمل)، ثم قم بإدراج المصطلح التالي في خاصية مصدر عنصر التحكم الخاصة بمربع النص.
    =HoursAndMinutes([TimeOut]-[TimeIn])

    إن مثالي النموذج والتقرير اللذان يوضحان نتيجة استخدام الدالتين ElapsedTimeString وHoursAndMinutes يبدوان كما يلي
    Posted Image
    إن نموذج صحيفة الدوام هو في الواقع نموذج صحيفة دوام خارجية متصل بجدول "الموظفين"، مع وجود نموذج فرعي لصحيفة دوام داخلية متصلة بجدول "صحيفة الدوام". لإنشاء عمود "الإجمالي" المعروض على نموذج "صحيفة الدوام"، فلتقم أولاً بإنشاء مربع نص على النموذج الفرعي لصحيفة الدوام وقم بتسميته، على سبيل المثال "SummedHoursMinutes." ثم، قم بتعيين خاصية مصدر عنصر التحكم إلى
    =HoursAndMinutes(Sum([TimeOut]-[TimeIn]))

    ومن ثم، قم بإنشاء مربع النص "الإجمالي" على نموذج صحيفة الدوام الخارجية، وقم بتعيين خاصية مصدر عنصر التحكم الخاصة به إلى SummedHoursMinutes.
    =[TimeSheet Subform].Form!SummedHoursMinutes

    التقويم: الملحمة الإنسانية لتحديد سنة صحيحة ودقيقة. شركة Avon Books. العام 1998.
    اختكم
    زهره

    كلمات مفتاحية  :
    حساب الوقت المنقضي أكسيس

    تعليقات الزوار ()