【问题标题】:Progress ABL: BREAK BY With multiple joins in an OPEN QUERYProgress ABL: BREAK BY 在 OPEN QUERY 中有多个连接
【发布时间】:2016-04-26 19:40:59
【问题描述】:

我对 ABL 很陌生(我是法国人,所以请原谅我的英语),所以我需要你的帮助。 我想知道如何在 OPEN QUERY 中使用 BREAK BY。

这是我的工作:

define query Q-REQ for 
ENT_RCP_FRN,
LIG_RCP_FRN,
CONSO_UNV_MDIM,
LIG_DOC_TRS,
ENT_DOC_TRS scrolling.

open query Q-REQ for
 each ENT_RCP_FRN no-lock
   where  ENT_RCP_FRN.STO-c-CodeDes = "DRET", 
 each LIG_RCP_FRN no-lock break by LIG_RCP_FRN.SKU-c-cod
   where LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
   and LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn,
 each CONSO_UNV_MDIM no-lock
  where CONSO_UNV_MDIM.UMA-c-Code = "8B6A9/0001354"
  and CUMD-c-LstCleCumConso = LIG_RCP_FRN.SKU-c-cod,
 each LIG_DOC_TRS no-lock LEFT OUTER-JOIN
   where LIG_DOC_TRS.SKU-c-Cod = LIG_RCP_FRN.SKU-c-Cod,
 each ENT_DOC_TRS no-lock left outer-join
   where ENT_DOC_TRS.SOU-c-Cod = LIG_DOC_TRS.SOU-c-Cod
   and ENT_DOC_TRS.EDT-c-NumDocTrs = LIG_DOC_TRS.EDT-c-NumDocTrs
   and ENT_DOC_TRS.TR-c-CodeCatDoc = "BT"
   and ENT_DOC_TRS.STO-c-CodeOri = "DRET"
   and ENT_DOC_TRS.STO-c-CodeDes = "DWHO".


repeat :

     get next Q-REQ.
     if not available ENT_RCP_FRN then leave.


end.

我在以下语句中收到错误:

each LIG_RCP_FRN no-lock break by LIG_RCP_FRN.SKU-c-cod
   where LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
   and LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn,

无法理解后:“LIG_RCP_FRN.SKU-c-cod”(我的错误是法语,但它是错误 247):

247** L'expression après : "LIG_RCP_FRN.SKU-c-cod" est incomprehensible。 (247)

我想做的是能够对表 LIG_RCP_FRN 中的一列求和,当 SKU-c-Cod 更改时中断。

我尝试在出现此错误后删除所有语句,但也没有用。

如果您需要更多信息,请询问。 Openedge 进度 10.2A

感谢您的帮助, 科伦丁

PS:不可能在帖子中说“嗨”??

【问题讨论】:

  • 根据手册(尽管是 v9.1) - 您可以在打开的查询中使用“BY”对查询进行排序,但不能使用 break by。如果要使用“BREAK BY”,则需要使用 FOR EACH 循环。
  • @Screwtape 这不正确,至少在以后的版本中不正确。
  • 那很好。目前我无法测试超过 v9。在 FOR EACH 中,手册暗示 BREAK BY 应该是所有记录短语之后,所以也许只是将它移动到查询的末尾将在 OE10 中工作?只是猜测。

标签: progress-4gl openedge


【解决方案1】:

这是一个非常简单的错误。您需要将“BREAK BY”选项放在查询的最后。

此外,如果您发布一些(可能是假的)临时表定义以便于复制和粘贴,那也是非常好的。

我根据查询在下面的代码中临时创建了一些表,它们只是为了使代码编译。

在查询中调用的FIRST-OF 方法是这样工作的:

查询:FIRST-OF(级别)

index:一个整数表达式,表示一个 BREAK BY 组,其中 0 是整个查询,1 是第一个 BREAK BY,2 是第二个 BREAK BY,依此类推。

如果你有BREAK BY fieldA BY fieldB 那么

