【问题标题】:Display multiple specific records in a report在报告中显示多条特定记录
【发布时间】:2015-05-14 21:48:17
【问题描述】:

假设我有一个名为“客户”的表。它包含 2 个字段:

Name
Address

我希望用户能够通过选择他们的姓名来选择多条记录。例如,有一个包含数据库中所有记录名称的列表框。我希望用户能够选择多个项目,例如:

Dave Richardson
Bob Smith
Sophie Parker

然后只在报告中显示具有这些名称的记录。

【问题讨论】:

  • 您可能需要 VBA 来执行此操作。你愿意吗?
  • 是的,我预计它需要 VBA。这对我来说很好。不幸的是,这是我的数据库的要求,Google 并没有提供太多帮助。

标签: ms-access vba report ms-access-2013


【解决方案1】:

我的设置是一个带有子表单和列表框的表单,列表框将包含您所有客户的姓名。所以 RowSource 会是,

SELECT 
    customerNameFieldName
FROM
    yourTableName;

Multi Select 属性将设置为 Extended。然后一个按钮将包含以下代码,该代码将为 SubForm 的记录源生成 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。

【讨论】:

  • 还记得将列表框设置为简单或扩展的多选属性。
  • 看起来很有希望,我尝试使其适应我的情况,但没有成功。我有一个包含名称的多选列表框的表单,但按钮必须打开报告。有问题的报告已经存在,这基本上只是一个可选功能。我如何将其应用于我的情况?非常感谢
  • 报告所基于的查询的名称是什么?
  • 查询名称为“Summary 3 Q1”
【解决方案2】:

您可以根据需要使用DoCmd.OpenReport MethodWhereCondition 选项过滤您的报告。

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 的回答有共同之处。事实上,我复制了他的代码并对其进行了修改。主要区别在于此方法不需要您修改已保存的查询来过滤报告。

【讨论】:

  • 汉斯,我无法理解在 OpenReport 方法中使用 IN 子句,所以我修改 Query 的策略,我一开始就想到了。嗯,学到了新的一课。谢谢(+1)
  • 不客气,PF。我感谢你的贡献,很高兴你发现这个有用。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多