Dynamics AX 2012-də X++-dan birbaşa AIF Sənəd Xidmətlərinə zəng etmək
Nəşr olundu: 16 fevral 2025 at 11:26:00 UTC
Bu yazıda mən Dynamics AX 2012-də Application Integration Framework sənəd xidmətlərini birbaşa X++ kodundan necə çağırmağı izah edirəm, həm daxil olan, həm də gedən zəngləri təqlid edir, bu da AIF kodunda səhvləri tapmağı və aradan qaldırmağı xeyli asanlaşdıra bilər.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Bu yazıdakı məlumat Dynamics AX 2012 R3-ə əsaslanır. Digər versiyalar üçün keçərli və ya olmaya bilər.
Bu yaxınlarda mən müştəriyə başqa sistemdən aldıqları məlumatlar əsasında müştərilər yaratmaq üçün Tətbiq İnteqrasiya Çərçivəsinin (AIF) daxil olan portunu tətbiq etməyə kömək edirdim. Dynamics AX artıq bunun üçün məntiqi həyata keçirən CustCustomer sənəd xidmətini təqdim etdiyi üçün biz onu sadə saxlamaq və standart həlldən istifadə etmək qərarına gəldik.
Bununla belə, tezliklə məlum oldu ki, Dynamics AX-ın qəbul edəcəyi XML yaratmaq üçün xarici sistemin əldə edilməsində çoxlu problemlər var. Dynamics AX tərəfindən yaradılan XML sxemi olduqca mürəkkəbdir və görünür, Dynamics AX-da bəzi səhvlər var ki, bu da bəzən digər alətlərə görə sxemə uyğun olan XML-i rədd etməyə səbəb olur, buna görə də ümumilikdə onun düşündüyümdən daha az sadə olduğunu sübut etdi.
Tədqiqat zamanı mən tez-tez müəyyən XML fayllarında problemin nə olduğunu anlamaqda çətinlik çəkirdim, çünki AIF tərəfindən verilən səhv mesajları informativ deyil. Bu, həm də yorucu idi, çünki mən xarici sistemin MSMQ üzərindən yeni mesaj göndərməsini və daha sonra AIF-in mesajı götürməsini və səhvi görməzdən əvvəl onu emal etməsini gözləməli oldum.
Buna görə də, bir qədər daha sürətli sınaq üçün yerli XML faylı ilə birbaşa xidmət koduna zəng vurmağın mümkün olub-olmadığını araşdırdım və məlum oldu ki, bu, sadəcə olaraq deyil, bunu etmək həqiqətən sadədir və əslində daha çox mənalı səhv mesajları təqdim edir.
Aşağıdakı nümunə iş yerli XML faylını oxuyur və müştəri yaratmaq üçün ondan AxdCustomer sinfi (CustCustomer xidməti tərəfindən istifadə edilən sənəd sinfi) ilə istifadə etməyə çalışır. Lazım gələrsə, bütün digər sənəd sinifləri üçün, məsələn, AxdSalesOrder üçün oxşar işləri edə bilərsiniz.
{
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');
}
Customer.create() metodu ilə qaytarılan AifEntityKey obyekti (AIF-də "yarat" xidmət əməliyyatına uyğundur) başqa şeylər arasında yaradılmış CustTable qeydinin RecId-i ilə yanaşı, hansı müştərinin yaradıldığı haqqında məlumatı ehtiva edir.
Əgər sınamağa çalışdığınız şey əvəzinə Çıxış portudursa və ya sadəcə XML-in Gələn portda necə görünməsi nümunəsinə ehtiyacınız varsa, siz həmçinin müştərini fayla ixrac etmək üçün read() metodunu ("oxumaq" xidmət əməliyyatına uyğun) çağıraraq sənəd sinifindən istifadə edə bilərsiniz, məsələn:
{
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');
}
Siz əlbəttə ki, oxumaq istədiyiniz müştərinin hesab nömrəsi ilə '123456' əvəz etməlisiniz.