在 Epicor 9 BAQ 编辑器中区分或分组

Distinct or group by in Epicor 9 BAQ editor

我需要在业务 Activity 查询中将 TranGLC table 加入到 Epicor 905 中的 APInvDtl table。

我目前正在 Company, VendorNum, InvoiceNum, InvoiceLine, JobNum 上加入,看不到任何其他适合加入的列。

我的问题是连接没有唯一标识 APInvDtl table 中的记录,所以如果我查询 returns 来自 TranGLC 的 14 行,当我连接两个 tables , 我得到 196 条记录。

在 sql 中,我可以使用 Distinct 关键字,并且我得到了我正在寻找的结果,但我在 BAQ 编辑器中看不到这样做的方法。

我也可以通过使用 SQL 分组依据获得我正在寻找的结果,但同样,我不知道如何在 BAQ 编辑器中做到这一点。

我研究了 ABL,看起来你可以在 ABL 代码中做第一个,它的行为方式可能与 group by 相同,但我看不到如何在 BAQ 编辑器中做到这一点要么。

如有任何关于如何从结果集中删除重复项的建议,我们将不胜感激。

没有您的代码,很难知道从哪里开始。

一般加入是这样的:

FOR EACH table1 NO-LOCK, [EACH|FIRST|LAST] table2 WHERE table1.id = table2.id:
END.

根据您的信息,您有 2 个 EACH - 这意味着您迭代了两个表中的所有记录。没有更多信息,很难移动一个。也许你需要做:

FOR EACH table1 NO-LOCK, FIRST table2 NO-LOCK WHERE [...]

或者如您所说的 BREAK BY。那将是这样的:

FOR EACH table1 NO-LOCK, 
    EACH table2 NO-LOCK WHERE [...] BREAK BY table1.id1 BY table2.id2:

    IF FIRST-OF(table1.id1) THEN DO:
      /* Something */
    END.

    IF LAST-OF(table1.id1) THEN DO:
      /* Something */
    END.
END.

您也可以执行 FIRST(table1.id1)LAST(table1.id1) - returns 在 "globally" 第一个和最后一个组而不是每个组都为真。

/* Long example */
DEFINE TEMP-TABLE ttTest NO-UNDO
    FIELD a AS CHARACTER FORMAT "X" LABEL "A"
    FIELD b AS CHARACTER FORMAT "X" LABEL "B".


CREATE ttTest.
ASSIGN ttTest.a = "a"
       ttTest.b = "b".

CREATE ttTest.
ASSIGN ttTest.a = "a"
       ttTest.b = "b".

CREATE ttTest.
ASSIGN ttTest.a = "a"
       ttTest.b = "b".

CREATE ttTest.
ASSIGN ttTest.a = "a"
       ttTest.b = "b".

CREATE ttTest.
ASSIGN ttTest.a = "b"
       ttTest.b = "b".

CREATE ttTest.
ASSIGN ttTest.a = "b"
       ttTest.b = "b".


CREATE ttTest.
ASSIGN ttTest.a = "b"
       ttTest.b = "c".

CREATE ttTest.
ASSIGN ttTest.a = "c"
       ttTest.b = "c".

FOR EACH ttTest NO-LOCK BREAK BY ttTest.a BY ttTest.b:

    DISPLAY ttTest.

    IF FIRST(ttTest.a) THEN DISPLAY "X" COLUMN-LABEL "F(a)".

    IF FIRST(ttTest.b) THEN DISPLAY "X" COLUMN-LABEL "F(b)".

    IF FIRST-OF(ttTest.a) THEN DISPLAY "X" COLUMN-LABEL "F-O(a)".

    IF FIRST-OF(ttTest.b) THEN DISPLAY "X" COLUMN-LABEL "F-O(b)".

    IF LAST-OF(ttTest.a) THEN DISPLAY "X" COLUMN-LABEL "L-O(ta)".

    IF LAST-OF(ttTest.b) THEN DISPLAY "X" COLUMN-LABEL "L-O(b)".

    IF LAST(ttTest.a) THEN DISPLAY "X" COLUMN-LABEL "L(a)".

    IF LAST(ttTest.b) THEN DISPLAY "X" COLUMN-LABEL "L(b)".

END.

将导致: