【问题标题】:How to implement NOT EXISTS in OPEN QUERY statement in PROGRESS 4GL - OpenEdge 10.2A如何在 PROGRESS 4GL 的 OPEN QUERY 语句中实现 NOT EXISTS - OpenEdge 10.2A
【发布时间】:2020-11-13 14:27:28
【问题描述】:

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

可以使用 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语句可以写吗?

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    这不是我想出来的,史蒂夫·摩尔在 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.
    

    【讨论】:

    • 谢谢汤姆,我已经使用这种方法更改了我的代码。所以现在一切正常。谢谢你的帮助。将临时表 ttDummy 字段 field1 定义为 char。创建 ttDummy。为每个 myTable NO-LOCK 打开查询 myBrowse,首先 myTable2 外部连接 myTable2.myField=myTable.myFieldNO-LOCK,FIRST ttDummy WHERE 不可用(myTable2)。
    【解决方案2】:

    甚至可以使用动态查询:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2017-07-18
      • 2012-03-19
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多