更新底层 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
,其中包含LabelId
、PrinterId
列。独立应用会插入一行来请求标签,而 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 对我不起作用(我已经更新了问题以解释原因)但如果确实如此,我将如何通过所需的labelId
和 printerId
到宏?我无法以 5 分钟的间隔进行轮询,因为这太慢了,而且更快会出现我已经提到的相同类型的问题。以上是关于更新底层 SQL 表时如何在 Access 中触发 VBA 代码?的主要内容,如果未能解决你的问题,请参考以下文章
更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')
尝试连接到 SQL 表时,MS Access 2007 中的查询错误