รบกวนขอเทคนิคการค้นหาข้อมูลและCopy
กระทู้เก่าบอร์ด อ.Yeadram

 1,998   8
URL.หัวข้อ / URL
รบกวนขอเทคนิคการค้นหาข้อมูลและCopy

ข้อมูลที่ตรงตามเงื่อนไขที่เรากำหนดไว้ มาไว้อีก Tabel ทำอย่างไรครับ

เงื่อนไข ก็คือ
1. ให้ระบบเช็คว่า Recordที่1 ชื่อผู้ซื้อ ตรงกันกับ ชื่อผู้ขาย หรือไม่ ถ้าตรงกันก็ให้ไปเช็ค Recordที่ 2 ต่อ โดยไม่ตรงทำอะไร

2. ถ้า Recordที่2 ชื่อผู้ซื้อ ไม่ตรงกันกับ ชื่อผู้ขาย ให้ไปเช็ค สินค้า ว่า
    2.1 สินค้า มีข้อมูลซ้ำกันใน Record ไหนบ้าง โดยข้อมูลที่ซ้ำ โดยมีเงื่อนไขว่าจะต้องเป็นผู้ซื้อคนเดียวกันที่ Record (ประมาณว่าหานายก. ซื้อสินค้านี้ซ้ำกันกี่ครั้งในฐานข้อมูล)
    2.2 และจำนวนเงินที่ซื้อ จะต้องมีมูลกค่ามากว่า 10,000 บาทขึ้นไป

อธิบายเพิ่มเติมครับ

ฟิลด์ที่1 = ชื่อผู้ซื้อ
ฟิลด์ที่2 = ชื่อผู้ขาย
ฟิลด์ที่3 = สินค้า
ฟิลด์ที่4 = จำนวนเงินที่ซื้อ

พอได้ตรงตามเงื่อนไขด้านบนแล้วให้ Copy ข้อมูลไปไว้อีก Table ที่เราสร้างเตรียมไว้ Acces พอจะทำได้หรือเปล่าครับ ขอบคุณครับ

ปล.ตอนนี้คิดได้ก็คือพอเจอ ชื่อผู้ซื้อและผู้ขายไม่ตรงกันให้ Copy ไปไว้อีก Table แล้วค่อยนำ Tabel ที่เพิ่ง Copy มาเข้าเงื่อนไขต่อไป ซึ่งผมคิดว่ามันทำให้ระบบมันช้า และไม่น่าจะถูกหลักการสักเท่าไร   

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

1 @R15008
แก้ไขพิมพ์ผิด

1. ให้ระบบเช็คว่า Recordที่1 ชื่อผู้ซื้อ ตรงกันกับ ชื่อผู้ขาย หรือไม่ ถ้าตรงกันก็ให้ไปเช็ค Recordที่ 2 ต่อ โดยไม่ต้องทำอะไร
2 @R15009
แก้ไขพิมพ์ผิด (คิดว่าตรวจดีแล้วนะ)
2.1 สินค้า มีข้อมูลซ้ำกันใน Record ไหนบ้าง โดยข้อมูลที่ซ้ำ โดยมีเงื่อนไขว่าจะต้องเป็นผู้ซื้อคนเดียวกันทุก Record
3 @R15021
ที่คิดได้ตอนนี้ครับ

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rsCopy As Recordset
Dim dbCopy As Database

Set db = CurrentDb
Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Dim Temp_Date As String, Temp_ID As String
rs.MoveFirst
    Do Until rs.EOF
        If rs(3) = "ของแท้" Or rs(3) = "ของโรงงาน" Then
            If rs(8) > 10000 Then
               If rs(2) <> rs(5) Then 'ผู้ซื้อไม่ตรงกับผู้ขาย
                    Set dbCopy = CurrentDb
                    Set rsCopy = dbCopy.OpenRecordset("Tabel_Copy", dbOpenDynaset)
                    rsCopy.AddNew
                    rsCopy(0) = rs(0)
                    rsCopy(1) = rs(1)
                    rsCopy(2) = rs(2)
                    rsCopy(3) = rs(3)
                    rsCopy(4) = rs(4)
                    rsCopy(5) = rs(5)
                    rsCopy(6) = rs(6)
                    rsCopy(7) = rs(7)
                    rsCopy(8) = rs(8)
                    rsCopy(9) = rs(9)
                    rsCopy.Update
                    rsCopy.Close
               End If
            End If
        End If
    rs.MoveNext
    Loop
MsgBox "Data Ok", , "Data"
    
rs.Close: db.Close: Set rs = Nothing: Set db = Nothing
dbCopy.Close: Set rsopen = Nothing: Set dbopen = Nothing

ตอนยังขาดคำสั่งที่เช็คว่า นาย ก. ซื้อสินค้าตามเงื่อนไขซ้ำกันทั้งหมดกี่ครั้งครับ พอมีแนวทางให้คิดต่อหรือเปล่าครับ ขอบคุณครับ
4 @R15022
สรุปว่าแค่ต้องการ query ข้อมูลที่ตรงตามเงื่อนไขที่ว่าใชไหมครับ
ถ้าใช่ ไม่ต้อง code ยาวก็ได้ครับ ตอบได้ด้วย sub query
ถ้าเขียนไม่เป็นก็ใช้วิธี สร้าง query ไว้แล้วเรียกใช้ต่อๆกันก็ไก้ครับ หรือใช้ query เบื้องต้น ผสมกับ code ก็ได้
5 @R15051
อื่ม... เห็นโจทย์กับโค๊ดที่ คุณAkung เขียนแล้วน่าสนใจดีครับ เลยขอเขียนอธิบายแนะนำไว้ เผื่อเป็นประโยชน์บ้างนะครับ
ไม่รู้ว่าจะตรงกับจุดประสงค์ที่ต้องการหรือเปล่า แต่อยากเขียนในมุมมองของการใช้คิวรี่ในลักษณะโจทย์แบบนี้ เพราะมันจะง่ายกว่าการเขียนโค๊ด VB อยู่มากทีเดียว ให้มองเป็นขั้นๆดังนี้ดูนะครับ
สมมุติ ฐานข้อมูลตารางชื่อ Table1
ตัวอย่าง Table1
ID     ชื่อผู้ซื้อ     ชื่อผู้ขาย     สินค้า     จำนวนเงินที่ซื้อ
1     A     B     TA     12000
2     B     A     TB     8000
3     C     C     TC     10000
4     B     A     TA     20000
5     A     C     TA     35000
6     B     B     TC     15000
7     C     A     TA     9000
8     A     C     TB     84500
9     C     B     TC     6400
10     C     A     TA     18456

จากโจทย์:
1. ให้ระบบเช็คว่า Recordที่1 ชื่อผู้ซื้อ ตรงกันกับ ชื่อผู้ขาย หรือไม่ ถ้าตรงกันก็ให้ไปเช็ค Recordที่
SQL: WHERE [ชื่อผู้ซื้อ]<>[ชื่อผู้ขาย]

2. ถ้า ฟิลด์ ชื่อผู้ซื้อ ไม่ตรงกันกับ ชื่อผู้ขาย ให้ไปเช็ค สินค้า ว่า
    2.1 สินค้า มีข้อมูลซ้ำกันใน Record ไหนบ้าง โดยข้อมูลที่ซ้ำ โดยมีเงื่อนไขว่าจะต้องเป็นผู้ซื้อคนเดียวกันที่ Record (ประมาณว่าหานายก. ซื้อสินค้านี้ซ้ำกันกี่ครั้งในฐานข้อมูล)
SQL: SELECT [ชื่อผู้ซื้อ], [สินค้า], Count([สินค้า]) AS จำนวน
FROM Table1
GROUP BY [ชื่อผู้ซื้อ], [สินค้า];

    2.2 และจำนวนเงินที่ซื้อ จะต้องมีมูลกค่ามากว่า 10,000 บาทขึ้นไป
SQL: WHERE [จำนวนเงินที่ซื้อ]>10000

ดังนั้นเราสามารถนำมารวมเขียนเป็น SQL statement ดังนี้:

SELECT Table1.[ชื่อผู้ซื้อ], Table1.[สินค้า], Count(Table1.[สินค้า]) AS จำนวน
FROM Table1
WHERE Table1.[ชื่อผู้ซื้อ]<>[ชื่อผู้ขาย] AND Table1.[จำนวนเงินที่ซื้อ]>10000
GROUP BY Table1.[ชื่อผู้ซื้อ], Table1.[สินค้า];


เมื่อ Run คิวรี่ จะได้ผลลัพธ์ดังนี้:

ชื่อผู้ซื้อ     สินค้า     จำนวน
A     TA     2
A     TB     1
B     TA     1
C     TA     1

