กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
314 2
URL.หัวข้อ /
URL
เกี่ยวกับ index ของ recordset
ขอรบกวนอาจารย์สุภาพ และท่านผู้รู้ทุกท่านช่วยแนะนำหน่อยค่ะ คือ การกำหนดคำสั่ง
recordset.Index ="ชื่อ index "
Index ที่ใช้กับ Recordset มีเงื่อนไขอะไรบ้างค่ะ ทำทีไร error บรรทัด Index ทุกที
เช่นถ้าฟิลด์ที่หาเป็น Number แบบ Long Integer จะใช้กับ Index recordset ได้ไหม
แล้วถ้าฟิลด์เป็น Primary Key จะทำ Index ได้หรือไม่ แล้วโปรแกรมจะรู้ได้อย่างไรว่าฟิลด์ใดเป็น key ถ้าตารางนั้น ๆ เรากำหนดดัชนีมากกว่า 1 ฟิลด์ค่ะ
recordset.Index ="ชื่อ index "
Index ที่ใช้กับ Recordset มีเงื่อนไขอะไรบ้างค่ะ ทำทีไร error บรรทัด Index ทุกที
เช่นถ้าฟิลด์ที่หาเป็น Number แบบ Long Integer จะใช้กับ Index recordset ได้ไหม
แล้วถ้าฟิลด์เป็น Primary Key จะทำ Index ได้หรือไม่ แล้วโปรแกรมจะรู้ได้อย่างไรว่าฟิลด์ใดเป็น key ถ้าตารางนั้น ๆ เรากำหนดดัชนีมากกว่า 1 ฟิลด์ค่ะ
2 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R05873
ขอตอบเพิ่มจาก อ.ครับ
ผมเคยหาคำตอบตรงนี้หลายครั้งเหมือนกันครับ มาเจอวิธีนี้ ใช้ได้ผลดีเหมือนกันครับ(ปัญหาที่สงสัยหายไปครับ)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Private Sub Form_Load()
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("ตาราง1")
rst.Index = "PrimaryKey"
End Sub
Private Sub คำสั่ง8_Click()
Dim Ctl As Control
rst.Seek "=", Val(txtNumID), Me.txtName.Value
If rst.NoMatch = True Then
rst.AddNew
Else
rst.Edit
End If
rst.Fields("NumID").Value = Me.txtNumID.Value
rst.Fields("Name").Value = Me.txtName.Value
rst.Fields("Bm").Value = Me.txtBm.Value
rst.Fields("Sc").Value = Me.txtSc.Value
rst.Update
'*************
For Each Ctl In Me.Form.Controls 'ทำ Text box ให้ว่าง
If Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox Then
If IsNull(Ctl) = False Then
Ctl = Null
End If
End If
Next Ctl
End Sub
ผมเคยหาคำตอบตรงนี้หลายครั้งเหมือนกันครับ มาเจอวิธีนี้ ใช้ได้ผลดีเหมือนกันครับ(ปัญหาที่สงสัยหายไปครับ)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Private Sub Form_Load()
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("ตาราง1")
rst.Index = "PrimaryKey"
End Sub
Private Sub คำสั่ง8_Click()
Dim Ctl As Control
rst.Seek "=", Val(txtNumID), Me.txtName.Value
If rst.NoMatch = True Then
rst.AddNew
Else
rst.Edit
End If
rst.Fields("NumID").Value = Me.txtNumID.Value
rst.Fields("Name").Value = Me.txtName.Value
rst.Fields("Bm").Value = Me.txtBm.Value
rst.Fields("Sc").Value = Me.txtSc.Value
rst.Update
'*************
For Each Ctl In Me.Form.Controls 'ทำ Text box ให้ว่าง
If Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox Then
If IsNull(Ctl) = False Then
Ctl = Null
End If
End If
Next Ctl
End Sub
Time: 0.1493s
ทุกฟีลด์กำหนดเป็น index ได้หมดครับ
ถ้าฟีลด์ไหนถูกเลือกเป็น primary key มันจะทำ index ให้โดยอัตโนมัติ
ส่วนฟีลด์ที่เชื่อมแบบเป็น foreign key (ฟีลด์ที่ใช้เชื่อมด้านที่เป็น manay) มันก็จะสร้าง index ให้ด้วยเช่นกัน
ถ้าเราทำ index แยกกันกับหลายๆ ฟีลด์ใน 1 ตาราง เราก็ต้องระบุว่าจะใช้ index ตัวไหน เพราะ index แต่ละตัวจะมีชื่อของมันเอง
ถ้าอยากรู้ว่าในตารางเป้าหมาย ได้สร้าง index ไว้กี่ตัวบ้าง ให้ลองดูโค้ดนี้ครับ ผมเอามาจาก Help ของ Access เอง
Sub IndexPropertyX()
Dim dbsNorthwind As Database
Dim tdfEmployees As TableDef
Dim rstEmployees As Recordset
Dim idxLoop As Index
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
Set rstEmployees = _
dbsNorthwind.OpenRecordset("Employees")
Set tdfEmployees = dbsNorthwind.TableDefs!Employees
With rstEmployees
' Enumerate Indexes collection of Employees table.
For Each idxLoop In tdfEmployees.Indexes
.Index = idxLoop.Name
Debug.Print "Index = " & .Index
Debug.Print " EmployeeID - PostalCode - Name"
.MoveFirst
' Enumerate Recordset to show the order of records.
Do While Not .EOF
Debug.Print " " & !EmployeeID & " - " & _
!PostalCode & " - " & !FirstName & " " & _
!LastName
.MoveNext
Loop
Next idxLoop
.Close
End With
dbsNorthwind.Close
End Sub