الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة ببرنامج الحضور

بدأه mjhoool في 9 يناير 2010 · 11 رد · 1,427 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف حالكم

لو سمحتوا طالب مساعدة ألا وهي ببرنامج الحضور والانصراف

1 - عندي فرعين للعمل

- الفرع الرئيسي ويبدأ به العمل من الساعه 7 و النصف

- والفرع الفرعي يبدأ بالساعه 8

المطلوب عندما أضيف أو عند الطباعه يتم تلوين وتمييز المتأخرين

مثال / انا بالفرع الرئيسي وحضرة الساعه 7 و 45 دقيقة ... يتم تلوين لاني متأخر

مثال / صديقي بالفرع الفرعي وحضر الساعه 7 و 45 دقيقة ... لا يتم تلوينه لانه لم يتأخر

=========

2 - عند الطباعة .... لفتره زمنية معينه (فلنقل خلال اسبوع)

- المطلوب عمل الاعمدة بالتواريخ والصفوف بالاسماء بنفس الطريقة التي توجد بالصورة المرفقه( من برنامج اكسل)

- مطلوب ايضا ترتيب الارقام (7،6،5،4،3،2،1)

فقد قمت بترتيبها تصاعديا فظهر لي (4،3،2،15،14،13،12،11،10،1)

فما الحل

وشكرا لكم

الحضور.rar

#2

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

أخي الكريم تم عمل ما تريد في المطلب الأول والثاني

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

عموما هذا المرفق .. وأتمنى أن أكون وفقت في مساعدتك .. وبالتوفيق

koao_Attendance.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#3

مشكوووووور اخوي koao

هذا هو المطلوووب

جعله الله في ميزان حسناتك ... يوم القيامه

وإن شاء الله تتوفق في دنياك واخرتك

===

بصراحه احس حل التقرير الاسبوعي معقد شو ..

الحمد لله تعلمنا شي يديد وان شاء الله الجميع يستفيد

#4

مرحبا اخوووووي الكريم

لو تعطينا بنذه عن الحل

وشكرا

تم تعديل هذه المشاركة بواسطة mjhoool في 13 يناير 2010 في 15:29

#5

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

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

لذا كان الحل أن ننشئ جدول مؤقت بإسم TempTable وتعبأ حقوله وفق كود برمجي سنشرح فكرته لاحقا ... وهذه صورة لأسماء الحقول وأنواعها

post-43910-12634017614181_thumb.gif

نأتي لشرح الكود الذي يملأ الجدول بالقيم المستهدفة ... فنقول بسم الله

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

    Dim SQL, Mydate As String
    Mydate = InputBox("أدخل تاريخ يوم السبت فقط")

أولا عرفنا متغييرن من نوع نص ... ثم أسندنا للمتغير Mydate القيمة الناتجة من نافذة الإدخال (InputBox) التي ستظهر للمستخدم وتطلب منه أن يدخل تاريخ يوم السبت فقط

    If IsDate(Mydate) = False Then
        MsgBox "تم إلغاء العملية أو تم إدخال قيمة ليست تاريخ, الرجاء المحاولة مرة أخرى."
        Exit Sub
    End If

أولا وضعنا دالة شرطية لإختبار ما إذا كان المتغير Mydate يحمل تاريخ أو لا بإستخدام الدالة IsDate التي ترجع صحيح إذا كان معاملها يحتوي على قيمة من نوع بيانات تاريخ/وقت ..... وخطأ إذا لم تكن كذلك ... وعملنا هذا الإختبار لأن هناك إحتمال أن المستخدم ينقر على زر إلغاء من نافذة الإدخال .. أو قد يدخل قيمة ليست تاريخ خطأً أو تعمدا ... وبذلك نكون منعنا الخطأ البرمجي

وفي حال تحقق الشرط تظهر رسالة تنبيه ثم تقوم بالخروج من الإجراء دون تنفيذ باقي الكود .. وذلك بإستخدام الدالة Exit Sub

    Dim RC1, RC2 As Recordset
    Dim Dt1, Dt2 As Date
    Dim MyId As String
    Dt1 = CDate(Format(Mydate, "mm/dd/yyyy"))
    Dt2 = CDate(Format(DateAdd("d", 4, Mydate), "mm/dd/yyyy"))

هنا قمنا بتعريف متغيرين من نوع حامل السجلات ... ومتغيرين من نوع تاريخ ... ومتغير نصي

ثم أسندنا للمتغير Dt1 والذي يمثل تاريخ يوم السبت ... قيمة المتغير سابق الذكر Mydate وفق تنسيق معين ... لأن جمل SQL تتعامل مع التاريخ بالتنسيق الأمريكي (الشهر أولا ثم اليوم ثم السنة .. من اليسار طبعا) ... ولتغيير التنسيق للتاريخ إستخدمنا الدالة Format والتي تأخذ معاملين ... التاريخ المراد تنسيقه .. والصيغة النصية للتنسيق ... والدالة ترجع قيمة نصية ... فكان لا بد من تغيير نوع بياناتها إلى تاريخ ... لذلك إستخدمنا الدالة CDate والتي تحول نوع بيانات معاملها إلى النوع تاريخ

وكذلك أسندنا للمتغير Dt2 والذي يمثل تاريخ يوم الإربعاء ... وللحصول على تاريخ يوم الإربعاء نجمع 4 على قيمة المتغير Mydate .. وهو الذي كما ذكرنا يمثل يوم السبت ... ولتنفيذ ذلك إستخدمنا الدالة DateAdd والتي تأخذ خمس معاملات ... 3 معاملات مطلوبة .. و2 إختيارية ... وسأشرح المعاملات المطلوبة المستخدمة في كودنا .... أولا الفاصل الزمني .... وفي حالتنا كان يوم لأننا نريد جمع 4 أيام ليوم السبت ... فجعلناه "d" .... والمعامل الثاني الرقم المراد جمعه (للفائدة : الرقم قد يكون سالبا لتطرح عوضا عن الجمع) .. وفي حالتنا جعلناه 4 ... المعامل الثالث .. التاريخ ... وكان متمثلا بقيمة المتغير Mydate ... وباقي الدوال تم شرحها سابقا

    DoCmd.SetWarnings False
    DoCmd.RunSQL "Delete * from TempTable"

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

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

    SQL = "SELECT tbl_emp.id_no, tbl_emp.firstname, tbl_comego.date_come,"
    SQL = SQL & " tbl_comego.come, tbl_comego.go, tbl_comego.work_code, tbl_emp.part"
    SQL = SQL & " FROM tbl_emp INNER JOIN tbl_comego ON tbl_emp.id_no = tbl_comego.id_no"
    SQL = SQL & " WHERE tbl_comego.date_come Between #" & Dt1 & "# And #" & Dt2 & "#"

هنا أسندنا للمتغير SQL قيمة وهي جملة إس كيو إل ... وبحكم طول هذه الجملة تم تقسيمها على أسطر ... وفكرة التقسيم أن نسند للمتغير جزء من القيمة ثم في السطر الثاني نسند للمتغير قيمته الحالية مع جزء من القيمة وهكذا حتى ننتهي ... وبذلك نكون دمجنا أجزاء الجملة المقسمة بشكل صحيح ومرتب

ومعنى جملة الـ SQL بالعربي ... إجلب الحقول المبينة من الجدولين المرتبطين بعلاقة بشرط أن يكون التاريخ بين التاريخين Dt1 و Dt2 .. وهما المتغيران الذان يمثلان تاريخي السبت والإربعاء

وينتج من هذه الجملة الإستعلامية 5 سجلات لكل موظف كل سجل يمثل يوم من أيام الإسبوع إبتداءً من يوم السبت

    Set RC1 = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
    Set RC2 = CurrentDb.OpenRecordset("TempTable", dbOpenDynaset)

