اذهب الي المحتوي
أوفيسنا

مشكلة لحساب متوسط السعر


elkareee
إذهب إلى أفضل إجابة Solved by Gamal.Saad,

الردود الموصى بها

1 hour ago, elkareee said:

بالنسبة لتعدد الاصناف فى التقرير مش هيبقى موجود هيبقى لكل صنف تقرير منفصل

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

1 hour ago, elkareee said:

 لاحظت فى الصورة ان حركة الصرف واخدة قيمة صفر المفترض انها كما ذكرت انا ليها قيمة ضرب المتوسط فى كمية الحركة الحالية

أحتاج تشرح لي هذه النقطة

المفترض الحركة إما صرف أو اضافة

وفي الصورة الحركة صفر لأن السجل يكون حركة اضافة

أما متوسط السعر مضروبا بالكمية فهو قيمة الرصيد كما بالصورة

 

بصورة عامة حتى لو كان هناك خطأ بالنقطة الأخيرة

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

فبرجاء مراجعة متوسط السعر في السجلات

وهذه هي الفانكشن قبل التنقيح والتعديل لصنف واحد حتى هذه النقطة حتى يستفيد من يهتم من الزملاء

Option Compare Database
Option Explicit
Dim balance, bal, i, avg1, avg2, toval, tovalue, zval As Integer

Function qty_normalize()
'''''''''''''''''''''''''''''''''' Declaring '''''''''''''''''''
Dim db, dbs As DAO.Database
Dim rst As DAO.Recordset
Dim qdf, qryLoop As DAO.QueryDef
Dim item_a, item_b, strSQL As String
Set dbs = CurrentDb: Set db = CurrentDb
For Each qryLoop In CurrentDb.QueryDefs
If qryLoop.Name = "Q" Then DoCmd.DeleteObject acQuery, "Q"
Next
''''''''''''''''''''''''''''''''' Building Quary '''''''''''
strSQL = "SELECT Transactions.ID, Transactions.Item, Trans_top.zdate, Transactions.Out, Transactions.[In], Transactions.Zvalue, Transactions.AvgPrice, Transactions.BalanceAfter, Transactions.Tovalue, Trans_top.Orient, Trans_top.Warehouse, Trans_top.Doc, Transactions.Code FROM Trans_top INNER JOIN Transactions ON Trans_top.[Doc] = Transactions.[Doc] GROUP BY Transactions.ID, Transactions.Item, Trans_top.zdate, Transactions.Out, Transactions.[In], Transactions.Zvalue, Transactions.AvgPrice, Transactions.BalanceAfter, Transactions.Tovalue, Trans_top.Orient, Trans_top.Warehouse, Trans_top.Doc, Transactions.Code ORDER BY Transactions.Item, Trans_top.zdate;"
Set qdf = CurrentDb.CreateQueryDef("Q", strSQL)
DoCmd.OpenQuery qdf.Name
Set qdf = db.QueryDefs("Q")
Set rst = qdf.OpenRecordset()
Set rst = CurrentDb.OpenRecordset("Q", dbOpenDynaset)
           rst.MoveLast: rst.MoveFirst
''''''''''''''''''''''''''''''''' Setting to Zero '''''''''''
           item_a = item_b = rst!Item
           balance = avg1 = avg2 = tovalue = toval = zval = 0
''''''''''''''''''''''''''''''''' The first Row '''''''''''''
           balance = rst!In
           CurrentDb.Execute ("Update transactions Set BalanceAfter = " & balance & " where [id] = " & rst!ID & "")
           avg1 = Round(rst!zvalue, 2) / Round(rst!In, 2)
           tovalue = Round(Int(balance * avg1), 0)
           CurrentDb.Execute ("Update transactions Set AvgPrice = " & avg1 & " where [id] = " & rst!ID & "")
           bal = balance
           zval = rst!zvalue
           toval = tovalue
           rst.MoveNext
