กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
624 7
URL.หัวข้อ /
URL
ต้องการเปิด mdb อื่น แล้วอยากทราบว่าในนั้นมี table ชื่ออะไรบ้าง
อ.สุภาพครับ ผมอยากเปิดฐานข้อมูลที่เป็น MDB อื่นๆ แล้วให้แสดงออกมาว่า Table กี่ table และชื่ออะไรบ้าง และถ้าต่อไปพอทราบชื่อ table แล้ว ก็อยากทราบต่อไปว่าใน table นั้น มีชื่อฟิลด์ อะไรบ้าง โดยการ code ทำอย่างไรครับ?
*** Edited by Supap Chaiya ***
26/3/2546 19:43:08
7 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00976
ลองโค้ดข้างล่างดูครับ ผมจะใช้บ่อยมากในการทำโปรแกรมทุกตัว เพราะจะต้องทำคู่มือให้ผู้ใช้หรือลูกค้าเสมอ
Function DBDetails(strDB As String) As String
Dim dbs As Database, tdf As TableDef, fld As Field
Set dbs = OpenDatabase(strDB)
For Each tdf In dbs.TableDefs
Debug.Print tdf.Name
For Each fld In tdf.Fields
Debug.Print " ---> " & fld.Name & " Field Type: " & fld.Type
Next
Next
dbs.Close
Set dbs = Nothing
End Function
ตัวอย่างที่มีรายละเอียดมากกว่านี้อยู่ที่บ้านครับ เดี๋ยวผมจะไปค้นดูก่อน ซึ่งผมจะมีโค้ดสำหรับแปลง Field Type ให้อยู่ในรูปของ Text, Number, ect ด้วย พร้อมกับแสดง Caption, Description, etc.
ผมเคย d/l ตัวอย่างที่เป็น mde ของต่างประเทศมาไว้เหมือนกัน เขาจะทำไว้ค่อนข้างละเอียดมาก มีการแสดงว่าฟีลด์ไหนเป็น Index, Relationships และพิมพ์ออกมาเป็นรายงานได้ด้วย ต้องไปค้นดูที่บ้านก่อนครับ
2 @R00977
เยี่ยมมากครับ อ.สุภาพ ผมจะได้นำไปดัดแปลงเพื่อ อ่านฐานข้อมูลที่มีการใส่ password ไว้ ผมเพียงคิดเล่นๆเท่านั้นเองแหละครับ ขอบคุณมากครับ
3 @R00983
ผมเจอแหล่งที่มาของตัวอย่างที่ได้รับปากไว้ว่าจะนำมาให้แล้วครับ ให้ไปเอาที่
http://www.liquorman.net/Downloads/documentor.zip ครับ
4 @R02058
ขอบคุณมากครับ
5 @R02060
convert เป็น Version 2000 Error เยอะจัง งงไปหมด
6 @R02061
ผมได้เข้าไปแก้โค้ดสำหรับ Access 2000 ให้แล้วครับ
ส่วนที่มีปัญหาคือ DAO 3.6 เพราะจะมี Objects ไปซ้ำกับของ ADO
สำหรับท่านที่คิดจะแก้โค้ดเองให้
1. เลือก Microsoft DAO 3.6 Object Library ใน References ด้วย
2. แก้โค้ดนี้ในปุ่มที่ใช้สร้าง Report ให้เป็น
Private Sub cmdReport_Click()
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim rsFields As DAO.Recordset
Dim varTable As Variant
Dim fld As DAO.Field
Dim Cntr As Integer
Dim varProperty() As Variant
Dim idx As DAO.Index
Dim rsIndexes As DAO.Recordset
Dim CurDb As DAO.Database
Set CurDb = CurrentDb
' first need to delete all records in tblFields & tblindexes
CurDb.Execute ("delete * from tblFields")
CurDb.Execute ("delete * from tblindexes")
' now, cycle thru selected tables, and write field information to tblFields.
' Each field in tblFields is named after the FieldName in Properties collection,
' but is preceded by 'fld'. So, fldFieldType is used for the Field Type property.
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(txtDB)
Set rsFields = CurDb.OpenRecordset("select * from tblfields", dbOpenDynaset)
Set rsIndexes = CurDb.OpenRecordset("select * from tblindexes", dbOpenDynaset)
ReDim varProperty(2 To rsFields.Fields.Count - 1)
For Each varTable In lstTables.ItemsSelected
Set tbl = db.TableDefs(lstTables.ItemData(varTable))
For Each fld In tbl.Fields
rsFields.AddNew
rsFields!fldTable = lstTables.ItemData(varTable)
For Cntr = 1 To rsFields.Fields.Count - 1
On Error Resume Next
rsFields(Cntr) = fld.Properties(Mid(rsFields(Cntr).Name, 4))
Next Cntr
On Error GoTo 0
rsFields.Update
Next fld
For Each idx In tbl.Indexes
For Each fld In idx.Fields
rsIndexes.AddNew
rsIndexes!idxTable = lstTables.ItemData(varTable)
rsIndexes!idxIndex = idx.Name
rsIndexes!idxUnique = idx.Unique
rsIndexes!idxPrimary = idx.Primary
rsIndexes!idxForeign = idx.Foreign
rsIndexes!idxRequired = idx.Required
rsIndexes!idxIgnoreNulls = idx.IgnoreNulls
rsIndexes!idxField = fld.Name
rsIndexes!idxSortOrder = IIf(fld.Attributes = 0, "Ascending", "Descending")
rsIndexes.Update
Next fld
Next idx
Next varTable
DoCmd.OpenReport "rptFields", acViewPreview
End Sub
หรือจะ d/l ตัวที่ผมได้แก้ไขแล้วจากที่นี่
ส่วนที่มีปัญหาคือ DAO 3.6 เพราะจะมี Objects ไปซ้ำกับของ ADO
สำหรับท่านที่คิดจะแก้โค้ดเองให้
1. เลือก Microsoft DAO 3.6 Object Library ใน References ด้วย
2. แก้โค้ดนี้ในปุ่มที่ใช้สร้าง Report ให้เป็น
Private Sub cmdReport_Click()
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim rsFields As DAO.Recordset
Dim varTable As Variant
Dim fld As DAO.Field
Dim Cntr As Integer
Dim varProperty() As Variant
Dim idx As DAO.Index
Dim rsIndexes As DAO.Recordset
Dim CurDb As DAO.Database
Set CurDb = CurrentDb
' first need to delete all records in tblFields & tblindexes
CurDb.Execute ("delete * from tblFields")
CurDb.Execute ("delete * from tblindexes")
' now, cycle thru selected tables, and write field information to tblFields.
' Each field in tblFields is named after the FieldName in Properties collection,
' but is preceded by 'fld'. So, fldFieldType is used for the Field Type property.
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(txtDB)
Set rsFields = CurDb.OpenRecordset("select * from tblfields", dbOpenDynaset)
Set rsIndexes = CurDb.OpenRecordset("select * from tblindexes", dbOpenDynaset)
ReDim varProperty(2 To rsFields.Fields.Count - 1)
For Each varTable In lstTables.ItemsSelected
Set tbl = db.TableDefs(lstTables.ItemData(varTable))
For Each fld In tbl.Fields
rsFields.AddNew
rsFields!fldTable = lstTables.ItemData(varTable)
For Cntr = 1 To rsFields.Fields.Count - 1
On Error Resume Next
rsFields(Cntr) = fld.Properties(Mid(rsFields(Cntr).Name, 4))
Next Cntr
On Error GoTo 0
rsFields.Update
Next fld
For Each idx In tbl.Indexes
For Each fld In idx.Fields
rsIndexes.AddNew
rsIndexes!idxTable = lstTables.ItemData(varTable)
rsIndexes!idxIndex = idx.Name
rsIndexes!idxUnique = idx.Unique
rsIndexes!idxPrimary = idx.Primary
rsIndexes!idxForeign = idx.Foreign
rsIndexes!idxRequired = idx.Required
rsIndexes!idxIgnoreNulls = idx.IgnoreNulls
rsIndexes!idxField = fld.Name
rsIndexes!idxSortOrder = IIf(fld.Attributes = 0, "Ascending", "Descending")
rsIndexes.Update
Next fld
Next idx
Next varTable
DoCmd.OpenReport "rptFields", acViewPreview
End Sub
หรือจะ d/l ตัวที่ผมได้แก้ไขแล้วจากที่นี่
7 @R02077
ขอบคุณครับ
Time: 1.4448s