กระทู้เก่าบอร์ด อ.Yeadram
1,539 4
URL.หัวข้อ /
URL
Linked Table
สวัสดีครับ อาจารย์
ผมรบกวนเรื่องการทำ Linked table หน่อยครับ
ซึ่งปกติผมก็จะใช้การ Linked ปกติ แต่ปัญหาก็คือ มีหลาย table
เวลาเปลี่ยน path Lnked ใหม่เหนื่อยมาก เพราะต้องทำทีละ
table
เราสามารถทำวิธีอื่นที่เร็วกว่านี้ ได้หรือเปล่าครับ
อย่างเช่น เขียน vb ครับ
รบกวนด้วยครับ อาจารย์
ผมรบกวนเรื่องการทำ Linked table หน่อยครับ
ซึ่งปกติผมก็จะใช้การ Linked ปกติ แต่ปัญหาก็คือ มีหลาย table
เวลาเปลี่ยน path Lnked ใหม่เหนื่อยมาก เพราะต้องทำทีละ
table
เราสามารถทำวิธีอื่นที่เร็วกว่านี้ ได้หรือเปล่าครับ
อย่างเช่น เขียน vb ครับ
รบกวนด้วยครับ อาจารย์
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R06205
สวัสดีครับ
ผมรบกวนอธิบาย และวิธีใช้ด้วยครับผม
ผมรบกวนอธิบาย และวิธีใช้ด้วยครับผม
3 @R06209
ก็ไม่มีอะไรมาก
- For each TD .... ก็เป็นการวนลูป โดยกำหนด object variable TD ให้เป็นทีละเทเบิลในฐานข้อมูล
- TD.Attributes จะให้ค่าเท่ากับ dbAttachedTable เมื่อเทเบิลนั้นเป็น Linked Table ที่ลิงค์มาจากฐานข้อมูลประเภท Access ด้วยกันเอง (พวก .mdb, .mda) แต่ถ้าลิงค์มาจาก ODBC จะให้เป็นค่า dbAttachedODBC โดยปกติผมคิดว่า 99.99% เราสามารถทดสอบด้วยคำสั่ง If TD.Attributes = dbAttachedTable then ได้โดยตรง แต่เนื่องจาก .Attributes อาจมีค่าเกิดจากการรวมหลายๆ option เข้าด้วยกัน ด้วย logical OR (แต่ผมก็ไม่ทราบเหมือนกันว่ามันจะรวมกับ option อื่นอย่างไรได้บ้าง) ดังนั้นเพื่อให้แน่ใจเต็ม 100% เวลาจะทดสอบกรองเอาเพื่อดูว่ามีค่าของ dbAttachedTable อยู่ในส่วนผสมนั้นหรือไม่ ก็ต้องทดสอบด้วย logical AND (ตรงนี้คิดว่าหลายๆท่านก็คงจะทราบดีอยู่แล้ว) คำสั่ง If ที่เขียนให้ดูเลยออกมาเป็นอย่างนั้น
- TD.Connect ก็เป็นการกำหนดชื่อพาธและไฟล์ที่จะลิงค์เข้ามา เนื่องจากเราลิงค์มาจากเทเบิลต้นทางที่ชื่อเดิมเสมอ (ชื่อเดียวกันกับที่เราลิงค์มาครั้งแรก) ดังนั้นจึงไม่ต้องบอกมันอีกว่ามาจากเทเบิลชื่ออะไร
- TD.RefreshLink เพื่อให้ Access มันดึงเอาข้อมูลจำเป็นอื่นๆของเทเบิลนั้นๆจากฐานข้อมูลใหม่ แม้ว่าจะเป็นฐานข้อมูลเดิม แต่เมื่อมีการเปลี่ยนแปลงอะไรไปในโครงสร้างเทเบิลต้นทาง แม้จะเพียงเล็กน้อยก็ตาม ก็ควรจะสั่ง RefreshLink มาใหม่เสมอ
- For each TD .... ก็เป็นการวนลูป โดยกำหนด object variable TD ให้เป็นทีละเทเบิลในฐานข้อมูล
- TD.Attributes จะให้ค่าเท่ากับ dbAttachedTable เมื่อเทเบิลนั้นเป็น Linked Table ที่ลิงค์มาจากฐานข้อมูลประเภท Access ด้วยกันเอง (พวก .mdb, .mda) แต่ถ้าลิงค์มาจาก ODBC จะให้เป็นค่า dbAttachedODBC โดยปกติผมคิดว่า 99.99% เราสามารถทดสอบด้วยคำสั่ง If TD.Attributes = dbAttachedTable then ได้โดยตรง แต่เนื่องจาก .Attributes อาจมีค่าเกิดจากการรวมหลายๆ option เข้าด้วยกัน ด้วย logical OR (แต่ผมก็ไม่ทราบเหมือนกันว่ามันจะรวมกับ option อื่นอย่างไรได้บ้าง) ดังนั้นเพื่อให้แน่ใจเต็ม 100% เวลาจะทดสอบกรองเอาเพื่อดูว่ามีค่าของ dbAttachedTable อยู่ในส่วนผสมนั้นหรือไม่ ก็ต้องทดสอบด้วย logical AND (ตรงนี้คิดว่าหลายๆท่านก็คงจะทราบดีอยู่แล้ว) คำสั่ง If ที่เขียนให้ดูเลยออกมาเป็นอย่างนั้น
- TD.Connect ก็เป็นการกำหนดชื่อพาธและไฟล์ที่จะลิงค์เข้ามา เนื่องจากเราลิงค์มาจากเทเบิลต้นทางที่ชื่อเดิมเสมอ (ชื่อเดียวกันกับที่เราลิงค์มาครั้งแรก) ดังนั้นจึงไม่ต้องบอกมันอีกว่ามาจากเทเบิลชื่ออะไร
- TD.RefreshLink เพื่อให้ Access มันดึงเอาข้อมูลจำเป็นอื่นๆของเทเบิลนั้นๆจากฐานข้อมูลใหม่ แม้ว่าจะเป็นฐานข้อมูลเดิม แต่เมื่อมีการเปลี่ยนแปลงอะไรไปในโครงสร้างเทเบิลต้นทาง แม้จะเพียงเล็กน้อยก็ตาม ก็ควรจะสั่ง RefreshLink มาใหม่เสมอ
4 @R06210
อ่อ ... ส่วนวิธีการใช้ก็เอาโค้ดนี้ไปใส่ไว้ใน Module ใหม่ หรือจะ Module เดิมที่มีแล้วก็ได้ แล้วก็กด Ctrl-G เพื่อเปิด Immediate Windows แล้วคีย์คำว่า ChangeLinkedMDB กด Enter เท่านั้นเอง
อย่างไรก็ตามก๊อปปี้ฐานข้อมูลเดิมก่อนทำลิงค์ใหม่ก็จะดี เผื่อมีอะไรผิดพลาดจะได้ไม่เสียเวลามาลิงค์กลับไป
อย่างไรก็ตามก๊อปปี้ฐานข้อมูลเดิมก่อนทำลิงค์ใหม่ก็จะดี เผื่อมีอะไรผิดพลาดจะได้ไม่เสียเวลามาลิงค์กลับไป
Time: 0.3237s
Public Sub ChangeLinkedMDB()
Dim DB As DAO.Database
Dim TD As DAO.TableDef
Set DB = CurrentDb
For Each TD In DB.TableDefs
If (TD.Attributes And dbAttachedTable) = dbAttachedTable Then
TD.Connect = ";c:\...\file.mdb" ' ต้องมี semicolon อยู่ข้างหน้า
TD.RefreshLink
End If
Next TD
DB.Close : Set DB = Nothing
End Sub