ปัญหาที่เกิดจากความสัมพันธ์
กระทู้เก่าบอร์ด อ.Yeadram

 1,360   5
URL.หัวข้อ / URL
ปัญหาที่เกิดจากความสัมพันธ์

มีคำถามดังนี้ครับ
1.ผมมีข้อมูล 2 ชุด ชุดแรกเป็นเบอร์รถ ชุดที่ 2 เป็นเบอร์เครื่องปั่นไฟ
ปัญหาคือ รถ 1 คัน สามารถติดเครื่องปั่ไฟได้ 1 ตัว แต่ไม่ถาวรซึ่งจะมีการเปลี่ยนเครื่องปั่นไฟก็ต่อเมื่อมีอาการเสียดังนั้นเมื่อในครั้งแรกมีการเชื่อมความสัมพันธ์โดยใช้เบอร์รถเป็นตัวเชื่อมของทั้ง 2 ตาราง และมีการคีย์เร็คคอร์ดการเติมน้ำมันโดยใช้เบอร์รถเป็นหลัง แล้วเบอร์เครื่องปั่นไฟจะขึ้นอัตโนมัติตามรูปแบบของความสัมพันธ์และทุกเร็คคอร์ดที่คีย์ผ่านฟอร์มก็ถูกบันทึกผ่าน คิวรี่ที่สร้างความสัมพันธ์ไว้ไปยัง เทเบิลที่เก็บข้อมูล ปัญหาคือ
ตัวอย่าง
       เครื่องปั่นไฟเบอร์ 1 ที่ติดอยู่บนรถเบอร์ 1 เสียต้องเปลี่ยนโดยนำเครื่องปั่นไฟ
เบอร์ 2 ไปติดไว้กับรถเบอร์ 1 ผมจึงแก้ไขในฐานข้อมูลของรถเบอร์ 1 ให้มีเครื่องปั่นไฟเป็นเบอร์ 2 และให้เครื่องปั่นไฟเบอร์ 1 ไปอยู่ในกลุ่มของเครื่องปั่นไฟ stock
ข้อมูลที่ได้เคยคีย์ไว้ทั้งหมดตั้งแต่ต้นของรถเบอร์ 1 จึงเปลี่ยนอัตโนมัติเป็น เครื่องปั่นไฟเบอร์ 2 ครับ ทำให้เวลาเรียกข้อมูลเพื่อดู performance ของเครื่องปั่นไฟเบอร์ 1 กลับไม่มีเร็คคอร์ดการใช้งานครับ
   มีแนวทางแก้ไขอย่างไรครับ
2.เราสามารถนำตัวแปรที่เขียนขึ้นเช่นตัวแปรชื่อ "Upc"ซึ่งแทนชื่อจังหวัดประมาณ 20 จังหวัดไปวางในส่วนของ criteria ของ query ได้หรือไม่ และทำอย่างไรครับ

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

1 @R07688
1. เข้าใจว่าเทเบิลที่สร้างจะมีลักษณะนี้

เทเบิลรถ : หมายเลขรถ (pk), ... , หมายเลขเครื่องปั่นไฟ ,.....

เพราะเราต้องการเก็บเป็นเหมือนประวัติของเครื่องปั่นไฟที่ถูกใช้งานไปว่าใช้กับรถคันไหน (และอาจจะ นานแค่ไหน + ข้อมูลอื่นๆอีกเพื่อใช้ประเมิน performance) ดังนั้นสิ่งที่ผมคิดว่าน่าจะเป็นคือต้องมีเทเบิลการใช้งานเครื่องปั่นไฟขึ้นมาอีกเทเบิลซึ่งมีลักษณะดังนี้

เทเบิลการใช้งานเครื่องปั่นไฟ : หมายเลขรถ (pk), วันที่เริ่มใช้งานเครื่องปั่นไฟกับรถคันนี้ (pk), วันที่เลิกใช้งาน, หมายเลขเครื่องปั่นไฟ, ...

เนื่องจากมีหมายเลขรถ + วันที่เริ่มใช้งานเป็น primary key ดังนั้นเราจึงสามารถป้อนการใช้งานเครื่องปั่นไฟเครื่องใหม่เป็นเรคอร์ดใหม่ไปได้เรื่อยๆ เราจะไม่ป้อนทับเรคอร์ดเดิมนะครับ ซึ่งเท่ากับเป็นการเก็บประวัติการใช้งานไปในตัว

2. ตัวแปรไม่สามารถใส่ลงในคิวรี่ได้ แต่คิวรี่ยอมรับฟังก์ชั่นได้ ดังนั้นถ้าเราสร้าง Public Function ขึ้นมา แล้วกำหนดค่าของฟังก์ชั่นให้เป็นค่าของ Upc แทนได้ เช่น

