在动态查询中使用can-find会产生错误

时间:2017-03-21 07:03:11

标签: dynamic query-string progress-4gl openedge

我需要查找其订单状态为“已订购”的客户记录。如何使用动态查询完成此操作?以下代码段引发错误:

DEFINE VARIABLE qry AS HANDLE.
CREATE QUERY qry.
qry:SET-BUFFERS(BUFFER customer:HANDLE, BUFFER order:HANDLE).
qry:QUERY-PREPARE("for each customer where customer.country eq 'USA' and 
                  can-find(order where order.custnum = customer.custnum 
                                   and order.orderstatus eq 'ordered')").
qry:QUERY-OPEN().

REPEAT :
  qry:GET-NEXT().
  IF qry:QUERY-OFF-END THEN LEAVE.
  DISP customer.custnum customer.name customer.salesrep.
END.
qry:QUERY-CLOSE().
DELETE OBJECT qry.

或者有没有解决方法呢?

1 个答案:

答案 0 :(得分:2)

不要为CAN-FIND而烦恼(你不应该这样做)。改为加入两个表。

这是一个在temp-tables中有一些mockdata的例子:

DEFINE TEMP-TABLE customer NO-UNDO
    FIELD custnum AS INTEGER
    FIELD country AS CHARACTER
    FIELD NAME    AS CHARACTER
    FIELD salesrep AS CHARACTER.

DEFINE TEMP-TABLE order NO-UNDO
    FIELD custnum AS INTEGER
    FIELD orderstatus AS CHARACTER.

CREATE customer.
ASSIGN customer.custnum  = 1
       customer.country  = "usa"
       customer.NAME     = "Name1"
       customer.salesrep = "jaan".

CREATE customer.
ASSIGN customer.custnum  = 2
       customer.country  = "usa"
       customer.NAME     = "Name2"
       customer.salesrep = "martin".

CREATE customer.
ASSIGN customer.custnum  = 3
       customer.country  = "sweden"
       customer.NAME     = "Name3"
       customer.salesrep = "john".

CREATE order.
ASSIGN order.custnum     = 1
       order.orderstatus = "cancelled".

CREATE order.
ASSIGN order.custnum     = 2
       order.orderstatus = "ordered".


CREATE order.
ASSIGN order.custnum      = 3
       order.orderstatus = "ordered".


DEFINE VARIABLE qry AS HANDLE.
CREATE QUERY qry.
qry:SET-BUFFERS(BUFFER customer:HANDLE, BUFFER order:HANDLE).
qry:QUERY-PREPARE("for each customer where customer.country eq 'USA', FIRST order where order.custnum = customer.custnum and order.orderstatus eq 'ordered'").
qry:QUERY-OPEN().

REPEAT :
  qry:GET-NEXT().
  IF qry:QUERY-OFF-END THEN LEAVE.
  DISP customer.custnum customer.name customer.salesrep.
END.
qry:QUERY-CLOSE().
DELETE OBJECT qry.