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.
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.
{
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:
{
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:
- Identificarea clasei și a interogării documentului pentru serviciul AIF în Dynamics AX 2012
- Dynamics AX 2012 SysOperation Framework Prezentare generală rapidă
- Cum să repeți asupra elementelor unei enumerari din codul X++ în Dynamics AX 2012
