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

 4,512   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 1

1 @R00955
สงสัยผมถามคำถามไม่ clear   เลยไม่มีคนตอบ


2 @R00956
ทำเป็นคิวรี่ ยากครับและ performance ออกมาอาจไม่ดีถ้าจำนวนรายการ so มีมากๆ   อีกทั้งคิวรี่อาจไม่รองรับงานถ้าเผื่อมีการวางแผนที่จะผลิตเพิ่มเข้ามาในในวันอื่นๆด้วย (หมายถึง อาจมีค่าของ stock ในวันอื่นๆนอกเหนือไปจาก stock คงเหลือ ณ ปัจจุบัน)

ทางที่ดีน่าทำเป็น เทเบิลชั่วคราว เพื่อจะได้เป็นที่เก็บจำนวนที่จะต้องผลิตให้แก่ so นั้นๆ หรือจะเพิ่มอีกฟิลด์ในเทเบิลข้างบนนี้เพื่อเป็นที่เก็บดังกล่าว จะได้ไม่ต้องทำเทเบิลชั่วคราวเพิ่ม

ส่วนการหาค่า order ที่ต้องผลิต ก็คงต้องเขียนโปรแกรมวนลูปเอาครับ จะง่ายกว่า
โดยสมมติให้ table ชื่อ so_table และมีฟิลด์ชื่อ MakeQty เพื่อเก็บปริมาณที่ต้องผลิตเพื่อให้พอกับ Order นั้นๆ เมื่อสั่งให้ GenMakeQty ทำงานแล้ว ถ้า so ไหนต้องมีสั่งผลิต ฟิลด์ MakeQty ก็จะไม่เป็นศูนย์ และใช้เป็นเงื่อนไขเพื่อคุณจะได้เอาไปกำหนดในคิวรี่ที่แสดงผลลัพธ์ตามที่ต้องการต่อไป

Private Sub GenMakeQty( )
dim RS as DAO.Recordset
dim SQL as String

dim AvailStock as Variant

SQL = "select * from so_table where ... 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

ปล. โค้ดไม่ได้ทดสอบนะครับ ถ้าผิดตรงไหนก็ขอโทษด้วย
3 @R00957
แก้ที่ผิด

1) ตัดบรรทัด SumOrder = cdec(0) ออกนะครับ
2) บรรทัด SQL = "select * from so_table where ... order by so_table.sonum"
ตรง ... หมายถึงเงื่อนไขที่จะเรียก so ใบไหนบ้างขึ้นมา เติมเอาเองนะครับ หรือถ้าจะดึงมาหมด ก็ตัด where ... ออกไปเลยครับ
4 @R00958

Set RS = CurrentDb.OpenRecordset(SQL)   error บรรทัดนี้
runtime error '3131'
syntax error in from clause   ี้


เรียนคุณ สันติสุข ช่วยดูกระทู้ T00193      

เป็น table ตัวเดียวกันที่ผมถามค้างไว้แต่ไม่มีคนตอบ (fileแนบอันเดียวกัน)
ขอบคุณครับ
5 @R00959
ได้แล้วครับ ผมต้องขอขอบคุณ สันติสุข อย่างมากเลยครับ ผมพยายามเพียรถามตามเวป access ต่างฯ แต่ก็ไม่ได้้รับคำตอบ พึ่่มมาสำเร็จก็วันนี้ ผมรอมานานมากเลย ขอบคุณอีกครั้ง
6 @R00960
ขอบอกตามตรงว่า ผมอ่านคำถาม T00193 แล้วไม่เข้าใจครับ .. จริงๆแล้วแม้แต่คำถามนี้ผมก็ขอผ่านเมื่ออ่านไปได้หลายรอบแล้วเช่นกัน จนมาพยายามสรุปเมื่อบ่ายอีกครั้ง จึงสรุปออกมาได้ว่าที่แท้ต้องการหาว่า so อะไรที่ต้องผลิตเพราะของในสต๊อกมีไม่พอ (หวังว่าคงเข้าใจถูกนะครับ) ... ดังนั้น บางทีคุณควรอธิบายจุดประสงค์ของการคิวรี่มากกว่าบอกว่า "ถ้า REMQTY < REAM1 แล้วตัดทิ้ง ..." เช่นอาจบอกว่า "REMQTY หมายถึงจำนวนคงเหลือ และ REAM1 หมายถึง ??? แล้วต้องการแสดงเฉพาะรายการที่ จำนวนคงเหลือ เป็นอย่างโน้นเป็นอย่างนี้... " น่าจะดีกว่านะ ... อีกอย่างคือ การเว้นวรรคประโยค มีประธาน มีกิริยา มีกรรม จะช่วยให้เข้าใจประโยคได้ง่ายขึ้นครับ พยายามค่อยๆเขียน ค่อยๆอธิบาย ต้องอ่านที่เราเขียนเองหลายๆรอบครับ ถ้าอ่านแล้วรู้สึกตะหงิดๆ ก็ต้องเขียนใหม่จนรู้สึกอ่านได้อย่างลื่นไหลนะครับ .. ไม่เช่นั้นเวลาที่เสียไปในการรอคอยคำตอบ อาจมากกว่าเวลาที่เสียไปในการตั้งคำถามก็ได้ครับ

