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
Última actualització: 12 de gener del 2026, a les 8:55:44 UTC
En aquest article, explico com cridar els serveis de documents d'Application Integration Framework al Dynamics AX 2012 directament des del codi X++, emulant tant les trucades entrants com les sortints, cosa que pot facilitar significativament la cerca 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 el Dynamics AX 2012 R3. Pot ser vàlida o no per a altres versions.
Recentment, vaig ajudar un client a implementar un port d'entrada d'Application Integration Framework (AIF) per crear clients basats en dades que rebien d'un altre sistema. Com que Dynamics AX ja proporciona el servei de documents CustCustomer, que implementa la lògica per a això, vam decidir simplificar-ho i utilitzar la solució estàndard.
Tanmateix, aviat va resultar que hi havia molts problemes per aconseguir que el sistema extern generés XML que Dynamics AX acceptés. L'esquema XML generat per Dynamics AX és força complex i també sembla que hi ha alguns errors a Dynamics AX que de vegades fan que rebutgi XML que és vàlid per a l'esquema segons altres eines, així que, en general, va resultar ser menys simple del que pensava.
Durant l'esforç, sovint tenia dificultats per esbrinar quin era exactament el problema amb certs fitxers XML, ja que els missatges d'error proporcionats per AIF no eren gaire informatius. També era tediós, perquè havia d'esperar que el sistema extern enviés un missatge nou a través de MSMQ i, de nou, que AIF el recollissin i el processessin abans de poder veure un error.
Per tant, vaig investigar si és possible cridar el codi del servei directament amb un fitxer XML local per a proves una mica més ràpides i resulta que sí, i no només això, sinó que és realment senzill de fer i proporciona missatges d'error molt més significatius.
La tasca 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 tasques similars per a totes les altres classes de documents, per exemple AxdSalesOrder, si cal.
{
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 "create" a AIF) conté informació sobre quin client es va crear, entre altres coses el RecId del registre CustTable creat.
Si el que intenteu provar és un port de sortida o si només necessiteu un exemple de com hauria de ser l'XML al port d'entrada, també podeu utilitzar la classe document per exportar un client a un fitxer cridant el mètode read() (corresponent a l'operació de servei "read"), 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.
Lectures addicionals
Si t'ha agradat aquesta publicació, també et poden agradar aquests suggeriments:
- Ús d'una consulta en una classe de contracte de dades SysOperation al Dynamics AX 2012
- Converteix un real a cadena amb tots els decimals al Dynamics AX 2012
- Format de cadena amb macro i strFmt al Dynamics AX 2012
