الانتقال إلى المحتوى

اداره المخزون بأستخدام التريجرز


wael890610

Recommended Posts

السلام عليكم ورحمه الله وبركاته
لدى جدولين مبيعات ومخزون
المفروض ان مع كل عمليه مبيعات يحدث انسرت في جدول المبيعات بالكميه المباعه
ويتم تعديل البيانات في المخزون بحيث يقل المخزون بالكميه المباعه

-المشكله انى اريد عمل تريجر عند كل عمليه انسرت لكى يعدل كميه المخزون عندما يكون رقم الid للمنتج المباع = الid للمنتج في المخزون
فكيف يمكننى معرفه الid لاخر عمليه انسرت في المبيعات ؟؟؟

رابط هذا التعليق
شارك

هناك سجل (وهمي) يقوم التريجر بإنشاءه عند ادخال كل سجل يحوي على كافة بيانات هذا السجل المدخل (وكذلك عند التعديل والحذف) .
عند الادخال يمكنك جلب رقم المادة المدخلة كالتالي
NEW.ID:
حيث NEW الاسم الافتراضي للسجل المدخل .

رابط هذا التعليق
شارك

Guest عادل الشهري

سلام عليكم ...

أخي العزيز سأعطيك طريقة لعملها ولكن عن طريق الشاشات ,,, وهي تفي بالغرض

المطلوب , وهو مثال صغير جداً .

قم بإنشاء ثلاث جداول وهي :- المواد Mat , الفواتير invoice و

تفاصيل الفاتورة Invoice_Details

1- جدول المواد 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 الاول والثاني ... هناك عملية مهمة .وهي أنه يتم التأكد من الكمية الموجودة في المخزون قبل عملية البيع حيث أن الكمية إن لم تكن كافية لإتمام عملية البيع أو أقل من المطلوب في الفاتورة ستظهر لك رسالة تفيد بأن الكمية الموجودة غير كافية .

أتمنى يكون مثالي واضح ويفيدك إن شاء الله ....


عادل

تم تعديل بواسطة Oracle
رابط هذا التعليق
شارك

شكرا اخ عادل
معالجه كامله ووافيه لنظام اداره المخرون
على الرغم من كونى كنت قد تناقشت في المنتدى عن افضل الوسائل لاداره المخزون وكانت معظم الاراء تتجه نحو استخدام db trigger وكنت اعتقد ان هذه الاراء عن تجارب سابقه

عاما ً قد وصلنا لهدفنا
فشكراً اخى الكريم :) :)

رابط هذا التعليق
شارك

لك جزيل الشكر أخ خالد على هذا الشرح , وهذه الطريقة أسهل وأبسط ولكن ومن خلال تجربتك ألا ترى أن الـ Db Triggers تؤمن مركزية في العمل خصوصاً في المستودعات الكبيرة التي فيها أكثر من مستخدم لقاعدة البيانات , لضمان تكامل البيانات.
فياريت نصائح عملية من قبلك لتوضيح الأمر.
أخوك فراس .

رابط هذا التعليق
شارك

  • بعد 4 أسابيع...

أخوي عادل :
بانسبة للترايجر الأول ما فائدة السطر التالي :

Where mat#=:invoice_detail.mat#;


الثانية بعد عميلة الإدخال بـ (Set) ?

أخوكم / محمد

رابط هذا التعليق
شارك

Guest عادل الشهري

سلام عليكم

أخي العزيز هذا السطر لكي يقوم البرنامج بتغيير كمية المخزون لسلعة معينه

يتم تعيينها بواسطة رقم السلعة الموجود في الفاتورة ..

رابط هذا التعليق
شارك

  • بعد 4 شهور...

مشكور اخ عادل على الموضوع الجيد
بس يوم جيت انفذ يطلع عندي خطأ
bad bind variables 'invoice_detail.mat#'
بالنسبة للجدوال انشأتها عن طريق الويزارد وبديت بـ invoice_detail
وانشأت العلاقات ياريت توضح السبب
الخطأ خاص بالتريجر الاول
والف شكر

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية