如何在FOR EACH的BY / BREAK BY关键字中添加IF THEN ELSE?

时间:2016-07-21 00:41:49

标签: progress-4gl openedge

这是我想问的样本:

FOR EACH table-name.... NO LOCK BY (IF TRUE THEN sort-this ELSE sort-that + sort-that2).

END.

这会导致错误。

如果只是

FOR EACH .. NO LOCK BY (IF TRUE THEN sort-this ELSE sort-that).
END.

然后没有错误。 Progress会接受代码

如果条件为真,则需要按一个字段排序,否则按两个或多个字段排序

3 个答案:

答案 0 :(得分:2)

如果您使用的是现代版本的Progress,则可以构建动态查询。这在运行时方面会更有效,并且可以帮助您解决问题,因为在查询谓词中使用IF语句会使索引选择变得困难。

QueryString = "for each table no-lock...".
if true then 
  QueryString = QueryString + " by sort-this".
else
  QueryString = QueryString + " by sort-that by sort-other".

create query QueryHandle.
QueryHandle:add-buffer(buffer table:handle).
QueryHandle:query-prepare(QueryString).
QueryHandle:query-open.
do while QueryHandle:get-next():
  /*some stuff*/
end.
QueryHandle:query-close.
delete object QueryHandle.

答案 1 :(得分:1)

根据之前的回复,不支持此功能。

通常,您必须先将结果准备到临时表中,然后使用临时表中的逻辑字段获取IF THEN ELSE表达式的结果。

答案 2 :(得分:0)

不幸的是,不支持此语法。根据文档,BREAK / BY需要一个表达式,但不是声明。