الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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

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

بتاريخ:

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

بتاريخ:

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

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

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

قم بإنشاء ثلاث جداول وهي :- المواد 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) ?

أخوكم / محمد

بتاريخ:

سلام عليكم

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

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

  • بعد 4 شهور...
بتاريخ:

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

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.