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

أضافة علاوة كل سنة


سلطان الحارثي

Recommended Posts

السلام عليكم ورحمة الله وبركاته
اريد دالة تعمل الأتي :
تزيد على الرتب العلاوة السنوية 200 ريال عندما يكمل الموظف سنة من تاريخ التعيين في جدول الموظفين.
تاريخ تعيين الموظف 1/8/1425
هل ممكن ؟؟
اسم الجدول emp
رقم الموظف empno
اسم الموظف empname
تاريخ التعيين constart
الراتب salary

مع العلم ان عمود التاريخ من نوع number عدد خاناتة 8
يمكن استخدام دالة substr ؟

ارجو ان اكون اوظحت المشكلة

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

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

هى ممكن تكون مش صح اوى بس انت ممكن تظبطها

ايهاب وجدى

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

عزيزي سلطان الحارثي
السلام عليكم ورحمة الله وبركاته:-
اولا- هل عندما تجلب تاريخ الجهاز الى برنامجك هجري – ام ميلادي
ا ذا كان ميلادي لابد من تحويله اولا الى هجري حيث توجد داله في المنتدى تعمل التحويل
بعدة طرق0
اذا الكلام على اساس انه عربي:-
حول التاريخ الى رقم هكذا
حقل تاريخ الجهاز الذي اتفقنا على انه هجري اسمه date1 امامنا هكذا 01/08/1425
Declare
DATE_date number(8);
begin
:GLOBAL.DATE_date :=substr(:DATE1,1,4) *354 + substr(:DATE1,6,2)* 30 + substr(:DATE1,9,2)* 1;
exception
when VALUE_ERROR then null;
end;
اذا حولنا تاريخ الجهاز الهجري الذي اسمه date1 الى رقم واصبح عام واسمه GLOBAL.DATE_date
ثانيا - أعمل المقارنه بينه وبين الحقل في الجدول emp واسمه constart
واعتقد ان المقارنه سهله جدا
بالتوفيق ياخي ،،،،،،،،،

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

السلام عليكم "

صديقي سلطان, انت بحاجة هنا الى 3 أمور :
1) فنكشن او شاشة مستقلة تعمل لها تنفيذ لتعمل على زيادة راتب الموضفين الذين يستحقون ذلك بمقدار الزيادة 200 ريال .

2) اضافة عمود جديد يمثل تاريخ اخر زيادة لنسمه مثلا Last_increase_salary . و في البداية قبل تشغيل البرنامج وتنفيذ الفنكشن يجب ان يكون هذا الحقل الجديد يحتوي على اخر تاريخ الزيادة لجميع الموظفين , لأننا سوف نستخدمه لاحقا لتحديد ان الموظف متى تم اخذ اخر زيادة له ثم اذا كان يستحق هذة الزيادة عمل update على التاريخ ووضع تاريخ الزيادة الجديدة .. وهكذا على مستوى كل موظف , وكذلك في كل سنة .

3) عرف item على الفنكشن وادخل به تاريخ الزيادة السنوية لشهر معين . لنسمه enter_increase_date ثم ..
طبعا في داخل الفنكشن عمل cursor على أرقام الموظفين , شرط ان يكون الفرق بينهما سنة Last_increase_salary- enter_increase_date = 1 year

أذا تحقق الشرط اعمل

,update emp set salary = salary +200
Last_increase_salary = Last_increase_salary + 1 year
where empno = i.empno

وفقط ..
بذلك تكون حققت الزيادة المطلوبة للموظف في كل سنة بموعدها .

والسلام عليكم .

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

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

فقط أريد أن أعطيك الجداول والباكيج المسويه ولكن أن خارج مدينة الرياض
فقط أمهلني 5 أيام لحين العودة وإن شاء الله لن أبخل عليك

ولكن لاتنسى الدعاء حتى ذلك الحين

والله الموفق

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

أولا : قم بإضافة حقلين في الجدول الرئيسي وهما

