كيف اقوم بتحديث مخزون
#1
قمت بهذا البرنامج الصغير الذي يقوم بتحديث مخزون لقاعدة البيانات الاولى 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 


الملفات المرفقة
.rar   UpdateStk.rar (الحجم : 152.46 ك ب / التحميلات : 26)
وقل ربي زدني علماً
الرد
#2
خطاء جملة 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 
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#3
لم يعمل المثال
وقل ربي زدني علماً
الرد
#4
إذا كنت تستعمل Firebird ، إستعمل MERGE : تقوم بتحديث جدول وفق شروط معينة

https://firebirdsql.org/refdocs/langrefupd21-merge.html
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
الرد
#5
لتحديث المخزون في الجدول الأول ، سيقوم بتحديث الجدول الول بشرط الكمية تكون متاحة
نكتب
كود :
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 = 'الكمية غير كافية'
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 1 user says قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ
الرد
#6
المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة


الملفات المرفقة
.png   Sans titre.png (الحجم : 30.63 ك ب / التحميلات : 17)
وقل ربي زدني علماً
الرد
#7
(01-08-2023, 04:23 PM)bouh25 كتب : المثال الاخير يظهر خطأ لم اتعرف عليه قي السطر الاخير
الصورة

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

في المثال الذي أرفقته لا يوجد فيه هذا الحقل عليك بإضافته
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 1 user says قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ
الرد
#8
ما المقصود بالسطر
inv1.availability =
في المثال الذي ارفقته
وقل ربي زدني علماً
الرد
#9
(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 = 'الكمية غير كافية'

* وفي الأخير ، هذا مافهمت ، يمكن أن أكون مخطأ
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 1 user says قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ
الرد
#10
لك جزيل الشكر اخ Delphi4Us ، larbiparadox لكن انا اريد ان يعطين تنبيه بـ 'الكمية غير كافية' لاسم المادة دون كتابتها في الحقل
الحقل غير موجود ربما لم انتبه لاضافتة

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم