بتاريخ: 10 مارس 200916 سنة comment_150826 السلام عليكم ورحمة الله وبركاتهللتوضيح مثلاً عندي Table يوجد به A و BTableABمثلاً عند وضع قمية وعددها 1000 للجهة A سوف تكون الجهة A= 1000وعند وضع 1500 للجهة B سوف تكون الجهة B=1500،،لنفرض سوف نقوم باضافة كمية اخرى ل A، والقيمة تساوي 2000تصبح قيمة A=3000 لان تم جمع قيمة A القديمة +قيمة A الحديثة = المجموع الكليلنفرض اني سوف اخذ من قيمة A=500اذاً سوف تساوي قيمة A=2500وB لم نضف عليها اي شي جديد وهي B=1500والمطلوب الذي اريد معرفته هل يمكن استخدام Trigger لكي اضيف قيمه لهم ويتم جمعها بصورة الية ؟اي ممكن الكود الذي يقوم بعمل هذه الطريقة وكيف استخدمه؟ جزاكم الله كل خيروشكراً لكم تم تعديل 10 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة comment_150871 السلام عليكم...بالنسبة للزيادة إذا بدك ياها تتم بشكل ألي المفروض تحدد العملية يلي بدها تم فيها...متى ستتم العملية الحسابية (الزيادة أو النقصان) ؟؟و أين ستتم العملية الحسابية ؟؟ تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة comment_150882 الزيادة والنقصان أو أي عملية حسابية تتم علي الجداولأنصحك بأن لا تقوم بعمل التريجر علي الداتا بعمل حتي لاتقوم بزيادة الترافيك علي الداتا بيزوكله يبقي علي الفورمزلكن لو عايز تريجر علي الداتا بيز تحدد وقت عمل التريجر بمعني after & beforeوتحديد العملية التي ستتم علي الداتا بيز insert / update / deleteثم الكود الذي تريده مثال توضيحي :سوف أقوم بعمل تريجر يقوم بنسخ القيمة القديمة في الجدول والتي سيتم حذفها أو التعديل فيها إلي جدول آخر ( وذلك لمعرفة من يقوم بالتعديل في الداتا بيز ) وده مثال عليه : create or replace trigger fr before delete on emp for each row begin insert into ks(empno,ename,sal) values(:old.empno,:old.ename,:old.sal); end; / sho err; هذا الكود سيقوم بعمل insert للقيمة القديمة في الجدول الذي نعمل عليه في حالة حذفها أو التعديل فيها إلي الجدول ( ks ) والسطر المكتوب فيه ( sho err; ) لإظار الأخطاء لو كانت هناك أخطاء في كود التريجرلكن أنصحك مرة أخري بعمل التريجر علي الفورم وليس علي الداتا بيز تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة comment_150890 أخي العزيز محمد مع احترامي لشخصك اسمحي لي اختلف معك في الرأيمن المعروف أن التريجر على الداتا بيز أقوى وأحسن وأكفأ بكثير من وضعه على الفورم ووضعه على الداتا بيز أفضل بكثير من وضعه على الفورم ولك كامل احترامي وتقديري تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة كاتب الموضوع comment_150894 السلام عليكم...بالنسبة للزيادة إذا بدك ياها تتم بشكل ألي المفروض تحدد العملية يلي بدها تم فيها...متى ستتم العملية الحسابية (الزيادة أو النقصان) ؟؟و أين ستتم العملية الحسابية ؟؟ وعليكم السلام ورحمة الله وبركاتهاخي الكريم ستتم عملية الزيادة عند اضافة قيمة، والنقصان تحدث عند اخذ قيمة اي حذف قيمة (مثل طريقة بنك الدم)وجزاك الله كل خير على الرد اخي الكريماخي mohamed_shoair واخي mustafagamiel جزاكم الله كل خيرالمشلكة انني لم استخدم الاوراكل فورمز سوف استخدم Asp.net اشكركم جميعاًوهذا هو ما اقصده الصورة فقط للتوضيح والفهم، والطريقة مثل طريقة بنك الدم تحتوي على عدة فصائل AB+and AB-and O-,and O+and so on وانا اريد عند التبرع مثلاً لفصيلة AB+ الحجم 1000 بالليتر ويتم اضافة هذه القيمة الى AB+ ويمكن ان تزيد او تنقص عند ادخال او اخذ كميه بالليتر وكذلك بالنسبة للفصائل الاخرىوهذه هي الصورة واتمنى اني استطعت التوضيحوفقكم الله تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة comment_150943 الأخ الفاضل مصطفي جميل أنا لست ضد التريجر علي الداتا بيز لكن في حالة أن تكون الداتا بيز كبيرة وعليها شغل كتير ويوزرز كتير ينصح بتقليل التريجرز عليها لتقليل الترافيك عليهالكن هناك تريجرز لازم تكون علي الداتا بيز . ولكن الأرجح أن تحاول تقليل التريجرز علي الـــ D Bولك جزيل الشكر في تقبل كلامي ورأيي تقديم بلاغ
بتاريخ: 11 مارس 200916 سنة comment_150945 أما بخصوص الفورمز اللي هتكون asp.netلست لي خبرة بهذا الموضوع لأن شغلي كله أوراكل فورمزوممكن تسأل أحد المشرفين وهويدلك هتعمل إيهواقبل تحياتي ( ياريت كان بإيدي مساعدتك ، لكن ما باليد حيلة ) تقديم بلاغ
بتاريخ: 12 مارس 200916 سنة كاتب الموضوع comment_150955 مقدر جهدك اخي الكريم بارك الله فيك ولكن لاتوجد طريقة استخدم فيها ال Trigger مثلما وضحها لي الاخ جزاه الله خير في حساب العمر بالموضوع السابق؟اي اقصد استخدم ال trigger لحساب الزيادة والنقصان؟ تم تعديل 12 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 12 مارس 200916 سنة comment_150989 السلام عليكم...تفضل الحل حسب ما استطعت فهمه من السؤال... create or replace trigger tri_BloodType before insert on Operations for each row declare Obalance number:=0; Nbalance number:=0; begin select Balance into Obalance from BloodType where ID=:new.BloodTypeID; if :new.OperationType='grant' then Nbalance := Obalance +:new.QuantityPerLiter; elsif :new.OperationType='revoke' then Nbalance := Obalance - :new.QuantityPerLiter; if Nbalance<0 then raise_application_error(-20210,'You try to revoke quantity greater than available'); end if; end if; update BloodType set Balance = Nbalance where ID=:new.BloodTypeID; end; / SQL> insert into operations values(1,'hassan',1,'grant',1,sysdate) 1 row created. SQL> insert into operations values(2,'ammar',1,'grant',1.5,sysdate); 1 row created. SQL> insert into operations values(3,'fouad',2,'grant',0.5,sysdate); 1 row created. SQL> insert into operations values(4,'abed',1,'revoke',2,sysdate); 1 row created. SQL> select * from bloodtype; ID BLOODTYPE BALANCE ---------- -------------------- ---------- 1 AB+ .5 2 AB- .5 تقديم بلاغ
بتاريخ: 12 مارس 200916 سنة كاتب الموضوع comment_151017 جزاك الله كل خير اخي الكريم ووفقك بما يحبه ويرضاه وجزاك من فضله والجنه اللهم امين ولكل من ساعدني بالمثل ان شاء اللهان شاء الله الآن ساجربه واخبرك بالنتائج تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151028 لا اعرف ما السبب كتبت الكود لدي وقارنت النتائج مع نتائجك اقصد اي جدولي مثل جدولك باختلاف الاسماء، ولكن بعد ما حفظ ال Trigger اخبرني ان هناك خطأ بال Triggerوهذا هو الكود واسفله الاخطاء التي ظهرت لي ارسلته صورة لان لم يظهر بالصفحة تم تعديل 13 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة comment_151044 الخطأ واضح بتعليمة السيليكت...بجملة Where ... عندك خطأ باسم العامود (ID) تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151048 ولكن الاسم نقلته مثل ما هو في جدولي وحاولت التاكد من ذلك ولا يوجد اختلاف، هل من الممكن وجود مشكلة اخرى بجدول اخر ممكن ان تؤثر على هذا التريجر؟شكرا على الرد اخي الكريم تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة comment_151049 ما بعرف بس الكومبايلر عم يقلك ما عم يلاقي عامود اسمو ID بجدول BloodTypeجرب نفذ هي التعليمة: desc BloodType; تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151051 ما بعرف بس الكومبايلر عم يقلك ما عم يلاقي عامود اسمو ID بجدول BloodTypeجرب نفذ هي التعليمة:desc BloodType; حاولت مسح ال ID ووضعت بدلا منه BLOOD_TYPE_ID (لا اعرف هل الذي عملته صح ام خطأ)واصبحت التريجر سليمة الكود بالصورةولكن بعد ما ادخلت البيانات بجدول ال Operations اظهرت لي هذه الرسالةاسف على كثرة الاسئلة والازعاج تم تعديل 13 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة comment_151053 ولا يهمك..ما في مشكلةالخطأ عندك بالسطر السادس عند أول Ifشو قصدك بـالعامود Stauts_ID كأنك معرفو Number و المفروض يكون varchar2 تأكد من المشكلة و إذا ما مشي الحال حط كود إنشاء الجداول و كود الإدخال للجدول Operations تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151063 شكراً لك اخي على تحملي، والسخاء النبيل منكنجحت الطريقة مثلما وضحت لي، بفضل الله ثم بفضلك، جزاك الله كل خير وبارك فيك ولدي سؤال اخر لو سمحتوا، وجداً محرج من كثرة الاسئلةيمكن عمل طريقة حساب فيها الدم الذي لم يستخدم لمدة مثلاً 3 سنوان وما زال في المخزون اي عمل له مسح من قاعدة البيانات؟ لان كأني قرات ان الدم من الممكن ان تنتهي صلاحيته ولكن لا اعرف كم المدة؟ تم تعديل 13 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151075 حاولت مع كود العمر وبدلا من قسمته على 12 استخدمت الضرب في 2 اي تاريخ اليوم*2 =التاريخ القادمواستخدمته بهذه الصيغة ولكن لم ينجح begin select trunc(months_between(PROCESS_DATE)*2) into :new.NEXTF from dual;end; تم تعديل 13 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 13 مارس 200916 سنة كاتب الموضوع comment_151085 اضفت في جدول ال Operations عامود جديد اسميته NextDate وهذا يقوم بضرب تاريخ العملية الحالية ب 2 لكي يحدد للمتبرع التبرع للشهر القادم (بعد مرور شهران)وكتبت هذا ال Trigger للجدول ونجح begin select trunc(ADD_MONTHS(SYSDATE,2)) into :new.NEXTDATE from dual; end; ولكن عند التبطيق في جدول ال Operation تفصل قاعدة البيانات ويحدث Disconnect لا اعرف لماذا ولا يتحقق الشرط تم تعديل 13 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 14 مارس 200916 سنة comment_151113 بالنسبة لحذف كميات الدم المنتهية الصلاحية باعتبار مدة الصلاحية 3 سنوات: create or replace procedure pro_Exp is cursor cur is select * from operations where (sysdate-OperationDate)/360>3; f boolean :=false; begin for rec in cur loop if f then f:=true; end if; update BloodType set Balance=Balance-rec.QuantityPerLiter where ID=rec.BloodTypeID; delete from Operations where OperationID=rec.OperationID; end loop; commit; end; / و لتنفيذ الكود كل يوم بشكل دوري نستخدم DBMS_SCHEDULE begin dbms_scheduler.create_program(program_name => 'PRO_EXP_JOB', program_type => 'STORED_PROCEDURE', program_action => 'PRO_EXP', enabled => true); end; / begin dbms_scheduler.create_schedule('SCH_EXP_JOB', start_date => sysdate + (1/1440), repeat_interval => 'FREQ=DAILY'); end; / begin dbms_scheduler.create_job('JOB_Operations_EXP', program_name => 'PRO_EXP_JOB', schedule_name => 'SCH_EXP_JOB', enabled => true); end; / تقديم بلاغ
بتاريخ: 14 مارس 200916 سنة كاتب الموضوع comment_151116 جزاك الله كل خير اخي TROYMAN وامدك بالصحة والعافية والعلم والدين وزادك من فضله اللهم امين تم تعديل 14 مارس 200916 سنة بواسطة sonic تقديم بلاغ
بتاريخ: 14 مارس 200916 سنة comment_151141 بالنسبة للقيد الذي يحصر المتبرع من حيث عدد مرات التبرع (مرة واحدة كل شهرين) لا داعي للحقل الذي قمت بإضافته , بل عدّل جسم التريجر ليصبح كالتالي: create or replace trigger tri_BloodType before insert on Operations for each row declare Obalance number:=0; Nbalance number:=0; Mdate date; Pcount number; ID number; begin select count(*) into Pcount from operations where Name=:new.Name; /* if that person granted before*/ if Pcount>0 then select BloodTypeID into ID from Operations where Name=:new.Name; /* if that person's Blood type is matched*/ if ID!=:new.BloodTypeID then raise_application_error(-20212,'You try to Grant more than type of Blood!'); end if; select Max(OperationDate) into Mdate from Operations where Name=:new.Name; /* if that person's last granting date is greater than 2 months*/ if (sysdate-Mdate)/30<2 then raise_application_error(-20211,'You can'||'t grant again before passing two months at least'); end if; else select Balance into Obalance from BloodType where ID=:new.BloodTypeID; if :new.OperationType='grant' then Nbalance := Obalance +:new.QuantityPerLiter; elsif :new.OperationType='revoke' then Nbalance := Obalance - :new.QuantityPerLiter; if Nbalance<0 then raise_application_error(-20210,'You try to revoke quantity greater than available'); end if; end if; update BloodType set Balance = Nbalance where ID=:new.BloodTypeID; end if; end; / تم تعديل 14 مارس 200916 سنة بواسطة TROYMAN تقديم بلاغ
بتاريخ: 15 مارس 200916 سنة كاتب الموضوع comment_151175 ما شاء الله تبارك الله العلي العظيمأغرقتنا بكرمك اخي الكريماسال الله العظيم رب العرش العظيم ان يوفقك دنيا واخرة بما يحبه ويرضاه ويرزقك من فضله كل خير اللهم امين تم تعديل 15 مارس 200916 سنة بواسطة sonic تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.