หวังว่าคงไม่โกรธกันนะครับที่พูดตรงๆอย่างนี้

(เชื่อไหมครับว่าแม้แต่ผมเขียนตอบความคิดเห็นตรงนี้ ก็ใช้เวลาถึง 20 นาทีแล้ว แก้แล้ว แก้อีก หลายรอบเช่นกัน)
7 @R00961
ไม่โกรธครับผม ยินดีรับคำติครับ ผมเองไม่มีพื้นฐานด้านคอมพิวเตอร์มาเลย ไม่เคยเรียนมาก่อน อาศัยศึกษาเอาจากหนังสือ ส่วนด้าน access ก็เหมือนกัน เวลามีปัญหาก็พยายามช่วยตัวเองก่อน ปัญหาทีผมถามในคร้ังนี้ผมก็ใช้เวลาอยู่ 2-3
ปี พยายามคิดเองคิดยังไงก็ไม่ออก จะถามคำถามก็ถามไม่ค่อยจะเป็น เรียงประโยคไม่เป็น   สุดท้าย ต้องขอขอบคุณ คุณ สันติสุข อีกครั้ง ผมยังมีคำถามอีกหลายอย่าง ที่คิดไมออก ไม่ทราบว่าเ่่่่วปนี้เขาจำกัดคำถามหรือเปล่า ่
8 @R00963
รบกวน คุณ สันติสุข อีกครั้งหลังจากทดลองใช้แล้ว ่บางตัวค่าออกมาถูก บางตัวก็ผิด
SONUM     IT     STKCOD                                 order        stock      MakeQty
SP/2008084      1     250120027752525G     184.00     5.78     41.72
SP/2008088      1     250120027752525G     184.00     0.00     184.00
SP/2008085      1     250120027752525G     92.00     0.00      92.00

ค่าที่ถูก   184-5.78 = 178.22 แต่ออกมาเป็น 41.72

SONUM     IT     STKCOD                            order        stock      MakeQty
SP1/511026      1     25040031002700G     120.00     4.00     116.00
SP1/511008      1     25040031002700G     28.00     0.00      28.00

อันนี้ถูกข้อมูลลักษณะเดียวกันเลย 120-4= 116
9 @R00964
- ก็มีบางครั้งที่ถามเรื่องอื่นๆในด้านคอมพิวเตอร์ครับ อย่างไรเสียก็มักจะขึ้นต้นหัวข้อด้วยคำว่า "นอกเรื่อง : " ครับ คนอื่นเห็นจะได้ทราบทันที

- "อันนี้ถูกข้อมูลลักษณะเดียวกันเลย 120-4= 116" ประโยคแบบนี้แหล่ะครับที่อ่านแล้วไม่รู้เรื่อง ยากที่จะตีความ ผมเข้าใจว่าคุณหมายถึง "อันนี้ให้ผลลัพธ์ที่ถูกต้อง แม้ว่าข้อมูลมีลักษณะเดียวกันเลย นั่นคือ 120-4= 116" ใช่ไหมครับ

- ค่า MakeQty ของ sonum SP/2008084 เป็น 41.72 นั้น จะถูกหรือผิด ต้องอยู่ที่ว่าก่อน SP/2008084 มี sonum เลขที่ก่อนหน้านั้นอีกหรือไม่ ถ้ามี มีผลรวมของ order และ stock ก่อนหน้านั้นเป็นเท่าไหร่ครับ


------------------------------------------------------------------------------------------
ดาวโหลดบทเพลง "ส่งนางฟ้ากลับสวรรค์" เพื่อน้อมส่งสมเด็จพระพี่นาง
10 @R00966

อ้างถึง "ค่า MakeQty ของ sonum SP/2008084 เป็น 41.72 นั้น จะถูกหรือผิด ต้องอยู่ที่ว่าก่อน SP/2008084 มี sonum เลขที่ก่อนหน้านั้นอีกหรือไม่ ถ้ามี มีผลรวมของ order และ stock ก่อนหน้านั้นเป็นเท่าไหร่ครับ "

ขอตอบว่า ผมไม่ค่อยเข้าใจคำถามเลยไม่กล้าตอบ จะว่าผมเซ้อหรือโง่ก็ได้ไม่ว่าครับ



ผมจะส่ง file แนบที่ผมใช้จริงไปได้่ใหมครับ


