الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

هل يوجد بديل ل Sequence يكون اكثر منه دقه

Featured Replies

بتاريخ:

من المعروف ان من عيوب Sequence

انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence 

وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده 
أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3
فأصبح الموجود في الجدول 1 ثم 3
وهي مشكله معروفه 

اعتقد انه يتم برمجيا بعيدا عن Sequence 
بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه 
في الجدول 
ام 
إذا وجد Master Detail 
أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به 
فكيف يتم برمجيا

ام عن سؤالي فما هو بديل Sequence

  • الردود 30
  • المشاهدات 3.6k
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

Most Popular Posts

  • يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key) فيفضل أن تستخدم معه Sequence خاصة في بيئة الويب.

  • يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key) فيفضل أن تستخدم معه Sequence خاصة في بيئة الويب. أتفق 100%

  • بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله

بتاريخ:

يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key)

فيفضل أن تستخدم معه Sequence

خاصة في بيئة الويب.

بتاريخ:
  • كاتب الموضوع

انت كدا هتجبرنى استخدم الربط بحقل Sequence 
ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساسا
طيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟
ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسى
وفى نفس الوقت لايوجد به مشكله 
Sequence 

 

تم تعديل بواسطة Ahmed Khayal

بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

تمام شكرا يابشمهندس احمد

بتاريخ:

تمام شكرا يابشمهندس احمد

عفوا

بتاريخ:

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

بامكانك استخدام 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

 

بالتوفيق

تم تعديل بواسطة orcl

بتاريخ:
  • كاتب الموضوع

تمام يابشمهندس orcl هجربها واشوف المثال فى الرابط
شكرا 

بتاريخ:

من المعروف ان من عيوب Sequence

انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence 

وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده 

أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3

فأصبح الموجود في الجدول 1 ثم 3

وهي مشكله معروفه 

اعتقد انه يتم برمجيا بعيدا عن Sequence 

بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه في الجدول 

ام إذا وجد Master Detail 

أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به 

فكيف يتم برمجيا

ام عن سؤالي فما هو بديل Sequence

بداية صيغة السؤال خادعة ولا توحي بالمطلوب

السؤال الحقيقي هو "كيف يمكن ضمان عدم وجود قيم خالية غير مستخدمة في حالة Sequence؟ هل يوجد بديل أفضل؟"

بتاريخ:

يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key)

فيفضل أن تستخدم معه Sequence

خاصة في بيئة الويب.

أتفق 100%

بتاريخ:

انت كدا هتجبرنى استخدم الربط بحقل Sequence 

ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساسا

طيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟

ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسى

وفى نفس الوقت لايوجد به مشكله Sequence 

 

يمكن أن يكون هناك حقلان ولا مشكلة في هذا

بتاريخ:

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

ليست المشكلة مشكلة إدخال أكثر من عملية

المشكلة أن رقم الفاتورة قد يتكرر

يحدث هذا عندما يريد العميل إنشاء ترقيم مختلف للفواتير في فروع محتلفة وبالتالي يمكن تكرار رقم الفاتورة هنا

بتاريخ:

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

بامكانك استخدام 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 من قاعدة البيانات فستضيع القيمة

بتاريخ:

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

بتاريخ:
  • كاتب الموضوع

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

عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر

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

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

شكرا ياستاذنا

 

بتاريخ:

 

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

عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر

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

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

شكرا ياستاذنا

 

 

إن شاء الله أوضحها

بتاريخ:

بداية دعونا نفهم أصل المشكلة

توجد بعض البيانات المطلوب إنشاء رقم تسلسلي فيها دون أن يحدث فقد لأي رقم على الإطلاق

والأسباب في ذلك كثيرة

يعني مثلاً رقم الفاتورة يجب أن يكون رقماً مسلسلاً بحيث أنه لو وجدت فاتورة رقمها 1000 فهذا يعني وجود 1000 فاتورة

لا يسمح العميل أن يكون هناك رقم مفقود في الوسط لأي سبب

هنا يحتاج إلى حل برمجي لهذا

أيضاً أرقام المعاملات لا يسمح بالأرقام التي تضيع

وبالمثل الكثير من البيانات التي لا تسمح بوجود أرقام مفقودة

هذه هي أصل المشكلة

بتاريخ:

إذن لدينا متطلب واضح من العميل

يجب أن يتم تعبئة رقم مسلسل لا يسمح بأي فراغ

لا يمكن أن يتراجع المستخدم عن العملية فيجد أن الرقم ضاع

هنا يكون على المبرمج التفكير في الحلول البرمجية المناسبة لحل هذه المشكلة

نتعرف على الحلول المختلفة لهذه الجزئية

بتاريخ:

قد يفكر الشخص في استخدام Sequence حيث أن استخدامه الأساسي بالفعل هو رقم مسلسل

يذهب المبرمج إلى دالة create ويضع الكود فيها

المشكلة التي تحدث هنا هو أنه إذا قام المستخدم بإنشاء جديد ثم تراجع

أو أغلق الجهاز

أو حدثت مشكلة في النظام

أو في الاتصال

هنا تحدث المشكلة

القيمة التي يتم الحصول عليها من Sequence لا يمكن الحصول عليها مرة أخرى

العداد لا يتوقف أبداً

إذن هذا الحل غير مناسب

بتاريخ:

من الممكن إجراء تحسين هنا عن طريق تحويل الكود إلى الدالة doDML بدلاً من create

لا تزال هناك مشكلة أنه لو حدث خطأ في الإدخال نفسه فسيضيع الرقم

كما أنه لو قام أحد الأشخاص بكتابة جملة select seq.nextval from dual فسيضيع الرقم أيضاً

إذن هذا الحل ليس مناسباً أيضاً

بتاريخ:

حسناً قد نفكر أن نقوم بعمل sequence برمجياً

يعني مثلاً نقوم بإنشاء جدول خارجي ونضع فيه الرقم الحالي بحيث أنه يتم جلب القيمة من الجدول وزيادتها بعد التأكد من الإدخال

حسناً لنحلل هذا الحل

بتاريخ:

يكون لدينا الخيارين أيضاً

إما أن نضع الكود داخل create أو داخل doDML

في حالة create فهذا يسبب مشكلة كبرة في حالة وجود أكثر من مستخدم متزامن

تخيل أنه يوجد 10 كاشيرات مثلاً في نفس الوقت

أكيد وارد إدخال أكثر من فاتورة في نفس الوقت

إذن هذا الحل لا يصلح في حالة المستخدمين المتزامنين

بتاريخ:

يذهب التفكير تلقائياً لكتابة الكود داخل doDML

لكن للأسف مع وجود مستخدمين متزامنين فلا تزال توجد مشكلة

البعض يقوم بعمل Lock على الجدول لمنع أي عملية من مستخدم أخر في نفس الوقت

مشكلتها أنه لو حدثت مشكلة في النظام فسيظل هناك lock على الجدول

ويجب تدخل DBA لفك الـ Lock

وبالتالي هذا ليس حلاً عملياً

بتاريخ:

قد يفكر البعض في استخدام next max عن طريق جملة sql

ونفس الخيارين موجودين معنا

إما أن نكتب في create وإما في doDML

حسناً لنحلل هذين الحلين

بتاريخ:

إذا وضعنا الكود في create فسيكون الوضع أسوأ من استخدام sequence لأنه في حالة وجود أكثر من مستخدم متزامن فسيحصل الكل على نفس النتيجة

إذن هذا ليس مناسباً بالمرة

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.