الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

احتساب الاجازات كل سنة كيف ؟؟؟؟

Featured Replies

بتاريخ:

ياعم لا عبقري ولا حاجة ( ده بتيجي مع العمي طشاش ) :D
بس بجد الموضوع مش حكاية عبقرية ولا حاجة ، الموضوع كله انك تعرف تحلل المشكلة
لان تحليل المشكلة 90% من حلها ، مع ترتيب الافكار مش هنكون محتاجين غير الكود

على العموم جزاكم الله خيراً يافندم على الاطراء الجميل ده ( مع اني لا استحقه )
ربنا يتقبل منا جميعا ... ويجعل كل اعمالنا في ميزان حسناتنا
تقبل تحياتي .... ولو فيه مشكلة ظهرت ما تترددش انك تشاركنا معاك على طول
سلام يافندم

  • الردود 57
  • المشاهدات 8.6k
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

الصور المنشورة

بتاريخ:
  • كاتب الموضوع

اخواني الكرام

انا عملت تريغر جديد يقوم بجلب الاجازات للموظف لهذه السنة ومقارنتها مثل التريغر السابق
ولكن المشكلة انه يعطيني خطأ في التريغر والخطأ هو كالتالي :

ORA-01403: no data found
ORA-06512: at "HRMS.EMP_VACATION_YEARS", line 6
ORA-04088: error during execution of trigger 'HRMS.EMP_VACATION_YEARS'

هذا هو التريغر

CREATE OR REPLACE TRIGGER EMP_vacation_years
before INSERT
ON vacation
FOR EACH ROW
declare
v_years number;
v_kinds number;
v_sums number;
BEGIN
select sum(v.interval),
to_char(sysdate,'yyyy') - to_char(e.hire_date,'yyyy'),
e.emp_kind
into v_sums,v_years,v_kinds
from vacation v ,employees e
where 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;


كجملة استعلام شغال تمام ولكن لما نضعها في تريغر مش عارف ماذا يحدث ؟؟؟

بتاريخ:

يافندم ... مفيش اي داتا للموظف ده على جدول الاجازات اكيد
no_data_found
ياتعمل execption when no_data_found
اريت تقول ايه الغرض من التريجر ده
احنا قولن قبل كده ان لو الراجل ملهوش اجازات قبل كده مينفعش نربط بجدول الاجازات عشان هيكون null
ايه المطلوب من التريجر ده ؟؟

بتاريخ:
  • كاتب الموضوع

انا صراحة مكسوف منك لاني غلبتك معايا كتير

هذا التريغر يستعلم عن اجازات الموظف لهذه السنة فقط
التريغر شغال تمام ولكن المشكلة لما تكون اول اجازة للموظف لهذه السنة التريغر لا يعمل ويعطيني رسالة خطأ ما الحل علما انه لو كانت اول اجازة له اريد التأكد من ان مدة الاجازة المضافة تساوي رقم معين فقط

بتاريخ:

هتزود بعد السلكتايه

exception when no_data_found then
begin v_sums :=0;
end ;



معناها ايه ، يعني لو الراجل ده ما خدش اجازه قبل كده طلع لي عدد ايام اجازته خلال السنه ده =صفر
وبتاالي الراجل ده يستحق اجازه

انا بس عندي سؤال:
- هو انت عامل برضه التريجر التاني اللي احنا عملناه مع بعض ولا حذفته من على الجدول ، ولو لسه موجود طيب ليه مش عاملهم تريجر واحد ؟؟

بتاريخ:
  • كاتب الموضوع

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

بتاريخ:

اوك كده فهمتك
هتعمل EXCEPTION FVQI
بس هنمعل جواه SELECT WMP_KIND FROM EMP WHERE EMP_ID =:NEW.EMP_ID ;
كده جبنا نوع الموظف عايزين نجيب قيمة الاجازات المستحقة للموظف بناءاً على نوعه ، مش عارف انت بتحسبها ازاي ...
لو كان يستحق مثلا 14 يوم ، بعد جملة السلكتايه بتاعة نوع الموظف ده هتقوله V_SUM :=14 ;

كده انت بتقوله ايه ، لو الراجل ده ماخدش اجازة قبل كده ، روح هات لي نوع دوامه من جدول الموظفين ، وهات اقضي مدة اجازة ممكن ياخدها موظفي هذا الدوام ، وخللي المتغير V_SUM يساوي القيمة العظمى بتاعة الاجازة ده
بس وسيب بأه IF شتغل

ياترى فهمتني ولا لأ ؟
والله انا كان نفسي اعملهالك بس مشغول شويتين

بتاريخ:

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

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
وبالمثل كل الحالات الاخرى.
اتمنى يكون التيرجر واضح والشرح صحيح

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.