اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

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

احبتي واخوتي الخبراء وكافة اعضاء هذا المنتدى المبارك

اريد ان اشارككم عقولكم .. ونضيف الى المنتدى دروسا جديدة مفيدة

وحيث ازعم اني معلم في هذا المنتدى .. فأنا اعطي درسا للمبتدئين .. ولمن يريدون انشاء مشاريعهم .. ان الاستشارة ودراسة المشروع من جميع جوانبه اهم شيء في العمل .. لا بد من استشارة اهل الخبرة قبل البدء في اول خطوة .

وعن نفسي لا اجد غضاضة في الاستشارة في امور تبدو بديهية للمبتدىء

وأول خطوة هي اعداد الجداول .. ومازلت عند رأيي ان ضبط الجداول بالشكل الصحيح عبارة عن تنفيذ 80% من المشروع .. 

ندخل لصلب الموضوع :

صاحب العمل طلب ان تكون الاجراءات كخطوط عريضة على النحو التالي :

١-  امكانية تحديد وقت دوام الموظف لفترة صباحية. ( 4 ساعات)
٢- امكانية تحديد وقت دوام الموظف لفترة مسائية. ( 4 ساعات)
٣- امكانية تحديد وقت دوام الموظف فترتين صباحية ومسائية.
٤- امكانية تحديد وقت دوام الموظف فترة دوام كامل ٨ او ٩ ساعات.

5- امكانية  تعديل وقت دوام موظف فترة مختلفة مؤقته مثل المحاسب

 يكون البرنامج مرن بحيث يخدم في برمضان ( عند تغير وقت العمل ) 

هذه الطلبات اخذتها نسخ لصق

المطلوب .. ما الجداول التي احتاجها لهذه الجزئية .. التي هي التحكم بهذه المتطلبات

علما ان العملية مطلوب ان تكون آلية من غير تدخل المستخدم  

المستخدم فقط يقوم باعداد هذه الضوابط من خلال جدول التحكم

 

قام بنشر

سنأخذ الجداول واحد واحد :

الأول :

جدول رصد الحضور والانصراف :  ( الحقل الواحد)

المعرف / حقل رصد وقت الحضور والانصراف Now / حقل النوع : ( O/I)

ما رأيكم ؟؟

  • ابوخليل changed the title to تصميم جداول برنامج حضور وانصراف _ نقاش
قام بنشر

وعليكم السلام ورحمة الله وبركاته معلمنا القدير .. 🙂 🌹

وأنا أحد تلاميذك أسمحلي بأن أطرح فكرتي في هذا الموضوع ( وقد عملت على مشروع مشابه) .. 🙂 

 

أولا : نفترض أن الموظف له فترة دوام محددة (من ضمن القائمة التي ذكرتها) بين تاريخين محددين مثال :
            1- شهر رمضان له أوقات دوام مختلفة عن باقي الشهور.
            2- الموظف أنتقل من موقع عمل لموقع آخر له فترة دوام مختلفة.
            3- الموظف تغيرت ورديته من صباحية إلى مسائية أو العكس.
            4- والأمثلة كثيرة .....

ثانيا : نقوم بتصميم جدول فرعي لجدول الموظفين (جدول الورديات) يتم فيه إضافة سجل لكل نوع دوام للموظف حسب نوع الوردية وتحديد الفترة الزمنية (من تاريخ) ---> (إلى تاريخ).

ثالثا : تصميم نموذج فرعي يضاف لنموذج الموظفين يتم فيه تعبئة هذه البيانات التي ذكرناها في جدول الورديات .

رابعا : يتم احتساب مدة العمل والتأخير والانصراف المبكر وعدد ساعات العمل التي أداها الموظف بناءً على فترة دوامه المذكورة في جدول الورديات .

وهذه صور توضيحية حسب المشروع الذي عملت عليه وهو خاص ببرنامج لأحد الاخوة 🙂 :