query:FIRST-OF(1)BREAK BY fieldA

相关

query:FIRST-OF(2)BREAK BY fieldB 相关

还有LAST-OF(n)

/* Completely fake temp-tables that are here only to make the query work! */
DEFINE TEMP-TABLE ENT_RCP_FRN NO-UNDO
    FIELD STO-c-CodeDes   AS CHARACTER
    FIELD SOU-c-Cod       AS INTEGER
    FIELD ERF-c-NumRcpFrn AS INTEGER.

DEFINE TEMP-TABLE LIG_RCP_FRN NO-UNDO
    FIELD SOU-c-Cod       AS INTEGER
    FIELD ERF-c-NumRcpFrn AS INTEGER
    FIELD SKU-c-cod       AS INTEGER.

DEFINE TEMP-TABLE CONSO_UNV_MDIM NO-UNDO
    FIELD UMA-c-Code            AS CHARACTER
    FIELD CUMD-c-LstCleCumConso AS INTEGER.

DEFINE TEMP-TABLE LIG_DOC_TRS NO-UNDO
    FIELD SKU-c-Cod       AS INTEGER
    FIELD SOU-c-Cod       AS INTEGER
    FIELD EDT-c-NumDocTrs AS INTEGER.

DEFINE TEMP-TABLE ENT_DOC_TRS NO-UNDO
    FIELD SOU-c-Cod       AS INTEGER
    FIELD EDT-c-NumDocTrs AS INTEGER
    FIELD TR-c-CodeCatDoc AS CHARACTER
    FIELD STO-c-CodeOri   AS CHARACTER
    FIELD STO-c-CodeDes   AS CHARACTER.


DEFINE QUERY Q-REQ FOR ENT_RCP_FRN, LIG_RCP_FRN, CONSO_UNV_MDIM, LIG_DOC_TRS, ENT_DOC_TRS  SCROLLING.

OPEN QUERY Q-REQ FOR EACH ENT_RCP_FRN NO-LOCK WHERE ENT_RCP_FRN.STO-c-CodeDes = "DRET",
    EACH LIG_RCP_FRN NO-LOCK WHERE LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
                               AND LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn,
    EACH CONSO_UNV_MDIM NO-LOCK WHERE CONSO_UNV_MDIM.UMA-c-Code = "8B6A9/0001354"
                                 AND CUMD-c-LstCleCumConso = LIG_RCP_FRN.SKU-c-cod,
    EACH LIG_DOC_TRS NO-LOCK LEFT OUTER-JOIN WHERE LIG_DOC_TRS.SKU-c-Cod = LIG_RCP_FRN.SKU-c-Cod,
    EACH ENT_DOC_TRS NO-LOCK LEFT OUTER-JOIN WHERE ENT_DOC_TRS.SOU-c-Cod = LIG_DOC_TRS.SOU-c-Cod
                                               AND ENT_DOC_TRS.EDT-c-NumDocTrs = LIG_DOC_TRS.EDT-c-NumDocTrs
                                               AND ENT_DOC_TRS.TR-c-CodeCatDoc = "BT"
                                               AND ENT_DOC_TRS.STO-c-CodeOri = "DRET"
                                               AND ENT_DOC_TRS.STO-c-CodeDes = "DWHO" BREAK BY LIG_RCP_FRN.SKU-c-cod.


REPEAT:

     GET NEXT Q-REQ.
     IF NOT AVAILABLE ENT_RCP_FRN THEN LEAVE.

     IF QUERY q-req:FIRST-OF(1) THEN DO:
         DISPLAY "First!".
     END.

END.

【讨论】:

  • 您好,感谢您的回答。我正在运行一些测试。我不再遇到错误,但结果不是我所期望的。我会及时通知你的。
  • @Corentin 如果您需要更多帮助,您需要描述除此之外的内容并发布更多代码!
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2014-03-19
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2015-12-23
相关资源
最近更新 更多