أسندنا للمتغير حامل السجلات RC1 السجلات المجلوبة من جملة الـ SQL سابقة الذكر .... ثم أسندنا للمتغير RC2 سجلات الجدول TempTable ... وبالطبع ليس به سجلات ولكن لنتمكن من إستخدامه لإضافة وتحديث سجلات الجدول

    Dim RCount As Integer
    With RC1
        .MoveFirst
        Do Until .EOF
            If MyId = "" Then
                MyId = ![id_no]
                RCount = 0
                RC2.AddNew
                RC2(0) = MyId
                RC2(1) = ![firstname]
                RC2(2) = ![date_come]
                RC2(13) = ![part]
            ElseIf MyId <> ![id_no] Then
                RC2.Update
                MyId = ![id_no]
                RCount = 0
                RC2.AddNew
                RC2(0) = MyId
                RC2(1) = ![firstname]
                RC2(2) = ![date_come]
                RC2(13) = ![part]
            End If
            RCount = RCount + 2
            RC2(RCount + 1) = ![come]
            RC2(RCount + 2) = ![go]
            .MoveNext
        Loop
    End With

لصعوبة تقسيم الكود لإرتباطه ببعضه .... فسأشرح كل كود برقم سطره

1- عرفنا متغيرRCount من نوع رقم ... سنستخدمه ليمثل رقم تسلسل الحقل في الجدول TempTable

2- إستخدمنا الكود هذا مع حامل السجلات RC1 بحكم أننا سنستخدمه كثيرا في سطور الكود التالية ... فعوضا عن كتابة RC1.EOF مثلا نستخدم EOF. وهكذا يفهم مترجم اللغة البرمجية في الأكسيس أنك تقصده

3- نأمر حامل السجلات RC1 أن يذهب بمؤشر القراءة الخاص به لأول سجل

4- نبدأ حلقة Do Until ... ومعنى هذا الكود بالعربي ... نفذ ما دام حامل السجلات RC1 لم يصل لما بعد آخر سجل

5- دالة شرطية تختبر قيمة المتغير MyId .. المعرف سابقا .. وسنستخدمه لتخزين رقم الموظف الإداري في الكود ... بحكم أن حامل السجلات RC1 قد يحمل 5 سجلات لكل موظف كل واحد منها يمثل يوم من أيام الإسبوع ... فنريد منه أن كل مرة نقرأ سجل نشوف إذا كان يساوي الرقم الإداري للموظف أن يخبرنا .. وسنعرف كيف نستفيد من ذلك لاحقا ... وبحكم أن أول مره ستكون قيمة المتغير لا شئ فجعلنا الشرط يختبر إذا كان يساوي ""

6- إذا تحقق الشرط في السطر رقم 5 ... إجعل قيمة المتغير MyId تساوي رقم الموظف RC1![id_no]

7- واجعل المتغير RCount يساوي صفر

8- نأمر حامل السجلات RC2 أن يتهيء لإستقبال سجل جديد

9- نسند قيمة المتغير MyId .... للفهرس رقم 0 من حامل السجلات RC2 وهو كما قلنا حامل السجلات للجدول TempTable وحقوله مفهرسة إبتداءً بالصفر .. فنكون هنا قد أسندنا قيمة المتغير MyId للحقل TempId

10- نسند قيمة الحقل firstname من حامل السجلات RC1 إلى الفهرس رقم 1 من حامل السجلات RC2 والذي يمثل الحقل TempName

11- نسند قيمة الحقل date_come من حامل السجلات RC1 إلى الفهرس رقم 2 من حامل السجلات RC2 والذي يمثل الحقل TempSatDate

12- نسند قيمة الحقل part من حامل السجلات RC1 إلى الفهرس رقم 13 من حامل السجلات RC2 والذي يمثل الحقل TempPart

إنتهى الكود داخل الشرط المكتوب في السطر رقم 5 ... وسيذهب الآن للسطر رقم 22 ليخرج من الدالة الشرطية .... فأقترح أن تقرأ السطر رقم 23 الآن لتفهم السياق البرمجي ثم سأوجهك لقراءة السطر رقم 13 إذا حان وقته

