الانتقال إلى المحتوى
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

بتاريخ:

يا باشمهندسين
عندى سؤال محيرنى

 

انا عايز اعمل تريجر عند ادخال قيمة في دول يسجل او يعدل على بيانات جدول اخر

كالتالى

 

اولا الجداول

 

- جدول المشتريات

create table imports
                  (
                     imp_id    number (10) ,
                     goods_id  number (10) ,
                     sup_id    number (10) ,
                     imp_quant number (10) ,
                     imp_cost  number ,
                     sup_date  date default (sysdate) ,
                     end_date  date ,
                     imp_note  varchar2 (100) ,

                     constraint imp_id_pk primary key (imp_id) ,
                     constraint imp_goods_id_fk foreign key (goods_id) references goods (goods_id) ,
                     constraint imp_sup_id_fk foreign key (sup_id) references suppliers (sup_id) ,
                     constraint imp_quant_nn check (imp_quant is not null) ,
                     constraint imp_cost_nn check (imp_cost is not null) ,
                     constraint imp_end_nn check (end_date is not null)
                  );

- جدول المخزن

create table inventory
                  (
                     inv_id      number (10) ,
                     goods_id    number (10) ,
                     sup_id      number (10) ,
                     inv_quant   number (10) ,
                     cost_price  number ,
                     g_unit_sall number ,
                     s_unit_sall number ,
                     end_date    date ,
                     inv_note    varchar2 (100) ,

                     constraint inv_id_pk primary key (inv_id) ,
                     constraint inv_goods_id_fk foreign key (goods_id) references goods (goods_id) ,
                     constraint inv_sup_id_fk foreign key (sup_id) references suppliers (sup_id) ,
                     constraint inv_quant_nn check (inv_quant is not null) ,
                     constraint inv_cost_nn check (cost_price is not null) ,
                     constraint inv_end_nn check (end_date is not null)
                  );

المطلوب

عمل تريجر في حالة التسجيل في جدول المشتريات

اذا كانت السلعة (goods_id) موجودة من قبل في جدول المخزن بنفس المورد (sup_id) وبنفس تاريخ الانتهاء (end_date) يقوم التريجر بتعديل فقط الكمية

اما

اذا كانت السلعة  (goods_id) غير موجودة او يوج اختلاف في المورد (sup_id) او تاريخ الانتهاء (end_date) يتم اضافة السلعة الى جدول المخزون في صف جديد

 

 

ملاحظات

- انا استخدم تابيلر لتسجيل البيانات من خلال فورم

- يوجد بعض التريجرات التى حاولت ان استخدمها ولكن يوجد مشكلة انه يتم القيام بعملية واحدة فقط (التسجيل - التعديل) دون الاخرى

- مثال على التريجر المستخدم

create or replace trigger imp2inv after insert on imports for each row

declare
v_count number ;
v_nex_id inventory.inv_id%type;
begin
select count (inv_id)  
into v_count
from inventory 
where goods_id = :new.goods_id and sup_id = :new.sup_id and nvl(end_date,sysdate) = nvl(:new.end_date,sysdate);
if  v_count > 0 then 
update inventory
set inv_quant = inv_quant + :new.imp_quant
where goods_id = :new.goods_id and sup_id = :new.sup_id and nvl(end_date,sysdate) = nvl(:new.end_date,sysdate);
else
select max(nvl(inv_id,0))+1 into v_nex_id from inventory;
insert into inventory (inv_id , goods_id , sup_id , inv_quant , cost_price , end_date , inv_note)
values (v_nex_id ,:new.goods_id , :new.sup_id , :new.imp_quant , :new.imp_cost , :new.end_date , :new.imp_note);

end if;

end;

ياريت حد يسعدنى في الحلل احسن انا تعبت من التريجر دة فعلا

بتاريخ:

السلام عليكم  يا ابو حميد

 

كل عيد و انت بخير

 

المشكله في الجزء  اللي بتجيب اخر رقم من  inventory

Select max(nvl(inv_id,0))+1 into v_nex_id from inventory;

انه بيرجع  v_nex_id   لو مفيش داتا  بــ Null

 

حلها حاجه من اتنين  انك تطلع الـ NVL  بره الـ Max

Select Nvl( Max (inv_id), 0) + 1
Into v_nex_id
From Inventory ;

أو بعد ما تعمل الـ Query بتاعك ترجع  تتاكد ان الـ v_nex_id  فيه قيمه ولا لأ

Begin
Select max(nvl(inv_id,0))+1 into v_nex_id from inventory;  
    
IF v_nex_id is null then 
  v_nex_id := 1;
End if;
End ;

جرب كدا و إن شاء الله تظبط معاك

تم تعديل بواسطة AElsaber

بتاريخ:
  • كاتب الموضوع

شكرا ليك ملحوظة جميلة تسلم ايدك
بالفعل دى كانت خطاء منى
بس مش دة الخطاء الاساسى
الخطاء الاساسى هو انى بستخدم تابيلر لتسجيل البيانات في الجدول ولكن عند تشغيل التريجر يعمل على ص واحد فقط من التبيلر
 

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

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

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

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

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

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.