Miklix

Apelarea serviciilor de documente AIF direct de la X++ în Dynamics AX 2012

Publicat: 16 februarie 2025 la 11:23:12 UTC
Ultima actualizare: 12 ianuarie 2026 la 08:55:22 UTC

În acest articol, explic cum se apelează serviciile de documente Application Integration Framework în Dynamics AX 2012 direct din codul X++, emulând atât apelurile de intrare, cât și cele de ieșire, ceea ce poate facilita semnificativ găsirea și depanarea erorilor în codul AIF.


Această pagină a fost tradusă automat din limba engleză pentru a o face accesibilă cât mai multor persoane. Din păcate, traducerea automată nu este încă o tehnologie perfecționată, astfel încât pot apărea erori. Dacă preferați, puteți vizualiza versiunea originală în limba engleză aici:

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

Informațiile din această postare se bazează pe Dynamics AX 2012 R3. Este posibil să fie sau nu valabile pentru alte versiuni.

Recent, am ajutat un client să implementeze un port de intrare Application Integration Framework (AIF) pentru crearea de clienți pe baza datelor pe care le primeau de la un alt sistem. Întrucât Dynamics AX oferă deja serviciul de documente CustCustomer, care implementează logica pentru acest lucru, am decis să păstrăm lucrurile simple și să folosim soluția standard.

Totuși, s-a dovedit curând că existau o mulțime de probleme în a face sistemul extern să genereze XML acceptabil de Dynamics AX. Schema XML generată de Dynamics AX este una destul de complexă și, de asemenea, se pare că există câteva erori în Dynamics AX care uneori îl determină să respingă XML care este valid ca schemă conform altor instrumente, așa că, per total, s-a dovedit a fi mai puțin simplu decât credeam.

În timpul demersului, am avut adesea dificultăți în a identifica exact problema cu anumite fișiere XML, deoarece mesajele de eroare furnizate de AIF sunt mai puțin informative. De asemenea, a fost plictisitor, deoarece trebuia să aștept ca sistemul extern să trimită un mesaj nou prin MSMQ și apoi din nou ca AIF să preia mesajul și să îl proceseze înainte de a putea observa o eroare.

Prin urmare, am investigat dacă este posibil să apelez codul serviciului direct cu un fișier XML local pentru o testare ceva mai rapidă și s-a dovedit că este - și nu numai atât, este foarte simplu de făcut și oferă de fapt mesaje de eroare mult mai semnificative.

Exemplul de job de mai jos citește un fișier XML local și încearcă să îl utilizeze împreună cu clasa AxdCustomer (care este clasa de documente utilizată de serviciul CustCustomer) pentru a crea un client. Puteți crea joburi similare pentru toate celelalte clase de documente, de exemplu AxdSalesOrder, dacă este nevoie.

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

Obiectul AifEntityKey returnat de metoda customer.create() (care corespunde operațiunii de serviciu „create” din AIF) conține informații despre clientul creat, printre altele RecId-ul înregistrării CustTable create.

Dacă ceea ce încercați să testați este un port de ieșire sau dacă aveți nevoie doar de un exemplu despre cum ar trebui să arate XML-ul pe portul de intrare, puteți utiliza și clasa document pentru a exporta un client într-un fișier, apelând metoda read() (corespunzătoare operațiunii de serviciu „read”), astfel:

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

Bineînțeles, ar trebui să înlocuiți „123456” cu numărul de cont al clientului pe care doriți să îl citiți.

Lectură suplimentară

Dacă ți-a plăcut această postare, s-ar putea să-ți placă și aceste sugestii:


Distribuie pe BlueskyDistribuie pe FacebookDistribuie pe LinkedInDistribuie pe TumblrDistribuie pe XDistribuie pe LinkedInPin pe Pinterest

Mikkel Christensen

Despre autor

Mikkel Christensen
Mikkel este creatorul și proprietarul miklix.com. El are peste 20 de ani de experiență ca programator de calculatoare/dezvoltator software profesionist și este în prezent angajat cu normă întreagă pentru o mare corporație europeană de IT. Atunci când nu scrie pe blog, își petrece timpul liber cu o gamă largă de interese, hobby-uri și activități, care se pot reflecta într-o anumită măsură în varietatea de subiecte abordate pe acest site.