如果存在表,如何有条件地编译?

问题描述

我正在使用 Progress-4GL 版本 11.6、appBuilder 和过程编辑器。

我刚刚创建了一个名为“table_X”的表,我在代码中使用它,例如:

FIND table_X ...

不过,我的程序是通用的,但是表是定制的(有些客户有这个表,有些没有)。

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

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

其中 &IFDEF 的意思是:“仅当数据库中存在该表时才编译这段代码”。

这在 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

如果你可以用动态使用替换这个表的静态使用,那么你不需要定义,你可以:

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.

虽然这可能很有吸引力,但它确实意味着您正在给所有客户带来可能不相关的运行时检查。