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

[تمت الاجابه]من يتكرم علينا بشرح هذا الكود المهم

بدأه حسان بشير في 7 مارس 2011 · 10 رد · 1,564 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخواني الكرام له وب

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

منذ فترة وأنا أبذل جهداًً كبيراً في عمل برنامج لمتابعة حفظ القرآن يتبع أسلوب إدخال البيانات مرة كل شهر .

واجهتني مشكلة كيفية حساب مقدار ما حفظ الطالب خلال الشهر تلقائياً ، ثم لاح لي بارقة أمل حين قرأت في هذا المنتدى عن طريقة لذلك ،

ولكن المشكلة أن المبرمج اعتمد على الإدخال اليومي بينما أريد أنا الإدخال الشهري :

آمل احتساب الأجر من الخبراء في شرح هذا الكود ، حتى أقوم بتحويله لخدمة برنامجي مشكورين :

الكود :

Private Sub NuPag_GotFocus()
   On Error GoTo Err

   Dim NumberOfPages, Sum As Double
   Dim dbs As Database
   Dim rs As Recordset

   Set dbs = CurrentDb
   Dim N As Integer

   NumberOfPages = 0

	If IsNull(FromAya) Then
   	NumberOfPages = ""
	End If

	If IsNull(ToAya) Then
    	NumberOfPages = ""
	End If


	If Not IsNull(FromAya) Then

    	If Not IsNull(ToAya) Then
    	'Loop
        	Set rs = dbs.OpenRecordset("SELECT Percentage FROM tblAya WHERE (((SuraName)= '" & [Forms]![frmReview]![frmReviewDetails_Subform]![Sura] & "' ) AND ( (AyaNo)>= " & [Forms]![frmReview]![frmReviewDetails_Subform]![FromAya] & "  ) AND ( (AyaNo)<= " & [Forms]![frmReview]![frmReviewDetails_Subform]![ToAya] & "  ) ) ")

        	rs.MoveLast
        	rs.MoveFirst

        	While Not rs.EOF
        	Percentage = rs.Fields("Percentage").Value
        	NumberOfPages = NumberOfPages + Percentage

        	rs.MoveNext
        	Wend

    	End If



    	If IsNull(ToAya) Then
    	NumberOfPages = ""
    	End If


	End If


	Sum = (NumberOfPages / 15)
	Me.NuPag = Format(NumberOfPages, "##.00")

	rs.Close
	dbs.Close


Exit_Err:
	Exit Sub

Err:
	MsgBox Err.Description
	Resume Exit_Err

End Sub

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

Option Compare Database
Option Explicit

Function Pages(FromAya, ToAya As Integer, Sura As String) As Double
   Dim NumberOfPages, Parcentage As Double
   Dim dbs As Database
   Dim rs As Recordset
   Set dbs = CurrentDb
   Set rs = dbs.OpenRecordset("SELECT tblAya.Percentage FROM tblAya WHERE (((tblAya.SuraName)= 'Sura' ) AND ((tblAya.AyaNo)>=[Forms]![frmStudents]![frmSaveDetails Subform]![From Aya] And (tblAya.AyaNo)<=[Forms]![frmStudents]![frmSaveDetails Subform]![To Aya]))")
   Dim N As Integer


	NumberOfPages = 0

	If IsNull(FromAya) Then
   	NumberOfPages = ""
	End If

	If IsNull(ToAya) Then
    	NumberOfPages = ""
	End If


	If Not IsNull(FromAya) Then

    	If Not IsNull(ToAya) Then
    	'Loop
        	rs.MoveLast
        	rs.MoveFirst

        	While Not rs.EOF
        	Percentage = rs.Fields("Percentage").Value
        	NumberOfPages = NumberOfPages + Percentage

        	rs.MoveNext
        	Wend

    	End If



    	If IsNull(ToAya) Then
    	NumberOfPages = ""
    	End If


	End If
	rs.Close
	dbs.Close
Pages = NumberOfPages

End Function

أسأل الله التوفيق للجميع .

سبحان الله وبحمده سبحان الله العظيم

#2

يا اخوان الكود هذا مهم للغاية بالنسة لي وا لغيري من العاملين في مجالات تحفيظ القرآن الكريم ، أرجو ممن يستطيع الشرح

