在 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.
将导致:
我需要在业务 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.
将导致: