بتاريخ: 22 مايو 200619 سنة comment_69936 السلام عليكم ,,لدي مشكلة بسيطة في جلب بيانات اكثر من جدول بداخل 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; loopFETCH 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 لكي يتم حساب الخصم وشكرا لكم ,, تقديم بلاغ
بتاريخ: 22 مايو 200619 سنة comment_69947 اخت الكريمة جربي هذا التعديل على 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; تقديم بلاغ
بتاريخ: 22 مايو 200619 سنة كاتب الموضوع comment_69973 جزاك الله خيرا اخ اسامة ولكن كيف اقرا الغياب لكل موظف بجدول الغياب لكي تتم المعادلة صحيحة؟ تقديم بلاغ
بتاريخ: 23 مايو 200619 سنة comment_70003 الاخت الكريمةلنقل ان جدول الغياب نسميه 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; --اظن ان هذا الكود يفي بالغرض وبالتوفيق تقديم بلاغ
بتاريخ: 23 مايو 200619 سنة كاتب الموضوع comment_70053 الف الف شكر لك اخي اسامة سوف اقوم بتجربه الكود ..تحيااتي ,, تقديم بلاغ
بتاريخ: 24 مايو 200619 سنة كاتب الموضوع comment_70180 ضبط معي اخ اسامة ولكنه لا يعرض سوى فقط اول موظف برقمه واسمه وعدد ايام غيابه وراتبه والموظف الاخر فقط يعرض اسمه ورقمه !!! تقديم بلاغ
بتاريخ: 25 مايو 200619 سنة comment_70190 اختي الكريمة تم التعديل على الكودفقط اغلقي الكيرسر 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; تقديم بلاغ
بتاريخ: 27 مايو 200619 سنة كاتب الموضوع comment_70445 جزاك الله خير اخي على حسن التعاون ,, ولكن احتجت الى حقل اضافي احسب فيه العمولات commission ويتطلب مني فصل الكيرسرات عن بعض لاحتياجي الى قراءة حقل الـ commission من جدول مبيعات الموظف وذلك بحساب sum(invoic) لكل موظف وعلى هذا الاساس يتم احتساب عمولة كل موظف بحيثاذا كانت مبيعاته = 50.000 يضرب ب، 1%او 100.000 يضرب ب 2%او 150.000 يضرب بـ3%المطلوب عمل ثلاث كيرسرات الاول لجب ارقام الموظفين واسمائهم والاخر لجلب الغياب والثالث لجلب العمولات وبذلك تضاف العمولة على الراتب اريد فقط فصل كود الكيرسر السابق واضافه كيرسر منفصل للعمولات لحساب صافي الراتب اتمنى مساعدتي وجزيتم خيرا تحيااتي تقديم بلاغ
بتاريخ: 28 مايو 200619 سنة comment_70462 اختي الكريمة ممكن اضافة كيرسر اخر لحساب العمولة دون الحاجة لفصلها ويتم بالشكل التالي 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; وخبرينا بالنتائج تقديم بلاغ
بتاريخ: 28 مايو 200619 سنة كاتب الموضوع comment_70556 جزااك الله خيرا اخ اسامة على حسن استجابتك وتعاونك راح اجرب الكود واخبرك بالنتايج ان شالله تحيااتي,, تقديم بلاغ
بتاريخ: 29 مايو 200619 سنة comment_70688 مرحبابس حبيت اشكر الاخ اسامة على الشرح ما قصر و الله تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.