0

我们在 4D 数据库中有大量数据集。最近我们需要自动化某些任务来导出、导入或处理数据,这需要 4D 和 unix shell(bash 和 zsh)之间的一些连接。每当 4D 函数必须使用LAUNCH EXTERNAL PROCESS指令调用 shell 命令或 shell 脚本时,我们都做得很好。但是我在做相反的事情时遇到了麻烦,从 shell 脚本启动 4D 函数。在线文档没有给我任何关于如何做到这一点的建议。

如何在特定日期+时间运行 4D 函数?4D 本身似乎并没有提供一种安排行动的方法。OS X 提供了一种在未来任何时间(每周或每月)启动命令的绝佳方式。我只是不太了解 4D,无法弄清楚如何从 shell 脚本调用 4D 函数。如果是 MySQL 或 PostgreSQL,那么我没有问题,因为我可以调用mysqlpgsql客户端,它们可以在没有 GUI 的情况下工作。我可以用 4D 做类似的事情吗?

4

2 回答 2

1

有几种方法可以在 4D 中完成此任务。我通常这样做的方式是使用 4D 网络服务器。然后我会使用我喜欢的任何调度程序(cron、windows 调度程序等)通过 GET 或 POST 触发该服务。这确实需要一些来自 4D 的 Web 服务器许可。

这使您可以灵活地在给定时间或从外部流程触发事件。假设您的数据已被清理并准备好导入,您不必等到下一个导入时间,它可以被触发。

或者,您可以创建一个在自己的进程中运行的 4D 方法。您在数据库启动时启动该进程,然后它会无限循环,检查它是否需要触发您想要的任何操作。

查看New processDELAY PROCESSWhile...End While命令。您可以根据需要启动新进程以在服务器或客户端上运行。

基本上,您的 On Startup 方法会调用 New Process 来运行您的“调度程序”方法。在该方法中,您有一个 While(某些真实条件)循环,用于检查它是否应该运行。然后它会休眠(延迟过程)一段时间,这样它就不会占用资源,再次唤醒并运行循环。

如果这是您希望能够以编程方式停止的事情,您可以使用SET PROCESS VARIABLE从外部设置调度程序进程中的变量值。然后让循环检查该值以查看它是否应该退出。

于 2017-10-15T16:41:25.310 回答
1

要回答您的问题,如果您想在 Mac 上从 shell 调用 4D,您应该使用 Pluggers 的插件(cfr https://www.pluggers.nl/product/scripting-tools/)和 osascript。

于 2019-11-02T19:29:58.413 回答