13- في حال لم يتحقق الشرط في السطر 5 فسنختبر ما إذا كانت قيمة المتغير MyId لا تساوي قيمة الحقل id_no من حامل السجلات RC1 ... لأنه إذا تحقق هذا الشرط ... فإن حامل السجلات RC1 يحمل سجل برقم موظف جديد فنحتاج أن نبدأ بإدخال سجل موظف جديد في الجدول TempTable

14- ما دام أن الشرط في السطر رقم 13 تحقق ... فهذا يعني أن كل البيانات اللازمة لسجل الموظف السابق قد أسندت ... ولكن لم تحفظ ... لذا هنا نأمر حامل السجلات RC2 بأن يحفظ البيانات في الجدول بإستخدام الأمر Update

15- 21 في هذه السطور نفعل كما شرحنا في السطور 6 - 12

22- نغلق الدالة الشرطية

23- نجمع على قيمة المتغير RCount السابقة 2 ... مما يعني أن الكود إذا دخل في الدالة الشرطية الأولى سيكون صفر .. وذلك بفعل السطر رقم 7 ... وبهذه الحاله إذا جمعنا صفر و 2 ...ستكون قيمته 2 ... وفي الدورة الثانية للسجلات .. إذا لم يدخل الدالة الشرطية الثانية في السطر رقم 13 (وطبعا لن يدخل الدالة الشرطية الأولى في السطر رقم 5 بحكم أن المتغيرMyId لن يساوي "" أبدا لبقية الكود ).. فإنه سيضاف لقيمته السابقة 2 .. وبهذه الحالة نجمع 2 و 2 .. وستكون قيمته 4 .... ثم 6 ... وهكذا حتى يدخل الكود مرة أخرى في الدالة الشرطية ... فستتغير قيمته لصفر بحكم الكود في السطر 16 .. وهكذل دواليك

24- نسند قيمة الحقل come من حامل السجلات RC1 إلى الفهرس الممثل بقيمة ناتج العملية الحسابية RCount + 1 من حامل السجلات RC2 والذي يمثل الحقول In1 إذا كان ناتج معادلة الفهرس 3 .. أو يمثل الحقل In2 إذا كان ناتج عملية الفهرس 5 ... وهكذا

25- نسند قيمة الحقل go من حامل السجلات RC1 إلى الفهرس الممثل بقيمة ناتج العملية الحسابية RCount + 2 من حامل السجلات RC2 والذي يمثل الحقول Out1 إذا كان ناتج معادلة الفهرس 4 .. أو يمثل الحقل Out2 إذا كان ناتج عملية الفهرس 6 ... وهكذا

26- نأمر حامل السجلات RC1 بأن يحرك مؤشر القراءة للسجل التالي

27- نعود لبداية الحلقة Do ... ومن هنا وصاعدا لن يدخل الكود لدالة الشرط في السطر 5 ... فإرجع الآن وإقرأ الدالة الشرطية في السطر 13 وما بداخلها من كود

28- نوقف التعامل مع RC1 المذكور في السطر رقم 2

الآن يكون الجدول TempTable إمتلأ ببيانات الحضور للموظفين لفترة أسبوع عمل ....

    DoCmd.SetWarnings True
    RC1.Close
    RC2.Close

أولا نأمر بتشغيل رسائل التحذير التقليدية لبرنامج الأكسيس .... ثم نغلق حاملي السجلات RC1 و RC2 لنهدمهما من الذاكرة ... لإنتهاء الحاجة منهما

    Dim stDocName As String

    stDocName = "TempTable"
    DoCmd.OpenReport stDocName, acPreview

وهذا الكود تقليدي لعرض التقرير TempTable ومصدر سجلاته جدولنا TempTable الذي ملأناه بالبيانات سابقا

وبحكم أن الجدول ليس به إلا تاريخ واحد وهو تاريخ يوم السبت فقمت بإخفاء مربع النص D1 والذي مصدر بياناته الحقل TempSatDate ثم أنشأت 5 مربعات نص غير منضمة كالتالي

D0 ليظهر به تاريخ يوم السبت وقيمته الكود التالي

