Klicanje dokumentnih storitev AIF neposredno iz X++ v Dynamics AX 2012
Objavljeno: 16. februar 2025 ob 11:23:14 dop. UTC
V tem članku razlagam, kako poklicati storitve dokumentov Application Integration Framework v Dynamics AX 2012 neposredno iz kode X++, pri čemer posnemam vhodne in odhodne klice, 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 Dynamics AX 2012 R3. Lahko velja ali ne velja za druge različice.
Pred kratkim sem stranki pomagal implementirati vhodna vrata Application Integration Framework (AIF) za ustvarjanje strank na podlagi podatkov, ki so jih prejemali iz drugega sistema. Ker Dynamics AX že ponuja dokumentno storitev CustCustomer, ki implementira logiko za to, smo se odločili, da ostane preprosta in uporabimo standardno rešitev.
Vendar se je kmalu izkazalo, da je veliko težav, da bi zunanji sistem ustvaril XML, ki bi ga Dynamics AX sprejel. Shema XML, ki jo ustvari Dynamics AX, je precej zapletena in zdi se tudi, da je v Dynamics AX malo napak, zaradi katerih včasih zavrne XML, ki je shema veljaven glede na druga orodja, tako da se je vse skupaj izkazalo za manj preprosto, kot sem mislil.
Med prizadevanjem sem se pogosto trudil ugotoviti, v čem je natančna težava z določenimi datotekami XML, ker sporočila o napakah, ki jih ponuja AIF, niso dovolj informativna. Bilo je tudi dolgočasno, ker sem moral počakati, da je zunanji sistem poslal novo sporočilo prek MSMQ, nato pa znova, da je AIF prevzel sporočilo in ga obdelal, preden sem videl napako.
Zato sem raziskal, ali je mogoče storitveno kodo priklicati neposredno z lokalno datoteko XML za nekoliko hitrejše testiranje in izkazalo se je, da je – in ne samo to, to je zelo preprosto narediti 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 dokumenta, ki ga uporablja storitev CustCustomer) za ustvarjanje stranke. Podobna opravila lahko naredite za vse druge razrede dokumentov, na primer AxdSalesOrder, če jih potrebujete.
{
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 RecId ustvarjenega zapisa CustTable.
Če namesto tega poskušate preizkusiti izhodna vrata ali če samo potrebujete primer, kako bi moral izgledati XML na vhodnih vratih, lahko uporabite tudi razred dokumenta za izvoz stranke v datoteko, tako da namesto tega pokličete metodo read() (ki ustreza operaciji storitve »branje«), 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 brati.