Chamar serviços de documentos AIF diretamente do X++ no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 11:23:11 UTC
Última atualização: 12 de janeiro de 2026 às 08:55:21 UTC
Neste artigo, explico como chamar serviços de documentos do Application Integration Framework no Dynamics AX 2012 diretamente a partir de código X++, emulando tanto chamadas de entrada como de saída, o que pode facilitar significativamente a identificação e depuração de erros em código AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
A informação neste artigo baseia-se no Dynamics AX 2012 R3. Pode ou não ser válida para outras versões.
Recentemente, estava a ajudar um cliente a implementar uma porta de entrada do Application Integration Framework (AIF) para criar clientes com base em dados que recebiam de outro sistema. Como a Dynamics AX já fornece o serviço de documentos CustCustomer, que implementa a lógica para isso, decidimos manter a simplicidade e usar a solução padrão.
No entanto, rapidamente se verificou que havia muitos problemas para que o sistema externo gerasse 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 por vezes o façam rejeitar XML que é válido para o esquema segundo outras ferramentas, por isso, no geral, revelou-se menos simples do que eu pensava.
Durante este esforço, muitas vezes tive dificuldades em perceber qual era exatamente o problema com certos ficheiros XML porque as mensagens de erro fornecidas pela AIF são pouco informativas. Também foi aborrecido, porque tive de esperar que o sistema externo enviasse uma nova mensagem pelo MSMQ e depois novamente que o AIF captasse a mensagem e a processasse antes de poder ver um erro.
Por isso, investiguei se é possível chamar o código do serviço diretamente com um ficheiro XML local para testes um pouco mais rápidos e afinal é – e não só isso, é muito simples de fazer e fornece mensagens de erro muito mais significativas.
O trabalho de exemplo abaixo lê um ficheiro XML local e tenta usá-lo com a classe AxdCustomer (que é a classe document usada pelo serviço CustCustomer para criar um cliente. Podes criar trabalhos semelhantes para todas as outras classes de documentos, por exemplo AxdSalesOrder, se precisares.
{
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');
}
O objeto AifEntityKey devolvido pelo método customer.create() (que corresponde à operação "create" service no AIF) contém informações sobre qual cliente foi criado, entre outras coisas o RecId do registo CustTable criado.
Se o que estás a tentar testar é uma porta de saída ou se só precisares de um exemplo de como o XML deve ficar na porta de entrada, também podes usar a classe document para exportar um cliente para um ficheiro, chamando o método read() (correspondente à operação de serviço "read") em vez disso, Assim:
{
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');
}
Deves, claro, substituir '123456' pelo número de conta do cliente que queres ler.
Leitura adicional
Se gostou deste post, também pode gostar destas sugestões:
- Visão geral rápida do Dynamics AX 2012 SysOperation Framework
- Como iterar sobre os elementos de um Enum a partir do código X++ no Dynamics AX 2012
- A diferença entre data() e buf2Buf() no Dynamics AX 2012
