تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
با سلام
من یک جدول دارم که تاریخ های کل سال را روزانه ثبت شده و در فیلد دیگر این جدول مقادیر ظرفیت روزانه وجود دارد. (جدول 1)
مشابه ذیل :
تاریخ |
ظرفیت |
98/01/02 |
500 |
98/01/03 |
400 |
98/01/04 |
300 |
98/01/05 |
700 |
جدول 1
جدول دیگری نیز وجود داره که مقدار سفارش مورد نیاز ثبت شده (جدول 2)
مشابه ذیل :
شماره سفارش |
مقدار سفارش |
1 |
1000 |
2 |
500 |
جدول 2
حالا میخوام کوئری بسازم که مثلا سفارش 1 رو در جدول 1 بررسی بکنه و بگه جهت این سفارش باید تاریخ 98/01/02 به مقدار 500 و 98/01/03 به مقدار 400 و 98/01/04 به مقدار 100 واحد تولید بشه سپس از ادامه ظرفیت باقی مانده 98/01/04 که 200 تا میشه شروع کنه سفارش شماره 2 رو تامین بکنه که میشه 98/01/04 به میزان 200 واحد و 98/01/05 به میزان 300 واحد و همینطوری برای سایر روزها و سایر سفارشات بشه محاسبه کرد.
ممنون میشم راهنمایی کنید.
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
بیان دقیق و درست پرسش خودش نیمی از پاسخ هست!
خواسته شما مستقیم در کوئری بدست نمیاد و نیاز به کدنویسی داره.
اول باید یک جدول جدید بسازین شامل فیلدهای: شماره سفارش، تاریخ، و میزان
کوئری رو روی این جدول باید اجرا کنین.
یک روتین هم باید بنویسین که دو جدول اصلی رو رکورد به رکورد پیمایش و پردازش کنه و نتیجه رو در جدول جدید بنویسه.
روش هم به این صورت هست که از اولین سفارش و اولین تاریخ تولید شروع میکنین و مقادیر رو میخونین (در متغیر میریزین)
اگر میزان سفارش کمتر یا برابر از مقدار تولید هست : در جدول سوم شماره سفارش و تاریخ تولید و میزان سفارش رو مینویسین و میزان سفارش رو از میزان تولید کم میکنین و میرین سراغ سفارش بعدی
اگر میزان سفارش بیشتر از میزان تولید هست : در جدول سوم شماره سفارش و تاریخ تولید و میزان تولید رو مینویسین و میرین سراغ تاریخ تولید بعدی
این کار رو تا زمانی انجام میدین که هر کدوم از رکوردست ها به پایان برسه.
کد ساده هست ولی دقت میخواد، اگر مشکلی با نوشتن اون دارین خبر بدین.
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
با سلام
اگه لطف کنین میشه کدشو بزارین
من نتونستن کدشو بنویسم
ممنون از وقتی که میزارین
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
الگوریتم رو براتون آماده میکنم
time
2 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
اول پر کردن جداول با دیتا تست:
ضمیمه 151061
ضمیمه 151062
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
Sub Fill_Data()
DoCmd.RunSQL "Delete * From Orders"
DoCmd.RunSQL "Delete * From Production"
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("Production")
Dim MM, DD, Days As Long
For MM = 1 To 12
Days = IIf(MM < 7, 31, 30)
For DD = 1 To Days
rs.AddNew
rs("[Date]") = 13980000 + MM * 100 + DD
rs("Quantity") = 100 * RndX(1, 15)
rs.Update
Next DD
Next MM
rs.Close
Set rs = CurrentDb.OpenRecordset("Orders")
Dim i As Integer
For i = 1 To 500
rs.AddNew
rs("OrderID") = i
rs("Quantity") = 100 * RndX(1, 10)
rs.Update
Next i
rs.Close
Set rs = Nothing
End Sub
Public Function RndX(MIN As Long, Max As Long) As Long
Randomize Timer
RndX = Int((Max - MIN + 1) * Rnd + MIN)
End Function
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
روتین پر کردن جدول OrderByDate :
Sub Calc()
DoCmd.RunSQL "Delete * From OrderByDate"
Dim rsP As Recordset
Dim rsO As Recordset
Dim rsOBD As Recordset
Set rsO = CurrentDb.OpenRecordset("SELECT * FROM Orders ORDER BY OrderID")
Set rsP = CurrentDb.OpenRecordset("SELECT * FROM Production ORDER BY [Date]")
Set rsOBD = CurrentDb.OpenRecordset("OrderByDate")
Dim OQ, PQ, Q As Long
PQ = rsP("Quantity")
OQ = rsO("Quantity")
Do
Q = IIf(PQ < OQ, PQ, OQ)
If Q > 0 Then
rsOBD.AddNew
rsOBD("OrderID") = rsO("OrderID")
rsOBD("[Date]") = rsP("[Date]")
rsOBD("Quantity") = Q
rsOBD.Update
End If
If PQ >= OQ Then
PQ = PQ - OQ
rsO.MoveNext
If rsO.EOF Then Exit Do
OQ = rsO("Quantity")
Else
OQ = OQ - PQ
rsP.MoveNext
If rsP.EOF Then Exit Do
PQ = rsP("Quantity")
End If
Loop
rsP.Close
rsO.Close
rsOBD.Close
Set rsP = Nothing
Set rsO = Nothing
Set rsOBD = Nothing
End Sub
1 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
1 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
بررسی صحت عملیات :
SELECT OrderByDate.Date, Production.Quantity, Sum(OrderByDate.Quantity) AS SumOfQuantity
FROM OrderByDate INNER JOIN Production ON OrderByDate.Date = Production.Date
GROUP BY OrderByDate.Date, Production.Quantity;
ضمیمه 151064
1 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
بررسی صحت عملیات :
SELECT OrderByDate.OrderID, Orders.Quantity, Sum(OrderByDate.Quantity) AS SumOfQuantity
FROM OrderByDate INNER JOIN Orders ON OrderByDate.OrderID = Orders.OrderID
GROUP BY OrderByDate.OrderID, Orders.Quantity;
ضمیمه 151065
1 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
بسیار بسیار متشکرم
واقعا عالی بود
1 ضمیمه
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
با سلام
من به یک مشکل دیگه ای برخوردم Order های من دارای مدل های مختلفی (Type) هستش که اون ها را داخل جدول Orders گذاشتم و این مدل ها در جدول Production فقط در بعضی از روزها تولید می شوند.(باید محاسبات طوری باشه که روزهایی که Type موجود در جدول Production برابر با type موجود در جدول order بشه در نظر گرفته بشن)
مثلا orderID های 1و5و8 که دارای Type یک (1) هستند و مقدارشون 900 و 200 و1500 هستش باید در جدول Production ، فقط در روزهایی که دارای Type یک (1) هستن باید تولید بشوند (در روزهای 1398/01/01 ، 1398/01/03 ، 1398/01/06 ، 1398/01/10 ، 1398/01/11)
ممنون میشم تو فایلی که گذاشتم اصلاح کنین
با تشکر
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
سر فرصت فایل پیوست رو چک میکنم
ولی بنظر میاد کافی هست شرط رو موقع باز کردن رکوردست اعمال کنین!
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
همین که شرط رو اضافه کنین کافی هست (هر دو رکوردست)
برای هر type باید جداگانه محاسبه کنین
البته بهتر هست که فیلد type رو به جدول OrderByDate هم اضافه کنین
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
با سلام
امکان انجام کلیه Type ها به صورت همزمان وجود نداره ؟
تعداد Type ها خیلی زیاده
یا اینکه به صورت اتوماتیک بره هر نوع رو حساب کنه و در آخر تو جدول بریزه؟
برای برنامه تولید میخوام انجام بدم
اگه کمک کنین ممنون میشم
خیلی بهش نیاز دارم
با تشکر
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
1-در همون روتین calc یک آرگومان برای type تعریف کنید (البته اسم type رو عوض کنین چون reserved هست - فرضا ptype)
در طراحی جدول ها هم همین تغییر نام رو انجام بدین و نوع اون رو هم integer بگذارین و نه string
SUB CALC(PTYPE AS INTEGER)
2- کد پاک کردن دیتا ORDERBYDATE رو حذف کنین
3- شرط =WHERE PTYPEرو به کد بازکردن رکوردست ها اضافه کنین
4- مقدار PTYPE رو هم در جدول ORDERBYDATE بنویسین
5- یک روتین جدید بنویسین که در یک حلقه بازای تمام مقادیر PTYPE روتین CALC رو اجرا کنه
کد مرحله 2 رو در ابتدای این روتین بگذارین
نقل قول: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه
با سپاس فراوان
مشکل حل شد