【问题标题】:MS Access Report - Modify RecordSource with VBA Using Parameter from Main FormMS Access 报告 - 使用主窗体中的参数使用 VBA 修改 RecordSource
【发布时间】:2018-11-20 20:11:15
【问题描述】:

我没有意识到我最初的帖子(我已删除)是在一个新手帐户下发布的 - 抱歉......

无论如何,这是我的问题:

我有一个列出各种“顾问”的主表单。此主窗体还具有可用于过滤列表的参数“顾问类型”“开始日期”和“结束日期”。

需要一份报告,列出某种类型的“顾问”。请记住,此“类型”过滤器可以应用于 4 个不同类型字段中的任何一个(“type1”、“type2”、“type3”、“type4”)。

想要做的是将运行报告的按钮放在主窗体上,因为“顾问类型”参数已经存在。然后,我想根据该参数(以及我已经完成的日期参数)生成 SQL,并使用该记录集来填充报告。

SQL 工作正常,但是结果数据没有传递到报告中,所以我得到了所有 记录,而不仅仅是我想要的记录。报表对象的记录源设置为背景表,以便填充字段/文本框。

这是代码

在主窗体上

Private Sub Button_Click()
Dim s As String
If IsNull(Me.Type.Value) Then
        MsgBox "Please Select a Type", vbCritical, "Report Error"
    Else
        s = "Select Consultant.* from Consultant "
        s = s & "Where ((consultant.typeone = '" & Me.Type.Value & "') OR (Consultant.typetwo = '" & Me.Type.Value & "') OR (Consultant.typethree = '" & Me.Type.Value & "') OR (Consultant.typefour = '" & Me.Type.Value & "'))"
        s = s & "And (((Consultant.[End date]) <= DateAdd(""d"", -730, Now()))) ORDER BY Consultant.Last_Name"
        DoCmd.OpenReport "RptList", acViewPreview, , , acDialog
    End If

结束子

现在,很明显,当我打开报告时,这一切都结束了,因为 DoCmd 中没有任何内容显示“使用此记录集”。这就是我的问题。

我试图避免创建一个单独的小下拉表单来填充我面前的一段数据。此外,使用 Forms![MainForm]![Type].Value 将 SQL 直接插入报表的记录源。“类型”变量的值不起作用。我怀疑这可能与单击报告按钮时表单未处于活动状态有关?

我认为 QueryDef 可能会起作用。但是,我没有掌握如何实现它,以便知道它是否会起作用。而且我一直在谷歌搜索......

我不知道我错过了什么。帮助!

【问题讨论】:

  • 查看 DoCmd.OpenReport 在线文档。有一个用于指定 WHERE 子句的参数(没有“WHERE”)。它需要一个字符串值,您可以传递与代码中显示的相同的条件。
  • 我尝试了 Where 条件。它没有用。 Where 子句将查找 1 个条件,而不是整个 sql 语句。在我的尝试中,我尝试了 Me.Recordsource = s。空白报告。

标签: ms-access vba ms-access-reports


【解决方案1】:

AS C Perkins 建议在 docmd.Openreport 中使用 wherecondition

类似

    DoCmd.OpenReport "RptList", acViewPreview, , , acDialog, wherecondition:="consultant.typeone = "  & Me.Type.Value

另一种方法是您可以使用 Query def 创建对象,并使用它在运行时根据用户选择的条件更改您的查询。

这样试试

将 Report_Query 保存在 MsAccess 中,并将此查询用作报告的记录源

Dim s as string

 s = "Select Consultant.* from Consultant "
 s = s & "Where ((consultant.typeone = '" & Me.Type.Value & "') OR (Consultant.typetwo = '" & Me.Type.Value & "') OR (Consultant.typethree = '" & Me.Type.Value & "') OR (Consultant.typefour = '" & Me.Type.Value & "'))"
 s = s & "And (((Consultant.[End date]) <= DateAdd(""d"", -730, Now()))) ORDER BY Consultant.Last_Name"

CurrentDb.QueryDefs("Report_Query").sql = s

DoCmd.OpenReport "RptList", acViewPreview, , , acDialog

【讨论】:

  • 这就是我要找的!你的第二个。我现在就试试!
  • 是的! QueryDefs 是我无法想象的!考虑到我评论中的原因,Where 条件不会起作用,另外,请注意,在我的原始帖子中,“类型”是 4 个不同字段的 OR。那和日期代码使 Where 子句不可行。我需要报告来打开整个记录集。谢谢你! QueryDefs 是我一直在寻找的,但我就是不知道如何实现它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多