【问题标题】:How to trigger VBA code in Access when underlying SQL table is updated?更新底层 SQL 表时如何在 Access 中触发 VBA 代码?
【发布时间】: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 的每种组合进行测试。也就是说,我仍然想试试这个 - 你有任何示例代码可以指点我吗?

标签: c# sql-server ms-access triggers


【解决方案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 分钟的间隔进行轮询,因为这太慢了,而且更快会出现我已经提到的相同类型的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2020-01-07
  • 2022-01-01
  • 2020-09-02
  • 2021-02-12
相关资源
最近更新 更多