【问题标题】:How to add the IF THEN ELSE in the BY/BREAK BY keyword of FOR EACH?如何在 FOR EACH 的 BY/BREAK BY 关键字中添加 IF THEN ELSE?
【发布时间】:2016-07-21 00:41:48
【问题描述】:

这是我想问的示例:

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 9.1e,我可以为每个使用 BY ( IF cond THEN expr ELSE expr ) 构建一个,而不会出现任何错误。
  • BY ( IF cond THEN expr ELSE expr ) 对我来说没有问题。问题是 BY ( IF cond THEN expr ELSE expr + expr2 ) 将导致错误。或者我的方法应该是BY ( IF cond THEN expr ELSE expr2 ) BY (IF cond then TRUE else othr-expr) 有两个 BY

标签: progress-4gl openedge


【解决方案1】:

如果您使用的是足够现代的 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.

【讨论】:

  • 我们没有在我们的代码中尝试过动态查询。所以我不能真正理解它。但我会研究这个..谢谢
【解决方案2】:

根据之前的回复,这个是不支持的。

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

【讨论】:

    【解决方案3】:

    很遗憾,此语法不受支持。根据文档,BREAK/BY 需要一个表达式,而不是一个语句。

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多