ต้องการหา order คงเหลือของ sonum แต่ละตัวหลังจากหั
กระทู้เก่าบอร์ด อ.Yeadram

 4,546   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   

30 Reply in this Topic. Dispaly 2 pages and you are on page number 2

21 @R00998
ถึงคุณ สันติสุข ครับ ผมลองใช้ 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"


ผมแนบ 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
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 ที่ละตัวนะครับ
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 ด้วยนะครับ
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
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




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
29 @R01010
ขอบคุณครับ คุณ สันติสุช
30 @R01013
เพื่อให้ดีขึ้นอีกนิดนึง ใต้บรรทัด End With ควรใส่คำสั่ง MsgBox "สร้าง MakeQty เสร็จแล้ว" เอาไว้ ไม่เช่นนั้นจะงงๆว่าโปรแกรมมันทำงานเสร็จแล้วหรือยังกันแน่

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