PDA

View Full Version : حرفه ای: تکمیل ظرفیت روزانه با احتساب مقادیر اولیه



bita_ziba77
پنج شنبه 07 آذر 1398, 12:09 عصر
با سلام
من یک جدول دارم که تاریخ های کل سال را روزانه ثبت شده و در فیلد دیگر این جدول مقادیر ظرفیت روزانه وجود دارد. (جدول 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 واحد و همینطوری برای سایر روزها و سایر سفارشات بشه محاسبه کرد.
ممنون میشم راهنمایی کنید.

mazoolagh
شنبه 09 آذر 1398, 07:48 صبح
بیان دقیق و درست پرسش خودش نیمی از پاسخ هست!

خواسته شما مستقیم در کوئری بدست نمیاد و نیاز به کدنویسی داره.

اول باید یک جدول جدید بسازین شامل فیلدهای: شماره سفارش، تاریخ، و میزان
کوئری رو روی این جدول باید اجرا کنین.

یک روتین هم باید بنویسین که دو جدول اصلی رو رکورد به رکورد پیمایش و پردازش کنه و نتیجه رو در جدول جدید بنویسه.
روش هم به این صورت هست که از اولین سفارش و اولین تاریخ تولید شروع میکنین و مقادیر رو میخونین (در متغیر میریزین)
اگر میزان سفارش کمتر یا برابر از مقدار تولید هست : در جدول سوم شماره سفارش و تاریخ تولید و میزان سفارش رو مینویسین و میزان سفارش رو از میزان تولید کم میکنین و میرین سراغ سفارش بعدی
اگر میزان سفارش بیشتر از میزان تولید هست : در جدول سوم شماره سفارش و تاریخ تولید و میزان تولید رو مینویسین و میرین سراغ تاریخ تولید بعدی

این کار رو تا زمانی انجام میدین که هر کدوم از رکوردست ها به پایان برسه.

کد ساده هست ولی دقت میخواد، اگر مشکلی با نوشتن اون دارین خبر بدین.

bita_ziba77
شنبه 09 آذر 1398, 09:43 صبح
با سلام
اگه لطف کنین میشه کدشو بزارین
من نتونستن کدشو بنویسم


ممنون از وقتی که میزارین

mazoolagh
شنبه 09 آذر 1398, 12:42 عصر
الگوریتم رو براتون آماده میکنم

time

mazoolagh
یک شنبه 10 آذر 1398, 12:41 عصر
اول پر کردن جداول با دیتا تست:

151061

151062

mazoolagh
یک شنبه 10 آذر 1398, 12:43 عصر
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

mazoolagh
یک شنبه 10 آذر 1398, 12:45 عصر
روتین پر کردن جدول 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

mazoolagh
یک شنبه 10 آذر 1398, 12:46 عصر
نتیجه کار:

151063

mazoolagh
یک شنبه 10 آذر 1398, 12:49 عصر
بررسی صحت عملیات :

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

mazoolagh
یک شنبه 10 آذر 1398, 12:51 عصر
بررسی صحت عملیات :

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

mazoolagh
یک شنبه 10 آذر 1398, 12:52 عصر
برنامه نمونه

bita_ziba77
یک شنبه 10 آذر 1398, 13:25 عصر
بسیار بسیار متشکرم
واقعا عالی بود

bita_ziba77
جمعه 15 آذر 1398, 09:56 صبح
با سلام
من به یک مشکل دیگه ای برخوردم 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)
ممنون میشم تو فایلی که گذاشتم اصلاح کنین


با تشکر

mazoolagh
شنبه 16 آذر 1398, 08:49 صبح
سر فرصت فایل پیوست رو چک میکنم

ولی بنظر میاد کافی هست شرط رو موقع باز کردن رکوردست اعمال کنین!

mazoolagh
یک شنبه 17 آذر 1398, 11:52 صبح
همین که شرط رو اضافه کنین کافی هست (هر دو رکوردست)
برای هر type باید جداگانه محاسبه کنین

البته بهتر هست که فیلد type رو به جدول OrderByDate هم اضافه کنین

bita_ziba77
یک شنبه 17 آذر 1398, 11:57 صبح
با سلام
امکان انجام کلیه Type ها به صورت همزمان وجود نداره ؟
تعداد Type ها خیلی زیاده
یا اینکه به صورت اتوماتیک بره هر نوع رو حساب کنه و در آخر تو جدول بریزه؟
برای برنامه تولید میخوام انجام بدم
اگه کمک کنین ممنون میشم
خیلی بهش نیاز دارم

با تشکر

mazoolagh
یک شنبه 17 آذر 1398, 12:28 عصر
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 رو در ابتدای این روتین بگذارین

bita_ziba77
دوشنبه 18 آذر 1398, 11:32 صبح
با سپاس فراوان
مشکل حل شد