更新底层 SQL 表时如何在 Access 中触发 VBA 代码?

Posted

技术标签:

【中文标题】更新底层 SQL 表时如何在 Access 中触发 VBA 代码?【英文标题】:How to trigger VBA code in Access when underlying SQL table is updated? 【发布时间】:2020-10-08 14:30:11 【问题描述】:

背景

我们有一个旧的 MS Access 应用程序,它使用 MS SQL 表作为后端,并根据用户操作按需打印报告(产品标签)。这按预期工作,我们不希望更改这部分。

我有一个新的独立(C# Windows 窗体)应用程序在另一台 PC 上运行,它执行一些几乎不相关的操作,但要求用户在进程结束时打印上述标签。

问题

不是让用户切换到另一台 PC 上的旧版 Access 应用程序(可能位于不同的位置),当从独立 C# 更新数据时,如何触发运行报告的 Access VBA申请?

一种方法

我在想我可以创建一个表RequestedLabels,其中包含LabelIdPrinterId 列。独立应用会插入一行来请求标签,而 MS Access 应用会每隔一小段时间查询该表,以查看是否有任何新标签要为此实例打印。

但是,我不喜欢这种方法的几点:

标签应在请求后立即打印,因此我的查询间隔必须非常小(最多 1-2 秒)。即使在 2 秒时,延迟也会令人讨厌。在较高的速率下,我怀疑这可能会干扰 MS Access 应用程序的响应能力。

这一次将在 10-20 台机器上运行,因此对 SQL 服务器的查询数约为 20/秒或更多。

用户每隔几分钟才打印一次标签,因此执行此操作所需的大部分处理/网络容量都被浪费了。

更好的方法

我希望通过某种方式让基础数据的更改触发 MS Access 中的表单事件,或者触发一些可以按需打印标签的 VBA 函数。

注意事项

这些计算机跨越由严格的防火墙分隔的两个子网,并在域内外运行混合操作系统。由于设置不统一,PC 之间的 RPC 在过去被证明是棘手的。

我更喜欢依赖于更新 SQL 服务器上的数据的解决方案,或者 C# 和 MS Access 应用程序都可以利用的其他一些 MS SQL 功能。

更新:

由于有两次投票结束,我已经改进了措辞,以便更清楚地关注底层数据更改时触发 VBA。

【问题讨论】:

您可以只使用 COM 让您的独立应用程序在 Access 应用程序上自动执行操作(例如,使用 Application.Run 触发一些 VBA 代码)。似乎比轮询我的变化要好得多。 @ErikA 由于操作系统、域与独立 PC 的广泛混合以及 PC 之间的严格防火墙,我们对 PowerShell 远程处理的结果好坏参半。此外,我必须对触发 PC 和打印机 PC 的每种组合进行测试。也就是说,我仍然想试试这个 - 你有任何示例代码可以指点我吗? 【参考方案1】:

您可以在 MS Access 中构建宏以将报告发送到打印机。该报告应该已经包含您要打印的数据。

假设您的宏名称是mcrPrintReport

然后您可以从命令行执行 MS Access 以打开 Access DB 文件并运行宏,如下所示:

PathToAccessExe PathToAccessFile /x MacroName

C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE C:\AccessDB.accdb /x mcrPrintReport

然后,您可以使用专用 PC 上的任务计划程序将其安排为每隔 5 分钟运行一次。

另请参阅此相关问题:Running Macro from .bat with another Access db open

【讨论】:

我认为远程调用和 EXE 对我不起作用(我已经更新了问题以解释原因)但如果确实如此,我将如何通过所需的 labelIdprinterId到宏?我无法以 5 分钟的间隔进行轮询,因为这太慢了,而且更快会出现我已经提到的相同类型的问题。

以上是关于更新底层 SQL 表时如何在 Access 中触发 VBA 代码?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 上的更新类型

更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')

如何查看 Access 中按钮触发的 SQL 查询?

尝试连接到 SQL 表时,MS Access 2007 中的查询错误

如何将一个触发器写入 SQL Server 2008 的所有表

请问,在ACCESS中如何创建触发器?