![]() |
|
استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الثاني - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغات البرمجة الاخرى (http://vb4arb.com/vb/forumdisplay.php?fid=4) +--- قسم : قسم لغة vb6.0 (http://vb4arb.com/vb/forumdisplay.php?fid=18) +---- قسم : قسم مقالات vb6.0 (http://vb4arb.com/vb/forumdisplay.php?fid=29) +---- الموضوع : استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الثاني (/showthread.php?tid=5599) |
استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الثاني - RaggiTech - 14-10-12 كاتب الموضوع : أحمد جمال
بسم الله الرحمن الرحيم .
في هذا الدرس سوف نقوم بإذن الله بمعرفة بعض خصائص هذه الأداة قبل أن نتطرق إلى معرفة كيفية الاضافة ، التعديل والحذف . قبل أن نبدأ ... جرب نقل الملف من مكانه الحالي إلى مكان آخر ... ستلاحظ ظهور رسالة خطأ . هذه الرسالة تفيد بإنه لا يستطيع العثور على مكان قاعدة البيانات . 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 يتبع ... استخدام DataControl للربط مع قواعد البيانات في فيجوال بيسك - الجزء الثاني - RaggiTech - 14-10-12 والآن سوف تظهر لدينا بعض المشاكل :
* كيف ستستدعي الاجراء 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()2 - 7 : حلقة تكرارية تقوم بما يلي : * تحرير السجل الحالي . * تغيير الرقم الخاص به إلى الرقم الحالي في i .
* تحديث السجل . * الانتقال للسجل التالي . 8 - الانتقال مرة أخرى إلى السجل الأول . سوف نضيف هذا الكود بعد عملية الحذف . ومع كل تشغيل للبرنامج ، اضافة إلى أننا سوف نقوم باغلاق التحكم في مربع الترقيم التلقائي عند الاضافة والتعديل . تبقت مشكلة صغيرة حيث أنه من المفترض بعد عملية الاضافة أن نظل في السجل المضاف ، وبعد عملية التعديل في نفس السجل ، وبعد الحذف في السجل التالي أو السابق . لكنك لو لاحظت أن الإجراء الذي قمنا بانشاءه يذهب إلى السجل الأخير ، أو إلى الأول بعد السطر الأخير ... فكيف تستطيع العودة إلى السجل المطلوب . وهذا هو الملف بعد الدرسين السابقين . وهذا هو كل ما لدينا في هذه المرحلة خاص بقواعد البيانات بصورة مباشرة . ولا شك في ان البرنامج يحتوي على كثير من الأخطاء والثغرات ، لكن بالامان تطويره قليلاً ليصبح أفضل من ذلك . والملف موجود في المرفقات ... والله الموفق ... والسلام عليكم ورحمة الله وبركاته . |