'''''''''''''''''''''''''''''''''Starting of Row(s) Later '''''''''''''
With rst
    For i = 0 To rst.RecordCount - 1
       If item_a = item_b Then
           balance = Val(balance) + rst!In - rst!Out
           CurrentDb.Execute ("Update transactions Set BalanceAfter = " & balance & " where [id] = " & rst!ID & "")
           item_b = rst!Item
             ''''''''''''''''''''''' In Or Out '''''''''''''
             If rst!In <> 0 Then
               avg2 = Round(Round(toval + rst!zvalue, 2) / Round(bal + rst!In, 2), 2)
               tovalue = Round(balance * avg2, 0)
               CurrentDb.Execute ("Update transactions Set AvgPrice = " & avg2 & " where [id] = " & rst!ID & "")
               avg1 = avg2
             Else
               avg2 = avg1
               tovalue = Round(balance * avg2, 0)
               CurrentDb.Execute ("Update transactions Set AvgPrice = " & avg2 & " where [id] = " & rst!ID & "")
             End If
           
           ''''''''''''''''''''''' A new Item '''''''''''''
        Else
           balance = 0
           item_b = rst!Item
           balance = Val(balance) + rst!In - rst!Out
           CurrentDb.Execute ("Update transactions Set BalanceAfter = " & balance & " where [id] = " & rst!ID & "")
           avg1 = Round(rst!zvalue, 2) / Round(rst!In, 2)
           tovalue = Round(balance * avg1, 2)
           CurrentDb.Execute ("Update transactions Set AvgPrice = " & avg1 & " where [id] = " & rst!ID & "")
        End If
        ''''''''''''''''''''''' Storing Values '''''''''''''
               toval = tovalue
               bal = balance
               zval = rst!zvalue
       ''''''''''''''''''''''' Next Row or End ''''''''''''''
      .MoveNext
           If Not .EOF Then
           item_a = rst!Item
           Else
           GoTo en:
           End If
   Next
          
End With

       ''''''''''''''''''''''' Deleting Query And Closing Recordsets ''''''''''''''
en:
rst.Close
DoCmd.Close acQuery, "Q", acSaveYes
DoCmd.DeleteObject acQuery, "Q"
Set rst = Nothing
Set qdf = Nothing
Set db = Nothing
Set dbs = Nothing
End Function

 

  • Like 2
رابط هذا التعليق
شارك

الان, Gamal.Saad said:

أحتاج تشرح لي هذه النقطة

المفترض الحركة إما صرف أو اضافة

وفي الصورة الحركة صفر لأن السجل يكون حركة اضافة

أما متوسط السعر مضروبا بالكمية فهو قيمة الرصيد كما بالصورة

 

استاذى الفاضل انا قصدت فى الصورة القيمة المالية وليسة الكمية انظر الصورة بها التوضيحbalance2.jpg.a3f200778c356a4c085e149120fa36e8.jpg

المفترض ان القيمة هنا ليست صفر وانما حاصل ضرب متوسط السعر فى كمية الصرف 

بالنسبة للفانكشن هجرب كده وان شاء الله خير لو فى اى تعديل باذن الله نتناقش فيه ونظبطها

جزاك الله خير أخى المحترم:fff:

رابط هذا التعليق
شارك

الان, Gamal.Saad said:

وهذه هي الفانكشن قبل التنقيح والتعديل لصنف واحد حتى هذه النقطة حتى يستفيد من يهتم من الزملاء

 

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

جارى التعمق فى التجربة وموافاتك بالنتيجة استاذنا الفاضل جزاك الله خير

 

  • Like 1
رابط هذا التعليق
شارك

2 ساعات مضت, Gamal.Saad said:

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

 

تم التجربة أخى الكريم والنتيجة مرضية الحمدلله على المثال وأظن ان الفانكشن دى تغنى عن الأولى لأنها تتضمنها بداخلها بالتالى التانية غير مطلوبة

استفسار : بخصوص ID المذكور فى الفانكشن هوا اللى يخص جدول Trans_Top يعنى بالتالى لو فى تاريخ واحد حصل فيه حركتين هيتم الترتيب بأولوية التسجيل تمام كده ؟

