วิธีการใช้ Combo Box ที่ Form
กระทู้เก่าบอร์ด อ.Yeadram

 10,500   18
URL.หัวข้อ / URL
วิธีการใช้ Combo Box ที่ Form

มี Control แบบ Combo Box 2 ตัว
1.สำหรับเลือกชื่อเครื่องจักร
2.สำหรับเลือกชื่อลูกค้า
ปัญหาคือ List ของ Combo Box ทั้ง 2 ตัวมีจำนวนมาก
ทำให้เวลาเลือกข้อมูลไม่สะดวก แต่ละเครื่องจักรจะมีลูกค้า
เป็นของตัวเอง
Access สามารถ ทำให้เวลาเลือกเครื่องจักรแล้ว ต่อไปจะ
เลือกลูกค้า ให้มี List ของ Combo Box เฉพาะลูกค้าของ
เครื่องจักรนั้นๆได้ไหมครับ ช่วยด้วยครับ

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

1 @R14644
ลองไปดูที่ผมตอบคุณ wisit ที่กระทู้ใกล้ๆกันนี้ครับ เหมือนกัน

http://www.thai-access.com/yeadram_view.php?topic_id=3106
2 @R14645
ผมอ่านหลายรอบก็ยังงงอยู่ ขอคำแนะนำเฉพาะเรื่องนี้ได้ไหมครับ
ไม่รู้ว่าต้องสร้างตารางอะไรบ้าง ต้องมี Field อะไรบ้าง
ช่วยด้วยครับ
3 @R14646
อ้าว ก็ตามที่คุณบอกมาเองไงครับ ก็ต้องมีเทเบิลที่เก็บฟิลด์ เครื่องจักร และ ลูกค้า เพื่อเก็บข้อมูลว่าเครื่องจักรไหนมใช้กับลูกค้ารายใดบ้าง    ส่วนอีกเทเบิลก็คือเทเบิลที่เป็นแหล่งข้อมูลของฟอร์มที่จะมีคอมโบบ็อกซ์นี้แหล่ะครับ ซึ่งจะมีอะไรบ้างผมก็ไม่รู้ แต่ก็จะมีฟิลด์เครื่องจักรและฟิลด์ลูกค้าเช่นกัน   แล้วก็ต้องบอกตั้งแต่ตรงนี้ด้วยว่าผมจะไม่มานั่งออกแบบฐานข้อมูลให้นะครับ เพราะโดยปกติต้องถามคำถามกันมากมายกว่าจะออกแบบฐานข้อมูลที่ถูกต้องได้ อาจต้องใช้เวลามาก ผมไม่สามารถรับภาระแทนตรงนี้ได้ คุณต้องวิเคราะห์และออกแบบเอง ออกแบบแล้วมีปัญหาอย่างไรก็ค่อยมาเขียนอธิบายว่าระบบที่ต้องการมันเป็นอย่างไรโดยละเอียด แล้วได้ออกแบบอะไรไปแล้วบ้าง คนในนี้จะได้ช่วยกันแนะนำได้

คุณจะไม่สามารถใช้ Access ได้อย่างถูกต้องถ้าคุณออกแบบฐานข้อมูล (Database Design) ไม่เป็นนะครับ แนะนำให้ซื้อหนังสือเรื่องการออกแบบฐานข้อมูลมาอ่าน หรืออ่านในเวปก็ได้ ไม่อย่างนั้นผมว่าเก็บเป็น Excel อาจง่ายกว่านะครับ จะเอาข้อมูลอะไรก็โยงกันระหว่างชีทเอาเลย พอทำไปได้ระยะนึง คุณอาจมองออกจากการทำ Trial and Error ว่าถ้าจะไม่ให้ข้อมูลซ้ำซ้อนในชีท คุณจะต้องมีกี่ชีทและแต่ละชีทต้องมีข้อมูลอะไรบ้าง ซึ่งมันก็จะเบนเข้าสู่การออกแบบฐานข้อมุลที่ถูกต้องไปโดยเองปริยาย แต่ไม่ใช่ว่าจะออกแบบได้ถูกต้องจากการทำ Trial and Error อย่างนี้นะครับ จะต้องมีทฤษฏีจากหนังสือเป็นเครื่องวัดด้วยว่าได้ทำอย่างถูกต้องแล้วจริงหรือไม่
4 @R14648
ผมยกตัวอย่างคร่าวๆให้ลองทำตามและปรับใช้ดูนะครับ
- ตารางสำหรับเก็บชื่อเครื่องจักร สมมุติชื่อ Tb1 มีข้อมูลดังนี้:
ID     Machine
1     Name_A
2     Name_B
3     Name_C
4     Name_D
5     Name_E
6     Name_F
7     Name_G
8     Name_H
9     Name_I

