sonic بتاريخ: 10 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 10 مارس 2009 (معدل) السلام عليكم ورحمة الله وبركاتهللتوضيح مثلاً عندي 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 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 11 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 السلام عليكم...بالنسبة للزيادة إذا بدك ياها تتم بشكل ألي المفروض تحدد العملية يلي بدها تم فيها...متى ستتم العملية الحسابية (الزيادة أو النقصان) ؟؟و أين ستتم العملية الحسابية ؟؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mohamed_shoair بتاريخ: 11 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 الزيادة والنقصان أو أي عملية حسابية تتم علي الجداولأنصحك بأن لا تقوم بعمل التريجر علي الداتا بعمل حتي لاتقوم بزيادة الترافيك علي الداتا بيزوكله يبقي علي الفورمزلكن لو عايز تريجر علي الداتا بيز تحدد وقت عمل التريجر بمعني 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; ) لإظار الأخطاء لو كانت هناك أخطاء في كود التريجرلكن أنصحك مرة أخري بعمل التريجر علي الفورم وليس علي الداتا بيز اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mustafagamiel بتاريخ: 11 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 أخي العزيز محمد مع احترامي لشخصك اسمحي لي اختلف معك في الرأيمن المعروف أن التريجر على الداتا بيز أقوى وأحسن وأكفأ بكثير من وضعه على الفورم ووضعه على الداتا بيز أفضل بكثير من وضعه على الفورم ولك كامل احترامي وتقديري اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 11 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 السلام عليكم...بالنسبة للزيادة إذا بدك ياها تتم بشكل ألي المفروض تحدد العملية يلي بدها تم فيها...متى ستتم العملية الحسابية (الزيادة أو النقصان) ؟؟و أين ستتم العملية الحسابية ؟؟ وعليكم السلام ورحمة الله وبركاتهاخي الكريم ستتم عملية الزيادة عند اضافة قيمة، والنقصان تحدث عند اخذ قيمة اي حذف قيمة (مثل طريقة بنك الدم)وجزاك الله كل خير على الرد اخي الكريماخي mohamed_shoair واخي mustafagamiel جزاكم الله كل خيرالمشلكة انني لم استخدم الاوراكل فورمز سوف استخدم Asp.net اشكركم جميعاًوهذا هو ما اقصده الصورة فقط للتوضيح والفهم، والطريقة مثل طريقة بنك الدم تحتوي على عدة فصائل AB+and AB-and O-,and O+and so on وانا اريد عند التبرع مثلاً لفصيلة AB+ الحجم 1000 بالليتر ويتم اضافة هذه القيمة الى AB+ ويمكن ان تزيد او تنقص عند ادخال او اخذ كميه بالليتر وكذلك بالنسبة للفصائل الاخرىوهذه هي الصورة واتمنى اني استطعت التوضيحوفقكم الله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mohamed_shoair بتاريخ: 11 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 الأخ الفاضل مصطفي جميل أنا لست ضد التريجر علي الداتا بيز لكن في حالة أن تكون الداتا بيز كبيرة وعليها شغل كتير ويوزرز كتير ينصح بتقليل التريجرز عليها لتقليل الترافيك عليهالكن هناك تريجرز لازم تكون علي الداتا بيز . ولكن الأرجح أن تحاول تقليل التريجرز علي الـــ D Bولك جزيل الشكر في تقبل كلامي ورأيي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mohamed_shoair بتاريخ: 11 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 11 مارس 2009 أما بخصوص الفورمز اللي هتكون asp.netلست لي خبرة بهذا الموضوع لأن شغلي كله أوراكل فورمزوممكن تسأل أحد المشرفين وهويدلك هتعمل إيهواقبل تحياتي ( ياريت كان بإيدي مساعدتك ، لكن ما باليد حيلة ) اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 12 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 مارس 2009 (معدل) مقدر جهدك اخي الكريم بارك الله فيك ولكن لاتوجد طريقة استخدم فيها ال Trigger مثلما وضحها لي الاخ جزاه الله خير في حساب العمر بالموضوع السابق؟اي اقصد استخدم ال trigger لحساب الزيادة والنقصان؟ تم تعديل 12 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 12 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 12 مارس 2009 السلام عليكم...تفضل الحل حسب ما استطعت فهمه من السؤال... 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 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 12 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 12 مارس 2009 ملحقات الحل: اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 12 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 12 مارس 2009 جزاك الله كل خير اخي الكريم ووفقك بما يحبه ويرضاه وجزاك من فضله والجنه اللهم امين ولكل من ساعدني بالمثل ان شاء اللهان شاء الله الآن ساجربه واخبرك بالنتائج اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 (معدل) لا اعرف ما السبب كتبت الكود لدي وقارنت النتائج مع نتائجك اقصد اي جدولي مثل جدولك باختلاف الاسماء، ولكن بعد ما حفظ ال Trigger اخبرني ان هناك خطأ بال Triggerوهذا هو الكود واسفله الاخطاء التي ظهرت لي ارسلته صورة لان لم يظهر بالصفحة تم تعديل 13 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 13 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 الخطأ واضح بتعليمة السيليكت...بجملة Where ... عندك خطأ باسم العامود (ID) اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 ولكن الاسم نقلته مثل ما هو في جدولي وحاولت التاكد من ذلك ولا يوجد اختلاف، هل من الممكن وجود مشكلة اخرى بجدول اخر ممكن ان تؤثر على هذا التريجر؟شكرا على الرد اخي الكريم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 13 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 ما بعرف بس الكومبايلر عم يقلك ما عم يلاقي عامود اسمو ID بجدول BloodTypeجرب نفذ هي التعليمة: desc BloodType; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 (معدل) ما بعرف بس الكومبايلر عم يقلك ما عم يلاقي عامود اسمو ID بجدول BloodTypeجرب نفذ هي التعليمة:desc BloodType; حاولت مسح ال ID ووضعت بدلا منه BLOOD_TYPE_ID (لا اعرف هل الذي عملته صح ام خطأ)واصبحت التريجر سليمة الكود بالصورةولكن بعد ما ادخلت البيانات بجدول ال Operations اظهرت لي هذه الرسالةاسف على كثرة الاسئلة والازعاج تم تعديل 13 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 13 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 ولا يهمك..ما في مشكلةالخطأ عندك بالسطر السادس عند أول Ifشو قصدك بـالعامود Stauts_ID كأنك معرفو Number و المفروض يكون varchar2 تأكد من المشكلة و إذا ما مشي الحال حط كود إنشاء الجداول و كود الإدخال للجدول Operations اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 (معدل) شكراً لك اخي على تحملي، والسخاء النبيل منكنجحت الطريقة مثلما وضحت لي، بفضل الله ثم بفضلك، جزاك الله كل خير وبارك فيك ولدي سؤال اخر لو سمحتوا، وجداً محرج من كثرة الاسئلةيمكن عمل طريقة حساب فيها الدم الذي لم يستخدم لمدة مثلاً 3 سنوان وما زال في المخزون اي عمل له مسح من قاعدة البيانات؟ لان كأني قرات ان الدم من الممكن ان تنتهي صلاحيته ولكن لا اعرف كم المدة؟ تم تعديل 13 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 (معدل) حاولت مع كود العمر وبدلا من قسمته على 12 استخدمت الضرب في 2 اي تاريخ اليوم*2 =التاريخ القادمواستخدمته بهذه الصيغة ولكن لم ينجح begin select trunc(months_between(PROCESS_DATE)*2) into :new.NEXTF from dual;end; تم تعديل 13 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 13 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 مارس 2009 (معدل) اضفت في جدول ال Operations عامود جديد اسميته NextDate وهذا يقوم بضرب تاريخ العملية الحالية ب 2 لكي يحدد للمتبرع التبرع للشهر القادم (بعد مرور شهران)وكتبت هذا ال Trigger للجدول ونجح begin select trunc(ADD_MONTHS(SYSDATE,2)) into :new.NEXTDATE from dual; end; ولكن عند التبطيق في جدول ال Operation تفصل قاعدة البيانات ويحدث Disconnect لا اعرف لماذا ولا يتحقق الشرط تم تعديل 13 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 14 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 14 مارس 2009 بالنسبة لحذف كميات الدم المنتهية الصلاحية باعتبار مدة الصلاحية 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; / اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 14 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 14 مارس 2009 (معدل) جزاك الله كل خير اخي TROYMAN وامدك بالصحة والعافية والعلم والدين وزادك من فضله اللهم امين تم تعديل 14 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 14 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 14 مارس 2009 (معدل) بالنسبة للقيد الذي يحصر المتبرع من حيث عدد مرات التبرع (مرة واحدة كل شهرين) لا داعي للحقل الذي قمت بإضافته , بل عدّل جسم التريجر ليصبح كالتالي: 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 مارس 2009 بواسطة TROYMAN اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
sonic بتاريخ: 15 مارس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 15 مارس 2009 (معدل) ما شاء الله تبارك الله العلي العظيمأغرقتنا بكرمك اخي الكريماسال الله العظيم رب العرش العظيم ان يوفقك دنيا واخرة بما يحبه ويرضاه ويرزقك من فضله كل خير اللهم امين تم تعديل 15 مارس 2009 بواسطة sonic اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
TROYMAN بتاريخ: 15 مارس 2009 تقديم بلاغ مشاركة بتاريخ: 15 مارس 2009 شكراً لك أخي الكريم ... الفضل لله وحده ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.