Com isso busquei no LCS e encontrei um KB que corrige um cenário parecido, onde o mesmo atuava na mesma classe em que estava fazendo a análise. O KB é o de número e descrição 3218475, Bug Id 3806370: Brazil/BRA: The "Cost absorption journal" generates transactions with blank voucher when it is posted via a batch job.
Percebendo que em meu ambiente o citado KB já consta, verifiquei onde mais o método substituído (AcoJournalCheckPost_BR.getvoucher()) ainda estava sendo usado e o retirei utilizando a solução proposta pela MS.
Com o problema corrigido, fui tentar entender o que ocorreu, e verifiquei que o método MapIterator.find() não funciona adequadamente quando executado em CIL. Por isso a Microsoft optou por usar o Map.lookup() na resolução do problema citado anteriormente.
Fiz uma classe que exemplifica o que ocorreu:
Passo 1 - Copie o código abaixo em seu ambiente, e atualize a CIL
class Xppil_Test
{
}
public server static void Main(Args _args)
{
XppILExecutePermission permission = new XppILExecutePermission();
permission.assert();
runClassMethodIL(classStr(Xppil_Test),staticMethodStr(Xppil_Test,RunCode),conNull());
Xppil_Test::RunCode(conNull());
}
public static container RunCode(container _con)
{
date dateLocal;
Xppil_Test xppil_Test = new Xppil_Test();
if(xSession::isCLRSession())
{
info(strFmt("Versão executando em CIL:"));
xppil_Version.findTest();
}
else
{
info(strFmt("Versão executando em X++:"));
xppil_Version.findTest();
}
return conNull();
}
private void findTest()
{
Map voucherUsed;
MapIterator it;
voucherUsed = new Map(Types::String,Types::String);
voucherUsed.insert("PO0001", "VO0001");
voucherUsed.insert("PO0002", "VO0002");
voucherUsed.insert("PO0003", "VO0003");
voucherUsed.insert("PO0004", "VO0004");
it = new MapIterator(voucherUsed);
if (it.find("PO0001"))
{
info(it.value());
}
if (it.find("PO0002"))
{
info(it.value());
}
if (it.find("PO0003"))
{
info(it.value());
}
if (it.find("PO0004"))
{
info(it.value());
}
}
Passo 2 - Execute o método Main da classe e verifique os resultados
A classe executa o mesmo método duas vezes, uma em CIL e a outra em X++. Perceba que o MapIterator.find() sempre retorna o VO0001 quando executado em CIL, diferentemente de quando executado em X++.
Portanto, é indicado usar sempre o Map.lookup(), ao invés do MapIterator.find(). Use o seguinte link para aprender a como usar o Map.lookup():
Nenhum comentário:
Postar um comentário