我有一个包含两个逻辑标志,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程序员,他继承了一个庞大的,文档记录较差的应用程序。请保持温柔。
您想要的实际上是一个动态查询。我将在最后进行介绍,但是首先,我想解释一下为什么您将无法尝试在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').
[记得我说过您的查询是在编译时评估的吗?好了,您知道,另一端的动态查询是在运行时评估的,因此请做好准备,以防止错误仅在您运行时弹出。我还要提到的另一件事是动态查询要比静态查询慢,因此请评估并选择您的毒药:)
这应该是您所需要的。如果有帮助或有任何疑问,请告诉我。