สอบถามเรื่องการวางแผนการผลิต
กระทู้เก่าบอร์ด อ.Yeadram

 3,161   14
URL.หัวข้อ / URL
สอบถามเรื่องการวางแผนการผลิต

อาจารย์ครับ คือผมมีฟิลด์ที่ใช้เก็บคำสั่งซื้อของลูกค้าประกอบด้วย

วันที่สั่งสินค้า(DateJob),วันที่ส่ง(DateSend),ชื่อลูกค้า(IDCusมาจากอีกฟิลด์หนึ่ง),

ชื่อสินค้า(IDToyมาจากอีกฟิลด์หนึ่ง) ,จำนวนที่สั่ง(Qty)

แล้วเมื่อมีคำสั่งซื้อของลูกค้าเข้ามา เช่น

สั่งวันที่ 1/11/2555 ส่งวันที่ 14/11/2555 ชื่อ John สั่งตุ๊กตา จำนวน 2000 ชิ้น

โดยตุ๊กตามีกำลังการผลิต 200 ต่อวัน แล้วใช้มันวางแผนแบบนี้ครับ

1/11/2555      200
2/11/2555      200
3/11/2555      200
4/11/2555      200
5/11/2555      200
6/11/2555      200
7/11/2555      200
8/11/2555      200
9/11/2555      200
10/11/2555    200

ประมาณนี้อ่ะครับ แล้วคือถ้าสมมุติมี Order เข้ามาอีกในวันที่ 2/11/2555

โดยสมมติว่าสั่งรถบังคับ 500 ชิ้นแล้ววิธีวางแผนก็คือต้องให้Order เสร็จก่อนอ่ะครับ

โดยที่กำลังการผลิตเป็น 200 ต่อวันแล้วจะได้แบบนี้ครับ

11/11/2555    200
12/11/2555    200
13/11/2555    100

แล้วถ้าเกิดมีออร์เดอร์เข้ามาก็จะทำแบบนี้ไปเรื่อยโดยต้องให้สินค้าก่อนหน้า

ผลิตเสร็จก่อนอ่ะครับ รบกวนอาจารย์ด้วยนะครับ


14 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R12818
ถ้าคิดแบบง่าย
คือ สั่งผลิตเต็มกำลังทุกครั้ง ยกเว้นวันสุดท้ายที่เป็นเศษ (กรณีนี้หมายถึง พนักงาน Line นี้จะไม่ถูกโยกไปทำงาน Line อื่น)
สามารถคำนวณได้โดย
1) หาวันที่สุดท้ายของคำสั่งผลิต
Selec max([วันที่สั่งผลิต])
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'"
2) หาจำนวนที่สั่งผลิตของวันสุดท้ายนั้น
Select [จำนวนที่สั่งผลิต]
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'"
And [วันที่สั่งผลิต] =

1) + 2) =
Select [จำนวนที่สั่งผลิต]
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'"
And [วันที่สั่งผลิต] = (Selec max([วันที่สั่งผลิต])
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'")

3) ถ้า [จำนวนที่สั่งผลิตของวันสุดท้าย] (ค่าจาก 2)) < [กำลังผลิต]
3.1) ถ้า [จำนวนที่สั่งซื้อ] - [จำนวนที่สั่งผลิตของวันสุดท้าย] <= [กำลังผลิต]
   - ให้ update [จำนวนที่สั่งผลิต] = [กำลังผลิต] - [จำนวนที่สั่งซื้อ]
   - หยุดการทำงาน
3.2) ถ้า [จำนวนที่สั่งซื้อ] - [จำนวนที่สั่งผลิตของวันสุดท้าย] > [กำลังผลิต]
   - ให้ update [จำนวนที่สั่งผลิต] = [กำลังผลิต] - [จำนวนที่สั่งผลิตของวันสุดท้าย]
   - [คำสั่งซื้อที่เหลือ] = [จำนวนที่สั่งซื้อ] - ([กำลังผลิต] - [จำนวนที่สั่งผลิตของวันสุดท้าย])

4) วน Loop ตามวันที่ต้องสั่งผลิตเต็มกำลัง

... ไว้ค่อยมาต่อนะครับ ขอตัวไปทำงานก่อน ...
2 @R12820
ขอบคุณอาจารย์นะครับเดี๋ยวผมลองทำตามดู
3 @R12821
อาจารย์ครับ คือถ้าสินค้ามันมีมากกว่าหนึ่งชนิด

โดยผมเก็บรหัสสินค้าไว้อีกเทเบิ้ลนึง เช่น A001 ตุ๊กตา
                                                           A002 รถบังคับ
                                                           A003 หุ่นยนต์

แล้วสินค้าพวกนี้ก็จะมีการสั่งผลิตสลับกันไปหรืออาจจะเหมือนกันก็ได้ในแต่ละเดือน

แล้วแต่ลูกค้าสั่งอ่ะครับ
4 @R12822
อ๋อ เข้าใจแล้วครับอาจารย์ที่อาจารย์ให้หาวันที่สุดท้ายของการสั่งผลิต

เพื่อจะนำมาคำนวณพอเข้าใจแล้วครับ แต่คงต้องรอโค้ดในการวนลูป

ขอบคุณครับอาจารย์
5 @R12824
คือโจทย์ของผมก็คือเมื่อมีคำสั่งซื้อของลูกค้าเข้ามาบริษัทก็จะผลิตสินค้าทันที

โดยวิธีการวางแผนก็คือเมื่อรับคำสั่งซื้อมา 1000 ชิ้น โดยจะต้องดูกำลังผลิต

ในแต่ล่ะวันซึ่งจะถูกกำหนดตามชนิดของสินค้าอยู่แล้ว เช่น 200 ชิ้นต่อวัน (โดยไม่

คำนึงถึง Line อื่นๆ) ก็จะทำการผลิต 5 วันคือเริ่มจากวันที่สั่งสินค้า เช่นสั่งวันที่

1/01/2555 จะผลิตเสร็จทั้งหมดวันที่ 5/01/2555 แล้วถ้ามีออร์เดอร์อื่นสั่งเข้ามา

เช่นสั่งเข้ามาในวันที่ 2/01/2555 แต่ว่าในวันที่ 2 ยังทำการผลิตออร์เดอร์แรกอยู่

ต้องรอให้ผลิตเสร็จก่อนดังนั้นจึงมาเริ่มในวันที่ 6/01/2555 วิธีการของอาจารย์

ก็คือ เมื่อรับออร์เดอร์แรกเข้ามาก็จะคำนวณ ปล้วหลังจากนั้นก็จะมาดูที่ออร์เดอร์

สุดท้ายแล้วก็คำนวณ ผมเข้าใจถูกหรือเปล่าครับอาจารย์
6 @R12825
คิดว่าคุณน่าจะเข้าใจถูกทางแล้ว
แก้ไข/ปรับปรุง ให้ใกล้ code มากขึ้น (แต่ไม่ได้ code จริงอาจมีผิดพลาดบ้าง กรุณาแก้ไขตามเหมาะสม)
1) หาวันที่สุดท้ายของคำสั่งผลิต
datLastPro = Selec max([วันที่สั่งผลิต])
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'"

2) หาวันที่เริ่มผลิต (อันนี้ขึ้นกับความซับซ้อนที่ต้องการ โดยผมตั้งสมมุติฐานว่า ถ้าลูกค้าสั่งของมาวันนี้ สั่งผลิตวันนี้ไม่ทันแน่ ต้องเริ่มผลิตพรุ่งนี้)
If datLastPro <= Date Then
   datPro = DateAdd(“d”,Date,1)
   lngLeftOrderQty = [จำนวนที่สั่งซื้อ]
Else
   
   datPro = DateAdd(“d”,datLastPro,1)
   lngLeftOrderQty = [จำนวนที่สั่งซื้อ] - lngAddLastProQty
End If

3) กรณี ให้สั่งผลิตเพิ่ม เนื่องจากคำสั่งผลิตสุดท้ายไม่เต็มกำลัง
3.1) หาจำนวนที่สั่งผลิตของวันสุดท้ายนั้น
lngLastProQty = Select [จำนวนที่สั่งผลิต]
From [ตารางผลิต]
Where [IDToy] = 'รถบังคับ'"
And [วันที่สั่งผลิต] = datLastPro
3.2) หาจำนวนที่ ให้สั่งผลิตเพิ่ม เนื่องจากคำสั่งผลิตสุดท้ายไม่เต็มกำลัง
lngAddLastProQty = [กำลังผลิต] - lngLastProQty
if lngAddLastProQty > [จำนวนที่สั่งซื้อ] Then
(กรณ๊นี้ตามข้อมูลที่แจ้ง ไม่น่าจะเกิดได้ แต่เขียนเผื่อไว้ก่อน)
   strSQL = “Update [ตารางผลิต] Set [จำนวนที่สั่งผลิต] = ” & [จำนวนที่สั่งซื้อ] _
      & “ Where IDToy = ‘รถบังคับ’”
   DoCmd.RunSQL strSQL
   Exit Sub ‘หยุดคำนวณต่อ เพราะเสร็จสิ้นการสั่งผลิตเพียงเท่านี้
Else
   strSQL = “Update [ตารางผลิต] Set [จำนวนที่สั่งผลิต] = ” & lngAddLastProQty _
      & “ Where IDToy = ‘รถบังคับ’”
   DoCmd.RunSQL strSQL
End If

4) วน Loop ตามวันที่ต้องสั่งผลิตเต็มกำลัง
Do While lngLeftOrderQty > 0

Loop
7 @R12826
2) หาวันที่เริ่มผลิต (อันนี้ขึ้นกับความซับซ้อนที่ต้องการ โดยผมตั้งสมมุติฐานว่า ถ้าลูกค้าสั่งของมาวันนี้ สั่งผลิตวันนี้ไม่ทันแน่ ต้องเริ่มผลิตพรุ่งนี้)
If datLastPro <= Date Then
   datPro = DateAdd(“d”,Date,1)
   lngLeftOrderQty = [จำนวนที่สั่งซื้อ]
Else
    ***(เอา Code ข้อ 3) มาวางตรงนี้ครับ)

   datPro = DateAdd(“d”,datLastPro,1)
   lngLeftOrderQty = [จำนวนที่สั่งซื้อ] - lngAddLastProQty
End If
8 @R12827
อาจารย์ครับ แล้วโค้ด ที่ให้มาใช้ในคำสั่ง Vb ในปุ่มใช่รึปล่าวครับ คือผมไม่ค่อย

ถนัด Vb ผมจะต้องเขียนอ้างถึงอะไรบ้างหรอครับ
9 @R12828
อาจารย์ครับ แล้วเราจะเขียนไว้ที่ไหนครับ ซึ่งผมมีคิวรีที่จะรับผลการคำนวณอยู่ครับ

ชื่อว่า qryPlanning ประกอบด้วย DateOrder(วันที่รับคำสั่งซื้อ),รหัสของเล่น,

จำนวนที่สั่งซื้อ,กำลังการผลิต,จำนวนที่สั่งผลิต

ผมจะต้องเอาโค้ดที่อาจารย์ให้มาใส่ตรงไหนครับรบกวนอาจารย์ด้วยนะครับ
10 @R12829
อาจารย์ครับผมเขียนโค้ดนี้ลงในปุ่ม ในฟอร์มรับคำสั่งซื้อสินค้า

datLastPro = "Select max([DateOrder]) From [OrderHistory] Where [Code] = [Code]"
    
    

    If datLastPro <= Date Then
    datPro = DateAdd(“d”, Date, 1)
    lngLeftOrderQty = [Qty]
    Else
     
   lngLastProQty = "Select [Limit] From [OrderHistory] Where [Code] = Code And [DateOrder] = datLastPro"

   
   
   lngAddLastProQty = [Limit] - lngLastProQty
   If lngAddLastProQty > [Qty] Then
    strSQL = "Update [OrderHistory] Set [Limit] = " & [Limit] _
      & " Where [Code] = [Code]"
   DoCmd.RunSQL strSQL
   Exit Sub 'ËÂØ´¤Ó¹Ç³µèÍ à¾ÃÒÐàÊÃç¨ÊÔ鹡ÒÃÊÑè¼ÅÔµà¾ÕÂà·èÒ¹Õé
Else
   strSQL = "Update [OrderHistory] Set [Limit] = " & lngAddLastProQty _
      & " Where [Code] = [Code]"
   DoCmd.RunSQL strSQL
End If
   datPro = DateAdd(“d”, datLastPro, 1)
   lngLeftOrderQty = [Limit] - lngAddLastProQty
End If
   Do While lngLeftOrderQty > 0
   
   Loop


คือแล้วมันบอกว่าไม่พบเขตข้อมูล '|' ที่ถูกอ้างถึงในนิพจน์

