如何在现有 table 的情况下有条件地编译?

How to conditionally compile in case of an existing table?

我正在使用 Progress-4GL,11.6 版,appBuilder 和程序编辑器。

我刚刚创建了一个名为“table_X”的 table,我在代码中使用它,类似于:

FIND table_X ...

但是,我的程序是通用的,但是table是基于自定义的(有些客户有这个table,有些没有)。

所以,我想添加一个“预处理器”,例如:

&IFDEF table_X
&THEN FIND table_X ...
&END

其中 &IFDEF 表示:“仅当 table 存在于数据库中时才编译这段代码”。

这在 Progress-4GL 11.6 版中可行吗?

如果您使用的是静态查询,则需要在编译时使用的环境中添加定义。在您的标准目录中:

// env.i

// nothing (yet)

并且在您的客户目录中:

// env.i

&global define table_x

然后您可以在编译时将其与您的 propath 一起使用,如果您的 propath 以客户目录开头,则选择定义,否则从您的标准目录中获取 env.i 和 table_x 未定义:

{ env.i }

&if defined( table_x ) &then
   find table_x no-lock.
&endif

如果您可以用动态使用替换此 table 的静态使用,那么您不需要定义,您可以:

def var hb as handle no-undo.

create buffer hb for table "table_x" no-error.
if valid-handle( hb ) then do:
   hb:find-unique( no-lock ).
end.

虽然这可能很有吸引力,但这确实意味着您给所有客户增加了可能不相关的 运行-时间检查的负担。