如何动态更改每个循环的a的条件?

问题描述 投票:0回答:1

我有一个包含两个逻辑标志,holdn和holdl的记录表。我想用3个不同的条件遍历该表。

任何一个标志为TRUE-我们想查看所有保留的内容

Flag Holdl是TRUE-我们只想查看由于这个原因而被保留的项目

Flag holdn为TRUE-我们只想查看由于其他原因而被保留的项目。

我无法弄清楚如何基于此动态更改每个循环的。到目前为止,我已经尝试过根据这些条件设置变量的值,然后将变量的内容用作where参数之一。这是行不通的,因为Progress抱怨数据不匹配。变量是一个字符串,标志是逻辑的,因此确实有意义。请参见下面的示例代码。这是表名称已更改的实际代码的一部分。在另一个调用此模块的模块中定义并设置了哪个保持,从哪个发出等变量。

DEFINE VARIABLE which-hold# AS CHARACTER FORMAT "x(30)" NO-UNDO.

CASE which-hold:
   WHEN "B" THEN which-hold# = "(widget.holdn or widget.holdl)".
   WHEN "L" THEN which-hold# = "widget.holdl".
   WHEN "N" THEN which-hold# = "widget.holdn".
END CASE.


for each widget where which-hold# and
         widget.order-no >= order-from and widget.order-no <= order-thru and
         widget.line-no >= line-from and widget.line-no <= line-thru and
         widget.joint-no >= joint-from and widget.joint-no <= joint-thru
         no-lock:

         A bunch of code to make a nice report with the retrieved records...

end.

这里是自学的Progress程序员,他继承了一个庞大的,文档记录较差的应用程序。请保持温柔。

openedge progress-4gl
1个回答
0
投票

您想要的实际上是一个动态查询。我将在最后进行介绍,但是首先,我想解释一下为什么您将无法尝试在where-hold#变量中替换字段名称:因为查询是在编译时评估的。这就是它的读取内容(假设which-hold#的值为widget.holdn对于每个小部件,其中“ widget-holdn”(...)但这并不等于TRUE或FALSE。那你问什么呢?好吧,这就是关键。每个条件都必须评估为真或假,因此如果尝试,您会更幸运。

for each widget where (if widget-hold# = 'widget.holdn' then widget.holdn = true else TRUE) (...)

再次,请注意,如果widget-hold#具有我想要的值,则该条件将存在,否则根本不会对此进行过滤。因此,您可以按照我显示的方式(针对您所遇到的每个条件)进行编码,并且应该可以正常工作。但是让我建议一个动态查询。您需要具备:

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.

CREATE QUERY hQuery.
hQuery:SET-BUFFERS(BUFFER widget:HANDLE).
hQuery:QUERY-PREPARE('<THIS IS THE CORE>').
hQuery:QUERY-OPEN().
DO WHILE hQuery:GET-NEXT():
   A bunch of code to make a nice report with the retrieved records...  
END.

因此,在内核中,您希望看到的每种字符串都有一个与之相对应的字符串。因此应该例如(将其存储在变量中,或将其组装在查询prepare中,没关系):

'FOR EACH widget NO-LOCK WHERE ' + 
(if which-hold = 'B' then 'widget.holdn = true and widget.holdl = true'
 else if which-hold = 'L' then 'widget-holdl = true'
 else /* N */ 'widget-holdn = true').

[记得我说过您的查询是在编译时评估的吗?好了,您知道,另一端的动态查询是在运行时评估的,因此请做好准备,以防止错误仅在您运行时弹出。我还要提到的另一件事是动态查询要比静态查询慢,因此请评估并选择您的毒药:)

这应该是您所需要的。如果有帮助或有任何疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.