Miklix

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.


Esta página foi traduzida automaticamente do inglês para torná-la acessível ao maior número possível de pessoas. Infelizmente, a tradução automática ainda não é uma tecnologia aperfeiçoada, portanto, podem ocorrer erros. Se preferir, você pode visualizar a versão original em inglês aqui:

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.

static void CustomerCreate(Args _args)
{
    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:

static void CustomerRead(Args _args)
{
    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:


Compartilhe no BlueskyCompartilhe no FacebookCompartilhe no LinkedInCompartilhe no TumblrCompartilhar em XCompartilhe no LinkedInFixar no Pinterest

Mikkel Christensen

Sobre o autor

Mikkel Christensen
Mikkel é o criador e proprietário do miklix.com. Ele tem mais de 20 anos de experiência como programador de computador/desenvolvedor de software profissional e atualmente trabalha em tempo integral para uma grande empresa europeia de TI. Quando não está blogando, ele dedica seu tempo livre a uma grande variedade de interesses, hobbies e atividades, o que pode, até certo ponto, refletir-se na variedade de tópicos abordados neste site.