بتاريخ: 20 مايو 200817 سنة comment_129204 السلام عليكماخواني الكرام المشكلة هي اني كيف يتم التأثير على رصيد صنف بالمخزن عن طريق الفورمحيث هناك حالات عديدة لمعالجة هذا الامر1- حالة اضاف صنف الي الdata block sales_details و هذا سوف يقلل رضيد الصنف بالمخزن مع وجود شرط عدم بيع اكثر من الرصيد المتاح من ا لصنف في المخزن2- حالة تعديل كمية صنف موجود فعلا بالdata block sales_details و هذا سوف يقلل او يزيد من رضيد الصنف بالمخزن مع وجود شرط عدم بيع اكثر من الرصيد المتاح من ا لصنف في هذا المخزن2- حالة حذف صنف موجود فعلا بالdata block sales_details و هذا سوف يزيد من رضيد الصنف بالمخزن.هناك حالة اخرى في حالة التعديل على اذن بيعفمثلا هناك الصنف رقم 282 و هو مسجل بجدول sales details و قمنا بتعديل الصنف الي رقم 143 و هذا معناهاننا اولا حذفنا الصنف 282 ثم عملنا حركة اضافة صنف جديد هو الصنف رقم 143(نلاحظ ان هذه الحالة مركبة حيث انها عبارة عن حركة حذف صنف من جدول ال sales details و حركة اضافة الى جدول الـ sales details)اخواني حولت مرارا و تكرارا حل المشكلة باكثر من طريقة و لكن قلة خبرتي في الاوراكل تقف امامي بالرغم انني حولت البحث عبر النت ولكن مع الفشل لايجاد حل حقيقي لهذه المشكلةارجو المساعدة قدر المستطاع sales_work.zip تقديم بلاغ
بتاريخ: 24 مايو 200817 سنة comment_129497 بسم الله الرحمن الرحيممعذره أخى الـdmp file مشغال ياريت تحمله تانى .وأنا من رأيى إنك تعمل triggers على مستوى الـdatabase أفضل وتقدر تجمع كل الـdml اللى انت عايز تعملها فى trigger واحد . تقديم بلاغ
بتاريخ: 26 مايو 200817 سنة كاتب الموضوع comment_129629 جزاك الله خيرا اخيبس كيف اصنع هذا التريجر و في اي حدث اضعه ؟هل عند الضغط على زر commit from?ام اين؟هل ممكن مثال بسيط على هذه الفورمةتم تحديث الملف المرفق و ال dmpمنتظر ردك اخي الكريم sales.zip تقديم بلاغ
بتاريخ: 26 مايو 200817 سنة comment_129647 السلام عليكم ورحمة الله وبركاتهاخي فاللهبعد السلاممع اني مش فاهم مشكلتك بالظبط لكن ال trigger يوضع على مستوي الجدول في قاعدة البياناتويمكن عمله بعد اوقبل insert ,update and delete مع بعض وهتسال كالاتي if inserting then qty = :qty + :new_qty ; elsif updateing then qty = :qty + :new_qty - :old_qty; elsif delteing qty = :qty _ :new_qty ; end if; دا مثال توضيحي مش اكثر اعمل مابدكويمكن من الفورم بعد عمل اتصال بقاعدة البيانات الذهاب الى اسفل الشاشة هتلاقيdatabase objects تفتحها هتلاقي اسمي المستخدمين افتح المستخدم اللى عليه الاسكيما الخاصه بك ثم اختار tablesثم اختار الجدول اللى انت عايزه ولما تفتحه هتلاقي triggers افتحها اضغط على + = (create)من الازار اللى فالاسفل اختار newاو اكتب هذا الكود بعد ان تقوم بتعديل الى ما تشاء CREATE OR REPLACE TRIGGER YOUR_TRIGGER_NAME BEFORE DELETE OR INSERT OR UPDATE ON YOUR_TABLE_NAME REFERENCING NEW AS New OLD AS Old FOR EACH ROW BEGIN -- QTY ITS COLUMN QUANTITY IN YOUR_TABLE -- NEW_QTY ITS NEW VALUE FOR QUANTITY IN YOUR_TABLE -- OLD_QTY ITS OLD VALUE FOR QUANTITY IN YOUR_TABLE if inserting then qty = :qty + :new_qty ; elsif updateing then qty = :qty + :new_qty - :old_qty; elsif deleteing qty = :qty - :new_qty ; end if; END ins_upd_delete; / اتمن ان تجد ضالتك فهذه المشاركة المتواضعهوفقك الله الى ما تحب وترضي لاتسانا من صالح الدعاء تقديم بلاغ
بتاريخ: 26 مايو 200817 سنة كاتب الموضوع comment_129684 اخي الكريمارجو توضيح اكيركيف سوف يتم التأثير على جدول مخزن الاصناف بهذا الترحير طبعا الفكرة و المنطقية فاهما في الكود السابق و كلن مش فاهم كيفية التأثر بين الفورم و ال database trigger تقديم بلاغ
بتاريخ: 27 مايو 200817 سنة comment_129711 السلام عليكم ورحمة الله وبركاتهبعد التحيية اخي فالله مثال توضيحي اكثرعلى جدو المنصرف هذا التريجر --لو حركة خصم IF INSERTING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) - NVL(:NEW.FRM_QTY,0) WHERE ITEM_ID = :NEW.ITEM_ID; END IF; IF UPDATING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) + NVL(:OLD.FRM_QTY,0) - NVL(:NEW.FRM_QTY,0) , WHERE ITEM_ID = :NEW.ITEM_ID; END IF; IF DELETING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) + NVL(:OLD.FRM_QTY,0) , WHERE ITEM_ID = :NEW.ITEM_ID; END IF; على جدو الوارد هذا التريجر --لو حركة اضافة IF INSERTING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) + NVL(:NEW.FRM_QTY,0) WHERE ITEM_ID = :NEW.ITEM_ID; END IF; IF UPDATING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) - NVL(:OLD.FRM_QTY,0) + NVL(:NEW.FRM_QTY,0) , WHERE ITEM_ID = :NEW.ITEM_ID; END IF; IF DELETING THEN UPDATE WAREHOUSE_BALANCE SET QTY = NVL(QTY,0) - NVL(:OLD.FRM_QTY,0) , WHERE ITEM_ID = :NEW.ITEM_ID; END IF; اتمن ان تجد ضالتك فهذه المشاركة المتواضعهوفقك الله الى ما تحب وترضي لاتسانا من صالح الدعاء تقديم بلاغ
بتاريخ: 27 مايو 200817 سنة comment_129758 أخى الكريم wise .الـtrigger اللى انت المفروض هتعمله زى ما الأخ أحمد زين ذكره بالظبط ولكن انا كنت عايز أوضحلك حاجه .انت كنت بتسأل كيف يتم التأثير على الجدول بهذا الـtrigger .أخى الكريم فى triggers ممكن تتعمل على مستوى الفورم ودى طبعا معروفه اللى هى pre,post,when,on ودى انت بتعملها من خلال الفورمه نفسها .أما هذا النوع من الـtrigger اللى ذكره الأخ أحمد فده database trigger يعنى على مستوى الـdatabase وده الأفضل من وجهة نظرى .الـtrigger ده انت بتعمله من خلال أى برنامج مساعد مش من خلال الفورم .ممكن بالـsqlplus علشان ده عباره عن database triggers .ياريت أكون كده جوبت على سؤالك .... تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة كاتب الموضوع comment_129812 السلام عليكمجزاكم الله خيرا اخواني احمد زين و احمد فرغليالان انا فهمت ان حل موضوع الرصيد يأتي بحليين الحل الاول: هو عن طريق الفورمالحل الثاني : عن طريق الـ database trigger(جاري دراسته )فبدأت انا بالحل الاول و ظهرت المشكلة التالية :وصف المشكلة:قمت باضافة صنف جديد الي اذن البيع ،تم التحديث و التعديل بدون مشاكلبعد لحظة بعد تعديل كمية الصنف الذي قمت باضافته من قبل تظر المشكلة التالية:record has been updated by another user,re-query to see changeمرفق صورة بالمشكلةالان بحاول افهم موضوع trigger database و لحين فهم هذا الموضوع بحاول احل المشكلة على مستوع الفورمارجو المساعد ان امكنجزيتم عنا خيرا اخوانياخوكم محمود شديد القاهرة تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة comment_129838 السلام عليكم ورحمة الله وبركاتهبعد التحيةاخي فاللهاعتقد ان مشكلة هذه حلها في ان تقوم بكتابة هذا الكود بعد عمل insert and update or deleteاي بعد تاثيرك مباشرة فالجدول الاخر قوم بكتابة FORMM_DDL('COMMIT'); تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة comment_129839 السلام عليكم ورحمة الله وبركاتهبعد التحيةاخي فاللهاعتقد ان مشكلة هذه حلها في ان تقوم بكتابة هذا الكود بعد عمل insert and update or deleteاي بعد تاثيرك مباشرة فالجدول الاخر قوم بكتابة FORMS_DDL('COMMIT'); لعمل حفظ للحركات على هذا السجل وشكرا تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة كاتب الموضوع comment_129854 السلام عليكماخي الكريم احمد زين جربت الكود و لكن المشكلة مستمرةارجو التوضيح اكثر و رجاء ان كان هناك وقت تحميل الملف المرفق السابق رفعه و تحديد المشكلة تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة comment_129862 السلام عليكم ورحمة الله وبركاتهبعد التحيةاخي فاللهاعتقد ان حل مشكلة في عمل الاتيقم بنسخ محتويات التريقر المسمي post_update ووضعها فال pre_update وكذلك بالنسبة لل insertوقم بالغاء او تهميش كلا من post_update , post_insert بحيث يكون شغله كله ورا بعضه من pre_update بحيث يحفظ كل شئ سوياالرجاء اخباري اذا نجح معك هذا التعديل وشكرا تقديم بلاغ
بتاريخ: 28 مايو 200817 سنة كاتب الموضوع comment_129895 السلا م عليكم قمت بعمل ما طلبته منيو الغت حدث post update,post insertو لكن نفس المشكلة تحدث معي ...................معلش انا تعبتك معي يا احمدارجو الصبر معي تقديم بلاغ
بتاريخ: 29 مايو 200817 سنة comment_129973 السلام عليكم ورحمة الله وبركاتهبعد التحيةاخي فاللهالرجاء محاولة رفع الشاشة و dump file صغير يمكن تشغليها عليه وشكراالرجاء تجربة تريجر قاعدة البيانات وشكرا تقديم بلاغ
بتاريخ: 29 مايو 200817 سنة comment_129997 السلام عليكم ورحمة الله وبركاتهاخي الكريمراجع الرابط التاليhttp://www.araboug.org/ib/index.php?showto...13957&st=15جزاكم الله كل خير تقديم بلاغ
بتاريخ: 31 مايو 200817 سنة كاتب الموضوع comment_130110 السلام عليكم اخواني وسوف اذهب الي الرابط و اجيب لاحقا ان شاء الله تقديم بلاغ
بتاريخ: 31 مايو 200817 سنة كاتب الموضوع comment_130140 السلام عليكمجربت اسلوب ال databse triggerو هذه النماذج الخاصة شاشات تجريبية التصنيفات الرئيسيةالاصناف فاتورة المبيعاتو قمت بعمل التريجر التالي create or replace trigger invd_1 before insert or delete or update of qty on invd for each row DECLARE ERR_DESC EXCEPTION; begin if inserting then update product set qty = product.qty - :new.qty where product.prod_NO = :NEW.prod_NO ; elsif deleting then update product set qty = product.qty + :old.qty where product.prod_NO = :OLD.prod_NO ; else update product set qty = product.qty - ( :new.qty - :old.qty ) where product.prod_NO = :OLD.prod_NO ; end if ; end ; / و هو يعمل كما اظن ذلكولكن هناك عملية validation مهمة عن رصيد كل صنف بحيث ظهر رسالة تحذيرية بعدم امكانية صرف اكثر من الكمية المتاحة من الرصيد و هذه لم استطع انجازهاو الترجير التالي لا يعمل CREATE OR REPLACE TRIGGER UPDATE_BALANCE BEFORE INSERT OR DELETE OR UPDATE OF QTY -- QTY_ITEM_ID OF SALES DETAILS ON INVD -- SALES_DETAILS FOR EACH ROW DECLARE CURSOR PARTS_Available IS SELECT QTY FROM PRODUCT where prod_no = new.prod_no for update of qty; CURRUNTLY_ONHAND product.qty%type; INCORRECT_PART_ID EXCEPTION; LOW_QUANTITY EXCEPTION; BEGIN OPEN PARTS_Available; Fetch PARTS_Available INTO CURRUNTLY_ONHAND; IF PARTS_Available%NOTFOUND THEN RAISE INCORRECT_PART_ID; END IF; IF INSERTING THEN IF CURRUNTLY_ONHAND - :NEW.QTY < 0 THEN RAISE LOW_QUANTITY; ELSE UPDATE PRODUCT SET QTY = CURRUNTLY_ONHAND - :NEW.QTY; END IF; END IF; IF UPDATING THEN IF CURRUNTLY_ONHAND - (:NEW.QTY - :OLD.QTY) < 0 THEN RAISE LOW_QUANTITY; ELSE UPDATE PRODUCT SET QTY = CURRUNTLY_ONHAND - (:NEW.QTY - :NEW.QTY) WHERE CURRENT OF PARTS_AVAILABLE; END IF; END IF; EXCEPTION WHEN INCORRECT_PART_ID THEN CLOSE PARTS_AVAILABLE; RAISE_APPLICATION_ERROR (-20001,'PART ID IS NOT VALID'); WHEN LOW_QUANTITY THEN CLOSE PARTS_AVAILABLE; RAISE_APPLICATION_ERROR (-20002,'Quantity Is Not Available'); end update_balance; / ارجو المساعدة و التوضيح ان امكن من اخي احمد زين او الاخ جمال stock_control.zip تقديم بلاغ
بتاريخ: 1 يونيو 200817 سنة comment_130227 السلام عليكم ورحمة الله وبركاتهاخي الكريممن خلال الفورم وعلي حقل الكمية استخدم الكود التالي لمراقبة الكمية المباعة بحث لا تزيد عن الكمية المتوفرة في المخزون WHEN-VALIDATE-ITEM DECLARE aa number ; begin select qty into aa from inventory where inventory.invt_no = :inv_sal.invt_no ; IF :inv_sal.qty > aa THEN MESSAGE('الكمية المباعة أكبر من الكمية الموجودة في المخزون'); MESSAGE('الكمية المباعة أكبر من الكمية الموجودة في المخزون'); RAISE Form_Trigger_Failure; ELSIF :inv_sal.qty <= 0 THEN MESSAGE('يوجد خطأ في إدخال الكمية المباعة'); MESSAGE('يوجد خطأ في إدخال الكمية المباعة'); RAISE Form_Trigger_Failure; END IF ; END ; جزاك الله كل خير تقديم بلاغ
بتاريخ: 1 يونيو 200817 سنة كاتب الموضوع comment_130246 جزاك الله خيرا اخي جمالو لكن هل يمكن فعل ذلك عن طريق trigger database??????قمت بتعديل الكود ليصبح كالاتي حيث الكود السابق لم يفي الغرض و لكن ساعدني على فهم الموضوع جزاك الله خيرا اخي الكريموها هو الكود في حدث WHEN-VALIDATE-ITEM للكمية IVND.QTY DECLARE o_bal number ; -- الرصيد قبل عميلة التحديث o_qty number ; -- الكمية قبل عملية التحديث aa number ; begin select qty into o_bal from product where product.prod_no = :invd.prod_no ; select count(prod_no) into aa from invd where prod_no= :invd.prod_no and invd.inv_no = :invd.inv_no; if aa >= 1 then -- عملية التعديل على الكمية بالبلوك select nvl(qty,0) into o_qty from invd where invd.prod_no = :invd.prod_no and invd.inv_no = :invd.inv_no; IF o_bal + nvl(o_qty,0) - nvl(:invd.qty,0) < 0 THEN MESSAGE(' رصيد الصنف غير كافي لعملية الصرف' ); MESSAGE(' رصيد الصنف غير كافي لعملية الصرف' ); RAISE Form_Trigger_Failure; end if; Else -- اضافة IF o_bal - nvl(:invd.qty,0) < 0 THEN MESSAGE(' رصيد الصنف غير كافي لعملية الصرف' ); MESSAGE(' رصيد الصنف غير كافي لعملية الصرف' ); RAISE Form_Trigger_Failure; end if; end if; if nvl(:invd.qty,0) <= 0 THEN MESSAGE('لا يمكن ترك خانة الكمية فارغة'); MESSAGE('لا يمكن ترك خانة الكمية فارغة'); RAISE Form_Trigger_Failure; END IF ; END; و معذرة على الاطالة تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة كاتب الموضوع comment_130289 السلام عليكمهل يمكن ان اضع شرط في database triggerبافتراض ان جدول الفواتير inv عبارة عن : inv_no رقم الفاتورة inv_date تاريخ الفاتورة inv_type نوع الفاتورة (شراء / بيع /مردودات المشتريات/مردودات المبيعات) dealer_id كود المتعامل (عميل او مورد) جدول تفاصيل الفواتير inv_detail inv_no رقم الفاتورة inv_date تاريخ الفاتورة inv_type نوع الفاتورة (شراء / بيع /مردودات المشتريات/مردودات المبيعات) item_id qty price val فكيف احدد عملية التأثير على المخزن في حالة اختلاف نوع الفاتورة؟يعني هناك حالات اضافة و هناك حالات صرفوقد تكرمتم بعمل ترجر الصرف و لكن بدون شروط الان هناك كثر من عملية حركة (اضافة او صرف )هل ممكن تطوير database trigger ليحدد نوع عملية التأثير على المخزن في حالة اختلاف نوع الفاتورةكما في الكود التالي : CREATE OR REPLACE TRIGGER invd_1 before insert or delete or update of qty on inv_detail where inv_type ='2,3' for each row DECLARE ERR_DESC EXCEPTION; begin if inserting then update items set qty = items.qty - :new.qty where items.item_id = :NEW.item_id ; elsif deleting then update items set qty = items.qty + :old.qty where items.item_id = :OLD.item_id ; else update items set qty = items.qty - ( :new.qty - :old.qty ) where items.item_id = :OLD.item_id ; end if ; end ; / جزاكم الله خيرا تم تعديل 2 يونيو 200817 سنة بواسطة Wise تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة comment_130300 اخي الكريم بصراحة انا شايف ان الموضوع لا يحتاج كل هذا الرد ولا الاستفسار غير ان الاخ احمد زين فرحان بالصورة بتاعته بيحب انها تظهر يمكن هيرشح نفسة فى مجلس الشعب كثير ولكن اريد ان اناقش شئ مهم فى عمل الشاشة معقول ان تحذف صنف تم تخزينة فى فاتورة البيع يجب ان يكون هناك فاتورة مرتجع للبيع هو يقوم بهذه العملية ولكن اذا حبيت ان يكون هذه الاجراء فى شاشة البيع عمل trigger على مستوى block post_delete بعد اخسم يتم الاضافة الى الصنف وعند الاضافة اجراء اخر وخلصنا منا كل هذا الرد وكل هذه الصور بتاعت الاخ احمد تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة comment_130301 اوكي تم تعديل 2 يونيو 200817 سنة بواسطة مصعب اسامة تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة كاتب الموضوع comment_130304 الرجاء اخواني الرجوع الي المشاركة 20 مرة اخرى و معرفة المطلوبكما قلنا هناك حل للتأثير على المخزون عن طريق FORM TRIGGERS او التأثير على المخازن عن طريق الـDATABASE TRIGGERSفي البداية كنت بحاول عن طريق FROM TIGGERS و لكن وجدت كثير من المشاكل و الان الاعضاء الكرا م نصحوا بال DATABASE الان ارجو مساعدتي بالذهاب الي المشاركة رقم 20 في هذا الموضوع ان امكن ذلك تم تعديل 2 يونيو 200817 سنة بواسطة Wise تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة comment_130322 السلام عليكم ورحمة الله وبركاتهبعد التحية الاخ khalideed اللهم ان عبدك هذا هجاني واذاني اللهم اغفر له ولوالديه وارحمه وارحم والديه ولاتاخذنا بما فعلا السفهاء مناإن السيادة لا توهب والخلود لا يورث والعظمة لا تغتصب والفضل لا ينتزع وإنما تأتي أهلها راغمة وتلتحم بهم فيعيشون بها وتحيا فيهم فما يذكر الواحد من هؤلاء السادة إلا وتسبق إلى الأذهان صفته في عملية كأنما هي ترجمة فورية لخلقه الذي اتصف به أو سمته الذي عرف بها مَن ظن أن للعلم غاية فقد بخسه حظه، ووضعه في غير منزلته التي وضعه الله فيها حيث يقول وما أوتيتم من العلم إلا قليلاً.. لا يزال الرجل عالماً ما طلب العلم، فإن ظن أنه قد علم فقد جهل.. أعلم الناس مَن جمع علوم الناس إلى علمه تقديم بلاغ
بتاريخ: 2 يونيو 200817 سنة كاتب الموضوع comment_130327 اخي الكريم احمد زين لا تحزن و كن من اهل الفضل وكن من اهل الاحسانو ادعو الي من هجاك المغفرة تثاب من الله خير الثواب و غفر الله للاخ خالد تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.