กระทู้เก่าบอร์ด อ.Yeadram
2,676 17
URL.หัวข้อ /
URL
หาค่าสุดท้าย
ชื่อตาราง Product
รหัส วันที่เบิก สินค้า คงเหลือ
Pcode Ddate Prod BL
A1 2/11/2556 A 50
A1 3/11/2556 A 45
A2 3/11/2556 B 85
A3 3/11/2556 C 66
A1 4/11/2556 A 40
A1 4/11/2556 A 30
A3 4/11/2556 C 62
ผมต้องการค่าสุดท้าย(คงเหลือ)ดังนี้
รหัส คงเหลือ
Pcode BL
A1 30
A2 85
A3 62
จะต้องเขียนโคตยังงัยครับ ให้ตารางที่สองไปอยู่อีกตารางหนึ่ง ชื่อ NewProd
รหัส วันที่เบิก สินค้า คงเหลือ
Pcode Ddate Prod BL
A1 2/11/2556 A 50
A1 3/11/2556 A 45
A2 3/11/2556 B 85
A3 3/11/2556 C 66
A1 4/11/2556 A 40
A1 4/11/2556 A 30
A3 4/11/2556 C 62
ผมต้องการค่าสุดท้าย(คงเหลือ)ดังนี้
รหัส คงเหลือ
Pcode BL
A1 30
A2 85
A3 62
จะต้องเขียนโคตยังงัยครับ ให้ตารางที่สองไปอยู่อีกตารางหนึ่ง ชื่อ NewProd
17 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R17454
ขอโทษครับ ค่าอาจจะมากกว่าก็ได้ พอดีในตัวอย่างมันน้อยลงเพราะ เอาสินค้าออกอย่างเดียว แต่เมื่อรับสินค้าจะมากขึ้นครับ ที่ไม่ใช้ Query เพราะมันไม่ได้ดึงค่า Last มาจริง
3 @R17456
ผมลองทำคิวรีจากข้อมูลที่คุณให้มา ปรากฏว่า A1 ในวันที่ 4 มี 2 ค่า คือ 40 กับ 30
แล้วเราต้องใช้ Criteria อะไรในการเลือกเอา 30 ออกมาครับ เพราะถ้าบอกแค่ว่ามันอยู่เรคอร์ดล่าสุด โดยเป็นวันเดียวกัน คงไม่ใช่แน่นอน เว้นแต่มีเวลามาเกี่ยวข้อง
แล้วเราต้องใช้ Criteria อะไรในการเลือกเอา 30 ออกมาครับ เพราะถ้าบอกแค่ว่ามันอยู่เรคอร์ดล่าสุด โดยเป็นวันเดียวกัน คงไม่ใช่แน่นอน เว้นแต่มีเวลามาเกี่ยวข้อง
4 @R17457
ขอบคุณครับอาจารย์ธัชชัย
ตอนนี้มันเป็นปัญหาของผมจริงๆเลย ตอนออกแบบและลองทำดูช้ได้ดี
อยู่มาวันหนึ่ง เพิ่งรู้มีการบันทึกข้อมูลย้อนหลัง ทำให้ SEQ ไม่เรียงกัน
จะเอาเวลามาใส่ ก็ไม่ทันแล้ว และ ต้องแก้อีกเยอะ เลยลองมาถามดูว่ามีวิธีอื่น
อีกหรือไม่ เบื้องต้นผมใช้วิธีเรียงลำดับวันที่ก่อน แล้ว Copy ไปตารางใหม่
โดยเรียงลำดับเลขที่ ตัวอย่างผมเรียงลำดับไว้แล้วครับ
ลำดับ รหัส วันที่เบิก สินค้า คงเหลือ
SEQ Pcode Ddate Prod BL
1 A1 2/11/2556 A 50
2 A1 3/11/2556 A 45
3 A2 3/11/2556 B 85
4 A3 3/11/2556 C 66
5 A1 4/11/2556 A 40
6 A1 4/11/2556 A 30
7 A3 4/11/2556 C 62
อยากเขียนเป็น VBA ให้ข้อมูล ไปอยู่ในตารางใหม่เลยครับเอาแค่ 2 ฟิลพอ
รหัส คงเหลือ
Pcode BL
A1 30
A2 85
A3 62
ตอนนี้มันเป็นปัญหาของผมจริงๆเลย ตอนออกแบบและลองทำดูช้ได้ดี
อยู่มาวันหนึ่ง เพิ่งรู้มีการบันทึกข้อมูลย้อนหลัง ทำให้ SEQ ไม่เรียงกัน
จะเอาเวลามาใส่ ก็ไม่ทันแล้ว และ ต้องแก้อีกเยอะ เลยลองมาถามดูว่ามีวิธีอื่น
อีกหรือไม่ เบื้องต้นผมใช้วิธีเรียงลำดับวันที่ก่อน แล้ว Copy ไปตารางใหม่
โดยเรียงลำดับเลขที่ ตัวอย่างผมเรียงลำดับไว้แล้วครับ
ลำดับ รหัส วันที่เบิก สินค้า คงเหลือ
SEQ Pcode Ddate Prod BL
1 A1 2/11/2556 A 50
2 A1 3/11/2556 A 45
3 A2 3/11/2556 B 85
4 A3 3/11/2556 C 66
5 A1 4/11/2556 A 40
6 A1 4/11/2556 A 30
7 A3 4/11/2556 C 62
อยากเขียนเป็น VBA ให้ข้อมูล ไปอยู่ในตารางใหม่เลยครับเอาแค่ 2 ฟิลพอ
รหัส คงเหลือ
Pcode BL
A1 30
A2 85
A3 62
5 @R17458
งั้นโจทย์ของคุณมีดังนี้ใช่มั๊ย
1. เอาข้อมูลล่าสุดตามวันที่ตาม Seq ล่าสุดออกมา
2. ใส่เข้าไปในตารางใหม่ โดยเอาเพียง 2 คอลัมน์ที่ว่าเท่านั้น
ชิมิ?
1. เอาข้อมูลล่าสุดตามวันที่ตาม Seq ล่าสุดออกมา
2. ใส่เข้าไปในตารางใหม่ โดยเอาเพียง 2 คอลัมน์ที่ว่าเท่านั้น
ชิมิ?
6 @R17459
ใช่ครับ
7 @R17460
เรื่องนี้มันเป็นคิวรีซ้อนคิวรีนะครับ ถ้าจะเขียน VBA ผมก็ขอแนะนำว่าให้สร้างคิวรี แล้วใช้ VBA สั่ง Append Query เอาดีกว่าครับ
โดยขั้นตอนมีดังนี้
1. สร้างตาราง tblBL โดยมีข้อมูลแบบที่คุณให้มา รวมคอลัมน์ SEQ ด้วย
2. นำตาราง tblBL มาสร้าง Select Query ชื่อ qryQ1 โดยเลือกฟิลด์ PCode,SEQ และ Ddate
3. กำหนด Max ให้ SEQ กับ Ddate
โดยขั้นตอนมีดังนี้
1. สร้างตาราง tblBL โดยมีข้อมูลแบบที่คุณให้มา รวมคอลัมน์ SEQ ด้วย
2. นำตาราง tblBL มาสร้าง Select Query ชื่อ qryQ1 โดยเลือกฟิลด์ PCode,SEQ และ Ddate
3. กำหนด Max ให้ SEQ กับ Ddate
8 @R17461
4. นำ tblBL กับ qryQ1 มาสร้างคิวรีชื่อ qryQ2 โดยเลือกฟิลด์ PCode กับ BL มาแสดง
5. กำหนด Relation ให้ Max SEQ ของ qryQ1 กับ SEQ ของ tblBL แบบในรูป
6. เปลี่ยนคิวรี qryQ2 เป็น Append Query
7. เขียน VBA ก็สั่งให้ qryQ2 ทำงาน เพียงเท่านี้ ข้อมูลที่ต้องการก็จะเข้าไปอยู่ในตารางเป้าหมายทันที
ถ้าเป็นผม ผมจะไม่เขียน VBA โดยฝังคิวรีแบบนี้เข้าไป เพราะมันยุ่งยากมากๆ แค่คิวรีชั้นเดียวก็แทบแย่แล้ว นี่ 2 ชั้น ใครจะเอา SQL ผมไปแก้ไขเป็น 2 ชั้นก็บอกได้นะครับ เดี๋ยวจัดให้
5. กำหนด Relation ให้ Max SEQ ของ qryQ1 กับ SEQ ของ tblBL แบบในรูป
6. เปลี่ยนคิวรี qryQ2 เป็น Append Query
7. เขียน VBA ก็สั่งให้ qryQ2 ทำงาน เพียงเท่านี้ ข้อมูลที่ต้องการก็จะเข้าไปอยู่ในตารางเป้าหมายทันที
ถ้าเป็นผม ผมจะไม่เขียน VBA โดยฝังคิวรีแบบนี้เข้าไป เพราะมันยุ่งยากมากๆ แค่คิวรีชั้นเดียวก็แทบแย่แล้ว นี่ 2 ชั้น ใครจะเอา SQL ผมไปแก้ไขเป็น 2 ชั้นก็บอกได้นะครับ เดี๋ยวจัดให้
9 @R17462
ขอบพระคุณอาจารย์ ธัชชัย มากๆ ครับ อุตส่าเสียเวลามาตอบให้ผม
ถ้าใช้ Query ธรรมดา ผมทำได้ครับ
จริงๆ ที่ผมทำมันซับซ้อนกว่านี้มากครับ พวกนี้พวกเรียนรู้จากลองผิดลองถูกได้
แต่ ผมอยากได้เป็น VBA ครับ ผมไม่ได้มีพื้นฐานการเขียนโค๊ตมาเลย
เลยไม่รู้จะเริ่มตรงไหน ตอนนี้กำลังปะติดปะต่อ จากกระทู้เก่าๆ รออาจารย์
มาตอบให้ครับ จากประสบการการใช้ min max last มาเจอปัญหาทีหลังตลอด เลยอยากจะใช้ VBA ไปสร้างตารางใหม่เลย(หรือสร้างตารางเองแล้วInsertเข้าไป)
แนวคิดประมาณนี้
Set DB = CurrentDb
SQL = "SELECT * FROM ตารางสินค้า ORDER BY วันที่ DESC ,รันนัมเบอร์ DESC" 'เรียงจากค่าสุดท้ายมาก่อนเลย
Set rstQ = DB.OpenRecordset(SQL)
Set rstT = DB.OpenRecordset("ตารางใหม่ที่ให้ไปลง", dbOpenDynaset)
i = 1 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
รหัสสินค้า = 0 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
Do Until rstQ.EOF
If รหัสสินค้า = 0 Then 'เมื่อเจอสินค้าตัวแรก เรคคอดแรกให้
rstT.addNew 'เพิ่มเรคคอดใหม่ในตารางใหม่
rstT!รหัสสินค้า= rstQ!รหัสสินค้า 'รหัสสินค้าในตารางใหม่ เท่ากับ รหัสสินค้าแรกในคิวรี
rstT!Balance = rstQ!Balance 'จำนวนสินค้าคงเหลือในตารางใหม่ เท่ากับ จำนวนสินค้าคงเหลือแรกในคิวรี
rstT.update 'ขึ้นเรคคอดใหม่
i = 2 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
รหัสสินค้า = rstQ!รหัสสินค้า'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
ElseIf rstQ!รหัสสินค้า = รหัสสินค้า Then 'อยากให้มันเชคว่าถ้ารหัสเหมือนเดิม ให้เริ่มที่รหัสใหม่เลย แต่ไม่รู้คำสั่ง
If i = 2 Then
rstT.MoveLast
End If
ElseIf rstQ!รหัสสินค้า <> รหัสสินค้า Then
rstT.addNew
rstT!รหัสสินค้า = rstQ!รหัสสินค้า
rstT!Balance = rstQ!Balance
rstT.update
i = 2
รหัสสินค้า = rstQ!รหัสสินค้า
End If
rstQ.MoveNext
Loop
คือประมาณนี้ ผมพอจะเขียนเป็นลำดับในการคิดได้ แต่ไม่รู้วิธีการ
ถ้าใช้ Query ธรรมดา ผมทำได้ครับ
จริงๆ ที่ผมทำมันซับซ้อนกว่านี้มากครับ พวกนี้พวกเรียนรู้จากลองผิดลองถูกได้
แต่ ผมอยากได้เป็น VBA ครับ ผมไม่ได้มีพื้นฐานการเขียนโค๊ตมาเลย
เลยไม่รู้จะเริ่มตรงไหน ตอนนี้กำลังปะติดปะต่อ จากกระทู้เก่าๆ รออาจารย์
มาตอบให้ครับ จากประสบการการใช้ min max last มาเจอปัญหาทีหลังตลอด เลยอยากจะใช้ VBA ไปสร้างตารางใหม่เลย(หรือสร้างตารางเองแล้วInsertเข้าไป)
แนวคิดประมาณนี้
Set DB = CurrentDb
SQL = "SELECT * FROM ตารางสินค้า ORDER BY วันที่ DESC ,รันนัมเบอร์ DESC" 'เรียงจากค่าสุดท้ายมาก่อนเลย
Set rstQ = DB.OpenRecordset(SQL)
Set rstT = DB.OpenRecordset("ตารางใหม่ที่ให้ไปลง", dbOpenDynaset)
i = 1 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
รหัสสินค้า = 0 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
Do Until rstQ.EOF
If รหัสสินค้า = 0 Then 'เมื่อเจอสินค้าตัวแรก เรคคอดแรกให้
rstT.addNew 'เพิ่มเรคคอดใหม่ในตารางใหม่
rstT!รหัสสินค้า= rstQ!รหัสสินค้า 'รหัสสินค้าในตารางใหม่ เท่ากับ รหัสสินค้าแรกในคิวรี
rstT!Balance = rstQ!Balance 'จำนวนสินค้าคงเหลือในตารางใหม่ เท่ากับ จำนวนสินค้าคงเหลือแรกในคิวรี
rstT.update 'ขึ้นเรคคอดใหม่
i = 2 'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
รหัสสินค้า = rstQ!รหัสสินค้า'บรรทัดนี้ไม่เข้าใจ ลองๆ มั่วดู
ElseIf rstQ!รหัสสินค้า = รหัสสินค้า Then 'อยากให้มันเชคว่าถ้ารหัสเหมือนเดิม ให้เริ่มที่รหัสใหม่เลย แต่ไม่รู้คำสั่ง
If i = 2 Then
rstT.MoveLast
End If
ElseIf rstQ!รหัสสินค้า <> รหัสสินค้า Then
rstT.addNew
rstT!รหัสสินค้า = rstQ!รหัสสินค้า
rstT!Balance = rstQ!Balance
rstT.update
i = 2
รหัสสินค้า = rstQ!รหัสสินค้า
End If
rstQ.MoveNext
Loop
คือประมาณนี้ ผมพอจะเขียนเป็นลำดับในการคิดได้ แต่ไม่รู้วิธีการ
10 @R17463
งานช้างนะครับ เขียนเป็นเป็น Do Loop แถมแทรก If Statement แบบนี้ ไม่แนะนำเลย เพราะนอกจากจะช้าแล้วยังบริโภค Resource โดยไม่จำเป็นด้วย
เดี๋ยวผมจะลองซ้อน SQL ให้ละกัน (ถึงจะเกลียดมันก็เถอะ)
เดี๋ยวผมจะลองซ้อน SQL ให้ละกัน (ถึงจะเกลียดมันก็เถอะ)
11 @R17464
เหนื่อยแฮก ใช้สมอง 130%
คำสั่ง VBA ตามนี้ยะครับ
Dim MySQL As String
MySQL = "INSERT INTO tblAddBL ( PCode, BL ) SELECT tblBL.PCode, tblBL.BL FROM (SELECT PCode, Max(SEQ) AS MaxOfSEQ, Max(Ddate) AS MaxOfDdate FROM tblBL GROUP BY PCode) AS qryQ INNER JOIN tblBL ON qryQ.[MaxOfSEQ] = tblBL.SEQ;"
DoCmd.RunSQL (MySQL)
ตารางเป้าหมายชื่อ tblAddBL
ตารางต้นทางชื่อ tblBL มีข้อมูลตามที่คุณให้มา
คำสั่ง VBA ตามนี้ยะครับ
Dim MySQL As String
MySQL = "INSERT INTO tblAddBL ( PCode, BL ) SELECT tblBL.PCode, tblBL.BL FROM (SELECT PCode, Max(SEQ) AS MaxOfSEQ, Max(Ddate) AS MaxOfDdate FROM tblBL GROUP BY PCode) AS qryQ INNER JOIN tblBL ON qryQ.[MaxOfSEQ] = tblBL.SEQ;"
DoCmd.RunSQL (MySQL)
ตารางเป้าหมายชื่อ tblAddBL
ตารางต้นทางชื่อ tblBL มีข้อมูลตามที่คุณให้มา
12 @R17471
T T
13 @R17472
อ้าวใช้ไม่ได้เหรอครับ
14 @R17476
ยังไม่ได้ลองทำอะครับอาจารย์ธัชชัย
คือมันไม่ใช่รูปแบบที่อยากได้ครับ ยังงัย ก็ไม่มีคนตอบ เดี๋ยวผมจะลอง
ทำตามรูปแบบอาจารย์ดูก่อนครับ ว่ามันจะได้หรือปล่าวครับ ผลเป็นยังงัย
จะมาแจ้งให้อาจารย์ทราบครับ ขอบพระคุณครับ
คือมันไม่ใช่รูปแบบที่อยากได้ครับ ยังงัย ก็ไม่มีคนตอบ เดี๋ยวผมจะลอง
ทำตามรูปแบบอาจารย์ดูก่อนครับ ว่ามันจะได้หรือปล่าวครับ ผลเป็นยังงัย
จะมาแจ้งให้อาจารย์ทราบครับ ขอบพระคุณครับ
15 @R17479
ได้สิ อันนี้ผมทดสอบที่เครื่องผมแล้ว ใช้ได้แน่นอน
ถ้าไม่ได้ บอกชื่อตารางทั้ง 2 มาพร้อมกับชื่อฟิลด์ด้วย เดี๋ยวจัดให้ (แลกกับเลี้ยงสุกี้ 87 บาทก็พอ)
ถ้าไม่ได้ บอกชื่อตารางทั้ง 2 มาพร้อมกับชื่อฟิลด์ด้วย เดี๋ยวจัดให้ (แลกกับเลี้ยงสุกี้ 87 บาทก็พอ)
16 @R17486
ได้ครับอาจารย์ สรุปว่าเปลี่ยนจาก Last เป็น Max สำหรับวันที่ครับ
ยังงัยก็อยากเลี้ยงสุกี้อยู่ดี ^^ ขอบพระคุณครับ
ยังงัยก็อยากเลี้ยงสุกี้อยู่ดี ^^ ขอบพระคุณครับ
17 @R17596
ในที่สุดก็กลับไปใช้ Query แรกของอาจารย์ ตอนแรกเข้าใจอีกแบบ ขอบคุณครับ อาจารย์
Time: 0.3650s
SELECT Product.Pcode, Min(Product.BL) AS LastBL
FROM Product
GROUP BY Product.Pcode;
ถ้าจะสร้างตารางใหม่ก็ใช้ Make Table Query ครับ