وعشان يكون ترتيب التقرير فى العرض بتاعه يكون زى ترتيب عمل الفانكشين هنضيف فى الاستعلام مصدر التقرير جدول Trans_Top ونختار الحقلين zDate , ID ويكون الترتيب Ascending

تمام كده ؟

أظن اننا كده غطينا جميع النقط فاضل بس ملحوظة قيمة حركة الصرف وتبقى كده العملية مظبوطة فى كافة الاتجاهات

و بالنسبة لتهيئة الفانكشن لتعمل على كل صنف على حدى لأنه هيكون أسهل و أسرع ممكن بعد ما تصممها نحطها فى Event On open فى التقرير المفصل لكل صنف وتاخد الكود الموجود فى التقرير وتشتغل عليه 

عارف انك بذلت مجهود جامد فى الموضوع والله جزاك الله خير تقبل تحياتى :fff:

رابط هذا التعليق
شارك

استفسار : بخصوص ID المذكور فى الفانكشن هوا اللى يخص جدول Trans_Top يعنى بالتالى لو فى تاريخ واحد حصل فيه حركتين هيتم الترتيب بأولوية التسجيل تمام كده ؟

الحقل المميز للسجل المعرف ID

يخص جدول الحركة Transaction

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

وعشان يكون ترتيب التقرير فى العرض بتاعه يكون زى ترتيب عمل الفانكشين هنضيف فى الاستعلام مصدر التقرير جدول Trans_Top ونختار الحقلين zDate , ID ويكون الترتيب Ascending

تمام كده ؟

تمام يا فندم وذلك في حالة صنف واحد

في حالة أكثر من صنف فيتم الترتيب تصاعديا لاسم الصنف بجانب التاريخ  أما

وفي المثال استند المثال إلى استعلام به نفس ما ذكرته أنت من استناد للجدول توب مرتبطا بجدول الحركة مع ترتيب حسب التاريخ

 

أظن اننا كده غطينا جميع النقط فاضل بس ملحوظة قيمة حركة الصرف وتبقى كده العملية مظبوطة فى كافة الاتجاهات

أوك. سنضيف القيمة تساوي متوسط السعر مضروبا بالكمية

وبالمناسبة عندي سؤال :

أريد التأكد من أن القيمة بالنسبة لحركة الاضافة يتم ادراجها يدويا حسب فاتورة الشراء ؟ أليس كذلك ؟

 

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

فعلا . إن شاء الله

 

عارف انك بذلت مجهود جامد فى الموضوع والله جزاك الله خير تقبل تحياتى

وجزاكم كل خير

لكن أرجو من لديه فكرة عن استخدام استعلام التحديث ليحل محل الفانكشن أن يطرحها

لأن المسألة عندي تتطلب عمل جدول مؤقت وأكثر من استعلام

رابط هذا التعليق
شارك

الان, Gamal.Saad said:

وبالمناسبة عندي سؤال :

أريد التأكد من أن القيمة بالنسبة لحركة الاضافة يتم ادراجها يدويا حسب فاتورة الشراء ؟ أليس كذلك ؟

 

استاذى الفاضل 

بالفعل يتم ادراجها يدويا تبع الفاتورة 

الان, Gamal.Saad said:

لكن أرجو من لديه فكرة عن استخدام استعلام التحديث ليحل محل الفانكشن أن يطرحها

لأن المسألة عندي تتطلب عمل جدول مؤقت وأكثر من استعلام

 

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

حضرتك تتفضل وتعمل موضوع جديد تشير فيه للموضوع الحالى بعد اكتمال الفانكشن النهائية ونختار هنا أفضل اجابة ونتابع الموضوع التانى  بس افضل انك انتا اللى تعمل بيه موضوع جديد لأن المناقشات هتكون اعلى من مستوايا وهتحتاج فنيات مش عندى كل واحد وتعليمه بقى ههههه :wavetowel: وانا هعملك اشارة لأساتذتنا الافاضل عشان يشاركو فى الموضوع .

 

وفى انتظار باقى الموضوع تقبل الله منا و منك صالح الأعمال

تم تعديل بواسطه elkareee
رابط هذا التعليق
شارك

  • أفضل إجابة

