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

بتاريخ:

السلام عليكم

اخواني الكرام المشكلة هي اني كيف يتم التأثير على رصيد صنف بالمخزن عن طريق الفورم

حيث هناك حالات عديدة لمعالجة هذا الامر
1- حالة اضاف صنف الي الdata block sales_details و هذا سوف يقلل رضيد الصنف بالمخزن مع وجود شرط عدم بيع اكثر من الرصيد المتاح من ا لصنف في المخزن

2- حالة تعديل كمية صنف موجود فعلا بالdata block sales_details و هذا سوف يقلل او يزيد من رضيد الصنف بالمخزن مع وجود شرط عدم بيع اكثر من الرصيد المتاح من ا لصنف في هذا المخزن

2- حالة حذف صنف موجود فعلا بالdata block sales_details و هذا سوف يزيد من رضيد الصنف بالمخزن.

هناك حالة اخرى في حالة التعديل على اذن بيع
فمثلا هناك الصنف رقم 282 و هو مسجل بجدول sales details و قمنا بتعديل الصنف الي رقم 143 و هذا معناه
اننا اولا حذفنا الصنف 282 ثم عملنا حركة اضافة صنف جديد هو الصنف رقم 143
(نلاحظ ان هذه الحالة مركبة حيث انها عبارة عن حركة حذف صنف من جدول ال sales details و حركة اضافة الى جدول الـ sales details)

اخواني حولت مرارا و تكرارا حل المشكلة باكثر من طريقة و لكن قلة خبرتي في الاوراكل تقف امامي بالرغم انني حولت البحث عبر النت ولكن مع الفشل لايجاد حل حقيقي لهذه المشكلة

ارجو المساعدة قدر المستطاع

sales_work.zip

  • الردود 46
  • المشاهدات 14.3k
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

Most Popular Posts

  • السلام عليكم جزاكم الله خيرا اخواني احمد زين و احمد فرغلي الان انا فهمت ان حل موضوع الرصيد يأتي بحليين الحل الاول: هو عن طريق الفورم الحل الثاني : عن طريق الـ database trigger(جاري دراسته ) فبدأت ا

الصور المنشورة

بتاريخ:

بسم الله الرحمن الرحيم

معذره أخى الـdmp file مشغال ياريت تحمله تانى .
وأنا من رأيى إنك تعمل triggers على مستوى الـdatabase أفضل وتقدر تجمع كل الـdml اللى انت عايز تعملها فى trigger واحد .

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

جزاك الله خيرا اخي
بس كيف اصنع هذا التريجر و في اي حدث اضعه ؟
هل عند الضغط على زر commit from?
ام اين؟

هل ممكن مثال بسيط على هذه الفورمة

تم تحديث الملف المرفق و ال dmp
منتظر ردك اخي الكريم

sales.zip

بتاريخ:

السلام عليكم ورحمة الله وبركاته
اخي فالله
بعد السلام
مع اني مش فاهم مشكلتك بالظبط لكن ال trigger يوضع على مستوي الجدول في قاعدة البيانات
ويمكن عمله بعد اوقبل insert ,update and delete مع بعض
وهتسال كالاتي

if inserting then
qty = :qty + :new_qty ;
elsif updateing then
qty = :qty + :new_qty - :old_qty;
elsif delteing
qty = :qty _ :new_qty ;
end if;


دا مثال توضيحي مش اكثر اعمل مابدك

ويمكن من الفورم بعد عمل اتصال بقاعدة البيانات الذهاب الى اسفل الشاشة هتلاقي
database objects تفتحها هتلاقي اسمي المستخدمين افتح المستخدم اللى عليه الاسكيما الخاصه بك ثم اختار tables
ثم اختار الجدول اللى انت عايزه ولما تفتحه هتلاقي triggers افتحها اضغط على + = (create)
من الازار اللى فالاسفل اختار new

او اكتب هذا الكود بعد ان تقوم بتعديل الى ما تشاء

