اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

السلام عليكم و رحمة الله و بركاته

طلبت سابقا من يعينني في العداد للفواتير والتي يبدا من رقم واحد كل بداية سنة جديدة و مشكور جدا لمن تدخل و اعاني

الان وجدت مشكلة التي تتمثل في ان العداد لما يصل الى رقم 2025000099 من المفروض في الفاتورة التي تاتي بعدها يصير 2025000100 لكن تخرج نافذة خطا

سارفق صور حتى تتضح المشكلة

لطلب المساعدة لحل هذا الاشكال و لكم الشكر

Problem_1.png

Problem_2.png

Problem_3.png

Module numero date.doc

قام بنشر (معدل)

 المشكلة واضحة تمامًا: الخطأ "Overflow" يحدث لأن الرقم 2025000100 يتجاوز الحد الأقصى لنوع البيانات Long في VBA، والذي هو:

(Long∈[−2,147,483,648 إلى 2,147,483,647])

لكن الرقم الذي تحاول توليده هو عشرة أرقام، أي يتجاوز هذا الحد.

 

الحل المقترح: استخدام Double بدلًا من Long

غير نوع الإرجاع والمتغيرات من Long إلى Double لتسمح بالأرقام الأكبر:

Public Function GenerateID(TableName As String, fieldName As String) As Double
    Dim currentYear As Integer
    Dim yearPrefix As String
    Dim maxID As Double
    Dim serialPart As Long
    currentYear = Year(Date)
    yearPrefix = CStr(currentYear)
    maxID = Nz(DMax(fieldName, TableName, fieldName & " LIKE '" & yearPrefix & "*'"), yearPrefix & "00")
    serialPart = CLng(Mid(CStr(maxID), Len(yearPrefix) + 1))
    GenerateID = CDbl(yearPrefix & Format(serialPart + 1, "0000"))
End Function

ملاحظات إضافية:

  • استخدمت Format(..., "0000") لضمان أن الجزء التسلسلي يبقى دائمًا بأربعة أرقام.

  • تأكد أن الحقل في الجدول (fieldName) من نوع Double أو Text وليس Long.

  • إذا كنت تستخدم هذا الرقم كمفتاح أساسي (Primary Key)، ففكر في استخدام Text بدلًا من رقم لتجنب مشاكل مستقبلية.

هل تحب أن نضيف تحققًا إضافيًا لتفادي التكرار أو نربط هذا التوليد بحدث معين في النموذج؟
تم تعديل بواسطه kkhalifa1960
قام بنشر

جرب يا حافظ على دالتك الاصلية نقص صفر من التنسيق في هذا السطر  ليصبح 3 اصفار

GenerateID = CLng(yearPrefix & "000" & (serialPart + 1))

 

قام بنشر
Public Function GenerateID(TableName As String, fieldName As String) As Long
    Dim currentYear As Integer
    Dim yearPrefix As String
    Dim maxID As Long
    Dim serialPart As Long
    currentYear = Year(Date)
    yearPrefix = currentYear & ""
    maxID = Nz(DMax(fieldName, TableName, fieldName & " LIKE '" & yearPrefix & "*'"), yearPrefix & "00")
    serialPart = CLng(Mid(maxID, Len(yearPrefix) + 1))
    GenerateID = CLng(yearPrefix & "000" & (serialPart + 1))
End Function

هذه تعمل

قام بنشر
7 دقائق مضت, ابوخليل said:

جرب يا حافظ على دالتك الاصلية نقص صفر من التنسيق في هذا السطر  ليصبح 3 اصفار

GenerateID = CLng(yearPrefix & "000" & (serialPart + 1))

 

ماهو الفرق بين اربعة اصفار او ثلاثة اصفار 

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

 

قام بنشر
1 دقيقه مضت, حافظ التونسي said:

ماهو الفرق بين اربعة اصفار او ثلاثة اصفار 

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

 

المفروض تفيدنا اولا هل عملت معك ام لا ؟

والفرق الذي تسأل عنه هو انك تجاوزت نطاق العدد بعد السنة 

كأقصى رقم ثم يظهر خطأ هو  6 تسعات  999999

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

قام بنشر
2 دقائق مضت, ابوخليل said:
Public Function GenerateID(TableName As String, fieldName As String) As Long
    Dim currentYear As Integer
    Dim yearPrefix As String
    Dim maxID As Long
    Dim serialPart As Long
    currentYear = Year(Date)
    yearPrefix = currentYear & ""
    maxID = Nz(DMax(fieldName, TableName, fieldName & " LIKE '" & yearPrefix & "*'"), yearPrefix & "00")
    serialPart = CLng(Mid(maxID, Len(yearPrefix) + 1))
    GenerateID = CLng(yearPrefix & "000" & (serialPart + 1))
End Function

هذه تعمل

شكرا 

نجحت المحاولة لكن يبقى كم عدد يصل كل ينة كاقصى رقم لان الارقام تبدا كل بداية سنة جديدية ب 2026000001 فهل تصل الى 20260099999؟

قام بنشر

الافضل لك ان تزيل التنسيق ليصبح السطر هكذا

GenerateID = CLng(yearPrefix & (serialPart + 1))

جرب لن تخسر شيئا

ولكن الرقم سيكون عاديا بدون اصفار وسيتزايد مثله مثل الارقام العادية .. وفي السنة الجديدة يبدأ بواحد بعد السنة

قام بنشر
7 دقائق مضت, ابوخليل said:

من المثال المرفق تبين لي ان الدالة من عمل @Foksh فأهل مكة ادرى بشعابها :smile:

فعلاً هذه الدالة كانت من أحد مشاريعي ، وتعرفت عليها مسبقاً ولكني شككت في نفسي هل فعلاً قمت بمشاركته أم لا سابقاً 😅 ..

على العموم ، الحل الذي أفكر به أن أجعل الدالة ترجع String بدل Long للمتغير maxID . بمعنى أنه لا تقوم بتحويل الرقم التسلسلي الناتج إلى CLng بعد دمج النصوص (مكونات الرقم التسلسلي ) ، بل احتفظ به كنص .

وعليه فبعد التعديل وإزالة التنسيق يصبح الكود كالتالي :-

Public Function GenerateID(TableName As String, fieldName As String) As String
    Dim currentYear As Integer
    Dim yearPrefix As String
    Dim maxID As String
    Dim serialPart As Long
    currentYear = Year(Date)
    yearPrefix = currentYear & ""
    maxID = Nz(DMax(fieldName, TableName, fieldName & " LIKE '" & yearPrefix & "*'"), yearPrefix & "00")
    serialPart = CLng(Mid(maxID, Len(yearPrefix) + 1))
    GenerateID = yearPrefix & "0000" & (serialPart + 1)
End Function

 

جربه وأخبرنا بالنتيجة :smile:

قام بنشر

السلام عليكم و رحمة الله و بركاته

الى السيد ابو خليل

لقد جربت ان ابدل 0000 ب 000 و نجحت المحاولة لكن يبقى لي شي اناعرفه هو كم حد اقصى كارقام اقدر ان اصل اليه مثلا 2025009999 كاقصى عدد في انتظار ان تدخل السنة التي بعدها؟؟؟

و بالنسبة الى السيد FOKSH لقد اعنتني في العديد من المرات و ان كان لي الحظ انازور الاردف فاكيد اطلب مقابلتك لشكرك وجها لوجه فمعرفة الرجال خير من الاموال. و بالنسبة لما اقترحته من تعديل فقد ادخلته و لكن فيه اشكال و اليك الصور والبرنامج لتتحقق معي و اتمنى ان تجد لي الحل فالمطلوب هو في طوال السنة استطيع ان ابيع و ان تصل ارقام التواصيل الى 2026009999 او اكثر فيجب ان تبدا الارقام برقم السنة ثم تسلسل الى 5 ارقام على الاقل بحفاض صفرين مباشرة بعد رقم السنة

و لكم جزيل الشكر

Problem_1.png

Problem_2.png

Problem_3.png

Problem_4.png

numero.rar

قام بنشر
2 ساعات مضت, حافظ التونسي said:

السلام عليكم و رحمة الله و بركاته

الى السيد ابو خليل

لقد جربت ان ابدل 0000 ب 000 و نجحت المحاولة لكن يبقى لي شي اناعرفه هو كم حد اقصى كارقام اقدر ان اصل اليه مثلا 2025009999 كاقصى عدد في انتظار ان تدخل السنة التي بعدها؟؟؟

 

نعم كأقصى عدد على الدالة الحالية هو 9999

جرب التعديل على الدالة بطريقة مختلفة نوعا .. ستبقى الخانات 6  ولكن يمكن ان يتم الترقيم الى 5 أو 6 خانات

استغرب لماذا تريد ان يبقى صفرين بعد السنة لا فائدة منهما 

الدالة التالية الصفران موجودان ولكن متاح استخدامهما

ويمكن لو اردت الفصل بين السنة والترقيم بفاصلة معينة مثل (-) او (/) او اي فاصلة

Public Function GenerateID(TableName As String, fieldName As String) As String
on error resume next
Dim vLastY As Variant
Dim iNext As Integer
vLastY = DMax(fieldName, TableName, fieldName & " LIKE '" & Year(Date) & "*'")
If IsNull(vLastY) Then
iNext = 1
Else
iNext = Val(Mid(vLastY, 5)) + 1
End If
GenerateID = Year(Date) & Format(iNext, "000000")
End Function

 

 

قام بنشر
2 ساعات مضت, حافظ التونسي said:

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

أولا ، جزاك الله خيراً على شعورك الجميل هذا .. ويسعدني ان أرحب بك واشتضيفك متى زرتنا في الأردن بلدك الثاني :wub: .

 

2 ساعات مضت, حافظ التونسي said:

هو في طوال السنة استطيع ان ابيع و ان تصل ارقام التواصيل الى 2026009999 او اكثر فيجب ان تبدا الارقام برقم السنة ثم تسلسل الى 5 ارقام على الاقل بحفاض صفرين مباشرة بعد رقم السنة

أما بخصوص طلبك ، فسأرى ما يمكنني فعله إن شاء الله ، ما لم يسبقني احد من الأساتذة والمعلمين ..

قام بنشر

السلام عليكم و رحمة الله و بركاته

نجحت فكرتك سيد ابو خليل 

جازاك الله خيرا انت و كل من فكر في اعانتي 

و اعجبتني فكترتك هته ( يمكن لو اردت الفصل بين السنة والترقيم بفاصلة معينة مثل (-) او (/) او اي فاصلة) فكيف لي ان افعلها؟ و هل ما شبق سيتغير تلقائيا او يبقى كما هو و اي صفحة جديدة ستكون بالشكل الجديد؟

شكرا لكم

 

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
×
×
  • اضف...

Important Information