تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الثاني
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .

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


Couldnt find file C:\mydocument\db1.mdb


والسبب أننا حددنا له مساراً معينا ليجد فيه قاعدة البيانات ، وقد تغير هذا المسار كلياً .
من أجل ذلك سوف نستخدم كائن يسمى App وخاصية Path والتي تعطينا المسار الحالي للبرنامج .

سوف نقوم الآن بمسح خاصية DatabaseName لأننا سوف نقوم بضبطها أثناء التشغيل اعتماداً على مسار البرنامج .
في حدث Form_Load سوف نقوم بضبط هذه الخاصية بالشكل التالي :


Data1.DatabaseName = App.path & "/db1.mdb
"



خاصية


RecordCount :

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

جرب أمراً بهذا الشكل :





MsgBox Data1.Recordset.RecordCount




خاصية


ReadOnly :

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

فمثلاً أمر بالشكل التالي سيجعل قاعدة البيانات للقراءة فقط - غير قابل للتعديل ، الاضافة ، الحذف - .





Data1.ReadOnly = True




خاصية


Fields :

تعطينا هذه الخاصية قيمة حقل معين في المكان الحالي .

فمثلاً الأمر التالي سوف يعطينا قيمة الاسم في الحقل الحالي :





MsgBox Data1.Recordset.Fields("fname


")



والآن سوف نعرف اجراءُ جديداً Sub ونطلق عليه State -



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



اقتباس:
[TABLE="width: 100%"]
[TR]
[TD="class: alt2"]
[b]الإجراءات .[/b]


لنفترض أن لدينا برنامج يحتوي على ثلاثة أزرار تقوم بعرض قائمة المواقع ، الرسائل ، اسم مبرمج البرنامج ، ولكن قبل كل منها يتم رسم المربع الذي يتم عرض النص فيه ، ولنفرض ان الرسم يتم بالكود التالي :




code line 1

code line 2

code line 3
code line 4








بهذا يصبح أمر الزر الأول :




code line 1

code line 2

code line 3
code line 4
code for Show Site List







والثاني :




code line 1

code line 2

code line 3
code line 4
code for Show Message List







وهكذا الثالث ...

لكن لو عرفنا اجراءً وسميناه




Drow بالشكل التالي :



Private Sub Drow


()


code line 1

code line 2

code line 3
code line 4
End Sub







فبهذا يمكن أن يكون أمر الزر الأول




Drow

code for Show Site List






والثاني :




Drow

code for Show Message List






هذه إحدى فوائد الاجراءات ، وتسمى


Sub أو Procedure ، هناك نوع شبيه آخر وهو Function ويختلف عنه في أنه يعود بقيمة ، وفي بعض لغات البرمجة لا يتواجد القسم الأول بصورة مستقلة بل تكون جميعها عبارة عن Function ولكن مع اختلاف نوعية البيانات التي يمكن اعادتها أو عدم اعادة بيانات أصلاً ، لمزيد من التوسع يمكنك مراجعة الكتاب الخاص بالأستاذ تركي العسيري .

[/TD]
[/TR]
[/TABLE]



والآن عودة إلى البرنامج مرة أخرى .

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





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


Form1.Caption .

الإنطلاق : من المنطقي أن ينطلق ( يحدث ) هذا الحدث عند بداية البرنامج وعند أي تغير في السجلات باستخدام أحد أزرار التنقل .



إذن سوف نقوم بكتابة الحدث ، وسيكون بالشكل التالي :




Sub State


()

Dim a, b

a = Data1.Recordset.RecordCount

b = Data1.Recordset.Fields("number





")


Form1.Caption = "Record " & b & " Of " & a

End Sub






وسوف نستدعيه مع كل عملية تنقل ، فمثلاً يصبح الانتقال للتالي :




Data1.Recordset.MoveNext

If Data1.Recordset.EOF Then Data1.Recordset.MoveLast

State







يتبع ...
}}}
تم الشكر بواسطة:
#2
والآن سوف تظهر لدينا بعض المشاكل :
* كيف ستستدعي الاجراء

Call Sub الخاص بالعدد عند تشغيل البرنامج ، جرب كتابة الأمر في حدث Form_Load ولاحظ ظهور رسالة الخطأ .

* إذا اهتديت إلى الطريقة ... لاحظ أنه في المرة الأولى - فقط - سوف يعطيك


Record 1 Of 1 .

* لو حذفت سجل 3 مثلاً فهذا يعني أن الأرقام ستصبح 1 2 4 5 6 7 8 ، وسيعطيك الفورم في آخر سجل


Record 8 Of 7 .

لماذا ؟ لانه يقرأ القيم الموجودة في قاعدة البيانات بغض النظر عن مكانها الفعلي .


بالنسبة لمشكلة عدم عمل الكود الخاص بعرض عدد السجلات في حدث Form_Load فهذا طبيعي ، ذلك أننا سوف نضع الكود بمجرد تحميل الفورم وقبل انشاء كائن Data1 ... لذا سوف نستعيض عنه بحدث Form_Initialize ... ليصبح الكود بالشكل التالي :


Private Sub Form_Initialize


()

State
End Sub


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


Private Sub Form_Initialize


()

Data1.Recordset.MoveLast
Data1.Recordset.MoveFirst
State
End Sub


