在报表中显示多个特定记录
Display multiple specific records in a report
假设我有一个名为 "Customers" 的 table。它包含 2 个字段:
Name
Address
我希望用户能够通过 select 输入他们的名字来 select 多条记录。例如,有一个包含数据库中所有记录名称的列表框。我希望用户能够 select 多个项目,例如:
Dave Richardson
Bob Smith
Sophie Parker
然后在报表中只显示这些名称的记录。
我的设置是,一个带有子窗体和一个列表框的窗体,列表框将包含所有客户的名称。所以 RowSource 将是,
SELECT
customerNameFieldName
FROM
yourTableName;
Multi Select
属性 将设置为 Extended
。然后一个按钮将具有以下代码,该代码将为子窗体的记录源生成 SQL。
Private Sub buttonName_Click()
Dim lItem As Varaint, strSQL As String
Dim custNames As String, whereStr As String
Dim dbObj As dao.Database
Dim tmpQryDef As QueryDef
Set dbObj = CurrentDb()
For Each lItem In Me.yourListBoxName.ItemsSelected
custNames = custNames & "'" & Me.yourListBoxName.ItemData(lItem) & "', "
Next
Id Len(custNames) <> 0 Then
custNames = Left(custNames, Len(custNames) - 2)
whereStr = "WHERE customerNameFieldName IN (" & custNames & ")"
End If
strSQL = "SELECT someFields FROM someTable " & whereStr
Set tmpQryDef = dbObj.QueryDefs("Summary 3 Q1")
tmpQryDef.SQL = strSQL
DoCmd.OpenReport "yourReportName", acViewNormal
Set dbObj = Nothing
Set tmpQryDef = Nothing
End Sub
现在 SubForm 将具有基于您在 ListBox 中选择的所有信息的 RecordSource。
您可以使用 DoCmd.OpenReport Method 的 WhereCondition 选项根据需要过滤报告。
Const cstrReport As String = "YourReportNameHere"
Dim custNames As String
Dim lItem As Variant
Dim strWhereCondition As String
With Me.yourListBoxName
For Each lItem In .ItemsSelected
custNames = custNames & ",'" & Replace(.ItemData(lItem), "'", "''") & "'"
Next
End With
If Len(custNames) > 0 Then
custNames = Mid(custNames, 2)
strWhereCondition = "[Name] IN (" & custNames & ")"
End If
DoCmd.OpenReport ReportName:=cstrReport, View:=acViewPreview, _
WhereCondition:=strWhereCondition
请注意,此方法与 PaulFrancis 的答案有共同之处。事实上,我复制了他的代码并进行了修改。主要区别在于此方法不需要您修改已保存的查询来过滤报告。
假设我有一个名为 "Customers" 的 table。它包含 2 个字段:
Name
Address
我希望用户能够通过 select 输入他们的名字来 select 多条记录。例如,有一个包含数据库中所有记录名称的列表框。我希望用户能够 select 多个项目,例如:
Dave Richardson
Bob Smith
Sophie Parker
然后在报表中只显示这些名称的记录。
我的设置是,一个带有子窗体和一个列表框的窗体,列表框将包含所有客户的名称。所以 RowSource 将是,
SELECT
customerNameFieldName
FROM
yourTableName;
Multi Select
属性 将设置为 Extended
。然后一个按钮将具有以下代码,该代码将为子窗体的记录源生成 SQL。
Private Sub buttonName_Click()
Dim lItem As Varaint, strSQL As String
Dim custNames As String, whereStr As String
Dim dbObj As dao.Database
Dim tmpQryDef As QueryDef
Set dbObj = CurrentDb()
For Each lItem In Me.yourListBoxName.ItemsSelected
custNames = custNames & "'" & Me.yourListBoxName.ItemData(lItem) & "', "
Next
Id Len(custNames) <> 0 Then
custNames = Left(custNames, Len(custNames) - 2)
whereStr = "WHERE customerNameFieldName IN (" & custNames & ")"
End If
strSQL = "SELECT someFields FROM someTable " & whereStr
Set tmpQryDef = dbObj.QueryDefs("Summary 3 Q1")
tmpQryDef.SQL = strSQL
DoCmd.OpenReport "yourReportName", acViewNormal
Set dbObj = Nothing
Set tmpQryDef = Nothing
End Sub
现在 SubForm 将具有基于您在 ListBox 中选择的所有信息的 RecordSource。
您可以使用 DoCmd.OpenReport Method 的 WhereCondition 选项根据需要过滤报告。
Const cstrReport As String = "YourReportNameHere"
Dim custNames As String
Dim lItem As Variant
Dim strWhereCondition As String
With Me.yourListBoxName
For Each lItem In .ItemsSelected
custNames = custNames & ",'" & Replace(.ItemData(lItem), "'", "''") & "'"
Next
End With
If Len(custNames) > 0 Then
custNames = Mid(custNames, 2)
strWhereCondition = "[Name] IN (" & custNames & ")"
End If
DoCmd.OpenReport ReportName:=cstrReport, View:=acViewPreview, _
WhereCondition:=strWhereCondition
请注意,此方法与 PaulFrancis 的答案有共同之处。事实上,我复制了他的代码并进行了修改。主要区别在于此方法不需要您修改已保存的查询来过滤报告。