Klicanje dokumentnih storitev AIF neposredno iz X++ v Dynamics AX 2012
Objavljeno: 16. februar 2025 ob 11:23:14 dop. UTC
Nazadnje posodobljeno: 12. januar 2026 ob 8:55:23 dop. UTC
V tem članku pojasnjujem, kako v programu Dynamics AX 2012 neposredno iz kode X++ poklicati storitve dokumentov ogrodja za integracijo aplikacij, pri čemer se posnemajo tako vhodni kot odhodni klici, kar lahko bistveno olajša iskanje in odpravljanje napak v kodi AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informacije v tej objavi temeljijo na programu Dynamics AX 2012 R3. Morda veljajo za druge različice, morda pa tudi ne.
Pred kratkim sem stranki pomagal pri implementaciji vhodnega porta ogrodja za integracijo aplikacij (AIF) za ustvarjanje strank na podlagi podatkov, ki so jih prejemale iz drugega sistema. Ker Dynamics AX že ponuja storitev dokumentov CustCustomer, ki implementira logiko za to, smo se odločili, da bomo poenostavili in uporabili standardno rešitev.
Vendar se je kmalu izkazalo, da je bilo veliko težav pri ustvarjanju XML-a, ki bi ga Dynamics AX sprejel, s strani zunanjega sistema. Shema XML, ki jo je ustvaril Dynamics AX, je precej zapletena in zdi se, da je v Dynamics AX nekaj napak, zaradi katerih včasih zavrne XML, ki je po mnenju drugih orodij veljaven glede na shemo, zato se je na splošno izkazalo, da je manj preprosto, kot sem mislil.
Med poskusom sem se pogosto trudil ugotoviti, kaj točno je težava z določenimi datotekami XML, ker so sporočila o napakah, ki jih je posredoval AIF, manj informativna. Bilo je tudi dolgočasno, saj sem moral čakati, da zunanji sistem pošlje novo sporočilo prek MSMQ-ja, nato pa še enkrat, da ga AIF prevzame in obdela, preden sem lahko opazil napako.
Zato sem raziskal, ali je mogoče poklicati servisno kodo neposredno z lokalno datoteko XML za nekoliko hitrejše testiranje, in izkazalo se je, da je - in ne samo to, to je res preprosto in dejansko zagotavlja veliko bolj smiselna sporočila o napakah.
Spodnji primer opravila prebere lokalno datoteko XML in jo poskuša uporabiti z razredom AxdCustomer (ki je razred dokumentov, ki ga uporablja storitev CustCustomer) za ustvarjanje stranke. Po potrebi lahko ustvarite podobna opravila za vse druge razrede dokumentov, na primer AxdSalesOrder.
{
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');
}
Objekt AifEntityKey, ki ga vrne metoda customer.create() (ki ustreza operaciji storitve »create« v AIF), vsebuje informacije o tem, katera stranka je bila ustvarjena, med drugim tudi RecId ustvarjenega zapisa CustTable.
Če želite preizkusiti odhodna vrata ali če potrebujete le primer, kako naj bi XML izgledal na vhodnih vratih, lahko za izvoz stranke v datoteko uporabite tudi razred dokumentov, tako da pokličete metodo read() (ki ustreza operaciji storitve »read«), takole:
{
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');
}
Seveda morate '123456' zamenjati s številko računa stranke, ki jo želite prebrati.
Nadaljnje branje
Če vam je bila ta objava všeč, vam bodo morda všeč tudi ti predlogi:
- Pretvorite realno v niz z vsemi decimalkami v Dynamics AX 2012
- Kako ponoviti elemente enuma iz kode X++ v Dynamics AX 2012
- Uporaba poizvedbe v podatkovnem pogodbenem razredu SysOperation v Dynamics AX 2012
