访问:取消报告生成导致错误 2501
Posted
技术标签:
【中文标题】访问:取消报告生成导致错误 2501【英文标题】:Access: Canceling Report generation causes error 2501 【发布时间】:2009-09-29 12:26:36 【问题描述】:不敢相信我在这件事上浪费了这么多时间。
我有一个订单,当我点击一个按钮“报告”时,一个对话框 弹出窗口,其中包含可供选择的不同报告列表。双击选择 并开始记者报道。
在其中一份报告中,有一个未绑定的文本框,我需要用户输入数据。 此字段的 ControlSource 设置为其 Name 属性。 报告启动时,会出现一个输入框,其中包含一个确定和一个取消按钮。每当我输入一些数据时,一切都很好。
但是当我点击取消时,应用程序崩溃并且我收到一条错误消息: “运行时错误 2501:操作 OpenReport 已被取消”(翻译自德语)。
通过此代码调用报告:
DoCmd.OpenReport vBerichtName, nAnsicht
End If
On Error Resume Next
DoCmd.Close acForm, "F_BerichtDrucken"
On Error GoTo 0
1) 为什么错误处理没有启动? 2)我用谷歌搜索并找到了很多奇怪的解决方案,比如微软官方说你需要安装/更新打印机驱动程序(来吧......)。没有任何帮助。
我正在为一个朋友做这件事,我通常在 linux/php、java 等方面工作。如果解决方案有点明显或类似的事情,我深表歉意。
【问题讨论】:
【参考方案1】:菲利普的回答同上。你没有给我们整个程序,但你需要做这样的事情......
Sub MyButton_Click
On Error Goto myError
DoCmd.OpenReport vBerichtName, nAnsicht
MyExit:
Exit Sub
MyError:
If Err.number = 2501 then goto myExit
msgbox err.description
goto myExit
End Sub
这是一个常见错误,但您可以像其他任何错误一样捕获它,如果是 2501,则忽略它。 赛斯
【讨论】:
好的,谢谢,我更进一步了。现在看起来像这样: On Error GoTo CancelError If Not IsNull(vFilter) Then DoCmd.OpenReport vBerichtName, nAnsicht, , vFilter Else DoCmd.OpenReport vBerichtName, nAnsicht End If Echo True CancelError: Exit Function
(嘿嘿,我正在编辑别人的代码,我是 VB 的初学者,请考虑 ;) 现在它实际上可以工作了,但是当我点击取消时,我又回到了对话框 - 但应用程序挂起....需要重新启动 Access能够继续!
对于 cmets 中丑陋的代码格式感到抱歉,需要了解如何做到这一点;)
是的 - 任何时候使用 DoCmd.OpenReport 都必须捕获该错误【参考方案2】:
错误可能来自 DoCmd.OpenReport 行。这就是错误处理程序不起作用的原因。
我猜你要求的值在报告中是强制性的。您是否尝试将错误管理行放在 docmd.openReport 之前?
【讨论】:
【参考方案3】:检查您的默认打印机。我遇到了同样的错误,我的所有代码都正常工作。使用计算机的人将默认打印机设置为标签打印机。不知何故,Access 正在检查打印机并知道它没有正确的打印尺寸设置,因此它停止了报告的显示。
我将默认打印机更改为另一台全尺寸纸张打印机,它工作正常。
我希望这对某人有所帮助,因为当它第一次发生时我不知所措。
【讨论】:
【参考方案4】:好的,现在可以使用了。
根据你的建议,我把代码写成这样:
On Error GoTo CancelError
If Not IsNull(vFilter) Then
DoCmd.OpenReport vBerichtName, nAnsicht, , vFilter
Else
DoCmd.OpenReport vBerichtName, nAnsicht
End If
CancelError:
DoCmd.Close acReport, vBerichtName
DoCmd.Close acForm, "F_BerichtDrucken"
Echo True ' this did the trick
Exit Function
只要我将 Echo True 放入错误处理中,它就可以工作了 现在顺利,回到以前的形式并允许 继续工作 - 看起来“Echo”是一种让屏幕焕然一新的感觉...?
【讨论】:
是的......回声是一种痛苦。必须非常小心地使用它。赛斯 fablife...另一件事...而不是执行 if 块,您可以执行类似的操作...Docmd.OpenReport vBerichtName, nAnsicht,,NZ(vFilter,vbnNullString).. .that 会将 null 转换为 '' 这将被视为“显示所有记录” 最后一件事...ECHO False 防止屏幕刷新...所以当我说您必须小心时,我的意思是您必须绝对确保在某些时候将 Echo 设置为 True。如果你的代码或宏正在做很多会导致屏幕跳跃和闪烁等的事情,你应该只使用 Echo。 应该是 DoCmd.Echo。此外,您不需要测试您的过滤器 - 只需将变量传递给它。如果里面什么都没有,它就什么也做不了。不过,一般来说,习惯上将过滤器传递给字符串变量,而不是变体。应该避免函数参数的变体,除非您知道需要传递 Null(例如您在查询的每一行中调用的函数,其中输入字段可能为 Null),或者您确实具有可变数据类型。在这种情况下,字符串对我来说似乎更可取。以上是关于访问:取消报告生成导致错误 2501的主要内容,如果未能解决你的问题,请参考以下文章