بتاريخ: 2 يونيو 200421 سنة comment_7803 السلام عليكم ورحمه الله وبركاته لدى جدولين مبيعات ومخزونالمفروض ان مع كل عمليه مبيعات يحدث انسرت في جدول المبيعات بالكميه المباعه ويتم تعديل البيانات في المخزون بحيث يقل المخزون بالكميه المباعه-المشكله انى اريد عمل تريجر عند كل عمليه انسرت لكى يعدل كميه المخزون عندما يكون رقم الid للمنتج المباع = الid للمنتج في المخزون فكيف يمكننى معرفه الid لاخر عمليه انسرت في المبيعات ؟؟؟ تقديم بلاغ
بتاريخ: 2 يونيو 200421 سنة comment_7815 هناك سجل (وهمي) يقوم التريجر بإنشاءه عند ادخال كل سجل يحوي على كافة بيانات هذا السجل المدخل (وكذلك عند التعديل والحذف) .عند الادخال يمكنك جلب رقم المادة المدخلة كالتالي NEW.ID:حيث NEW الاسم الافتراضي للسجل المدخل . تقديم بلاغ
بتاريخ: 2 يونيو 200421 سنة comment_7823 سلام عليكم ... أخي العزيز سأعطيك طريقة لعملها ولكن عن طريق الشاشات ,,, وهي تفي بالغرض المطلوب , وهو مثال صغير جداً .قم بإنشاء ثلاث جداول وهي :- المواد 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 يونيو 200421 سنة بواسطة Oracle تقديم بلاغ
بتاريخ: 3 يونيو 200421 سنة كاتب الموضوع comment_7846 شكرا اخ عادل معالجه كامله ووافيه لنظام اداره المخرون على الرغم من كونى كنت قد تناقشت في المنتدى عن افضل الوسائل لاداره المخزون وكانت معظم الاراء تتجه نحو استخدام db trigger وكنت اعتقد ان هذه الاراء عن تجارب سابقه عاما ً قد وصلنا لهدفنا فشكراً اخى الكريم تقديم بلاغ
بتاريخ: 4 يونيو 200421 سنة comment_7862 لك جزيل الشكر أخ خالد على هذا الشرح , وهذه الطريقة أسهل وأبسط ولكن ومن خلال تجربتك ألا ترى أن الـ Db Triggers تؤمن مركزية في العمل خصوصاً في المستودعات الكبيرة التي فيها أكثر من مستخدم لقاعدة البيانات , لضمان تكامل البيانات.فياريت نصائح عملية من قبلك لتوضيح الأمر.أخوك فراس . تقديم بلاغ
بتاريخ: 26 يونيو 200421 سنة comment_8763 أخوي عادل :بانسبة للترايجر الأول ما فائدة السطر التالي : Where mat#=:invoice_detail.mat#; الثانية بعد عميلة الإدخال بـ (Set) ?أخوكم / محمد تقديم بلاغ
بتاريخ: 28 يونيو 200421 سنة comment_8832 سلام عليكمأخي العزيز هذا السطر لكي يقوم البرنامج بتغيير كمية المخزون لسلعة معينه يتم تعيينها بواسطة رقم السلعة الموجود في الفاتورة .. تقديم بلاغ
بتاريخ: 21 نوفمبر 200421 سنة comment_18595 مشكور اخ عادل على الموضوع الجيدبس يوم جيت انفذ يطلع عندي خطأ bad bind variables 'invoice_detail.mat#'بالنسبة للجدوال انشأتها عن طريق الويزارد وبديت بـ invoice_detailوانشأت العلاقات ياريت توضح السببالخطأ خاص بالتريجر الاول والف شكر تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.