06-11-22, 09:18 AM
(06-11-22, 07:53 AM)Taha Okla كتب : صباح النور :
فكرة للحل :
في الحال (id1) هو ترقيم تلقائي متتالي ولا يتكرر.
- أن تجد id1 الـ (id) سجل الحركة الذي تم تعديله للمادة item_1.
- أن تجد id2 الـ (id) السجل للحركة التالية للمادة item_1.
- تعطي أمر تعديل التكلفة للمادة item_1 بشرط : id أكبر من id1 وأصغر من id2
يمكن الاستفادة أيضاً من حقل تاريخ الحركة بشرط أنه يخزن التاريخ و الوقت بالدقيقة والثانية(بنفس الطريقة السابقة بدلاً من id).
صباح الورد شكرا لك على الرد:
هذا الحل بسيط جدا الأمر معقد أكثر من ذلك
موجود أكثر من 300 ألف سجل والعدد مستمر بالزيادة يوميا بمقدار 2500 - 4000 سجل جديد
والعملية لازم تكون على كل الجدول ولكل الأصناف
الحل يلي انا عملته عن طريق جمل loop لكل صنف ضمن الكود البرمجي VB وليس ضمن الـ SQL
ولكن مع كثرة الأصناف وكثرة السجلات حلقات التكرار أًصبحت بطيئة ومتعبة وغير مجدية
المطلوب هو جملة SQL متقدمة تقوم بعمل التعديل على الجدول بأكمله بوقت قصير جدا
إليك الكود التالي وهو مستخدم لحساب الرصيد النهائي للمادة بعد كل عملية
وعند القيام بأي تعديل بأي مكان في الجدول يقوم باحتساب الرصيد الجديد ويقوم بالتصحيح لكل السجلات بسرعة كبيرة
كود :
UPDATE d
SET net_Inventory_Qty = t.cumqty
FROM tb_Inventory d
JOIN tb_Inventory i ON d.item_GUID = i.item_GUID
JOIN ( SELECT id, item_GUID,SUM(bill_Qty) OVER ( PARTITION BY item_GUID ORDER BY full_date_time ) AS 'cumQty'
FROM tb_Inventory) t ON t.id = d.id;
UPDATE v
SET S_net_Inventory_Qty = t.cumqty
FROM tb_Inventory v
JOIN tb_Inventory i ON v.item_GUID = i.item_GUID and i.store_id = v.store_id
JOIN tb_Inventory iv ON iv.store_id = v.store_id
JOIN ( SELECT id, item_GUID,store_id , SUM(bill_Qty) OVER ( PARTITION BY item_GUID , store_id ORDER BY full_date_time )
AS 'cumQty' FROM tb_Inventory) t ON t.id = v.id and t.store_id = v.store_id