如何获取正在进行的多个项目的最后一个元素?
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 都得到了相同的结果。
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
这是一个显示差异的 ABLdojo 示例 https://abldojo.services.progress.com/?shareId=6013b9f19585066c219797fa
我设法通过删除 ACCUMULATE 并在其他元素中使用 BY 来做到这一点。使用 LAST-OF() 函数,我从所有元素中获取了最后一个元素,就好像我使用了 SQL max() 函数一样。
很遗憾我无法使用 ACCUMULATE 来学习如何更好地使用它。感谢@Stefan 的建议,如果我似乎懒洋洋地把我的工作交给你的话,我很抱歉。当我遇到问题时,我 post 我的代码在这里,然后继续更改代码,尝试尽可能多的不同的东西。我宁愿在代码中坚持几天并完成它,也不愿更改代码却无法完成。
我正在尝试获取某些表中的最后一个元素。这个程序是基于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
这是一个显示差异的 ABLdojo 示例 https://abldojo.services.progress.com/?shareId=6013b9f19585066c219797fa
我设法通过删除 ACCUMULATE 并在其他元素中使用 BY 来做到这一点。使用 LAST-OF() 函数,我从所有元素中获取了最后一个元素,就好像我使用了 SQL max() 函数一样。 很遗憾我无法使用 ACCUMULATE 来学习如何更好地使用它。感谢@Stefan 的建议,如果我似乎懒洋洋地把我的工作交给你的话,我很抱歉。当我遇到问题时,我 post 我的代码在这里,然后继续更改代码,尝试尽可能多的不同的东西。我宁愿在代码中坚持几天并完成它,也不愿更改代码却无法完成。