Miklix

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.


Bu səhifə mümkün qədər çox insan üçün əlçatan olması üçün ingilis dilindən maşın tərcümə edilib. Təəssüf ki, maşın tərcüməsi hələ mükəmməl texnologiya deyil, ona görə də səhvlər baş verə bilər. İstəyirsinizsə, orijinal ingilis versiyasına buradan baxa bilərsiniz:

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.

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

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:

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

Siz əlbəttə ki, oxumaq istədiyiniz müştərinin hesab nömrəsi ilə '123456' əvəz etməlisiniz.

Bluesky-də paylaşınFacebookda paylaşLinkedIn-də paylaşınTumblr-da paylaşınX-də paylaşınLinkedIn-də paylaşınPinterest-də Pin

Mikkel Bang Christensen

Müəllif haqqında

Mikkel Bang Christensen
Mikkel miklix.com saytının yaradıcısı və sahibidir. O, peşəkar kompüter proqramçısı/proqram təminatı tərtibatçısı kimi 20 ildən artıq təcrübəyə malikdir və hazırda böyük Avropa İT korporasiyasında tam iş günü işləyir. Bloq yazmayanda o, boş vaxtını geniş çeşidli maraqlara, hobbilərə və fəaliyyətlərə sərf edir ki, bu da müəyyən dərəcədə bu veb-saytda əhatə olunan müxtəlif mövzularda əks oluna bilər.