جدول الورديات :
image.png.9f5db631980ef7c94887b54607391eac.png
نموذج بيانات الموظفين + النموذج الفرعي للورديات ( الورديات التي ليس لها تاريخ نهاية هي ورديات مستمرة حتى تاريخ اليوم ولها اعتبار في كود الحسابات) :
image.png.d8578136b9bde093bdb6a65fbdc3b9f0.png

صورة مقربة للنموذج الفرعي :
image.png.e97d95ede2e43889dc1b2d5f642a60e1.png

القائمة المنسدلة للورديات تأخذ بياناتها من جدول فرعي آخر يتم فيه تسجيل أنواع الورديات والبيانات المتعلقة بها :
image.png.60f873d2b453ade3deef9e0c6f3426c3.png

بعد هذا قمنا بتصميم جملة من الدوال الخاصة بجلب البيانات الخاصة بتفاصيل الورديات من الجداول وتطبيقها على الموظفين وحساب ما يطلب حسابه ..

 

هذا باختصار وسلامتكم 🙂 

        

قام بنشر

تمام بارك الله فيك

بالنسبة لجدول الورديات ( من تاريخ الى تاريخ ) لسنا بحاجته .. والسب ان العمل مدني مستمر

اذا سيكون الجدول الفرعي :

صباحية / مسائية / دوام كامل/ دوام خاص

وامام كل وردية بياناتها : وقت الحضور ووقت الانصراف .. والسماح

وفي جدول الأسماء حقل (x) لاختيار الوردية المناسبة للموظف

عند التوقيع حقل(x) سيحمل البيانات والمواصفات الخاصة به الموجودة في جدول الورديات

ويتم تعامل الاجراءات الخاصة في فورم التوقيع بناء على ذلك

صح؟ ما رأيك

 

قام بنشر

استدراك :

الدوام الخاص الافضل ان يكون متاح له اكثر من تبويب مثل : خاص1 ، خاص2 ، خاص3  وهكذا ...

وبرمجيا  فعلا هو متاح  الى مالا نهاية

والسبب  انه قد يوجد اكثر من موظف خاص اوقاته تختلف عن الآخر

وهنا يتبين اننا  بحاجة الى جدول فرعي واحد فقط .. يتم تسجيل الفترات وأسماءها من قبل المستخدم

حسب تصوري الآن اصبح المشروع اكثر مرونة من حيث تحديد الفترات

هل هذا التصور سليم ؟ 

 

قام بنشر

هذا مثال لعرض ما تم نقاشه

نريد اجراء العمليات عليه

والضبط حسب جدول الفترات

الحقلان : startWithFree و endWithFree ستختفي من الفورم مستقبلا ولكني وضعتها للاستئناس والتأكد من النتيجة

comOutDb.rar

قام بنشر

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

موضوع ثري وجميل للنقاش ، ويستحق فعلاً أن يُبنى على تصور شامل ودقيق من البداية .

وبحسب ما فهمت من تصوركم – وهو تصور متطور ومرن – لدي نقطة بسيطة أحب أن أطرحها للنقاش :-

هل سيُؤخذ بعين الاعتبار مسألة ( التأخيرات المسموحة ) ؟

يعني مثلاً :-

إذا تأخر الموظف عن وقت حضوره بـ 5 دقائق ، هل يُعتبر (حاضراً ضمن الوقت أم متأخراً ) ؟؟؟؟

لهذا أعتقد أنه من المفيد – وربما الضروري 😅 – أن تكون هناك حقول مثل :-

  • StartTime و EndTime لكل وردية .
  • وحقل إضافي مثل AllowedDelayMinutes ( الحد الأقصى للتأخير المقبول ) .

هذا يُسهل مستقبلاً حساب التأخير والانصراف المبكر ، ويجعل النظام أكثر دقة وواقعية ، خاصة إذا تم استخدام البيانات لاحقاً في تقييم الأداء أو إعداد تقارير زمنية .

