بتاريخ: 14 يوليو 200917 سنة comment_163217 ياعم لا عبقري ولا حاجة ( ده بتيجي مع العمي طشاش ) بس بجد الموضوع مش حكاية عبقرية ولا حاجة ، الموضوع كله انك تعرف تحلل المشكلة لان تحليل المشكلة 90% من حلها ، مع ترتيب الافكار مش هنكون محتاجين غير الكود على العموم جزاكم الله خيراً يافندم على الاطراء الجميل ده ( مع اني لا استحقه ) ربنا يتقبل منا جميعا ... ويجعل كل اعمالنا في ميزان حسناتناتقبل تحياتي .... ولو فيه مشكلة ظهرت ما تترددش انك تشاركنا معاك على طول سلام يافندم تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة كاتب الموضوع comment_163305 اخواني الكرام انا عملت تريغر جديد يقوم بجلب الاجازات للموظف لهذه السنة ومقارنتها مثل التريغر السابق ولكن المشكلة انه يعطيني خطأ في التريغر والخطأ هو كالتالي : ORA-01403: no data foundORA-06512: at "HRMS.EMP_VACATION_YEARS", line 6ORA-04088: error during execution of trigger 'HRMS.EMP_VACATION_YEARS'هذا هو التريغر CREATE OR REPLACE TRIGGER EMP_vacation_yearsbefore INSERTON vacationFOR EACH ROWdeclarev_years number;v_kinds number;v_sums number;BEGINselect sum(v.interval),to_char(sysdate,'yyyy') - to_char(e.hire_date,'yyyy'),e.emp_kindinto v_sums,v_years,v_kindsfrom vacation v ,employees ewhere e.emp_id=:new.emp_id and e.emp_id =v.emp_id and to_char(:new.DATE_FROM,'yyyy')=to_char(sysdate,'yyyy') group by e.hire_date , e.emp_kind;if v_kinds = 1 and v_sums >=14 then raise_application_error(-20211,'???????? ????'); end if; end;كجملة استعلام شغال تمام ولكن لما نضعها في تريغر مش عارف ماذا يحدث ؟؟؟ تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة comment_163307 يافندم ... مفيش اي داتا للموظف ده على جدول الاجازات اكيدno_data_found ياتعمل execption when no_data_found اريت تقول ايه الغرض من التريجر ده احنا قولن قبل كده ان لو الراجل ملهوش اجازات قبل كده مينفعش نربط بجدول الاجازات عشان هيكون nullايه المطلوب من التريجر ده ؟؟ تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة كاتب الموضوع comment_163310 انا صراحة مكسوف منك لاني غلبتك معايا كتير هذا التريغر يستعلم عن اجازات الموظف لهذه السنة فقطالتريغر شغال تمام ولكن المشكلة لما تكون اول اجازة للموظف لهذه السنة التريغر لا يعمل ويعطيني رسالة خطأ ما الحل علما انه لو كانت اول اجازة له اريد التأكد من ان مدة الاجازة المضافة تساوي رقم معين فقط تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة comment_163315 هتزود بعد السلكتايه exception when no_data_found then begin v_sums :=0; end ; معناها ايه ، يعني لو الراجل ده ما خدش اجازه قبل كده طلع لي عدد ايام اجازته خلال السنه ده =صفروبتاالي الراجل ده يستحق اجازه انا بس عندي سؤال:- هو انت عامل برضه التريجر التاني اللي احنا عملناه مع بعض ولا حذفته من على الجدول ، ولو لسه موجود طيب ليه مش عاملهم تريجر واحد ؟؟ تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة كاتب الموضوع comment_163316 اخي الحبيبانا الان بدي اعمل استعلام عن اجازات الموظف لهذه السنة فقط حسب sysdate المشكلة لما يكون الموظف ماخذ اجازات خلال هذه السنة الكود شغال لانه بيلاقي بيانات ولكنالمشكلة انه لما تكون اول اجازة له ويريد ان يأخذ اكثر من الحد المسموح به يسمح له التريغر وهذا ما لا اريدهاريد ان يفحص المدة هل فهمت عليي؟؟؟ تقديم بلاغ
بتاريخ: 15 يوليو 200917 سنة comment_163321 اوك كده فهمتك هتعمل EXCEPTION FVQI بس هنمعل جواه SELECT WMP_KIND FROM EMP WHERE EMP_ID =:NEW.EMP_ID ;كده جبنا نوع الموظف عايزين نجيب قيمة الاجازات المستحقة للموظف بناءاً على نوعه ، مش عارف انت بتحسبها ازاي ... لو كان يستحق مثلا 14 يوم ، بعد جملة السلكتايه بتاعة نوع الموظف ده هتقوله V_SUM :=14 ;كده انت بتقوله ايه ، لو الراجل ده ماخدش اجازة قبل كده ، روح هات لي نوع دوامه من جدول الموظفين ، وهات اقضي مدة اجازة ممكن ياخدها موظفي هذا الدوام ، وخللي المتغير V_SUM يساوي القيمة العظمى بتاعة الاجازة ده بس وسيب بأه IF شتغل ياترى فهمتني ولا لأ ؟والله انا كان نفسي اعملهالك بس مشغول شويتين تقديم بلاغ
بتاريخ: 16 يوليو 200917 سنة comment_163456 سلام عليكمكيفك اخر ماهر ... هل مشكلتك اتحلت ام لا على العموم انا عملت لك التريجر ... بس ازايانا سألتك الاول هل التريجر اللي احنا كنا عاملينه لسه موجود ولا لأ انا افترضت انه لسه موجود وعدلت عليه ، بحيث يروح يشوف اجازات الموظف خلال السنة ، وألغي التريجر التاني بأه مش محتاجينه ده التريجر بعد التعديل CREATE OR REPLACE TRIGGER EMP_VACATION BEFORE INSERT ON VACATION REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE empid NUMBER; v_id NUMBER; v_hd DATE; v_year DATE; v_interval NUMBER; v_kind NUMBER; v_years NUMBER; V_EMP_FOUND NUMBER ; V_INTERVAL_SUM NUMBER; -----------vacation----------------------- CURSOR EMP_FOUND IS SELECT 1 FROM vacation v WHERE V.EMP_ID =:NEW.EMP_ID; CURSOR emp_vacation IS SELECT e.EMP_ID, v.ID, e.hire_date, DECODE (TO_CHAR (e.hire_date, 'YYYY'), TO_CHAR (SYSDATE, 'YYYY'), e.hire_date, ADD_MONTHS (e.hire_date, (TO_DATE (SYSDATE) - TO_DATE (e.hire_date) ) / 31 ) - 365 ) last_yeer, v.INTERVAL, v.date_from - e.hire_date, e.emp_kind FROM employees e, vacation v WHERE v.emp_id = :NEW.emp_id AND e.EMP_ID = v.emp_id AND ( v.date_from <= SYSDATE AND v.date_from >= DECODE (TO_CHAR (e.hire_date, 'YYYY'), TO_CHAR (SYSDATE, 'YYYY'), e.hire_date, (ADD_MONTHS (e.hire_date, ( TO_DATE (SYSDATE) - TO_DATE (e.hire_date) ) / 31 ) ) - 365 ) ); --------------------------------------- BEGIN OPEN EMP_FOUND; FETCH EMP_FOUND INTO V_EMP_FOUND; CLOSE EMP_FOUND; IF V_EMP_FOUND IS NULL THEN v_interval := :NEW.INTERVAL ; SELECT E.EMP_KIND,(TO_DATE(SYSDATE)-TO_DATE(E.HIRE_DATE)) INTO v_kind ,v_years FROM employees E WHERE E.EMP_ID =:NEW.EMP_ID ; ELSE OPEN emp_vacation; LOOP FETCH emp_vacation INTO empid, v_id, v_hd, v_year, v_interval, v_years, v_kind; EXIT WHEN emp_vacation%NOTFOUND; END LOOP; BEGIN SELECT SUM(V.INTERVAL) INTO V_INTERVAL_SUM FROM VACATION V WHERE V.EMP_ID = :NEW.EMP_ID AND TO_CHAR(V.DATE_FROM,'YYYY')=TO_CHAR(:NEW.DATE_FROM ,'YYYY'); EXCEPTION WHEN NO_DATA_FOUND THEN V_INTERVAL_SUM := 0; END ; END IF ; IF v_kind = 1 AND v_years <= 365 AND (v_interval >= 14 OR NVL(V_INTERVAL_SUM,0)>=14) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 14 يوم '); ELSIF v_kind = 1 AND v_years BETWEEN 366 AND 730 AND( v_interval >= 17 OR NVL(V_INTERVAL_SUM,0)>=17) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من17 يوم '); ELSIF v_kind = 1 AND v_years BETWEEN 731 AND 1095 AND (v_interval >= 20 OR NVL(V_INTERVAL_SUM,0)>=20) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 20 يوم '); ELSIF v_kind = 1 AND v_years >= 1096 AND (v_interval >= 21 OR NVL(V_INTERVAL_SUM,0)>=21) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 21 يوم '); ELSIF v_kind = 2 AND v_years <= 365 AND (v_interval >= 7 OR NVL(V_INTERVAL_SUM,0)>=7) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من7 يوم '); ELSIF v_kind = 2 AND v_years BETWEEN 366 AND 730 AND (v_interval >= 10 OR NVL(V_INTERVAL_SUM,0)>=10) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 10 يوم '); ELSIF v_kind = 2 AND v_years BETWEEN 731 AND 1095 AND (v_interval >= 13 OR NVL(V_INTERVAL_SUM,0)>=13) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 13 يوم '); ELSIF v_kind = 2 AND v_years BETWEEN 1096 AND 1460 AND (v_interval >= 16 OR NVL(V_INTERVAL_SUM,0)>=16) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 16 يوم '); ELSIF v_kind = 2 AND v_years BETWEEN 1461 AND 1826 AND (v_interval >= 19 OR NVL(V_INTERVAL_SUM,0)>=19) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 19 يوم '); ELSIF v_kind = 2 AND v_years >= 1827 AND (v_interval >= 21 OR NVL(V_INTERVAL_SUM,0)>=21) THEN raise_application_error (-20211, 'ممنوع اخذ اجازة اكثر من 21 يوم '); END IF; CLOSE emp_vacation; ------------------------------------------------------------------------------ END; عشان اشرح انا عملت ايه بالظبط ، فكرك احنا حللنا التريجر الاول خالص ازاياحنا كنا بنروح نبص الراجل ده نازل له ريكورد قبل كده في جدول الاجازات ولا لأ .... واتفقنا قبل كده انه لو مش نازله هنسيب الIF تشتغل زي ما انت كنت كاتبها .طب لو ليه ريكورد قبل كده هنروح نوشف الراجل ده يستحق كام ايام اجازة خلال السنة ، ونسيب برضه ال IF JAJYG ]ده اللي كان في التريجر قبل كده انا زودت عليه حته زيادة ، ان الحالة التانية لو الراجل كان نازل له ريكورد قبل كده ، نروح نعرف عدد ايام الاجازة اللي خدها بالفعل خلال العام ده ، طب ليه ما زودناش الكلام ده في الحالة الاولى ، لانه بكل بساطة في الحالة الاولى لسه لم يسجل له ولا ريكورد واحد معنى كده انه لسه ما اخدش اجازةبعد ما بجيب عدد ايام الاجازة اللي اخذها بالفعل خلال العام ، زودت حته على كل الIF للي تحت ، بدل ما كونت بقلوه AND INTINTERVAL >= 14 مثلاً ، بقيت اقوله لو القيمة المدخلة اكتر من او يساوي 14 او قيم مجموع الايام اللي خدها الموظف خلال العام اكبر من او يساوي 14 وبالمثل كل الحالات الاخرى.اتمنى يكون التيرجر واضح والشرح صحيح تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.