بتاريخ: 6 مايو 200619 سنة comment_68357 عندي فورم مبيعات سيراميك لوكلاء حصريون ، حين ان كل وكيل له سجل خاص به ، يقوم الفورم بخصم قيمه المشتروات من رصيد الوكيل من خلال PROCEDURE اسمه Agacount_decrبه الكود التالي PROCEDURE Agacount_decr (decr_credit IN NUMBER,AG_ID IN NUMBER) IS credit NUMBER;BEGINSELECT AGCREDIT INTO credit FROM AGMSTRWHERE AGID = AG_ID;UPDATE AGMSTRSET AGCREDIT = credit - decr_credit WHERE AGID = AG_ID;--Raise Form_Trigger_Failure;END; ويتم مناداه هذا الـ PROCEDURE من خلال Post-forms-commit Trigger به الكود التالي : DECLARE RcrdFetch NUMBER;BEGIN RcrdFetch := 0; SELECT COUNT(*) INTO RcrdFetch FROM AGMSTR WHERE AGMSTR.AGID = :BLKDPMSTR.C_ID; if RcrdFetch <> 0 thenAgacount_decr (:BLKDPDTLS.T_PRICE,:BLKDPMSTR.C_ID); END IF; END; ، اريد عند التعديل في كميه معينه (مثلا سحبنا 10 قطع ، ثم عدلنا الكميه المسحوبه بعد الحفظ الي 8 قطع) ان يرجع الفرق في حساب الوكيلمرفق لكم فورم المبيعات وفورم الوكلاء والجداول تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68359 لم اتمكن من ارفاق الملف في هذه الصفحه ، بتظهر رساله (غير مصرح لك بارفاق هذا النوع من الملفات) على العموم الملفات مضغوطه في ملف winrar على الرابط التالي :http://www.megaupload.com/?d=PYJHS203 تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68361 السلام عليكم يمكن عمل التعديلات المطلوبة كلها عن طريق database triggers فيمكنك انشاء تريجر after insert or update علي جدول المشتروات نفسه بحيث تقومي بالتشييك if inserting then قومي بخصم القيمة المشتراة من الرصيد elsif updating قومي بالتشييك اذا كانت القيمة المشتراة قد تم تخفيضها او تزويدها اذا تم تخفيضها قومي بحساب الفرق مثلا من 10 الي 8 و هو 2 و اضيفيه علي الرصيد مرة اخري ولو تم تزويدها احسبي الفرق ايضا و اخصميه من الرصيد CREATE OR REPLACE TRIGGER ADJUST_BAL AFTER INSERT OR UPDATE ON (UR TABLE NAME) FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UR PROCEDURE HERE; ELSIF UPDATING THEN V_DIFF:=(:NEW.TOTAL-:OLD.TOTAL)*-1; ---UR PROCEDURE HERE BUT PASS V_DIFF END IF; END; بالتوفيق تم تعديل 6 مايو 200619 سنة بواسطة hanon_OCP تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68363 اشكرك جدا سيد hanon_OCP علي الرد ، لكن ارجو التوضيح اكثر في العبارتين التاليتينV_DIFF:=(:OLD.TOTAL-:NEW.TOTAL)*-1;---UR PROCEDURE HERE BUT PASS V_DIFF واعذرنا على ثقل الراس تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68366 السلام عليكم لا شكر علي واجب بالنسبة للعبارة الاولي فبدلا من كتابة IF STATMENT لعمل تشيك علي القيمة القديمة اكبر من الجديدة او اصغر منها يمكن اختزال ذلك في جملة واحدة عن طريق حساب الفرق بطرح القيمة القديمة من الجديدة و اذا كان الفرق بالموجب بمعني انه تم زيادة القيمة الجديدة فبضربه في -1 سيكون لدينا الفرق بالماينس مثال القيمة الجديدة 12و القديمة 10 12-10=22*-1= -2و عند جمع -2 مع الرصيد الموجود اذا كان مثلا 40 40+-2 سيكون الناتج 38 اي تم تخفيض الرصيد بقيمة التزويد اما اذا كانت القيمة القديمة اكبر من الجديدة فسيكون الفرق بالموجبمثال 8-10=-2و عند ضربه في -1 كالتالي -1* -2=2ستكون النتيجة 2 لان ضرب السالب في سالب بموجبو النتيجة ستكون 2التي عند جمعها مع الرصيد السابق سيصبح 40+2=42اي تم تزويد الرصيد بالقيمة التي تم تقليلها و بالنسبة للعبارة الاخري اقصد انكي في البروسيدر التي تقومي فيها بتخفيض الرصيد يوجد بارمتر اسمه decr_credit في حالة الادخال استعدي البروسيدر و ضعي قيمة هذه البارمتر :NEW.TOTALام ا في حالة التعديل فقومي اولا بحساب البروسيدر ثم بدلا من ان تضعي قيمة البارمتر :NEW.TOTALضعي بدلا منه المتغير V_DIFFليقوم بخصم او زيادة الرصيد حسب الفرق ملحوظة : قمت بتعديل المعادلة الي :NEW.TOTAL -:OLD.TOTALو ايضا ارجوا ان يكون مفهوما ان البروسيدر حق تعديل الرصيد يجب ان تكون علي الداتا بيز و ليس علي الفورم ارجو ان تكون وضحت بالتوفيق تم تعديل 6 مايو 200619 سنة بواسطة hanon_OCP تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68373 اخ hanon_OCP ، اشكرك جدا على الرد ، لكن اخي ما استعصي على فهمي المتواضع عباره ( :NEW.TOTAL و العباره :OLD.TOTAL) حيث لم افهم بالضبط مكانهما في الكود وماذا تمثلان ، هل هي من الجدول او من الفورم ( مع العلم ان الترقر اللي نتكلم عنه في الجداول ) واضعهما في اي مكان - لو امكن توضيح القيم المقابله من الاكواد المرفقه ان وجدت - ؟ واكرر شكري وتقديري تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68374 السلام عليكم :new.total and :old.totalهما اسم العمود الموجود بحقل :BLKDPDTLS.T_PRICEيعني ممكن تعديل التريجر ليكون :new.t_price and :old.t_price و :new and :old هما قيمة الحقل قبل التعديل و بعد التعديل بالتوفيق تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68383 قمت بإضافه الكود من خلال الفورم ك تريقر اسمه ADJUST_BAL لاني عدلت في الكود ونسخته في SQL PLUS ولم يحدث شي ، مع ذلك تظهر الكثير من الاخطاء ، فهناك كلمات مثل PROCEDURE اذ انه كيف يمكنني تظمين بروسيدر ضمن الكود من دون مشاكل تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68384 السلام عليكم يا اختي العزيزة ما بعثته ليس كود كامل هو فقط مجرد guide حتي تستطيعي كتابة التريجر بشكل صحيح ما اقصده بكلمه بروسيدر ليس ان تضعي كلمة بروسيدر بنفسها في التريجر و لكن ان تقويم اولا بانشاء البروسيدر التي تعدل في الرصيد علي الداتا بيز ثم تقومي بانشاء التريجر عيل الداات بيز ايضا ثم تكتبي اسمها في التريجر هكذا Agacount_decr (:new.T_PRICE,:new.C_ID); و كلمة ur procedure المقصود بها اسم البروسيدر التي ستقومي بانشائها و ممكن الاتشغناء عنها و كتابة جملة الابديت مباشرة في التريجر بالتوفيق تم تعديل 6 مايو 200619 سنة بواسطة hanon_OCP تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68389 الاخ hanoon_ocpاليك ما حدث :قمت بانشاء بروسيدر (INSERT) على الداتا بيز من خلال الفورم بلدر يحتوي على هذا الكود : PROCEDURE Agacount_insert (new.t_price IN NUMBER,AG_ID IN NUMBER) IS credit NUMBER; BEGIN SELECT AGCREDIT INTO credit FROM AGMSTR WHERE AGID = AG_ID; UPDATE AGMSTR SET AGCREDIT = credit - new.t_price WHERE AGID = AG_ID; Raise Form_Trigger_Failure; END; ولكن تظهر رساله اعتراض (عند حفظ البروسيدر ، لم اجد مكان عمل الـ COMPILE) على العباره التاليه new.t_priceهذا ما اردت قوله ، كما اود ان اعرف ما اذا كان هناك طريقه اخري لانشاء DATABASE TRIGGER وكيفيه مناداه الـ PROCEDURE من خلال هذا الـ تريقر وجزاكم الله خيرا تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68392 PROCEDURE Agacount_insert (t_price IN NUMBER,AG_ID IN NUMBER) IS credit NUMBER; BEGIN SELECT AGCREDIT INTO credit FROM AGMSTR WHERE AGID = AG_ID; UPDATE AGMSTR SET AGCREDIT = credit - t_price WHERE AGID = AG_ID; END; وعملية الاستدعاء تتم من خلال التريجر حيث ترسلين المتغيرات باسم البروسيجر Agacount_insert (:ur_t_price ,:ur_AG_ID ); تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة كاتب الموضوع comment_68394 شكرا للسيد المشرف على الرد ، لكن تحملو جهلي ، اين اضع هذا البروسيدر ، فقد قمت بكتابته على SQLPLUS على بيئتي الـ DOS والـ TEXT EDITORT ، كما قمت بارفاقه ايضا من خلال الـ Form Builder ومن خلال Enterprise Manager Console ، كيف اعمل هذا البروسيدر ، والاهم ، اين يمكن ان اعمل compile حتي اتأكد من صحه الكود تقديم بلاغ
بتاريخ: 6 مايو 200619 سنة comment_68396 اختي الكريمةهناك فرق بين بروسيجر الخاص بقاعدة البيانات والبروسيجر الخاص بالديفلوبر فالذي في قاعدة البيانات يمكن استدعائه من الفورم او من plsql او من اي مكان اما الذي خاص بالفورم والذي انتي قمتي بانشائه فتضعينه فيما يسمى ب Program Units في القورم حيث تقومين بانشاء بروةسيجر وتنسخين هذا الكوداما بالنسبة لاستدعائه فيتم من خلال تريجر او عند حدوث حدث معين مثلا عن الضغط على زر او عند التخزين على العموم بما انه يختص في الاضافة فيفضل انشاء تريجر من اسمه post-insert ووضع الاستداعاء بداخلهانصحك يا اختي ان تركزي في السؤال فاجابات الاخ hanon_OCP وافيه وكافيه ومشكوووور وماقصر تقديم بلاغ
بتاريخ: 7 مايو 200619 سنة comment_68465 السلام عليكم يبدو انه حدث بعض اللخبطة عند الاخت LINDA عموما أخت ليندا المفروض ان عندك جدولين 1-جدول مبيعات 2- جدول ارصدة عملاء و ان كود العميل موجود في جدول المبيعاتو انك تريدي ان تقومي بتعديل الرصيد علي حسب عمليات البيع او التعديل فيها بالزيادة او النقصان هذه هي المشكلة الحل::لا تقومي بانشاء اي بروسيدر لا علي الداات بيز ولا علي الفورم افتحي السكول بلس و قومي باشناء داتا بيز تريجر علي جدول المبيعات كالتالي CREATE OR REPLACE TRIGGER ADJUST_BAL AFTER INSERT OR UPDATE ON (/*UR TABLE NAME)*/ FOR EACH ROW DECLARE V_DIFF NUMBER; BEGIN IF INSERTING THEN UPDATE AGMSTR SET AGCREDIT = AGCREDIT - :NEW.T_PRICE WHERE AGID = :NEW.AG_ID; ELSIF UPDATING THEN V_DIFF:=(:OLD.T_PRICE-:NEW.T_PRICE)*-1; UPDATE AGMSTR SET AGCREDIT = AGCREDIT -V_DIFF WHERE AGID = :NEW.AG_ID; END IF; END; ضعي بدلا من تعليق /*UR TABLE NAME*/ إسم جدول المبيعات و قد قمت باضافة جملية الابديت و تعديل التريجر حتي يعمل بصورة صحيحة ان شاء الله مرة اخري اذكرك هذا داتا بيز تريجر و ليس علي الفورم و لا يوجد داعي الان لانشاء اي بروسيدر تقوم بعمل الابديت لاننا وضعناها في التريجر نفسه و شرح التريجر كالتالي CREATE OR REPLACE TRIGGER ADJUST_BAL AFTER INSERT OR UPDATE ON (/*UR TABLE NAME)*/ FOR EACH ROW هذه الجملة تقوم بانشاء تريجر باسم ADJUST_BAL علي جدول المبيعات بعد الاضافة او التعديل في مبيعات موجودة و يعالج حالتين الاولي و ه ي الاضافة و فيها سنقوم بتعديل جدول الارصدة بالخصم دوما و الحالة الثانية و هي التعديل في مبيعات موجودةو فيها سنقوم بتعديل الرصيد بالزيادة او النقصان حسب نوع التعديل IF INSERTING THEN UPDATE AGMSTR SET AGCREDIT = AGCREDIT - :NEW.T_PRICE WHERE AGID = :NEW.AG_ID; جملة IF هذه تفحص اذا كان المستخدم يقوم بالاضافة اذا كانت اضافة نقوم بعمل ابديت لرصيد العميل بخصم قيمة المبيع من رصيده V_DIFF:=(:OLD.T_PRICE-:NEW.T_PRICE)*-1; UPDATE AGMSTR SET AGCREDIT = AGCREDIT -(V_DIFF) WHERE AGID = :NEW.AG_ID; END IF; END; و في هذا الجزء اذا كانت العملية عملية تعديل في مبيعات موجودة نحسب الفرق اولا ثم نقوم بتعديل الرصيد للعميل بالزيادة او النقصان حسب الفرق اذا كان بموجب اي تم تخفيض المبيعات سيقوم بزيادة الرصيد لو سالب اي تم زيادة المبيعات سيقوم بتخفيض الرصيدو بالنسبة لآخطاء اي بروسيدر او تريجر علي الداتا بيز بعد انشاءه من السكول بلساذا كان هناك اي اخطاء لعرضها استخدمي الامر show errors / سيعرض لكي الاخطاء الموجودة اتمني ان يكون كل شئ وضح الان بالتوفيق تم تعديل 7 مايو 200619 سنة بواسطة hanon_OCP تقديم بلاغ
بتاريخ: 7 مايو 200619 سنة كاتب الموضوع comment_68491 اخي hanon_OCP ، اشكرك بشده على نصائحك الثمينه وتوجيهاتك القيمه ومتابعه دعمكم للبوست ، واتمني من الله ان يثيبك كما تحب ، جاري العمل حسب توجيهاتكم ، وسأوافيكم بالنتائج والكود في قسم الدروس حتي تعم الفائده للأعضاء بعد ان افرغ من العمل وجزاكم الله خيرا تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.