【问题标题】:Access DoCmd.OpenReport loop to generate PDFs not properly picking up RecordSet data访问 DoCmd.OpenReport 循环以生成未正确拾取 RecordSet 数据的 PDF
【发布时间】:2020-05-15 08:53:43
【问题描述】:

我有一个 Access 数据库,用于跟踪特定类型帐户持有人的交易。每个帐户持有人都有一个指定的 ID 号。我有一个查询,列出了数据库中帐户持有人的所有 ID 号。我还有一份报告,显示特定账户持有人的交易数据。每周我的一个同事必须为每个帐户持有人手动运行报告(总共大约 80 个)并导出为 PDF,然后通过电子邮件发送给每个帐户持有人。

列出所有账户 ID 号的查询是一个选择查询“qryIDdropdown”,它显示两个字段(列):ID 号和账户持有人姓名。用于生成 PDF 的报告称为“IDReport”。打开报告时,会出现一个输入参数值框,用户在其中输入 ID 号。

我正在尝试执行一个简单的循环,该循环从查询“qryIDdropdown”中获取每个唯一 ID 号并将其输入到报告中,然后另存为 PDF 并循环到下一个 ID 号。

我对 VBA 还是比较陌生,无法弄清楚为什么我的代码不起作用。当我运行它时,它会以正确的名称和正确的位置保存 PDF 文件,但它只是相同 ID 号报告的副本。这是我的代码:

Sub pdfcreate()
Dim db As DAO.Database 
Dim rs As DAO.Recordset
Dim MyFileName As String
Dim mypath As String
Dim temp as String

mypath = "H:\TITLE_DEV\"

Set db = CurrentDb()

Set rs = db.OpenRecordset("SELECT DISTINCT [ID Number] FROM [qryIDdropdown]")
rs.MoveFirst

Do Until rs.EOF

    temp = rs("ID Number")
    MyFileName = rs("ID Number") & ".PDF"

    DoCmd.OpenReport "IDReport", acViewReport, "ID Number = '" & temp & "'"

    DoCmd.OutputTo acOutputReport, "", acFormatPDF, mypath & MyFileName
    DoCmd.Close acReport, "IDReport"
    DoEvents

    rs.MoveNext
Loop


rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

当我单步执行时,我可以看到我的 temp 字符串等于正确的(每个循环唯一)ID 号,但运行报告时就好像每次都输入了相同的 ID 号.

感谢任何帮助!

【问题讨论】:

  • id 是数字还是文本?
  • id 是数字
  • 我不认为你需要''s then in the id number =
  • 我删除了撇号,所以它现在显示为DoCmd.OpenReport "IDReport", acViewReport, "ID Number = " & temp,它仍然在做同样的事情
  • 我在这个线程上找到了一个可行的解决方案:stackoverflow.com/questions/32641551/…

标签: vba loops ms-access


【解决方案1】:

如果您手动启动报表,您会收到任何输入提示吗?你不应该也不希望这种情况发生。

您的代码看起来不错,但“where”子句是 OpenReport 的第三个参数。所以你应该有这个:

 DoCmd.OpenReport "IDReport", acViewReport,, "ID Number = '" & temp & "'"

另外,列名中的空格是一个非常糟糕的不不!所以,上面需要是这样的:

DoCmd.OpenReport "IDReport", acViewReport,, "[ID Number] = '" & temp & "'"

所以,任何带有空格的列都需要用 [] 包围,否则称为 ORDER BY 的列???? - 这是一个 sql order by 子句,还是一个列名? SQL 无法确定空格后面的内容是附加的 SQL 命令,甚至是列名 - 所以在任何带有空格的列周围使用 []。

下一个?

[ID Number] 列是文本数据类型,还是实际的 NUMBER 列?如果它是一个实际的数字列,则不要用 ' 或 "(单引号或双引号)将条件括起来。

因此,将条件更改为“where”子句 - 不要使用过滤器选项。 在任何带有空格的列周围添加 [] - 这适用于地球上每个 SQL 变体附近的该死。

因此,请检查 ID 编号是文本还是实际数字列 - 如果是真实数字数据类型,则删除代码以将值括起来而不带引号。 例如:

DoCmd.OpenReport "IDReport", acViewReport,, "[ID Number] = " & temp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2020-03-30
    • 1970-01-01
    • 2018-09-27
    • 2016-08-13
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多