الانتقال إلى المحتوى
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.

مشكلة بالـCURSOR

Featured Replies

بتاريخ:

السلام عليكم ,,

لدي مشكلة بسيطة في جلب بيانات اكثر من جدول بداخل CURSOR فمثلا لدي الكود التالي
--------------------------------------------------
WHEN-NEW-FORM-INSTANCE

-----------------
declare


CURSOR cur IS
SELECT employee_id,EMPLOYEE_NAME,employee_salary
FROM EMPLOYEE
ORDER BY employee_id;


BEGIN
OPEN cur;
loop
FETCH cur INTO :employee_id,:emp_NAME,:sal;

:deduction:=(:sal/30)*nvl(:abs,0);
:total_income:=(:sal-nvl(:deduction,0));
next_record;
exit when cur%notfound;
end loop;
delete_record;
CLOSE cur;

end;

---------------------------
وظيفة هذا الكود يقوم عند فتح الفورم بعرض جميع بيانات الموظفين. اي ارقامهم واسمائهم ورواتبهم ,وبناء على ذلك اريد ان يحسب مقدار الخصم لكل موظف ليحسب صافي الرواتب

المطلوب اريد فقط قراءة ايام الغياب من جدول الغياب ,ويضعها بحقل ABS لكي يتم حساب الخصم

وشكرا لكم ,,

بتاريخ:

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

declare


CURSOR cur IS 
SELECT employee_id,EMPLOYEE_NAME,employee_salary sal
FROM EMPLOYEE
ORDER BY employee_id;


BEGIN
for i in cur loop
:employee_id:=i.employee_d;
:emp_NAME:=i.employee_name;
:sal:=i.sal;

:deduction:=(i.sal/30)*nvl(:abs,0);
:total_income:=(i.sal-nvl(:deduction,0));
next_record;
exit when cur%notfound; 
end loop;
CLOSE cur;

end;

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

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

بتاريخ:

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

declare


CURSOR cur IS 
SELECT employee_id,EMPLOYEE_NAME,employee_salary sal
FROM EMPLOYEE ORDER BY employee_id;

CURSOR ABS_EMP(EMP_ID VARCHAR2) IS
 SELECT count(*) abs_days from emp_absence where abs_employee_no=EMP_ID and to_char(abs_date,'mm') =to_char(:ur_current_date,'mm') and to_char(abs_date,'yyyy') =to_char(:ur_current_date,'yyyy');
/*
هنا يتم حساب عدد ايام التي غاب بها الموظف حسب الشهر والسنة حيث يرمز ل (:ur_current_date بأنه تاريخ الرواتب المراد احتسابها ويمكن استبدالها ب sysdate
ويتم الاستعلام حسب رقم الموظف 
*/

total_abs number:=0;

BEGIN for i in cur loop
:employee_id:=i.employee_id;
:emp_NAME:=i.employee_name;
:sal:=i.sal;
  open ABS_EMP( i.employee_id);
 fetch ABS_EMP into total_abs; --:deduction:=(i.sal/30)*nvl(:abs,0);
--هنا نستبدل السطر السابق والذي يحتوي على :abs واظن انه ايام الغياببهذا السطر
:deduction:=(i.sal/30)*nvl(total_abs,0);
:total_income:=(i.sal-nvl(:deduction,0));
next_record;
close ABS_EMP;
exit when cur%notfound; 

end loop;
CLOSE cur;

end;

--اظن ان هذا الكود يفي بالغرض وبالتوفيق

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

الف الف شكر لك اخي اسامة سوف اقوم بتجربه الكود ..


تحيااتي ,,

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

ضبط معي اخ اسامة ولكنه لا يعرض سوى فقط اول موظف برقمه واسمه وعدد ايام غيابه وراتبه
والموظف الاخر فقط يعرض اسمه ورقمه !!!

بتاريخ:

اختي الكريمة تم التعديل على الكود
فقط اغلقي الكيرسر close ABS_EMP; داخل ال loop لأنه يحضر البيانات في المرة الاولى عندما يستدعي ال cursor ABS_EMP ولايغلقه فيحدث خطأ
لذلك اصبح بعد التعديل بالشكل التالي

declare


CURSOR cur IS 
SELECT employee_id,EMPLOYEE_NAME,employee_salary sal
FROM EMPLOYEE ORDER BY employee_id;

CURSOR ABS_EMP(EMP_ID VARCHAR2) IS
SELECT count(*) abs_days from emp_absence where abs_employee_no=EMP_ID and to_char(abs_date,'mm') =to_char(:ur_current_date,'mm') and to_char(abs_date,'yyyy') =to_char(:ur_current_date,'yyyy');
/*
هنا يتم حساب عدد ايام التي غاب بها الموظف حسب الشهر والسنة حيث يرمز ل (:ur_current_date بأنه تاريخ الرواتب المراد احتسابها ويمكن استبدالها ب sysdate
ويتم الاستعلام حسب رقم الموظف 
*/