Public Function GetUpc( ) as ...
     GetUpc = Upc
End Function

หรืออีกอย่างคือ คิวรี่สามารถอ้างอิงถึงคอนโทรลต่างๆบนฟอร์มได้ เช่น Textbox, Combobox, Listbox, ... ดังนั้นให้เราสร้างคอนโทรลที่เป็น Invisible Control ลงในฟอร์มใดฟอร์มหนึ่ง (ที่ต้องแสดงก่อนการเรียกใช้คิวรี่เสมอ) โดยกำหนด .Visible property ของคอลโทรลให้มีค่าเป็น False แล้วก็เขียนคำสั่งให้คอนโทรลนี้มีค่าเท่ากับ Upc แล้วจึงค่อยเรียกคิวรี่มาทำงานต่อไป

การอ้างอิงชื่อคอนโทรลในฟอร์ม ก็ใส่รูปแบบ Forms![ชื่อฟอร์ม]![ชื่อคอนโทรล] ลงในช่อง Criteria ของคิวรี่ครับ
2 @R07691
1.ผมมีเทเบิล 2 เทเบิลครับ คือ เทเบิลของ truck ซึ่งจะมีเบอร์รถ หมายเลขทะเบียน หมายเลขแชสซี วันที่ซื้อ โดยมีทั้งหมด 60 คัน แต่ละคันมีเบอร์รถที่ตั้งขึ้นเป็น (pk) 3ตัวเลข เช่น 307,308,619 ส่วนอีกเทเบิลคือ เทเบิลเครื่องปั่นไฟ ซึ่งจะมีทั้งหมด 68 เครื่อง ซึ่งถูกติดตั้งให้กับรถทั้งหมด 60 คันครับ โดยมีเบอร์รถเป็น (pk) 60 คันเท่ากับเทเบิล truck และตามด้วยเบอร์เครื่องปั่นไฟซึ่งยาวมากคือมีตัวอักษร4 ตัวและตัวเลข 6 ตัวติดกันเช่น SLGS111111 ครับส่วนเครื่องปั่นไฟที่ไม่ติดรถจะใช้ shop1,shop2...,shop8 ครับแล้วใช้เบอร์รถของทั้งสองเทเบิลเชื่อมความสัมพันธ์กันผ่านคิวรี่และใช้เบอร์รถจากเทเบิล truck เป็นหลัก แล้วนำคิวรี่นี้ไปสร้างฟอร์ม 2 ฟอร์ม ฟอร์มแรกเป็นการเก็บข้อมูลการเติมน้ำมันของรถซึ่งไม่จำเป็นต้องดึงฟิลของเครื่องปั่นไฟมาใช้ ส่วนฟอร์มที่2ซึ่งเก็บข้อมูลการเติมน้ำมันเครื่องปั่นไฟ ให้คีย์หมายเลขรถแล้วให้ฟิลเครื่องปั่นไฟเด้งขึ้นมาอัตโนมัติครับเพราะถ้าให้คีย์เลขเครื่องปั่นไฟคงจะลำบากครับเพราะยาวมากหรือถ้าให้เลือกจากรายการก็คงตาลายครับเพราะมี 68 เครื่องเนื่องจากเครื่องปั่นไฟถูกยึดติดกับรถเบอร์นั้นๆนอกเสียจากเครื่องเสียก็จะนำเครื่องที่เป็นอะหลั่ยขึ้นเปลี่ยน ปัญหาจึงเกิดขึ้นเนื่องจากเมื่อมีการเปลี่ยนเครื่องปั่นไฟผมต้องเข้าไปเปลี่ยนในเทเบิลโดยสลับตำแหน่งเช่นถ้าเบอร์นึงเสียก็จะนำไปเปลี่ยนที่กับเครื่องอะหลั่ยแล้วนำเบอร์ที่เป็นเครื่องอะหลั่ยขึ้นมาแทนที่ครับทำให้เวลาฟิวเตอร์ข้อมูลจึงเห็นเบอร์รถที่มีการเปลี่ยนเครื่องปั่นไฟเป็นเบอร์เครื่องใหม่ตั้งแต่อดีตถึงปัจจุบันครับแต่ถ้าเลือกวิธีคีย์เบอร์เครื่องปั่นไฟก็สงสาร user ครับ และถ้าคีแยกโดยไม่ใช้ความสัมพันธ์เวลาจะวัด performance ก็ต้องมานั่ง lookup ใน excel ซึ่งเสียเวลาครับ

2.เคยลองเขียนฟังชั่นแล้วนำไปใช้ที่ช่อง field ของ query ได้ครับ แต่อยากนำไปใช้ที่ช่อง criteria ครับเพราะบางทีเงื่อนไขยาวมากครับเช่นบางทีผมใช้พวก not in () เลยอยากนำชื่อฟังชั่นไปวางได้เลยครับแต่จะลองปรับเปลี่ยนวิธีการดูครับ
3 @R07692
1. ที่คุณออกแบบเทเบิลเครื่องปั่นไฟมา ก็ใกล้เคียงแล้ว เพียงแต่คุณใช้ฟิลด์เลขรถเพียงแค่ฟิลด์เดียวเป็น PK ถ้าใช้ทั้งเลขรถและเลขเครื่องปั่นไฟเป็น PK ด้วย ก็จะแก้ปัญหาได้ในระดับนึง แต่แม้ว่าทำอย่างนั้นแล้ว ก็จะติดปัญหาต่อมาว่า รถคันเดียวกันนั้นจะไม่สามารถใช้เครื่องปั่นไฟเครื่องเดิมที่เคยใช้มาก่อนแล้วได้อีก เพราะจะไปซ้ำกับเรคอร์ดเก่าที่เคยมีมา ผมเลยคิดว่า ใช้เลขรถและวันที่เริ่มต้นใช้เครื่องปั่นไฟเป็น PK จะดีกว่า

2. จากเดิม select ... from เทเบิลหลัก where field not in ( , , , ... ) ก็ต้องสร้างเทเบิลชั่วคราวขึ้นมา เพื่อใส่ค่า 20 จังหวัดนั้นลงไป แล้วใช้คิวรี่ในรูปแบบ select ... from เทเบิลหลัก where เทเบิลหลัก.จังหวัด not in (select จังหวัด from เทเบิลชั่วคราว) อย่างนี้พอจะช่วยได้ไหมครับ
4 @R07693
ไม่เคยผิดหวังจริงๆครับแค่อ่านแนวคิดของอาจารย์ผมก็เห็นความน่าจะเป็นแล้วครับจะลองดูครับ ขอบคุณมากๆครับ
5 @R07735
พบวิธีที่ง่ายมากเลยครับแค่สร้างฟิลด์ขึ้นมาอีก 1 ฟิลด์เป็นส่วนหนึ่งของ table เดิมครับแล้วเพิ่มฟิลด์นั้นเข้า query ที่ใช้สร้างฟอร์มด้วยโดยที่ตั้งให้ textbox ที่เป็นตัวแทนของฟิลด์ดังกล่าว มีค่า Defalt value =[ชื่อฟิลด์เครื่องปั่นไฟ.value] ครับ
แล้วก็ visible ฟิลด์เครื่องปั่นไฟเดิมซะ หลังจากนั้นเมื่อคีย์เบอร์รถที่เป็นคีย์หลักความสัมพันธ์ก็จะทำงานในขณะที่โดน visible อยู่ และฟิลด์ที่สร้างเพิ่มก็จะมีค่าเท่ากับฟิลด์เครื่องปั่นไฟเดิมโดยปริยายเนื่องจากตั้ง defalt value ไว้ให้เท่ากับฟิลด์เครื่องปั่นไฟเดิมครับทีนี้ลองเข้าไปเปลี่ยนเลขเครื่องปั่นไฟที่ผูกไว้กับเบอร์รถแล้วลองกลับไปคีย์เบอร์รถเดิมปรากฎว่าฟิลด์ที่สร้างใหม่ข้อมูลจะเปลี่ยนไปตามที่แก้ไขในฐานข้อมูลครับแต่ record เก่าจะไม่เปลี่ยนครับในขณะที่ถ้าลองไดูฟิลด์เครื่องปั่นไฟเก่า record ที่ผ่านมาจะเปลี่ยนเป็นเบอร์ใหม่ทั้งหมดเนื่องจากความสัมพันธ์ แต่เราสามารถเลือกใช้ฟิลด์ใหม่แทนในการนำไป query หาค่าได้ 100% ครับ
เผื่อว่ามีใครประสบปัญหาแบบผมอยู่เพราะหลังจากคิดออกสามารถนำเทคนิคนี้ไปใช้แก้ปัญหาที่เกิดจากความสัมพันธ์ได้กับอีกหลายตัวเลยครับอีกทั้งยังใช้ง่ายและไม่ต้องเขียน vb ด้วยครับเผื่อจะมีประโยชน์กับเพื่อนๆครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.5284s