如何获取 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 示例 scrollbar track

,

我设法通过删除 ACCUMULATE 并在其他元素中使用 BY 来做到这一点。使用 LAST-OF() 函数,我从它们中获取了最后一个元素,就好像我使用了 SQL max() 函数一样。 很遗憾我无法使用 ACCUMULATE 来学习如何更好地使用它。感谢@Stefan 的建议,如果我似乎懒惰地将我的工作传递给你,我很抱歉。当我遇到问题时,我会在此处发布我的代码,然后继续更改代码,尝试尽可能多的不同操作。我更喜欢在代码中停留数天并完成它,而不是更改代码而无法完成。