Miklix

Trucant a AIF Document Services directament des de X++ a Dynamics AX 2012

Publicat: 5 de març del 2025, a les 19:29:29 UTC
Última actualització: 12 de gener del 2026, a les 8:55:44 UTC

En aquest article, explico com cridar els serveis de documents d'Application Integration Framework al Dynamics AX 2012 directament des del codi X++, emulant tant les trucades entrants com les sortints, cosa que pot facilitar significativament la cerca i la depuració d'errors al codi AIF.


Aquesta pàgina es va traduir automàticament de l'anglès per tal de fer-la accessible al màxim de persones possible. Malauradament, la traducció automàtica encara no és una tecnologia perfeccionada, de manera que es poden produir errors. Si ho prefereixes, pots veure la versió original en anglès aquí:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

La informació d'aquesta publicació es basa en el Dynamics AX 2012 R3. Pot ser vàlida o no per a altres versions.

Recentment, vaig ajudar un client a implementar un port d'entrada d'Application Integration Framework (AIF) per crear clients basats en dades que rebien d'un altre sistema. Com que Dynamics AX ja proporciona el servei de documents CustCustomer, que implementa la lògica per a això, vam decidir simplificar-ho i utilitzar la solució estàndard.

Tanmateix, aviat va resultar que hi havia molts problemes per aconseguir que el sistema extern generés XML que Dynamics AX acceptés. L'esquema XML generat per Dynamics AX és força complex i també sembla que hi ha alguns errors a Dynamics AX que de vegades fan que rebutgi XML que és vàlid per a l'esquema segons altres eines, així que, en general, va resultar ser menys simple del que pensava.

Durant l'esforç, sovint tenia dificultats per esbrinar quin era exactament el problema amb certs fitxers XML, ja que els missatges d'error proporcionats per AIF no eren gaire informatius. També era tediós, perquè havia d'esperar que el sistema extern enviés un missatge nou a través de MSMQ i, de nou, que AIF el recollissin i el processessin abans de poder veure un error.

Per tant, vaig investigar si és possible cridar el codi del servei directament amb un fitxer XML local per a proves una mica més ràpides i resulta que sí, i no només això, sinó que és realment senzill de fer i proporciona missatges d'error molt més significatius.

La tasca d'exemple següent llegeix un fitxer XML local i intenta utilitzar-lo amb la classe AxdCustomer (que és la classe de document utilitzada pel servei CustCustomer) per crear un client. Podeu fer tasques similars per a totes les altres classes de documents, per exemple AxdSalesOrder, si cal.

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

L'objecte AifEntityKey retornat pel mètode customer.create() (que correspon a l'operació de servei "create" a AIF) conté informació sobre quin client es va crear, entre altres coses el RecId del registre CustTable creat.

Si el que intenteu provar és un port de sortida o si només necessiteu un exemple de com hauria de ser l'XML al port d'entrada, també podeu utilitzar la classe document per exportar un client a un fitxer cridant el mètode read() (corresponent a l'operació de servei "read"), així:

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

Per descomptat, hauríeu de substituir "123456" pel número de compte del client que voleu llegir.

Lectures addicionals

Si t'ha agradat aquesta publicació, també et poden agradar aquests suggeriments:


Comparteix a BlueskyComparteix a FacebookComparteix a LinkedInComparteix a TumblrComparteix a XComparteix a LinkedInPin a Pinterest

Mikkel Christensen

Sobre l'autor

Mikkel Christensen
Mikkel és el creador i propietari de miklix.com. Té més de 20 anys d'experiència com a programador/desenvolupador de programari informàtic professional i actualment treballa a temps complet per a una gran corporació informàtica europea. Quan no fa blocs, dedica el seu temps lliure a una gran varietat d'interessos, aficions i activitats, que fins a cert punt es poden reflectir en la varietat de temes tractats en aquest lloc web.