مجرد وجهة نظر قابلة للنقاش 🌷 ، ومتابع معكم للإستفادة من الآراء والتجارب .

 

وهو فعلاً ما تم إدراجه في مرفق معلمنا أبو خليل ، ولكن جاء ردي قبل أن أرى المرفق في آخر مشاركة له 👌

وبناءً على الملف المرفق ، قمت بإضافة حقل جديد نصي = "FtraID" ، في الجدول "tblcomIn" ، وقيمته يتكون رقم الفترة التي سجل فيها الموظف حضور أو انصراف .

وتم اعتماد القيم ( 1 = حضور ، 2 = انصراف ، 3 = حضور متأخر ) في الحقل chekType داخل نفس الجدول .

بحيث نعالج :-

  1. التأكد من إدخال رقم الموظف وعدم تركه فارغاً .
  2. التحقق من وجود الموظف في جدول الموظفين tblNames .
  3. تحديد الفترة الزمنية المناسبة (الفترة الحالية) حسب الوقت الآن من حقول start_work وend_work في جدول الفترات tbl_Ftrat .
  4. إذا لم تكن الفترة الحالية ضمن أي فترة معرفة ، يتم تسجيل حركة دخول متأخر ( chekType = 3 ) .
  5. إذا كانت الفترة الحالية معروفة :-

    * حساب عدد حركات الدخول ( chekType = 1 أو 3 ) والخروج ( chekType = 2 ) للموظف في نفس الفترة واليوم الحالي.

    * منع تسجيل دخول جديد في نفس الفترة واليوم إذا كان الموظف قد أكمل دورة دخول وخروج ( أي أن عدد الدخول أقل أو يساوي عدد الخروج ) .

    * تحديد نوع الحركة القادمة ( دخول أو خروج ) حسب آخر حركة مسجلة للموظف في نفس الفترة واليوم .

    * تسجيل الحركة الجديدة (دخول ، خروج ، أو دخول متأخر) في جدول tblcomIn مع ربطها بالفترة .

    * إعلام المستخدم برسالة تأكيد نوع الحركة والفترة .

وهذا ملف التعديل ، لإجراءاتكم بالنتيجة اذا كانت غير مطابقة أو يوجد احتمالات لم تخطر لي حالياً ..

 

 

comOutDb.zip

قام بنشر

 اهلا وسهلا وصباح جميل باطلالة الفوكش

قرأت شرحك اعلاه واطلعت على المرفق عمل ولا اجمل .. فشكرا لك

توضيح : حقول السماح ليس لها دور في عمليات واجراءت الحضور والانصراف ، وانما ينحصر عملها عند حصر ساعات العمل في الاستعلامات .. مثلا الفترة الصباحية 4 ساعات ومجموع فترات السماح ( الحضور والانصراف )=30 دقيقة هنا يكون ساعات العمل النظامية المطالب بها الموظف ولا يعتبر متأخر هي  3:30 دقيقة

من هنا يجب ضبط وقت التوقيع والانصراف فلا يسمح له بالتوقيع قبل الوقت المحدد باكثر من 5 الى 10 دقائق وكذلك الانصراف يجب ضبط وقت ما بعد التوقيع الرسمي

ملاحظاتي :

1- اضافة حقل يبين الفترة في جدول الحضور جميل جدا .. سيساعد مستقبلا على سهولة ويسر التصفية حسب الفترات

2- حقل نوع الحضور :  ارى ان حضور وانصراف ( 1 ، 2 )  كافيا ولا حاجة لنوع دخول متأخر .. ( سوف ابين ذلك)

بالنسبة للدخول المتأخر فلسنا بحاجة الى اظهاره عند الاجراء .. وسوف يظهر في الاستعلام بناء على المعطيات لأن كل توقيع مستقل بذاته .. ايضا وجوده في الجدول يسبب اضطراب .. لأن المطلوب هو هل هذا التوقيع دخول ام خروج ؟

