如何防止旧版访问代码中的“OpenForm 操作被取消”

Posted

技术标签:

【中文标题】如何防止旧版访问代码中的“OpenForm 操作被取消”【英文标题】:How to prevent "OpenForm action was cancelled" in legacy Access Code 【发布时间】:2013-01-02 21:53:12 【问题描述】:

我最近接管了一个非常旧的 Access 数据库。该数据库有大量编写的宏,用户可以利用这些宏来帮助他们导航和输入数据。因此,尽管这些宏是用 Access 97 编写的,但放弃代码并不是第 1 步......

我已经设法通过用新的函数调用删除不推荐使用的函数调用来让大部分代码工作,但是有几个形式仍然不能正常工作。如果我能弄清楚如何解决一个问题,我相信我可以解决其他问题。

主宏有一个带有多个按钮的菜单。每当我单击一个按钮时,我都会收到“OpenForm 操作已取消”错误。该按钮的代码如下:

Option Compare Database   'Use database order for string comparisons

Private Sub Form_Open(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Me![PropBtn].Visible = True
    Else
        Me![PropBtn].Visible = False
    End If

End Sub

Private Sub Form_Unload(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        Forms![ServiceCircuit]![CircuitPrefix].Requery
        Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        Forms![ServiceCircuit]![CircuitBase].Requery
        Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If
End Sub

Private Sub GRC_GotFocus()
    Me![GRC].Requery

End Sub

Private Sub PropBtn_Click()
    DoCmd.Close

    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        DoCmd.Close
        'Forms![ServiceCircuit]![CircuitPrefix].Requery
        'Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        'Forms![ServiceCircuit]![CircuitBase].Requery
        'Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            DoCmd.Close
            'Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If

End Sub

Private Sub Tariff_NotInList(NewData As String, Response As Integer)
    dumbvar = AddRecFromCombo(NewData, "Tariff")

    '  Continue without displaying default error message.
    Response = DATA_ERRCONTINUE

End Sub

我对 VB 非常陌生,并且一直在摸索成功,但我不知道如何解决这个问题或问题可能是什么。

更新:

我在主菜单窗体中设置了一个断点。实际按钮的代码是:

Private Sub CircuitBtn_Click()
On Error GoTo Err_CircuitBtn_Click

    Dim DocName As String
    Dim LinkCriteria As String

    DocName = "Circuit"
    DoCmd.OpenForm DocName, , , LinkCriteria

Exit_CircuitBtn_Click:
    Exit Sub

Err_CircuitBtn_Click:
    MsgBox Err.description
    Resume Exit_CircuitBtn_Click

单步执行DoCmd.OpenForm DocName, , , LinkCriteria 代码运行,然后跳转到Err_CircuitBtn_Click。我不相信我可以在其他地方设置断点。不确定为什么会跳到错误,主窗体上的其他按钮以相同的方式编码(在主窗体上)。我尝试在第一块代码中设置一些断点(一旦假设弹出表单的代码),但断点从未被捕获。我猜断点永远不应该到达,因为如果我在该表单上点击一个按钮,就会执行该脚本,对吗?

【问题讨论】:

您可以使用断点和 F8 单步执行代码吗? 我同意 - 单击事件处理程序的第一行并按 F9 切换断点。然后在运行系统时,可以按 F8 逐行执行代码。它仍然会崩溃,但至少你会知道在哪里!如果仍然卡住,请发回此内容。 抱歉,对 VB 非常陌生。这样做了,编辑来了.... REM out the On Error 语句,因此您可以确切地看到错误是什么。希望它能给你一个关于失败的线索 REM?对不起,这里是极端菜鸟:/ 【参考方案1】:

“OpenForm action was cancelled”是当表单(“Circuit”)无法正确打开时出现的错误。

该代码由向导生成,“Docname”和“LinkCriteria”都是多余的。通过输入在即时窗口中尝试

`DoCmd.OpenForm "Circuit"`

【讨论】:

谢谢。我尝试了这个,但我仍然得到相同的错误(2501 或 OpenForm 操作...)这里的简化方法... 谢谢,这非常重要,表单无法正确打开 可能发生了一些问题,即存在一个没有响应的查询。一种方式打开正常形式,看到打开没有错误。【参考方案2】:

刚刚遇到同样的问题并设法解决了它。

问题是我最初通过复制另一个表单[A] 创建了表单[B]。出于这个原因,[B][A] 具有相同的recordsource(即使它不需要recordsource)。

我已将表单查询重命名为 [A and B] recordsource。我更新了[A](需要记录源的那个),但没有意识到[B] 也需要更新。

修复(对我来说)是从[B] 中删除recordsource,因为不需要绑定表单。也就是说,对其他人的修复可能是更正 recordsource 或其他他们可能在开发过程中更改的属性值。

【讨论】:

【参考方案3】:

我刚刚在访问 365 时遇到了这个问题。我将数据库设置为安装在我的客户位置。这包括删除链接的表,以便它们可以在其网络上的客户端位置重新链接。

在测试 accde 文件时,它说 OpenForm 操作已取消。挠了挠头后,我回到了制作acde的文件。我遇到了同样的问题。我以为它可能是我的定制丝带,但不是。

然后我反编译了那个文件的 VBA,希望我能得到答案,不。然后我一起消除了功能区并尝试直接打开表单。它说记录源不存在。我当时想,“哦,是的,我正看着它。”

然后我尝试打开记录源(在这种情况下为查询),它说找不到表。

当然。我删除了所有指向数据表的链接。

【讨论】:

【参考方案4】:

我猜你不再需要答案了(你问它已经有一段时间了),但我为别人写了一个解决方案:

On Error GoTo ErrorHandler

' 在此处插入可能产生错误的代码

DoCmd.OpenQuery "query_name"

退出子

错误处理程序:

' 在此处插入处理错误的代码

MsgBox "查询未运行"

继续下一步

【讨论】:

以上是关于如何防止旧版访问代码中的“OpenForm 操作被取消”的主要内容,如果未能解决你的问题,请参考以下文章

如何防止访问laravel刀片中的数据库和资源?

如何在 itunesconnect 中访问旧版应用程序的评论? [关闭]

springboot如何防止通过header的token访问

如何防止代码/程序访问 Web 应用程序?

如何防止Angularjs 1.x中的直接HTML访问?

如何防止访问 Amplify graphql 公共 API 中的某些字段