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

مطلوب تعديل في DataBase Trigger حسب طريقه الدفع

Featured Replies

بتاريخ:


السلام عليكم ورحمة الله وبركاته
يوجد فورم مشتريات لشركه تقوم بشراء سلع من موردين وتقوم بالدفع نقدا او آجلا او بشيكات
صورة الفورم :
(اضغط على اللنك اذا لم تظهر الصورة)
a><br>


ولدي 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

تم تعديل بواسطة linda_3loosh

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

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

بتاريخ:

السلام عليكم ورحمة الله وبركاته

لقد حملت الملف المرفق أكثر من مرة وحاولت فتح الملف ولكن يبدو أنه يوجد خلل في الملف المرفق

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

لم اتمكن من ارفاق الملف لانه rar فايل
اذا قمت بتسميه المف لـ ZIP ثم قمت برفعه للموقع فان الملف يعطب

او يمكن الطريقه ، حاولت ارفع على شكل fmb في رسالة
(فشلت عملية إرفاق الملف , غير مصرح لك بإرفاق هذا النوع من الملفات)

رفعت الملف على اللنك التالي
http://www.sendspace.com/file/uot7xz

تم تعديل بواسطة linda_3loosh

بتاريخ:

السلام عليكم ورحمة الله وبركاته

أختي الكريمة

كيف تكون النتيجة لو تم تغيير الكود التالي

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;




حيث إن اللغة العربية في الشاشات تظهر عندي كما يلي ؟؟؟؟؟؟؟؟

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

لا يحدث تغيير في رصيد المورد
قمت بفصل التريقر السابق لعدد 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 او كلا الحقلين

تم تعديل بواسطة linda_3loosh

بتاريخ:

السلام عليكم ورحمة الله وبركاته

أختي الكريمة

بعد التعامل مع الشاشات المرفقة تبين أن الخطأ هو الكود التالي


V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1;




حيث هذا الكود يأخذ القيمة القديمة ويطرح القيمة الجديد في حالة التعديل علي طريق الدفع

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

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

شكرا اخي جمال على الرد ، بالنسبة للعبارة

V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1
من اقتراح الأخ hanon_OCP -جزاه الله خيرا- وما يلي شرحه للعباره :

بدلا من كتابة IF STATMENT لعمل تشيك علي القيمة القديمة اكبر من الجديدة او اصغر منها يمكن اختزال ذلك في جملة واحدة عن طريق حساب الفرق
بطرح القيمة القديمة من الجديدة و اذا كان الفرق بالموجب بمعني انه تم زيادة القيمة الجديدة
فبضربه في -1 سيكون لدينا الفرق بالماينس مثال
القيمة الجديدة 12و القديمة 10
12-10=2
2*-1= -2
و عند جمع -2 مع الرصيد الموجود اذا كان مثلا 40
40+-2
سيكون الناتج 38
اي تم تخفيض الرصيد بقيمة التزويد
اما اذا كانت القيمة القديمة اكبر من الجديدة فسيكون الفرق
بالموجب
مثال
8-10=-2
و عند ضربه في -1 كالتالي
-1* -2=2
ستكون النتيجة 2
لان ضرب السالب في سالب بموجب
و النتيجة ستكون 2
التي عند جمعها مع الرصيد السابق سيصبح
40+2=42
اي تم تزويد الرصيد بالقيمة التي تم تقليلها
-- الى هنا ينتهي كلام الاخ hanon_OCP
احب ان اضيف انه في خلاصه الامر هذه العباره تعدل رصيد المورد عند حدوث UPDATE فقط
في انتظار تعقيبك وآراء الجميع

بتاريخ:

السلام عليكم ورحمة الله وبركاته

أختي الكريمة

إن كلام الاخ 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;

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


السلام عليكم ورحمة الله وبركاته
قمت اخيرا بعمل 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;
/


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

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

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

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

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

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.