بتاريخ: 14 أكتوبر 201312 سنة comment_241116 يا باشمهندسينعندى سؤال محيرنى انا عايز اعمل تريجر عند ادخال قيمة في دول يسجل او يعدل على بيانات جدول اخر كالتالى اولا الجداول - جدول المشتريات 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; ياريت حد يسعدنى في الحلل احسن انا تعبت من التريجر دة فعلا تقديم بلاغ
بتاريخ: 14 أكتوبر 201312 سنة comment_241136 السلام عليكم يا ابو حميد كل عيد و انت بخير المشكله في الجزء اللي بتجيب اخر رقم من 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 ; جرب كدا و إن شاء الله تظبط معاك تم تعديل 14 أكتوبر 201312 سنة بواسطة AElsaber تقديم بلاغ
بتاريخ: 16 أكتوبر 201312 سنة كاتب الموضوع comment_241164 شكرا ليك ملحوظة جميلة تسلم ايدكبالفعل دى كانت خطاء منىبس مش دة الخطاء الاساسىالخطاء الاساسى هو انى بستخدم تابيلر لتسجيل البيانات في الجدول ولكن عند تشغيل التريجر يعمل على ص واحد فقط من التبيلر تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.