اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

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

قام بنشر

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

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

الان وجدت مشكلة التي تتمثل في ان العداد لما يصل الى رقم 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:

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

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

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

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

سجل حساب جديد

تسجيل دخول

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

سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information