您关心还是需要临时表?
您可以从“网格”(连续形式)中选择行,而无需复选框列。
因此,我们构建了一个“集合”来跟踪所选行的表单代码。
代码如下所示:
Option Compare Database
Option Explicit
Public CheckItems As New Collection
Public Function MySel(vID As Variant) As Boolean
If IsNull(vID) Then
MySel = False
Exit Function
End If
' check if id exists in colleciton.
On Error Resume Next
Dim mydummy As Variant
mydummy = CheckItems(CStr(vID))
If Err.Number = 0 Then
' found it, return true!!
MySel = True
Exit Function
End If
MySel = False
End Function
Private Sub cmdCheck_Click()
' check in our list
If MySel(Me!ID) Then
' already in list - remove
CheckItems.Remove CStr(Me!ID)
Else
' not in the list - add it
CheckItems.Add Me!ID.Value, CStr(Me!ID)
End If
Me.ckSel.Requery
End Sub
所以,这里的“技巧”是我们将复选框绑定到 MySel 函数。因为复选框现在绑定到那个函数,所以我们不能点击那个复选框。
所以,复选框现在是这样绑定的:
因此,SelChk 函数将传递给定行的 PK。
现在,要选中/取消选中,我们在复选框的顶部放置一个按钮(不可见)。
像这样:
不要忘记将此按钮放在前面 - 我们确保它位于复选框的顶部。
因此:
所以,将以上所有内容放在一起,我们就有了:
当然,我们现在需要一个最终按钮来进行选择,我们可以运行报告,甚至处理记录。代码可以是这样的:
Dim strWhere As String
Dim v As Variant
For Each v In CheckItems
If strWhere <> "" Then strWhere = strWhere & ","
strWhere = strWhere & v
Next
' 根据选择打开报告
DoCmd.OpenReport "rptHotelsInvoice", acViewPreview, , "ID IN (" & strWhere & ")"
或者,我们可以在代码中处理记录,这样说:
Dim strWhere As String
Dim v As Variant
For Each v In CheckItems
If strWhere <> "" Then strWhere = strWhere & ","
strWhere = strWhere & v
Next
Dim strSQL As String
strSQL = "SELECT * from tblHotels where ID IN (" & strWhere & ")"
Debug.Print strSQL
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset(strSQL)
Do While rst.EOF = False
' process reocrds
rst.Edit
rst("FirstName") = rst("FirstName") & "z"
rst.Edit
rst("FirstName") = rst("FirstName") & "z"
rst.Update
rst.MoveNext
Loop
rst.Close
现在,我们假设 PK 有一个“ID”,但如果您的 pk id 不同,则更改此:
MySql([ID]) to whatever your PK row ID is. the rest of the code should work as is.
上面创建 WHERE 子句的最后一段代码也将被更改。
所以,总而言之?
您确实不需要临时表,使用上述自定义集合和驱动复选框的函数意味着您不需要额外的表。
上面的美景?
您可以将其用于链接的 Excel 工作表、SharePoint 表、SQL 服务器表 - 没关系,因为我们不会弄乱或处理额外的表。