mmsalman87 بتاريخ: 6 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 6 يوليو 2009 عندي بروسيجر فيه يمنع الاضافة على الجدول اذا كان للموظف اكثر من اربعة اجازات او اثنتين ان كان دوامه جزئياالسؤال اريد ان اقلبه الى 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; كيف ؟ وبكون مشكوركم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 6 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 6 يوليو 2009 السلام عليكمشيل تعريف البروسيدورواكتب تعريف ال 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; أنا مشعارف أه معنى الرسالة لانها غير واضحة لكن يمكنك تعديله عموما جربه اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 مشكور اخي ولكن عندي مشكلة اريد لكل موظف اذا كان عدد استئذاناته 4 مرات في الشهر ان لايتم ادخال استئذان جديد واذا كان موظف جزئي ان يسمح له بالاستئذانات مرتين فقط ؟ كيف ذلك لان جملتي فيها خطأ وهو انه يجلب لك عدد التواريخ كلها انا اريد بكل شهر اتمنى ان تكون وصلت الفكرة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdu1_far بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 هتزود شرط على جملة السلكت الاولى هو انا مش عارف ايه الداتا اللي انت بتسجلها بس اكيد يعني بتدخل قيمة في الكولم اللي اسمه 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; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 اوكي اخي الكريم مشكور في البداية ولكن عندي ملاحظات على التريغر اولا انا رح اكون في الفورم والفورم رح يكون واقف عند رقم موظف معين لنفرض رقمه 69الان كيف سأقول للتريغر اني بدي بس تتأكد من هذا الموظف وليس كل موظف وذلك لانو اذا بدو يتأكد من كل الموظفين ليس منطقيا؟؟؟ هل انا اصبت ام لا ؟؟؟ وشكرا لك انتظر ردك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdu1_far بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 (معدل) نعم معاك حأ .... بس خد بالك التريجر ده على الداتا بيز مش على الفورم ومش هيحصل غير في حالة الانسرت وا الابديت يبقى هتغير بس وتضيف كلمة :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 يوليو 2009 بواسطة abdu1_far اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 التريغر لا يقبل العمل ويعطيني الخطأ التالي مع انني راجعته حرف حرف 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 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdu1_far بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 لان حضرتك بتعمل SELECT في جدول وفي نفس الوقت بتعمل فيه ابديت او انسيرتمنطقيا الكود ده بيقولي ايهفي حالة الانسرت او الابديت ..... يعني كده الجدول معموله LOCK لانه في مود الانسرت او الابديتوجوه التريجر بنقوله روح سلكت منه الجدول ، طب ازاي والجدول محجوز حاليا ... مطنقيا ما ينفعشانت كده عايز تعمل 2 ترانزاكشن في نفس الواقت طب الحل هتستخدم ال PRAGMA هتروح في الDECLARE وتزود السطر دهPRAGMA AUTONOMOUS_TRANSACTION;بس كده وجربلو ما استغلتش ياريت تبعت لي الجودل ده ، بس بلاش امتداد.RAR عشان مش هيفتح معايا هناجرب ياباشا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 (معدل) لم يعمل الكود مع التعديل مرفق الكود والجدوللاتنسا ان رقم الموظف leave_emp_id مربوط مع جدول الموظفين تم تعديل 7 يوليو 2009 بواسطة maher534510 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdu1_far بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 (معدل) يا فندم التريجر شغال كويس بس كلمة RAISE_APPLICATION_ERRORكانت مكتوبه خطأ بسوعادي ممكن تشيل PRAGMA AUTONOMOUS_TRANSACTION;جرب بس اكتب كلمة RAISE_APPLICATION_ERROR كدهانت بس كنت حاطط LL في كلمة APPLICATION ، هي المفروض LI تم تعديل 7 يوليو 2009 بواسطة abdu1_far اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 معلشي يأخي عبداالله واضح اني كتبتها بسرعة فتسببت في خطأوأخذت الكود الاي كتبه أخي ماهر ووضعته على طول دون مراجعته شكرا لك على مشاركتك المفيدة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 يا اخواني انا معاكم كلامكم صحيح ولكن نفس الخطأ مرفق الصورة للتاكد اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 7 يوليو 2009 تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 السلام عليكممكتوب بالكود else بالاخير ما فائدتها ؟؟؟انت عامل if مرتينيعني مو لازم يكون عندك end if مرتين ؟؟؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 يوليو 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 يوليو 2009 مشكور يا حبيب فعلا كلمة else هي المشكلة كلها مشكورين جميعا صدقا اني اشعر عندما ادخل هذا المنتدى كأني في بيتي مشكورين كلكم اخواني واحبائي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.