data_base

الصحراء 28-11-2002 5 رد 1,180 مشاهدة
ا
بسم الله الرحمن الرحيم
انا طالبة بالكلية قسم تكنولوجيا الحاسوب
وعندي بعض المشاكل في مادة قواعد البيانات
(data base)
فاذا ممكن تساعدوني شوي
[RAM]http://www.islamway.com/arabic/images/several/anasheed/goraba.ram[/RAM]
ا
هلا بك اختي الصحراء ....

ابشري لو انتي ماحددتي وش المشكلة بالضبط ...

او وش دراستك .... علشان اجيب لك مواقع خاصة ان شاء الله


عموماً ....

شوفي هالرابط وهو نتيجة بحث عام لمواقع كثيرة

http://go.3roos.com/wkBbS68SxNc

لك تحياتي

اخوك البندر
ا
الدرس الأول في قواعد البيانات : (فتح وإغلاق قاعدة البيانات)

أولاً وقبل كل شيء أحببت أن أوضح بعض الأمور التالية :
1) سيتم تقسيم البرنامج إلى إجراءات (Sub) ودوال (Function) ليسهل تصحيحها ونقلها .
2) سيتم بناء الإجراءات والدوال بشكل عام بحيث يتم إستدعاء أكثر من مرة وبشكل مختلف .
3) تصميم قاعدة البيانات سنتركه لمرحلة قادمة حيث سنقوم ببناءها بالكود وحالياً سنكتفي بالأكسيس .
4) المثال الذي سنطبق عليه الدروس هو (دليل هاتف) حيث أنه بسيط للتعلم وفي نفس الوقت له فائدة عملية .

ونبدأ على بركة الله .

* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *

فكرة درس اليوم تتناول المرحلتين الأول والأخيرة في التعامل قواعد البيانات وهما (فتح وإغلاق قاعدة البيانات) .
وللتعامل مع قاعدة البيانات من الكود لابد من إضافة شيء يعرف بـ (الإشارة المرجعية Reference) وهو ما يعادل وضع أداة Data على الفورم ولكن الاختلاف بينهما هو أن ذلك المرجع متاح لكامل المشروع ويحتوي بداخله على الكثير الكثير من الأشياء التي لا توفرها أداة Data .

ولوضع اللإشارة المرجعيو نذهب إلى قائمة (Project) ثم الخيار (References) فتظهر شاشة تحتوي على المكونات التي يمكن التعامل معها من الكود أو بمعنى آخر بدلاً من وضع الأداة نفسها الفورم نقوم بوضع متغير يمثلها ويقوم بوظائفها ولكن في الخفاء ، نبحث عن المرجع (Microsoft DAO 2.5/3.51 Compatibility Library) ونضع علامة صح بجانبه ثم نضغط OK .

وسنقوم ببناء إجراء (Sub) ودالتين (Function) للتعامل مع قواعد البيانات حيث سيتم وضعهما في وحدة نمطية (Module) ، والفائدة من الوحدة النمطية هو تقسيم مشروع قاعدة البيانات إلى وظائف بحيث يمكن التحكم أكثر بكل جزئية أو تغييرها دون الحاجة لتعديل الكود في أكثر من مكان .

