بتاريخ: 21 سبتمبر 200619 سنة comment_79103 السلام عليكم ، لدي الجداول التاليه :1- جدول موردين 2- جدول خزينه 2- جدولين مشتريات (ماستر وديتيل) اكوادهم كالتالي :1- جدول الموردين : CREATE TABLE "NWARA"."IMPORTERS"( "IMP_ID" NUMBER(7) NOT NULL, "IMP_NAME" VARCHAR2(75) NOT NULL, "IMP_ADRS" VARCHAR2(255) NOT NULL, "IMP_PHONE" NUMBER(15) NOT NULL, "IMP_CREDIT" NUMBER(10) NOT NULL); 2- جدول الخزينه : CREATE TABLE "NWARA"."BURSARY"( "B_DATE" DATE NOT NULL, "CASH_IN" NUMBER(9) NOT NULL, "CASH_OUT" NUMBER(9) NOT NULL, "STOCK" NUMBER(9) NOT NULL); 3- أ- جدول المشتريات (ماستر) : CREATE TABLE "NWARA"."BUY_MSTR"( "B_DATE" DATE NOT NULL, "B_NAME" VARCHAR2(75) NOT NULL, "B_NO" NUMBER(10) NOT NULL, "IMP_ID" NUMBER(7), "B_TOTAL" NUMBER(10) NOT NULL, "PAY_MTHD" VARCHAR2(13) NOT NULL, CONSTRAINT "PK_BUY_MSTR" PRIMARY KEY("B_NO")); 3- ب - جدول المشتريات (ديتيل) : CREATE TABLE "NWARA"."BUY_DTLS"( "B_NO" NUMBER(10) NOT NULL, "CAT_NAME" VARCHAR2(30) NOT NULL, "CAT_TYPE" VARCHAR2(15) NOT NULL, "STORE_NO" NUMBER(2) NOT NULL, "PRICE" NUMBER(10) NOT NULL, "CAT_QUANT" NUMBER(7) NOT NULL, CONSTRAINT "FK_BUY_DTLS" FOREIGN KEY("B_NO") REFERENCES "NWARA"."BUY_MSTR"("B_NO")); وضعت Database Trigger يضيف جملة المشتريات (B_TOTAL) لحساب الموردين وفي نفس الوقت يخصم تلك القيمة من جدول الخزينه (يضيفها لحقل الصادر CASH_OUT ) و يحتوي على الكود التالي : CREATE OR REPLACE TRIGGER BURSARY_IMP_BALANCE_ADJ 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 IMP_ID = :NEW.IMP_ID ; UPDATE BURSARY SET CASH_OUT = CASH_OUT + :NEW.B_TOTAL WHERE TRUNC(B_DATE) = :NEW.B_DATE ; ELSIF DELETING THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID ; UPDATE BURSARY SET CASH_OUT = CASH_OUT - :OLD.B_TOTAL WHERE TRUNC(B_DATE) = :OLD.B_DATE ; ELSE V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :NEW.IMP_ID ; UPDATE BURSARY SET CASH_OUT = CASH_OUT + V_DIFF WHERE TRUNC(B_DATE) = :NEW.B_DATE ; END IF ; END ; / المشكلة انني اريد وضع آليه لطريقه الدفع اعتمادا على حقل في جدول المشتريات الماستر يسمي (PAY_MTHD) كالتالي :- اذا كان الدفع (نقدا=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) تخصم من الخزينه ولا تضاف لحساب المورد.- اذا كان الدفع (آجل=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) تضاف لحساب المورد ولا تخصم من الخزينه.- اذا كان الدفع (شيكات=PAY_MTHD) فإن جملة المشتريات (B_TOTAL) لا تخصم من الخزينه ولا تضاف لحساب المورد ولكن تذهب كسجل لفورم. اذا امكن التعديل في الـDatabase Trigger اعلاه او اي طريقه اخري ، وجزاكم الله خيرفي انتظار ردودكم !!! تقديم بلاغ
بتاريخ: 21 سبتمبر 200619 سنة comment_79136 ممكن اقترح على حضرتك شيى ممكن يكون هو الحل للموضوع اللى انت طالبهاولا ممكن نعمل check constrain pay_mthd وهو ان يتم ادخال ثلاثه رموز لطرق الدفع اى ثلاث طرق للدفع check(pay_mthd in ('cash','defered','chek')); تكون هذه القيم الثلاثه الواجب ادخالها فى هذا الحقليتم التعديل داخل trigger bursary_imp_adj paymeth buy_mstr.pay_methd%type; begin select pay_meth into paymeth from buy_mstr; if inserting then if pay_meth is 'cash' then --minus from bursary update Bursary set cash_out=cash_out+:new.b_total where trunc(B_date)=:new.b_date; elsif pay_meth is 'defered' then -- add to importer count update importers set imp_credit=imp_credit+:new.b_total where imp_id=:new.emp_id; elsif pay_meth is 'chek' then --add to form record end if; elsif deleting then --make chek as first statment to paymeth else --make chek as first statment to paymeth end if; end trigger_name; يتم كتابه هذا الكود مع عمل تكمله له حيث ان هذا الكود به فكره لحل هذا الموضوع تقديم بلاغ
بتاريخ: 23 سبتمبر 200619 سنة كاتب الموضوع comment_79191 اشكرك جدا خي المهندس ، وسأجرب فكرتك وان شاء الله تظبط معي ، بس ممكن شرح الكودpaymeth buy_mstr.pay_methd%type;لو سمحت ، لاني بعدل حسب ما ذكرت ،وجزاك الله خيرا تقديم بلاغ
بتاريخ: 24 سبتمبر 200619 سنة كاتب الموضوع comment_79271 لو سمحت وين ممكن نعمل الـ check constrain pay_mthd اللي تقول عليه ؟ تقديم بلاغ
بتاريخ: 24 سبتمبر 200619 سنة comment_79278 paymeth buy_mstr.pay_methd%type; معنى هذا الكلام ان هناك متغير اسمه paymeth له نفس نوع البيانات الموجوده فى عمود pay_meth الموجود فى جدول buy_mstr اما بالنسبه لاضافه constraint فيتم انشاءه بطريقتين اولا عند عمل انشاء للجدول فى البدايه يتم اضافه constraint على العمود الموجود فى هذا الجدول create table buy_mstr(col1,col2,col3,....,constraint constain_name check(pay_methd in ('cash','defered','shek')); او عن طريق اضافته اذا كان الجدول تم انشاءه من قبل alter table buy_mstr add constraint constain_name check(pay_methd in ('cash','defered','shek')); تم تعديل 24 سبتمبر 200619 سنة بواسطة al_mohands تقديم بلاغ
بتاريخ: 25 سبتمبر 200619 سنة comment_79308 الحل بسيط يا اخي الكريم هي إتشاء حقل جديد تحدد فية نوع عملية الدفع كما ذكرت فى السابق وعند الدفع تحدد العملية اذا كان نقدي تغيير كما قلت فى السابق واذا كان اجل تغيير كما تريد فى الجداول الاخري وهكذا اى ان الحقل الجديد يكون LIST VALUE قيمة 1 تعني نقدي 2 تعني اجل 3 تعني شيك وحسب النوع العملية يعطي نتيجةوالسلام عليكم وكل عام وانتم بخير تقديم بلاغ
بتاريخ: 25 سبتمبر 200619 سنة كاتب الموضوع comment_79337 قمت بالتعديل في التريقر BURSARY_IMP_BALANCE_ADJ كالتالي : CREATE OR REPLACE TRIGGER BURSARY_IMP_BALANCE_ADJ BEFORE INSERT OR DELETE OR UPDATE OF B_TOTAL ON BUY_MSTR FOR EACH ROW DECLARE V_DIFF NUMBER; PAYMETH BUY_MSTR.PAY_MTHD%TYPE; BEGIN SELECT PAY_MTHD INTO PAYMETH FROM BUY_MSTR; IF INSERTING THEN IF PAYMETH = 'CASH' THEN UPDATE BURSARY SET CASH_OUT = CASH_OUT + :NEW.B_TOTAL WHERE TRUNC(B_DATE) = :NEW.B_DATE ; ELSIF PAYMETH = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + :NEW.B_TOTAL WHERE IMP_ID = :NEW.IMP_ID ; END IF; ELSIF DELETING THEN IF PAYMETH = 'CASH' THEN UPDATE BURSARY SET CASH_OUT = CASH_OUT - :OLD.B_TOTAL WHERE TRUNC(B_DATE) = :OLD.B_DATE ; ELSIF PAYMETH = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT - :OLD.B_TOTAL WHERE IMP_ID = :OLD.IMP_ID ; END IF; ELSE V_DIFF:=(:OLD.B_TOTAL-:NEW.B_TOTAL)*-1; IF PAYMETH = 'CASH' THEN UPDATE BURSARY SET CASH_OUT = CASH_OUT + V_DIFF WHERE TRUNC(B_DATE) = :NEW.B_DATE ; ELSIF PAYMETH = 'DEFERED' THEN UPDATE IMPORTERS SET IMP_CREDIT = IMP_CREDIT + V_DIFF WHERE IMP_ID = :NEW.IMP_ID ; END IF; END IF; END; / ولكن عند تعبئة الفورم والحفظ تظهر الرساله التالية : INSERT INTO BUY_MSTR(B_DATE,B_NO,B_NAME,IMP_ID,PAY_MTHD,B_TOTAL) VALUES (:B_DATE,:B_NO,:B_NAME,:IMP_ID,:PAY_MTHD,:B_TOTAL) ورقم الخطاء : ORA-01403: no data found مرفق صورة للفورم اثناء التنفيذ ادناهملاحظة :قام الاخ khalideed باقتراح التعديل في الجدول BUY_MSTR كالتالي : alter table buy_mstr add constraint constain_name check(pay_methd in ('cash','defered','shek')); فهل يمكن ان يكون الخطاء من التعديل في انتظار ردودكم ، وجزاكم الله خيرا تقديم بلاغ
بتاريخ: 25 سبتمبر 200619 سنة comment_79350 السلام عليكم ورحمه الله وبركاتهبالنسبه لهذا الخطأ حدث بسبب الاستعلام عن طريقه الدفع فى حاله اضافه فاتوره insert اى انه لايمكن معرفه طريقه الدفع لفاتوره ليست مخزنه بالجدول اصلا فيجب فى حاله الاضافه insert ان يكون الشرط على القيمه الموجوده او التى اختارها المستخدم لطريقه الدفع من داخل item الموجود على الفورماما فى حاله التعديل او الحذف فيجب عمل الاستعلام كما هو لكى يتم معرفه طريقه الدفع ثم تحديد ما يجب عملهيتم استعمال هذا الكود فقط فى حاله التعديل او الحذف SELECT PAY_MTHD INTO PAYMETH FROM BUY_MSTR where B_NO=:old.B_NO; اما فى حاله الاضافه يتم عمل if :item_value='chek' then ........end if; اولا :- بالنسبه لاضافه constraint على حقل طريقه الدفع لكى يتم تخزيين احدى الثلاث طرق فقط ولكن يجب مراعاه عمل list داخل الفورم تكون بها ثلاث اختيارات تحدد من خلالها طريقه الدفع مع اعطاء values لها تساوى نفس القيم المضافه اثناء عمل constraint اى انه عند تخزيين قيم غير 'check'او 'defered' او 'shek' يحدث exception وهذا يفيد فى ان طريقه الدفع تخزن داخل الجدول وتكون متاحه لكى نحدد عن طريقها ما يحدث من تعديل او اضافه او حذف فى الجداول الاخرى ثانيا: يجب مراعاه ان المستخدم لا يدخل رقم فاتوره وان هذه الارقام تكون متاحه اوتوماتيكى من داخل الجدولكل عام وانتم بخير تم تعديل 25 سبتمبر 200619 سنة بواسطة al_mohands تقديم بلاغ
بتاريخ: 25 سبتمبر 200619 سنة كاتب الموضوع comment_79354 شكرا اخي al_mohands على الرد ، على حد علمي المتواضع ان الصيغة item_value : تعمل على PL/SQL او في الفورم وليس في Dtabase Trigger (اعذرني ان كنت مخطئة) لاني قمت بالتعديل في التريقر يقوم بالحفظ مع رسالة خطا :Warning: Trigger created with compilation errors.وعند فتح التريقر من خلال الفورم ومحاوله الحفظ هناك فإنه تظهر رسالة الخطاء التاليهPLS-00049: bad bind variable 'ITEM_VALUE'فهل يمكن التعديل في الصيغة (if :item_value='CASH' THEN) بحيث يعمل التريقر بصورة سليمة ؟وجزاكم الله خيرا تقديم بلاغ
بتاريخ: 26 سبتمبر 200619 سنة comment_79441 السلام عليكم ورحمه الله وبركاتهبالنسبه لموضع التريجر هلى هو على مستوى الفورم ام على مستوى البلوك او انه موجود على مستوى ايتم ممكن حضرتك تخلى التريجر على مستوى الفورم لانه اذا كان التريجر على مستوى الفورم اعتقد انه سيتعرف على اسماء العناصر الموجوده بالفورم اما بالنسبه item_value: هو اسم القائمه التى يتم من خلالها اختيار طريقه الدفع يعنى الاسم ده على حسب اسم list الموجوده فى الفورم اما لو ان التريجر الموجود على قاعده البيانات لا تتعرف على bind varaible من الممكن التغلب على هذا بانشاء function وهذه التى يتم استعمالها داخل التريجر وبالتأكيد هذه function تتعرف على bind variable الموجود بالفورم ويكون لها return typeوليكن رقم 1 او 2 او 3 ويشير كل رقم الى طريقه دفع ويتم داخل التريجر استخدام هذه function بدل من item_value:وان شاء الله هاجربها عملى وارد عليك فى اقرب وقت لان فعلا ما جربتهاشوشكرا تم تعديل 26 سبتمبر 200619 سنة بواسطة al_mohands تقديم بلاغ
بتاريخ: 27 سبتمبر 200619 سنة كاتب الموضوع comment_79570 شكرا مجددا للاخ al_mohands على التفاعل مع الموضوع وجزاك الله خير الثواب على مساعدتكك ، في سياق حوارك ذكرت شيكا عن تريقر على مستوي الفورم وكما تعلم فإن التريقر الذي نركز عليه هنا هو DataBase Trigger ، هل كنت تعني تريقر آخر يقوم بالعمليه ككل ام يقوم باستدعاء الداله (التي وصفت ) ؟ تقديم بلاغ
بتاريخ: 3 أكتوبر 200619 سنة كاتب الموضوع comment_80052 في انتظار الـ function الي ذكرها الاخ المهندس ومرسي خالص ليه ، بس كنت عايزه اذا في طرق اخري ممكن يعرفوها الاخوه الاعضاء تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.