CREATE OR REPLACE TRIGGER YOUR_TRIGGER_NAME
BEFORE DELETE OR INSERT OR UPDATE ON YOUR_TABLE_NAME
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN -- QTY ITS COLUMN QUANTITY IN YOUR_TABLE
-- NEW_QTY ITS NEW VALUE FOR QUANTITY IN YOUR_TABLE
-- OLD_QTY ITS OLD VALUE FOR QUANTITY IN YOUR_TABLE
if inserting then
qty = :qty + :new_qty ;
elsif updateing then
qty = :qty + :new_qty - :old_qty;
elsif deleteing
qty = :qty - :new_qty ;
end if;
END ins_upd_delete;
/



اتمن ان تجد ضالتك فهذه المشاركة المتواضعه
وفقك الله الى ما تحب وترضي لاتسانا من صالح الدعاء

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

اخي الكريم
ارجو توضيح اكير
كيف سوف يتم التأثير على جدول مخزن الاصناف بهذا الترحير
طبعا الفكرة و المنطقية فاهما في الكود السابق و كلن مش فاهم كيفية التأثر بين الفورم و ال database trigger

بتاريخ:

السلام عليكم ورحمة الله وبركاته
بعد التحيية
اخي فالله مثال توضيحي اكثر

على جدو المنصرف هذا التريجر
--لو حركة خصم

IF INSERTING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) - NVL(:NEW.FRM_QTY,0)
 WHERE ITEM_ID = :NEW.ITEM_ID;
 END IF;
IF UPDATING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) + NVL(:OLD.FRM_QTY,0) - NVL(:NEW.FRM_QTY,0) ,
 WHERE ITEM_ID = :NEW.ITEM_ID;    
END IF;
IF DELETING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) + NVL(:OLD.FRM_QTY,0) ,
 WHERE ITEM_ID = :NEW.ITEM_ID;
END IF;


على جدو الوارد هذا التريجر
--لو حركة اضافة

IF INSERTING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) + NVL(:NEW.FRM_QTY,0)
 WHERE ITEM_ID = :NEW.ITEM_ID;
 END IF;
IF UPDATING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) - NVL(:OLD.FRM_QTY,0) + NVL(:NEW.FRM_QTY,0) ,
 WHERE ITEM_ID = :NEW.ITEM_ID;    
END IF;
IF DELETING THEN
UPDATE WAREHOUSE_BALANCE
   SET QTY = NVL(QTY,0) - NVL(:OLD.FRM_QTY,0) ,
 WHERE ITEM_ID = :NEW.ITEM_ID;
END IF;


اتمن ان تجد ضالتك فهذه المشاركة المتواضعه
وفقك الله الى ما تحب وترضي لاتسانا من صالح الدعاء

بتاريخ:

أخى الكريم wise .
الـtrigger اللى انت المفروض هتعمله زى ما الأخ أحمد زين ذكره بالظبط ولكن انا كنت عايز أوضحلك حاجه .
انت كنت بتسأل كيف يتم التأثير على الجدول بهذا الـtrigger .
أخى الكريم فى triggers ممكن تتعمل على مستوى الفورم ودى طبعا معروفه اللى هى pre,post,when,on ودى انت بتعملها من خلال الفورمه نفسها .
أما هذا النوع من الـtrigger اللى ذكره الأخ أحمد فده database trigger يعنى على مستوى الـdatabase وده الأفضل من وجهة نظرى .
الـtrigger ده انت بتعمله من خلال أى برنامج مساعد مش من خلال الفورم .
ممكن بالـsqlplus علشان ده عباره عن database triggers .

ياريت أكون كده جوبت على سؤالك ....

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

السلام عليكم
جزاكم الله خيرا اخواني احمد زين و احمد فرغلي

الان انا فهمت ان حل موضوع الرصيد يأتي بحليين
الحل الاول: هو عن طريق الفورم
الحل الثاني : عن طريق الـ database trigger(جاري دراسته )

فبدأت انا بالحل الاول و ظهرت المشكلة التالية :
وصف المشكلة:

