حافظ التونسي قام بنشر بالامس في 15:17 قام بنشر بالامس في 15:17 السلام عليكم و رحمة الله و بركاته طلبت سابقا من يعينني في العداد للفواتير والتي يبدا من رقم واحد كل بداية سنة جديدة و مشكور جدا لمن تدخل و اعاني الان وجدت مشكلة التي تتمثل في ان العداد لما يصل الى رقم 2025000099 من المفروض في الفاتورة التي تاتي بعدها يصير 2025000100 لكن تخرج نافذة خطا سارفق صور حتى تتضح المشكلة لطلب المساعدة لحل هذا الاشكال و لكم الشكر Module numero date.doc
kkhalifa1960 قام بنشر بالامس في 16:29 قام بنشر بالامس في 16:29 (معدل) المشكلة واضحة تمامًا: الخطأ "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 بدلًا من رقم لتجنب مشاكل مستقبلية. هل تحب أن نضيف تحققًا إضافيًا لتفادي التكرار أو نربط هذا التوليد بحدث معين في النموذج؟ تم تعديل بالامس في 16:35 بواسطه kkhalifa1960
حافظ التونسي قام بنشر منذ 8 ساعات الكاتب قام بنشر منذ 8 ساعات شكرا اخي خليفة على مرورك و تدخلك ولكن للاسف لم تعمل و هذا الذي حصل بالصور فكيف ترى يكون الحل؟ و لكم جزيل الشكر
ابوخليل قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات جرب يا حافظ على دالتك الاصلية نقص صفر من التنسيق في هذا السطر ليصبح 3 اصفار GenerateID = CLng(yearPrefix & "000" & (serialPart + 1))
حافظ التونسي قام بنشر منذ 4 ساعات الكاتب قام بنشر منذ 4 ساعات (معدل) شكرا هذا المرفق شكرا Serial number_1.rar تم تعديل منذ 4 ساعات بواسطه حافظ التونسي
ابوخليل قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات 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 هذه تعمل
حافظ التونسي قام بنشر منذ 4 ساعات الكاتب قام بنشر منذ 4 ساعات 7 دقائق مضت, ابوخليل said: جرب يا حافظ على دالتك الاصلية نقص صفر من التنسيق في هذا السطر ليصبح 3 اصفار GenerateID = CLng(yearPrefix & "000" & (serialPart + 1)) ماهو الفرق بين اربعة اصفار او ثلاثة اصفار و كم يصل رقم المبيعات كاقصى رقم حتى ينتقل الى السنة الموالية ليبدا من جديد؟
ابوخليل قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات 1 دقيقه مضت, حافظ التونسي said: ماهو الفرق بين اربعة اصفار او ثلاثة اصفار و كم يصل رقم المبيعات كاقصى رقم حتى ينتقل الى السنة الموالية ليبدا من جديد؟ المفروض تفيدنا اولا هل عملت معك ام لا ؟ والفرق الذي تسأل عنه هو انك تجاوزت نطاق العدد بعد السنة كأقصى رقم ثم يظهر خطأ هو 6 تسعات 999999 في الدالة التي لديك عندما يصل العدد الى الحد الاقصى لن ينتقل الى سنة جديدة بل سيظهر خطأ وسوف تنتظر حتى دخول السنة الجديدة
حافظ التونسي قام بنشر منذ 4 ساعات الكاتب قام بنشر منذ 4 ساعات 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؟
ابوخليل قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات الافضل لك ان تزيل التنسيق ليصبح السطر هكذا GenerateID = CLng(yearPrefix & (serialPart + 1)) جرب لن تخسر شيئا ولكن الرقم سيكون عاديا بدون اصفار وسيتزايد مثله مثل الارقام العادية .. وفي السنة الجديدة يبدأ بواحد بعد السنة
ابوخليل قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات من المثال المرفق تبين لي ان الدالة من عمل @Foksh فأهل مكة ادرى بشعابها 1
Foksh قام بنشر منذ 4 ساعات قام بنشر منذ 4 ساعات 7 دقائق مضت, ابوخليل said: من المثال المرفق تبين لي ان الدالة من عمل @Foksh فأهل مكة ادرى بشعابها فعلاً هذه الدالة كانت من أحد مشاريعي ، وتعرفت عليها مسبقاً ولكني شككت في نفسي هل فعلاً قمت بمشاركته أم لا سابقاً 😅 .. على العموم ، الحل الذي أفكر به أن أجعل الدالة ترجع 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 جربه وأخبرنا بالنتيجة
الردود الموصى بها
انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد
يجب ان تكون عضوا لدينا لتتمكن من التعليق
انشئ حساب جديد
سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .
سجل حساب جديدتسجيل دخول
هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.
سجل دخولك الان