بتاريخ: 26 أغسطس 200619 سنة comment_77307 لدي جدول خزينه وجدول مشتريات وجدول مبيعات ، لدي DataBase Trigger يقوم بإضافه قيمه المبيعات s_total للوارد في الخزينه cash_in اعتمادا على تاريخ اليوم ، وكذلك خصم قيمة المشتريات b_total للصادر في الخزينه cash_out ايضا اعتمادا على تاريخ اليوم ، المشكله انه في كل يوم يجب ان احفظ قيم افتراضيه في جدول الخزينه حتي يعمل بصوره صحيحه كالتالي :التاريخ : (تاريخ اليوم الجديد)الوارد : 0الصادر : 0اريد ان احل هذه المشكله برمجيا ، فهل من فكره ؟ تقديم بلاغ
بتاريخ: 26 أغسطس 200619 سنة comment_77321 ربما من خلال تريقر يقوم بالبحث عن SYSDATE في آخر مره تم فيها الحفظ ، فإذا لم يوجد يقوم من خلال جمله IF بالحفظ في جدول الخزينه اكالتالي :التاريخ : SYSDATEالوارد = الصادر = 0لكني لا اعرف ذلك برمجيا ، اتمني من احد الاخوه وضع الكود تقديم بلاغ
بتاريخ: 26 أغسطس 200619 سنة comment_77333 عزيزي السلام عليكم ورحمة الله وبركاتة :-الفكرة تتخلص بالاتي نفس ال SQL التي تجريها يدويا يوميا في عملية الحفظتقوم بتعديل بسيط عليها في - Trigger ON-INSERT للجدولين المشتريات والمبيعات بمعنى اذا كان تاريخ العملية الذي يجريها المستخدم(الذي هو تاريخ اليوم) = تاريخ اخر عملية تمت يعمل UPDATE لجدول الخزينة0اذا كان تاريخ العملية (الذي هو تاريخ اليوم) <> تاريخ آخر علمية تمت يعمل INSERT لجدول الخزينة0بمعنى تجبر المستخدم ان يجري UODATE و INSERT على جدول الخزينة وهو لايعلم وممكن في DataBase Trigger تتم ايضا0 ولو اوضحت اسماء الجداول والحقول وال SQL سوف تجد الاجابة الشافيه عند الاعضاءوفوق كل ذي علم عليم 0بالتوفيق والسداد،،،،، تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة كاتب الموضوع comment_77359 جدول الخزينه : اسم الجدول bursaryالحقول :التاريخ b_dateالوارد cash_inالصادر cash_out تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة كاتب الموضوع comment_77360 اكمل المشاركة تم تعديل 27 أغسطس 200619 سنة بواسطة linda_3loosh تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة comment_77361 جربي هذا الكود (لم اجرب الكود ولكن ربما يعطي الفكره التي شرحتها مع اني اري فكره الاخ محمد الحيلان هي الاجمل) declare DATE1 DATE; DATE2 DATE; DATE3 DATE; begin select (max(nvl(BURSARY.B_DATE,SYSDATE))) into DATE1 from BURSARY; date2 := sysdate -1; date3 := sysdate -2; IF DATE1 = DATE2 THEN INSERT INTO BURSARY (b_DATE, CASH_IN, CASH_OUT, STOCK) VALUES(TO_DATE(SYSDATE,'DD/MM/YYYY'),0,0,0); message('تم تحديث التاريخ ليوم واحد.'); ELSE IF DATE1 = DATE3 THEN INSERT INTO BURSARY (b_DATE, CASH_IN, CASH_OUT, STOCK) VALUES(TO_DATE(SYSDATE,'DD/MM/YYYY'),0,0,0); message('تم تحديث التاريخ ليومين'); ELSE IF DATE1 = SYSDATE THEN message('لا تحتاج لتحديث.'); else message('التاريخ اقدم من يومين ، الرجاء مراجعة بيانات الخزينه.'); RAISE FORM_TRIGGER_FAILURE; end if; end if; end if; end; تم تعديل 27 أغسطس 200619 سنة بواسطة omdawebs تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة كاتب الموضوع comment_77363 قمت بالاستفادة من كود الاخ omdawebs وفكره الأخ محمد على الحيلاني ، فخرجت بالكود التالي : declare DATE1 DATE; begin select (max(nvl(BURSARY.B_DATE,SYSDATE))) into DATE1 from BURSARY; IF DATE1 = SYSDATE THEN message('لا تحتاج الخزينة للتحديث.'); ELSE IF DATE1 <> sysdate THEN INSERT INTO BURSARY (b_DATE, CASH_IN, CASH_OUT, STOCK) VALUES(TO_DATE(SYSDATE,'DD/MM/YYYY'),0,0,0); COMMIT; message('تم تحديث بيانات الخزينة.'); RAISE FORM_TRIGGER_FAILURE; end if; end if; end; ووضعتها في تريقر WHEN-NEW-FORM-INSTANCE لكن الفورم يفتح ويقفل ، فعملتها في BUSH BUTTON ، الكود يعمل بصوره ممتازه بس المشكله اني كل ما اضغط على البتون يقوم بانشاء ريكورد جديد في جدول الخزينه ، كما انني اريد وضعه في التريقر السابق للشاشه الرئيسية لو امكن ، فهل هناك اي تعديل في الكود ؟ تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة comment_77367 السلام عليكم ورحمة الله وبركاته هذا الـ trigger يقوم بمطابقة التاريخ حيث إذا لم يتطابق التاريخ يرجع بقيمة صفر وبالتالي يقوم بإدخال التاريخ والقيمة في جدول الخزينة اما اذا تطابق التاريخ فيرجع بقيمة واحد وبالتالي يقوم بتعديل القيمة فقط في جدول الخزينة حيث يجب تكرار الـ trigger بما يتناسب مع جدول المشتريات create or replace trigger t_bursary_s_total after insert on sales for each row declare aa number; begin select count(b_date) into aa from bursary where b_date = :new.s_date ; if aa = 0 then insert into bursary ( b_date , cash_in ) values (sales.s_date , sales.cash_in); elsif aa = 1 then update bursary set cash_in = bursary.cash_in + :new.cash_in where bursary.b_data = :new.s_date; else raise_application_error(-20001, 'التاريخ مكرر'); end if; end; aa number تم تعديل 27 أغسطس 200619 سنة بواسطة jamal_rrkk تقديم بلاغ
بتاريخ: 27 أغسطس 200619 سنة كاتب الموضوع comment_77372 عفوا اخي هذا الترقر يقوم بحساب عدد السجلات ، وانا اريد ان يتم تحديث الخزينه بتاريخ النظام SYSDATE ولم يعمل التريقر كما يجب تقديم بلاغ
بتاريخ: 28 أغسطس 200619 سنة comment_77403 السلام عليكم ورحمة الله وبركاتهلقد تم تطبيق و تعديل الكود السابق كما يلي create table sal ( s_date date , s_total number(12,3) ); create table pur ( p_date date , p_total number(12,3) ); create table bursary ( b_date date , cash_in number(12,3) , cash_out number(12,3) ); create or replace trigger t_bursary_sal before insert on sal for each row declare aa number ; begin select count(b_date) into aa from bursary where b_date = :new.s_date ; if aa = 0 then insert into bursary ( b_date , cash_in ) values ( :new.s_date , :new.s_total ); elsif aa = 1 then update bursary set cash_in = nvl(bursary.cash_in,0) + :new.s_total where bursary.b_date = :new.s_date; else raise_application_error(-20001,' التاريخ مكرر '); end if; end; create or replace trigger t_bursary_pur before insert on pur for each row declare aa number ; begin select count(b_date) into aa from bursary where b_date = :new.p_date ; if aa = 0 then insert into bursary ( b_date , cash_out ) values ( :new.p_date , :new.p_total ); elsif aa = 1 then update bursary set cash_out = nvl(bursary.cash_out,0) + :new.p_total where bursary.b_date = :new.p_date; else raise_application_error(-20001,' التاريخ مكرر '); end if; end; insert into sal values ( '01/01/06' , 1000 ); insert into pur values ( '01/01/06' , 1000 ); insert into sal values ( '01/01/06' , 2000 ); insert into pur values ( '02/01/06' , 1000 ); insert into sal values ( '02/01/06' , 5000 ); insert into sal values ( '03/01/06' , 10000 ); insert into pur values ( '03/01/06' , 15000 ); insert into sal values ( '04/01/06' , 99999 ); SQL> select * from bursary; B_DATE CASH_IN CASH_OUT -------- ---------- ---------- 01/01/06 3000 1000 02/01/06 5000 1000 03/01/06 10000 15000 04/01/06 99999 database_trigger.zip تقديم بلاغ
بتاريخ: 28 أغسطس 200619 سنة كاتب الموضوع comment_77417 الاخوه الكرام ، والله تعبت من الموضع ، وجزاك الله اخ jamal_rrkk على الرد المتعوب فيه ، بس المشكلة اني ما قدرت اكيف جوابك مع مشكلتي لاختلاف الجداول والمسميات والتريقرس ، على العموم مرفق لكم كل الجداول والفورمات في ملف مضغوط وبه ملف SQL اسمه BURSARY فيه التريقر اللي يجب التعديل فيه حتي يعمل بصوره صحيحه ، اريد التعليق على الكود لتوضيح المشكله وجزاكم الله خير BURSARY.ZIP تقديم بلاغ
بتاريخ: 29 أغسطس 200619 سنة comment_77506 السلام عليكم ورحمة الله وبركاتهأختي الكريمة عدلي الـ TRIGGERS COSTING_FOE BURSARY_CUS_BALANCE_ADJ BURSARY_IMP_BALANCE_ADJ بحيث يمكن من خلالها تحديث البيانات في حالة التعديل أو الحذف فقط وفي حالة الإدخال اكتبي ثلاثة TRIGGERS متعلقة بالإدخال مطابقة لكود الإدخال الذي تم توضحه أعلاهآما بالنسبة للكود أدناه فهو يرجع بقيمة NULL ولا يرجع بالتاريخ الحالي SYSDATE في حالة عدم وجود أي تاريخ في العامود select (max(nvl(BURSARY.B_DATE,SYSDATE))) from BURSARY; كما انه في حال كتابة الكود التالي INSERT INTO BURSARY (b_DATE, CASH_IN, CASH_OUT, STOCK) VALUES(TO_DATE(SYSDATE,'DD/MM/YYYY'),0,0,0); ومن ثم كتابة Delete from BURSARY where b_DATE = sysdate; Delete from BURSARY where b_DATE = ( select sysdate from dual ); لا يتم حذف أي صف رغم أنه تم أخذ التاريخ من الجهاز وهذا يعني انه لا يتحقق الشرط التالي IF DATE1 = SYSDATEلذلك تحدث المشكله اني كل ما اضغط على البتون يقوم بانشاء ريكورد جديد في جدول الخزينه تقديم بلاغ
بتاريخ: 29 أغسطس 200619 سنة comment_77519 عزيزيالسلام عليكم ورحمة الله وبركاته:-لم استطيع تحميل الملف المرفق في اخر مشاركهوعتقد ان كود الاخ jamal_rrkk هو الكود الصحيح المناسب 100% حيث تمت تجربتهويعمل بصوره رائعه0والاخ jamal_rrkk يستحق الشكر والعرفان بالجميل وأكثر الله من امثاله وجعل مايقوم بهفي موازين حسناته امين000وشكرا،،،،،،، تقديم بلاغ
بتاريخ: 2 سبتمبر 200619 سنة كاتب الموضوع comment_77763 اشكرك بكل المعاني اخي jamal_rrkk على المجهود وجعله الله في ميزان حسناتك ، سأوافيكم انشاء الله بالفورمات والنتائج في بوست كامل انشاء الله تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.