如何在Progress OpenEdge过程中两次查询同一个表?

时间:2014-07-21 16:14:36

标签: progress-4gl openedge

在这个例子中,我有两个表;订单标题(oe-hdr)和位置(位置)。订单表头表包含两个字段(sale-location-key和ship-location-key),这些字段在位置表中具有关联的位置名称。如果我使用SQL来获取结果,我会做这样的事情......

SELECT oe-hdr.order-num, oe-hdr.order-date, saleloc.location-name, shiploc.location-name
FROM oe-hdr,
    (SELECT location.location-name
     FROM oe-hdr, location
     WHERE oe-hdr.sale-location-key = location-key) as saleloc,
    (SELECT location.location-name
     FROM oe-hdr, location
     WHERE oe-hdr.ship-location-key = location-key) as shiploc
WHERE oe-hdr.order-num = saleloc.order-num 
AND oe-hdr.order-num = shiploc.order-num

有没有人知道如何在Progress程序中复制它?

2 个答案:

答案 0 :(得分:5)

为“location”定义两个缓冲区,然后使用指向缓冲区的链接执行for-each:

DEFINE BUFFER saleloc FOR location.
DEFINE BUFFER shiploc FOR location.

FOR EACH oe-hdr
   NO-LOCK,

   EACH saleloc
      WHERE saleloc.location-key = oe-hdr.sale-location-key
      NO-LOCK,

   EACH shiploc
      WHERE shiploc.location-key = oe-hdr.ship-location-key
      NO-LOCK
     :

   DISPLAY
       oe-hdr.order-num
       oe-hdr.order-date
       saleloc.location-name
       shiploc.location-name
     DOWN
     .

END.

一个注释 - 如果位置表中不存在销售或送货地址,则不会显示整个记录。如果您需要该功能,则需要采用不同的方法 - 它将涉及将“链接”移动到FOR EACH块中的一对“FIND”语句。

答案 1 :(得分:2)

要克服Tims关于丢失地址的观点,您可以使用函数或方法(如果使用OO代码)返回location-name并在显示中使用它。它可以在这方面实现更好的错误处理。但不确定性能影响。 只是一个想法。