Miklix

Bel AIF-dokumentdienste direk vanaf X ++ in Dynamics AX 2012

Gepubliseer: 16 Februarie 2025 om 11:23:48 UTC
Laas opgedateer: 12 Januarie 2026 om 08:55:36 UTC

In hierdie artikel verduidelik ek hoe om Application Integration Framework-dokumentdienste in Dynamics AX 2012 direk vanaf X++-kode aan te roep, deur beide inkomende en uitgaande oproepe te emuleer, wat dit aansienlik makliker kan maak om foute in AIF-kode te vind en te ontfout.


Hierdie bladsy is masjienvertaal uit Engels om dit vir soveel mense moontlik toeganklik te maak. Ongelukkig is masjienvertaling nog nie 'n volmaakte tegnologie nie, dus kan foute voorkom. As jy verkies, kan jy die oorspronklike Engelse weergawe hier sien:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Die inligting in hierdie plasing is gebaseer op Dynamics AX 2012 R3. Dit mag dalk geldig wees vir ander weergawes, maar ook nie.

Ek het onlangs 'n kliënt gehelp om 'n Toepassingsintegrasieraamwerk (AIF) inkomende poort te implementeer vir die skep van kliënte gebaseer op data wat hulle van 'n ander stelsel ontvang het. Aangesien Dynamics AX reeds die CustCustomer-dokumentdiens verskaf, wat die logika hiervoor implementeer, het ons besluit om dit eenvoudig te hou en die standaardoplossing te gebruik.

Dit het egter gou geblyk dat daar baie probleme was om die eksterne stelsel XML te laat genereer wat Dynamics AX sou aanvaar. Die XML-skema wat deur Dynamics AX gegenereer word, is nogal kompleks en dit blyk ook dat daar 'n paar foute in Dynamics AX is wat soms veroorsaak dat dit XML verwerp wat skema-geldig is volgens ander gereedskap, so oor die algemeen het dit minder eenvoudig geblyk te wees as wat ek gedink het.

Tydens die poging het ek dikwels gesukkel om uit te vind wat presies die probleem met sekere XML-lêers was, omdat die foutboodskappe wat deur AIF verskaf word, minder insiggewend is. Dit was ook vervelig, want ek moes wag vir die eksterne stelsel om 'n nuwe boodskap oor MSMQ te stuur en dan weer vir AIF om die boodskap op te tel en te verwerk voordat ek 'n fout kon sien.

Ek het dus ondersoek ingestel of dit moontlik is om die dienskode direk met 'n plaaslike XML-lêer aan te roep vir ietwat vinniger toetsing en dit blyk dat dit is - en nie net dit nie, dit is regtig eenvoudig om te doen en verskaf eintlik baie meer betekenisvolle foutboodskappe.

Die voorbeeldtaak hieronder lees 'n plaaslike XML-lêer en probeer dit saam met die AxdCustomer-klas (wat die dokumentklas is wat deur die CustCustomer-diens gebruik word) gebruik om 'n kliënt te skep. Jy kan soortgelyke take vir al die ander dokumentklasse maak, byvoorbeeld AxdSalesOrder, indien nodig.

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

Die AifEntityKey-objek wat deur die customer.create()-metode teruggegee word (wat ooreenstem met die "create"-diensbewerking in AIF) bevat inligting oor watter kliënt geskep is, onder andere die RecId van die geskepte CustTable-rekord.

As jy eerder 'n Uitgaande poort wil toets, of as jy net 'n voorbeeld nodig het van hoe die XML op die Inkomende poort moet lyk, kan jy ook die dokumentklas gebruik om 'n kliënt na 'n lêer uit te voer deur die read()-metode (wat ooreenstem met die "lees"-diensbewerking) te gebruik, soos volg:

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

Jy moet natuurlik '123456' vervang met die rekeningnommer van die kliënt wat jy wil lees.

Verdere Leeswerk

As jy hierdie plasing geniet het, sal jy dalk ook van hierdie voorstelle hou:


Deel op BlueskyDeel op FacebookDeel op LinkedInDeel op TumblrDeel op XDeel op LinkedInSpeld op Pinterest

Mikkel Christensen

Oor die skrywer

Mikkel Christensen
Mikkel is die skepper en eienaar van miklix.com. Hy het meer as 20 jaar ondervinding as 'n professionele rekenaarprogrammeerder/sagteware-ontwikkelaar en is tans voltyds in diens van 'n groot Europese IT-korporasie. Wanneer hy nie blog nie, spandeer hy sy vrye tyd aan 'n groot verskeidenheid belangstellings, stokperdjies en aktiwiteite, wat tot 'n mate weerspieël kan word in die verskeidenheid onderwerpe wat op hierdie webwerf gedek word.