=Format([D1],"yyyy/mm/dd")

D1 ليظهر به تاريخ يوم الأحد وقيمته الكود التالي

=Format(DateAdd("d",1,[D1]),"yyyy/mm/dd")

فكأنني جمعت على تاريخ السبت الموجود في مربع النص D1 يوم واحد فيكون بذلك تاريخ يوم الأحد

وهكذا فعلت بـ D2 لتاريخ يوم الإثنين ... وبـ D3 لتاريخ يوم الثلاثاء ... وبـ D4 لتاريخ يوم الإربعاء

وبالنسبه للتنسيق الشرطي لمربعات النص In1 إلى In5 وضعت في الشرط "تعبير هو" الكود التالي

([TempPart]=1 And DateDiff("s",[In1],"07:30")<0) Or ([TempPart]=2 And DateDiff("s",[In1],"08:00")<0)

ومعناه إذا كانت قيمة مربع النص المخفي TempPart والذي يمثل رمز القسم الذي يعمل فيه الموظف تساوي 1 و فرق قيمة مربع النص In1 من الساعة 7:30 بالثواني أقل من 0

أو

إذا كانت قيمة مربع النص المخفي TempPart تساوي 2 و فرق قيمة مربع النص In1 من الساعة 8:00 بالثواني أقل من 0

فغير لون الخلية

وهكذا مع باقي مربعات النص مع مراعاة التغيير من In1 إلى المناسب

والحمدلله رب العالمين أولا وآخرا

2

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#6

ألاخ الكريم: KOAO يبدو أن المنتدى إكتسب عضو فعال وسباق لمساعدة باقي الأخوة الأعضاء .. بارك الله لك يا أخي على هذا المجهود وأعانك وزادك من علمه.

#7

ما شاء الله عليك يا KOAO

بصراحه الشرح حلو ومفيد

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

وبالنسبه للأعضا والزوار لهذا المنتدى

أعرف اني مقصر بحقك

لكن ما بقول إلا الله يوفقك دنيا واخرة

#8

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

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

أخي الكريم mjhoool .... تكفي دعواتك ... فهي خير جزاء ... وأسال الله أن يسخرنا لما فيه خدمة بعضنا في خير الدنيا والآخرة ... وأن يجمعنا في دار كرامته ووالدينا

والحمدلله رب العالمين

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#9
اقتباس

ألاخ الكريم: KOAO يبدو أن المنتدى إكتسب عضو فعال وسباق لمساعدة باقي الأخوة الأعضاء .. بارك الله لك يا أخي على هذا المجهود وأعانك وزادك من علمه

بارك الله فيك اخي العزيز.. هذه جهود تثاب عليها ان شاء الله بخير الثواب

لك كل التقدير والاحترام على هذا العمل والشرح الوافي والسليم لمساعدة اخوتك في المنتدى

كل التحية

وَمِنَ النَّاسِ مَن يُعْجِبُكَ قَوْلُهُ فِي الْحَيَاةِ الدُّنْيَا وَيُشْهِدُ الله عَلَى مَا فِي قَلْبِهِ وَهُوَ أَلَدُّ الْخِصَامِ

مواضيعي ومشاركاتي

#10

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

أستاذنا ومشرفنا .. همام ابوعرقوب ... شرف لي مرورك الكريم ... وكلماتك وسام أحتفي به ... فلك الشكر لإهتمامك ومتابعتك

والحمدلله رب العالمين

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#11

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

تحت طلب خاص من أخي mjhoool ... الذي طلب إضافة عامود في التقرير الإسبوعي لعرض ملاحظات عن الموظف ... مثل مجاز أو في مهمة .. وتم تنفيذ طلبه في المرفق التالي

وبالتوفيق

koao_Attendance_up.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#12

أشكرك على المجهود الطيب الذي تبذله

في خدمة الأعضاء

وأشكرك وجزاك الله خير على المساعدة التي قدمتها

وإن شاء الله الجميع يستفيد من هذي التجربة

إلى الأمام إن شاء الله

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…