بتاريخ: 25 أكتوبر 201114 سنة comment_216920 الاخوة الاعزاءانا بحاول اتعلم ADF و عايز انفذ جملة سلكيت و اقرا القيمة الناتجةمع العلم ان الجملة بها حقل واحد و بترجع صف واحدSelect max(nvl(ID,0)) from emp وده عشان اضيف ID بشكل تلقائي اثناء انشاء سجل جديد للجدول empارجو المساعدة في تنفيذ جملة السليكت وقراءة القيمة الناتجة او اقتراح حل بديل لقراءة اخر سيريال في الجدول لأنشاء حقل جديد مع العلم ان Sequence غير متاح في قاعدة البيانات ولا يمكن استخدامة ولكم جزيل الشكر و التقدير تقديم بلاغ
بتاريخ: 25 أكتوبر 201114 سنة comment_216932 السلام وعليكم ورحمة الله وبرطاته اخي العزيز حاول هذه 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 تقديم بلاغ
بتاريخ: 25 أكتوبر 201114 سنة comment_216935 الاخ / أحمد هو يقصد فى ال ADF الاخ / اشرف ما سبب اصرارك لعدم عمل sequence فى قاعدة البيانات افضل طريقه لهذا هو عمل sequence و Trigger يحصله fire فى حالة ال insert وتخللى نوع ال attribute فى الانتيتى هو DataBase Sequence وميزه هذه الطريقه انه سيحافظ على قيمه الSequence فى حالة ال Roll Back اما طريقة ال max() + 1 فلها عيوب كثيره اهمها انها لن تعمل فى multiuser environment تقديم بلاغ
بتاريخ: 26 أكتوبر 201114 سنة كاتب الموضوع comment_216951 الاخ احمدالاخت هالةاشكر لكم تفاعلكم وردودكم القيمةاما بالنسبة لسؤال الاخت هالةسياسة المكان الغريبة لا تعتمد موضوع sequence وانا مليش اكسيس علي السيرفرلكن علي كل حال لو السؤال بشكل عام اني عايز اعمل جمله سيلكت و انفذها واستخدم القيم بتاعتهاايه افضل طريقة للك في ADF ولو في مثال مرفق يبقي شيء رائعولكم جزيل الشكر تقديم بلاغ
بتاريخ: 27 أكتوبر 201114 سنة comment_217006 المثل العربي يقول "إذا عرف السبب بطل العجب".لا توجد سياسة غريبة في عدم اعتماد الـ sequence ، وسأشرح للكل ما هي الأسباب المؤدية لذلك بالإضافة إلى تصحيح بعض المعلومات الواردة في هذه المشاركة والإجابة على السائل.أولاً لماذا لا يعتمد البعض على sequence؟الحقيقة أنه توجد العديد من الأسباب التي تجعل البعض لا يعتمد على sequence:1. إن sequence هو مكون خاص بقاعدة البيانات أوراكل فقط ولذلك من يريد أن يجعل النظام قابل للعمل على أي قاعدة بيانات فلا يمكن أن يعتمد على sequence2. قد تكون هناك آلية معينة متبعة في العمل تفرض أن يكون تسلسل الأرقام مبني على قواعد وجداول معينة ، فمثلاً في نظام الاتصالات الإدارية فتوجد العديد من الطرق البرمجية والـ businessrules الغير متوافقة مع 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 تقديم بلاغ
بتاريخ: 29 أكتوبر 201114 سنة كاتب الموضوع comment_217024 الاخ العزيز : مصطفياشكرك شكرا جزيلا علي ردك الوافي وانا هجرب الكود وان شاء الله يشتغل بالنسبة لكلامك عن الماكس هو طريقة كويسه وانا بستخدمها في الفورمز وحتي في .net مع سكول سيرفرو مع اني ازعم اني شغال فومز وسي وباسيك كويس الا اني شعرت ببعض الارتباك لما ابتديت استخدم Jdevولكن اللي اشتغل علي لغات جديدة عارف ان ده وضع مؤقت و هيروح مع العمل و التطبيق لكن علي كل حال انا بشكرك جدا واتمني لك التوفيق دائما تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.