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

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيف اقوم بتحديث مخزون (/showthread.php?tid=12351)

الصفحات: 1 2


كيف اقوم بتحديث مخزون - bouh25 - 21-07-2023

قمت بهذا البرنامج الصغير الذي يقوم بتحديث مخزون لقاعدة البيانات الاولى inventory_first بواسطة قاعدة البيانات الثانية inventory_second
لكن عند التنفيذ يضهر لي خطأ لم اتعرف عليه _ قاعدة البيانات من نوع Firebird 
المثال موجود

PHP كود :
UPDATE inventory_first inv1
SET 
  inv1
.quantity_in_stock = 
  CASE
    WHEN inv2.quantity_in_stock > inv1.quantity_in_stock THEN 0
    
ELSE inv1.quantity_in_stock - inv2.quantity_in_stock
  END
,
  inv1.availability =
  CASE
    WHEN inv2.quantity_in_stock > inv1.quantity_in_stock THEN 'الكمية غير كافية'
    ELSE inv1.availability
  END
FROM inventory_first inv1
JOIN inventory_second inv2 ON inv1
.product_id = inv2.product_id 



RE: كيف اقوم بتحديث مخزون - Delphi4Us - 25-07-2023

خطاء جملة Update لا يوجد فيها العبارة Form وهي تستخدم مع Select فاذا اردت ان تستخدم تحديث باختيار قيم معينة استخدم

كود :
  UPDATE SET A=:A , B=:B (SELECT FROM ....)

 مثلما تستخدم INSERT

كود :
insert into INVENTORY_FIRST (PRODUCT_ID, NOMPRODUIT, QUANTITY_IN_STOCK) select PRODUCT_ID, NOMPRODUIT, QUANTITY_IN_STOCK from INVENTORY_FIRST 



RE: كيف اقوم بتحديث مخزون - bouh25 - 31-07-2023

لم يعمل المثال


RE: كيف اقوم بتحديث مخزون - larbiparadox - 31-07-2023

إذا كنت تستعمل Firebird ، إستعمل MERGE : تقوم بتحديث جدول وفق شروط معينة

https://firebirdsql.org/refdocs/langrefupd21-merge.html


RE: كيف اقوم بتحديث مخزون - larbiparadox - 31-07-2023

لتحديث المخزون في الجدول الأول ، سيقوم بتحديث الجدول الول بشرط الكمية تكون متاحة
نكتب
كود :
Merge into INVENTORY_FIRST as inv1 using ( select PRODUCT_ID, sum( quantity_in_stock )  as quantity_in_stock_2  from   INVENTORY_SECOND group by PRODUCT_ID  ) inv2 on inv1.PRODUCT_ID = inv2.PRODUCT_ID and inv1.quantity_in_stock >= quantity_in_stock_2 WHEN matched THEN update set  quantity_in_stock =  quantity_in_stock - quantity_in_stock_2


وفي حالة الكمية غير متاحة يكتب لنا الكمية غير كافية بكتابة أخرى

كود :
Merge into INVENTORY_FIRST as inv1 using ( select PRODUCT_ID, sum( quantity_in_stock )  as quantity_in_stock_2  from   INVENTORY_SECOND group by PRODUCT_ID  ) inv2 on inv1.PRODUCT_ID = inv2.PRODUCT_ID and inv1.quantity_in_stock < quantity_in_stock_2 WHEN matched THEN update set availability = 'الكمية غير كافية'



RE: كيف اقوم بتحديث مخزون - bouh25 - 01-08-2023

المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة


RE: كيف اقوم بتحديث مخزون - larbiparadox - 01-08-2023

(01-08-2023, 04:23 PM)bouh25 كتب : المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة

في مثالك الاول : انت تظهر حقل إسمه availability في حالة عدم كفاية الكمية يكتب فيها "الكمية غير كافية"

في المثال الذي أرفقته لا يوجد فيه هذا الحقل عليك بإضافته


RE: كيف اقوم بتحديث مخزون - bouh25 - 02-08-2023

ما المقصود بالسطر
inv1.availability =
في المثال الذي ارفقته


RE: كيف اقوم بتحديث مخزون - larbiparadox - 02-08-2023

(02-08-2023, 09:20 AM)bouh25 كتب : ما المقصود بالسطر
inv1.availability =
في المثال الذي ارفقته

هذا أنت وضعته و لست أنا

[صورة: 256849478.png]