ID คือ AutoNumber
Machine คือ เก็บชื่อเครื่องจักร

- ตารางสำหรับเก็บชื่อลูกค้าที่ใช้เครื่องจักร สมมุติชื่อ Tb2 มีข้อมูลดังนี้:
ID     Customer     ID_Machine
1     นาย ก     1
2     นาย ข     2
3     นาย ค     8
4     นาย ง     1
5     นาย จ     2
6     นาย ฉ     4
7     นาย ช     5
8     นาย ญ     4
9     นาย ด     7
10     นาย ต     7
11     นาย ถ     7
12     นาย ท     3
13     นาย ธ     7
14     นาย น     9
15     นาย บ     9

ID คือ AutoNumber
Customer คือ เก็บชื่อลูกค้า
ID_Machine คือ เก็บเลข ID ของเครื่องจักรที่ลูกค้าใช้

- บนฟอร์ม สร้าง Combo Box ตัวแรกสำหรับเลือกชื่อเครื่องจักร สมมุติชื่อ cb1 (โดยไม่ต้องใช้ Wizards สร้าง ให้ Cancel ไป) กำหนด Property ดังนี้:
Data > Row Source: SELECT Tb1.ID, Tb1.Machine FROM Tb1;
Format > Column Count: 2
Format > Column Widths: 0cm;2cm
ส่วนอื่นๆตามค่ามาตรฐาน

- สร้าง Combo Box ตัวที่สองสำหรับเมื่อเลือกชื่อเครื่องจักรแล้ว ให้แสดงเฉพาะรายชื่อลูกค้าที่ใช้เครื่องจักรตัวนั้นๆ ตามในตาราง Tb2 สมมุติชื่อ cb2 (โดยไม่ต้องใช้ Wizards สร้าง ให้ Cancel ไป) กำหนด Property ดังนี้:
Format > Column Count: 2
Format > Column Widths: 0cm;2cm
Event > On Got Focus: เขียนโค๊ดดังนี้
If Nz(Me.cb1, "") = "" Then
    Me.cb2.RowSource = ""
Else
    Me.cb2.RowSource = "SELECT Tb2.ID, Tb2.Customer, Tb2.ID_Machine FROM Tb2 WHERE Tb2.ID_Machine =" & Me.cb1.Column(0) & ";"
End If

เสร็จแล้วลองเปิดฟอร์มแล้วเลือก Combo Box ดู จะเห็นว่าเมื่อเลือกชื่อเครื่องจักรแล้วคลิ๊กที่ Combo Box ตัวที่สอง ก็จะแสดงชื่อลูกค้าที่ใช้เฉพาะเครื่องจักรนั้น ประเด็นที่เขียนมายืดยาว คือเรื่องของการใช้ WHERE clause ให้กับ Combo Box หรือ List Box ในส่วนของ RowSource โดยเราสามารถใช้เงื่อนไขตามที่เราต้องการอ้างถึงให้ถูกต้องตามที่เราต้องการ Combo Box ก็จะแสดงตามเงื่อนไขที่เรากำหนด (ก็เหมือนการเขียน SQL statement ในคิวรี่นั่นแหละครับ)

ปล. ตัวอย่างนี้เป็นแค่หลักการคร่าวๆ เท่านั้น การที่คุณจะกำหนดอะไรให้ซับซ้อนมากขึ้น ก็จะต้องมีการปรับแต่งรายละเอียดมากขึ้นเช่นกัน ผมคงไม่สามารถบอกรายละเอียดย่อยๆได้หมด ทั้งนี้ขึ้นอยู่กับพื้นฐานของผู้เขียนเอง หากจะใช้งาน MS Access ให้มีความซับซ้อนมากขึ้นเท่าไหร่ ก็ต้องมีพื้นฐานทีดีมากขึ้นตามไปเดียวนะครับ หากพื้นฐานยังไม่ดีพอ ก็จะมีปัญหาตามมาอีกมากมาย ไม่รู้จบ เพราะไม่มีองค์ความรู้ที่จะนำไปต่อยอดเองได้ (พื้นฐานสำคัญที่สุด อย่ามองข้าม) ดังนั้นแนะนำศึกษาจากหนังสือให้มากๆครับ สมัยแรกๆ ผมก็เป็นครับ อยากทำอะไรให้มันซับซ้อนมากขึ้น มากขึ้น โดยที่พื้นฐานเรายังไม่ดีพอ คำตอบสุดท้ายก็คือเรื่องของความรู้พื้นฐานครับ ต้องแน่นก่อน แล้วจากนั้นอ่านอะไรก็เข้าใจ ต่อยอดแนวคิดเราได้สบาย เพราะสุดท้ายแนวคิดเรา เราต้องทำเอง ไม่มีใครทำให้เราได้ดีเท่าเราทำเองหรอกครับ
5 @R14649
Private Sub Combo2_GotFocus()
If Nz(Me.Combo0, "") = "" Then
    Me.Combo2.RowSource = ""
