Miklix

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.


Ezt az oldalt angolból gépi fordítással készítettük, hogy minél több ember számára elérhető legyen. Sajnos a gépi fordítás még nem tökéletes technológia, ezért előfordulhatnak hibák. Ha szeretné, itt megtekintheti az eredeti angol nyelvű változatot:

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.

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

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:

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

Természetesen az '123456' helyére az olvasni kívánt ügyfél számlaszámát kell írni.

Oszd meg a Bluesky-nOszd meg a FacebookonOszd meg a LinkedIn-enOszd meg a Tumblr-enOszd meg X-enOszd meg a LinkedIn-enPin a Pinteresten

Mikkel Bang Christensen

A szerzőről

Mikkel Bang Christensen
Mikkel a miklix.com létrehozója és tulajdonosa. Több mint 20 éves tapasztalattal rendelkezik, mint hivatásos számítógépes programozó/szoftverfejlesztő, és jelenleg teljes munkaidőben dolgozik egy nagy európai informatikai vállalatnál. Amikor nem blogol, szabadidejét érdeklődési körének, hobbijainak és tevékenységeinek széles skálájával tölti, ami bizonyos mértékig tükröződhet a weboldalon tárgyalt témák sokféleségében.