กระทู้เก่าบอร์ด อ.Yeadram
2,075 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 มาเข้าเงื่อนไขต่อไป ซึ่งผมคิดว่ามันทำให้ระบบมันช้า และไม่น่าจะถูกหลักการสักเท่าไร
เงื่อนไข ก็คือ
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
2 @R15009
แก้ไขพิมพ์ผิด (คิดว่าตรวจดีแล้วนะ)
2.1 สินค้า มีข้อมูลซ้ำกันใน Record ไหนบ้าง โดยข้อมูลที่ซ้ำ โดยมีเงื่อนไขว่าจะต้องเป็นผู้ซื้อคนเดียวกันทุก Record
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
ตอนยังขาดคำสั่งที่เช็คว่า นาย ก. ซื้อสินค้าตามเงื่อนไขซ้ำกันทั้งหมดกี่ครั้งครับ พอมีแนวทางให้คิดต่อหรือเปล่าครับ ขอบคุณครับ
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 ก็ได้
ถ้าใช่ ไม่ต้อง 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 ดังนี้:
เมื่อ 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 มาก นอกจากเราไม่สามารถหาเงื่อนไขในการอ้างอิงในคิวรี่ได้ จึงค่อยไปเขียนฟังก์ชั่น หรือโค๊ดแทน
ไม่รู้ตรงกับความต้องการหรือเปล่า แต่อยากเขียนไว้ให้เป็นแนวคิดกับคนที่มาอ่านไว้ปรับใช้ได้นะครับ (เมื่อยเหมือนกันครับ)
ไม่รู้ว่าจะตรงกับจุดประสงค์ที่ต้องการหรือเปล่า แต่อยากเขียนในมุมมองของการใช้คิวรี่ในลักษณะโจทย์แบบนี้ เพราะมันจะง่ายกว่าการเขียนโค๊ด 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ต้องการข้อมูลที่มีหลายเงื่อนไขและหลายแบบมากครับ เงื่อนไขนี้เป็นแค่ตัวอย่างเท่านั้นครับ
จะลองนำไปปรับใช้ดูครับ
แต่จริง ๆ อยากได้เป็น 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 ใน คิวรี่ ครับ ประมาณนี้ ลองศึกษาดูครับ
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 ชุดนี้ ผมนำไปพัฒนาได้เยอะมากเลย เห็นแล้วงานเข้ามาเต็มสมองเลยครับ ขอบคุณมากครับ
Time: 0.3034s
1. ให้ระบบเช็คว่า Recordที่1 ชื่อผู้ซื้อ ตรงกันกับ ชื่อผู้ขาย หรือไม่ ถ้าตรงกันก็ให้ไปเช็ค Recordที่ 2 ต่อ โดยไม่ต้องทำอะไร