بتاريخ: 18 يوليو 200817 سنة comment_133553 الـســـلااااااااااام عليكم ورحمه الله تعالى وبركاته الـيـوم جـايـب لكم طريقـة نفـذتها بـنـفـسي ..مـن تـفـكـيـري .. وبــدون مـسـاعـدات خـارجـيـة ..::: كـيـفـيـة صـنـع Auto Increment :::في الـبـدايـة ..لازم نعرف أن لايـوجـد مـستـحـيـل في عالم الـبـرمـجـة ..مـدام الـفـكـرة مـوجـودة .. فإن الإمـكـانـيـة لتحويلها لـ واقع ممكـنـة !!وقبل أن تصـنـع Auto Increment .. لازم نـقـسـم المـوضـوع إلى قسمـيـنأولا .. إذا كان الـ Attribute المراد تحويله ذو خاصية رقمية (Data Type = Number)ثانياً .. إذا كان الـ Attribute المراد تحويله ذو خاصية حرفية (Data Type = varchar)في الحالتيـن ممـكـن ..وخـلـونـا نـشـوف لمـثـالين إلي أنا صـنـعـتـهمـ في أحـد مـشـاريـعـي ..::: مــثــال لـ(Data Type = Number) ::::في الـبـدايـة .. نتخـيـل أن عـندنا جـدول للموظفينوالـprimary key للجدول هو ذو خاصية رقمية (Data Type = varchar)في هذه الحالة .. أنا عملت data block في الـformفي خـانـة emp_no .. تركت الـخـانـة ذو خاصية (Display Item)لأنني لا أريـد أن يغير المستخـدم من الرقم الـقادم في الFromوبعـدها .. عملت Trigger ذوخاصية (When-new-form-instance)داخل الـTrigger .. كـتـبـت النـص التاليDeclare Increment_By number := 1; Begin Select empno+Increment_By INTO :empno from emp where empno = (Select Max(empno) from emp); End; بـعـدما تـعمـل Run Form ..سـتـلاحظ أن خانة emp_no قدحصلت على رقم جديد غير قابل للتغيروبـهـذا تـنـتـهـي الـحـكـايـة ::: مـثـال لـ(Data Type = varchar)في الـبـدايـة .. نتخـيـل أن عـندنا جـدول زبـائـن أو عملاء (Customers)والـprimary key للجدول هو ذو خاصية حرفية (Data Type = varchar)في هذه الحالة .. أنا عملت data block في الـformبإعتبار أن الـID المميز للعملاء .. يكون بهذه الطريقة " Cust_1 "والعميل الثاني يكون بهذا الاسمـ " Cust_2 " .. وهــكــذا فإننا سـنـكـتب الـكـود التالي في (Trigger: When-new-form-instance)Declare Increment_By number := 1; Begin Select Concat('Cust_',Substr(Customer_ID,6)+Increment_By) INTO :New_Customer.CUSTOMER_ID from Customer where CUSTOMER_ID = (Select Max(Customer_ID) from CUSTOMER); End;وبـعـدها نـعـمـل Run Formونـشـوف الاسم في خـانـة Customer_IDلي عــودة في الرد الـقـادم لـشـرح الأكـوادأنــتــظـرونــي ... تقديم بلاغ
بتاريخ: 18 يوليو 200817 سنة كاتب الموضوع comment_133554 في الـكـود الأولDeclare Increment_By number := 1; Begin Select empno+Increment_By INTO :empno from emp where empno = (Select Max(empno) from emp); End; في الـبدايـة عرفت متغير بإسم (Incremented_By) .. وطيته قيمة =1بعدها نفذت Select Statment بحيث ترجع لي أعلى رقم موجود في خانةemp_noبعدها أضيف عليه واحـد .. وأضعه في (:empno) والذي هو (read Only) أو (Display Item) في المثال الـثـاني .. Declare Increment_By number := 1; Begin Select Concat('Cust_',Substr(Customer_ID,6)+Increment_By) INTO :New_Customer.CUSTOMER_ID from Customer where CUSTOMER_ID = (Select Max(Customer_ID) from CUSTOMER); End;أنت لازم تنتبه أن القيمة إل بترجع لك هي حروف (varchar) .. يعني مب رقم عاديوبما أنني أعرف صيغة الـID إلي راح يرجع لي (Cust_#) .. صار لازم أفصل الرقم عن الأحرف !!لذلك أستخدمت خاصية ()substr .. وطلبت منه يعطيني الباقي .. أبتداءً من الحرف الـسادس (6) من اليسارإلي راح يرجع أكيد بيكون رقم (سواء 1 أو 2 أو غيره) .. عندها ممكن أضيف إليه القيمة المتغيره (Incremented_By)لو أوقفت الكود عند هذه النقطة .. إلي راح يرجع للـForm هو رقم فقط .. لكني أستخدمت خاصية ()Concat .. وأضفت (Cust_) قبل الرقموهــذا كـل ما في الأمــر ... نـقـطـة أخيـرة قبل أن أنهـي المـوضـوع ..نحنا نستخدم Trigger في هذه الحالة صحوالـTrigger هـو (when-new-form-instance)باقي تعرفوا أننا نستخدمه في العام مباشرة ..أي تحت اسم الـModul .. كما في الـصـورة الـتـالـيـةودمــتــمـ سـالـمـيــن تم تعديل 18 يوليو 200817 سنة بواسطة بو عبدالعزيز تقديم بلاغ
بتاريخ: 19 يوليو 200817 سنة comment_133577 الأخ / بو عبدالعزيزمجهود متميز ... لعرض وشرح الفكرة ولكن يوجد سؤال فى حالة وجود شبكة داخل المؤسسة ... وفى حاله وجود اكثر من مستخدم للبرنامج او لهذه الشاشة تحديدا ... يتم التعامل مع نفس شاشة الادخال فى نفس التوقيت ... فى هذه الحالة وعند اظهار رقم الموظف ... سيظهر نفس الرقم المسلسل الجديد فى اكثر من شاشةيوجد حل اخر !! ما هو ؟ شكرا لك تقديم بلاغ
بتاريخ: 19 يوليو 200817 سنة comment_133582 السلام عليكمكيف حالكم اخواني احب اقولكم انه مجهود رائع ولكن ينقصه خطوهزي ما الاخ امجد قال في حاله الملتي يوزر هتبقي مشكلهاقوكو حل كويس وانا مجربه وشغال من زمان انت تعمل جدول في قاعده البيانات لكل شاشه و تخزن اخر رقم بمجرد ما المستخدم يطلبه حتي لو معملش حفظ ولما تيجي تاخد رقم جديد تقرا الرقم اللي في المخزن وتزود عليه 1 ولو خرج بدون ما يحفظ ترجع الرقم اللي في المخزن لأخر رقم في الجدولعيب الطريقه دي الوحيد انه ممكن يعدي ارقام في حاله عدم الحفظربنا بوفقكوا تقديم بلاغ
بتاريخ: 19 يوليو 200817 سنة كاتب الموضوع comment_133607 مــراااااااحــب أخـوانـي ( أمجـد + أشرف )فـعـلاً .. المشكلة ممكن تظهر في الشكة الداخلية ..والحل كما ذكر الأخ (أشرف) .. ممكن تأخذ الرقم قبل الحفظ في الـDatabaseطبعاً الحل إلي أنا وضعته وشرحته كان فقط لجهاز واحــد ..ولن في الشبكات الداخلية .. ففي أحتمال كبير أن تحدث مشكلة تكرار الرقمللك .. وقبل التحويل للـDatabase .. أخبر البرنامج بأن يتأكد من أن الرقم غير محجوزوإن تم حجزه .. يضيف رقم واحد .. ويـرجع يتأكــد !!بـالتـوفـيـج للـجمـيـع ؟؟؟ تقديم بلاغ
بتاريخ: 19 يوليو 200817 سنة comment_133611 الاخ / اشرف الاخ / بو عبدالعزيزالحل المقترح هو : اضافة امر انشاء الرقم max مع تريجير pre_insert على مستوى البلوك .... ولا داعي من التأكد أو السؤال من ان الرقم سبق ادخالة ام لا ....اى قبل اضافة السجل مباشرة ... يتم معرفة اكبر رقم ويضاف ضمن بيانات السجل ... ويمكن ايضا اظهارة على الشاشة شكرا لكما تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.