total_abs number:=0;

BEGIN for i in cur loop
:employee_id:=i.employee_id;
:emp_NAME:=i.employee_name;
:sal:=i.sal;
open ABS_EMP( i.employee_id);
fetch ABS_EMP into total_abs; --:deduction:=(i.sal/30)*nvl(:abs,0);
--هنا نستبدل السطر السابق والذي يحتوي على :abs واظن انه ايام الغياببهذا السطر
:deduction:=(i.sal/30)*nvl(total_abs,0);
:total_income:=(i.sal-nvl(:deduction,0));
next_record;
close ABS_EMP;
exit when cur%notfound; 

end loop;
CLOSE cur;

end;

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

جزاك الله خير اخي على حسن التعاون ,, ولكن احتجت الى حقل اضافي احسب فيه العمولات commission ويتطلب مني فصل الكيرسرات عن بعض لاحتياجي الى قراءة حقل الـ commission من جدول مبيعات الموظف وذلك بحساب sum(invoic) لكل موظف وعلى هذا الاساس يتم احتساب عمولة كل موظف بحيث
اذا كانت مبيعاته = 50.000 يضرب ب، 1%
او 100.000 يضرب ب 2%
او 150.000 يضرب بـ3%

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

اتمنى مساعدتي
وجزيتم خيرا

تحيااتي

بتاريخ:

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

declare


CURSOR cur IS 
SELECT employee_id,EMPLOYEE_NAME,employee_salary sal
FROM EMPLOYEE ORDER BY employee_id;

CURSOR ABS_EMP(EMP_ID VARCHAR2) IS
SELECT count(*) abs_days from emp_absence where abs_employee_no=EMP_ID and to_char(abs_date,'mm') =to_char(:ur_current_date,'mm') and to_char(abs_date,'yyyy') =to_char(:ur_current_date,'yyyy');
/*
هنا يتم حساب عدد ايام التي غاب بها الموظف حسب الشهر والسنة حيث يرمز ل (:ur_current_date بأنه تاريخ الرواتب المراد احتسابها ويمكن استبدالها ب sysdate
ويتم الاستعلام حسب رقم الموظف 
*/


cursor  comm_emp(emp_no varchar2) is
 select sum(inv_amt) from invoice
where emp_id=emp_no
 and to_char(inv_date,'mm') =to_char(:ur_current_date,'mm') and to_char(inv_date,'yyyy') =to_char(:ur_current_date,'yyyy');

/*
هنا يتم احتساب مجموع الفواتير حسب رقم الموظف وحسب التاريخ او الشهر والسنة وممكن تضيفي خيارات اخرى وحسب متطلبات العمل
*/

total_abs number:=0;
total_comm number:=0;

BEGIN
 for i in cur loop
       :employee_id:=i.employee_id;
       :emp_NAME:=i.employee_name;
       :sal:=i.sal;
    open ABS_EMP( i.employee_id);
    open ABS_EMP( i.employee_id);
  fetch ABS_EMP into total_abs; 

--:deduction:=(i.sal/30)*nvl(:abs,0);
--هنا نستبدل السطر السابق والذي يحتوي على :abs واظن انه ايام الغياببهذا السطر
   :deduction:=(i.sal/30)*nvl(total_abs,0);
  open comm_emp(i.employee_id);

  fetch comm_emp into total_comm;
  if total_comm between 0 and 50000 then
    total_comm=total_comm * 1 / 100;
  elsif total_comm between 51000 and 100000 then
    total_comm=total_comm * 2 / 100;
  elsif total_comm between 101000 and 150000 then
    total_comm=total_comm * 3 / 100;
  end if;

 next_record;
  close ABS_EMP;
  close comm_emp;
   :emp_commsion :=total_comm;  --هذا الحقل لاظهار العمولة

    :total_income:=(i.sal-nvl(:deduction,0)) + total_comm; --هنا نضيف العمولة مع الخصم
  
exit when cur%notfound; 

end loop;
CLOSE cur;

end;


وخبرينا بالنتائج

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

جزااك الله خيرا اخ اسامة على حسن استجابتك وتعاونك

راح اجرب الكود واخبرك بالنتايج ان شالله

تحيااتي,,

بتاريخ:

مرحبا

بس حبيت اشكر الاخ اسامة على الشرح

ما قصر و الله

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

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

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

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

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

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.