قمت باضافة صنف جديد الي اذن البيع ،تم التحديث و التعديل بدون مشاكل
بعد لحظة بعد تعديل كمية الصنف الذي قمت باضافته من قبل تظر المشكلة التالية:

record has been updated by another user,
re-query to see change

مرفق صورة بالمشكلة

الان بحاول افهم موضوع trigger database و لحين فهم هذا الموضوع بحاول احل المشكلة على مستوع الفورم
ارجو المساعد ان امكن

جزيتم عنا خيرا اخواني
اخوكم محمود شديد
القاهرة

post-818-1211949116_thumb.jpg

بتاريخ:

السلام عليكم ورحمة الله وبركاته
بعد التحية
اخي فالله
اعتقد ان مشكلة هذه حلها في ان تقوم بكتابة هذا الكود بعد عمل insert and update or delete
اي بعد تاثيرك مباشرة فالجدول الاخر قوم بكتابة

FORMM_DDL('COMMIT');

بتاريخ:

السلام عليكم ورحمة الله وبركاته
بعد التحية
اخي فالله
اعتقد ان مشكلة هذه حلها في ان تقوم بكتابة هذا الكود بعد عمل insert and update or delete
اي بعد تاثيرك مباشرة فالجدول الاخر قوم بكتابة

FORMS_DDL('COMMIT');


لعمل حفظ للحركات على هذا السجل وشكرا

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

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

بتاريخ:

السلام عليكم ورحمة الله وبركاته
بعد التحية
اخي فالله
اعتقد ان حل مشكلة في عمل الاتي
قم بنسخ محتويات التريقر المسمي post_update ووضعها فال pre_update وكذلك بالنسبة لل insert
وقم بالغاء او تهميش كلا من post_update , post_insert بحيث يكون شغله كله ورا بعضه من pre_update بحيث يحفظ كل شئ سويا
الرجاء اخباري اذا نجح معك هذا التعديل وشكرا

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

السلا م عليكم
قمت بعمل ما طلبته مني
و الغت حدث post update,post insert

و لكن نفس المشكلة تحدث معي ...................
معلش انا تعبتك معي يا احمد

ارجو الصبر معي

بتاريخ:

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

بتاريخ:

السلام عليكم ورحمة الله وبركاته

اخي الكريم

راجع الرابط التالي


http://www.araboug.org/ib/index.php?showto...13957&st=15

جزاكم الله كل خير

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

السلام عليكم اخواني
وسوف اذهب الي الرابط و اجيب لاحقا ان شاء الله

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

السلام عليكم
جربت اسلوب ال databse trigger
و هذه النماذج الخاصة شاشات تجريبية

التصنيفات الرئيسية
الاصناف
فاتورة المبيعات

و قمت بعمل التريجر التالي

create or replace  trigger invd_1
  before insert or delete or update of qty on invd
  for each row
DECLARE
ERR_DESC EXCEPTION;
begin if  inserting  then
   update product set qty = product.qty - :new.qty
   where product.prod_NO  = :NEW.prod_NO  ;
 elsif  deleting  then
   update product set qty = product.qty +  :old.qty
   where product.prod_NO  = :OLD.prod_NO  ;
 else update  product  set
   qty =  product.qty - ( :new.qty - :old.qty )
   where product.prod_NO  = :OLD.prod_NO  ;
 end if  ;
end ;
/



و هو يعمل كما اظن ذلك

ولكن هناك عملية validation مهمة عن رصيد كل صنف بحيث ظهر رسالة تحذيرية بعدم امكانية صرف اكثر من الكمية المتاحة من الرصيد و هذه لم استطع انجازها

و الترجير التالي لا يعمل

CREATE OR REPLACE TRIGGER UPDATE_BALANCE
 BEFORE INSERT OR DELETE OR UPDATE OF QTY -- QTY_ITEM_ID OF SALES DETAILS ON INVD -- SALES_DETAILS
 FOR EACH ROW
DECLARE
 CURSOR PARTS_Available IS 
 SELECT QTY FROM PRODUCT where prod_no = new.prod_no
 for update of qty;
 
 CURRUNTLY_ONHAND  product.qty%type;
 INCORRECT_PART_ID EXCEPTION;
 LOW_QUANTITY      EXCEPTION;
