หาค่าสุดท้าย
กระทู้เก่าบอร์ด อ.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

17 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R17453
ถ้าสังเกต ค่าสุดท้ายเป็นค่าที่ BL น้อยสุด
SELECT Product.Pcode, Min(Product.BL) AS LastBL
FROM Product
GROUP BY Product.Pcode;
ถ้าจะสร้างตารางใหม่ก็ใช้ Make Table Query ครับ
2 @R17454
ขอโทษครับ ค่าอาจจะมากกว่าก็ได้ พอดีในตัวอย่างมันน้อยลงเพราะ เอาสินค้าออกอย่างเดียว แต่เมื่อรับสินค้าจะมากขึ้นครับ ที่ไม่ใช้ Query เพราะมันไม่ได้ดึงค่า Last มาจริง
3 @R17456
ผมลองทำคิวรีจากข้อมูลที่คุณให้มา ปรากฏว่า A1 ในวันที่ 4 มี 2 ค่า คือ 40 กับ 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
5 @R17458
งั้นโจทย์ของคุณมีดังนี้ใช่มั๊ย
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


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 ชั้นก็บอกได้นะครับ เดี๋ยวจัดให้


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


คือประมาณนี้ ผมพอจะเขียนเป็นลำดับในการคิดได้ แต่ไม่รู้วิธีการ
10 @R17463
งานช้างนะครับ เขียนเป็นเป็น Do Loop แถมแทรก If Statement แบบนี้ ไม่แนะนำเลย เพราะนอกจากจะช้าแล้วยังบริโภค Resource โดยไม่จำเป็นด้วย

เดี๋ยวผมจะลองซ้อน 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 มีข้อมูลตามที่คุณให้มา
12 @R17471
T T
13 @R17472
อ้าวใช้ไม่ได้เหรอครับ
14 @R17476
ยังไม่ได้ลองทำอะครับอาจารย์ธัชชัย
คือมันไม่ใช่รูปแบบที่อยากได้ครับ ยังงัย ก็ไม่มีคนตอบ เดี๋ยวผมจะลอง
ทำตามรูปแบบอาจารย์ดูก่อนครับ ว่ามันจะได้หรือปล่าวครับ ผลเป็นยังงัย
จะมาแจ้งให้อาจารย์ทราบครับ ขอบพระคุณครับ
15 @R17479
ได้สิ อันนี้ผมทดสอบที่เครื่องผมแล้ว ใช้ได้แน่นอน

ถ้าไม่ได้ บอกชื่อตารางทั้ง 2 มาพร้อมกับชื่อฟิลด์ด้วย เดี๋ยวจัดให้ (แลกกับเลี้ยงสุกี้ 87 บาทก็พอ)
16 @R17486
ได้ครับอาจารย์ สรุปว่าเปลี่ยนจาก Last เป็น Max สำหรับวันที่ครับ

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