سنقوم بإضافة الوحدة النمطية من خلال قائمة (Project) ثم الخيار (Add Module) هناك احتمال أن تظهر شاشة يوجد بداخله تبويبين (New و Existing) حيث الخيار الأول يوجد به نوع واحد من الوحدات النمطية أما الثاني فلإدراج وحدة نمطية موجودة سابقاً نختار (New) ونحدد الوحدة النمطية الوحيدة الموجودة ونضغط (Open) وإذا أردنا عدم ظهور هذه الشاشة مرة أخرى نضع علامة صح بجانب الخيار (Don't show this dialog in the future) في أسفل الشاشة ، والاحتمال الآخر هو إدراج الوحدة النمطية مياشرة .

* * * * * * * * *

الإجراء الذي سنقوم ببناءه (Sub) هو مفتاح التشغيل للبرنامج حيث أن الطريقة العادية هي عرض أحد النماذج (الفورم) مباشرة أو أن هذه هي الطريقة الافتراضية عند بدء مشروع جديد ، ولكن هنا سنغير هذا السلوك ، نقوم بفتح الوحدة النمطية ونقوم بكتابة السطر التالي :
Sub main
وبمجرد ضغط مفتاح Enter ستقوم الفيجوال بيسيك بتكملة الإجراء ليصبح :
Sub main()

End Sub
سنقوم هنا باستدعاء الفورم الرئيسي للبرنامج كالتالي :

Sub main()
Form1.Show
End Sub

ويجب تعديل شيء في خصائص المشروع ليقوم باستدعاء هذا الإجراء وليس عرض الفورم من خلال قائمة (Project) ثم الخيار (Project1 Properties) وربما يظهر اسم آخر بدلاً من Project1 حيث أنه اسم المشروع ، في الشاشة التي تظهر يوجد خيار Startup Object وتحته قائمة تحتوي على النماذج الموجودة في المشروع بالإضافة للإجراء (Sub Main) نحدده من القائمة ونضغط OK .
نجرب تنفيذ البرنامج بالضغط على F5 للتأكد من صحة الخطوات التي قمنا بها .

* * * * * * * * *

سنقوم ببناء الدالة الأولى التي تستخدم لإرجاع المسار الصحيح للمشروع ينتهي بالشرطة المائلة ، حيث من الأخطاء البرمجية الشائعة وهي وضع مسار محدد مثلاً في حالتنا هذه مسار قاعدة البيانات بالشكل :
"c:\Telephone\Telephone.mdb"
فربما يقوم مستخم آخر بوضعها في مسار مختلف فلا يتعرف البرنامج إلا المسار المحدد ، ولتجنب ذلك نستخدم هذه الدالة :

Public Function Get_Path() As String
Dim sPath As String
sPath = App.Path & IIf(Right(App.Path, 1) = "\", "", "\")
Get_Path =sPath
End Function

حيث تم تعريف دالة من النوع العام (Public Function) اسمها (Get_Path) لا تأخذ أي وسائط لوجود قوسين دائريين ولا يوجد شيء بداخلهما تعيد هذه الدالة قيمة من النوع سلسلة نصية (As String) .

بشكل عام يتم تعريف متغير داخل الدالة للقيمة التي سيتم ترجيعها في الدالة من نفس نوع الدالة وهو هنا المتغير sPath ، حيث يرجه App.Path المسار الحالي للبرنامج ، واستخدمنا بعدها الأمر IIF حيث يأخذ هذا الأمر بالترتيب من اليسار لليمين :
(1) تعبير منطقي تكون القيمة النهائية له (صح أو خطأ) (True/False) ، وهو هنا التعبير :
Right(App.Path, 1) = "\"
حيث يقارن هذا التعبير الحرف الأول من اليمين فإذا كان الشرطة المائلة فيرجع القيمة صح وإلا فيرجع خطأ .
(2) التعبير الذي سيتم تنفيذه في حال كون الشرط السابق صحيح ، وهو هنا إرجاع سلسلة فارغة .
(3) التعبير الذي سيتم تنفيذه في حال كون الشرط السابق خطأ ، وهو هنا إرجاع الشرطة المائلة .

وبالنتيجة فأن التعبير IIF وما بعدها إما سيرجع سلسلة فارغة في حال وجود الشرطة المائلة في نهاية المسار (مثلاً لو كان مسار البرنامج هو C:\) وإما يرجع الشرطة المائلة في حال كون المسار لا يحتوي على شرطة مائلة في نهايته (مثلاً المسار C:\Telephone) .

وبالنتيجة يتم تعيين المسار ينتهي بالشرطة المائلة للمتغير sPath الذي يتم تعيينه في نهاية الأمر لاسم الدالة (Get_Path =sPath) .

* * * * * * * * *

الدالة الأخيرة هي لفتح قاعدة البيانات وبنفس الطريقة نكتب السطر :
Public Function Open_Database() As Boolean
وبمجرد ضغط مفتاح Enter ستقوم الفيجوال بيسيك بتكملة الدالة لتصبح :
Public Function Open_Database() As Boolean

End Function

حيث تم تعريف دالة عامة (Public Function) اسمها (Open_Database) ، ترجع قيمة منطقية (Boolean) تدل على نجاح عملية فتح قاعدة البيانات أو فشلها .
وبما أن هذه الدالة ستقوم بفتح قاعدة البيانات فإنها تحتاج لمعرفة مسار البرنامج وهو ما قمنا به في الدالة السابقة والشيء الأخر هو اسم قاعدة البيانات ، ويمكن وضع الاسم مباشرة داخل هذه الدالة ولكن لكي يصبح الإجراء (عام) سنضع اسم قاعدة البيانات كثابت في بداية الوحدة النمطية على النحو التالي :
Public Const sDbName = "Telephone.mdb"
حيث سنستخدم الاسم sDbName مكان اسم قاعدة البيانات ، والمتغير الأخير هو متغير لوضع مؤشر لقاعدة البيانات بداخله حيث سيتم استخدامه لتنفيذ الأوامر على قاعدة البيانات ، ويتم تعريفه بالشكل التالي :
Public Dbf As Database
ويكتب أيضاً في بداية الوحدة النمطية .

ونكتب داخل الدالة الأوامر التالية :

Public Function Open_Database() As Boolean
On Error Resume Next
Err.Clear
Set Dbf = DBEngine.OpenDatabase(Get_Path & DbName)
Open_Database = (Err.Number = 0)
On Error GoTo 0
End Function

أول أمر في الدالة وظيفته هو في حالة حدوث خطأ يتم الانتقال للأمر التالي دون عرض رسالة خطأ ، فمهتم هذه الدالة هو فتح قاعدة البيانات وإرجاع نتيجة الفتح بالقيمة (True) في حالة عدم وجود أخطاء أو إرجاع (False) في حالة حدوث أخطأ ، أو بمعنى آخر تبقى مهمة عرض رسالة الخطأ على عاتق الأمر الذي استدعى هذه الدالة في جزء آخر من البرنامج .
الأمر الثاني لمسح أي أخطاء سابقة إن وجدت .
الأمر الثالث والمهم هو الذي يقوم فعلاً بفتح قاعدة البيانات حيث يتم استخدام Set لتعيين مؤشر عملية الفتح للمتغير Dbf و DBEngine هو الجذر الرئيسي في هيكلية قاعدة البيانات من نوع DAO ، والوظيفة OpenDatabase تأخذ عدة بارامترات ولكن اختيارية ما عدا الأول وهو اسم قاعدة البيانات .
الأمر الرابع وهو المهم الثاني حيث يتم مقارنة رقم الخطأ Err.Number بالصفر فإذا تساويا فهذا يدل على نجاح فتح قاعدة البيانات فيتم تعيين القيمة (True) لقيمة الدالة وإذا كان Err.Number ليس صفر فهذا يدل على وجود خطأ فيتم تعيين (False) لقيمة الدالة ، والأمر الرابع يمكن كتابته بالشكل التالي :
If Err.Number = 0 Then
Open_Database = True
Else
Open_Database
End If

أو بالشكل التالي :
If Err.Number = 0 Then Open_Database = True Else Open_Database

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

* * * * * * * * *

بهذا نكون أنتهينا من بناء الدالتين ، ويبقى استدعائهم في الإجراء Sub Main قبل عرض الفورم ، وللاستفادة من القيمة المنطقية التي ترجعها دالة فتح قاعدة البيانات سيتم إستدعائها بالشكل التالي :

Sub main()
again:
If Open_Database() = True Then
Form1.Show
Else
If MsgBox("لا يمكن فتح قاعدة البيانات ." & vbCr & "هل تريد المحاولة من جديد ؟", vbMsgBoxRight + vbMsgBoxRtlReading + vbCritical + vbRetryCancel) = vbRetry Then
GoTo again
Else
End
Exit Sub
End If
End If
End Sub

حيث تم وضع وسم (Label) في بداية الإجراء ليتم الرجوع إلى ذلك الموضع عند الحاجة لإعادة تنفيذ مجموعة من الأوامر مرة أخرى .
في الأمر الثاني تم استخدام تقتنية معقدة بعض الشيء حيث يتم استدعاء الدالة Open_Database لمحاولة فتح قاعدة البيانات وهي بدورها ستعيد إما القيمة True في حالة نجحت الدالة في فتح قاعدة البيانات أو تعيد القيمة False في حالة عدم النجاح ، فنقوم بمقارنة نتيجة الاستدعاء بالقيمة True فإذا تساويا فيتم عرض الفورم الأول ، وإلا يتم عرض رسالة خطأ وبها زري (إعادة المحاولة وإلغاء الأمر) ويتم بنفس الطريقة مقارنة نتيجة اختيار المستخدم لأي زر فنحدد إذا كان يريد إعادة المحاولة من خلال مقارنة نتيجة الاستدعاء بالقيمة vbRetry (استخدم F2 للبحث عن vbRetry ومعرفة المزيد عن ثوابت المستخدمة مع الدالة MsgBox) ، فإذا اختار المستخدم إعادة المحاولة يتم الرجوع للوسم again في بداية الإجراء لإعادة استدعاء الأوامر من جديد ومن هنا تأتي فائدة مسح الأخطاء السابقة في دالة فتح قاعدة البيانات .
وإذا اختار المستخدم (إلغاء الأمر) يتم إنهاء البرنامج باستخدام الأمر End .

* * * * * * * * *

بقي شيء أخير وهو إغلاق قاعدة البيانات ، ويتم استدعائه عند إغلاق الفورم الرئيسي ، ونستخدم الكود التالي :

Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
Dbf.Close
Set Dbf = Nothing
End Sub

* * * * * * * * *
ا
الدرس الثاني في قواعد البيانات : (عرض محتويات جدول)
قمنا في الدرس السابق ببناء أول مرحلتين في برامج قواعد البيانات وهما :
فتح قاعدة البيانات عند بداية تشغيل البرنامج .
وإغلاق قاعدة البيانات عند إنتهاء البرنامج .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
نقوم اليوم بتصميم أول عملية فعلية تتم على قاعدة البيانات وهي استعراض البيانات الموجودة في جدول ، ولكن قبل البدء في ذلك أود أن أنوه إلى أن البيانات التي سيتم التعامل معها خلال الدرس هي :
الاسم ، الجنس ، الجنسية ، أرقام الهاتف .
لقد أخترت أقل عدد من الجقول لكي يكون الدرس واضح ولا تتشعب الأفكار .
لذلك بعد تصميم قاعدة البيانات من واقع تحليل البيانات السابقة فإنه :
سيتم إنشاء جدول للجنسيات نسميه (الجنسية) وبياناته هي :
1- رقم_الجنسية : نوع البيانات رقم ، حجم الحقل عدد صحيح ، مطلوب نعم ، مفهرس نعم بدون تكرار ، ونجعل هذا الحقل مفتاح أساسي .
2- الجنسية : نوع البيانات نص ، حجم الحقل 30 ، مطلوب نعم ، مفهرس نعم بدون تكرار .
وسيتم إنشاء جدول لبيانات الأشخاص نسميه (الشخص) وبياناته هي :
1- رقم_الشخص : نوع البيانات رقم ، حجم الحقل عدد صحيح طويل ، مطلوب نعم ، مفهرس نعم بدون تكرار ، ونجعل هذا الحقل مفتاح أساسي .
2- الاسم : نوع البيانات نص ، حجم الحقل 40 ، مطلوب نعم ، مفهرس نعم تكرار موافق .
3- الجنس : نوع البيانات نعم/لا ، مطلوب نعم ، مفهرس نعم تكرار موافق .
4- رقم_الجنسية : نوع البيانات رقم ، حجم الحقل عدد صحيح ، مطلوب نعم ، مفهرس تكرار موافق .
وسيتم إنشاء جدول لأرقام الهواتف نسميه (الهاتف) وبياناته هي :
1- رقم_الهاتف : نوع البيانات رقم ، حجم الحقل عدد صحيح طويل ، مطلوب نعم ، مفهرس نعم بدون تكرار ، ونجعل هذا الحقل مفتاح أساسي .
2- رقم_الشخص : نوع البيانات رقم ، حجم الحقل عدد صحيح طويل ، مطلوب نعم ، مفهرس تكرار موافق .
3- الهاتف : نوع البيانات نص ، حجم الحقل 15 ، مطلوب نعم ، مفهرس نعم تكرار موافق .
ملاحظة : رقم_الهاتف هو ترقيم للتفرقة بين البيانات الأخرى وليس رقم الهاتف الفعلي .
وهذا هو شكل العلاقة بين الجداول :

الآن بعد الانتهاء من تصميم قاعدة البيانات يأتي شيء مهم وهو أي جدول يجب إدخال البيانات فيه أولاً ، للإجابة على هذا السؤال يجب الرجوع للعلاقة بين الجداول ، نلاحظة أن جدول الهاتف مربوط مع الشخص بعلاقة واحد إلى العديد من طرف الشخص لذلك يجب إدخال البيانات في جدول الشخص قبل جدول الهاتف ، وكذلك نجد أن جدول الشخص مربوط مع جدول الجنسية بعلاقة واحد إلى العديد من طرف الجنسية لذلك يجب إدخال البيانات في جدول الجنسية قبل جدول الشخص .
نقوم الآن بإضافة نموذج جديد إلى المشروع من خلال القائمة Project ثم الخيار Add Form وذلك للتعامل مع جدول الجنسية ونقوم بإضافة زر أمر على النموذج الرئيسي لاستدعاء هذا النموذج ونضغ الكود التالي في حدث الضغط على الزر :
Private Sub Command1_Click()
Form2.Show vbModal
End Sub
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
الآن في النموذج الجديد نطبق التالي :
نضع على الفورم الأداة Frame لتجميع أزرار التنقل بين السجلات ، ونضع داخل أدة Frame خمسة أزرار أمر Command نسميها بالأسماء التالية من اليمين إلى اليسار :
cmdFirst ، cmdPrevious ، cmdNext ، cmdLast ، cmdExit .
ونضع في خاصية Caption لكل زر من اليمين إلى اليسار :
الأولى ، السابقة ، التالية ، الأخيرة ، إغلاق .
نلاحظ أن جدول الجنسية مكون من حقلين أحدهما رقم الجنسية والآخر اسم الجنسية ، بالنسبة لرقم الجنسية هو المفتاح الرئيسي لذلك فإن عملية إدخاله لن تكون من قبل المستخدم بل سيقوم البرنامج بحساب رقم لكل جنسية يتم إضافتها من خلال دالة سنقوم ببنائها أما اسم الجنسية فهو ما سيقوم المستخدم بإدخاله ، لذلك نضع مربع نص ولائحة Text & Label على النموذج الذي تم إضافته ونسمي مربع النص بالاسم txtNationality واللائحة بالاسم lblNationality .
سيتم بناء الإجراءات التالية بحيث يمكن استخدامها لاحقاً عند التعامل مع أي جدول مع بعض الفروق .
أول إجراء سيتم إضافته هو إجراء لمسح محتويات مربعات النص الموجودة على النموذج ، وعلى الرغم من وجود مربع نص واحد في هذا النموذج إلا أن الاستفادة تكون واضحة عند استخدام نموذج مع مربعات نص متعددة ، نفتح شاشة الكود الخاصة بالنموذج ونكتب الإجراء التالي :
Sub Clear_Inputs()
txtNationalityName.Text = ""
End Sub

ويتم إستدعاء هذا الإجراء عند تحميل النموذج :

Private Sub Form_Load()
Call Clear_Inputs
End Sub

الآن بعد أن قام البرنامج بمسح محتويات مربع النص ، نريد التأكد من وجود بيانات في جدول الجنسية وذلك لإتاحة أزرار التنقل ، وفي حال عدم وجود بيانات يتم جعل الأزرار غير متاحة وهذا هو الإجراء :

Private Sub SetButtons()
Dim Nationality_Found As Boolean
Nationality_Found = Get_Count("الجنسية")
cmdFirst.Enabled = Nationality_Found
cmdPrevious.Enabled = Nationality_Found
cmdNext.Enabled = Nationality_Found
cmdLast.Enabled = Nationality_Found
End Sub

تم تعريف متغير منطقي يتم يأخذ قيمته من الدالة Get_Count التي ترجع القيمة True في حال وجود بيانات في الجدول الممر لها وترجع False في حال عدم وجود بيانات ، ويتم تعيين قيمة المتغير Nationality_Found لخاصية Enabled للأزرار الأربعة .

أما الدالة Get_Count فيتم تعريفها في الوحدة النمطية وهي كالتالي :

Public Function Get_Count(TableName As String) As Long
Dim recTemp As Recordset
Get_Count = 0
Set recTemp = Dbf.OpenRecordset("SELECT Count(*) AS العدد FROM [" & TableName & "];")
recTemp.MoveFirst
Get_Count = recTemp.Fields(0).Value
recTemp.Close
End Function

تأخذ هذه الدالة اسم الجدول وتستخدم الاستعلام لإرجاع عدد السجلات في الجدول وإرجاع عدد السجلات في اسم الدالة ، حيث القيمة 0 هي في الواقع تمثل False وأي قيمة أخرى تعتبر True .

نقوم الآ بتعديل حدث تحميل النموذج ليستدعي دالة التأكد من وجود سجلات بالشكل التالي :

Private Sub Form_Load()
Call Clear_Inputs
Call SetButtons
End Sub

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

Private Sub Form_Load()
Call Clear_Inputs
Call SetButtons
If cmdFirst.Enabled Then
Call cmdFirst_Click
End If
End Sub

بقي الآن أن نضيف كود لحدث الضغط على الزر cmdFirst وهو كالتالي :

Private Sub cmdFirst_Click()
If Not Open_Table("الجنسية", recNationality) Then
Exit Sub
End If
With recNationality
.Index = "رقم_الجنسية"
.MoveFirst
NationalityNumber = !رقم_الجنسية
Call Load_Data
.Close
End With
Set recNationality = Nothing
End Sub

حيث يتم في هذا الإجراء أولاً فتح جدول الجنسية باستخدام الدالة Open_Table التي تأخذ اسم الجدول وكذلك المتغير الذي سيحتوي على مؤشر للجدول والذي يجب أن يكون من النوع Recordset لذلك سنقوم بتعريفه في بداية النموذج بالشكل التالي :
Dim recNationality As Recordset

وترجع الدالة القيمة True في حال النجاح في فتح الجدول و False في حال الفشل ، لذلك يتم التأكد أولاً من فتح الجدول في حال لم يتم فتحه يتم الخروج من إجراء الضغط على زر cmdFirst ، ثم يتم ترتيب الجدول حسب الفهرس رقم_الجنسية ، ثم يتم الانتقال لأول سجل ، ثم نقوم الاحتفاظ برقم الجنسية في المتغير NationalityNumber الذي يتم تعريفه في بداية النموذج ، ثم نقوم باستدعاء إجراء لنقل البيانات من السجل الحالي في الجدول إلى مربعات النص وهو Load_Data ، ثم نقوم بإغلاق الجدول .

الإجراء Load_Data هو كالتالي :
Sub Load_Data()
txtNationality.Text = recNationality!الجنسية
End Sub

أما الدالة التي تقوم بفتح الجدول فهي :
Public Function Open_Table(Table_Name As String, recTemp As Recordset) As Boolean
On Error Resume Next
again:
Err.Clear
Set recTemp = Dbf.OpenRecordset(Table_Name, dbOpenTable)
If Err.Number <> 0 Then
If MsgBox("لا يمكن فتح جدول " & Table_Name & " ." & vbCr & "هل المحاولة من جديد ؟", vbMsgBoxRight + vbMsgBoxRtlReading + vbRetryCancel) = vbRetry Then
GoTo again
End If
Set recTemp = Nothing
End If
Open_Table = (Err.Number = 0)
Err.Clear
On Error GoTo 0
End Function

أما إجراءات التنقل للأزرار الثلاثة الأخرى فهي :
Private Sub cmdPrevious_Click()
If Not Open_Table("الجنسية", recNationality) Then
Exit Sub
End If
With recNationality
.Index = "رقم_الجنسية"
.Seek "=", NationalityNumber
.MovePrevious
If .BOF Then
.MoveFirst
End If
NationalityNumber = !رقم_الجنسية
Call Load_Data
.Close
End With
Set recNationality = Nothing
End Sub

Private Sub cmdNext_Click()
If Not Open_Table("الجنسية", recNationality) Then
Exit Sub
End If
With recNationality
.Index = "رقم_الجنسية"
.Seek "=", NationalityNumber
.MoveNext
If .EOF Then
.MoveLast
End If
NationalityNumber = !رقم_الجنسية
Call Load_Data
.Close
End With
Set recNationality = Nothing
End Sub

Private Sub cmdLast_Click()
If Not Open_Table("الجنسية", recNationality) Then
Exit Sub
End If
With recNationality
.Index = "رقم_الجنسية"
.MoveLast
NationalityNumber = !رقم_الجنسية
Call Load_Data
.Close
End With
Set recNationality = Nothing
End Sub

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ا
هذه مجموعة دروس كنت احتفض بها

وانشالله تستفيدون منها

تحياتي وسوري علي الاطاله


التكمله مرفق في هذا الرد
ا
اشكركم جزيلا
والله يجزاكم كل الخير المعلومات اللي عطيتوني اياها راح تفيدني كثير
خاصة انه الاكتحان بعد العيد مباشرة
وكل هام وانتو بخير
وعساكم من عوادة
X