GROUP BY功能正在进行OpenEdge

时间:2014-06-26 14:22:49

标签: progress-4gl openedge

我试图找出如何进行与#34; GROUP BY"相同的进步。功能。我正在尝试编写一个程序,列出多个地点的产品库存信息。现在,它列出了两次产品信息;每个位置一次。我试过BREAK BY功能失败了。我现在的&所需的输出和代码如下:

当前输出:

current

期望的输出:

desired

DEF INPUT PARAMETER ip-um AS CHARACTER NO-UNDO.

MESSAGE
  "ProdCode" + "^" +
  "ProdName" + "^" +
  "ProdUM" + "^" +
  "GrossPkgdWeight" + "^" +
  "QtyOH - LOC1" + "^" +
  "QtyOH - LOC2"
  SKIP.

FOR EACH product-um WHERE
     product-um.gross-pkgd-weight <= 0.0000
     NO-LOCK,
EACH product WHERE
     product.product-key = product-um.product-key AND
     product.can-be-sold = YES
     NO-LOCK,
EACH inventory WHERE
     inventory.product-key = product.product-key AND
     inventory.qoh > 0 AND
     inventory.level = 2
     NO-LOCK,
EACH um WHERE
     um.um-key = product-um.um-key AND
     um.um = ip-um
     NO-LOCK
BREAK BY product.product-code:

MESSAGE
     product.product-code + "^" +
     product.product-name + "^" +
     um.um-code + "^" +
     STRING(product-um.gross-pkgd-weight) + "^" +
     IF inventory.level-key-2 = '00000001' THEN STRING(inventory.qoh) ELSE "0" 
     + "^" + IF inventory.level-key-2 = '00000002' THEN STRING(inventory.qoh) ELSE "0" 
     SKIP.
END.

2 个答案:

答案 0 :(得分:2)

因为你依赖inventory.level-key-2积累了invesntory.qoh,所以ACCUMULATE stmt不可行,所以手动编码累积将是最好的选择

DEFINE VARIABLE loc1 AS INTEGER NO-UNDO.
DEFINE VARIABLE loc2 AS INTEGER NO-UNDO.
FOR EACH  product-um NO-LOCK
    WHERE product-um.gross-pkgd-weight <= 0.0000
,
EACH  product NO-LOCK
WHERE product.product-key = product-um.product-key
  AND product.can-be-sold = YES
,
EACH  inventory NO-LOCK
WHERE inventory.product-key = product.product-key
  AND inventory.product-code = product.product-code
  AND inventory.qoh > 0
  AND inventory.level = 2
,
EACH  um NO-LOCK
WHERE um.um-key = product-um.um-key
  and um.um = ip-um
BREAK
   BY product.product-code:

  CASE (inventory.level-key-2):
    WHEN "00000001"
      THEN loc1 = loc1 + inventory.qoh.
    WHEN "00000002"
      THEN loc2 = loc2 + inventory.qoh.
   END CASE.
  IF LAST-OF(product.product-code)
  THEN DO:
    MESSAGE
      product.product-code + "^" +
      product.product-name + "^" +
      um.um-code + "^" +
      STRING(product-um.gross-pkgd-weight) + "^" +
      STRING(loc1) + "^" +
      STRING(loc2)
      SKIP.
    ASSIGN
      loc1 = 0
      loc2 = 0
    .
  END.
END.

答案 1 :(得分:1)

BREAK BY告诉编译器标记FOR EACH何时到达中断组的开始或结束。为了检测这些更改,您需要使用这些功能之一来检测该更改:FIRST(表) .field),FIRST-OF(table.field),LAST(table.field)和LAST-OF(table.field)。

一旦所需函数返回true,就可以使用ABL提供的函数(如ACCUMULATE,COUNT,TOTAL等)来显示所需的结果。就个人而言,我发现这些概念有点难以理解,所以我声明了一些局部变量并以这种方式进行总计。