wael890610 بتاريخ: 2 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 2 يونيو 2004 السلام عليكم ورحمه الله وبركاته لدى جدولين مبيعات ومخزونالمفروض ان مع كل عمليه مبيعات يحدث انسرت في جدول المبيعات بالكميه المباعه ويتم تعديل البيانات في المخزون بحيث يقل المخزون بالكميه المباعه-المشكله انى اريد عمل تريجر عند كل عمليه انسرت لكى يعدل كميه المخزون عندما يكون رقم الid للمنتج المباع = الid للمنتج في المخزون فكيف يمكننى معرفه الid لاخر عمليه انسرت في المبيعات ؟؟؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
alfarook بتاريخ: 2 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 2 يونيو 2004 هناك سجل (وهمي) يقوم التريجر بإنشاءه عند ادخال كل سجل يحوي على كافة بيانات هذا السجل المدخل (وكذلك عند التعديل والحذف) .عند الادخال يمكنك جلب رقم المادة المدخلة كالتالي NEW.ID:حيث NEW الاسم الافتراضي للسجل المدخل . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Guest عادل الشهري بتاريخ: 2 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 2 يونيو 2004 (معدل) سلام عليكم ... أخي العزيز سأعطيك طريقة لعملها ولكن عن طريق الشاشات ,,, وهي تفي بالغرض المطلوب , وهو مثال صغير جداً .قم بإنشاء ثلاث جداول وهي :- المواد Mat , الفواتير invoice و تفاصيل الفاتورة Invoice_Details1- جدول المواد Mat ,, الحقول Mat# Number PK Mat_Name Varchar2(20) quantity Number 2- جدول الفواتير invoice ,,, الحقول Inv# Number PK Inv_Date Date 3- جدول تفاصيل الفاتورة Invoice_Details ,,, الحقول Inv# Number FK invoice(Inv#) Mat# Number FK Mat(Mat#) quantity Number بعد انشاء الجداول .. وبناء الــ Blocks في الــ Form Builder الان سنقوم بإنشاء 3 Triggers على مستوى الــ Block الخاص في تفاصيل الفاتورهوهو invoice_Details Pre_Insert Declare N number; Begin Select quantity into n from mat Where mat#=:invoice_detail.mat#; If n>:invoice_detail.quantity then Update mat Set quantity=mat.quantity-:invoice_detail.quantity Where mat#=:invoice_detail.mat#; Else message('Sorry The Quantity is not enough'); message('Sorry The Quantity is not enough'); Raise form_trigger_failure; End if; End; Pre_Update Declare n_tot number; n_old number; Begin Select quantity into n_tot from mat Where mat#=:invoice_detail.mat#; Select quantity into n_old from invoice_detail Where mat#=:invoice_detail.mat# and inv#=:invoice_detail.inv#; If n_tot+n_old>=:invoice_detail.quantity then Update mat Set quantity=n_tot+n_old-:invoice_detail.quantity Where mat#=:invoice_detail.mat#; Else message('Sorry The Quantity is not enough'); message('Sorry The Quantity is not enough'); Raise form_trigger_failure; End if; End; Pre_Delete Update mat Set quantity=quantity+:invoice_detail.quantity Where mat#=:invoice_detail.mat#; الــ Trigger الأول ,,, عند عمل فاتورة مبيعات يقوم بخصم الكمية التي تم بيعها من خلال الفاتورة من جدول المواد بناء على نفس رقم المادة الموجود في الفاتورة .الــ Trigger الثاني ,,,يقوم بتعديل الكمية الموجودة في المخزون بناءً على التعديل الذي قمت به في الفاتورة وذلك لكي تكون البيانات صحيحة 100% ... الــ Trigger الثالث ,,,يقوم بإرجاع الكمية المباعة عند حذف الفاتورة إلى جدول المواد أي عند إلغاء عملية البيع ...ملاحظة :- في الــ Trigger الاول والثاني ... هناك عملية مهمة .وهي أنه يتم التأكد من الكمية الموجودة في المخزون قبل عملية البيع حيث أن الكمية إن لم تكن كافية لإتمام عملية البيع أو أقل من المطلوب في الفاتورة ستظهر لك رسالة تفيد بأن الكمية الموجودة غير كافية .أتمنى يكون مثالي واضح ويفيدك إن شاء الله .... عادل تم تعديل 2 يونيو 2004 بواسطة Oracle اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
wael890610 بتاريخ: 3 يونيو 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 3 يونيو 2004 شكرا اخ عادل معالجه كامله ووافيه لنظام اداره المخرون على الرغم من كونى كنت قد تناقشت في المنتدى عن افضل الوسائل لاداره المخزون وكانت معظم الاراء تتجه نحو استخدام db trigger وكنت اعتقد ان هذه الاراء عن تجارب سابقه عاما ً قد وصلنا لهدفنا فشكراً اخى الكريم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
فـــــزاع بتاريخ: 3 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 3 يونيو 2004 مشكور اخوي على هالموضوع . ويسلمج الله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
alfarook بتاريخ: 4 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 4 يونيو 2004 لك جزيل الشكر أخ خالد على هذا الشرح , وهذه الطريقة أسهل وأبسط ولكن ومن خلال تجربتك ألا ترى أن الـ Db Triggers تؤمن مركزية في العمل خصوصاً في المستودعات الكبيرة التي فيها أكثر من مستخدم لقاعدة البيانات , لضمان تكامل البيانات.فياريت نصائح عملية من قبلك لتوضيح الأمر.أخوك فراس . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
محمد بتاريخ: 26 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 26 يونيو 2004 أخوي عادل :بانسبة للترايجر الأول ما فائدة السطر التالي : Where mat#=:invoice_detail.mat#; الثانية بعد عميلة الإدخال بـ (Set) ?أخوكم / محمد اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Guest عادل الشهري بتاريخ: 28 يونيو 2004 تقديم بلاغ مشاركة بتاريخ: 28 يونيو 2004 سلام عليكمأخي العزيز هذا السطر لكي يقوم البرنامج بتغيير كمية المخزون لسلعة معينه يتم تعيينها بواسطة رقم السلعة الموجود في الفاتورة .. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
alshakii بتاريخ: 21 نوفمبر 2004 تقديم بلاغ مشاركة بتاريخ: 21 نوفمبر 2004 مشكور اخ عادل على الموضوع الجيدبس يوم جيت انفذ يطلع عندي خطأ bad bind variables 'invoice_detail.mat#'بالنسبة للجدوال انشأتها عن طريق الويزارد وبديت بـ invoice_detailوانشأت العلاقات ياريت توضح السببالخطأ خاص بالتريجر الاول والف شكر اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.