بتاريخ: 20 نوفمبر 200619 سنة comment_83532 السلام عليكم ورحمة الله وبركاتهيوجد فورم مشتريات لشركه تقوم بشراء سلع من موردين وتقوم بالدفع نقدا او آجلا او بشيكاتصورة الفورم :(اضغط على اللنك اذا لم تظهر الصورة)ولدي DataBase Trigger يقوم بالتعديل في رصيد المورد حسب طريقه الدفعوذلك حسب الكود التالي :بحيث يقوم بالتعديل في رصيد المورد في حاله ان المحل قد اشتري منه دون دفع (آجل) المفروض انه عند التعديل في حقل طريقه الدفع PAY_MTHD لسجل محفوظ مسبقا وتغيير قيمته (نقدا او شيكات) ان يقوم بخصم القيمه B_TOTAL من رصيد المورد IMP_CREDIT ، المشكلة انه عند التعديل (when updating form) وتغيير طريقع الدفع لا يتم تغيير حساب المورد علما انه اذا ظلت قيمة PAY_MTHD كما هي (آجل ) فإن الفورم يعمل بصوره صحيحهارجوا الإفاده من ذوي الخبرهفورم المشتريات وفورم الموردين والجداول في المرفقات CREATE OR REPLACE TRIGGER ADJUST_IMP_BAL BEFORE INSERT OR DELETE OR UPDATE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE :NEW.PAY_MTHD = 'DEFERED' AND IMP_ID = :NEW.IMP_ID; ELSIF DELETING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE :OLD.PAY_MTHD = 'DEFERED' AND IMP_ID = :OLD.IMP_ID; ELSE -- IF UPDATING TABLE DO V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; IF :NEW.PAY_MTHD <> 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :OLD.IMP_ID; END IF; END IF; END; / FORM.ZIP تم تعديل 20 نوفمبر 200619 سنة بواسطة linda_3loosh تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة كاتب الموضوع comment_83611 احب ان اضيف انه اذا اي شخص عنده تعديل او فكره احسن ممكن ينورنا تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة comment_83619 السلام عليكم ورحمة الله وبركاتهلقد حملت الملف المرفق أكثر من مرة وحاولت فتح الملف ولكن يبدو أنه يوجد خلل في الملف المرفق تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة كاتب الموضوع comment_83634 لم اتمكن من ارفاق الملف لانه rar فايلاذا قمت بتسميه المف لـ ZIP ثم قمت برفعه للموقع فان الملف يعطباو يمكن الطريقه ، حاولت ارفع على شكل fmb في رسالة (فشلت عملية إرفاق الملف , غير مصرح لك بإرفاق هذا النوع من الملفات)رفعت الملف على اللنك التالي http://www.sendspace.com/file/uot7xz تم تعديل 21 نوفمبر 200619 سنة بواسطة linda_3loosh تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة comment_83658 السلام عليكم ورحمة الله وبركاتهأختي الكريمةكيف تكون النتيجة لو تم تغيير الكود التالي IF :NEW.PAY_MTHD <> 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; بـ IF :NEW.PAY_MTHD = 'CASH' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'CHECKS' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; أي كما يلي CREATE OR REPLACE TRIGGER ADJUST_IMP_BAL BEFORE INSERT OR DELETE OR UPDATE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE :NEW.PAY_MTHD = 'DEFERED' AND IMP_ID = :NEW.IMP_ID; ELSIF DELETING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE :OLD.PAY_MTHD = 'DEFERED' AND IMP_ID = :OLD.IMP_ID; ELSE -- IF UPDATING TABLE DO V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; IF :NEW.PAY_MTHD = 'CASH' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'CHECKS' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :OLD.IMP_ID; END IF; END IF; END; حيث إن اللغة العربية في الشاشات تظهر عندي كما يلي ؟؟؟؟؟؟؟؟ تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة كاتب الموضوع comment_83664 لا يحدث تغيير في رصيد الموردقمت بفصل التريقر السابق لعدد 2 تريقرواحد يقوم بالعمل في عمليه الإضافه والحذف ويحتوي على الكود التالي : CREATE OR REPLACE TRIGGER ADJUST_IMP_BAL BEFORE INSERT OR DELETE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE :NEW.PAY_MTHD = 'DEFERED' AND IMP_ID = :NEW.IMP_ID; ELSE UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE :OLD.PAY_MTHD = 'DEFERED' AND IMP_ID = :OLD.IMP_ID; END IF; END; / والثاني يعمل في حاله التعديل فقط ويحتوي على الكود التاالي : CREATE OR REPLACE TRIGGER ADJUST_IMP_UPDATE BEFORE UPDATE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; if :NEW.PAY_MTHD <> 'DEFERED' then UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - V_DIFF WHERE IMP_ID = :OLD.IMP_ID; ELSE UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :OLD.IMP_ID; END IF; END; / الاول يعمل بصورة صحيحه ، المشكله في ان التريقر الثاني يقوم بالتعديل في رصيد المورد فقط في حاله تغيير قيمه B_TOTAL ولا يعمل عند تغير طريقه الدفع PAY_MTHD او كلا الحقلين تم تعديل 21 نوفمبر 200619 سنة بواسطة linda_3loosh تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة comment_83701 السلام عليكم ورحمة الله وبركاتهأختي الكريمةبعد التعامل مع الشاشات المرفقة تبين أن الخطأ هو الكود التالي V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; حيث هذا الكود يأخذ القيمة القديمة ويطرح القيمة الجديد في حالة التعديل علي طريق الدفعحيث تكون القيم متساوية أي ينتج عن هذا الكود قيمة صفر وبالتالي لا يتغير حساب العميل تقديم بلاغ
بتاريخ: 21 نوفمبر 200619 سنة كاتب الموضوع comment_83715 شكرا اخي جمال على الرد ، بالنسبة للعبارةV_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1 من اقتراح الأخ hanon_OCP -جزاه الله خيرا- وما يلي شرحه للعباره :بدلا من كتابة IF STATMENT لعمل تشيك علي القيمة القديمة اكبر من الجديدة او اصغر منها يمكن اختزال ذلك في جملة واحدة عن طريق حساب الفرقبطرح القيمة القديمة من الجديدة و اذا كان الفرق بالموجب بمعني انه تم زيادة القيمة الجديدةفبضربه في -1 سيكون لدينا الفرق بالماينس مثالالقيمة الجديدة 12و القديمة 1012-10=22*-1= -2و عند جمع -2 مع الرصيد الموجود اذا كان مثلا 4040+-2سيكون الناتج 38اي تم تخفيض الرصيد بقيمة التزويداما اذا كانت القيمة القديمة اكبر من الجديدة فسيكون الفرقبالموجبمثال8-10=-2و عند ضربه في -1 كالتالي-1* -2=2ستكون النتيجة 2لان ضرب السالب في سالب بموجبو النتيجة ستكون 2التي عند جمعها مع الرصيد السابق سيصبح40+2=42اي تم تزويد الرصيد بالقيمة التي تم تقليلها -- الى هنا ينتهي كلام الاخ hanon_OCPاحب ان اضيف انه في خلاصه الامر هذه العباره تعدل رصيد المورد عند حدوث UPDATE فقط في انتظار تعقيبك وآراء الجميع تقديم بلاغ
بتاريخ: 22 نوفمبر 200619 سنة comment_83801 السلام عليكم ورحمة الله وبركاتهأختي الكريمةإن كلام الاخ hanon_OCP - جزاه الله خيرا وبارك له في أعمالهصحيح وذلك عندما تكون القيمة القديمة اكبر من الجديدة او اصغر منها يمكن اختزال ذلك في جملة واحدة عن طريق حساب الفرق أختي الكريمة جربي الكود التالي CREATE OR REPLACE TRIGGER ADJUST_IMP_BAL BEFORE INSERT OR DELETE OR UPDATE OF B_TOTAL , PAY_MTHD ON BUY_MSTR FOR EACH ROW BEGIN IF INSERTING THEN UPDATE IMPORTERS SET IMP_CREDIT = NVL(IMP_CREDIT,0) + :NEW.B_TOTAL WHERE :NEW.PAY_MTHD = 'DEFERED' AND IMP_ID = :NEW.IMP_ID; ELSIF DELETING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE :OLD.PAY_MTHD = 'DEFERED' AND IMP_ID = :OLD.IMP_ID; ELSE -- IF UPDATING TABLE DO IF :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - (:OLD.B_TOTAL - :NEW.B_TOTAL) WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'CASH' AND :OLD.PAY_MTHD = 'DEFERED' AND :OLD.B_TOTAL = :NEW.B_TOTAL OR :NEW.PAY_MTHD = 'CHECKS' AND :OLD.PAY_MTHD = 'DEFERED' AND :OLD.B_TOTAL = :NEW.B_TOTAL THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :NEW.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CASH' AND :OLD.B_TOTAL = :NEW.B_TOTAL OR :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CHECKS' AND :OLD.B_TOTAL = :NEW.B_TOTAL THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CASH' AND :OLD.B_TOTAL<>:NEW.B_TOTAL OR :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CHECKS' AND :OLD.B_TOTAL<>:NEW.B_TOTAL THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'CASH' AND :OLD.PAY_MTHD = 'DEFERED' AND :OLD.B_TOTAL<>:NEW.B_TOTAL OR :NEW.PAY_MTHD = 'CHECKS' AND :OLD.PAY_MTHD = 'DEFERED' AND :OLD.B_TOTAL<>:NEW.B_TOTAL THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; END IF; END IF; END; تقديم بلاغ
بتاريخ: 22 نوفمبر 200619 سنة كاتب الموضوع comment_83808 السلام عليكم ورحمة الله وبركاتهقمت اخيرا بعمل 2 Triggers كالتالي :واحد يقوم بالعمل في عمليه الإضافه والحذف ويحتوي على الكود التالي : والثاني يعمل في حاله التعديل فقط ويحتوي على الكود التاالي : CREATE OR REPLACE TRIGGER ADJUST_IMP_UPDATE BEFORE UPDATE ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; if :NEW.PAY_MTHD = 'CASH' AND :OLD.PAY_MTHD = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'CHECKS' AND :OLD.PAY_MTHD = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CASH' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; ELSIF :NEW.PAY_MTHD = 'DEFERED' AND :OLD.PAY_MTHD = 'CHECKS' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID; --THIS STATMENT WILL NOT UPDATE ANY THING ELSIF :NEW.PAY_MTHD = :OLD.PAY_MTHD AND :NEW.PAY_MTHD <>'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + 0 WHERE IMP_ID = :OLD.IMP_ID; ELSE UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :OLD.IMP_ID AND :OLD.PAY_MTHD = 'DEFERED'; END IF; END; / والحمد لله يعمل الآن بصوره صحيحهالا ان فكره الاخ jamal_rrkk في عمل تريقر واحد يقوم بالعمليه افضل من الناحيه البرمجيه حسبما اعتقد لان القيام بعمليات الإضافه والحذف والتعديل وفق الشروط المعنيه تكون اكثر احكاما في جسم واحدان شاء الله سأجرب كود الأخ جمال ومشكور جدا اخي جمال والله يوفقك CREATE OR REPLACE TRIGGER ADJUST_IMP_BAL BEFORE INSERT OR DELETE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE :NEW.PAY_MTHD = 'DEFERED' AND IMP_ID = :NEW.IMP_ID; ELSE UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE :OLD.PAY_MTHD = 'DEFERED' AND IMP_ID = :OLD.IMP_ID; END IF; END; / تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.