Chamando serviços de documentos AIF diretamente do X++ no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 11:23:10 UTC
Última atualização: 12 de janeiro de 2026 às 08:55:20 UTC
Neste artigo, explico como chamar os serviços de documentos do Application Integration Framework (AIF) no Dynamics AX 2012 diretamente do código X++, emulando chamadas de entrada e saída, o que pode facilitar significativamente a localização e depuração de erros no código AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
As informações neste post são baseadas no Dynamics AX 2012 R3. Elas podem ou não ser válidas para outras versões.
Recentemente, auxiliei um cliente na implementação de uma porta de entrada do Application Integration Framework (AIF) para a criação de clientes com base em dados recebidos de outro sistema. Como o Dynamics AX já oferece o serviço de documento CustCustomer, que implementa a lógica necessária, optamos por manter a simplicidade e utilizar a solução padrão.
No entanto, logo se descobriu que havia muitos problemas para fazer o sistema externo gerar um XML que o Dynamics AX aceitasse. O esquema XML gerado pelo Dynamics AX é bastante complexo e também parece haver alguns bugs no Dynamics AX que às vezes o fazem rejeitar XML que, de acordo com outras ferramentas, é válido segundo o esquema. Portanto, no geral, provou ser mais complicado do que eu imaginava.
Durante o processo, muitas vezes tive dificuldades para descobrir exatamente qual era o problema com determinados arquivos XML, pois as mensagens de erro fornecidas pelo AIF eram pouco informativas. Além disso, era um processo tedioso, já que eu precisava esperar que o sistema externo enviasse uma nova mensagem via MSMQ e, em seguida, que o AIF a recebesse e processasse antes de poder visualizar o erro.
Investiguei, portanto, se era possível chamar o código do serviço diretamente com um arquivo XML local para testes um pouco mais rápidos e descobri que sim – e não só isso, é muito simples de fazer e, na verdade, fornece mensagens de erro muito mais significativas.
O exemplo de tarefa abaixo lê um arquivo XML local e tenta usá-lo com a classe AxdCustomer (que é a classe de documento usada pelo serviço CustCustomer) para criar um cliente. Você pode criar tarefas semelhantes para todas as outras classes de documento, por exemplo, AxdSalesOrder, se necessário.
{
FileNameOpen fileName = @'C:\\TestCustomerCreate.xml';
AxdCustomer customer;
AifEntityKey key;
#File
;
new FileIoPermission(fileName, #IO_Read).assert();
customer = new AxdCustomer();
key = customer.create( XmlDocument::newFile(fileName).xml(),
new AifEndpointActionPolicyInfo(),
new AifConstraintList());
CodeAccessPermission::revertAssert();
info('Done');
}
Objeto AifEntityKey retornado pelo método customer.create() (que corresponde à operação de serviço "create" no AIF) contém informações sobre qual cliente foi criado, incluindo o RecId do registro CustTable criado.
Se o que você está tentando testar é uma porta de saída ou se você apenas precisa de um exemplo de como o XML deve ser na porta de entrada, você também pode usar a classe de documento para exportar um cliente para um arquivo, chamando o método read() (correspondente à operação de serviço "read"), da seguinte forma:
{
FileNameSave fileName = @'C:\\TestCustomerRead.xml';
Map map = new Map( Types::Integer,
Types::Container);
AxdCustomer customer;
AifEntityKey key;
XMLDocument xmlDoc;
XML xml;
AifPropertyBag bag;
#File
;
map.insert(fieldNum(CustTable, AccountNum), ['123456']);
key = new AifEntityKey();
key.parmTableId(tableNum(CustTable));
key.parmKeyDataMap(map);
customer = new AxdCustomer();
xml = customer.read(key,
null,
new AifEndpointActionPolicyInfo(),
new AifConstraintList(),
bag);
new FileIoPermission(fileName, #IO_Write).assert();
xmlDoc = XmlDocument::newXml(xml);
xmlDoc.save(fileName);
CodeAccessPermission::revertAssert();
info('Done');
}
Você deve, obviamente, substituir '123456' pelo número da conta do cliente que deseja consultar.
Leitura adicional
Se você gostou deste post, você também pode gostar destas sugestões:
- Excluir uma entidade legal (contas da empresa) no Dynamics AX 2012
- Converter um real em string com todos os decimais no Dynamics AX 2012
- Visão geral rápida do Dynamics AX 2012 SysOperation Framework
