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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

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


8 رد (ردود) على هذا الموضوع

#1 wael890610

wael890610

    مشترك

  • الأعضــاء
  • 121 مشاركة

تاريخ المشاركة 02 June 2004 - 06:29 PM

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

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

#2 alfarook

alfarook

    مشترك

  • الأعضــاء
  • 91 مشاركة

تاريخ المشاركة 02 June 2004 - 11:11 PM

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

#3 Guest_عادل الشهري_*

Guest_عادل الشهري_*
  • الزائرين

تاريخ المشاركة 03 June 2004 - 02:39 AM

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

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

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

قم بإنشاء ثلاث جداول وهي :- المواد 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, 03 June 2004 - 02:46 AM.


#4 wael890610

wael890610

    مشترك

  • الأعضــاء
  • 121 مشاركة

تاريخ المشاركة 03 June 2004 - 03:19 PM

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

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

#5 فـــــزاع

فـــــزاع

    عضو

  • الأعضــاء
  • 1 مشاركة

تاريخ المشاركة 03 June 2004 - 09:13 PM

مشكور اخوي على هالموضوع . ويسلمج الله

#6 alfarook

alfarook

    مشترك

  • الأعضــاء
  • 91 مشاركة

تاريخ المشاركة 04 June 2004 - 10:14 AM

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

#7 محمد

محمد

    عضو

  • الأعضــاء
  • 24 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 26 June 2004 - 07:52 PM

أخوي عادل :
بانسبة للترايجر الأول ما فائدة السطر التالي :
Where mat#=:invoice_detail.mat#;

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

أخوكم / محمد

#8 Guest_عادل الشهري_*

Guest_عادل الشهري_*
  • الزائرين

تاريخ المشاركة 28 June 2004 - 02:38 PM

سلام عليكم

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

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

#9 alshakii

alshakii

    عضو

  • الأعضــاء
  • 4 مشاركة

تاريخ المشاركة 22 November 2004 - 01:57 AM

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