有没有办法在 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。
我正在将一些 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。