delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيف اقوم بتحديث مخزون
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
قمت بهذا البرنامج الصغير الذي يقوم بتحديث مخزون لقاعدة البيانات الاولى 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 
خطاء جملة 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 
لم يعمل المثال
إذا كنت تستعمل Firebird ، إستعمل MERGE : تقوم بتحديث جدول وفق شروط معينة

https://firebirdsql.org/refdocs/langrefupd21-merge.html
لتحديث المخزون في الجدول الأول ، سيقوم بتحديث الجدول الول بشرط الكمية تكون متاحة
نكتب
كود :
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 = 'الكمية غير كافية'
المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة
(01-08-2023, 04:23 PM)bouh25 كتب : [ -> ]المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة

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

في المثال الذي أرفقته لا يوجد فيه هذا الحقل عليك بإضافته
ما المقصود بالسطر
inv1.availability =
في المثال الذي ارفقته
(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 = 'الكمية غير كافية'

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

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