如何解决如何获取 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 都得到了相同的结果。
解决方法
accumulate
和 accum
函数总是让我感到困惑,因此我倾向于尽可能避免使用它们。如果您也避免了它们,只是在 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
,
我设法通过删除 ACCUMULATE 并在其他元素中使用 BY 来做到这一点。使用 LAST-OF() 函数,我从它们中获取了最后一个元素,就好像我使用了 SQL max() 函数一样。 很遗憾我无法使用 ACCUMULATE 来学习如何更好地使用它。感谢@Stefan 的建议,如果我似乎懒惰地将我的工作传递给你,我很抱歉。当我遇到问题时,我会在此处发布我的代码,然后继续更改代码,尝试尽可能多的不同操作。我更喜欢在代码中停留数天并完成它,而不是更改代码而无法完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。