Miklix

AIF dokumentu pakalpojumu zvanīšana tieši no X++ programmā Dynamics AX 2012

Publicēts: 2025. gada 16. februāris 11:23:05 UTC

Šajā rakstā es paskaidrošu, kā Dynamics AX 2012 izsaukt lietojumprogrammu integrācijas ietvara dokumentu pakalpojumus tieši no X++ koda, emulējot gan ienākošos, gan izejošos zvanus, kas var ievērojami atvieglot kļūdu atrašanu un atkļūdošanu AIF kodā.


Šī lapa tika mašīntulkota no angļu valodas, lai padarītu to pieejamu pēc iespējas vairāk cilvēkiem. Diemžēl mašīntulkošana vēl nav pilnīga tehnoloģija, tāpēc tajā var rasties kļūdas. Ja vēlaties, oriģinālo versiju angļu valodā varat apskatīt šeit:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Šajā ziņā sniegtā informācija ir balstīta uz Dynamics AX 2012 R3. Tas var būt un var nebūt derīgs citām versijām.

Es nesen palīdzēju klientam ieviest lietojumprogrammu integrācijas sistēmas (AIF) ienākošo portu, lai izveidotu klientus, pamatojoties uz datiem, ko viņi saņēma no citas sistēmas. Tā kā Dynamics AX jau nodrošina dokumentu pakalpojumu CustCustomer, kas ievieš šī loģiku, mēs nolēmām to saglabāt vienkāršu un izmantot standarta risinājumu.

Tomēr drīz vien izrādījās, ka radās daudz problēmu, liekot ārējai sistēmai ģenerēt XML, ko Dynamics AX pieņemtu. Dynamics AX ģenerētā XML shēma ir diezgan sarežģīta, un šķiet, ka programmā Dynamics AX ir dažas kļūdas, kuru dēļ tas dažreiz noraida XML, kas ir derīgs saskaņā ar citiem rīkiem, tāpēc kopumā tā izrādījās mazāk vienkārša, nekā es domāju.

Pasākuma laikā es bieži centos noskaidrot, kāda tieši ir problēma ar noteiktiem XML failiem, jo ​​AIF sniegtie kļūdu ziņojumi nav tik informatīvi. Tas bija arī nogurdinoši, jo man bija jāgaida, līdz ārējā sistēma nosūtīs jaunu ziņojumu, izmantojot MSMQ, un pēc tam vēlreiz, kamēr AIF paņems ziņojumu un apstrādās to, pirms es redzēju kļūdu.

Tāpēc es izpētīju, vai ir iespējams izsaukt pakalpojuma kodu tieši ar vietējo XML failu, lai veiktu ātrāku testēšanu, un izrādījās, ka tas tā ir – un ne tikai, tas ir patiešām vienkārši izdarāms un faktiski sniedz daudz jēgpilnākus kļūdu ziņojumus.

Tālāk sniegtajā darba piemērā tiek nolasīts lokālais XML fails un mēģināts to izmantot kopā ar AxdCustomer klasi (kas ir pakalpojuma CustCustomer izmantotā dokumentu klase), lai izveidotu klientu. Ja nepieciešams, varat veikt līdzīgus darbus visām pārējām dokumentu klasēm, piemēram, AxdSalesOrder.

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

AifEntityKey objekts, ko atgriež metode customer.create() (kas atbilst pakalpojuma "izveidot" darbībai AIF), satur informāciju par to, kurš klients tika izveidots, cita starpā izveidotā CustTable ieraksta RecId.

Ja tā vietā mēģināt pārbaudīt izejošo portu vai vienkārši nepieciešams piemērs tam, kā XML vajadzētu izskatīties ienākošajā portā, varat arī izmantot dokumenta klasi, lai eksportētu klientu uz failu, tā vietā izsaucot metodi read() (kas atbilst pakalpojuma "lasīšanas" darbībai), piemēram:

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

Protams, jums jāaizstāj "123456" ar tā klienta konta numuru, kuru vēlaties lasīt.

Kopīgojiet pakalpojumā BlueskyKopīgot FacebookKopīgojiet vietnē LinkedInKopīgojiet vietnē TumblrKopīgot vietnē XKopīgojiet vietnē LinkedInPiespraust vietnē Pinterest

Mikkel Bang Christensen

Par autoru

Mikkel Bang Christensen
Mikels ir miklix.com radītājs un īpašnieks. Viņam ir vairāk nekā 20 gadu pieredze kā profesionālam programmētājam/programmatūras izstrādātājam, un pašlaik viņš strādā pilna laika darbu lielā Eiropas IT korporācijā. Kad viņš neraksta blogus, viņš pavada brīvo laiku, pievēršoties dažādām interesēm, hobijiem un aktivitātēm, kas zināmā mērā var atspoguļoties šajā tīmekļa vietnē aplūkoto tēmu daudzveidībā.