اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

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

قام بنشر

السلام عليكم

طرق احتساب التأخر  مختلفة وذلك تبعا لما يرغب فيه ويقررره صاحب العمل

في المرفق :

جدول الحضور .. وقد تم رصد حضور وانصراف الموظفين ليوم محدد

جدول الفترة ومبين فيه :

وقت الدخول/ start_work

ووقت الخروج/nd_work

وقت السماح في الدخول/ 30 / start_free

وقت السماح في الخروج/30 / end_free

وعدد ساعات العمل المقررة /  countWorkHours / 7:30

استعلام :

يوجد في الاستعلام  ثلاث حقول لاظهار النتيجة :

عدد دقائق تأخر الحضور _ رقم : In_Loss 

عدد دقائق الخروج المبكر _ رقم :  out_Loss  

وقت العمل المحتسب _ وقت  /  work_Hours_count   

المطلوب

أيسر طريقة سواء داخل الاستعلام  او صنع دالة عامة لهذا الشأن .. 

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

1- احتساب (دقائق) التأخر ( كرقم ) عند التاخر في الحضور أو الخروج المبكر

بناء على الوقت المسموح على النحو التالي :

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

2- يرصد في حقل work_Hours_count  ساعات العمل الفعلية المحتسبة  ( حسب ما هو موجود في جدول الفترات)   اما 7:30  للحضور المنضبط  واما  ( 7:30 - وقت التأخر ) للحضور المتأخر

ملحوظة : تم ضبط سجلات الحضور والانصراف بحيث تغطي جميع الاحتمالاات

ملحوظة أخرى : اذا رأيتم ان تكون العمليات والحقول كلها تاريخ ووقت بدلا من قيمة التأخر (رقم) فلكم مطلق الاختيار

 

 

data.rar

قام بنشر
3 ساعات مضت, ابوخليل said:

السلام عليكم

 

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

كمشاركة أولى بدون دالة ، وتتكون من 3 أشكال متدرجة ، الإستعلام الأول :-

SELECT c.UserId, c.chekIn, c.chekOut, IIf(
        TimeValue(c.chekIn) > DateAdd("n", f.start_free, f.start_work),
        DateDiff("n", DateAdd("n", f.start_free, f.start_work), TimeValue(c.chekIn)),
        0
    ) AS In_Loss, IIf(
        TimeValue(c.chekOut) < DateAdd("n", -f.end_free, f.end_work),
        DateDiff("n", TimeValue(c.chekOut), DateAdd("n", -f.end_free, f.end_work)),
        0
    ) AS out_Loss, Format(
        IIf(
            TimeValue(c.chekIn) > DateAdd("n", f.start_free, f.start_work) OR 
            TimeValue(c.chekOut) < DateAdd("n", -f.end_free, f.end_work),
            DateDiff("n", 
                IIf(TimeValue(c.chekIn) > DateAdd("n", f.start_free, f.start_work), 
                    TimeValue(c.chekIn), 
                    DateAdd("n", f.start_free, f.start_work)
                ),
                IIf(TimeValue(c.chekOut) < DateAdd("n", -f.end_free, f.end_work), 
                    TimeValue(c.chekOut), 
                    DateAdd("n", -f.end_free, f.end_work)
                )
            ) / 1440.0,
            f.countWorkHours
        ), 
        "hh:nn"
    ) AS work_Hours_count
FROM tblcomIn AS c, tbl_Ftrat AS f
WHERE f.ftraName = 'الفترة الرئيسية'
ORDER BY c.UserId, c.chekIn;
Query2
UserId chekIn chekOut In_Loss out_Loss work_Hours_count
1111 2025-07-05 3:50:10 PM 2025-07-05 11:50:12 PM 0 0 07:30
2222 2025-07-05 4:20:16 PM 2025-07-05 11:20:28 PM 0 0 07:30
3333 2025-07-05 4:32:20 PM 2025-07-05 11:28:31 PM 2 0 06:28
4444 2025-07-05 5:01:25 PM 2025-07-05 11:32:34 PM 31 0 05:59

 

الإستعلام الثاني :-