แล้วมันก็ไม่คำนวณค่าด้วยครับไม่ทราบว่าผมใส่อะไรผิด หรือว่าผมเขียนโค้ดผิดครับ
11 @R12832
กรณีต้องวน loop อย่างนี้ ผมเขียนเป็น vba ถนัดกว่าครับ
เพราะฉะนั้น ถ้าจะเขียนเป็น vba ก็วางใน event ของ ปุ่ม ถูกแล้วครับ

สิ่้งที่ผมเขียนให้ยังไม่เป็น code 100% เพราะที่จริงมีวิธีเขียนหลายแบบ ผมจึงเขียนเป็นเชิง concept ไว้ก่อน แล้วแต่ว่าคุณถนัดใช้ code แบบไหน ก็ไปแปลงตามถนัด
และผมก็ไม่รู้ว่าคุณจงใจสั่งคำนวณผ่าน query หรือ Form แล้ว From ของคุณหน้าตาเป็นอย่างไร มีการรับค่าอะไรบ้าง

เช่น
datLastPro = "Select max([DateOrder]) From [OrderHistory] Where [Code] = [Code]"
คุณไม่สามารถเขียน code แบบนี้ให้ทำงานได้หรอกครับ
วิธีเขียน code จริง ยกตัวอย่างให้ 2 วิธี

1) ใช้ function ตระกูล DLookUp()
ซึ่งกรณีนี้ หา Max ให้ใช้ DMax()
   datLastPro = DMax("DateOrder", "OrderHistory", "Code = '" & txtCode & "'"

2) ใช้ RecordSet
   Set rs = CurrentDB.OpenRecordSet ("Select max(DateOrder) as MaxOrderDate From OrderHistory Where Code = '" & txtCode & "'"
datLastPro = rs!MaxOrderDate

ได้ผลเหมือนกัน แต่เข้าใจว่าวิธี 2) คำนวณเร็วกว่า

คือจริงๆ แนะนำว่าต้องศึกษาพื้นฐานมากกว่านี้ก่อนนะครับ
12 @R12834
คือผมมีคิวรีไว้รอการคำนวณแล้วครับ ประกอบด้วยฟิลด์

DateWork(วันที่ทำการผลิต),Code(รหัสสินค้า),Qty(จำนวนที่สั่งสินค้า),ReQty(จำนวนที่ผลิต)

ผมจะต้องเขียนโค้ดยังไงให้มันคำนวณลงในคิวรี่ที่ต้องการครับอาจารย์

13 @R12835
อาจารย์ครับรบกวนอาจารย์เขียนโค้ดข้อสามให้หน่อยได้รึปล่าวครับ

14 @R12836
Dim rs As DAO.Recordset
    Dim strSQL As String
       
    Set db = CurrentDb()
    Set rs = CurrentDb.OpenRecordset("OrderHistory", dbOpenDynaset)
    Set rs = CurrentDb.OpenRecordset("Select max(DateOrder) as MaxOrderDate From OrderHistory Where Code = '" & txtCode & "'")
    datLastPro = rs!MaxOrderDate
    
    If datLastPro <= Date Then
    datPro = DateAdd("d", Date, 1)
    lngLeftOrderQty = [Qty]
    Else
    
    
    lngLastProQty = DLookup("Limit", "OrderHistory", "Code = '" & txtCode & "'")

   
   
   lngAddLastProQty = (Limit) - lngLastProQty
   If lngAddLastProQty > [Qty] Then
    strSQL = "Update [OrderHistory] Set [Limit] = " & [Limit] _
      & " Where [Code] = [Code]"
   DoCmd.RunSQL strSQL
   Exit Sub 'ËÂØ´¤Ó¹Ç³µèÍ à¾ÃÒÐàÊÃç¨ÊÔ鹡ÒÃÊÑè¼ÅÔµà¾ÕÂà·èÒ¹Õé
Else
   
   strSQL = "Update [OrderHistory] Set [Limit] = " & lngAddLastProQty _
      & " Where [Code] = [Code]"
   
End If
   
   datPro = DateAdd("d", datLastPro, 1)
   lngLeftOrderQty = [Limit] - lngAddLastProQty
End If
   Do While lngLeftOrderQty > 0
   
   Loop
End Sub


อาจารย์ครับผมลองแก้ไขโค้ดซึ่งไม่แน่ใจว่าถูกหรือปล่าว แต่ว่ามันมีที่ Error

อยู่ คือตรง datPro = DateAdd("d", datLastPro, 1) มันบอกว่า Is Null

ผมเขียนผิดตรงไหนบ้างครับ และต้องแก้ไขอย่างไร
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3008s