الأساتذة

@elkareee & @Amr Ashraf

والله كلامك وسام شرف وأنا مازلت في بداية الطريق

وأتمنى أكون عند حسن الظن

بس مترجعوش في كلامكم بعد كده هههههه

 

أستاذ محمد جرب التعديل بكود بناء الاستعلام المؤقت

ستجد سطر مستقل يعبر عن اختيار صنف محدد من النموذج تجنباً لاستدعاء الخمسين ألف سجل

طبعا يمكن التعديل في أي وقت لأي أصناف

وتم تغيير جزء بسيط من الكود حتى نتجنب أخطاء قد تحدث

وجرب القيمة لحركة الصرف

''''''''''''''''''''''''''''''''' Building Quary '''''''''''
 If Nz(Forms![Trans_top]![Transaction subform]![Code], 0) = 0 Then
 GoTo en2
  Else: strSQL = "SELECT Transactions.ID, Transactions.Item, Trans_top.zdate, Transactions.Out, Transactions.[In], Transactions.Zvalue, Transactions.Code FROM Transactions INNER JOIN Trans_top ON Transactions.Doc = Trans_top.Doc  "
      ''''''''''  Choosing Item :
  strSQL = strSQL + "WHERE Code = '" & [Forms]![Trans_top]![Transaction subform]![Code] & "' "
  strSQL = strSQL + "GROUP BY Transactions.ID, Transactions.Item, Trans_top.zdate, Transactions.Out, Transactions.[In], Transactions.Zvalue, Transactions.Code ORDER BY Transactions.Item, Trans_top.zdate;"

 

تقييم 5.rar

  • Like 1
رابط هذا التعليق
شارك

8 ساعات مضت, Gamal.Saad said:

والله كلامك وسام شرف وأنا مازلت في بداية الطريق

وأتمنى أكون عند حسن الظن

 

حبيبنا يا أستاذ جمال بلاش التواضع ده انتا برنس :wavetowel:

بالنسبة لنقطة قيمة الصرف شغالة عنب 

بالنسبة لموضوع صنف معين عندى ملحوظة صغيرة :

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

الأول : عن طريق نموذج جديد بيعرض الحركات اللى قيمتها صفر من الجدول يكون فيه زر الأمر اللى بيبدأ الفانكشن .

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

ملحوظة كبيرة : 

عارف انى تعبتك معايا بس والله بدعيلك يا أخى ربنا يجازيك خير ويكرمك :signthankspin:

 

ممكن تعدل على المرفق ده يا أستاذ جمال 

 

test.rar

تم تعديل بواسطه elkareee
رابط هذا التعليق
شارك

ولا يهمك المهم نضبط البرنامج

أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة

ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها

 

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

 

  • Like 1
رابط هذا التعليق
شارك

الان, Gamal.Saad said:

ولا يهمك المهم نضبط البرنامج

أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة

ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها

 

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

 

تمام هحاول اطبق الفكرة واوافيك بالنتيجة

رابط هذا التعليق
شارك

منذ ساعه, Gamal.Saad said:

ولا يهمك المهم نضبط البرنامج

أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة

ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها

 

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

 

شوف كده يا استاذ جمال مش عارف الخطأ فين

عملت فورم جديد بيظهر السجل اللى فيه zvalue = 0 عشان يتم تقييم الحركة يدوى بواسطة المالية وفى AfterUpdate لحقل القيمة وضعت الفانكشن لكن بتظهر رسالة بحفظ التغييرات ولما احفظها الناتج احيانا مش بيظبط معايا بص عليها بعد اذنك

 

FinalTest.rar

رابط هذا التعليق
شارك

10 ساعات مضت, Gamal.Saad said:

حيث تقوم بالتجربة واختيار مكان وتوقيت جديد لتنفيذ الدالة الحسابية

test2.rar

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

 

2.PNG.6f5f2e6456378ca1a1b5a94ac76f4051.PNG

فى المرفق جرب تحط قيمة أول صنف وبعدين انزل على أول حركة فى الصنف Amr واديها قيمة هتلاقى التقرير بالشكل اللى فى الصورة ده حسب صنف وساب التانى ايه السبب فى كده ؟؟

معلش يا استاذنا تاعبينك معانا 

Test3.rar

رابط هذا التعليق
شارك

13 ساعات مضت, Gamal.Saad said:

حيث تقوم بالتجربة واختيار مكان وتوقيت جديد لتنفيذ الدالة الحسابية

test2.rar

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

1.PNG.015cce27bd0ad4730f9edf2f3f1e45c4.PNG

 

طيب جربت اشغل الفانكشن الأول الخاص بكل السجلات النتيجة صحيحة انظر الصورة رقم 2 !! مطابقة للألة الحاسبة 

 

 

 

2.PNG.6800dae1e3558b31408c0b41cbfd2e89.PNG

 

ايه سبب الخطأ ده ؟؟ 

جرب على المرفق السابق كده بعد اذنك 

جزاك الله خير

 

 

رابط هذا التعليق
شارك

ههههههه

واحدة واحدة

هناك أكثر من مشكلة متداخلة بعد تغيير مكان وتوقيت تنفيذ الفانكشن وأهمها اثنتين

عدم التحديث الفوري للقيمة داخل الجدول

تحويل الكود للتعامل مع صنف واحد مع الحفاظ على التسلسل

 

سأحاول حل المشكلات في أقرب وقت

وقد أتأخر عليك للغد إن شاء الله لظروف الشهر الكريم

لكن لا تقلق

الكود أندركنترول حتى تاريخه

 

 

  • Like 1
رابط هذا التعليق
شارك

9 ساعات مضت, Gamal.Saad said:

الكود أندركنترول حتى تاريخه

 

ههههههه الأمن مستتب سيادتك وفى انتظار التعليمات فى الغد الباكر ان شاء الله وكل عام وانتم بخير :wavetowel:

 

فى حاجة نسيت اقولك عليها الاستعلام Q بعد تقييم كل الحركات فى النموذج بيفضل مفتوح بعد اخر حركة مش بيتقفل وطبعا مش هيتمسح وهوا مفتوج :clapping:

 

 

تم تعديل بواسطه elkareee
  • Like 1
رابط هذا التعليق
شارك

ههههههههه

 

يوجد حل سريع

وهو أنك بعدما تقوم بادخال القيمة يتم اغلاق وفتح النموذج بصورة فورية

فينتج عن ذلك

حفظ البيانات بالجدول ثم نقوم باستدعاء الفانكشن لتعمل على الصنف كما بالسابق كأن شيئا لم يحدث

وقبل اغلاق النموذج سنحتفظ بكود الصنف لدى متغير عام بالنموذج طبعا لكي يتم العمل على الصنف فقط

وأضفت لك كود لاغلاق النموذج حال البيانات صفر وحذف للاستعلام المؤقت

 

فاذا كانت بعض النتائج الحسابية غير صحيحة فيمكن تتبع الأخطاء

أما اذا أظلم الكود تماما فالأفضل إعادة الهيكلة

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

لأنك لو قمت بالتغيير لاحقا من المؤكد ستحتاج للتعديل مجددا

 

تقييم 6.rar

  • Like 1
رابط هذا التعليق
شارك

8 ساعات مضت, Gamal.Saad said:

أما اذا أظلم الكود تماما فالأفضل إعادة الهيكلة

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

لأنك لو قمت بالتغيير لاحقا من المؤكد ستحتاج للتعديل مجددا

تقييم 6.rar

برنس ياباشا الحل شغال وطريقة الحساب زى الفل متتعبش نفسك فى حاجة تانى ولا تعديل على الكود حاليا أنا استقريت على النموذج ده وهشتغل عليه وهوا كده ولو فيه أى حاجة فى المستقبل هفتح موضوع جديد لأن الموضوع ده قرب يدخل كاس العالم فى البلى مسافات بعيدة :dance1:

جزاك الله خير أخى الكريم تعبت جامد فى الموضوع ربنا يجازيك خير ويرزقك :fff:

  • Like 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information