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

En aquest article, explico com trucar als serveis de documents d'Application Integration Framework al Dynamics AX 2012 directament des del codi X++, emulant les trucades entrants i sortints, cosa que pot facilitar molt la recerca 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 Dynamics AX 2012 R3. Pot ser vàlid o no per a altres versions.

Recentment vaig estar ajudant un client a implementar un port d'entrada del marc d'integració d'aplicacions (AIF) per crear clients basats en les dades que rebien d'un altre sistema. Com que Dynamics AX ja ofereix el servei de documentació CustCustomer, que implementa la lògica d'això, vam decidir mantenir-lo senzill i utilitzar la solució estàndard.

Tanmateix, aviat va resultar que hi havia molts problemes per aconseguir que el sistema extern generi XML que Dynamics AX acceptaria. L'esquema XML generat per Dynamics AX és força complex i també sembla que hi ha pocs errors a Dynamics AX que de vegades fan que rebutgi XML que és vàlid per a l'esquema segons altres eines, de manera que, en definitiva, va resultar ser menys senzill del que havia pensat.

Durant l'esforç, sovint em va costar esbrinar quin era exactament el problema amb determinats fitxers XML perquè els missatges d'error proporcionats per AIF no són informatius. També va ser tediós, perquè vaig haver d'esperar que el sistema extern enviés un missatge nou a través de MSMQ i després que AIF recollis el missatge i el processés abans que pogués veure un error.

Per tant, vaig investigar si és possible trucar al codi de servei directament amb un fitxer XML local per fer proves una mica més ràpides i va resultar que ho és, i no només això, és molt senzill de fer i en realitat proporciona missatges d'error molt més significatius.

El treball 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 treballs similars per a totes les altres classes de documents, per exemple AxdSalesOrder, si ho necessiteu.

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 "crear" a AIF) conté informació sobre quin client es va crear, entre altres coses, el RecId del registre CustTable creat.

Si el que esteu intentant provar és un port de sortida o només necessiteu un exemple de com hauria de ser l'XML al port d'entrada, també podeu utilitzar la classe de document per exportar un client a un fitxer cridant al mètode read() (corresponent a l'operació de servei "llegir"), 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.

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

Mikkel Bang Christensen

Sobre l'autor

Mikkel Bang 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.