أما المشكلة الأخيرة فسوف نتعرف على حل لها لاحقاً .


والآن لننتقل إلى الاضافة ، وتعديل محتويات سجل ، اضافة إلى حذف سجل .

إن من عيوب أداة


DataControl هو أنها - على الرغم من سهولتها - إلا أنها أقل في التحكم الذي تمنحه لمبرمج البرنامج .


إذا كنت قد تصفحت وظائف وخصائص RecordSet في أداة DataControl لكنت قد وجدت وظيفة واضحة جداً هي AddNew .
كل ما عليك هو كتابة أمر بهذا الشكل :

Data1.Recordset.AddNew


جرب عمل زر بهذا الشكل ، سوف ينتهي الأمر مباشرة .

بعد الضغط على زر ( New ) سوف تفرغ لك الحقول ، اضف ما تريد ثم انقر أي من أزرار التنقل ... انتقل إلى السجل الأخير وستجد سجلك موجوداً .
هذه الطريقة ليست عملية ، ولكنها أسهل طريقة للاضافة .
وتذكر أن هناك العديد من الحلول لتحسين عمل DataControl أسهل هذه الحلول وأقواها هو عدم استخدامها ، وتركها إلى غيرها من الطرق الأخرى .
ولقد أحببت أن أبدأ بها لأنها بسيطة جداً وجيدة لتوضيح بعض المفاهيم .


التعديل :
كل ما عليك هو التعديل في السجل الحالي ، ومن ثم الضغط على زر ( Update ) والذي سوف تضع فيه الأمر التالي :

Data1.Recordset.Update



الحذف :
نضع أولاً في زر الحذف الأمر التالي :

Data1.Recordset.Delete


لا تنس بعد عملية الحذف أن تتنقل إلى السجل التالي كيلا تبقى في سجل فارغ

Data1.Recordset.Delete
Data1.Recordset.MoveNext
If Data1.Recordset.EOF Then Data1.Recordset.MoveLast
State


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

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

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


لنعد الآن إلى مكونات هذا الإجراء :
سوف نقوم بالدوران على كافة السجلات لاعطائها رقماً تسلسلياً صحيحاً ... تذكر ما يلي :
recordcount


: تعطينا عدد السجلات .

Fields("index


") : خاصية تحتوي على قيمة الحقل في السجل الحالي .


والآن لنر هذا الأمر :





كود :
[align=left]Sub Order()
If Data1.Recordset.RecordCount <> 0 Then Data1.Recordset.MoveFirst
For I = 0 To Data1.Recordset.RecordCount - 1
Data1.Recordset.Edit
Data1.Recordset.Fields("NUMBER") = I + 1
Data1.Recordset.Update
Data1.Recordset.MoveNext
Next I
If Data1.Recordset.RecordCount <> 0 Then Data1.Recordset.MoveFirst
End Sub[/align]
1- يتأكد الأجراء من وجود بيانات في قاعدة البيانات ، ومن ثم ينتقل إلى السجل الأول .
2 - 7 : حلقة تكرارية تقوم بما يلي :
* تحرير السجل الحالي .
* تغيير الرقم الخاص به إلى الرقم الحالي في


i .

* تحديث السجل .
* الانتقال للسجل التالي .
8 - الانتقال مرة أخرى إلى السجل الأول .


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

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

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


والملف موجود في المرفقات ...


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



الملفات المرفقة
.zip   our prog.zip (الحجم : 10.55 ك ب / التحميلات : 125)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  طريقة لمعرفة عدد السجلات في قاعدة البيانات princeofislam 2 2,665 18-01-24, 11:34 AM
آخر رد: علي جابر
  طريقة تشغيل فيجوال بيسك6 على وندوز7 ahmed3d 6 5,579 05-12-22, 06:49 AM
آخر رد: Ergheegh2022
  كيفية التعامل مع دوال الوقت و التاريخ و كيفية تنسيقهما فى الفجوال بيسك 6 the viper 9 11,261 22-11-18, 01:13 PM
آخر رد: next
  طلب شرح اخذ نسخة احتياطية من قاعدة البيانات DIGTAL 2 4,514 31-07-13, 03:14 AM
آخر رد: طارق بيتا
  شرح للمتغيرات و الثوابت و المعاملات في الفيجول بيسك Ahmad Jawad 5 63,212 12-06-13, 01:14 AM
آخر رد: بلحسين الدين
  طريقة استخدام الاداه actskin بالتفصيل Ahmad Jawad 3 4,433 03-12-12, 07:54 PM
آخر رد: الميسري
  استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الأول RaggiTech 0 3,823 14-10-12, 02:26 PM
آخر رد: RaggiTech
  استخدام أداة التقارير DataReport من خلال الفيجوال بيسك 6.0 RaggiTech 0 7,999 14-10-12, 02:21 PM
آخر رد: RaggiTech
  درس سريع - اللغة العربية في فيجوال بيسك RaggiTech 0 4,590 14-10-12, 02:19 PM
آخر رد: RaggiTech
  فيجوال بيسك - التعامل مع قاعدة بيانات أكسيس من خلال Dao - الجزء الثالث والرابع RaggiTech 1 5,762 14-10-12, 02:11 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم