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

هل يمكن عمل ترقيم تلقائي يبدا بحرف

بدأه sabic7 في 25 مايو 2011 · 9 رد · 2,135 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

هل يمكن عمل ترقيم تلقائي يبدا بحرف a من 1 الى 99

ثم حرف b من 1 الى 99

ثم حرف c من 1 الى 99

وشكرا لكم

#2

يمكنك استخدام هذه الدالة

ضع الدالة فى وحدة نمطية أو فى النموذج

Public Function Get_serial_number(tablename As String, serial_fldname As String) As String

Dim idval As Integer, stralpa As String

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Left(" & serial_fldname & ",1) AS alpa, Right(" & serial_fldname & _
",Len(" & serial_fldname & ")-1) AS Numval, " & tablename & "." & serial_fldname & " FROM " & tablename & _
" ORDER BY Left(" & serial_fldname & ",1), Right(" & serial_fldname & ",Len(" & serial_fldname & ")-1);")

If rs.RecordCount > 0 Then
rs.MoveLast
idval = IIf(rs!numval = 99, 1, rs!numval + 1)

Select Case rs!alpa
Case Is = "A"
If rs!numval = 99 Then stralpa = "B" Else stralpa = "A"
Case Is = "B"
If rs!numval = 99 Then stralpa = "C" Else stralpa = "B"
Case Is = "C"
If rs!numval = 99 Then stralpa = "D" Else stralpa = "C"
End Select

Else
idval = 1
stralpa = "A"
End If
Get_serial_number = IIf(stralpa & idval = "D1", "C99", stralpa & idval)

rs.Close
Set rs = Nothing

End Function

و للتطبيق

ضع هذا الكود لاستدعاء الدالة فى القيمة الافتراضية لمربع النص فى النموذج

=Get_serial_number("tab";"serial")

حيث tab هو اسم الجدول

و serial هو اسم حقل الترقيم بالجدول ( ملحوظة يجب ان يكون نوع البيانات فى هذا الحقل نص )

تم تعديل هذه المشاركة بواسطة Abo_Yossof في 26 مايو 2011 في 02:00

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#3

السلام عليكم

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

إليكم هذا المثال ويحتوي على اسلوبين .... AlphaNumricSqn.zip

-- الأسلوب الأول

--- قمت بعمل جدول يعتمد على الترقيم التلقائي، وجعلته يبدأ من الرقم 6501 .. طبعا الرقم 65 في ASCII هو المقابل للحرف A في البجدية.

--- قمت بقلب هذه القيمة إلى الأبجدية باستخدام الدالة CHR لتعطي الحرف المقابل وهو هنا A ..

--- جربوا إدخال البيانات عن طريق الجدول1 وعن طريق الاستعلام لتلاحظوا الفرق.

--- طبعا يمكن ضبط بداية التعداد ونهايته عن طرق الفحص؛ ومن ثم إعادة استخدام النمط... لكن يتوجب ترحيل البيانات عند نهاية كل تعداد.

-- الأسلوب الثاني

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

--- في هذه الشفرة تم ضبط بداية ونهاية التعداد.

--- في هذه الشفرة تم استبعاد القيمة التي تبدأ باصفار مثل A00 B00 C00 .. وهكذا

أتمنى ان يحوز هذا العمل على استحسانكم

#4

الاخ ابو يوسف جزاك الله خير

حل موفق

ولكن الترقيم يقف عند a10 ويبدا بالتكرار

فهل من تعدب

#5
القحم كتب:

السلام عليكم

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

إليكم هذا المثال ويحتوي على اسلوبين .... AlphaNumricSqn.zip

-- الأسلوب الأول

--- قمت بعمل جدول يعتمد على الترقيم التلقائي، وجعلته يبدأ من الرقم 6501 .. طبعا الرقم 65 في ASCII هو المقابل للحرف A في البجدية.

--- قمت بقلب هذه القيمة إلى الأبجدية باستخدام الدالة CHR لتعطي الحرف المقابل وهو هنا A ..

--- جربوا إدخال البيانات عن طريق الجدول1 وعن طريق الاستعلام لتلاحظوا الفرق.

--- طبعا يمكن ضبط بداية التعداد ونهايته عن طرق الفحص؛ ومن ثم إعادة استخدام النمط... لكن يتوجب ترحيل البيانات عند نهاية كل تعداد.

-- الأسلوب الثاني

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

--- في هذه الشفرة تم ضبط بداية ونهاية التعداد.

--- في هذه الشفرة تم استبعاد القيمة التي تبدأ باصفار مثل A00 B00 C00 .. وهكذا

أتمنى ان يحوز هذا العمل على استحسانكم

الاخ الفاضل القحم

جزاك الله خير

بس للاسف لم يعمل معي الملف

بمجرد فتح النموذج تظهر الصورة التالية بالمرفق

post-245641-034013200 1306429022_thumb.j

المرفقات
a.JPG
#6
sabic7 كتب:

الاخ ابو يوسف جزاك الله خير

حل موفق

ولكن الترقيم يقف عند a10 ويبدا بالتكرار

فهل من تعدب

ملاحظتك صحيحة أخى

اذا كنت تريد ان يكون الترقيم على النحو A1 A2 A3 ..........A9 A10

استبدل هذا الجزء فى الدالة

Set rs = CurrentDb.OpenRecordset("SELECT Left(" & serial_fldname & ",1) AS alpa, Right(" & serial_fldname & _
",Len(" & serial_fldname & ")-1) AS Numval, " & tablename & "." & serial_fldname & " FROM " & tablename & _
" ORDER BY Left(" & serial_fldname & ",1), Right(" & serial_fldname & ",Len(" & serial_fldname & ")-1);")

بهذا

Set rs = CurrentDb.OpenRecordset("SELECT Left(" & serial_fldname & ",1) AS alpa, VAL(Right(" & serial_fldname & _
",Len(" & serial_fldname & ")-1)) AS Numval, " & tablename & "." & serial_fldname & " FROM " & tablename & _
" ORDER BY Left(" & serial_fldname & ",1), VAL(Right(" & serial_fldname & ",Len(" & serial_fldname & ")-1));")

اما اذا كنت تريد ان يكون الترقيم على النحو A01 A02 A03 ..........A09 A10

فالامر سيكون أسهل و لن نحتاج الى تكوين مجموعة السجلات

و يمكن للدالة ان تكون على النحو التالى

Public Function Get_serial_number(tablename As String, serial_fldname As String) As String

Dim idval As String, stralpa As String
idval = Nz(DMax(serial_fldname, tablename))

If idval <> "" Then
idval = Right(idval, 2)
Select Case Left(DMax(serial_fldname, tablename), 1)
Case Is = "A"
If idval = 99 Then stralpa = "B" Else stralpa = "A"
Case Is = "B"
If idval = 99 Then stralpa = "C" Else stralpa = "B"
Case Is = "C"
If idval = 99 Then stralpa = "D" Else stralpa = "C"
End Select
idval = IIf(idval = 99, "01", Val(Right(idval, 2)) + 1)
Else
idval = "01"
stralpa = "A"
End If
Get_serial_number = stralpa & IIf(Len(idval) = 1, "0" & idval, idval)
Get_serial_number = IIf(Get_serial_number = "D01", "C99", Get_serial_number)

End Function

بالنسبة لمرفق الاخ القحم

فالمشكلة ان هناك مرجع مفقود ادخل الى قائمة المراجع و الغى اختيار هذا المرجع

تم تعديل هذه المشاركة بواسطة Abo_Yossof في 27 مايو 2011 في 02:44

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#7
القحم كتب:

السلام عليكم

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

إليكم هذا المثال ويحتوي على اسلوبين .... AlphaNumricSqn.zip

-- الأسلوب الأول

--- قمت بعمل جدول يعتمد على الترقيم التلقائي، وجعلته يبدأ من الرقم 6501 .. طبعا الرقم 65 في ASCII هو المقابل للحرف A في البجدية.

--- قمت بقلب هذه القيمة إلى الأبجدية باستخدام الدالة CHR لتعطي الحرف المقابل وهو هنا A ..

--- جربوا إدخال البيانات عن طريق الجدول1 وعن طريق الاستعلام لتلاحظوا الفرق.

--- طبعا يمكن ضبط بداية التعداد ونهايته عن طرق الفحص؛ ومن ثم إعادة استخدام النمط... لكن يتوجب ترحيل البيانات عند نهاية كل تعداد.

-- الأسلوب الثاني

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

--- في هذه الشفرة تم ضبط بداية ونهاية التعداد.

--- في هذه الشفرة تم استبعاد القيمة التي تبدأ باصفار مثل A00 B00 C00 .. وهكذا

أتمنى ان يحوز هذا العمل على استحسانكم

فكرة جيدة أخى

و لكن انت تفحص الرقم الاخير فقط اذا كان يساوى 9 يضيف رقمين هذا سيؤدى الى اخطاء فى الارقام 19 29 39 و هكذا

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

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#8
sabic7 كتب:

الاخ الفاضل القحم

جزاك الله خير

بس للاسف لم يعمل معي الملف

بمجرد فتح النموذج تظهر الصورة التالية بالمرفق

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

Abo_Yossof كتب:

فكرة جيدة أخى

و لكن انت تفحص الرقم الاخير فقط اذا كان يساوى 9 يضيف رقمين هذا سيؤدى الى اخطاء فى الارقام 19 29 39 و هكذا

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

شكرا لك أستاذي على هذه الملاحظة... وهذا هو المرفق بعد التعديل

AlphaNumricSqn.zip

#9

الاخ Abo_Yossof

الاخ القحم

جزاك الله كل خير ورفع قدرك وزادك علما وحفظك الله من كل مكروه

تم تعديل هذه المشاركة بواسطة sabic7 في 27 مايو 2011 في 13:00

#10

الاخ العزيز اليك شيت اكسيل به عدة دوال row index match &

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

او ارسلى ميل على mzagange2000@yahoo.com

Worksheet.rar

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