11 @R00970
ก็ส่งไปที่ accboard@gmail.com นั่นแหละครับ
12 @R00973
ผมส่ง ไฟล์แนบชื่อ order.mdb ไปที่ accboard@gmail.com แล้วครับ
13 @R00980
ปัญหาที่เกิดขึ้นเป็นเพราะคำสั่ง SQL ที่ไม่ถูกต้อง คือ คุณตัด order by ... ออกไปเลย ดังนั้นลำดับของเรคอร์ดที่ระบบจะเรียกนั้นมันไม่ได้เรียงตามอะไรเลย มันจะเรียงตามลักษณะที่ระบบมันเก็บอยู่ภายใน แต่...ถึงจะเรียงตาม SONUM แล้ว โปรแกรมก็จะยังไม่ถูกอยู่ดีถ้าไม่ได้กำหนด WHERE clause ในคำสั่ง SQL เพื่อให้เลือกเอาเฉพาะ STKCOD ที่เราต้องการทีละตัว ดังนั้นเพื่อให้สะดวกต่อการใช้งาน ผมก็แก้โปรแกรมเพื่อไม่ต้องกำหนด WHERE clause แต่ให้โปรแกรมตรวจสอบเองว่าถ้า STKCOD เปลี่ยนไป ก็เคลียร์ค่า AvailStock ไปเสีย ดังนั้นโปรแกรมที่แก้ไขแล้วก็จะเป็นตามนี้ครับ

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 = 0
   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


14 @R00983
ผมลอง test ดูแล้ว คงต้องใช้ กำหนด WHERE clause ในคำสั่ง SQL เพื่อให้เลือกเอาเฉพาะ STKCOD ที่เราต้องการทีละตัว   ซึ้งไม่สะดวกอย่างยิ่ง

สมมุติเราอาเฉพาะ STKCOD = 2633504200G เขียนคำสั้งเพิ่มบรรทัดนี้ยังไง

ผม เขียน ดังนี้     SQL = "SELECT * from so_table order by so_table.stkcod, so_table.sonum WHERE (((so_table.STKCOD)="2633504200G"))" ไม่ผ่าน




15 @R00987
SQL = "SELECT * from so_table WHERE so_table.STKCOD = ""2633504200G"" order by so_table.sonum"

เครื่องหมาย double quote (ฟันหนู) 2 ตัวติดกันใน string จะถูกมองเป็นเครื่องหมายเพียงตัวเดียวและจะไม่ถูกตีความเป็นสัญญลักษณ์ที่ใช้ปิด string
16 @R00988
แต่ทำไมยังต้องเลือกเอาเฉพาะ STKCOD หล่ะครับ !?! ในเมื่อโปรแกรมที่แก้ไขไปแล้วนี้สามารถคำนวนให้ทุก STKCOD ได้หมดภายในครั้งเดียวเลย


แต่ถ้าต้องการเฉพาะ STKCOD จริงๆ ก็ทำให้สะดวกขึ้นได้โดยการแทรกโค้ดนี้เข้าไป

Dim ......

Dim InpSTKCOD as string

InpSTKCOD = Input("ป้อน STKCOD ที่ต้องการ")
if InpSTKCOD = "" then
   exit sub
endif

SQL = "SELECT * from so_table WHERE so_table.STKCOD = """ & InpSTKCOD & """ order by so_table.sonum"

...
...
...


17 @R00989
แก้คำว่า Input เป็น InputBox ครับ
18 @R00994
.อ้างถึง    "แต่ทำไมยังต้องเลือกเอาเฉพาะ STKCOD หล่ะครับ !?! ในเมื่อโปรแกรมที่แก้ไขไปแล้วนี้สามารถคำนวนให้ทุก STKCOD ได้หมดภายในครั้งเดียวเลย"

ขอตอบว่า ผลออกมายังไม่ตรงกับความต้องการ ช่วยรบกวนดู file แนบที่ผมแนบไปใหม่อีก 2 file คืือ file table1.jpg คือ file ที่เกิดจาก modules MakeQty

ส่วน file table2.jpg คือ file ที่ต้องการครับผม
19 @R00996
ค่ายังผิดอยู่อาจเกิดเพราะเวลาที่ทำ MakeQty กับเวลาที่คุณคิวรี่นั้น ส่วนที่เรียงลำดับ คือ Order By นั้นไม่เหมือนกันครับ ลองดูใน table2.jpg ที่บรรทัด 5 ถึง 7 นั้น จะเห็นว่า SONUM ไม่ได้เรียงจากน้อยไปมาก

ส่วนที่จะให้ปัดทศนิยมเหลือ 2 ตำแหน่งนั้น ถ้าข้อมูลในฟิลด์ order และ stock ไม่เป็นทศนิยมหลายหลักอย่างนั้น ฟิลด์ makeqty ก็จะไม่หลายหลักไปด้วยเช่นกัน

ขอติติงนะครับว่า คุณไม่บอกเลยว่า table2.jpg นั้นต่างจาก table1.jpg อย่างไร ผมต้องมานั่งเดาอีกแล้ว
20 @R00997
อ้างถึง "ขอติติงนะครับว่า คุณไม่บอกเลยว่า table2.jpg นั้นต่างจาก table1.jpg อย่างไร ผมต้องมานั่งเดาอีกแล้ว"

ขอโทษจริง วันนี้่ผมจะจับถาพสองตารางเปรียบเทียบให้ดูอีกที เมื่อคืนใช้ net ที่บ้าน
อยู่ดีีดีดันต่อ net ไม่ได้่ ครับ

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