3. พอได้ตรงตามเงื่อนไขด้านบนแล้วให้ Copy ข้อมูลไปไว้อีก Table ที่เราสร้างเตรียมไว้
SQL: ให้ใช้ INSERT INTO โดยสมมุติตารางที่เตรียมไว้ชื่อ Table2 มีฟิลด์ชื่อ ชื่อผู้ซื้อ, สินค้า, จำนวนครั้งที่มากกว่า 1 หมื่น ใน SQL statement เขียนได้ดังนี้:

INSERT INTO Table2 (ชื่อผู้ซื้อ, สินค้า, จำนวนครั้งที่มากกว่า 1 หมื่น)
SELECT [ชื่อผู้ซื้อ], [สินค้า], Count([สินค้า]) AS จำนวน
FROM Table1
WHERE [ชื่อผู้ซื้อ]<>[ชื่อผู้ขาย] And [จำนวนเงินที่ซื้อ]>10000
GROUP BY [ชื่อผู้ซื้อ], [สินค้า];

ในการสั่งเข้าตาราง Table2 อาจใช้คำสั่ง !Run ในมุมมอง SQL ที่เมนู Design > !Run
เมื่อกดปุ่ม Run แล้ว ข้อมูลจะเข้าไปยังฟิลด์ต่างๆที่เลือกไว้ และมี Popup แจ้งจำนวนเรคคอร์ดที่ใส่เข้าไปเพิ่มใน ตาราง Table2

ประมาณนี้นะครับ จะเห็นว่าหากเป็นเรื่องแบบสอบถาม การใช้คิวรี่จะเร็วและง่ายกว่าการใช้ VBA มาก นอกจากเราไม่สามารถหาเงื่อนไขในการอ้างอิงในคิวรี่ได้ จึงค่อยไปเขียนฟังก์ชั่น หรือโค๊ดแทน

ไม่รู้ตรงกับความต้องการหรือเปล่า แต่อยากเขียนไว้ให้เป็นแนวคิดกับคนที่มาอ่านไว้ปรับใช้ได้นะครับ (เมื่อยเหมือนกันครับ)
6 @R15059
ขอบคุณ คุณ TTT มากครับ

จะลองนำไปปรับใช้ดูครับ

แต่จริง ๆ อยากได้เป็น VBA เพราะต้องการให้ User ทำเองโดยกดปุ่มเดียวก็จะออกมาตามเงื่อนไข ซึ่งความเป็นจริง ๆ Userต้องการข้อมูลที่มีหลายเงื่อนไขและหลายแบบมากครับ เงื่อนไขนี้เป็นแค่ตัวอย่างเท่านั้นครับ
7 @R15068
อ่อ! ฟอร์มก็ Run SQL ได้นะครับ เช่นจะที่ยกตัวอย่างไป สามารถใส่โค๊ดที่ปุ่ม ใน Event > On Click บนฟอร์มได้ดังนี้:

DoCmd.SetWarnings False ' ปิดการแจ้งเตือนระบบ

Dim strSQL As String ' สร้างตัวแปรเก็บค่า SQL Statement ที่เขียน
strSQL = "INSERT INTO Table2 (ชื่อผู้ซื้อ, สินค้า, จำนวนครั้งที่มากกว่า 1 หมื่น) " & _
"SELECT [ชื่อผู้ซื้อ], [สินค้า], Count([สินค้า]) AS จำนวน " & _
"FROM Table1 " & _
"WHERE [ชื่อผู้ซื้อ]<>[ชื่อผู้ขาย] And [จำนวนเงินที่ซื้อ]>10000 " & _
"GROUP BY [ชื่อผู้ซื้อ], [สินค้า];"

DoCmd.RunSQL strSQL ' สั่ง Run ภาษา SQL ด้วย คำสั่ง DoCmd
DoCmd.SetWarnings True ' เปิดการแจ้งเตือนระบบเหมือนเดิม

แค่นี้เวลาเรากดปุ่มนี้บนฟอร์ม ตาราง Table2 ก็จะถูกใส่ข้อมูลตามเงื่อนไขในตัวอย่างเหมือนการ !Run ใน คิวรี่ ครับ ประมาณนี้ ลองศึกษาดูครับ
8 @R15074
ขอบคุณ คุณ TTT มากเลยครับ Code ชุดนี้ ผมนำไปพัฒนาได้เยอะมากเลย เห็นแล้วงานเข้ามาเต็มสมองเลยครับ ขอบคุณมากครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2912s