Else
    Me.Combo2.RowSource = "SELECT Table2.Customer FROM Table2 WHERE Table2.ID_Machine =" & Me.Combo0.Column(0) & ";"
End If
End Sub
เขียน Code สำหรับ Combo2 ตามข้างบน แล้วไปที่ Form View เลือก Machine (Combo0) ได้ แล้วเลือก Customer (Combo2)พอเลือกแล้วขึ้น
Dialog Box ว่า
"Enter Parameter Value" ทั้งๆที่ไม่ได้กำหนดค่า Parameter เลย
ไม่รู้เป็นเพราะอะไรครับ
6 @R14650
ก่อนอื่น ขอโทษคุณchatree ไว้ตรงบรรทัดแรกนี้ก่อนเลยนะ
อ่านกระทู้่ของคุณแล้ว เหมือนคุณ "เป็น (มีพื้นฐานแอคเซส)" แต่ "ไม่เป็น"
จะว่า "ไม่เป็น" คุณก็สามารถเขียนโค้ดได้ดีกว่าผมอีก
ผมอาศัย "ครูพักลักจำ" มาตอบคุณนะ
1.กลับไปดูการออกแบบเทเบิ้ลให้เรียบร้อยตามหลัก colonization (เขียนถูกหรือเปล่าไม่รู้)
2.ใช้คิวรีสกรีนข้อมูลที่ต้องการออกมา
3.เอาคิวรี (หรือแปลงเป็นเอสคิวแอล) แล้วเอาไปผูก/ไปฝังกับคอนโทรลตัวนั้น
4.ทดสอบรันดู (เขียนเท็กซ์บ็อกมารับค่า/เช็คคำสั่งดู) ถ้าไม่ได้อย่างใจ ก็ค่อยหาทางแก้ไขใหม่
ลองดูใหม่ตามนี้นะครับ
ผมเห็นใจคุณ เพราะคำถามของคุณไม่ค่อยได้รับการตอบสนอง เพราะความ "เป็น/ไม่เป็น"ของคุณนี่แหละ
7 @R14653
ปัญหาคือ อ้าง WHERE clause ผิดอ่ะครับ ดูนะครับ ที่ผมเขียนบรรทัดนี้คือ
Me.cb2.RowSource = "SELECT Tb2.ID, Tb2.Customer, Tb2.ID_Machine FROM Tb2 WHERE Tb2.ID_Machine =" & Me.cb1.Column(0) & ";"

หมายถึง เลือกฟิลด์ ID ฟิลด์ Customer ฟิลด์ ID_Machine จากตาราง Tb2 โดยที่ ฟิลด์ ID_Machine เท่ากับ ค่าในคอนโทรล Combo Box ชื่อ cb1 ที่คอลัมน์ 0

แต่ที่คุณเขียน
Me.Combo2.RowSource = "SELECT Table2.Customer FROM Table2 WHERE Table2.ID_Machine =" & Me.Combo0.Column(0) & ";"

หมายถึง เลือกฟิลด์ Customer อย่างเดียว แล้ว Combo0.Column(0) ในคอลัมน์ 0 คือค่าอะไร ใช่ค่าตัวเลขที่ไว้เทียมกับค่า ID_Machine หรือไม่ เดาว่าไม่ตรงกันแน่ครับ MS Access ถึงขึ้น Enter Parameter Value ให้ใส่ค่าใหม่

อย่างที่บอกอ่ะครับ (ก็จะมีปัญหาตามมาอีกมากมาย ไม่รู้จบ) ผมไม่ได้ว่านะ เข้าใจ ผมเองก็เป็นบ่อยๆ แบบว่าใจมันไปไกลกว่าความรู้เสมอ แต่อยากให้ใจเย็นๆครับ วิเคราะห์ดูคำสั่งที่เขียน ทำความเข้าใจก่อนว่าเขียนแบบนี้มันหมายความว่าอย่างไร เอาแต่หลักการณ์ไปครับ คำสั่งที่ผมเขียนมันแค่คร่าวๆ ไม่ยืดหยุ่น ไม่ครอบคลุมสิ่งที่คุณอยากได้หรอกครับ
8 @R14654
คุณ TheBeginner วิธีการที่คุณอ้างนั้น เราเรียกว่า การทำ Normalization ครับ
9 @R14655
Private Sub Combo2_GotFocus()
If Nz(Me.Combo0, "") = "" Then
    Me.Combo2.RowSource = ""
Else
    Me.Combo2.RowSource = "SELECT Table2.Customer FROM Table2 WHERE Table2.ID_Machine =" & Me.Combo0.Column(0) & ";"
End If
End Sub
ตาม Code ด้านบน เกือบได้แล้วครับ แต่ติดปัญหานิดเดียวตรงที่ ไปที่ Form View เลือก Machine (Combo0) ได้ แล้วเลือก Customer (Combo2)พอเลือกแล้วขึ้น
Dialog Box ว่า
"Enter Parameter Value" ทั้งๆที่ไม่ได้กำหนดค่า Parameter เลย
แต่พอใส่ ค่า Parameter เป็นชือเครื่องจักร (Machine) ถึงจะขึ้น List ให้
ทำให้ไม่สะดวกในการใช้งานครับ อยากให้ขึ้น List เลยไม่ต้องใส่ค่า
Parameter ก่อนน่ะครับ
ขอโทษด้วยน่ะครับเพิ่งจะเรียนรู้การสร้าง Code น่ะครับ
10 @R14656
จะตอบอีกครั้งก็คือ WHERE clause ผิดอ่ะครับ T_T
คุณสร้างไม่เหมือนในตัวอย่างที่ให้ไปนะครับ
- คุณ SELECT ตาราง Table2 ที่ฟิลด์ Customer อย่างเดียว เพราะอะไร
- ในตาราง Table2 มีฟิลด์ ID_Machine หรือไม่ ทำไมไม่ Select เข้ามาด้วย
- Table2.ID_Machine คือ ชื่อเครื่องจักร หรือเป็นตัวเลข ID ของเครื่องจักรครับ
- ใน Combo0 คุณ Select อะไรไว้บ้าง

แนะนำลองทำตามตัวอย่างผมก่อนทีละบรรทัดให้ครบ แล้วค่อยๆวิเคราะห์ดู
11 @R14658
Table1
ID    Machine
1        EN-1
2        EN-2

Table2
ID    Customer    ID_Machine
1          A                 EN-1
2          B                 EN-1
3          C                 EN-2
4          D                 EN-2

แล้วผมเขียน Code ไปผูกกับ Combo2 ดังนี้
Private Sub Combo2_GotFocus()
If Nz(Me.Combo1, "") = "" Then
    Me.Combo2.RowSource = ""
Else
    Me.Combo2.RowSource = "SELECT Table2.ID,Table2.Customer,Table2.ID_Machine FROM Table2 WHERE Table2.ID_Machine =" & Me.Combo1.Column(0) & ";"
End If
End Sub

ผลปรากฎว่า
ไปที่ Form View เลือก Machine (Combo1) ได้ แล้วเลือก Customer (Combo2)พอเลือกแล้วไม่ขึ้น List อะไรเลยครับ
ช่วยหน่อยครับ
12 @R14659
ถ้าสนใจจ้างผมเขียนโปรมแกรม ติดต่อมาได้นะครับ pichaitc@gmail.com
13 @R14660
Table2
ID    Customer    ID_Machine
1          A                 EN-1
2          B                 EN-1
3          C                 EN-2
4          D                 EN-2

จริงๆแล้วคุณเก็บ ID_Machine เป็นตัวเลข ID ก็พอ
Table2
ID    Customer    ID_Machine
1          A                 1
2          B                 1
3          C                 2
4          D                 2

แต่ชั่งมันครับ ผมคงไม่สามารถให้คุณเปลี่ยนได้ (บอกให้ลองทำตามตัวอย่างคุณก็ไม่ทำ และถามว่า Combo1 คุณเขียน SQL อย่างไร คุณก็ไม่ตอบ T_T) เอาเป็นแบบนี้นะครับ

1. ที่ Combo1 ใส่โค๊ดเป็นอย่างนี้ครับ:
Data > Row Source: SELECT Table1.ID, Table1.Machine FROM Table1;
Format > Column Count: 2
Format > Column Widths: 0cm;2cm
ส่วนอื่นๆตามค่ามาตรฐาน

2. ที่ Combo2 ใส่โค๊ดที่ Got Fucus เป็น:
If Nz(Me.Combo1, "") = "" Then
    Me.Combo2.RowSource = ""
Else
Me.Combo2.RowSource = "SELECT Table2.ID,Table2.Customer,Table2.ID_Machine FROM Table2 WHERE Table2.ID_Machine =" & Me.Combo1.Column(1) & ";"
End If

สังเกตุ: Me.Combo1.Column(0) ผมเปลี่ยนเป็น Me.Combo1.Column(1) เพราะผมไม่รู้ว่าคุณ Select ฟิลด์ Machine ไว้ที่คอลัมน์เท่าไร ถามแล้วคุณไม่ตอบ

หากยังไม่ได้อีก ผมบอกได้ว่าปัญหามันไม่มีอะไรเลย อยู่แค่คำสั่งนี้ครับ
WHERE Table2.ID_Machine =" & Me.Combo1.Column(1)
ลองแก้ให้ค่ามันเป็นค่าที่เทียบกันได้ เช่นหาก Table2.ID คุณเป็น ชื่อเครื่องจักร ที่ Combo1.Column(1) คุณก็ต้องเป็นชื่อเครื่องจักรเหมือนกัน แต่ที่คุณยังไม่ได้ เดาว่า ค่าฟิลด์หนึ่งยังเป็นตัวเลข และฟิลด์หนึ่งเป็น Text ชื่อเครื่องจักร มันเลยไม่สามารถเทียบกันได้ ไม่รู้เข้าใจหรือเปล่า ลองปรับดูแล้วกันนะครับ แถวๆนี้แหละครับ
14 @R14661
ทำได้แล้วครับ ขอบคุณ คุณ T_T และท่านอาจารย์ทุกท่านมากเลยครับ
ผมเปลี่ยนตามคำแนะนำดังนี้
จาก
Table2
ID    Customer    ID_Machine
1          A                 EN-1
2          B                 EN-1
3          C                 EN-2
4          D                 EN-2

เปลี่ยนเป็น

Table2
ID    Customer    ID_Machine
1          A                 1
2          B                 1
3          C                 2
4          D                 2
ส่วนคำสั่งนี้ ใช้ Column(0) ดังนี้
WHERE Table2.ID_Machine =" & Me.Combo1.Column(0)

ผมงงตรง Column(0) เนี่ยครับ ไม่รู้นับยังไง ว่าเป็น 0,1 หรือ 2 (ผมเข้าใจว่ามันอยู Column ที่3 ตามตารางครับ ถ้ายังไงอธิบายหน่อยก็ดีครับ
15 @R14663
มันเริ่มที่ Column(0) ไล่ไปเป็น 1 2 3 ครับ ต้องจำ
16 @R14664
ขอถามอีกหน่อยครับ
ชื่อเครื่องจักรและชื่อลูกค้า หน้าฟอร์มเป็นชื่อ
แต่ Table แสดงข้อมูลเป็นตัวเลข ID ทำยังไงจะให้ข้อมูลที่ถูกเก็บใน
Table เป็นชื่อเครื่องจักรและชื่อลูกค้า ตอนนี้มันแสดงเป็นแบบนี้
ID    CustomerName     MachineName
1          1                            1
2          2                            2
3          3                            3
4          4                            4

อยากให้แสดงแบบนี้     

ID    Customer        MachineName
1          A                          EN-1      
2          B                          EN-2
3          C                          EN-3
4          D                          EN-3           
17 @R14667
ตอบแบบกำปั้นทุบดินนะ ก็เข้าไปแก้ข้อมูลในฟิลด์ในเทเบิ้ล มันก็แสดงผลออกมาแล้ว
18 @R14669
แสดงผลหรือดูข้อมูลให้ทำใน Qeury เลือกตารางที่ต้องการและเชื่อมสัมพันธ์ให้ถูกต้อง แล้วเลือกฟิลด์ที่ต้องการแสดง กดปุ่ม run Qeury ข้อมูลจะได้อย่างที่ต้องการ ข้อมูลที่ได้สามารถไปแสดงใน Form หรื่อ Report
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3301s