Uma das coisas as quais senti falta nas primeiras horas de desenvolvimento na nova versão do ERP Microsoft Dynamics, foi do botão Editar da janela de log de informações do sistema. No Dynamics AX 2012 este botão é uma mão na roda para que precisa saber que evento gerou determinada mensagem. Abaixo uma imagem deste botão:
Era só clicar nele, que o código que originou esta mensagem seria exibido no Morphex.
A maneira que encontrei de contornar tal problema, foi utilizar o método add da classe Info. É por lá que cada mensagem a ser exibida para o usuário, é passada. Basta adicionar um breakpoint no método e navegar pelo callstack para descobrir a origem da mensagem.
Agora será fácil saber de onde cada mensagem está sendo chamada, no Microsoft Dynamics 365 For Finance and Operation, Enterprise edition!! (belo nome)
sábado, 16 de dezembro de 2017
terça-feira, 28 de novembro de 2017
Bug na execução em CIL do método MapIterator.find() - Microsoft Dynamics AX 2012
Hoje analisando um problema na execução da Absorção de Custos foi constatado um problema na atribuição dos vouchers da tabela de Custos Absorvidos (ACOProdOverHeadCostTrans_BR). Fazendo uma análise mais aprofundada verificou-se que o problema só ocorria quando o processo era executado em lote.
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
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():
quarta-feira, 27 de setembro de 2017
Agendamento Automático da Execução em Lotes - Microsoft Dynamics AX
Abaixo segue o exemplo de um código, ao qual cria um agendamento de execução em lotes de maneira automática, ou seja, sem a ação direta do usuário. A classe a ser utilizada deve estender RunbaseBatch e estar funcionando da maneira convencional! (chamando o agendamento via .prompt())
No exemplo também implementei a alteração da hora de inicio, sendo que o mesmo será executado somente uma vez!
Caso o seu cenário mude, deve-se estudar os demais métodos da classe SysRecurrence, com a finalidade de alterar os outros parâmetros de recorrência!
Segue código de exemplo:
YourRunBaseBatchClass yourRunBaseBatchObj = new YourRunBaseBatchClass();
yourRunBaseBatchObj.batchInfo().parmBatchExecute(NoYes::Yes);
yourRunBaseBatchObj.parmValue(args.parm());
// Set the recurrence data
sysRecurrenceData = SysRecurrence::defaultRecurrence();
sysRecurrenceData = SysRecurrence::setRecurrenceEndAfter(sysRecurrenceData,0);
yourTable = YourTable::find();
switch (yourTable.SysRecurrenceUnit)
{
case SysRecurrenceUnit::Day:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addDays(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
case SysRecurrenceUnit::Hour:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addHours(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
case SysRecurrenceUnit::Minute:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addMinutes(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
}
yourRunBaseBatchObj.batchInfo().parmBatchHeader().parmRecurrenceData(sysRecurrenceData);
yourRunBaseBatchObj.batchInfo().parmCaption("Batch Job Description");
yourRunBaseBatchObj.doBatch();
No exemplo também implementei a alteração da hora de inicio, sendo que o mesmo será executado somente uma vez!
Caso o seu cenário mude, deve-se estudar os demais métodos da classe SysRecurrence, com a finalidade de alterar os outros parâmetros de recorrência!
Segue código de exemplo:
YourRunBaseBatchClass yourRunBaseBatchObj = new YourRunBaseBatchClass();
yourRunBaseBatchObj.batchInfo().parmBatchExecute(NoYes::Yes);
yourRunBaseBatchObj.parmValue(args.parm());
// Set the recurrence data
sysRecurrenceData = SysRecurrence::defaultRecurrence();
sysRecurrenceData = SysRecurrence::setRecurrenceEndAfter(sysRecurrenceData,0);
yourTable = YourTable::find();
switch (yourTable.SysRecurrenceUnit)
{
case SysRecurrenceUnit::Day:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addDays(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
case SysRecurrenceUnit::Hour:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addHours(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
case SysRecurrenceUnit::Minute:
sysRecurrenceData = SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData, DateTimeUtil::addMinutes(DateTimeUtil::utcNow(), yourTable.Counting)); // Set range of recurrence
break;
}
yourRunBaseBatchObj.batchInfo().parmBatchHeader().parmRecurrenceData(sysRecurrenceData);
yourRunBaseBatchObj.batchInfo().parmCaption("Batch Job Description");
yourRunBaseBatchObj.doBatch();
Qualquer dúvida, por favor poste na área de comentários!
terça-feira, 26 de setembro de 2017
KB NFE 4.0 - Dynamics AX 2012 R3
Já foi liberado o KB referente à NFE 4.0. Ele pode ser baixado através do link:
https://fix.lcs.dynamics.com/Issue/ReleasedFeature?bugId=3801209&qc=67e6a13267fc0900ff4eb7f5e85929b74b795d5d667871bd853ee7b43a1acf84
Não é necessária a instalação do Cumulative Update 13. O mesmo pode ser instalado separadamente, em qualquer AX 2012 R3.
https://fix.lcs.dynamics.com/Issue/ReleasedFeature?bugId=3801209&qc=67e6a13267fc0900ff4eb7f5e85929b74b795d5d667871bd853ee7b43a1acf84
Não é necessária a instalação do Cumulative Update 13. O mesmo pode ser instalado separadamente, em qualquer AX 2012 R3.
Cumulative Update 13 - Microsoft Dynamics AX 2012 R3
Foi liberado o Cumulative Update 13, para o Dynamics AX 2012 R3
No LCS, o mesmo pode ser encontrado através do KB 4032175, link:
https://fix.lcs.dynamics.com/Issue/Resolved?kb=4032175&bugId=3839013&qc=81bc3cf231cb67716597aa7a41685dfa9c91def838ab2e7fdbc93f131df9f04d
E a relação de KBs liberados neste Cumulative Update, pode ser encontrada através do seguinte link:
https://support.microsoft.com/en-us/help/4032175/cumulative-update-13-cu13-for-microsoft-dynamics-ax-2012-r3
No LCS, o mesmo pode ser encontrado através do KB 4032175, link:
https://fix.lcs.dynamics.com/Issue/Resolved?kb=4032175&bugId=3839013&qc=81bc3cf231cb67716597aa7a41685dfa9c91def838ab2e7fdbc93f131df9f04d
E a relação de KBs liberados neste Cumulative Update, pode ser encontrada através do seguinte link:
https://support.microsoft.com/en-us/help/4032175/cumulative-update-13-cu13-for-microsoft-dynamics-ax-2012-r3
segunda-feira, 28 de agosto de 2017
Alterar Servidor de SSRS - Dynamics AX 365 For Finance and Operations
Antes, no AX2012, para que pudêssemos alterar o Servidor de Report, tinhamos que faze-lo direto em um formulário que continha os endereços das URLs pertinentes ao SSRS. No DAX365FFO isso mudou, a alteração é direto no WebConfig e existe um pacote pronto para isso!
Os procedimentos abaixo, foram executados no servidor que hospeda o IIS.
Para alterar o nome do Servidor de Reports do DAX365FFO, execute os seguintes passos:
1 - Abra como administrador o PowerShell. Geralmente fica localizado em: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
2 - Execute o seguinte pacote, seguido do nome do server:
Ambiente On-Premises:
C:\Packages\Plugins\AxReportVmRoleStartupTask\UpdateSsrsMachineNameInAosWebConfig.ps1 ServerName
Ambiente Azure (em VMs contoso, a partição é a C: e deve-se utilzar este comando)
J:\AOSService\PackagesLocalDirectory\Plugins\AxReportVmRoleStartupTask\UpdateSsrsMachineNameInAosWebConfig.ps1 ServerName
em um ambiente Azure, o comando deve ficar parecido com:
3 - Executado o comando, vá no WebConfig e verifique se as seguintes tags estão como abaixo, com o novo Nome:
<add key="BiReporting.PersistentVirtualMachineIPAddressSSRS" value="ServerName" />
<add key="PersistentVirtualMachineIPAddressSSRS" value="ServerName" />
Quaisquer dúvidas, postem nos comentários que tentarei responder!
Os procedimentos abaixo, foram executados no servidor que hospeda o IIS.
Para alterar o nome do Servidor de Reports do DAX365FFO, execute os seguintes passos:
1 - Abra como administrador o PowerShell. Geralmente fica localizado em: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
2 - Execute o seguinte pacote, seguido do nome do server:
Ambiente On-Premises:
C:\Packages\Plugins\AxReportVmRoleStartupTask\UpdateSsrsMachineNameInAosWebConfig.ps1 ServerName
Ambiente Azure (em VMs contoso, a partição é a C: e deve-se utilzar este comando)
J:\AOSService\PackagesLocalDirectory\Plugins\AxReportVmRoleStartupTask\UpdateSsrsMachineNameInAosWebConfig.ps1 ServerName
em um ambiente Azure, o comando deve ficar parecido com:
3 - Executado o comando, vá no WebConfig e verifique se as seguintes tags estão como abaixo, com o novo Nome:
<add key="BiReporting.PersistentVirtualMachineIPAddressSSRS" value="ServerName" />
<add key="PersistentVirtualMachineIPAddressSSRS" value="ServerName" />
Quaisquer dúvidas, postem nos comentários que tentarei responder!
sexta-feira, 11 de agosto de 2017
SPED EFD-Reinf - Dynamics AX 2012 R3
Foi adicionada ao Roadmap do Dynamics AX 2012 R3 a geração da obrigação fiscal SPED EFD-Reinf
O KB será disponibilizado no mês de dezembro de 2017.
fonte:https://fix.lcs.dynamics.com/Issue/PlannedFeature?bugId=3840797&qc=9553e582ee777c252019432444a354b10168ed085597c89d5ff1bbc663bf1100
O KB será disponibilizado no mês de dezembro de 2017.
fonte:https://fix.lcs.dynamics.com/Issue/PlannedFeature?bugId=3840797&qc=9553e582ee777c252019432444a354b10168ed085597c89d5ff1bbc663bf1100
sexta-feira, 23 de junho de 2017
Bloquear o acesso à AOT, ignorando as permissões de Administrador do usuário
Acesse o conteúdo a partir do seguinte link, no meu LinkedIn:
https://www.linkedin.com/pulse/bloquear-o-acesso-%C3%A0-aot-ignorando-permiss%C3%B5es-de-do-usu%C3%A1rio-anaga
https://www.linkedin.com/pulse/bloquear-o-acesso-%C3%A0-aot-ignorando-permiss%C3%B5es-de-do-usu%C3%A1rio-anaga
quinta-feira, 22 de junho de 2017
Prorrogação do prazo de desativação da NF-e 3.1
Prorrogado o prazo de desativação da NF-e 3.1, para 02 de abril de 2018.
Com isso os KBs do Microsoft Dynamics AX, também tiveram suas datas alteradas para fevereiro de 2018.
Fontes:
https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=bwv07Maqb9U=
https://fix.lcs.dynamics.com/Issue/Results/1200417?q=%22NFe+-+Version+4.0%22&x=0&y=0&v=16_15_7_5_4_3&i=2&ct=1_3_5_4_2_6&ft=1_2_3&cu=&pi=&pm=&pc=&rd=&d=&envId=&permission=
Fontes:
https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=bwv07Maqb9U=
https://fix.lcs.dynamics.com/Issue/Results/1200417?q=%22NFe+-+Version+4.0%22&x=0&y=0&v=16_15_7_5_4_3&i=2&ct=1_3_5_4_2_6&ft=1_2_3&cu=&pi=&pm=&pc=&rd=&d=&envId=&permission=
sexta-feira, 9 de junho de 2017
Depuração de Classe DataProvider - SSRS - AX2012
Um dos grandes problemas que os desenvolvedores encontram ao analisar um SSRS report do AX 2012, é relacionado ao não funcionamento do breakpoint na classe DataProvider.
Abaixo um link explicando os passos necessários para que isso funcione:
https://www.linkedin.com/pulse/depura%C3%A7%C3%A3o-de-classe-dataprovider-ssrs-ax2012-otavio-anaga
Abaixo um link explicando os passos necessários para que isso funcione:
https://www.linkedin.com/pulse/depura%C3%A7%C3%A3o-de-classe-dataprovider-ssrs-ax2012-otavio-anaga
terça-feira, 6 de junho de 2017
Erro "SysDictType objeto não inicializado(a)" ao selecionar combo - AX 2012 R3 CU12
Após a atualização para o Cumulative Update 12, um problema no lookup de um campo surgiu!
Segue link comentando sobre o problema, e como corrigi-lo:
https://www.linkedin.com/pulse/erro-sysdicttype-objeto-n%C3%A3o-inicializadoa-ao-selecionar-otavio-anaga
Segue link comentando sobre o problema, e como corrigi-lo:
https://www.linkedin.com/pulse/erro-sysdicttype-objeto-n%C3%A3o-inicializadoa-ao-selecionar-otavio-anaga
quinta-feira, 25 de maio de 2017
Depuração Remota do Visual Studio - AX 2012
Por vezes me vi em situações em que necessitava realizar a depuração de execuções das regras de negócio em CIL, de modo remoto. Ou seja, depurar a execução em CIL, a partir de uma máquina, que não a do servidor de AOS. Mas nunca foi possível, e sempre acabava acessando o server do AOS diretamente, para que eu pudesse realizar a análise.
https://www.linkedin.com/pulse/depuração-remota-do-visual-studio-ax-2012-otavio-anaga
https://www.linkedin.com/pulse/depuração-remota-do-visual-studio-ax-2012-otavio-anaga
segunda-feira, 17 de abril de 2017
Lentidão na abertura de determinados formulários AX 2012/Bad performance when opening certain forms
Em um ambiente AX 2012 CU8, determinados forms como por exemplo, o de Transações Abertas do Fornecedor e o Diário de Faturas, tinham uma lentidão acentuada em determinados momentos.
https://www.linkedin.com/pulse/lentidão-na-abertura-de-determinados-formulários-ax-2012bad-anaga
https://www.linkedin.com/pulse/lentidão-na-abertura-de-determinados-formulários-ax-2012bad-anaga
sexta-feira, 24 de março de 2017
Nova cadeia de Certificados da NF-E
Ao instalarmos o novo certificado digital, que viabiliza a emissão de NFE, nos deparamos com problemas na cadeia de certificados, pois ela mudou! Seguem as dicas de instalação da cadeia de certificados para que o mesmo funcione com o AX 2012.
https://www.linkedin.com/pulse/nova-cadeia-de-certificados-da-nf-e-otavio-anaga
https://www.linkedin.com/pulse/nova-cadeia-de-certificados-da-nf-e-otavio-anaga
sexta-feira, 24 de fevereiro de 2017
Problemas no Plano de Pagamento - AX 2012 - Ordem de Venda/Payment Plan Problems - Sales Order - Ax 2012
Em alguns cenários o Dynamics AX 2012, calcula de maneira incorreta o número de dias entre os títulos gerados pela fatura da Ordem de Venda.
https://www.linkedin.com/pulse/problemas-plano-de-pagamento-ax-2012-ordem-plan-problems-anaga
https://www.linkedin.com/pulse/problemas-plano-de-pagamento-ax-2012-ordem-plan-problems-anaga
Assinar:
Postagens (Atom)