الانتقال إلى المحتوى

تحويل بروسيجر الى تريغر


mmsalman87

Recommended Posts

عندي بروسيجر فيه يمنع الاضافة على الجدول اذا كان للموظف اكثر من اربعة اجازات او اثنتين ان كان دوامه جزئيا
السؤال اريد ان اقلبه الى 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;


كيف ؟ وبكون مشكوركم

رابط هذا التعليق
شارك

السلام عليكم
شيل تعريف البروسيدور
واكتب تعريف ال 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;



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

رابط هذا التعليق
شارك

مشكور اخي ولكن عندي مشكلة
اريد لكل موظف اذا كان عدد استئذاناته 4 مرات في الشهر ان لايتم ادخال استئذان جديد
واذا كان موظف جزئي ان يسمح له بالاستئذانات مرتين فقط ؟ كيف ذلك لان جملتي فيها خطأ وهو انه يجلب لك عدد التواريخ كلها انا اريد بكل شهر اتمنى ان تكون وصلت الفكرة

رابط هذا التعليق
شارك

هتزود شرط على جملة السلكت الاولى

هو انا مش عارف ايه الداتا اللي انت بتسجلها بس اكيد يعني بتدخل قيمة في الكولم اللي اسمه 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;

رابط هذا التعليق
شارك

اوكي اخي الكريم مشكور في البداية ولكن عندي ملاحظات على التريغر
اولا انا رح اكون في الفورم والفورم رح يكون واقف عند رقم موظف معين لنفرض رقمه 69
الان كيف سأقول للتريغر اني بدي بس تتأكد من هذا الموظف وليس كل موظف وذلك لانو اذا بدو يتأكد من كل الموظفين ليس منطقيا؟؟؟ هل انا اصبت ام لا ؟؟؟ وشكرا لك انتظر ردك

رابط هذا التعليق
شارك

نعم معاك حأ .... بس خد بالك التريجر ده على الداتا بيز مش على الفورم
ومش هيحصل غير في حالة الانسرت وا الابديت

يبقى هتغير بس وتضيف كلمة :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;




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

جرب كده

تم تعديل بواسطة abdu1_far
رابط هذا التعليق
شارك

التريغر لا يقبل العمل ويعطيني الخطأ التالي مع انني راجعته حرف حرف
PLS-00103: Encountered the symbol "END" when expecting one of the
following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe

رابط هذا التعليق
شارك

لان حضرتك بتعمل SELECT في جدول وفي نفس الوقت بتعمل فيه ابديت او انسيرت
منطقيا الكود ده بيقولي ايه
في حالة الانسرت او الابديت ..... يعني كده الجدول معموله LOCK لانه في مود الانسرت او الابديت
وجوه التريجر بنقوله روح سلكت منه الجدول ، طب ازاي والجدول محجوز حاليا ... مطنقيا ما ينفعش
انت كده عايز تعمل 2 ترانزاكشن في نفس الواقت
طب الحل
هتستخدم ال PRAGMA

هتروح في الDECLARE وتزود السطر ده

PRAGMA AUTONOMOUS_TRANSACTION;
بس كده وجرب
لو ما استغلتش ياريت تبعت لي الجودل ده ، بس بلاش امتداد.RAR عشان مش هيفتح معايا هنا
جرب ياباشا

رابط هذا التعليق
شارك

لم يعمل الكود مع التعديل

مرفق الكود والجدول

لاتنسا ان رقم الموظف leave_emp_id
مربوط مع جدول الموظفين

تم تعديل بواسطة maher534510
رابط هذا التعليق
شارك

يا فندم التريجر شغال كويس
بس كلمة RAISE_APPLICATION_ERROR
كانت مكتوبه خطأ بس
وعادي ممكن تشيل
PRAGMA AUTONOMOUS_TRANSACTION;

جرب بس اكتب كلمة RAISE_APPLICATION_ERROR كده

انت بس كنت حاطط LL في كلمة APPLICATION ، هي المفروض LI

تم تعديل بواسطة abdu1_far
رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

السلام عليكم
مكتوب بالكود else بالاخير ما فائدتها ؟؟؟
انت عامل if مرتين
يعني مو لازم يكون عندك end if مرتين ؟؟؟

post-73694-1246972984_thumb.jpg

رابط هذا التعليق
شارك

مشكور يا حبيب فعلا كلمة else هي المشكلة كلها مشكورين جميعا صدقا اني اشعر عندما ادخل هذا المنتدى كأني في بيتي مشكورين كلكم اخواني واحبائي

رابط هذا التعليق
شارك

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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