Apelarea serviciilor de documente AIF direct de la X++ în Dynamics AX 2012
Publicat: 16 februarie 2025 la 11:23:12 UTC
În acest articol, explic cum să apelați 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.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informațiile din această postare se bazează pe Dynamics AX 2012 R3. Poate fi valabil sau nu pentru alte versiuni.
Recent, am ajutat un client să implementeze un port de intrare în cadrul Application Integration Framework (AIF) pentru a crea clienți pe baza datelor pe care le primeau de la alt sistem. Întrucât Dynamics AX oferă deja serviciul de documente CustCustomer, care implementează logica acestui lucru, am decis să păstrăm totul simplu și să folosim soluția standard.
Cu toate acestea, s-a dovedit curând că au existat o mulțime de probleme ca sistemul extern să genereze XML pe care Dynamics AX l-ar accepta. Schema XML generată de Dynamics AX este una destul de complexă și, de asemenea, se pare că există puține erori în Dynamics AX care uneori îl determină să respingă XML care este schema-valid conform altor instrumente, așa că, per total, sa dovedit a fi mai puțin simplu decât credeam.
În timpul demersului, m-am chinuit adesea să-mi dau seama care era exact problema cu anumite fișiere XML, deoarece mesajele de eroare furnizate de AIF sunt mai puțin informative. A fost, de asemenea, plictisitor, pentru că a trebuit să aștept ca sistemul extern să trimită un nou mesaj prin MSMQ și apoi din nou ca AIF să preia mesajul și să-l proceseze înainte de a vedea o eroare.
Prin urmare, am investigat dacă este posibil să apelați codul de serviciu direct cu un fișier XML local pentru o testare oarecum mai rapidă și s-a dovedit că este - și nu numai asta, este foarte simplu de făcut și oferă de fapt mesaje de eroare mult mai semnificative.
Exemplul de lucru de mai jos citește un fișier XML local și încearcă să îl folosească cu clasa AxdCustomer (care este clasa de document folosită de serviciul CustCustomer) pentru a crea un client. Puteți realiza lucrări similare pentru toate celelalte clase de documente, de exemplu AxdSalesOrder, dacă aveți nevoie.
{
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 care client a fost 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 pe portul de intrare, puteți utiliza, de asemenea, clasa de document pentru a exporta un client într-un fișier, apelând metoda read() (care corespunde operațiunii de serviciu „citire”), astfel:
{
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');
}
Desigur, ar trebui să înlocuiți „123456” cu numărul de cont al clientului pe care doriți să-l citiți.