【问题标题】:Access OpenReport not working with Where condtion访问 OpenReport 不适用于 Where 条件
【发布时间】:2016-01-22 14:33:09
【问题描述】:

这一定是一个非常简单的错误。我只是看不到它。 我的 Where 字符串:

strWhere = "tbl_final.[Geschäftspartner] = " & Chr(34) & BP & Chr(34)

应该放在这里:

DoCmd.OpenReport "Contribution", acViewPreview, , strWhere

结果是报告打开...但包含所有记录。很长一段时间以来,我一直在玩弄不同版本的 SQL 字符串,甚至将参数引入底层查询(我知道这不是解决方案)。

我没看到什么?

更新: 底层查询是直接嵌入在报告 RecordSource 属性中的 SQL 语句

更新2: 如果我创建一个仅包含字段Geschäftspartner 和一个指标字段的全新报告,那么代码将起作用。因此,错误一定是由报告中的某些内容引起的。

UPDATE3:链接到报告的完整查询

SELECT tbl_final.Geschäftspartner, tbl_final.Referenzwährung,    tbl_final.Periodenbeginn, tbl_final.Periodenende, tbl_final.Anlagekategorie,   tbl_final.[Produkt / ISIN], tbl_final.ISIN, tbl_final.[Telekurs Valorennummer],   tbl_final.[Asset Domicile], tbl_final.[Valor name], tbl_final.[FIRE: Kontonummer], tbl_final.[Special Fund Category], tbl_final.[FRS: Type of Collateral], tbl_final.[Nominal Currency], tbl_final.[Asset Type], tbl_final.[Anteile per Periodenende], tbl_final.[Marktwert per Periodenende], tbl_final.[Durchschn# Marktwert  in Referenzwährung], tbl_final.[Durchschnittlicher Anteil in %], tbl_final.[AVA_TER in %], tbl_final.[AVA_TER Datum], tbl_final.[VDF_TER in %], tbl_final.[VDF_TER Datum], tbl_final.[TER in %], tbl_final.[TER Datum], tbl_final.[Gewichtete TER in %], tbl_final.[TER in Referenzwährung], tbl_final.Client, tbl_final.CRM, tbl_final.[Received TER-Report for 2014], tbl_final.Language
FROM tbl_final;

【问题讨论】:

  • 你没有给我们太多的工作。 BP 是什么?底层查询 SQL 是什么?见minimal reproducible example
  • 我已经提供了尽可能多的信息,并且我认为这些信息是相关的......此外,没有上传数据库(由于补偿政策,我不能这样做。),这是一个相当困难的问题,以您可以重现的方式来描述......毕竟,我的主要问题是我没有收到错误消息。
  • “基础查询是直接嵌入在报告 RecordSource 属性中的 SQL 语句” - 您可以提供此 SQL 语句。
  • @Andre 你说得对,我应该提供更多信息......我犹豫了,因为我认为我知道问题出在哪里。如果我提供了 SQL 语句和我的 VBA 代码,你们可能已经能够用一双“鹰眼”提供帮助。我将在下面发布解决方案。

标签: sql ms-access vba ms-access-2010


【解决方案1】:

在完成 SQL 语句并确保它在虚拟表、虚拟查询和虚拟报告上正常工作后,我最终回到了我的 VBA 代码。

我发现了问题:

在使用 Where 条件打开报表之前,我编写了代码以编程方式更改报表上的标签。我有以下几行代码:

DoCmd.OpenReport REPORT_NAME, acDesign
Set rptObject = Reports(REPORT_NAME)

'Various other objects being changed here but edited out for readability
'...
rptObject.OLEUnbound86.Visible = True

DoCmd.Close acForm, REPORT_NAME, acSaveYes

在最后一行,我没有关闭 REPORT,而是关闭了 FORM。一个不存在的。不幸的是,Access 从来没有提醒过我这个事实!因此,报表保持打开状态,当我尝试传递 Where 条件时,它没有将其应用于报表(可能是因为对象仍然处于打开状态)。

解决方案是将最后一行简单地更改为:

DoCmd.Close acReport, REPORT_NAME, acSaveYes

【讨论】:

  • @Gustav 感谢您帮助解决这个问题!
  • 哦,有趣的是,这是一个隐藏得非常好的错误。 :) 我不知道如果对象未打开,DoCmd.Close ac..., "foobar" 不会引发运行时错误。
  • @Andre 也谢谢你......你是对的。我应该发布更多代码! :-)
  • 我了解到 DoCmd.Close acForm 命令不会验证正在关闭的对象是否存在.....嗯.. 这很公平,但肯定是一个错误。感谢分享。
【解决方案2】:

使用Debug.Print查看您的strWhere,您就会看到。

或者试试这个修改 - 一个数字:

strWhere = "[Geschäftspartner] = " & BP & ""

【讨论】:

  • 我已经在即时窗口中查看了它...看起来不错:tbl_final.[Geschäftspartner] = "#######"
  • 我必须#### 实际数字,因为它是保密的
  • 顺便说一句...我用你的变体试过了,但没有用。我试过使用 " 和 ' 以及 Chr(34)... 对结果没有任何影响
  • BP 是一个字符串,在表格中保存为字符串,在变量中也保存为字符串...我在即时窗口中使用?typename(BP)检查了
  • 您的代码在打开报告时可能会影响过滤器?
猜你喜欢
  • 1970-01-01
  • 2015-02-19
  • 2015-09-26
  • 2022-01-05
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多