INCREMENT_FLAG_AFTER     NUMBER(5)
YEAR_ID  NUMBER(5);



وتقوم بعمل بروسيجر يعمل رن أتوماتيكي بحيث يعمل UPDATE كل سنة ويضع لكل موظف
وهكذا عند مناداة الأشخاص كل سنة تقوم بعمل UPDATE لتغيير السنة إلى السنة الحالية

أما الحقل الأول INCREMENT_FLAG_AFTER فعند تحويل السنة تكون القيمة 1
وعند منح الموظفين علاوة تتحول إلى 2

فبهذه الحالة عند مناداة البروسيجر لعمل علاوة تقوم بمناداة السنة والحالة تكون 1
وعكس ذلك لايقوم بالمناداة

وإليك البوسيجر الذي يقوم بعمل كل الذي ورد أعلاه


CREATE OR REPLACE PROCEDURE SET_NEW_YEAR
 IS
      CURSOR C1 IS SELECT year_id  FROM HR_PERSONS  ;
--    REC       C1%ROWTYPE;
        v_year_id   number;
 V_DATE    NUMBER;
 V_DATE_ARABIC       NUMBER;
 BEGIN
  SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYY','NLS_CALENDAR=''arabic Hijrah'''))  INTO V_DATE
  FROM DUAL;
     OPEN C1;
   LOOP
   FETCH C1 INTO v_year_id;
      IF v_year_id <>  V_DATE  THEN
         UPDATE HR_PERSONS SET YEAR_ID = V_DATE;

       UPDATE HR_PERSONS SET INCREMENT_FLAG_AFTER = 1;
       END IF;
  EXIT WHEN C1%NOTFOUND;
 END LOOP;
  CLOSE C1;
COMMIT;
 END;



:( :D

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

ابو الروض حبيبي
لازم يكون موقع االاكزت كوندشن بعد ما تعمل فش من الكيرزور
وشكراً


أولا : قم بإضافة حقلين في الجدول الرئيسي وهما
INCREMENT_FLAG_AFTER     NUMBER(5)
YEAR_ID  NUMBER(5);



وتقوم بعمل بروسيجر يعمل رن أتوماتيكي بحيث يعمل UPDATE كل سنة ويضع لكل موظف
وهكذا عند مناداة الأشخاص كل سنة تقوم بعمل UPDATE لتغيير السنة إلى السنة الحالية

أما الحقل الأول INCREMENT_FLAG_AFTER فعند تحويل السنة تكون القيمة 1
وعند منح الموظفين علاوة تتحول إلى 2

فبهذه الحالة عند مناداة البروسيجر لعمل علاوة تقوم بمناداة السنة  والحالة تكون 1
وعكس ذلك لايقوم بالمناداة 

وإليك البوسيجر الذي يقوم بعمل كل الذي ورد أعلاه


CREATE OR REPLACE PROCEDURE SET_NEW_YEAR
 IS
      CURSOR C1 IS SELECT year_id  FROM HR_PERSONS  ;
--    REC       C1%ROWTYPE;
        v_year_id   number;
 V_DATE    NUMBER;
 V_DATE_ARABIC       NUMBER;
 BEGIN
  SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYY','NLS_CALENDAR=''arabic Hijrah'''))  INTO V_DATE
  FROM DUAL;
     OPEN C1;
   LOOP
   FETCH C1 INTO v_year_id;
      IF v_year_id <>  V_DATE  THEN
         UPDATE HR_PERSONS SET YEAR_ID = V_DATE;

       UPDATE HR_PERSONS SET INCREMENT_FLAG_AFTER = 1;
       END IF;
  EXIT WHEN C1%NOTFOUND;
 END LOOP;
  CLOSE C1;
COMMIT;
 END;



:)  :blink:

77982[/snapback]


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

  • بعد 1 سنة...

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

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

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

×   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.

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

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

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