والآن سوف تظهر لدينا بعض المشاكل :
* كيف ستستدعي الاجراء
* كيف ستستدعي الاجراء
Call Sub الخاص بالعدد عند تشغيل البرنامج ، جرب كتابة الأمر في حدث Form_Load ولاحظ ظهور رسالة الخطأ .
* إذا اهتديت إلى الطريقة ... لاحظ أنه في المرة الأولى - فقط - سوف يعطيك
* إذا اهتديت إلى الطريقة ... لاحظ أنه في المرة الأولى - فقط - سوف يعطيك
Record 1 Of 1 .
* لو حذفت سجل 3 مثلاً فهذا يعني أن الأرقام ستصبح 1 2 4 5 6 7 8 ، وسيعطيك الفورم في آخر سجل
* لو حذفت سجل 3 مثلاً فهذا يعني أن الأرقام ستصبح 1 2 4 5 6 7 8 ، وسيعطيك الفورم في آخر سجل
Record 8 Of 7 .
لماذا ؟ لانه يقرأ القيم الموجودة في قاعدة البيانات بغض النظر عن مكانها الفعلي .
بالنسبة لمشكلة عدم عمل الكود الخاص بعرض عدد السجلات في حدث Form_Load فهذا طبيعي ، ذلك أننا سوف نضع الكود بمجرد تحميل الفورم وقبل انشاء كائن Data1 ... لذا سوف نستعيض عنه بحدث Form_Initialize ... ليصبح الكود بالشكل التالي :
Private Sub Form_Initialize
لماذا ؟ لانه يقرأ القيم الموجودة في قاعدة البيانات بغض النظر عن مكانها الفعلي .
بالنسبة لمشكلة عدم عمل الكود الخاص بعرض عدد السجلات في حدث Form_Load فهذا طبيعي ، ذلك أننا سوف نضع الكود بمجرد تحميل الفورم وقبل انشاء كائن Data1 ... لذا سوف نستعيض عنه بحدث Form_Initialize ... ليصبح الكود بالشكل التالي :
Private Sub Form_Initialize
()
State
End Sub
المشكلة الأخرى الخاصة بعدم عمل الكود منذ المرة الأولى ، ذلك أن قاعدة البيانات غير منشطة ... الحل يكمن في تنشيط قاعدة البيانات بمجرد انشاءها بالتنقل عبر سجلاتها ، فيصبح الأمر السابق بالشكل التالي :
Private Sub Form_Initialize
State
End Sub
المشكلة الأخرى الخاصة بعدم عمل الكود منذ المرة الأولى ، ذلك أن قاعدة البيانات غير منشطة ... الحل يكمن في تنشيط قاعدة البيانات بمجرد انشاءها بالتنقل عبر سجلاتها ، فيصبح الأمر السابق بالشكل التالي :
Private Sub Form_Initialize
()
Data1.Recordset.MoveLast
Data1.Recordset.MoveFirst
State
End Sub
أما المشكلة الأخيرة فسوف نتعرف على حل لها لاحقاً .
والآن لننتقل إلى الاضافة ، وتعديل محتويات سجل ، اضافة إلى حذف سجل .
إن من عيوب أداة
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
إذا كنت قد تصفحت وظائف وخصائص 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
Fields("index
") : خاصية تحتوي على قيمة الحقل في السجل الحالي .
والآن لنر هذا الأمر :
1- يتأكد الأجراء من وجود بيانات في قاعدة البيانات ، ومن ثم ينتقل إلى السجل الأول .
2 - 7 : حلقة تكرارية تقوم بما يلي :
* تحرير السجل الحالي .
* تغيير الرقم الخاص به إلى الرقم الحالي في
والآن لنر هذا الأمر :
كود :
[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]2 - 7 : حلقة تكرارية تقوم بما يلي :
* تحرير السجل الحالي .
* تغيير الرقم الخاص به إلى الرقم الحالي في
i .
* تحديث السجل .
* الانتقال للسجل التالي .
8 - الانتقال مرة أخرى إلى السجل الأول .
سوف نضيف هذا الكود بعد عملية الحذف . ومع كل تشغيل للبرنامج ، اضافة إلى أننا سوف نقوم باغلاق التحكم في مربع الترقيم التلقائي عند الاضافة والتعديل .
تبقت مشكلة صغيرة حيث أنه من المفترض بعد عملية الاضافة أن نظل في السجل المضاف ، وبعد عملية التعديل في نفس السجل ، وبعد الحذف في السجل التالي أو السابق .
لكنك لو لاحظت أن الإجراء الذي قمنا بانشاءه يذهب إلى السجل الأخير ، أو إلى الأول بعد السطر الأخير ... فكيف تستطيع العودة إلى السجل المطلوب .
وهذا هو الملف بعد الدرسين السابقين . وهذا هو كل ما لدينا في هذه المرحلة خاص بقواعد البيانات بصورة مباشرة . ولا شك في ان البرنامج يحتوي على كثير من الأخطاء والثغرات ، لكن بالامان تطويره قليلاً ليصبح أفضل من ذلك .
والملف موجود في المرفقات ...
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
* تحديث السجل .
* الانتقال للسجل التالي .
8 - الانتقال مرة أخرى إلى السجل الأول .
سوف نضيف هذا الكود بعد عملية الحذف . ومع كل تشغيل للبرنامج ، اضافة إلى أننا سوف نقوم باغلاق التحكم في مربع الترقيم التلقائي عند الاضافة والتعديل .
تبقت مشكلة صغيرة حيث أنه من المفترض بعد عملية الاضافة أن نظل في السجل المضاف ، وبعد عملية التعديل في نفس السجل ، وبعد الحذف في السجل التالي أو السابق .
لكنك لو لاحظت أن الإجراء الذي قمنا بانشاءه يذهب إلى السجل الأخير ، أو إلى الأول بعد السطر الأخير ... فكيف تستطيع العودة إلى السجل المطلوب .
وهذا هو الملف بعد الدرسين السابقين . وهذا هو كل ما لدينا في هذه المرحلة خاص بقواعد البيانات بصورة مباشرة . ولا شك في ان البرنامج يحتوي على كثير من الأخطاء والثغرات ، لكن بالامان تطويره قليلاً ليصبح أفضل من ذلك .
والملف موجود في المرفقات ...
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
