Trucant a AIF Document Services directament des de X++ a Dynamics AX 2012
Publicat: 5 de març del 2025, a les 19:29:29 UTC
En aquest article, explico com trucar als serveis de documents d'Application Integration Framework al Dynamics AX 2012 directament des del codi X++, emulant les trucades entrants i sortints, cosa que pot facilitar molt la recerca i la depuració d'errors al codi AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
La informació d'aquesta publicació es basa en Dynamics AX 2012 R3. Pot ser vàlid o no per a altres versions.
Recentment vaig estar ajudant un client a implementar un port d'entrada del marc d'integració d'aplicacions (AIF) per crear clients basats en les dades que rebien d'un altre sistema. Com que Dynamics AX ja ofereix el servei de documentació CustCustomer, que implementa la lògica d'això, vam decidir mantenir-lo senzill i utilitzar la solució estàndard.
Tanmateix, aviat va resultar que hi havia molts problemes per aconseguir que el sistema extern generi XML que Dynamics AX acceptaria. L'esquema XML generat per Dynamics AX és força complex i també sembla que hi ha pocs errors a Dynamics AX que de vegades fan que rebutgi XML que és vàlid per a l'esquema segons altres eines, de manera que, en definitiva, va resultar ser menys senzill del que havia pensat.
Durant l'esforç, sovint em va costar esbrinar quin era exactament el problema amb determinats fitxers XML perquè els missatges d'error proporcionats per AIF no són informatius. També va ser tediós, perquè vaig haver d'esperar que el sistema extern enviés un missatge nou a través de MSMQ i després que AIF recollis el missatge i el processés abans que pogués veure un error.
Per tant, vaig investigar si és possible trucar al codi de servei directament amb un fitxer XML local per fer proves una mica més ràpides i va resultar que ho és, i no només això, és molt senzill de fer i en realitat proporciona missatges d'error molt més significatius.
El treball d'exemple següent llegeix un fitxer XML local i intenta utilitzar-lo amb la classe AxdCustomer (que és la classe de document utilitzada pel servei CustCustomer) per crear un client. Podeu fer treballs similars per a totes les altres classes de documents, per exemple AxdSalesOrder, si ho necessiteu.
{
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');
}
L'objecte AifEntityKey retornat pel mètode customer.create() (que correspon a l'operació de servei "crear" a AIF) conté informació sobre quin client es va crear, entre altres coses, el RecId del registre CustTable creat.
Si el que esteu intentant provar és un port de sortida o només necessiteu un exemple de com hauria de ser l'XML al port d'entrada, també podeu utilitzar la classe de document per exportar un client a un fitxer cridant al mètode read() (corresponent a l'operació de servei "llegir"), així:
{
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');
}
Per descomptat, hauríeu de substituir "123456" pel número de compte del client que voleu llegir.