Miklix

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.


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

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.

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');
}

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:

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');
}

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:


Partilhar no BlueskyPartilhar no FacebookPartilhar no LinkedInPartilhar no TumblrPartilhar em XPartilhar no LinkedInFixar no Pinterest

Mikkel Christensen

Sobre o autor

Mikkel Christensen
Mikkel é o criador e proprietário do miklix.com. Tem mais de 20 anos de experiência como programador informático/desenvolvedor de software profissional e trabalha atualmente a tempo inteiro para uma grande empresa europeia de TI. Quando não está a escrever no blogue, dedica o seu tempo livre a um vasto leque de interesses, passatempos e actividades, que podem, em certa medida, refletir-se na variedade de tópicos abordados neste sítio Web.