如何在PROGRESS 4GL-OpenEdge 10.2A中的OPEN QUERY语句中实现NOT EXISTS



我想创建一个浏览,这样,如果一个字段的值不存在于另一个表中,它将显示一个表的所有记录。

可以使用SQL将记录获取为:

SELECT myField FROM pub.myTable WHERE 
NOT EXISTS (SELECT myField FROM pub.myTable2 WHERE myTable2.myField=myTable.myField)

也可以使用4GL作为:

FOR EACH myTable WHERE 
NOT CAN-FIND(FIRST myTable2 WHERE myTable2.myField=myTable.myField)

问题是当我把这个查询放在浏览中作为:

OPEN QUERY myBrowse
FOR EACH myTable WHERE 
NOT CAN-FIND(FIRST myTable2 WHERE myTable2.myField=myTable.myField)

它给出错误信息

CAN-FIND is invalid within an OPEN QUERY. (3541)

问题是,有可能写出这样一个OPEN QUERY语句吗?

我没有想到这个,Steve Moore在https://community-archive.progress.com/forums/00026/27143.html

define temp-table ttNoOrder
field field1 as char.
create ttNoOrder.
define query q1 for Customer, Order, ttNoOrder.
open query q1 for each Customer no-lock,
first Order of Customer outer-join no-lock,
first ttNoOrder where not available(Order).
get first q1.
repeat while not query-off-end("q1"):
display Customer.CustNum Customer.Name available(Order).
get next q1.
end.

即使使用动态查询也能工作:

DEFINE TEMP-TABLE ttNoOrder
FIELD field1 AS CHARACTER .
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
CREATE ttNoOrder.
CREATE QUERY hQuery .
hQuery:SET-BUFFERS (BUFFER Customer:HANDLE,
BUFFER Order:HANDLE,
BUFFER ttNoOrder:HANDLE) .
hQuery:QUERY-PREPARE ("for each Customer no-lock, ~
first Order of Customer outer-join no-lock, ~
first ttNoOrder where not available(Order)") .
hQuery:QUERY-OPEN() .
hQuery:GET-FIRST () .
REPEAT WHILE NOT hQuery:QUERY-OFF-END:
DISPLAY Customer.CustNum FORMAT ">>>>>>>>>9" Customer.Name AVAILABLE(Order).
hQuery:GET-NEXT ().
END.

最新更新