بتاريخ: 6 يوليو 200916 سنة comment_162369 عندي بروسيجر فيه يمنع الاضافة على الجدول اذا كان للموظف اكثر من اربعة اجازات او اثنتين ان كان دوامه جزئياالسؤال اريد ان اقلبه الى database trigger لكي اضمن الكود مئة بالمئة PROCEDURE emp_leave IS v_count number; v_kind number; BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave where leave_emp_id=:leave_emp_id; select emp_kind into v_kind from employees where emp_id=:leave_emp_id; if v_kind = 1 and v_count>=4 then message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä 4 ãÑÇÊ Ýí ÇáÔåÑ áãæÙÝí ÇáÏæÇã ÇáßÇãá'); message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä 4 ãÑÇÊ Ýí ÇáÔåÑ áãæÙÝí ÇáÏæÇã ÇáßÇãá'); elsif v_kind >= 2 and v_count >=2 then message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä ãÑÊíä áãæÙÝí ÇáÏæÇã ÇáÌÒÆí'); message('áÇ íÌæÒ ÇáÇÓÊÆÐÇä ÇßËÑ ãä ãÑÊíä áãæÙÝí ÇáÏæÇã ÇáÌÒÆí'); else message('ÛíÑ ãÚÑÝ Úáì ÇáäÙÇã'); end if; raise form_trigger_failure; END; كيف ؟ وبكون مشكوركم تقديم بلاغ
بتاريخ: 6 يوليو 200916 سنة comment_162374 السلام عليكمشيل تعريف البروسيدورواكتب تعريف ال trigger create or replace trigger trigger_name before insert or update on your_table for each row decalre v_count number; v_kind number; BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave where leave_emp_id=:leave_emp_id; select emp_kind into v_kind from employees where emp_id=:leave_emp_id; if v_kind = 1 and v_count>=4 then raise_appllcation_error(-20211,'you cant'); elsif v_kind >= 2 and v_count >=2 then raise_appllcation_error(-20211,'you cant');else end if; END; أنا مشعارف أه معنى الرسالة لانها غير واضحة لكن يمكنك تعديله عموما جربه تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162404 مشكور اخي ولكن عندي مشكلة اريد لكل موظف اذا كان عدد استئذاناته 4 مرات في الشهر ان لايتم ادخال استئذان جديد واذا كان موظف جزئي ان يسمح له بالاستئذانات مرتين فقط ؟ كيف ذلك لان جملتي فيها خطأ وهو انه يجلب لك عدد التواريخ كلها انا اريد بكل شهر اتمنى ان تكون وصلت الفكرة تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162415 هتزود شرط على جملة السلكت الاولى هو انا مش عارف ايه الداتا اللي انت بتسجلها بس اكيد يعني بتدخل قيمة في الكولم اللي اسمه leave_date_originalيبقى احنا محتاجين نقارن الشهر بتاع قيمة التاريخ الجديدة ، بكل التواريخ بتاعة الاستئذانات بتاعة الموظف ، ولو التاريخ ده بيساوي التاريخ الجديد هيرجع عدد الاستئذانات ، وعادي بأه كمل التريجر زي ماهو وهيكون التريجر كده create or replace trigger trigger_name before insert or update on your_table for each row decalre v_count number; v_kind number; BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave where leave_emp_id=:leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm'); select emp_kind into v_kind from employees where emp_id=:leave_emp_id; if v_kind = 1 and v_count>=4 then raise_appllcation_error(-20211,'you cant'); elsif v_kind >= 2 and v_count >=2 then raise_appllcation_error(-20211,'you cant');else end if; END; تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162417 اوكي اخي الكريم مشكور في البداية ولكن عندي ملاحظات على التريغر اولا انا رح اكون في الفورم والفورم رح يكون واقف عند رقم موظف معين لنفرض رقمه 69الان كيف سأقول للتريغر اني بدي بس تتأكد من هذا الموظف وليس كل موظف وذلك لانو اذا بدو يتأكد من كل الموظفين ليس منطقيا؟؟؟ هل انا اصبت ام لا ؟؟؟ وشكرا لك انتظر ردك تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162421 نعم معاك حأ .... بس خد بالك التريجر ده على الداتا بيز مش على الفورم ومش هيحصل غير في حالة الانسرت وا الابديت يبقى هتغير بس وتضيف كلمة :new في التريجر يعني بدل ما يكون الشرط اللي موجود في جملة السلكتايه الاولى كده where leave_emp_id=:leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm'); هيكون كده where leave_emp_id=:new.leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm'); ويبقى التريجر الجديد بالشكل ده create or replace trigger trigger_name before insert or update on your_table for each row decalre v_count number; v_kind number; BEGIN select count(to_char(leave_date_original,'mm/yyyy')) into v_count from leave where leave_emp_id=:new.leave_emp_id and to_char(:new.leave_date_original,'mm') = to_char(leave_date_original,'mm'); select emp_kind into v_kind from employees where emp_id=:leave_emp_id; if v_kind = 1 and v_count>=4 then raise_appllcation_error(-20211,'you cant'); elsif v_kind >= 2 and v_count >=2 then raise_appllcation_error(-20211,'you cant');else end if; END; على فكرة انا اصلا ما بصتش على الكود وصحته لاني اثق في كود الاخ مصطفى ، انا بس بصيت على المطلوب من حضرتك الخاص بالاستئذان خلال شهر معينجرب كده تم تعديل 7 يوليو 200916 سنة بواسطة abdu1_far تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162424 التريغر لا يقبل العمل ويعطيني الخطأ التالي مع انني راجعته حرف حرف PLS-00103: Encountered the symbol "END" when expecting one of thefollowing:begin case declare exit for goto if loop mod null pragmaraise return select update while with <an identifier><a double-quoted delimited-identifier> <a bind variable> <<close current delete fetch lock insert open rollbacksavepoint set sql execute commit forall merge pipe تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162427 لان حضرتك بتعمل SELECT في جدول وفي نفس الوقت بتعمل فيه ابديت او انسيرتمنطقيا الكود ده بيقولي ايهفي حالة الانسرت او الابديت ..... يعني كده الجدول معموله LOCK لانه في مود الانسرت او الابديتوجوه التريجر بنقوله روح سلكت منه الجدول ، طب ازاي والجدول محجوز حاليا ... مطنقيا ما ينفعشانت كده عايز تعمل 2 ترانزاكشن في نفس الواقت طب الحل هتستخدم ال PRAGMA هتروح في الDECLARE وتزود السطر دهPRAGMA AUTONOMOUS_TRANSACTION;بس كده وجربلو ما استغلتش ياريت تبعت لي الجودل ده ، بس بلاش امتداد.RAR عشان مش هيفتح معايا هناجرب ياباشا تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162429 لم يعمل الكود مع التعديل مرفق الكود والجدوللاتنسا ان رقم الموظف leave_emp_id مربوط مع جدول الموظفين تم تعديل 7 يوليو 200916 سنة بواسطة maher534510 تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162449 يا فندم التريجر شغال كويس بس كلمة RAISE_APPLICATION_ERRORكانت مكتوبه خطأ بسوعادي ممكن تشيل PRAGMA AUTONOMOUS_TRANSACTION;جرب بس اكتب كلمة RAISE_APPLICATION_ERROR كدهانت بس كنت حاطط LL في كلمة APPLICATION ، هي المفروض LI تم تعديل 7 يوليو 200916 سنة بواسطة abdu1_far تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162450 معلشي يأخي عبداالله واضح اني كتبتها بسرعة فتسببت في خطأوأخذت الكود الاي كتبه أخي ماهر ووضعته على طول دون مراجعته شكرا لك على مشاركتك المفيدة تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162471 يا اخواني انا معاكم كلامكم صحيح ولكن نفس الخطأ مرفق الصورة للتاكد تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة comment_162472 السلام عليكممكتوب بالكود else بالاخير ما فائدتها ؟؟؟انت عامل if مرتينيعني مو لازم يكون عندك end if مرتين ؟؟؟ تقديم بلاغ
بتاريخ: 7 يوليو 200916 سنة كاتب الموضوع comment_162479 مشكور يا حبيب فعلا كلمة else هي المشكلة كلها مشكورين جميعا صدقا اني اشعر عندما ادخل هذا المنتدى كأني في بيتي مشكورين كلكم اخواني واحبائي تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.