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
Son yeniləmə: 12 yanvar 2026 at 08:55:42 UTC

Bu məqalədə, Dynamics AX 2012-də Tətbiq İnteqrasiyası Çərçivəsi sənəd xidmətlərinə birbaşa X++ kodundan necə zəng etməyi izah edirəm, həm daxil olan, həm də xaric olan zəngləri təqlid edir ki, bu da AIF kodundakı səhvləri tapmağı və düzəltməyi 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 ola bilər və ya olmaya da bilər.

Bu yaxınlarda bir müştəriyə başqa bir sistemdən aldıqları məlumatlara əsasən müştərilər yaratmaq üçün Tətbiq İnteqrasiyası Çərçivəsinin (AIF) daxilolma portunu tətbiq etməyə kömək edirdim. Dynamics AX artıq bunun məntiqini tətbiq edən CustCustomer sənəd xidmətini təqdim etdiyindən, onu sadə saxlamağa və standart həlldən istifadə etməyə qərar verdik.

Lakin tezliklə məlum oldu ki, xarici sistemin Dynamics AX-ın qəbul edəcəyi XML yaratmasında bir çox problem var. Dynamics AX tərəfindən yaradılan XML sxemi olduqca mürəkkəbdir və görünür ki, Dynamics AX-da bəzən digər alətlərə görə sxem baxımından etibarlı olan XML-i rədd etməsinə səbəb olan bir neçə səhv var, buna görə də ümumilikdə, düşündüyümdən daha az sadə oldu.

Bu iş zamanı AIF tərəfindən verilən səhv mesajları o qədər də məlumatverici olmadığı üçün müəyyən XML fayllarında problemin nə olduğunu anlamaqda çətinlik çəkirdim. Bu, həm də yorucu idi, çünki xarici sistemin MSMQ üzərindən yeni bir mesaj göndərməsini və sonra AIF-in mesajı götürüb emal etməsini gözləməli oldum, sonra isə səhv görməzdən əvvəl.

Buna görə də, daha sürətli test üçün xidmət kodunu birbaşa yerli XML faylı ilə çağırmağın mümkün olub-olmadığını araşdırdım və məlum oldu ki, bu mümkündür - və bununla yanaşı, bunu etmək çox asandır və əslində daha mənalı səhv mesajları təqdim edir.

Aşağıdakı nümunə işi yerli XML faylını oxuyur və müştəri yaratmaq üçün onu 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, məsələn, AxdSalesOrder üçün də oxşar işlər görə 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), digər məlumatlarla yanaşı, hansı customer-in yaradıldığı haqqında məlumatları, yaradılmış CustTable qeydinin RecId-ni ehtiva edir.

Əgər test etməyə çalışdığınız şey Outbound portudursa və ya sadəcə XML-in Inbound portunda necə görünməli olduğuna dair bir nümunəyə ehtiyacınız varsa, read() metodunu ("read" xidmət əməliyyatına uyğun olaraq) çağıraraq, klienti fayla ixrac etmək üçün document sinfindən də istifadə edə bilərsiniz:

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

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

Əlavə Oxu

Bu yazı xoşunuza gəldisə, bu təklifləri də bəyənə bilərsiniz:


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

Mikkel Christensen

Müəllif haqqında

Mikkel 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.