بتاريخ: 3 أبريل 201610 سنة comment_273203 من المعروف ان من عيوب Sequence انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3فأصبح الموجود في الجدول 1 ثم 3وهي مشكله معروفه اعتقد انه يتم برمجيا بعيدا عن Sequence بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه في الجدول ام إذا وجد Master Detail أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به فكيف يتم برمجيا ام عن سؤالي فما هو بديل Sequence تقديم بلاغ
بتاريخ: 3 أبريل 201610 سنة comment_273209 يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key) فيفضل أن تستخدم معه Sequence خاصة في بيئة الويب. تقديم بلاغ
بتاريخ: 3 أبريل 201610 سنة كاتب الموضوع comment_273211 انت كدا هتجبرنى استخدم الربط بحقل Sequence ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساساطيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسىوفى نفس الوقت لايوجد به مشكله Sequence تم تعديل 3 أبريل 201610 سنة بواسطة Ahmed Khayal تقديم بلاغ
بتاريخ: 3 أبريل 201610 سنة comment_273214 ممكن تستخدم رقم الفاتورة كمفتاح لكنه ليس التصميم الأفضل ، لأنه قد يسبب مشاكل في الإدخال في حالة أكثر من عملية في نفس الوقت. تقديم بلاغ
بتاريخ: 3 أبريل 201610 سنة comment_273231 السلام عليكم و رحمة الله و بركاته بامكانك استخدام Sequence و ادخل قيمة الحقل عند لحظة الاضافة و ذلك من خلال استخدام doDML على مستوي ال EO protected void doDML(int operation, TransactionEvent e) { if (operation == DML_INSERT) { و بذلك تتاكد بانك استخدمت ال Sequence وقت اضافة السجل الى قاعدة البيانات ربما يفيدك الرابط التالي http://andrejusb.blogspot.com/2013/01/how-to-implement-gapless-sequence-in.html بالتوفيق تم تعديل 3 أبريل 201610 سنة بواسطة orcl تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة كاتب الموضوع comment_273252 تمام يابشمهندس orcl هجربها واشوف المثال فى الرابطشكرا تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273264 من المعروف ان من عيوب Sequence انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3 فأصبح الموجود في الجدول 1 ثم 3 وهي مشكله معروفه اعتقد انه يتم برمجيا بعيدا عن Sequence بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه في الجدول ام إذا وجد Master Detail أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به فكيف يتم برمجيا ام عن سؤالي فما هو بديل Sequence بداية صيغة السؤال خادعة ولا توحي بالمطلوب السؤال الحقيقي هو "كيف يمكن ضمان عدم وجود قيم خالية غير مستخدمة في حالة Sequence؟ هل يوجد بديل أفضل؟" تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273265 يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key) فيفضل أن تستخدم معه Sequence خاصة في بيئة الويب. أتفق 100% تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273266 انت كدا هتجبرنى استخدم الربط بحقل Sequence ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساسا طيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟ ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسى وفى نفس الوقت لايوجد به مشكله Sequence يمكن أن يكون هناك حقلان ولا مشكلة في هذا تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273267 ممكن تستخدم رقم الفاتورة كمفتاح لكنه ليس التصميم الأفضل ، لأنه قد يسبب مشاكل في الإدخال في حالة أكثر من عملية في نفس الوقت. ليست المشكلة مشكلة إدخال أكثر من عملية المشكلة أن رقم الفاتورة قد يتكرر يحدث هذا عندما يريد العميل إنشاء ترقيم مختلف للفواتير في فروع محتلفة وبالتالي يمكن تكرار رقم الفاتورة هنا تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273268 السلام عليكم و رحمة الله و بركاته بامكانك استخدام Sequence و ادخل قيمة الحقل عند لحظة الاضافة و ذلك من خلال استخدام doDML على مستوي ال EO protected void doDML(int operation, TransactionEvent e) { if (operation == DML_INSERT) { و بذلك تتاكد بانك استخدمت ال Sequence وقت اضافة السجل الى قاعدة البيانات ربما يفيدك الرابط التالي http://andrejusb.blogspot.com/2013/01/how-to-implement-gapless-sequence-in.html بالتوفيق هذا لا يضمن عدم وجود قيم خالية لأنه ببساطة لو كان هناك خطأ في الإدخال نفسه أو Exception فستضيع قيمة sequence كما أنه لو قام شخص أخر بكتابة select seq_name.nextval from dual من قاعدة البيانات فستضيع القيمة تقديم بلاغ
بتاريخ: 4 أبريل 201610 سنة comment_273269 بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله تقديم بلاغ
بتاريخ: 5 أبريل 201610 سنة كاتب الموضوع comment_273279 بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر واعتقدت ان الحل سيكون برمجيا بحتا بعيدا عن قاعدة البيانات واتمنى ان تتناول المشكله بشكل ادق واضح ليكون مرجع لكل المبرمجين الجدد عندما تقابلهم نفس المشكله شكرا ياستاذنا تقديم بلاغ
بتاريخ: 5 أبريل 201610 سنة comment_273281 بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر واعتقدت ان الحل سيكون برمجيا بحتا بعيدا عن قاعدة البيانات واتمنى ان تتناول المشكله بشكل ادق واضح ليكون مرجع لكل المبرمجين الجدد عندما تقابلهم نفس المشكله شكرا ياستاذنا إن شاء الله أوضحها تقديم بلاغ
بتاريخ: 6 أبريل 201610 سنة comment_273302 بداية دعونا نفهم أصل المشكلة توجد بعض البيانات المطلوب إنشاء رقم تسلسلي فيها دون أن يحدث فقد لأي رقم على الإطلاق والأسباب في ذلك كثيرة يعني مثلاً رقم الفاتورة يجب أن يكون رقماً مسلسلاً بحيث أنه لو وجدت فاتورة رقمها 1000 فهذا يعني وجود 1000 فاتورة لا يسمح العميل أن يكون هناك رقم مفقود في الوسط لأي سبب هنا يحتاج إلى حل برمجي لهذا أيضاً أرقام المعاملات لا يسمح بالأرقام التي تضيع وبالمثل الكثير من البيانات التي لا تسمح بوجود أرقام مفقودة هذه هي أصل المشكلة تقديم بلاغ
بتاريخ: 7 أبريل 201610 سنة comment_273339 إذن لدينا متطلب واضح من العميل يجب أن يتم تعبئة رقم مسلسل لا يسمح بأي فراغ لا يمكن أن يتراجع المستخدم عن العملية فيجد أن الرقم ضاع هنا يكون على المبرمج التفكير في الحلول البرمجية المناسبة لحل هذه المشكلة نتعرف على الحلول المختلفة لهذه الجزئية تقديم بلاغ
بتاريخ: 8 أبريل 201610 سنة comment_273355 قد يفكر الشخص في استخدام Sequence حيث أن استخدامه الأساسي بالفعل هو رقم مسلسل يذهب المبرمج إلى دالة create ويضع الكود فيها المشكلة التي تحدث هنا هو أنه إذا قام المستخدم بإنشاء جديد ثم تراجع أو أغلق الجهاز أو حدثت مشكلة في النظام أو في الاتصال هنا تحدث المشكلة القيمة التي يتم الحصول عليها من Sequence لا يمكن الحصول عليها مرة أخرى العداد لا يتوقف أبداً إذن هذا الحل غير مناسب تقديم بلاغ
بتاريخ: 10 أبريل 201610 سنة comment_273421 من الممكن إجراء تحسين هنا عن طريق تحويل الكود إلى الدالة doDML بدلاً من create لا تزال هناك مشكلة أنه لو حدث خطأ في الإدخال نفسه فسيضيع الرقم كما أنه لو قام أحد الأشخاص بكتابة جملة select seq.nextval from dual فسيضيع الرقم أيضاً إذن هذا الحل ليس مناسباً أيضاً تقديم بلاغ
بتاريخ: 10 أبريل 201610 سنة comment_273431 حسناً قد نفكر أن نقوم بعمل sequence برمجياً يعني مثلاً نقوم بإنشاء جدول خارجي ونضع فيه الرقم الحالي بحيث أنه يتم جلب القيمة من الجدول وزيادتها بعد التأكد من الإدخال حسناً لنحلل هذا الحل تقديم بلاغ
بتاريخ: 11 أبريل 201610 سنة comment_273434 يكون لدينا الخيارين أيضاً إما أن نضع الكود داخل create أو داخل doDML في حالة create فهذا يسبب مشكلة كبرة في حالة وجود أكثر من مستخدم متزامن تخيل أنه يوجد 10 كاشيرات مثلاً في نفس الوقت أكيد وارد إدخال أكثر من فاتورة في نفس الوقت إذن هذا الحل لا يصلح في حالة المستخدمين المتزامنين تقديم بلاغ
بتاريخ: 11 أبريل 201610 سنة comment_273462 يذهب التفكير تلقائياً لكتابة الكود داخل doDML لكن للأسف مع وجود مستخدمين متزامنين فلا تزال توجد مشكلة البعض يقوم بعمل Lock على الجدول لمنع أي عملية من مستخدم أخر في نفس الوقت مشكلتها أنه لو حدثت مشكلة في النظام فسيظل هناك lock على الجدول ويجب تدخل DBA لفك الـ Lock وبالتالي هذا ليس حلاً عملياً تقديم بلاغ
بتاريخ: 13 أبريل 201610 سنة comment_273520 قد يفكر البعض في استخدام next max عن طريق جملة sql ونفس الخيارين موجودين معنا إما أن نكتب في create وإما في doDML حسناً لنحلل هذين الحلين تقديم بلاغ
بتاريخ: 14 أبريل 201610 سنة comment_273542 إذا وضعنا الكود في create فسيكون الوضع أسوأ من استخدام sequence لأنه في حالة وجود أكثر من مستخدم متزامن فسيحصل الكل على نفس النتيجة إذن هذا ليس مناسباً بالمرة تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.