Gamal.Saad قام بنشر يونيو 4, 2017 قام بنشر يونيو 4, 2017 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 2
elkareee قام بنشر يونيو 4, 2017 الكاتب قام بنشر يونيو 4, 2017 الان, Gamal.Saad said: أحتاج تشرح لي هذه النقطة المفترض الحركة إما صرف أو اضافة وفي الصورة الحركة صفر لأن السجل يكون حركة اضافة أما متوسط السعر مضروبا بالكمية فهو قيمة الرصيد كما بالصورة استاذى الفاضل انا قصدت فى الصورة القيمة المالية وليسة الكمية انظر الصورة بها التوضيح المفترض ان القيمة هنا ليست صفر وانما حاصل ضرب متوسط السعر فى كمية الصرف بالنسبة للفانكشن هجرب كده وان شاء الله خير لو فى اى تعديل باذن الله نتناقش فيه ونظبطها جزاك الله خير أخى المحترم
elkareee قام بنشر يونيو 4, 2017 الكاتب قام بنشر يونيو 4, 2017 الان, Gamal.Saad said: وهذه هي الفانكشن قبل التنقيح والتعديل لصنف واحد حتى هذه النقطة حتى يستفيد من يهتم من الزملاء بداية نتيجة اكثر من رائعة من النظرة الأولى وجارى التعمق فيها وتذكر نقطة القيمة المالية لحركة الصرف يتم حسابها وقيمتها لا تساوى صفر جارى التعمق فى التجربة وموافاتك بالنتيجة استاذنا الفاضل جزاك الله خير 1
elkareee قام بنشر يونيو 4, 2017 الكاتب قام بنشر يونيو 4, 2017 2 ساعات مضت, Gamal.Saad said: سيساعد ذلك على اختصار الوقت بصورة قد تكون هائلة لأنه سيتم استدعاء سجلات الحركة للصنف فقط ثم تمر على كل سجل المعادلة الحسابية بدلا من كافة سجلات الجدول الخمسين ألف تم التجربة أخى الكريم والنتيجة مرضية الحمدلله على المثال وأظن ان الفانكشن دى تغنى عن الأولى لأنها تتضمنها بداخلها بالتالى التانية غير مطلوبة استفسار : بخصوص ID المذكور فى الفانكشن هوا اللى يخص جدول Trans_Top يعنى بالتالى لو فى تاريخ واحد حصل فيه حركتين هيتم الترتيب بأولوية التسجيل تمام كده ؟ وعشان يكون ترتيب التقرير فى العرض بتاعه يكون زى ترتيب عمل الفانكشين هنضيف فى الاستعلام مصدر التقرير جدول Trans_Top ونختار الحقلين zDate , ID ويكون الترتيب Ascending تمام كده ؟ أظن اننا كده غطينا جميع النقط فاضل بس ملحوظة قيمة حركة الصرف وتبقى كده العملية مظبوطة فى كافة الاتجاهات و بالنسبة لتهيئة الفانكشن لتعمل على كل صنف على حدى لأنه هيكون أسهل و أسرع ممكن بعد ما تصممها نحطها فى Event On open فى التقرير المفصل لكل صنف وتاخد الكود الموجود فى التقرير وتشتغل عليه عارف انك بذلت مجهود جامد فى الموضوع والله جزاك الله خير تقبل تحياتى
Gamal.Saad قام بنشر يونيو 4, 2017 قام بنشر يونيو 4, 2017 استفسار : بخصوص ID المذكور فى الفانكشن هوا اللى يخص جدول Trans_Top يعنى بالتالى لو فى تاريخ واحد حصل فيه حركتين هيتم الترتيب بأولوية التسجيل تمام كده ؟ الحقل المميز للسجل المعرف ID يخص جدول الحركة Transaction حيث يتم الاستناد إلي ذلك الحقل عند تحديث أي قيمة بالسجل لما له من دور هام في حالة أكثر من حركة للصنف بنفس اليوم وعشان يكون ترتيب التقرير فى العرض بتاعه يكون زى ترتيب عمل الفانكشين هنضيف فى الاستعلام مصدر التقرير جدول Trans_Top ونختار الحقلين zDate , ID ويكون الترتيب Ascending تمام كده ؟ تمام يا فندم وذلك في حالة صنف واحد في حالة أكثر من صنف فيتم الترتيب تصاعديا لاسم الصنف بجانب التاريخ أما وفي المثال استند المثال إلى استعلام به نفس ما ذكرته أنت من استناد للجدول توب مرتبطا بجدول الحركة مع ترتيب حسب التاريخ أظن اننا كده غطينا جميع النقط فاضل بس ملحوظة قيمة حركة الصرف وتبقى كده العملية مظبوطة فى كافة الاتجاهات أوك. سنضيف القيمة تساوي متوسط السعر مضروبا بالكمية وبالمناسبة عندي سؤال : أريد التأكد من أن القيمة بالنسبة لحركة الاضافة يتم ادراجها يدويا حسب فاتورة الشراء ؟ أليس كذلك ؟ و بالنسبة لتهيئة الفانكشن لتعمل على كل صنف على حدى لأنه هيكون أسهل و أسرع فعلا . إن شاء الله عارف انك بذلت مجهود جامد فى الموضوع والله جزاك الله خير تقبل تحياتى وجزاكم كل خير لكن أرجو من لديه فكرة عن استخدام استعلام التحديث ليحل محل الفانكشن أن يطرحها لأن المسألة عندي تتطلب عمل جدول مؤقت وأكثر من استعلام
elkareee قام بنشر يونيو 4, 2017 الكاتب قام بنشر يونيو 4, 2017 (معدل) الان, Gamal.Saad said: وبالمناسبة عندي سؤال : أريد التأكد من أن القيمة بالنسبة لحركة الاضافة يتم ادراجها يدويا حسب فاتورة الشراء ؟ أليس كذلك ؟ استاذى الفاضل بالفعل يتم ادراجها يدويا تبع الفاتورة الان, Gamal.Saad said: لكن أرجو من لديه فكرة عن استخدام استعلام التحديث ليحل محل الفانكشن أن يطرحها لأن المسألة عندي تتطلب عمل جدول مؤقت وأكثر من استعلام بالنسبة للموضوع ده فى هنا خبراء محترفين وأكيد هيشاركوا الافكار بس دخولهم متقطع بمناسبة رمضان ومع ذلك حضرتك تتفضل وتعمل موضوع جديد تشير فيه للموضوع الحالى بعد اكتمال الفانكشن النهائية ونختار هنا أفضل اجابة ونتابع الموضوع التانى بس افضل انك انتا اللى تعمل بيه موضوع جديد لأن المناقشات هتكون اعلى من مستوايا وهتحتاج فنيات مش عندى كل واحد وتعليمه بقى ههههه وانا هعملك اشارة لأساتذتنا الافاضل عشان يشاركو فى الموضوع . وفى انتظار باقى الموضوع تقبل الله منا و منك صالح الأعمال تم تعديل يونيو 4, 2017 بواسطه elkareee
أفضل إجابة Gamal.Saad قام بنشر يونيو 4, 2017 أفضل إجابة قام بنشر يونيو 4, 2017 الأساتذة @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 1
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 (معدل) 8 ساعات مضت, Gamal.Saad said: والله كلامك وسام شرف وأنا مازلت في بداية الطريق وأتمنى أكون عند حسن الظن حبيبنا يا أستاذ جمال بلاش التواضع ده انتا برنس بالنسبة لنقطة قيمة الصرف شغالة عنب بالنسبة لموضوع صنف معين عندى ملحوظة صغيرة : بالنسبة للنموذج اللى حضرتك عدلت عليه ده يخص أمين المخزن وليس مراقب المخزون وبالتالى امين المخزن ملوش صلاحية انه يشوف التقرير بتاع التقييمات ولذلك مينفعش يبقى التقرير بيفتح عن طريق النموذج ده لذلك عندنا اختيارين : الأول : عن طريق نموذج جديد بيعرض الحركات اللى قيمتها صفر من الجدول يكون فيه زر الأمر اللى بيبدأ الفانكشن . التانى :الفانكشن تكون فى التقرير عند الفتح مش عن طريق نماذج خالص يعنى لما اعرض تقرير لصنف معين تقوم الفانكشن شغالة على الصنف ده . ملحوظة كبيرة : عارف انى تعبتك معايا بس والله بدعيلك يا أخى ربنا يجازيك خير ويكرمك ممكن تعدل على المرفق ده يا أستاذ جمال test.rar تم تعديل يونيو 5, 2017 بواسطه elkareee
Gamal.Saad قام بنشر يونيو 5, 2017 قام بنشر يونيو 5, 2017 ولا يهمك المهم نضبط البرنامج أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها يعني ممكن تضعها في حدث بعد تحديث كمية صنف الصرف أو بعد تحديث سعر الاضافة حسب احتياجات المعادلة الحسابية 1
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 الان, Gamal.Saad said: ولا يهمك المهم نضبط البرنامج أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها يعني ممكن تضعها في حدث بعد تحديث كمية صنف الصرف أو بعد تحديث سعر الاضافة حسب احتياجات المعادلة الحسابية تمام هحاول اطبق الفكرة واوافيك بالنتيجة
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 منذ ساعه, Gamal.Saad said: ولا يهمك المهم نضبط البرنامج أنا أميل لتشغيل الفانكشن مع كل حركة صنف في النموذج لكي تحسب لك الرصيد بعد الحركة ولن نحتاج لزر تشغيلها يظهر بالنموذج أو لعرض التقرير بعد تشغيلها يعني ممكن تضعها في حدث بعد تحديث كمية صنف الصرف أو بعد تحديث سعر الاضافة حسب احتياجات المعادلة الحسابية شوف كده يا استاذ جمال مش عارف الخطأ فين عملت فورم جديد بيظهر السجل اللى فيه zvalue = 0 عشان يتم تقييم الحركة يدوى بواسطة المالية وفى AfterUpdate لحقل القيمة وضعت الفانكشن لكن بتظهر رسالة بحفظ التغييرات ولما احفظها الناتج احيانا مش بيظبط معايا بص عليها بعد اذنك FinalTest.rar
Gamal.Saad قام بنشر يونيو 5, 2017 قام بنشر يونيو 5, 2017 أوك جرب التعديل المرفق ولا تقلق فهذا أمر طبيعي حيث تقوم بالتجربة واختيار مكان وتوقيت جديد لتنفيذ الدالة الحسابية test2.rar
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 10 ساعات مضت, Gamal.Saad said: حيث تقوم بالتجربة واختيار مكان وتوقيت جديد لتنفيذ الدالة الحسابية test2.rar جميل استاذى الفاضل هيا اشتغلت تمام بس فيه ملحوظة أنا جربت اضيف كمان صنف وضفت قيمته فى النموذج بس فى التقرير بيطلع القيمة لكن المتوسط مش بيتحسب ولا رصيد بعد الحركة شوف الصورة كده فى المرفق جرب تحط قيمة أول صنف وبعدين انزل على أول حركة فى الصنف Amr واديها قيمة هتلاقى التقرير بالشكل اللى فى الصورة ده حسب صنف وساب التانى ايه السبب فى كده ؟؟ معلش يا استاذنا تاعبينك معانا Test3.rar
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 13 ساعات مضت, Gamal.Saad said: حيث تقوم بالتجربة واختيار مكان وتوقيت جديد لتنفيذ الدالة الحسابية test2.rar استاذ جمال بعد التعمق فى التجربة اكتشفت خطأ ثانى انظر الصورة رقم 1 دى نتيجة الفانكشن الخاصة بصنف واحد اللى هيا الاخيرة بص على اخر حركة خاص بعد حركتين الخصم هتلاقى حساب المتوسط ليهم خطأ المفترض يبقى زى الألة الحاسبة كده طيب جربت اشغل الفانكشن الأول الخاص بكل السجلات النتيجة صحيحة انظر الصورة رقم 2 !! مطابقة للألة الحاسبة ايه سبب الخطأ ده ؟؟ جرب على المرفق السابق كده بعد اذنك جزاك الله خير
Gamal.Saad قام بنشر يونيو 5, 2017 قام بنشر يونيو 5, 2017 ههههههه واحدة واحدة هناك أكثر من مشكلة متداخلة بعد تغيير مكان وتوقيت تنفيذ الفانكشن وأهمها اثنتين عدم التحديث الفوري للقيمة داخل الجدول تحويل الكود للتعامل مع صنف واحد مع الحفاظ على التسلسل سأحاول حل المشكلات في أقرب وقت وقد أتأخر عليك للغد إن شاء الله لظروف الشهر الكريم لكن لا تقلق الكود أندركنترول حتى تاريخه 1
elkareee قام بنشر يونيو 5, 2017 الكاتب قام بنشر يونيو 5, 2017 (معدل) 9 ساعات مضت, Gamal.Saad said: الكود أندركنترول حتى تاريخه ههههههه الأمن مستتب سيادتك وفى انتظار التعليمات فى الغد الباكر ان شاء الله وكل عام وانتم بخير فى حاجة نسيت اقولك عليها الاستعلام Q بعد تقييم كل الحركات فى النموذج بيفضل مفتوح بعد اخر حركة مش بيتقفل وطبعا مش هيتمسح وهوا مفتوج تم تعديل يونيو 5, 2017 بواسطه elkareee 1
Gamal.Saad قام بنشر يونيو 5, 2017 قام بنشر يونيو 5, 2017 ههههههههه يوجد حل سريع وهو أنك بعدما تقوم بادخال القيمة يتم اغلاق وفتح النموذج بصورة فورية فينتج عن ذلك حفظ البيانات بالجدول ثم نقوم باستدعاء الفانكشن لتعمل على الصنف كما بالسابق كأن شيئا لم يحدث وقبل اغلاق النموذج سنحتفظ بكود الصنف لدى متغير عام بالنموذج طبعا لكي يتم العمل على الصنف فقط وأضفت لك كود لاغلاق النموذج حال البيانات صفر وحذف للاستعلام المؤقت فاذا كانت بعض النتائج الحسابية غير صحيحة فيمكن تتبع الأخطاء أما اذا أظلم الكود تماما فالأفضل إعادة الهيكلة لكن بعد أن تستقر على نموذج وطريقة لتحديث وتشغيل الفانكشن لأنك لو قمت بالتغيير لاحقا من المؤكد ستحتاج للتعديل مجددا تقييم 6.rar 1
elkareee قام بنشر يونيو 6, 2017 الكاتب قام بنشر يونيو 6, 2017 8 ساعات مضت, Gamal.Saad said: أما اذا أظلم الكود تماما فالأفضل إعادة الهيكلة لكن بعد أن تستقر على نموذج وطريقة لتحديث وتشغيل الفانكشن لأنك لو قمت بالتغيير لاحقا من المؤكد ستحتاج للتعديل مجددا تقييم 6.rar برنس ياباشا الحل شغال وطريقة الحساب زى الفل متتعبش نفسك فى حاجة تانى ولا تعديل على الكود حاليا أنا استقريت على النموذج ده وهشتغل عليه وهوا كده ولو فيه أى حاجة فى المستقبل هفتح موضوع جديد لأن الموضوع ده قرب يدخل كاس العالم فى البلى مسافات بعيدة جزاك الله خير أخى الكريم تعبت جامد فى الموضوع ربنا يجازيك خير ويرزقك 1
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.