有没有办法在 PROGRESS-4GL 的 FOR EACH 中使用 IF 语句?

Is there a way of using an IF statement inside a FOR EACH in PROGRESS-4GL?

我正在将一些 SQL 代码转换为 Progress 4GL。我现在写的具体代码有很多可能的变量插入,比如有3个checkbox可以选择是或不是,每个选择加一个“AND ind_sit_doc IN”等。

我想做的是这样的:

FOR EACH doc-fiscal USE-INDEX dctfsc-09
        WHERE doc-fiscal.dt-docto >= pd-data-1
        AND doc-fiscal.dt-docto <= pd-data-2
        AND doc-fiscal.cod-observa <> 4
        AND doc-fiscal.tipo-nat <> 3
        AND doc-fiscal.cd-situacao <> 06
        AND doc-fiscal.cd-situacao <> 22
        AND (IF pc-ind-sit-doc-1 = 'on' THEN: doc-fiscal.ind-sit-doc=1) NO-LOCK,
            EACH natur-oper USE-INDEX natureza
            WHERE doc-fiscal.nat-operacao = natur-oper.nat-operacao NO-LOCK:

if 部分只有在变量以某种方式存在时才会被读取。 可能吗?

您可以在 FOR EACH 中添加 IF 语句。不过你必须有完整的 IF ... THEN ... ELSE。

例如:

FOR EACH customer WHERE (IF discount > 50 THEN state = 'ma' ELSE state = ''):
  DISPL name state discount.
END.

也就是说,该条件不会用于索引选择,只会应用于客户端(如果您使用的是网络数据库连接,这很糟糕)。

是的,你可以做到这一点(或多或少如 nwahmaet 所示)。

但在非平凡的查询中这是一个非常非常糟糕的主意。您很可能会强制进行 table 扫描,并且您很可能会将所有数据发送给客户端以供选择。那将是非常痛苦的。将 IF THEN ELSE 移到 WHERE 子句之外并实施两个不同的 FOR EACH 语句会更好。

如果您担心会复制 FOR EACH 的主体,那么您可以使用查询。像这样:

define query q for customer.

if someCondition = true then
  open query q for each customer no-lock where state = "ma".
 else
  open query q for each customer no-lock where state = "nh".

get first q.

do while available customer:

  display custNum state.
  get next q.

end.

除了一点点 table 之外,这将 更有效 table。

您也可以完全动态地构建所需的 WHERE 子句作为字符串 - 但这涉及使用句柄并且更复杂。但是,如果这听起来很有吸引力,请在文档中查询 QUERY-PREPARE。