نظراً لكثرة الأسئلة عن الترقيم التلقائي ومشاكله من حيث الحذف لبعض السجلات وفقدان تسلسل الأرقام فقد قمت بعمل مثال بسيط على الترقيم التلقائي حيث تم عمل وحدة نمطية عامة على مستوى النموذج وهي :
Private Sub MyOutoNum()
On Error GoTo Err
Static Counter As Integer
Dim ValMax As Integer
Dim R As Variant
Dim I As Integer
ValMax = DMax("[ClientNum]", "ClientsTbl")
For I = 1 To ValMax
Counter = Val(Counter) + 1
R = DLookup("[ClientNum]", "ClientsTbl", "ClientNum =" & Counter & "")
If IsNull(R) Then
Me.TxtClientNum = Val(Counter)
Exit For
Else
Me.TxtClientNum = Val(Counter) + 1
End If
Next I
Err:
If Err.Number = 94 Then Me.TxtClientNum = 1
End Subهذا الكود مهمته البحث عن الأرقام المفقودة في الجدول وعندما العثور على أول رقم مفقود يقوم بإضافة السجل الجديد بهذا الرقم وإذا لم يجد أي رقم مفقود فأن الكود يضيف للسجل رقم جديد.
مميزات الكود:
عمل ترقيم تلقائي لكل سجل جديد.
يختلف عن الترقيم التلقائي في الأكسيس بأنه يبحث أولاً عن أي سجل محذوف ويأخذ أول رقم سجل محذوف ويضعه للسجل الجديد.
عيوب الكود:
قد يكون بطيء بعض الشيء في البيانات التي يصل عدد سجلاتها لمئات الألوف حيث يقوم بدورة كاملة على جميع السجلات للتأكد بأن أرقامها متسلسلة ولم يفقد منها أي رقم.
نأتي لشرح الكود:
السطر
On Error GoTo Err
خاص بمعالجة الأخطاء ومن ضمن تلك الأخطاء في حال إضافة سجل جديد وهو أول سجل في الجدول فسوف يظهر خطأ لعدم وجود بيانات في الجدول ولذلك تم معالجة ذلك الخطأ بواسطة معالجة الأخطاء.
السطر :
Static Counter As Integer
إعلان عن متغير من نوع استاتيكي لتخزين فيه رقم مسلسل مرتب من 1 إلى أكبر قيمة في رقم العميل في الجدول لأنه سيتم بواسطة قيم هذا المتغير مقارنة السجلات للبحث عن السجلات المفقودة.
السطر:
Dim ValMax As Integer
إعلان عن متغير يتم فيه تخزين أكبر قيمة في حقل رقم العميل لأننا سنستخدم قيمة هذا المتغير في أمرين الأول في الحلقة التكرارية والثاني في ترقيم السجلات حال عدم وجود سجل محذوف في الجدول.
السطر :
Dim R As Variant
متغير نخزن فيه القيم المعادة بواسطة الدالة Dlookup حيث نبحث في الجدول عن الرقم المطابق للرقم الموجود في المتغير الاستاتيكي المسمى Counter لأننا سنستخدم المتغير R حيث سنجري عليه أختبار بأنه إذا كانت قيمته Null فهذا يعني أننا وجدنا رقم مسلسل لسجل محذوف.
السطر:
Dim I As Integer
متغير وهو خاص بالتكرار وبعض المبرمجين لا يعرفون متغيرات لل ( I ) في اللوب أو التكرار ولكن أرى أنه من الأفضل تعريفها فربما يحصل خطأ غير متوقع ونحن في غنا عن الأخطأ.
السطر 1:
ValMax = DMax("[ClientNum]", "ClientsTblأخذنا أعلى قيمة لرقم العميل في الجدول وقمنا بتخزينها في المتغير ValMax
السطر 2 :
For I = 1 To ValMax
اللوب أو التكرار من رقم 1 إلى قيمة ValMax وهي أعلى قيمة لرقم العميل في الجدول والهدف المرور على كل السجلات بحثاً عن أي رقم محذوف.
السطر 3:
Counter = Val(Counter) + 1
العداد وهو يبدأ من رقم واحد إلى أن يصل مجموع السجلات في الجدول.
السطر 4:
R = DLookup("[ClientNum]", "ClientsTbl", "ClientNum =" & Counter & "")نقوم بالبحث عن رقم العميل المطابق لما هو مخزن في المتغير Counter وفي حال وجود قيمة للمتغير Counter والمتغير R يحتوي على Null فهذا يعني أننا وصلنا لأول رقم محذوف.
السطر 5:
If IsNull(R) Then
من السطر 4 نقوم بعملية شرطية في السطر 5 بأنه إذا كان المتغير R يحتوي على Null فهذا يعني وجود رقم مفقود أي محذوف ونريد أن نستخدم ذلك الرقم للسجل الحالي.
السطر 6 :
Me.TxtClientNum = Val(Counter)
السطر 6 في حال كون المتغير R يحتوي على Null فهذا يعني وجود رقم محذوف ويقوم المتغير Counter بتخزين ذلك الرقم ولذلك سوف نأخذ قيمة المتغير Counter ونضعها في مربع النص المسمى TxtClientNum لأنه الخاص برقم العميل عند إدخال البيانات.
السطر 7 :
Exit For
ما دام أننا وجدنا رقم محذوف سنأخذه ثم نخرج من اللوب ( التكرار ) بواسطة السطر رقم 7
السطر 8 :
Else
ما عدى ذلك أي أن المتغير R لا يحتوي على Null فنواصل في اللوب لفحص بقية السجلات.
السطر 9 :
Me.TxtClientNum = Val(Counter) + 1
في كل دورة للوب ( التكرار ) نخزن في مربع النص الخاص بإدخال رقم العميل قيمة المتغير Counter زائد 1
السطر 10 :
End If
جملة إنها الشرط.
السطر 11 :
Next I
جملة التكرار أي كرر العملية السابقة إلى أن نجد رقم محذوف أو نصل إلى أعلى قيمة لرقم العميل في الجدول.
السطر12 :
Err:
نبدأ في معالجة الخطأ الذي يحدث إذا لم يحتوي الجدول على سجلات.
السطر 13 :
If Err.Number = 94 Then Me.TxtClientNum = 1
إذا لا يوجد سجلات في الجدول سيحدث خطأ يحتوي على الرقم 94 وهنا نعالج الخطأ بموجب رقمه فإذا كان ذلك الخطأ رقمه 94 فهذا يعني أن الجدول لا يحتوي على سجلات ومن البديهي أن يحمل أول سجل الرقم 1.
السطر 14 :
End Sub
إنها الإجراء
والمثال مرفق وهناك أكواد أخرى في المثال ولكن الذي يهمنا هنا هي الوحدة النمطية السابق
- الرجاء من الجميع تجربة البرنامج لأنني لم أجربه بالشكل الكافي وإبداء الملاحظات سواء صغيرة أو كبيرة دون أي ترد حتى يتم التعديل فيه لنصل إلى ترقيم نكون راضين عنه جميعاً.
- وأي أسئلة تفضلوا وأنا مستعد للرد لأن ما يهمني أن يستفاد من هذا المثال .