กระทู้เก่าบอร์ด อ.Yeadram
4,771 30
URL.หัวข้อ /
URL
ต้องการหา order คงเหลือของ sonum แต่ละตัวหลังจากหั
จาก file แนบ มี sonum อยู่ 6 record sonum มี stkcod คือ "2653504200G ที่ ซ้ำกันอยู่
sonum IT STKCOD order stock
511052 7 2653504200G 1614 69832
511071 1 2653504200G 23000 0
511072 1 2653504200G 23000 0
511073 1 2653504200G 23000 0
511074 1 2653504200G 23000 0
511075 1 2653504200G 23000 0
จาก query1 ผมรู้ว่า stkcod "2653504200G" มี orderรวม =116614 ,มี stockรวม =69832 orderคงเหลือหลังจากหัก
stock = 116614-69832= 46782
ต้องการ query ออกมาโดยมีเงื่อนไขดังต่อไป
ผมรวม ของ sonum เรียงจากน้อยใปหามาก ถ้าค่ามากกว่า stock รวม เอามาลบกัน
sonum IT STKCOD order stock
511052 7 2653504200G 1614
511071 1 2653504200G 23000
511072 1 2653504200G 23000
511073 1 2653504200G 23000
ผมรวมของ sonum 70614 -69832 =782
query ที่ออกมาเป็นตามข้างล่าง
sonum IT STKCOD order
511073 1 2653504200G 782
511074 1 2653504200G 23000
511075 1 2653504200G 23000
sonum IT STKCOD order stock
511052 7 2653504200G 1614 69832
511071 1 2653504200G 23000 0
511072 1 2653504200G 23000 0
511073 1 2653504200G 23000 0
511074 1 2653504200G 23000 0
511075 1 2653504200G 23000 0
จาก query1 ผมรู้ว่า stkcod "2653504200G" มี orderรวม =116614 ,มี stockรวม =69832 orderคงเหลือหลังจากหัก
stock = 116614-69832= 46782
ต้องการ query ออกมาโดยมีเงื่อนไขดังต่อไป
ผมรวม ของ sonum เรียงจากน้อยใปหามาก ถ้าค่ามากกว่า stock รวม เอามาลบกัน
sonum IT STKCOD order stock
511052 7 2653504200G 1614
511071 1 2653504200G 23000
511072 1 2653504200G 23000
511073 1 2653504200G 23000
ผมรวมของ sonum 70614 -69832 =782
query ที่ออกมาเป็นตามข้างล่าง
sonum IT STKCOD order
511073 1 2653504200G 782
511074 1 2653504200G 23000
511075 1 2653504200G 23000
30 Reply in this Topic. Dispaly 2 pages and you are on page number 2
22 @R00999
ขอโทษครับข้อความข้างบนพิมพ์ผิดที่
ถึงคุณ สันติสุข ครับ ผมลองใช้ code ตัวนี้ โดยใ่ส่ STKCOD ที่เราต้องการทีละตัว ผลออกมาตามที่ต้องการครับ
Private Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim InpSTKCOD As String
InpSTKCOD = InputBox("ป้อน STKCOD ที่ต้องการ")
If InpSTKCOD = "" Then
Exit Sub
End If
SQL = "SELECT * from so_table WHERE so_table.STKCOD = """ & InpSTKCOD & """ order by so_table.sonum"
'SQL = "select * from so_table order by so_table.sonum"
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
'SumOrder = CDec(0)
AvailStock = CDec(0)
Do Until .EOF
AvailStock = AvailStock + !Stock
.Edit
If !Order > AvailStock Then
!MakeQty = !Order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !Order
End If
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
ผมแนบ file table3.jpg กับ table4.jpg ไปให้ดูครับ (หมายเหตุ table4.jpg คือส่วนต่อของ table3.jpg จับภาพไม่หมดในหน้าจอเดียว)
ผมต้องการผลลัพท์ แบบใน file แนนที้ง 2 file โดยไม่ต้อง ใส่ stkcod ที่ละตัวนะครับ
ขอโทษครับข้อความข้างบนพิมพ์ผิดที่
ถึงคุณ สันติสุข ครับ ผมลองใช้ code ตัวนี้ โดยใ่ส่ STKCOD ที่เราต้องการทีละตัว ผลออกมาตามที่ต้องการครับ
Private Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim InpSTKCOD As String
InpSTKCOD = InputBox("ป้อน STKCOD ที่ต้องการ")
If InpSTKCOD = "" Then
Exit Sub
End If
SQL = "SELECT * from so_table WHERE so_table.STKCOD = """ & InpSTKCOD & """ order by so_table.sonum"
'SQL = "select * from so_table order by so_table.sonum"
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
'SumOrder = CDec(0)
AvailStock = CDec(0)
Do Until .EOF
AvailStock = AvailStock + !Stock
.Edit
If !Order > AvailStock Then
!MakeQty = !Order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !Order
End If
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
ผมแนบ file table3.jpg กับ table4.jpg ไปให้ดูครับ (หมายเหตุ table4.jpg คือส่วนต่อของ table3.jpg จับภาพไม่หมดในหน้าจอเดียว)
ผมต้องการผลลัพท์ แบบใน file แนนที้ง 2 file โดยไม่ต้อง ใส่ stkcod ที่ละตัวนะครับ
23 @R01000
เอาใหม่ครับ โค้ดที่ผมให้ไปในคำตอบ R00980 มีที่ผิดอยู่บรรทัดนึง ที่ถูกควรเป็นดังนี้
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock ' [RED] AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
แล้วเวลาคิวรี่ผลลัพธ์ อย่าลืมให้เรียงลำดับตาม STKCOD กับ SONUM ด้วยนะครับ
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock ' [RED] AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
แล้วเวลาคิวรี่ผลลัพธ์ อย่าลืมให้เรียงลำดับตาม STKCOD กับ SONUM ด้วยนะครับ
24 @R01001
เอาใหม่ครับ เมื่อกี้โค้ดผิด
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
25 @R01005
ลองทดสอบจาก code
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
ผลยังไม่ได้ตาม table3.jpg และ table4.jpg ที่แนบไปก่อนหน้านี้ครับ ผมสังเกตุดูว่่า ถ้า stock น้อยกว่า order ผลที่ได้ออกมาจะถูกต้อง
ตัวอย่าง เช่น stkcod=250120027752525G
SONUM IT order stock MakeQty
SP/2008084 1 184 5.780001475 178.2199985
SP/2008088 1 184 0 184
SP/2008085 1 92 0 92
ถ้า stock มากกว่า order ผลออกมาจะไม่เป็นไปตามที่ต้องการ
ตัวอย่าง เช่น stkcod=250115037682539G
SONUM IT order stock MakeQty
SP/2008090 4 282 307.2799977 0
SP/2008120 6 789 0 789
อันทีถูกตัวเลข ของ stkcod=250115037682539G ตรงช่อง MakeQty ต้องเท่ากับ 764 ตาม file แนน table3.jpg
ไม่รู้ผมเข้าใจถูกหรือเปล่า ใน code มีเงื่่่่อนไขว่า ถ้า stock มากกว่า order ให้ stock ตัวต่อไปเป็น = 0
Public Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD = !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub
ผลยังไม่ได้ตาม table3.jpg และ table4.jpg ที่แนบไปก่อนหน้านี้ครับ ผมสังเกตุดูว่่า ถ้า stock น้อยกว่า order ผลที่ได้ออกมาจะถูกต้อง
ตัวอย่าง เช่น stkcod=250120027752525G
SONUM IT order stock MakeQty
SP/2008084 1 184 5.780001475 178.2199985
SP/2008088 1 184 0 184
SP/2008085 1 92 0 92
ถ้า stock มากกว่า order ผลออกมาจะไม่เป็นไปตามที่ต้องการ
ตัวอย่าง เช่น stkcod=250115037682539G
SONUM IT order stock MakeQty
SP/2008090 4 282 307.2799977 0
SP/2008120 6 789 0 789
อันทีถูกตัวเลข ของ stkcod=250115037682539G ตรงช่อง MakeQty ต้องเท่ากับ 764 ตาม file แนน table3.jpg
ไม่รู้ผมเข้าใจถูกหรือเปล่า ใน code มีเงื่่่่อนไขว่า ถ้า stock มากกว่า order ให้ stock ตัวต่อไปเป็น = 0
26 @R01006
ผมนี่ชักแย่แล้ว โค้ดผิดครับ แก้ที่บรรทัด If LastSTKCOD = !stkcod Then ให้เป็น If LastSTKCOD <> !stkcod Then
27 @R01007
ได้แล้วครับ ผมถามวิธีนำเอา code นี้ไปใช้ ต้อง ไปที่ โมดูล แล้วไป double click โมดูล ชื่อ MakeQty แล้วเอา mouse click ปุ่ม ไป/ต่อไป (เครื่องหมาย ►)ทุกครั้ง ที่ใช้งาน ใช่หรือเป่ล่าครับ หรือว่าเอาไปใส่ไว้ใน form หรือ marcro ได้ครับ ไม่รู้จริงฯ ขอบคุณ ครับ
28 @R01009
ง่ายๆคือสร้างฟอร์มสัก 1 ฟอร์ม ในนั้นให้มี command button 1 ตัว แล้วที่ OnClick event ก็ให้ใส่โค้ดนี้ลงไป โค้ดนี้มีส่วนเพิ่มเติมในการถามผู้ใช้ให้ยืนยันก่อน และมีการควบคุม error ที่อาจเกิดขึ้นได้ด้วย เมื่อจะใช้งานก็แค่เปิดฟอร์มนี้แล้วคลิกปุ่มที่คุณสร้างครับ
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
On Error Goto ErrHandler
If MsgBox("ต้องการสร้าง MakeQty ใช่หรือไม่ ?", vbQuestion + vbYesNo) = vbNo then
Goto ExitProc
End If
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD <> !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
ExitProc:
On Error Resume Next
RS.Close: Set RS = Nothing
Exit Sub
ErrHandler:
MsgBox "พบข้อผิดพลาดรหัส " & Err.Number & " , " & Err.Description
Resume ExitProc
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim LastSTKCOD As String
On Error Goto ErrHandler
If MsgBox("ต้องการสร้าง MakeQty ใช่หรือไม่ ?", vbQuestion + vbYesNo) = vbNo then
Goto ExitProc
End If
SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum "
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
AvailStock = CDec(0)
Do Until .EOF
If LastSTKCOD <> !stkcod Then
AvailStock = !Stock
Else
AvailStock = AvailStock + !Stock
End If
.Edit
If !order > AvailStock Then
!MakeQty = !order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !order
End If
LastSTKCOD = !stkcod
.Update
.MoveNext
Loop
End With
ExitProc:
On Error Resume Next
RS.Close: Set RS = Nothing
Exit Sub
ErrHandler:
MsgBox "พบข้อผิดพลาดรหัส " & Err.Number & " , " & Err.Description
Resume ExitProc
29 @R01010
ขอบคุณครับ คุณ สันติสุช
30 @R01013
เพื่อให้ดีขึ้นอีกนิดนึง ใต้บรรทัด End With ควรใส่คำสั่ง MsgBox "สร้าง MakeQty เสร็จแล้ว" เอาไว้ ไม่เช่นนั้นจะงงๆว่าโปรแกรมมันทำงานเสร็จแล้วหรือยังกันแน่
ขอให้สนุกครับ
ขอให้สนุกครับ
Time: 0.3755s
Private Sub GenMakeQty()
Dim RS As DAO.Recordset
Dim SQL As String
Dim AvailStock As Variant
Dim InpSTKCOD As String
InpSTKCOD = InputBox("ป้อน STKCOD ที่ต้องการ")
If InpSTKCOD = "" Then
Exit Sub
End If
SQL = "SELECT * from so_table WHERE so_table.STKCOD = """ & InpSTKCOD & """ order by so_table.sonum"
ผมแนบ file table3.jpg กับ table4.jpg ไปให้ดูครับ (หมายเหตุ table4.jpg คือส่วนต่อของ table3.jpg จับภาพไม่หมดในหน้าจอเดียว)
ผมต้องการผลลัพท์ แบบใน file แนนที้ง 2 file โดยไม่ต้อง ใส่ stkcod ที่ละตัวนะครับ
'SQL = "select * from so_table order by so_table.sonum"
Set RS = CurrentDb.OpenRecordset(SQL)
With RS
'SumOrder = CDec(0)
AvailStock = CDec(0)
Do Until .EOF
AvailStock = AvailStock + !Stock
.Edit
If !Order > AvailStock Then
!MakeQty = !Order - AvailStock
AvailStock = 0
Else
!MakeQty = 0
AvailStock = AvailStock - !Order
End If
.Update
.MoveNext
Loop
End With
RS.Close: Set RS = Nothing
End Sub