SELECT c.UserId, c.chekIn, c.chekOut, IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work),DateDiff("n",DateAdd("n",f.start_free,f.start_work),TimeValue(c.chekIn)),0) AS In_Loss, IIf(TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),DateDiff("n",TimeValue(c.chekOut),DateAdd("n",-f.end_free,f.end_work)),0) AS out_Loss, Format(IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work) Or TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),DateDiff("n",IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work),TimeValue(c.chekIn),DateAdd("n",f.start_free,f.start_work)),IIf(TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),TimeValue(c.chekOut),DateAdd("n",-f.end_free,f.end_work)))/1440,f.countWorkHours),"Short Time") AS work_Hours_count, 'التفاصيل: ' & IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work),'تأخر ' & DateDiff("n",DateAdd("n",f.start_free,f.start_work),TimeValue(c.chekIn)) & ' دقيقة','حضور في الموعد') & ' - ' & IIf(TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),'انصراف مبكر ' & DateDiff("n",TimeValue(c.chekOut),DateAdd("n",-f.end_free,f.end_work)) & ' دقيقة','انصراف في الموعد') AS Details
FROM tblcomIn AS c, tbl_Ftrat AS f
WHERE (((f.ftraName)='الفترة الرئيسية') And ((DateValue(c.chekIn))=#7/5/2025#))
ORDER BY c.UserId;
Query3
UserId chekIn chekOut In_Loss out_Loss work_Hours_count Details
1111 2025-07-05 3:50:10 PM 2025-07-05 11:50:12 PM 0 0 07:30 التفاصيل: حضور في الموعد - انصراف في الموعد
2222 2025-07-05 4:20:16 PM 2025-07-05 11:20:28 PM 0 0 07:30 التفاصيل: حضور في الموعد - انصراف في الموعد
3333 2025-07-05 4:32:20 PM 2025-07-05 11:28:31 PM 2 0 06:28 التفاصيل: تأخر 2 دقيقة - انصراف في الموعد
4444 2025-07-05 5:01:25 PM 2025-07-05 11:32:34 PM 31 0 05:59 التفاصيل: تأخر 31 دقيقة - انصراف في الموعد

 

الإستعلام الثالث :-

SELECT c.UserId, c.chekIn, c.chekOut, IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work),DateDiff("n",DateAdd("n",f.start_free,f.start_work),TimeValue(c.chekIn)),0) AS In_Loss, IIf(TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),DateDiff("n",TimeValue(c.chekOut),DateAdd("n",-f.end_free,f.end_work)),0) AS out_Loss, Format(DateDiff("n",IIf(TimeValue(c.chekIn)<f.start_work,f.start_work,TimeValue(c.chekIn)),IIf(TimeValue(c.chekOut)>f.end_work,f.end_work,TimeValue(c.chekOut)))/1440,"Short Time") AS work_Hours_count, 'التفاصيل: ' & IIf(TimeValue(c.chekIn)>DateAdd("n",f.start_free,f.start_work),'تأخر ' & DateDiff("n",DateAdd("n",f.start_free,f.start_work),TimeValue(c.chekIn)) & ' دقيقة',IIf(TimeValue(c.chekIn)<f.start_work,'حضور مبكر ' & DateDiff("n",TimeValue(c.chekIn),f.start_work) & ' دقيقة','حضور في الموعد')) & ' - ' & IIf(TimeValue(c.chekOut)<DateAdd("n",-f.end_free,f.end_work),'انصراف مبكر ' & DateDiff("n",TimeValue(c.chekOut),DateAdd("n",-f.end_free,f.end_work)) & ' دقيقة',IIf(TimeValue(c.chekOut)>f.end_work,'انصراف متأخر ' & DateDiff("n",f.end_work,TimeValue(c.chekOut)) & ' دقيقة','انصراف في الموعد')) AS Details
FROM tblcomIn AS c, tbl_Ftrat AS f
WHERE (((f.ftraName)='الفترة الرئيسية') And ((DateValue(c.chekIn))=#7/5/2025#))
ORDER BY c.UserId;
Query4
UserId chekIn chekOut In_Loss out_Loss work_Hours_count Details
1111 2025-07-05 3:50:10 PM 2025-07-05 11:50:12 PM 0 0 07:30 التفاصيل: حضور مبكر 10 دقيقة - انصراف متأخر 20 دقيقة
2222 2025-07-05 4:20:16 PM 2025-07-05 11:20:28 PM 0 0 07:00 التفاصيل: حضور في الموعد - انصراف في الموعد
3333 2025-07-05 4:32:20 PM 2025-07-05 11:28:31 PM 2 0 06:56 التفاصيل: تأخر 2 دقيقة - انصراف في الموعد
4444 2025-07-05 5:01:25 PM 2025-07-05 11:32:34 PM 31 0 06:29 التفاصيل: تأخر 31 دقيقة - انصراف متأخر 2 دقيقة

 

data1.zip

 

أم تفضل استخدام دالة 😁 .. ؟

 

  • Like 1
قام بنشر

شكرا اخي @Foksh

 المعرف 4444 المفترض تأخر الحضور 61 دقيقة بدلا من 31  لأنه حضر  5:1  ووقت الحضور 4:00

ما علينا منها اتركها ..

حلولك جميلة ومرجع لمن اراد العمليات من خلال الاستعلامات

2 ساعات مضت, Foksh said:

 

أم تفضل استخدام دالة 😁 .. ؟

 

نعم  هي الافضل للأسباب التالية :

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

بالنسبة لساعات العمل فهي ثابتة فلماذا نقحمها في الاستعلام .. اما ساعات العمل الناقصة فستخرج في المجاميع في التقرير

الزبدة من شرحي اعلاه :

نريد دالة نمرر لها وقت الحضور ووقت الانصراف فقط ....... تعيد لنا ساعات ودقائق التأخر فقط ( الدخول + الخروج) .. اما غير المتأخر فتعيد Null

وهذا المرفق تم تعديل الاستعلام

ملحوظة : رايتك استخدمت اسم الفترة كمعيار  .. الى ترى أن id الجدول افضل ؟

data2.rar

قام بنشر

جميل ، وهذا ما كنت اعمل عليه في هذه الفكرة ,,

ودون شرحها هنا ، في المرفق نموذجين كأفكار قابلة للتحوير والتعديل حسب حاجتنا . مع العلم أنني قمت بإضافات قد لا تحتاجها ، ولكنها من باب الفضول والزيادة 😅 

 

data1-1.zip

  • Like 2
قام بنشر

جزاك الله خيرا

عمل وأفكار ولا أجمل 

هكذا يصبح الموضوع مرجع .. بل بستان .. يقطف منه الزائر ما شاء .

بالنسبة لي احب الاختصارات

انظر عملي في المرفق ادناه .. تقرير فقط

لا يخفى عليك .. امكانية عرض حضور جميع الموظفين خلال يوم .. او عرض حضور موظف واحد خلال شهر مثلا

الاختصار هو في اظهار وقتي الحضور والانصراف .. ومجموع التأخر فيهما ..  وتم تلوين الوقت المخالف باللون الأحمر

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

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

في اسفل التقرير  سوف تظهر المجاميع والفروقات

 

 

d4.rar

  • Like 2
قام بنشر (معدل)
9 ساعات مضت, ابوخليل said:

بالنسبة لي احب الاختصارات

وهذه دالة مختصرة على نمط دالتيك وهي تعمل للدخول والخروج
للدخول النوع 0 أو false
للخروج النوع -1 أو true

Function LostTime(Period As Integer, ByVal inOutTime As Date, inOutType As Boolean) As Integer
    Dim rst As Recordset
    Dim Result As Double
    
    Set rst = CurrentDb.OpenRecordset("tbl_Ftrat", dbOpenSnapshot)
    With rst
        .FindFirst "id=" & Period
        If Not .NoMatch Then
            inOutTime = inOutTime - Fix(inOutTime)
            If inOutType = 0 Then
                Result = !start_work - inOutTime + !start_free / 1440
            Else
                Result = inOutTime - !end_work + !end_free / 1440
            End If
            If Result < 0 Then LostTime = Abs(Round(Result * 1440, 0))
        End If
    End With
    
    'rst.Close
    Set rst = Nothing
End Function

 

تم تعديل بواسطه AbuuAhmed
تنقيح الكود
قام بنشر

اهلا ابو احمد

سرني مرورك ومشاركتك

هو انا عملتها بالاول دالة واحدة ..  بحيث الدالة  تساوي  i+x

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

43 دقائق مضت, AbuuAhmed said:

وهذه دالة مختصرة على نمط دالتيك وهي تعمل للدخول والخروج
للدخول النوع 0 أو false
للخروج النوع -1 أو true

الدالة واضحة وجميلة :

 inOutTime تمثل حقل الحضور او حقل الانصراف بناء على قيمة المتغير  inOutType

ولكني لم اعرف اين القيمة المقابلة لــــ    inOutType في الاستعلام

على فكرة : كنت اعد مسألة اخرى مرتبطة بهذا .. وقفت امامها .

 

 

قام بنشر
15 دقائق مضت, ابوخليل said:

على فكرة : كنت اعد مسألة اخرى مرتبطة بهذا .. وقفت امامها .

المسألة كالتالي :

هذه صورة جدول الحضور

image.png.0994348dc776bd099deae2965cb67c61.png

من يوم 1/6  وحتى 11/6

الموظف مجاز  ايام :  3 ،  4   ، 5   من الشهر   بناء على ما تم رصده في جدول الاجازات

وغائب يوم : 8

اريد في استعلام اظهار جميع الأيام  .. وامام كل سجل حالته : حاضر او مجاز او غائب   .. أو  تكون ارقام  1 أو 2 أو 3  تعبر عن الحالة

 

 

  • ابوخليل changed the title to مطلوب احتساب التأخر والغياب في الحضور والانصراف
قام بنشر
منذ ساعه, ابوخليل said:

ولكني لم اعرف اين القيمة المقابلة لــــ    inOutType في الاستعلام

أهلا أبا خليل
الدالة ستناديها مرتين مرة للدخول ومرة للخروج
للدخول ستدخل وقت الدخول وقيمة النوع 0
وللخروج ستدخل وقت الخروج وقيمة النوع -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.

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

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information