Az AIF-dokumentumszolgáltatások közvetlen hívása az X++-ból a Dynamics AX 2012-ben
Megjelent: 2025. február 16. 11:22:59 UTC
Ebben a cikkben elmagyarázom, hogyan hívhatja meg az Application Integration Framework dokumentumszolgáltatásokat a Dynamics AX 2012-ben közvetlenül az X++ kódból, emulálva mind a bejövő, mind a kimenő hívásokat, ami jelentősen megkönnyítheti az AIF-kód hibáinak megtalálását és hibakeresését.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
A bejegyzésben található információk a Dynamics AX 2012 R3-on alapulnak. Lehet, hogy más verziókra érvényes, de lehet, hogy nem.
Nemrég segítettem egy ügyfélnek egy Application Integration Framework (AIF) bejövő port bevezetésében, amellyel ügyfeleket hozhat létre egy másik rendszertől kapott adatok alapján. Mivel a Dynamics AX már biztosítja az ehhez szükséges logikát megvalósító CustCustomer dokumentumszolgáltatást, ezért úgy döntöttünk, hogy megtartjuk az egyszerűséget, és a szabványos megoldást használjuk.
Hamar kiderült azonban, hogy sok probléma merült fel azzal, hogy a külső rendszer olyan XML-t generáljon, amelyet a Dynamics AX elfogad. A Dynamics AX által generált XML-séma meglehetősen összetett, és úgy tűnik, hogy a Dynamics AX-ben kevés olyan hiba található, amelyek miatt néha elutasítja a más eszközök szerint séma-érvényes XML-t, így összességében kevésbé egyszerűnek bizonyult, mint gondoltam.
A próbálkozás során gyakran küszködtem, hogy rájöjjek, hogy pontosan mi a probléma bizonyos XML-fájlokkal, mert az AIF által biztosított hibaüzenetek kevésbé informatívak. Ez is fárasztó volt, mert meg kellett várnom, hogy a külső rendszer új üzenetet küldjön az MSMQ-n keresztül, majd ismét az AIF-re, hogy felvegye és feldolgozza az üzenetet, mielőtt hibát látnék.
Ezért megvizsgáltam, hogy lehetséges-e a szervizkódot közvetlenül hívni egy helyi XML-fájllal a valamivel gyorsabb tesztelés érdekében, és kiderült, hogy igen - és nem csak ez, nagyon egyszerű megtenni, és valójában sokkal értelmesebb hibaüzeneteket ad.
Az alábbi példafeladat beolvas egy helyi XML-fájlt, és az AxdCustomer osztállyal (amely a CustCustomer szolgáltatás által használt dokumentumosztály) próbálja meg használni az ügyfél létrehozásához. Ha szükséges, készíthet hasonló feladatokat az összes többi dokumentumosztályhoz, például az AxdSalesOrderhez.
{
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');
}
A customer.create() metódus által visszaadott AifEntityKey objektum (amely az AIF-ben a "create" szolgáltatási műveletnek felel meg) információkat tartalmaz arról, hogy melyik ügyfél jött létre, többek között a létrehozott CustTable rekord RecID-jét.
Ha inkább egy kimenő portot próbál tesztelni, vagy ha csak egy példára van szüksége arra, hogy az XML hogyan nézzen ki a bejövő porton, akkor a dokumentumosztály segítségével is exportálhatja az ügyfelet fájlba a read() metódus meghívásával (amely a "read" szolgáltatási műveletnek felel meg), például így:
{
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');
}
Természetesen az '123456' helyére az olvasni kívánt ügyfél számlaszámát kell írni.