BEGIN OPEN PARTS_Available;
 Fetch PARTS_Available INTO CURRUNTLY_ONHAND; IF PARTS_Available%NOTFOUND THEN
    RAISE INCORRECT_PART_ID;
 END IF;

 IF INSERTING THEN
   IF CURRUNTLY_ONHAND - :NEW.QTY < 0 THEN
      RAISE LOW_QUANTITY;
   ELSE
      UPDATE PRODUCT
SET QTY = CURRUNTLY_ONHAND - :NEW.QTY;
   END IF;
 END IF;

 IF UPDATING THEN
   IF CURRUNTLY_ONHAND - (:NEW.QTY - :OLD.QTY) < 0 THEN
      RAISE LOW_QUANTITY;
   ELSE
      UPDATE PRODUCT
SET QTY = CURRUNTLY_ONHAND - (:NEW.QTY - :NEW.QTY) 
WHERE CURRENT OF PARTS_AVAILABLE;
   END IF;
 END IF;
EXCEPTION
 WHEN INCORRECT_PART_ID THEN
 CLOSE PARTS_AVAILABLE;
 RAISE_APPLICATION_ERROR
 (-20001,'PART ID IS NOT VALID');

 WHEN LOW_QUANTITY THEN
 CLOSE PARTS_AVAILABLE;
 RAISE_APPLICATION_ERROR
 (-20002,'Quantity Is Not Available');
end update_balance;
/



ارجو المساعدة و التوضيح ان امكن من اخي احمد زين او الاخ جمال

stock_control.zip

بتاريخ:

السلام عليكم ورحمة الله وبركاته

اخي الكريم

من خلال الفورم وعلي حقل الكمية استخدم الكود التالي لمراقبة الكمية المباعة بحث لا تزيد عن الكمية المتوفرة في المخزون


WHEN-VALIDATE-ITEM

DECLARE
aa number ;
begin select  qty into aa from   inventory  
where inventory.invt_no = :inv_sal.invt_no ;
IF    :inv_sal.qty > aa THEN
MESSAGE('الكمية المباعة أكبر من الكمية الموجودة في المخزون');
MESSAGE('الكمية المباعة أكبر من الكمية الموجودة في المخزون');
RAISE Form_Trigger_Failure;
ELSIF :inv_sal.qty <= 0 THEN
MESSAGE('يوجد خطأ في إدخال الكمية المباعة');
MESSAGE('يوجد خطأ في إدخال الكمية المباعة');
RAISE Form_Trigger_Failure;	
END IF ;
END ;



جزاك الله كل خير

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

جزاك الله خيرا اخي جمال
و لكن هل يمكن فعل ذلك عن طريق trigger database??????

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

وها هو الكود في حدث WHEN-VALIDATE-ITEM للكمية IVND.QTY

DECLARE
o_bal number ; -- الرصيد قبل عميلة التحديث
o_qty number ; -- الكمية قبل عملية التحديث
aa number    ;
begin select qty into o_bal from product 
where product.prod_no = :invd.prod_no ;

select count(prod_no) into aa from invd
where prod_no= :invd.prod_no and invd.inv_no = :invd.inv_no;

if aa >= 1 then -- عملية التعديل على الكمية بالبلوك
	select nvl(qty,0) into o_qty from invd
	where invd.prod_no = :invd.prod_no and invd.inv_no = :invd.inv_no;
	IF  o_bal + nvl(o_qty,0) - nvl(:invd.qty,0) < 0 THEN
		MESSAGE('  رصيد الصنف غير كافي لعملية الصرف' );
		MESSAGE('  رصيد الصنف غير كافي لعملية الصرف' );
		RAISE Form_Trigger_Failure;
	end if;
Else --  اضافة
	IF  o_bal - nvl(:invd.qty,0) < 0 THEN
		MESSAGE('  رصيد الصنف غير كافي لعملية الصرف' );
		MESSAGE('  رصيد الصنف غير كافي لعملية الصرف' );
		RAISE Form_Trigger_Failure;
	end if;  	