حسب ما فهمت أنا من الكتابة التي وضعتها أنت :

1 ـ يوجد جدول مخزون رئيسي إسمه INVENTORY_FIRST يحتوي على الحقول التالية :

  PRODUCT_ID        INTEGER,
  NOMPRODUIT        VARCHAR(25),
  QUANTITY_IN_STOCK  NUMERIC(10,2),
  AVAILABILITY      VARCHAR(20)

2 - يوجد جدول ثانوي إسمه INVENTORY_SECOND يحتوي على الحقول التالية :

  PRODUCT_ID        INTEGER,
  QUANTITY_IN_STOCK  INTEGER

ـ في الجدول الثاني نقوم بإخراج سلع معينة وذلك من خلال PRODUCT_ID رقم المنتج المشترك بين الجدول الأول و الثاني ، لما نقوم بإنقاص السلع الموجدة في الجدول الثاني من الجدول الاول.

* ومنه في حالة عدم  وجود هذه السلع في الجدول الأول يقوم بتحقق فقط بحيث يكتب الكمية غير كافية في الحقل AVAILABILITY  بدون إنقاصها

كود :
Merge into INVENTORY_FIRST as inv1 using ( select PRODUCT_ID, sum( quantity_in_stock )  as quantity_in_stock_2 from  INVENTORY_SECOND group by PRODUCT_ID ) inv2 on inv1.PRODUCT_ID = inv2.PRODUCT_ID and inv1.quantity_in_stock < quantity_in_stock_2 WHEN matched THEN update set availability = 'الكمية غير كافية'

ـ بعد تنفيذ هذا سكريبت سيكتب في الجدول الرئيسي أمام الكمية المطلوبة "الكمية غير كافية"

ـ بواسطة سكريبت أخر يمكننا التحقق من ذلك

كود :
SELECT inv2.PRODUCT_ID, SUM( inv2.quantity_in_stock )  as quantity_Sortie, inv1.NOMPRODUIT, inv1.QUANTITY_IN_STOCK as en_Stock, inv1.AVAILABILITY FROM  INVENTORY_SECOND inv2 INNER JOIN INVENTORY_FIRST inv1 ON inv1.product_id = inv2.product_id GROUP BY inv2.PRODUCT_ID , inv1.NOMPRODUIT, inv1.QUANTITY_IN_STOCK, inv1.AVAILABILITY

النتيجة
[صورة: 308659744.png]

أما هذا السكريبت سيقوم بإنقاص الكمية إذا تحقق الشرط

كود :
Merge into INVENTORY_FIRST as inv1 using ( select PRODUCT_ID, sum( quantity_in_stock )  as quantity_in_stock_2 from  INVENTORY_SECOND group by PRODUCT_ID ) inv2 on inv1.PRODUCT_ID = inv2.PRODUCT_ID and inv1.quantity_in_stock >= quantity_in_stock_2 WHEN matched THEN update set  quantity_in_stock =  quantity_in_stock - quantity_in_stock_2

نشرح سكريبت

[صورة: 414111069.png]

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

عند تنفيذ السكريب إنقاص الكمية ، انظر للسطر الملون بالأصفر تتوفر فيه شرط إنقاص الكمية ، أما السطر الذي قبله لا يمكن

# نشرح السطر الثاني في المربع رقم 1 هي الكمية الموجودة في الجدول الثاني INVENTORY_SECOND والتي تساوي 2 و المربع الثاني الكمية الموجودة في الجدول الرئيسي وتساوي 6 ، ومنه يمكن إنقاصها من المخزون الرئيسي

# أما السطر الذي قبل الكمية التي أخرجت أكبر من المخزنة في الرئيسي.

ملاحظة : عند الانتهاء من الانقاص يجب تغيير محتوى الحقل AVAILABILITY و هذا لإستعمال نتائجها مرة أخر وهذا كما يلي:

كود :
UPDATE INVENTORY_FIRST SET AVAILABILITY = null WHERE AVAILABILITY = 'الكمية غير كافية'

* وفي الأخير ، هذا مافهمت ، يمكن أن أكون مخطأ


RE: كيف اقوم بتحديث مخزون - bouh25 - 04-08-2023

لك جزيل الشكر اخ Delphi4Us ، larbiparadox لكن انا اريد ان يعطين تنبيه بـ 'الكمية غير كافية' لاسم المادة دون كتابتها في الحقل
الحقل غير موجود ربما لم انتبه لاضافتة

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