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
Utolsó frissítés: 2026. január 12. 8:55:15 UTC

Ebben a cikkben elmagyarázom, hogyan hívhatók meg az Application Integration Framework dokumentumszolgáltatásai a Dynamics AX 2012-ben közvetlenül az X++ kódból, mind a bejövő, mind a kimenő hívásokat emulálva, 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 verzión alapulnak. Előfordulhat, hogy más verziókra nem érvényesek.

Nemrég segítettem egy ügyfélnek egy alkalmazásintegrációs keretrendszer (AIF) bejövő portjának megvalósításában, amely egy másik rendszerből kapott adatok alapján hozhat létre ügyfeleket. Mivel a Dynamics AX már biztosítja a CustCustomer dokumentumszolgáltatást, amely megvalósítja ennek a logikáját, úgy döntöttünk, hogy egyszerűen kezeljük a dolgot, és a standard megoldást használjuk.

Azonban hamarosan kiderült, hogy sok probléma van 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 van néhány hiba, 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.

Próbálkozás során gyakran nehezen tudtam kitalálni, hogy pontosan mi is a probléma bizonyos XML fájlokkal, mivel az AIF által küldött hibaüzenetek nem túl informatívak. Fárasztó is volt, mert meg kellett várnom, hogy a külső rendszer küldjön egy új üzenetet MSMQ-n keresztül, majd ismét, hogy az AIF fogadja és feldolgozza az üzenetet, mielőtt hibát látnék.

Ezért megvizsgáltam, hogy lehetséges-e a szolgáltatáskódot közvetlenül egy helyi XML fájllal meghívni a gyorsabb tesztelés érdekében, és kiderült, hogy igen – és nem csak ez, nagyon egyszerűen megtehető, és valójában sokkal értelmesebb hibaüzeneteket ad.

Az alábbi példafeladat egy helyi XML fájlt olvas be, és megpróbálja azt az AxdCustomer osztállyal (amelyet a CustCustomer szolgáltatás használ) felhasználni egy ügyfél létrehozásához. Hasonló feladatokat hozhat létre az összes többi dokumentumosztályhoz, például az AxdSalesOrderhez, ha szükséges.

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

Customer.create() metódus által visszaadott AifEntityKey objektum (amely az AIF „create” szolgáltatásműveletének 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 ehelyett egy kimenő portot próbálsz tesztelni, vagy csak egy példára van szükséged arra, hogy hogyan kellene kinéznie az XML-nek a bejövő porton, akkor a document osztályt is használhatod az ügyfél fájlba exportálására a read() metódus meghívásával (ami a "read" szolgáltatásműveletnek felel meg), í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” számot annak az ügyfélnek a számlaszámával kell helyettesítenie, akit le szeretne olvasni.

További olvasmányok

Ha tetszett ez a bejegyzés, akkor ezek a javaslatok is érdekelhetik:


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 Christensen

A szerzőről

Mikkel 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.