กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
332 8
URL.หัวข้อ /
URL
ต้องการให้กระจายสินค้าตามสูตรทำยังไงครับ
รับข้อมูล สินค้า a ,b,c,d มาอย่างละ 50 ตัว จาก form เก็บลง table แล้ว ต้องการกระจายสินค้าที่รับมา (a,b,c,d อย่างละ 50 ตัว) ให้ร้าน 1 ,2,3,4,5,6,7,8,9,10
โดยมีสูตรว่า
โซนร้าน 1-4 ได้ร้านละ a =2 b=2 c=2 d=2 ตัว (คือร้าน 1 ได้ทั้งสิ้น 8 ตัวคือ a=2+b=2+c=2+d=2 / ร้าน 2 ก็ได้ทั้งสิ้น 8 ตัวคือ a=2+b=2+c=2+d=2 รวมทั้งโซน เอาไป 32 ตัว)
โซนร้าน 5-7 ได้ a =2 b=2 c=1d=1 ตัว
โซนร้าน ที่เหลือ ได้ a =1 b=1 c=1 d=1 ตัว
กรณีสินค้าไม่พอ ตัดร้านที่อยู่ท้ายๆทิ้งไปคือไม่ได้รับ
โดยอยากให้จำนวนตัว เป็นตัวแปร เผื่อวันหลังอยากเปลี่ยนสูตรการกระจาย จะได้ใส่ผ่าน form สูตร เลย
กราบขอบพระคุณทุกท่านมากครับ ผมงงๆมากทำไม่ได้
โดยมีสูตรว่า
โซนร้าน 1-4 ได้ร้านละ a =2 b=2 c=2 d=2 ตัว (คือร้าน 1 ได้ทั้งสิ้น 8 ตัวคือ a=2+b=2+c=2+d=2 / ร้าน 2 ก็ได้ทั้งสิ้น 8 ตัวคือ a=2+b=2+c=2+d=2 รวมทั้งโซน เอาไป 32 ตัว)
โซนร้าน 5-7 ได้ a =2 b=2 c=1d=1 ตัว
โซนร้าน ที่เหลือ ได้ a =1 b=1 c=1 d=1 ตัว
กรณีสินค้าไม่พอ ตัดร้านที่อยู่ท้ายๆทิ้งไปคือไม่ได้รับ
โดยอยากให้จำนวนตัว เป็นตัวแปร เผื่อวันหลังอยากเปลี่ยนสูตรการกระจาย จะได้ใส่ผ่าน form สูตร เลย
กราบขอบพระคุณทุกท่านมากครับ ผมงงๆมากทำไม่ได้
8 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00483
เมื่ออ่านโจทย์ แล้ว ผมเดาว่าจะต้องมีการใช้การวนลูป ใช้ Select Case, และ If ... Else ... Then เข้าช่วย รวมถึง Array() ด้วย
ตอนนี้ผมยกตัวอย่างแค่สินค้าตัวเดียวก่อนนะครับ
ได้ตัวอย่างโค้ดดังนี้
Function ShowArray(intI As Integer)
ShowArray = "ร้าน " & intI & " ได้ = "
End Function
Function ShowAmount(intQTY As Integer)
Dim I As Integer, J As Integer, K As Integer
Dim strString As String
K = 0
For I = 1 To 10
Select Case I
Case Is < 5
If intQTY > 2 Then
intQTY = intQTY - 2
K = 2
Else
K = intQTY
intQTY = 0
End If
strString = strString & ShowArray(I) & K & vbCrLf
Case Is < 8
If intQTY > 2 Then
intQTY = intQTY - 2
K = 2
Else
K = intQTY
intQTY = 0
End If
strString = strString & ShowArray(I) & K & vbCrLf
Case Else
If intQTY > 1 Then
intQTY = intQTY - 1
K = 1
Else
K = intQTY
intQTY = 0
strString = strString & ShowArray(I) & K & vbCrLf
End If
strString = strString & ShowArray(I) & K & vbCrLf
End Select
If intQTY = 0 Then
GoTo JumpHere
End If
Next I
JumpHere:
If intQTY = 0 Then
strString = strString & "ไม่เหลือแย้ว"
Else
strString = strString & "คงเหลือ =" & intQTY
End If
ShowAmount = strString
End Function
ลองใช้ฟังก์ชัน จะได้ผลดังนี้
? ShowAmount(15)
ร้าน 1 ได้ = 2
ร้าน 2 ได้ = 2
ร้าน 3 ได้ = 2
ร้าน 4 ได้ = 2
ร้าน 5 ได้ = 2
ร้าน 6 ได้ = 2
ร้าน 7 ได้ = 2
ร้าน 8 ได้ = 1
ร้าน 8 ได้ = 1
ไม่เหลือแย้ว
ถ้าเปลี่ยนจำนวนสินค้าเป็น 50 จะได้
? ShowAmount(50)
ร้าน 1 ได้ = 2
ร้าน 2 ได้ = 2
ร้าน 3 ได้ = 2
ร้าน 4 ได้ = 2
ร้าน 5 ได้ = 2
ร้าน 6 ได้ = 2
ร้าน 7 ได้ = 2
ร้าน 8 ได้ = 1
ร้าน 9 ได้ = 1
ร้าน 10 ได้ = 1
คงเหลือ =33
คราวนี้ก็มาถึงจุดที่จะต้องปรับปรุงให้มีสินค้าหลายตัวตามที่กำหนดดูนะครับ
ตอนนี้ผมต้องไปทำธุระด่วน เดี๋ยวผมจะมาดูส่วนที่เหลือให้
ผมว่าเห็นแนวทาง แล้วลองพัฒนาต่อ มันท้าทายดีครับ
หรือใครมีวิธีคิดที่ง่ายกว่านี้ ก็เชิญชี้แนะครับ
ขอบคุณสำหรับอาหารสมองเช้านี้ครับ
2 @R00484
และนี่คือตัวอย่างการใช้ Array() ช่วยในการพัฒนาต่อครับ
Function GetShow(intNo As Integer)
Dim I As Integer, J As Integer
Dim Shop As Variant, B As Variant
B = Array("Shop A", "Shop B", "Shop C", "Shop D")
Shop = B(intNo)
GetShow = Shop
End Function
การใช้งานจะเป็นอย่างนี้
? GetShow(0)
Shop A
3 @R00485
Function GetItems(intNo As Integer)
Dim I As Integer
Dim Item As String, B As Variant
B = Array("Item A", "Item B", "Item C", "Item D")
Item = B(intNo)
GetItems = Item
End Function
? Getitems(0)
Item A
4 @R00488
ผมอ่าน ของอ.สุภาพ แล้วงง มากครับ ผมส่ง file ไปให้ดูได้ไหมครับ แล้วอ.ทำไป Guide lineให้หน่อย
ผมเขียน code ยังไม่เป็นเท่าไรครับ
5 @R00489
ส่งมาได้เลยครับ แต่อย่าลืม Zip ก่อนส่งนะครับ
6 @R00498
ตัวเต็มมาแล้วครับ
โค้ดที่ผมแก้ไขและเพิ่มเติมเข้าไปมีดังนี้
Function ShowAmount(intQTY As Integer, intItem As Integer) As String
Dim I As Integer, J As Integer, K As Integer
Dim strString As String
K = 0
strString = ""
' แสดงชื่อสินค้า เช่น สินค้า A โดยดูจากค่า intItem ที่ได้รับมา
strString = strString & GetItems(intItem - 1) & vbCrLf
' วนตั้งแต่ร้าน 1 - 10
For I = 1 To 10
' หาค่าจำนวนสินค้าที่แต่ละร้านจะได้
' โดยหาจากฟังก์ชัน MyAmount จากตัวแปรที่ได้รับ
' เพื่อนำไปหักออกจากจำนวนสินค้า (intQTY)
J = MyAmount(I, intItem)
' เลือกว่าร้านไหน
Select Case I
Case Is < 5
If intQTY > J Then
intQTY = intQTY - J
K = J
Else
K = intQTY
intQTY = 0
End If
strString = strString & ShowArray(I) & K & vbCrLf
Case Is < 8
If intQTY > J Then
intQTY = intQTY - J
K = J
Else
K = intQTY
intQTY = 0
End If
strString = strString & ShowArray(I) & K & vbCrLf
Case Else
If intQTY > J Then
intQTY = intQTY - J
K = J
Else
K = intQTY
intQTY = 0
strString = strString & ShowArray(I) & K & vbCrLf
End If
strString = strString & ShowArray(I) & K & vbCrLf
End Select
' ตรวจดูว่าจำนวนสินค้าหมดหรือยัง
' ถ้าหมดแล้ว ให้ออกจากการวนลูป ไปยังบันทัด JumpHere
If intQTY = 0 Then
GoTo JumpHere
End If
Next I
JumpHere:
If intQTY = 0 Then
' ถ้าจำนวนสินค้าไม่เหลือ
strString = strString & "ไม่เหลือแย้ว"
Else
' ถ้าจำนวนสินค้ายังเหลืออยู่ ให้แสดงด้วยว่าเหลือเท่าไร
strString = strString & "คงเหลือ =" & intQTY
End If
ShowAmount = strString
End Function
Function GetItems(intNo As Integer)
' แสดงชื่อสินค้า โดยใช้ Array() เข้าช่วย
' ค่าเริ่มต้นของ Array = 0
' ถ้าใส่ GetItems(0) จะได้ "สินค้า A"
' ถ้าใส่ GetItems(3) จะได้ "สินค้า D"
Dim I As Integer
Dim Item As String, B As Variant
B = Array("สินค้า A", "สินค้า B", "สินค้า C", "สินค้า D")
Item = B(intNo)
GetItems = Item
End Function
Function MyAmount(intShop As Integer, intItem As Integer) As Integer
' ---------- สินค้า ------------
' ร้าน A B C D
' 1-4 2 2 2 2
' 5-7 2 2 1 1
' 8-10 1 1 1 1
Dim I As Integer
If intShop > 7 And intItem > 0 Then
I = 1
ElseIf intShop > 4 And intItem > 2 Then
I = 1
Else
I = 2
End If
MyAmount = I
End Function
Function ShowArray(intI As Integer)
ShowArray = "ร้าน " & intI & " ได้ = "
End Function
ลองใช้งานดู ก็จะได้ดังนี้ครับ
? ShowAmount(15,4)
สินค้า D
ร้าน 1 ได้ = 2
ร้าน 2 ได้ = 2
ร้าน 3 ได้ = 2
ร้าน 4 ได้ = 2
ร้าน 5 ได้ = 1
ร้าน 6 ได้ = 1
ร้าน 7 ได้ = 1
ร้าน 8 ได้ = 1
ร้าน 9 ได้ = 1
ร้าน 10 ได้ = 1
คงเหลือ =1
? ShowAmount(13,1)
สินค้า A
ร้าน 1 ได้ = 2
ร้าน 2 ได้ = 2
ร้าน 3 ได้ = 2
ร้าน 4 ได้ = 2
ร้าน 5 ได้ = 2
ร้าน 6 ได้ = 2
ร้าน 7 ได้ = 1
ไม่เหลือแย้ว
7 @R00565
ส่งไปให้ อ.สุภาพแล้วครับ กราบขอบพระคุณในความกรุณาครับ
8 @R00566
ผมได้รับ mail แล้วครับ
Time: 0.1393s