الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مثال للترقيم التلقائي بالكود والاستفادة من الأرقام المحذوفة

مغلق
بدأه مصلح الحريصي في 28 أكتوبر 2006 · 9 رد · 3,450 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

نظراً لكثرة الأسئلة عن الترقيم التلقائي ومشاكله من حيث الحذف لبعض السجلات وفقدان تسلسل الأرقام فقد قمت بعمل مثال بسيط على الترقيم التلقائي حيث تم عمل وحدة نمطية عامة على مستوى النموذج وهي :

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

إنها الإجراء

والمثال مرفق وهناك أكواد أخرى في المثال ولكن الذي يهمنا هنا هي الوحدة النمطية السابق

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

- وأي أسئلة تفضلوا وأنا مستعد للرد لأن ما يهمني أن يستفاد من هذا المثال .

Clients.rar

#2

رائع أستاذي ( مصلح ) وكالمعتاد ليس غريب عليك هذا الإبداع .

فقط أقترح أن يكون الكود في زر ( إضافة سجل جديد ) وليس في زر ( حفظ السجل ) .

أتمنى لك دوام التوفيق والرقـــــــي .

تحياتي ..

#3

بوركت يا أبا سارة

#4

الأخ أبو منتظر حياك الله

الأخ فهد

شكراً لك على الملاحظة ولكن لو وضعنا الكود على زر الإضافة فسوف يحدث التالي:

  1. سوف يظاف السجل في الجدول بدون رقم لأن كود الحفظ على زر الحفظ .
  2. لو كان البرنامج على شبكة وتوافق الإدخال من قبل مستخدمين هنا سيصبح الحفظ لأحدهما وتظهر رسالة خطأ للأخار .

هذا ما جعلني أضع الكود على زر الحفظ.

#5

السلام عليكم

جميل جدا أستاذي مصلح وبارك الله فيك

في البداية عندي ملاحظات على الكود الخاص بايجاد الرقم المحذوف

ثم لدي تعليق على الطريقة ككل

بالنسبة للكود فلو انه لم يكن هناك رقم محذوف في الجدول فسيتم المرور على كل السجلات بلا فائدد بجملة for...next

في هذه الحالة يجب قبل عمل for...next التأكد اذا كان هناك فراغ في الرقم وذلك كالأتي

Set rec = CurrentDb.OpenRecordset("select max(ClientNum) As Max_ , count(ClientNum) as Count_ from ClientsTbl")
If rec("Max_") > rec("Count_") Then
   'for

   'next
Else
   Next_ID = rec("Max_") + 1
End If

----------------------------------

اما بانسبة للطريقه فهة جيدة في حاله ان الجدول صغير

ولكنها ليست م جدية في اجداول الكبيرة

جرب اضافة سجلات كثيرة عشرة الاف او مئة ألف

هنالك عدة طرق

تستطيع استخدام جملة ال sql التاليه وهي ستعيد لك اول رقم محذوف ان وجد او أخر رقم+1

select min(ClientNum)+1 as Next_ID from ClientsTbl as top_ClientsTbl
where
(select ClientNum  from ClientsTbl where ClientsTbl.ClientNum=top_ClientsTbl.ClientNum+1)is null

هذه الجمله في حالة ان ClientNum مفهرس

اما اذا لم يكن مفهرس فجرب الجملة التالية

select  top 1 ClientsTbl.ClientNum+1  as Next_ID
from ClientsTbl left join ClientsTbl AS top_ClientsTbl  on
(ClientsTbl.ClientNum =  top_ClientsTbl.ClientNum-1)
where  top_ClientsTbl.ClientNum is  null
order by ClientsTbl.ClientNum

وهناك طريقة أخري وسريعة جدا ولكن تحتاج الى اكواد برمجية

ولكن فكرتها انه تنشئ جدول لارقام ClientNum المحذوفة وعند حذف صف تضيف رقمClientNum الى ذالك الجدول وعندما تريد اضافة صف جديد الى الجدول الأصلي ClientsTbl تحضر first ClientNum من جدول الارقام المحذوفة ثم تحذفه من الجدول واذا كان الجدول فارغا فان next ID سيكون max(clientNum)+1

هذه مجرد اقتراحات

هذا والله اعلم

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#6

أخي العزيز Mo7eb_Alrasool

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

تم تعديل هذه المشاركة بواسطة مصلح الحريصي في 29 أكتوبر 2006 في 02:27

#7

وهذا مثال معدل بعد ملاحظات أخي العزيز Mo7eb_Alrasool

Clients_V1.1.rar

تم تعديل هذه المشاركة بواسطة مصلح الحريصي في 29 أكتوبر 2006 في 09:28

#8

السلام عليكم

الاخوة الكرام - كل عام وانتم بخير

بارك الله فيكم وزادكم علما - دائما الاخ محب الرسول يتحفنا بافكار ممتازة

واعتقد ان رأي الاخ المعلم الفاضل فهد الدوسري بجعل الترقيم مع زر جديد اقتراح ايضا ممتاز

اما بخصوص موضوع المستخدمين والشبكة فقد تم تعديل الملف حيث يقبل جميع تعديلات المستخدمين علي الشبكة

طبعا مجهود فوق الممتاز من الاخ مصلح الحريصي

ارجو تجربة المرفق بحيث بعد الضغط علي جديد وظهور المسلسل الجديد قم بفتح الجدول واجراء اي تعديل مثل كتابة نفس رقم المسلسل

هنا سيتم اعلامك بالخطأ ويتم ايضا تغيير الرقم بالرقم المفروض ان يكون

اخوكم فى الله احمد 2006/10/29

Clients_V1.1.rar

تم تعديل هذه المشاركة بواسطة ahamied في 29 أكتوبر 2006 في 21:34

Microsoft Certified DataBase Administrator MCDBA

#9

السلام عليكم

حياك الله أخوي مصلح وشكرا لك :)

حياك الله أخوي أحمد وبارك الله فيك مشكور كثير :)

وكل عام وأنتم بخير

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#10

الأخ الفاضل ...

هناك موضوع بعنوان ترقيم تلقائى مسلسل واحد عبر عدة جداول فى قواعد بيانات مختلفة: /index.ph...16&t=118581

شكراً

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

هذا الموضوع مغلق.

مواضيع مشابهة