اذا ترى ان بيان حالة الحضور مهمة فالافضل يخصص لها حقل مستقل .. ويضاف ايضا حالة خروج مبكر  ( لاحظ هناك يوجد خروج الاستئذان) .. لذا ارى انه بلاش منها كلها

3- يسمح بالتوقيع المتكرر التوقيع الأول حضور والثاني انصراف خلال الجلسة الواحدة لاحتمال تفعيل نظام الاستئذان .. وكما هو معلوم يتم لاحقا حصر التوقيعات حسب اليوم والفترة

4- يلزم عمل ضابط وقت بين كل توقيعين دقيقة واحدة على الأقل ( بحيث لا يسمح بالتوقيع الثاني الا بعد انقضاء الوقت المحدد ... وذلك تلافيا للخطأ غير المقصود)

................................

بناء على الملاحظات اعلاه نحن بحاجة الى جدول كنترول يرصد فيه : 1- الوقت المتاح قبل موعد الحضور الرسمي 2- الوقت المتاح بعد موعد الانصراف الرسمي 3- ضابط وقت بين كل توقيعين

وغيرها من ادوات التحكم التي قد نحتاجها وتظهر لنا اثناء التصميم

اكرر شكري وامتناني :fff: ..

 

  • Like 1
قام بنشر

معلمي الفاضل :wub: ..

بناءً على ما أسلفتم ، ومن خلال الجدول الجديد الخاص بالتحكم :-

  • تم تعديل اسلوب مطابقة الفترة لتراعي السماح قبل و بعد .
  • التحقق من آخر توقيع للموظف بحيث إذا مضى عليه أقل من waitBtween دقيقة ، فيتم رفض التوقيع الجديد .

وبناءً عليه ، يكون تعديلي بهذا الشكل :-

Private Sub ID_AfterUpdate()
    On Error GoTo Err_Handler

    Dim db As DAO.Database
    Dim rsEmp As DAO.Recordset
    Dim rsShift As DAO.Recordset
    Dim rsCtrl As DAO.Recordset
    Dim rsLastMove As DAO.Recordset
    Dim UserId As String
    Dim empName As String
    Dim currentTime As Date
    Dim shiftId As Variant
    Dim checkType As String
    Dim sql As String
    Dim periodName As String
    Dim startWork As Date, endWork As Date
    Dim allowedBefore As Long, allowedAfter As Long, waitBetween As Long
    Dim lastTime As Date

    UserId = Trim(Me.id)
    If UserId = "" Then
        MsgBox "يرجى إدخال رقم الموظف", vbExclamation + vbMsgBoxRight, ""
        Exit Sub
    End If

    currentTime = Time()
    Set db = CurrentDb

    sql = "SELECT * FROM tblNames WHERE UserId = '" & UserId & "'"
    Set rsEmp = db.OpenRecordset(sql)
    If rsEmp.EOF Then
        MsgBox "رقم الموظف غير موجود في جدول الموظفين", vbExclamation + vbMsgBoxRight, ""
        rsEmp.Close
        Exit Sub
    End If
    empName = Nz(rsEmp!s_name, "الموظف")
    rsEmp.Close

    Set rsCtrl = db.OpenRecordset("SELECT TOP 1 * FROM tbl_Ctrl")
    If rsCtrl.EOF Then
        MsgBox "يرجى التحقق وضبط اعدادات التحكم", vbCritical + vbMsgBoxRight, ""
        Exit Sub
    End If
    waitBetween = Nz(rsCtrl!waitBtween, 1)
    allowedBefore = Nz(rsCtrl!timeBefore, 0)
    allowedAfter = Nz(rsCtrl!timeAfter, 0)
    rsCtrl.Close

    shiftId = "0"
    periodName = "غير محددة"
    Set rsShift = db.OpenRecordset("SELECT * FROM tbl_Ftrat")
    Do While Not rsShift.EOF
        startWork = DateAdd("n", -allowedBefore, rsShift!start_work)
        endWork = DateAdd("n", allowedAfter, rsShift!end_work)
        If currentTime >= TimeValue(startWork) And currentTime <= TimeValue(endWork) Then
            shiftId = CStr(rsShift!id)
            periodName = rsShift!ftraName
            Exit Do
        End If
        rsShift.MoveNext
    Loop
    rsShift.Close

