تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
SQL Update
#1
Photo 
مساء الخير
لو سمحتوا انا بحاجة لحل لهذه المشكلة
أو أن تعطوني مفتاح لحلها وسأقوم بالبحث عنه

عندي جدول في SQL يشبه الجدول في الصورة المرفقة
Move_type يقصد بها نوع الحركة
IN هو رمز لمواد الواردة وهو متعلق بالمشتريات
OUT هو رمز للمواد الصادرة وهو متعلق بالمبيعات
current_cost هو تكلفة الصنف عند حدوث العملية
اما average_cost فهو متوسط التكلفة للمادة

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

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

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

أتمنى أن يكون السؤال واضح وشكرا جزيلا



   
الرد }}}
تم الشكر بواسطة: هدتا , هدتا , هدتا
#2
صباح النور :

فكرة للحل : 
في الحال (id1) هو ترقيم تلقائي متتالي ولا يتكرر.

- أن تجد id1 الـ (id) سجل الحركة الذي تم تعديله للمادة item_1.
- أن تجد id2 الـ (id) السجل للحركة التالية للمادة item_1.

- تعطي أمر تعديل التكلفة للمادة item_1 بشرط : id أكبر من id1  وأصغر من id2

يمكن الاستفادة أيضاً من حقل تاريخ الحركة بشرط أنه يخزن التاريخ و الوقت بالدقيقة والثانية(بنفس الطريقة السابقة بدلاً من id).
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة:
#3
(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
الرد }}}
تم الشكر بواسطة:
#4
بارك الله فيك .
-------------------
ما أعرفه عن برامج الحسابات - التعديل فيها غير مرغوب لدرجة عدم منح الصلاحيات للمحاسب الرئيسي أو المدير المالي نفسه ().
لأن أي سماح بالتعديل هو سماح بالتلاعب بالحسابات، فأي تجاوز بسبب علاقة أو منصب المدير المسؤول(حتى لو كان المالك نفسه) هو السماح لغيره بالتلاعب. 

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

كذلك يجب ألا يتم تعديل الادخال أو الاخراج على مخازن المواد إلا بقيد مواد رسمي.
وبموجب هذا القيد سيتم تعديل متوسط التكلفة لما بقي من مواد.. ولا علاقة له بما سبق..
أي بموجب هذا القيد سيتم التسجيل (وليس التعديل) بموجب متوسط تكلفة السلعة للعمليات التالية لهذه العملية.

فما مضى على الخطأ السابق يقى على ما هو عليه (كـ إرتفاع متوسط التكلفة أو انخفاضها على قيود المبيعات أو .. غيرها ..).

وقيد التعديل للكمية(أقصد التسجيل للتعديل) في العملية الهدف (يرفق بمذكرة أو ملاحظة توضيحية لسبب التعديل وسبب ارتفاع أو انخفاض متوسط تكلفة السلعة في العمليات التالية).
--
صحيح أن هذا الأمر سيكون مزعج نوعاً ما - ولكن كـ مؤسسة بهذه الطريقة يمنعون أي تلاعب بالحسابات، وتغلق كل ثغرة يمكن الدخول من خلالها..
فكما نقول : دفع الضرر أولى من جلب المنفعة (ينطبق على هذه الحالة بدقة).
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة:
#5
(06-11-22, 04:22 PM)Taha Okla كتب : بارك الله فيك .
-------------------
ما أعرفه عن برامج الحسابات - التعديل فيها غير مرغوب لدرجة عدم منح الصلاحيات للمحاسب الرئيسي أو المدير المالي نفسه ().
لأن أي سماح بالتعديل هو سماح بالتلاعب بالحسابات، فأي تجاوز بسبب علاقة أو منصب المدير المسؤول(حتى لو كان المالك نفسه) هو السماح لغيره بالتلاعب. 

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

كذلك يجب ألا يتم تعديل الادخال أو الاخراج على مخازن المواد إلا بقيد مواد رسمي.
وبموجب هذا القيد سيتم تعديل متوسط التكلفة لما بقي من مواد.. ولا علاقة له بما سبق..
أي بموجب هذا القيد سيتم التسجيل (وليس التعديل) بموجب متوسط تكلفة السلعة للعمليات التالية لهذه العملية.

فما مضى على الخطأ السابق يقى على ما هو عليه (كـ إرتفاع متوسط التكلفة أو انخفاضها على قيود المبيعات أو .. غيرها ..).

وقيد التعديل للكمية(أقصد التسجيل للتعديل) في العملية الهدف (يرفق بمذكرة أو ملاحظة توضيحية لسبب التعديل وسبب ارتفاع أو انخفاض متوسط تكلفة السلعة في العمليات التالية).
--
صحيح أن هذا الأمر سيكون مزعج نوعاً ما - ولكن كـ مؤسسة بهذه الطريقة يمنعون أي تلاعب بالحسابات، وتغلق كل ثغرة يمكن الدخول من خلالها..
فكما نقول : دفع الضرر أولى من جلب المنفعة (ينطبق على هذه الحالة بدقة).


كلامك صحيح وسيلم ولكن أتحدث هنا عن وجود خطأ بشري غير مقصود
مثلا قام بإدخال سعر تكلفة 100 بدل من 1000
وتمت عدة عمليات بيع بعدها وتم تسجيل التكلفة بالسعر 100
ثم انتبه المستخدم بأنه قام بإدخال تكلفة خاطئة 
فيقوم بتعديل القيمة.

ولا أعتقد بأن عملية المردودات أو عكس القيد سوف تكون مجدية هنا.

وشكرا لك على مشاركتك فيما يخص أدبيات البرامج المحاسبية وبالمناسبة هناك برامج ولها أسمها وشهرتها لا يوجد بها تعديل أبدا
كل قيد يتم معالجته بقيد غكسي. وكل حركة بعكسها.
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] هل من كود لعمل update set لبيانات الجدول من الداتا جريد احمد عبد الحكيم 7 3,883 18-12-15, 06:55 PM
آخر رد: احمد عبد الحكيم
  [VB.NET] وضع متغير فى جملة Update mathmagic 3 3,429 25-10-15, 10:20 AM
آخر رد: mathmagic
  مشكلة في Update benomar 2 2,280 12-10-14, 03:10 PM
آخر رد: benomar
  [كود] Update sql table m7md2991 3 2,831 28-09-13, 12:43 PM
آخر رد: m7md2991
  Update image in MS Access eng.khalidvb 0 1,800 30-08-13, 05:19 PM
آخر رد: eng.khalidvb

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


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