【问题标题】:Distinct or group by in Epicor 9 BAQ editor在 Epicor 9 BAQ 编辑器中区分或分组
【发布时间】:2015-10-01 01:38:27
【问题描述】:

我需要在业务活动查询中将 TranGLC 表连接到 Epicor 905 中的 APInvDtl 表。

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

我的问题是 join 不能唯一标识 APInvDtl 表中的记录,所以如果我的查询从 TranGLC 返回 14 行,当我连接这两个表时,我会得到 196 条记录。

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

我也可以通过使用 SQL group by 来获得我正在寻找的结果,但同样,我不知道如何在 BAQ 编辑器中执行此操作。

我研究了 ABL,看起来您可以在 ABL 代码中执行可能与 group by 相同的行为方式的 first-of,但我也看不到如何在 BAQ 编辑器中执行此操作。

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

【问题讨论】:

  • 发布您的查询,我们现在从哪里开始!

标签: progress-4gl openedge epicorerp


【解决方案1】:

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

一般加入是这样完成的:

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) - 在“全局”第一个和最后一个组而不是每个组上返回 true。

/* 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.

将导致:

【讨论】:

  • 谢谢我注意到第一个 |最后 |每个选项就在您的帖子之前。看起来这可以解决我的问题。感谢详细的回答,虽然我不认为有办法直接修改ABL,我相信我们必须使用Epicor中的BAQ编辑器。
  • 根据您的设置,您可能可以通过 Epicor 管理控制台访问查询编辑器,但您应该格外小心。如果设计不当,查询会对系统稳定性产生非常不利的影响。如果您没有丰富的 ABL 经验,您可能还没有识别错误查询的工具。基本上,首先在 Test 或 Pilot 中对其进行测试。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多