'------------------------- ( في حال أردنا التخصيص )
''        If shiftId = "0" Then
''            MsgBox "لا توجد فترة مناسبة للوقت الحالي ، لا يمكن تسجيل التوقيع", vbExclamation + vbMsgBoxRight, ""
''            Exit Sub
''        End If
'-------------------------

    sql = "SELECT TOP 1 chekInOut FROM tblcomIn WHERE UserId = '" & UserId & "' ORDER BY chekInOut DESC"
    Set rsLastMove = db.OpenRecordset(sql)
    If Not rsLastMove.EOF Then
        lastTime = rsLastMove!chekInOut
        If DateDiff("s", lastTime, Now) < (waitBetween * 60) Then
            MsgBox "لا يمكنك التوقيع مرتين خلال أقل من " & waitBetween & " دقيقة", vbExclamation + vbMsgBoxRight, ""
            rsLastMove.Close
            Exit Sub
        End If
    End If
    rsLastMove.Close

    sql = "SELECT TOP 1 chekType FROM tblcomIn WHERE UserId = '" & UserId & "' AND DateValue(chekInOut) = Date() AND FtraID = '" & shiftId & "' ORDER BY chekInOut DESC"
    Set rsLastMove = db.OpenRecordset(sql)
    If Not rsLastMove.EOF Then
        If rsLastMove!chekType = "1" Then
            checkType = "2"
        Else
            checkType = "1"
        End If
    Else
        checkType = "1"
    End If
    rsLastMove.Close

    sql = "INSERT INTO tblcomIn (UserId, chekInOut, chekType, FtraID) VALUES " & _
          "('" & UserId & "', #" & Format(Now, "yyyy-mm-dd hh:nn:ss") & "#, '" & checkType & "', '" & shiftId & "')"
    db.Execute sql, dbFailOnError

    MsgBox "تم تسجيل " & IIf(checkType = "1", "الدخول", "الخروج") & vbCrLf & _
           "الموظف: " & empName & vbCrLf & "الفترة: " & periodName, vbInformation + vbMsgBoxRight, ""

    Me.id = ""
    Me.id.SetFocus
    Exit Sub

Err_Handler:
    MsgBox " : خطأ أثناء تنفيذ العملية" & vbCrLf & Err.Description, vbCritical + vbMsgBoxRight, ""
End Sub


ملاحظة ..

في الجزء :-

shiftId = "0"
periodName = "غير محددة"

استخدمته لتهيئة متغيرين رئيسيين قبل الدخول في حلقة البحث عن الفترة الحالية المناسبة ( tbl_Ftrat ) .

حيث أن القيمة ( ) هنا تعني مبدئياً : ( لا توجد فترة مناسبة تم تحديدها بعد ) .

وطبعاً سيتم تعيين قيمة فعلية له لاحقاً من الجدول tbl_Ftrat عندما يطابق الوقت الحالي فترة ما داخل الجدول . من خلال الجملة :-

If currentTime >= TimeValue(startWork) And currentTime <= TimeValue(endWork) Then
    shiftId = CStr(rsShift!id)

بحيث إذا وجد وقت يطابق الفترة ، يتم تعيين رقم الفترة الحقيقي . وكذلك الأمر فيما يتعلق بـ "غير محددة" ....

والهدف كان في فكري ، للتحكم في الحالات غير المتوقعة :-

  • فإذا لم يعثر على فترة مناسبة ضمن الوقت والسماح ، تبقى القيم الافتراضية ( 0 و غير محددة ) .
  • ولتسجيل التوقيع حتى في حال عدم المطابقة . في بعض الحالات ، قد ترغب بتسجيل التوقيع رغم عدم انطباقه على أي فترة . ( من باب الإحتياط )

وطبعاً قابل لتخصيصه كجزء شرطي . فمثلاً إذا أردت منع التوقيع تماماً في حالة عدم مطابقة أي فترة ، يمكن وضع شرط كالآتي في نهاية حلقة البحث :-

    Loop
    rsShift.Close
      If shiftId = "0" Then
          MsgBox "لا توجد فترة مناسبة للوقت الحالي ، لا يمكن تسجيل التوقيع", vbExclamation + vbMsgBoxRight, ""
          Exit Sub
      End If

وطبعاً سيتم إلغاء التسجيل وعدم تنفيذ باقي الكود !!!

وطبعاً وجب التذكير بأنني أخذت على عاتقي تعديل منطق احتساب وقت الانتظار بين التوقيعين ليكون مقروناً ومشروطاً بالموظف الحالي فقط . يعني لو أردنا الانتظار دقيقة لتسجيل الحضور لـ 20 موظف على سبيل المثال !! فهذا يعني أن آخر موظف سيكون متأخراً 20 دقيقة هههههههه حسب الوقت الذي سيتم تسجيله له ( صحيح ) ، ولذا ألزمت التحقق من فترة الانتظار برقم الموظف .

 

فكرتي المتواضعة ..

 

comOutDb2.zip

قام بنشر

تمام  .. زادك الله علما .. وبارك فيك

اقتباس

فمثلاً إذا أردت منع التوقيع تماماً في حالة عدم مطابقة أي فترة ، يمكن وضع شرط كالآتي في نهاية حلقة البحث :-

نعم هذا افضل كثيرا  .. وإلا لماذا جعلنا وقت متاح قبل وبعد الوقت الرسمي للتوقيع

ملاحظة :

جرب الموظف سالم .. فترته خاص من التاسعة الى الحادية عشر ونصف صباحا  لاحظت :

الساعة عندي الآن  4:20 مساء

1- سمح له بالتوقيع

1- الرسالة تبين انه في الصباح رغم ان التوقيع الآن

......................................................................................................................................

دعنا الآن من الأكواد وضبطها لتحقيق الشروط  

المهم الآن هل الجداول وحقولها مكتملة ... وهل طريقة التصميم صحيحة

اكتشفت الآن ان حقول الوقت المتاح قبل وبعد التوقيع يجب ان تكون ضمن جدول الفترات وفائدة ذلك  :

حصر الفترة الزمنية في مكان واحد .. لأن وقت التوقيع  سيحصر الوقت : من/الى  .. وغير جيد اضافة هذه الفترة داخل الجملة البرمجية

صحيح سيوجد تكرار  لأننا سنرصد هذه القيم امام كل فترة ، ولكن ايضا مفيد فيما لو اردنا تخصيص فترة ما  بوقت متاح اكبر او اصغر

اذا جدول الفترات يجب اعادة النظر فيه ..  وسوف اقوم باعداده ورفعه ان شاء الله على النحو التالي :

المعرف / الدخول الرسمي / الخروج الرسمي / فترة سماح دخول / فترة سماح خروج / وقت متاح قبل / وقت متاح بعد / بداية توقيع حضور/ نهاية توقيع خروج / ساعات(وقت العمل الفعلي) 

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

بداية توقيع حضور = الدخول الرسمي - وقت متاح قبل

نهاية توقيع خروج = الخروج الرسمي + وقت متاح بعد

ساعات وقت العمل الفعلي = نستخرج الفرق بين الوقتين : ( الدخول الرسمي و الخروج الرسمي ) - فترات السماح

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   1 عضو متواجد الان

×
×
  • اضف...

Important Information