سبحان الله وبحمده سبحان الله العظيم

#3

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

mk17481_26bccea871.gif
#4
فتى الوادي كتب:

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

أشكرك أخي العزيز على التفاعل

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

أجدد شكري الجزيل لك .

برنامج_القرآن_الكريم_-_Copy.rar

سبحان الله وبحمده سبحان الله العظيم

#5

طيب ما هو المطلوب ؟ وما هو اسم النموذج المطلوب التعديل عليه ؟

mk17481_26bccea871.gif
#6

أخي العزيز :

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

سبحان الله وبحمده سبحان الله العظيم

#7

السلام عليكم :

معليش .. أنت فاهم البرنامج تمام .. لكن ما فهمته .!

هل تقصد التقرير المطبوع هو مقدار حفظ الطالب ؟

يعني ندخل له رقم الطالب .. ثم الفترة من إلى .. يطلع لنا تقرير اللي حفظه الطالب ؟

في القاعدة جدول السماع ... هل هو المقصود به الحفظ ؟

mk17481_26bccea871.gif
#8

جزاك الله خير أخي الكريم فتى الوادي ولو تسمح لي بالمشاركة ..

أخي الكريم حسان الكود صحيح ونتائجه صحيحية ولكن فيه أخطاء منطقية ..

أولا الغي الكود من الوحدة النمطية المسمى NumberOfPages فلا داعي له وسنستخدم الكود الموجود في النموذج فقط

ثانيا هناك خطأ في الكود يظهر عند عمل Debug - Compile للكود اي التدقيق على صحة الكود في هذا السطر

Percentage = rs.Fields("Percentage").Value

والسبب ان المتغير Percentage غير معرف وهنا استخدمنا في رأس الكود الامر Option Explicit الذي معناه عدم قبول اي متغير غير معرف

لان اسم المتغير في التعريف Parcentage والصحيح Percentage وهنا اختلف الاسم وصرنا بمعرف آخر ..

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

ثالثا الكود

تم الغاء بعض الاوامر والتي ليس لها علاقة بتنفيذ منطق الكود وتم بالمقابل اضافة بعض الاوامر ليصبح الكود على الشكل التالي

