如何获取正在进行的多个项目的最后一个元素?

How can I get the last element of multiple items in Progress?

我正在尝试获取某些表中的最后一个元素。这个程序是基于SQL一个,SQL上使用的函数是MAX()。但在 Progress 上使用它无法正常工作。我的代码如下。

FOR EACH nota-fiscal
    WHERE nota-fiscal.dt-emis-nota > TODAY - pd-dias
    AND nota-fiscal.cod-emitente <> 101 AND nota-fiscal.cod-emitente <> 102 NO-LOCK, 
        EACH repres 
        WHERE nota-fiscal.cod-rep = repres.cod-rep 
        AND repres.cod-rep =  pi-cod-emitente NO-LOCK,
            EACH ped-venda
            WHERE nota-fiscal.nome-ab-cli = ped-venda.nome-abrev 
            and   nota-fiscal.nr-pedcli = ped-venda.nr-pedcli NO-LOCK
            BREAK BY nota-fiscal.cod-emitente :

            ACCUMULATE nota-fiscal.dt-emis-nota (MAXIMUM).
            ACCUMULATE nota-fiscal.nr-nota-fis (MAXIMUM).
            ACCUMULATE ped-venda.nr-pedcli (MAXIMUM).
            ACCUMULATE ped-venda.user-impl (MAXIMUM).
            
            IF LAST-OF(nota-fiscal.cod-emitente) THEN DO:
                CREATE tt-representante.
                ASSIGN
                tt-representante.cod-emitente = nota-fiscal.cod-emitente
                tt-representante.nome-ab-cli  = nota-fiscal.nome-ab-cli
                tt-representante.cod-rep      = repres.cod-rep
                tt-representante.nome         = repres.nome
                tt-representante.dt-emis-nota = (ACCUM MAXIMUM nota-fiscal.dt-emis-nota)  // max(nota_fiscal.dt_emis_nota) ult_dt,
                tt-representante.nr-nota-fis  = (ACCUM MAXIMUM nota-fiscal.nr-nota-fis)  // max(nota_fiscal.nr_nota_fis) ult_nota,
                tt-representante.nr-pedcli    = (ACCUM MAXIMUM ped-venda.nr-pedcli)  // max(ped_venda.u##nr_pedcli) nr_pedcli,
                tt-representante.user-impl    = (ACCUM MAXIMUM ped-venda.user-impl)  // max(upper(ped_venda.user_impl)) user_impl,
                .
            END.
    END.

cod-emitente 是每个公司的 ID。所以对于每个公司,我想要他们在系统中存储的最后数据。正如现在发生的那样,我对每个 ID 都得到了相同的结果。

accumulateaccum 函数总是让我感到困惑,所以我倾向于尽可能避免使用它们。如果您也避免了它们并且只是在 first-of 上创建了记录并在其余部分使用了 maximum 函数,那么您也没有遇到问题。

if first-of( foo ) then do:
   create ttbar.
   assign
      ttbar.id    = foo.id
      ttbar.value = foo.value
      .
end.
else
   ttbar.value = maximum( ttbar.value, foo.value ).

如果你真的要用accumulate那你就需要积累到位了。现在你的最高限额是每件事,但你希望它是每个公司。所以需要使用 sub-maximum 并指明 by 什么:

accumulate nota-fiscal.dt-emis-nota ( sub-maximum by nota-fiscal.cod-emitente )
...
tt-representante.dt-emis-nota = accum sub-maximum nota-fiscal.dt-emis-nota by nota-fiscal.cod-emitente

这是一个显示差异的 ABLdojo 示例 https://abldojo.services.progress.com/?shareId=6013b9f19585066c219797fa

我设法通过删除 ACCUMULATE 并在其他元素中使用 BY 来做到这一点。使用 LAST-OF() 函数,我从所有元素中获取了最后一个元素,就好像我使用了 SQL max() 函数一样。 很遗憾我无法使用 ACCUMULATE 来学习如何更好地使用它。感谢@Stefan 的建议,如果我似乎懒洋洋地把我的工作交给你的话,我很抱歉。当我遇到问题时,我 post 我的代码在这里,然后继续更改代码,尝试尽可能多的不同的东西。我宁愿在代码中坚持几天并完成它,也不愿更改代码却无法完成。