กระทู้เก่าบอร์ด อ.Yeadram
3,163 11
URL.หัวข้อ /
URL
ช่วยหน่อยครับ
ขอโทดนะครับ ถ้าผมพิม ไทย ไม่ถูก คือผมเป็นคนลาว นะครับ
อยากถาม เรือง access นิดหน่อย
คือผม มี table ของ TblCategories, TblProducts และ TblOrder
ใน TblCategories ของผม จะมีอยู่ 3 อย่าง คือ CD, DVD, Book
แล้วตอนใส่ ข้อมูน จะใส่ OrderID และ Categories ช่องถัดไปจะเป็น Product ในช่อง Production ผมอยากให้ เป็น List ข้อมูน ตาม Categories ได้ไหม example: ใน Categories ผมใส เป็น CD แล้ว ในช่อง ของ Production (List) อยากจะให้ มี list เฉพาะ เลือก CD จากทังหมดที่มีใน TblProduction
อยากถาม เรือง access นิดหน่อย
คือผม มี table ของ TblCategories, TblProducts และ TblOrder
ใน TblCategories ของผม จะมีอยู่ 3 อย่าง คือ CD, DVD, Book
แล้วตอนใส่ ข้อมูน จะใส่ OrderID และ Categories ช่องถัดไปจะเป็น Product ในช่อง Production ผมอยากให้ เป็น List ข้อมูน ตาม Categories ได้ไหม example: ใน Categories ผมใส เป็น CD แล้ว ในช่อง ของ Production (List) อยากจะให้ มี list เฉพาะ เลือก CD จากทังหมดที่มีใน TblProduction
11 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R02829
ขอบคุณครับ
แต่อ่านแล้ว ยัง งง ครับ ช่วย อธิบาย อีกหน่อยได้ไหมครับ
แต่อ่านแล้ว ยัง งง ครับ ช่วย อธิบาย อีกหน่อยได้ไหมครับ
3 @R02830
ໍช่วย อธิบาย ขั้นตอน เลื้มตั้ง แต่ ทำ ตั้งแต่ เลี้มต้นเลยได้ไหมครับ ต้องทำ table แบบไหน เพราะ ใน TblProduct ผมมันจะมี ราคา มาด้วย ผมอยากให้เลื้อกเอา product เลย ให้ราคามัน มีมาด้วยเลยครับ
ผมมือใหม่ครับ basic ยังไม่ดีเลย ช่วยที่นะครับ
ผมมือใหม่ครับ basic ยังไม่ดีเลย ช่วยที่นะครับ
4 @R02831
ตอนแรก ผม ส้าง relation เป็นแบบนี้ ครับ
แล้วผมทำ Query แล้ว run
query ผม ผมอยากให้ CategoryName เป็น List ให้เลือกครับ
แล้วใน ProductionName ก่ออยากให้ เป็น List แต่ ต้อง เป็นไปต่าม เงื่อนไข ของ CategoryName ครับ
ช่วยทีนะครับ ขอบคุณมากๆ ครับ
แล้วผมทำ Query แล้ว run
query ผม ผมอยากให้ CategoryName เป็น List ให้เลือกครับ
แล้วใน ProductionName ก่ออยากให้ เป็น List แต่ ต้อง เป็นไปต่าม เงื่อนไข ของ CategoryName ครับ
ช่วยทีนะครับ ขอบคุณมากๆ ครับ
5 @R02833
ถ้าทำด้วย Query และป้อนข้อมูลผ่าน Query อันนั้นเลย อย่างดีที่สุดที่ Access จะทำได้ก็คือสร้างเป็น Combobox ให้ผู้ใช้เลือกค่าที่ต้องการใส่ในฟิลด์ CatagoryName หรือ ProductName ได้เท่านั้น แต่จะไม่สามารถให้เป็นไปตามเงื่อนไขของฟิลด์อื่น ทำอย่างนั้นไม่ได้ ถ้าต้องการให้ทำได้ คุณต้องไปสร้างเป็น Form เท่านั้น และได้เฉพาะ Single Form จะเป็น Continuous Form หรือ Datasheet ก็ทำไม่ได้ด้วย แต่จากลักษณะของการป้อนข้อมูล Order Detail มันควรเป็นแบบ Continuous Form ดังนั้นมันจึงขัดแย้งกัน ตรงนี้แหล่ะที่ทำให้ยากครับ
ปัญหาคือ นี่เป็นงานใช้จริง หรือทำขึ้นเล่นๆ ถ้าทำเล่นๆ ก็เปลี่ยนโจทย์สักหน่อย จะทำให้งานง่ายขึ้น ถ้าทำจริงๆ ต้องใช้เวลามากเพื่อที่จะคิดหาทางแก้ไขครับ
หรือใครมีความคิดอะไรดีๆ ก็เชิญได้เลย
ปัญหาคือ นี่เป็นงานใช้จริง หรือทำขึ้นเล่นๆ ถ้าทำเล่นๆ ก็เปลี่ยนโจทย์สักหน่อย จะทำให้งานง่ายขึ้น ถ้าทำจริงๆ ต้องใช้เวลามากเพื่อที่จะคิดหาทางแก้ไขครับ
หรือใครมีความคิดอะไรดีๆ ก็เชิญได้เลย
6 @R02836
ถ้างั้น ทำแบบนี้ พอจะได้ไหมครับ?
ทำ เป็น Tbl ที่แยกกันเลย แบบว่า ทำ Tbl ของ Categories ที่ 1. 2. 3. 4 แยกกัน แล้ว ใน Form ไปทำเป็นว่า order ที่1 เลือก Categories 1 แล้ว เลือก Products (แต่ใน Products จำเป็น Combobox และเป็น continuous datasheet)ของ Categories ที่1 ต่อด้วย 2. 3. 4 ตามลำดับ แล้ว สุดท้าย ตอน Show report ให้ ข้อมูล ของ 4 Categories มาลวมกันใน Tbl เดียว แบบนี้ พอจะได้ไหมครับ?
ทำ เป็น Tbl ที่แยกกันเลย แบบว่า ทำ Tbl ของ Categories ที่ 1. 2. 3. 4 แยกกัน แล้ว ใน Form ไปทำเป็นว่า order ที่1 เลือก Categories 1 แล้ว เลือก Products (แต่ใน Products จำเป็น Combobox และเป็น continuous datasheet)ของ Categories ที่1 ต่อด้วย 2. 3. 4 ตามลำดับ แล้ว สุดท้าย ตอน Show report ให้ ข้อมูล ของ 4 Categories มาลวมกันใน Tbl เดียว แบบนี้ พอจะได้ไหมครับ?
7 @R02838
ขอโทษด้วย ตอนนี้ยังไม่ว่างตอบ จะตอบให้เร็วที่สุดครับ น่าจะเป็นพรุ่งนี้ได้
8 @R02839
ครับ จะรอ นะครับ
9 @R02840
ปัญหาต่างๆ ที่มันยาก เกิดขึ้นเพราะ
1) ใน Continuous Form คอนโทรลใดที่ไม่ได้เป็น Bound Control และไม่ได้มี RecordSource อิงกับ Bound Control จะทำให้ค่าของคอลโทรลนั้น แสดงออกมาเหมือนๆกันทุกบรรทัด จุดประสงค์ของงานของเราคือป้อนลง tblOrder เท่านั้น แต่ catagory ไม่ได้เป็นฟิลด์ใน tblOrder นั่นคือไม่ได้เป็น Bound Control นั่นเอง ดังนั้นมันจะดูแปลกๆเมื่อผู้ใช้เห็นว่าแต่ละบรรทัดมี catagory เปลี่ยนไปเหมือนๆกันทุกครั้งที่ผู้ใช้เลือกข้อมูลใหม่
2) แม้ combo box ที่แสดงชื่อสินค้าจะสามารถ bound เข้ากับ ProductID ได้ และแสดงเฉพาะส่วนที่เป็น ProductName เพื่อให้ผู้ใช้เลือกได้ แต่เมื่อ catagory เปลี่ยน จะทำให้ product list ใน combobox นั้นเปลี่ยนไปด้วย และเนื่องจากเป็น Continuous Form มันจึงมีผลไปทุกบรรทัดด้วย ดังนั้น ProductName ที่เคยแสดงได้จากบรรทัดก่อนๆ อาจแสดงออกมาไม่ได้แล้ว ถ้าเราเลือก catagory ในบรรทัดที่กำลังป้อนอยู่แตกต่างไปจากบรรทัดก่อนๆ อย่างไรก็ตาม ค่าจริงๆของ ProductID ในบรรทัดก่อนๆยังคงถูกต้องนะครับ เพราะว่ามันเป็น Bound Control เพียงแต่การแสดง ProductName เท่านั้นที่อาจแสดงไม่ได้
ทั้ง 2 ปัญหาทำให้การออกแบบฟอร์มเพื่อใช้งานนั้นทำไม่ได้อย่างง่ายๆอีกต่อไป สิ่งที่เราพอจะทำได้คือ เล่นกลลวงตาผู้ใช้ ก่อนจะบอกวิธีแก้ ผมขออธิบายถึงวิธีแสดงข้อมูลอื่นๆที่เกี่ยวข้องกับ Product แต่ไม่ได้อยู่ในเทเบิล tblOrder (คือ ProductName, UnitPrice และ VAT) หน่อยว่า เราจะสร้าง Unbound Textbox แล้วให้ ControlSource ไปค้นหาจาก tblProduct มาแสดงแทนด้วยฟังก์ชั่น DLookup( ) แล้วกัน ตรงจุดนี้จะทำให้ฟอร์มเรามี 2 ฟิลด์ที่ข้อมูลเดียวกัน คือ Bound Textbox : ProductID (แต่แสดง ProductName) ขอเรียกชื่อว่า txtProductID กับ Unbound Textbox : ProductName ขอเรียกชื่อว่า txtProductName ส่วนที่เหลือก็เป็น txtUPrice กับ txtVAT
ทีนี้วิธีแก้คือเราเล่นกลลวงตาผู้ใช้โดยให้ catagory, txtProductID และ txtProductName อยู่ซ้อนๆกันให้มิด โดยให้ txtProductName อยู่บนสุด ดังนั้นผู้ใช้จะเห็นเฉพาะ txtProductName เท่านั้น ส่วนอันอื่นจะแสดงเมื่อผู้ใช้เลื่อน Tab ไปป้อนข้อมูลเท่านั้น ดังนั้น แม้ว่า catagory และ txtProductID จะแสดงแล้วเกิดปัญหาอย่างที่อธิบายในข้อ 1) และ 2) มาแล้วก็ตาม ผู้ใช้ก็จะไม่เห็นอยู่ดี นอกจากนี้ยังให้ txtProductID ไม่รับ TabStop เพราะถ้าเกิดผู้ใช้กด BackTab ย้อนหลังมาจากบรรทัดก่อนหน้า ก็จะไปเข้า txtProductID ซึ่งอาจมี ProductList ที่ผิดก็ได้ Operation ของการใช้งาน ผู้ใช้จะเห็น txtProductID ก็ต่อเมื่อได้เลือก catagory แล้วเท่านั้น
เพื่อให้การทำงานถูกต้อง เราจะมี coding เล็กน้อยใส่ไว้โดยให้ทำงานเหล่านี้
- เปลี่ยนให้ txtProductID แสดงได้ตรงตาม catagory ที่ได้เลือกไว้
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ที่จะยังไม่มีค่ามาก่อนเลย
- สั่ง combobox ให้ dropdown ส่วนที่เป็นลิสท์ เพื่อให้ผู้ใช้ได้เลือกข้อมูลที่ต้องการได้เลย
ข้อเสีย
- ผู้ใช้จะเห็น txtProductID ก็ต่อเมื่อมีการเลือก catagory แล้วเท่านั้น ถ้าผู้ใช้กลับมาที่บรรทัดก่อนๆที่เคยเลือกไว้แล้ว แม้จะเห็น catagory ที่ถูกต้อง แต่ถ้าผู้ใช้ไม่คลิกเลือกอีกที ก็จะไม่เกิด AfterUpdate event ซึ่งเป็น event ที่สั่งให้กำหนดลิสท์ที่ถูกต้องให้แก่ txtProductID และให้กระโดดไปยัง txtProductID ด้วย
ผมทำ ตย.ขึ้นมาให้ลองเอาไปศึกษาดูนะครับ สามารถเข้าไปที่ accboard at gmail dot com password คือ accgmail ครับ subject คือ Catagory In Continous Form เป็น email ของกลุ่มที่ใช้เก็บ ตย.นะครับ ห้ามลบนะครับ แต่ไปดาวโหลดตัวอย่างมาได้ ใช้เสร็จแล้ว logout ด้วย
1) ใน Continuous Form คอนโทรลใดที่ไม่ได้เป็น Bound Control และไม่ได้มี RecordSource อิงกับ Bound Control จะทำให้ค่าของคอลโทรลนั้น แสดงออกมาเหมือนๆกันทุกบรรทัด จุดประสงค์ของงานของเราคือป้อนลง tblOrder เท่านั้น แต่ catagory ไม่ได้เป็นฟิลด์ใน tblOrder นั่นคือไม่ได้เป็น Bound Control นั่นเอง ดังนั้นมันจะดูแปลกๆเมื่อผู้ใช้เห็นว่าแต่ละบรรทัดมี catagory เปลี่ยนไปเหมือนๆกันทุกครั้งที่ผู้ใช้เลือกข้อมูลใหม่
2) แม้ combo box ที่แสดงชื่อสินค้าจะสามารถ bound เข้ากับ ProductID ได้ และแสดงเฉพาะส่วนที่เป็น ProductName เพื่อให้ผู้ใช้เลือกได้ แต่เมื่อ catagory เปลี่ยน จะทำให้ product list ใน combobox นั้นเปลี่ยนไปด้วย และเนื่องจากเป็น Continuous Form มันจึงมีผลไปทุกบรรทัดด้วย ดังนั้น ProductName ที่เคยแสดงได้จากบรรทัดก่อนๆ อาจแสดงออกมาไม่ได้แล้ว ถ้าเราเลือก catagory ในบรรทัดที่กำลังป้อนอยู่แตกต่างไปจากบรรทัดก่อนๆ อย่างไรก็ตาม ค่าจริงๆของ ProductID ในบรรทัดก่อนๆยังคงถูกต้องนะครับ เพราะว่ามันเป็น Bound Control เพียงแต่การแสดง ProductName เท่านั้นที่อาจแสดงไม่ได้
ทั้ง 2 ปัญหาทำให้การออกแบบฟอร์มเพื่อใช้งานนั้นทำไม่ได้อย่างง่ายๆอีกต่อไป สิ่งที่เราพอจะทำได้คือ เล่นกลลวงตาผู้ใช้ ก่อนจะบอกวิธีแก้ ผมขออธิบายถึงวิธีแสดงข้อมูลอื่นๆที่เกี่ยวข้องกับ Product แต่ไม่ได้อยู่ในเทเบิล tblOrder (คือ ProductName, UnitPrice และ VAT) หน่อยว่า เราจะสร้าง Unbound Textbox แล้วให้ ControlSource ไปค้นหาจาก tblProduct มาแสดงแทนด้วยฟังก์ชั่น DLookup( ) แล้วกัน ตรงจุดนี้จะทำให้ฟอร์มเรามี 2 ฟิลด์ที่ข้อมูลเดียวกัน คือ Bound Textbox : ProductID (แต่แสดง ProductName) ขอเรียกชื่อว่า txtProductID กับ Unbound Textbox : ProductName ขอเรียกชื่อว่า txtProductName ส่วนที่เหลือก็เป็น txtUPrice กับ txtVAT
ทีนี้วิธีแก้คือเราเล่นกลลวงตาผู้ใช้โดยให้ catagory, txtProductID และ txtProductName อยู่ซ้อนๆกันให้มิด โดยให้ txtProductName อยู่บนสุด ดังนั้นผู้ใช้จะเห็นเฉพาะ txtProductName เท่านั้น ส่วนอันอื่นจะแสดงเมื่อผู้ใช้เลื่อน Tab ไปป้อนข้อมูลเท่านั้น ดังนั้น แม้ว่า catagory และ txtProductID จะแสดงแล้วเกิดปัญหาอย่างที่อธิบายในข้อ 1) และ 2) มาแล้วก็ตาม ผู้ใช้ก็จะไม่เห็นอยู่ดี นอกจากนี้ยังให้ txtProductID ไม่รับ TabStop เพราะถ้าเกิดผู้ใช้กด BackTab ย้อนหลังมาจากบรรทัดก่อนหน้า ก็จะไปเข้า txtProductID ซึ่งอาจมี ProductList ที่ผิดก็ได้ Operation ของการใช้งาน ผู้ใช้จะเห็น txtProductID ก็ต่อเมื่อได้เลือก catagory แล้วเท่านั้น
เพื่อให้การทำงานถูกต้อง เราจะมี coding เล็กน้อยใส่ไว้โดยให้ทำงานเหล่านี้
- เปลี่ยนให้ txtProductID แสดงได้ตรงตาม catagory ที่ได้เลือกไว้
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ที่จะยังไม่มีค่ามาก่อนเลย
- สั่ง combobox ให้ dropdown ส่วนที่เป็นลิสท์ เพื่อให้ผู้ใช้ได้เลือกข้อมูลที่ต้องการได้เลย
ข้อเสีย
- ผู้ใช้จะเห็น txtProductID ก็ต่อเมื่อมีการเลือก catagory แล้วเท่านั้น ถ้าผู้ใช้กลับมาที่บรรทัดก่อนๆที่เคยเลือกไว้แล้ว แม้จะเห็น catagory ที่ถูกต้อง แต่ถ้าผู้ใช้ไม่คลิกเลือกอีกที ก็จะไม่เกิด AfterUpdate event ซึ่งเป็น event ที่สั่งให้กำหนดลิสท์ที่ถูกต้องให้แก่ txtProductID และให้กระโดดไปยัง txtProductID ด้วย
ผมทำ ตย.ขึ้นมาให้ลองเอาไปศึกษาดูนะครับ สามารถเข้าไปที่ accboard at gmail dot com password คือ accgmail ครับ subject คือ Catagory In Continous Form เป็น email ของกลุ่มที่ใช้เก็บ ตย.นะครับ ห้ามลบนะครับ แต่ไปดาวโหลดตัวอย่างมาได้ ใช้เสร็จแล้ว logout ด้วย
10 @R02841
ขอบคุณ มากๆๆ ครับ
เดียวจะลอง ศึกษาดู ครับ
เดียวจะลอง ศึกษาดู ครับ
11 @R02843
แก้ไขจุดที่เขียนผิด
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ที่จะยังไม่มีค่ามาก่อนเลย
เป็น
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ยังไม่มีค่ามาก่อนเลย
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ที่จะยังไม่มีค่ามาก่อนเลย
เป็น
- หา catagory ของบรรทัดเดิมมาใส่ให้ หรือกำหนดให้เป็น null เมื่อค่าใน txtProductID ยังไม่มีค่ามาก่อนเลย
Time: 0.3979s
http://www.thai-access.com/yeadram_view.php?topic_id=105