【问题标题】:GROUP BY Function in Progress OpenEdge正在进行中的 GROUP BY 函数 OpenEdge
【发布时间】:2014-06-26 14:22:48
【问题描述】:

我正在尝试找出与“GROUP BY”函数等效的进度。我正在尝试编写一个程序来列出多个位置的产品库存信息。现在,它正在列出两次产品信息;每个位置一次。我尝试了 BREAK BY 功能,但没有成功。我当前和所需的输出和代码如下:

电流输出:

期望的输出:

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.

【问题讨论】:

    标签: progress-4gl openedge


    【解决方案1】:

    因为您累积 Inventory.qoh 依赖于 inventory.level-key-2,所以 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.
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 2011-07-29
        • 2014-08-24
        • 2015-05-02
        相关资源
        最近更新 更多