الانتقال إلى المحتوى
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.

مساعدة في تنفيذ جملة سليكت

Featured Replies

بتاريخ:

الاخوة الاعزاء
انا بحاول اتعلم ADF و عايز انفذ جملة سلكيت و اقرا القيمة الناتجة
مع العلم ان الجملة بها حقل واحد و بترجع صف واحد
Select max(nvl(ID,0)) from emp
وده عشان اضيف ID بشكل تلقائي اثناء انشاء سجل جديد للجدول emp
ارجو المساعدة في تنفيذ جملة السليكت وقراءة القيمة الناتجة او اقتراح حل بديل لقراءة اخر سيريال في الجدول لأنشاء حقل جديد مع العلم ان Sequence غير متاح في قاعدة البيانات ولا يمكن استخدامة

ولكم جزيل الشكر و التقدير

بتاريخ:

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

اخي العزيز حاول هذه

SELECT * FROM TABLE
('WHERE ID =IDENT_CURRENT('TABLE

If you want to select the last ROW inserted in a TABLE in a DATABASE that has an IDENTITY column named ID

بتاريخ:

الاخ / أحمد هو يقصد فى ال ADF

الاخ / اشرف

ما سبب اصرارك لعدم عمل sequence فى قاعدة البيانات افضل طريقه لهذا هو عمل sequence و Trigger يحصله fire فى حالة ال insert وتخللى نوع ال attribute فى الانتيتى هو DataBase Sequence وميزه هذه الطريقه انه سيحافظ على قيمه الSequence فى حالة ال Roll Back اما طريقة ال max() + 1 فلها عيوب كثيره اهمها انها لن تعمل فى multiuser environment

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

الاخ احمد
الاخت هالة
اشكر لكم تفاعلكم وردودكم القيمة
اما بالنسبة لسؤال الاخت هالة
سياسة المكان الغريبة لا تعتمد موضوع sequence وانا مليش اكسيس علي السيرفر
لكن علي كل حال لو السؤال بشكل عام اني عايز اعمل جمله سيلكت و انفذها واستخدم القيم بتاعتها
ايه افضل طريقة للك في ADF ولو في مثال مرفق يبقي شيء رائع
ولكم جزيل الشكر

بتاريخ:

المثل العربي يقول "إذا عرف السبب بطل العجب".
لا توجد سياسة غريبة في عدم اعتماد الـ sequence ، وسأشرح للكل ما هي الأسباب المؤدية لذلك بالإضافة إلى تصحيح بعض المعلومات الواردة في هذه المشاركة والإجابة على السائل.

أولاً لماذا لا يعتمد البعض على sequence؟
الحقيقة أنه توجد العديد من الأسباب التي تجعل البعض لا يعتمد على sequence:
1. إن sequence هو مكون خاص بقاعدة البيانات أوراكل فقط ولذلك من يريد أن يجعل النظام قابل للعمل على أي قاعدة بيانات فلا يمكن أن يعتمد على sequence
2. قد تكون هناك آلية معينة متبعة في العمل تفرض أن يكون تسلسل الأرقام مبني على قواعد وجداول معينة ، فمثلاً في نظام الاتصالات الإدارية فتوجد العديد من الطرق البرمجية والـ business
rules الغير متوافقة مع sequence خاصة في توليد أرقام المعاملات
3. نظراً لأن المستخدمين هم من يقومون بإدخال البيانات ، فهم يقومون بحفظ أرقام البيانات من كثرة عملهم على النظام ولذلك فعندهم طلب أن يكون الرقم متسلسل دائماً ، و sequence إذا أخذ
قيمة فلا يمكن الرجوع إلى قيمة قديمة ولذلك إذا حدث أي خطأ في الإدخال فقد تم فقد القيمة ولا يمكن الرجوع إليها

هذه أيضاً بعص المعلومات الغير صحيحة التي ذكرت في هذه المشاركة وتصحيحها:
افضل طريقه لهذا هو عمل sequence و Trigger يحصله fire فى حالة ال insert وتخللى نوع ال attribute فى الانتيتى هو DataBase Sequence
هذا غير صحيح لأن أفضل طريقة هي إدخال sequence من خلال النظام لأنه أسهل وأسرع في التطوير من إضافة trigger على كل جدول (سطرين كود فقط). أيضاً معروف أنه أحياناً يحدث خطأ في الـ trigger (غالباً نتيجة للتعديل في بعض الجداول) ويحدث الخطأ التالي trigger failed revalidation ولذلك لا يفضل الاعتماد على trigger

وميزه هذه الطريقه انه سيحافظ على قيمه الSequence فى حالة ال Roll Back
هذا غير صحيح لأن sequence إذا أخذ قيمة فلا يمكن الرجوع إلى قيمة قديمة ولذلك إذا حدث أي خطأ في الإدخال فقد تم فقد القيمة ولا يمكن الرجوع إليها

اما طريقة ال max() + 1 فلها عيوب كثيره اهمها انها لن تعمل فى multiuser environment
لا توجد عيوب كثيرة ، فقط يوجد عيب واحد هو أن فيها مشكلة في حالة وجود العديد من المستخدمين ولكن هذه المشكلة لها حل عن طريق ما يعرف باسم تأمين المهام حيث نستطيع بها ضمان عمل max() + 1 في multiuser environment بلا أدنى مشكلة لأننا واجهنا مثل هذا المتطلب في وجود 600 مستخدم متزامن ولم تحدث مشكلة واحدة نتيجة للمعالجة الصحيحة

وبالرغم مما ذكرته ، فإنني أفضل أن يكون هناك sequence لأن ADF يعمل بأفضل أداء في قاعدة البيانات أوراكل ، كما أنه من الصعب أن تعمل على أوراكل ثم تنتقل إلى أي قاعدة بيانات أخرى.

وعموماً هذا هو الكود الذي يقوم بتنفيذ جملة SQL.

Number nextId = null;
java.sql.PreparedStatement statId = null;
java.sql.ResultSet rsId = null;
try
{
String sqlId = "select max(id) from table";
statId = getDBTransaction().createPreparedStatement(sqlId, 1);
rsId = statId.executeQuery();
if ( rsId.next() )
{
nextId = new Number(rsId.getInt(1) + 1);
}
else
{
nextId = new Number(1);
}
}
catch(Exception eId)
{
eId.printStackTrace();
}
finally
{
//close rsId
//close statId
}

يمكنك كتابة هذا الكود في AppModule أو داخل Entity Object

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

الاخ العزيز : مصطفي
اشكرك شكرا جزيلا علي ردك الوافي وانا هجرب الكود وان شاء الله يشتغل

بالنسبة لكلامك عن الماكس هو طريقة كويسه وانا بستخدمها في الفورمز وحتي في .net مع سكول سيرفر
و مع اني ازعم اني شغال فومز وسي وباسيك كويس الا اني شعرت ببعض الارتباك لما ابتديت استخدم Jdev
ولكن اللي اشتغل علي لغات جديدة عارف ان ده وضع مؤقت و هيروح مع العمل و التطبيق

لكن علي كل حال انا بشكرك جدا واتمني لك التوفيق دائما

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

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

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

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

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

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.