end if;

if   nvl(:invd.qty,0) <= 0 THEN
	MESSAGE('لا يمكن ترك خانة الكمية فارغة');
	MESSAGE('لا يمكن ترك خانة الكمية فارغة');
	RAISE Form_Trigger_Failure; 
END IF ;
END;


و معذرة على الاطالة

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

السلام عليكم
هل يمكن ان اضع شرط في database trigger

بافتراض ان جدول الفواتير inv عبارة عن :

inv_no	   رقم الفاتورة	
inv_date   تاريخ الفاتورة
inv_type   نوع الفاتورة (شراء / بيع /مردودات المشتريات/مردودات المبيعات) 
dealer_id  كود المتعامل (عميل او مورد)



جدول تفاصيل الفواتير inv_detail

inv_no	   رقم الفاتورة	
inv_date   تاريخ الفاتورة
inv_type   نوع الفاتورة (شراء / بيع /مردودات المشتريات/مردودات المبيعات) 
item_id
qty
price
val



فكيف احدد عملية التأثير على المخزن في حالة اختلاف نوع الفاتورة؟
يعني هناك حالات اضافة و هناك حالات صرف
وقد تكرمتم بعمل ترجر الصرف و لكن بدون شروط
الان هناك كثر من عملية حركة (اضافة او صرف )

هل ممكن تطوير database trigger ليحدد نوع عملية التأثير على المخزن في حالة اختلاف نوع الفاتورة

كما في الكود التالي :

CREATE OR REPLACE TRIGGER invd_1    
before insert or delete or update of qty on inv_detail 
where inv_type ='2,3' 
for each row
DECLARE
ERR_DESC EXCEPTION;
begin if  inserting  then
   update items set qty = items.qty - :new.qty   
   where items.item_id  = :NEW.item_id  ;
 elsif  deleting  then
   update items set qty = items.qty +  :old.qty   
   where items.item_id  = :OLD.item_id  ;
 else update  items  set  
   qty =  items.qty - ( :new.qty - :old.qty )
   where items.item_id  = :OLD.item_id  ;
 end if  ;
end ;
/



جزاكم الله خيرا

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

بتاريخ:

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

بتاريخ:

اوكي

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

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

الرجاء اخواني الرجوع الي المشاركة 20 مرة اخرى و معرفة المطلوب

كما قلنا هناك حل للتأثير على المخزون عن طريق FORM TRIGGERS
او التأثير على المخازن عن طريق الـDATABASE TRIGGERS

في البداية كنت بحاول عن طريق FROM TIGGERS و لكن وجدت كثير من المشاكل و الان الاعضاء الكرا م نصحوا بال DATABASE

الان ارجو مساعدتي بالذهاب الي المشاركة رقم 20 في هذا الموضوع ان امكن ذلك

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

بتاريخ:

السلام عليكم ورحمة الله وبركاته
بعد التحية
الاخ khalideed
اللهم ان عبدك هذا هجاني واذاني اللهم اغفر له ولوالديه وارحمه وارحم والديه ولاتاخذنا بما فعلا السفهاء منا
إن السيادة لا توهب والخلود لا يورث والعظمة لا تغتصب والفضل لا ينتزع وإنما تأتي أهلها راغمة وتلتحم بهم فيعيشون بها وتحيا فيهم فما يذكر الواحد من هؤلاء السادة إلا وتسبق إلى الأذهان صفته في عملية كأنما هي ترجمة فورية لخلقه الذي اتصف به أو سمته الذي عرف بها
مَن ظن أن للعلم غاية فقد بخسه حظه، ووضعه في غير منزلته التي وضعه الله فيها حيث يقول وما أوتيتم من العلم إلا قليلاً.. لا يزال الرجل عالماً ما طلب العلم، فإن ظن أنه قد علم فقد جهل.. أعلم الناس مَن جمع علوم الناس إلى علمه

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

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

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

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

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

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

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

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.