Private Sub set_Line()
   On Error GoTo Err
   Dim NumberOfPages, Percentage As Double
   Dim dbs As Database
   Dim rs As Recordset

   Set dbs = CurrentDb
   NumberOfPages = 0

    If IsNull(FromAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

    If IsNull(ToAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

        'Loop
            Set rs = dbs.OpenRecordset("SELECT Percentage FROM tblAya WHERE (((SuraName)= '" & [Forms]![frmReview]![frmReviewDetails_Subform]![Sura] & "' ) AND ( (AyaNo)>= " & [Forms]![frmReview]![frmReviewDetails_Subform]![FromAya] & "  ) AND ( (AyaNo)<= " & [Forms]![frmReview]![frmReviewDetails_Subform]![ToAya] & "  ) ) ")

            While Not rs.EOF
            Percentage = rs.Fields("Percentage").Value
            NumberOfPages = NumberOfPages + Percentage

            rs.MoveNext
            Wend

    Me.NuPag = Format(NumberOfPages, "##.00")

    rs.Close
    dbs.Close

Exit_Err:
    Exit Sub

Err:
    MsgBox Err.Description
    Resume Exit_Err


End Sub

تم الغاء

rs.MoveLast
            rs.MoveFirst

وتم ايضا الغاء

Sum = (NumberOfPages / 15)

ولاحظ ان حساب الصفحات موجود في الاستعلام كحقل محسوب

Pages: FormatNumber([Lines]/15;1)

تم الغاء

[code]If Not IsNull(FromAya) Then
           If Not IsNull(ToAya) Then

وتم عمل البديل

If IsNull(FromAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

  If IsNull(ToAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

الآن الكود اصبح واضحا أكثر من الاول ، لنشرح الكود

Dim NumberOfPages, Percentage As Double
   Dim dbs As Database
   Dim rs As Recordset

الاول متغيررات لزوم عمليات حسابية

والثاني متغير لقاعدة البيانات

والثالث متغير قيمة السجل

Set dbs = CurrentDb

وضع الجدول في المتغير لنستطيع التعامل معه

If IsNull(FromAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

اذا الحقل المسمى من رقم الآية فارغ يعني قيمة عدد الاسطر فارغ والخروج من الاجراء فلا داعي للتكملة

If IsNull(ToAya) Then
       Me.NuPag = ""
       Exit Sub
    End If

نفس الموضوع ولكن للحقل الى الآية..

Set rs = dbs.OpenRecordset("SELECT Percentage FROM tblAya WHERE (((SuraName)= '" & [Forms]![frmReview]![frmReviewDetails_Subform]![Sura] & "' ) AND ( (AyaNo)>= " & [Forms]![frmReview]![frmReviewDetails_Subform]![FromAya] & "  ) AND ( (AyaNo)<= " & [Forms]![frmReview]![frmReviewDetails_Subform]![ToAya] & "  ) ) ")

هنا استخدمنا sql وهو استعلام لفلترة السجلات وذلك لتحديد الآية من الى حاول نسخ الكود ووضعه في الاستعلام لتعديل ما يلزمك وثم اعيد نسخه هنا ويعتبر هذا السطر هو بداية حلقة التكرار وذلك لقراءة جميع السجلات المطلوبة بالاستعلام

While Not rs.EOF

الكود لمعرفة هلى انتهت السجلات حسب الاستعلام المنفذ لفلترة السجلات ؟

اذا لم ينتهي نفذ التالي

Percentage = rs.Fields("Percentage").Value
            NumberOfPages = NumberOfPages + Percentage

هنا سيأتي الكود بقيمة Percentage من الجدول ووضعها بالمتغير

يتم في السطر التالي تجميع القيمة حسب عدد السجلات

 rs.MoveNext

قراءة السجل التالي ولاحظ السجلات لم تنتهي بعد

Wend

هنا نهاية الحلقة التكرارية

الآن وعند انتهاء السحلات نفذ الاكواد التالية

Me.NuPag = Format(NumberOfPages, "##.00")

الآن وضع النتيجة بالحقل الموجود بالنموذج وهو عدد الاسطر

rs.Close
    dbs.Close

اغلق السجل ثم اغلق الجدول

انتهى الكود

اعدت تسمية الكود الى set_Line ليسهل علي تنفيذه في الحدث بعد التعديل (من الآية) والحقل (الى الآية)

مرفق المثال بعد التعديل

تحياتي ..

برنامج القرآن الكريم - Copy.zip

تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 9 مارس 2011 في 23:27

27169617.gif
#9

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

لا أملك من الشكر ما يكفي ؛ غير أني كتبت من أجلك هذه الأبيات فتقبلها :

وجدتك بين أكوام اللآلي

تجيد الجود تشدو لليالي

أبا عدنان شكراً إن شكري

تعلق أحرفي بسنا المعالي

جوابك لست ألقى ما نسجت

كمثل بهائه يكسي سؤالي

أكرر لك شكري ...

سبحان الله وبحمده سبحان الله العظيم

#10
حسان بشير كتب:

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

لا أملك من الشكر ما يكفي ؛ غير أني كتبت من أجلك هذه الأبيات فتقبلها :

وجدتك بين أكوام اللآلي

تجيد الجود تشدو لليالي

أبا عدنان شكراً إن شكري

تعلق أحرفي بسنا المعالي

جوابك لست ألقى ما نسجت

كمثل بهائه يكسي سؤالي

أكرر لك شكري ...

أخي العزيز حسان اشكرك على هذه السطور الجميلة وجزاك الله خير ..

ما شاء الله مبرمج وشاعر .. بارك الله بك ..

خليك بالاجواء .. وان شاء الله سنقدم لكم ما هو جديد وحصري بنفس الخصوص ، فجهز قلمك لقصيدة جديدة :)

تحياتي ..

27169617.gif
#11

أخي الحبيب : أبو عدنان

ما تغلى عليك الأبيات ، تأمر أمر والله .

وأبشرك بعد توفيق الله تعالى ثم شرحكم الطيب ، استطعت أن أحقق شيئا طالما حلمت به ، وهو حساب مقدار حفظ الطلاب تلقائياً .

فأسأل الله لك دوام التوفيق والبركة والأ جر

انتظر جديدك بشوق كبير .

سبحان الله وبحمده سبحان الله العظيم

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

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

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

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

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