Miklix

Hringir beint í AIF Document Services frá X++ í Dynamics AX 2012

Birt: 19. mars 2025 kl. 21:35:21 UTC

Í þessari grein útskýri ég hvernig á að hringja í Application Integration Framework skjalaþjónustu í Dynamics AX 2012 beint úr X++ kóða, líkja eftir bæði inn- og útsímtölum, sem getur gert það verulega auðveldara að finna og villur í AIF kóða.


Þessi síða var vélþýdd úr ensku til að gera hana aðgengilega sem flestum. Því miður er vélþýðing ekki enn fullkomin tækni, svo villur geta komið upp. Ef þú vilt geturðu skoðað upprunalegu ensku útgáfuna hér:

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

Upplýsingarnar í þessari færslu byggja á Dynamics AX 2012 R3. Þær kunna að vera gildar fyrir aðrar útgáfur en einnig ómögulegt að gilda fyrir þær.

Ég var nýlega að hjálpa viðskiptavini að útfæra innleiðingarpórt fyrir Application Integration Framework (AIF) til að búa til viðskiptavini byggt á gögnum sem þeir voru að fá frá öðru kerfi. Þar sem Dynamics AX veitir þegar CustCustomer skjalþjónustuna, sem útfærir rökfræði þessa, ákváðum við að halda því einfalt og nota staðlaða lausnina.

Hins vegar kom fljótlega í ljós að það voru mörg vandamál með að fá ytra kerfið til að búa til XML sem Dynamics AX myndi samþykkja. XML-skemat sem Dynamics AX býr til er nokkuð flókið og það virðist einnig vera nokkur villur í Dynamics AX sem valda því að það hafnar XML sem er skema-gild samkvæmt öðrum tólum, svo alls staðar reynist það vera minna einfalt en ég hélt.

Á meðan á verkefninu stóð, átti ég oft í erfiðleikum með að komast að því hvað nákvæmlega var vandamálið með ákveðin XML-skjöl vegna þess að villuboðin sem AIF veitir eru ekki sérlega upplýsandi. Það var einnig þreytandi, þar sem ég þurfti að bíða eftir því að ytra kerfið sendi nýja skilaboð yfir MSMQ og síðan aftur eftir að AIF plukki upp skilaboðin og vinni úr þeim áður en ég gat séð villu.

Ég rannsakaði því hvort það væri mögulegt að kalla þjónustukóðann beint með staðbundnu XML-skrá til að prófa hraðar og það kom í ljós að það er mögulegt - og ekki bara það, það er mjög einfalt að gera það og veitir raunverulega miklu meira gagnleg villuboð.

Dæmi verkefnið hér að neðan les staðbundna XML-skrá og reynir að nota hana með AxdCustomer flokki (sem er skjalflokkurinn sem notaður er af CustCustomer þjónustunni) til að búa til viðskiptavin. Þú getur búið til svipuð verkefni fyrir alla aðra skjalflokka, til dæmis AxdSalesOrder, ef þú þarft.

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

AifEntityKey hlutinn sem fer aftur frá customer.create() aðferðinni (sem samsvarar "create" þjónustuaðgerðinni í AIF) inniheldur upplýsingar um hvaða viðskiptavinur var búinn til, þar á meðal RecId þess viðskiptavinar sem var búinn til í CustTable skrá.

Ef það sem þú ert að reyna að prófa er Outbound port í staðinn eða ef þú þarft bara dæmi um hvernig XML-ið á að líta út á Inbound portinu, getur þú einnig notað skjalflokkinn til að útfæra viðskiptavin í skrá í staðinn með því að kalla á read() aðferðina (sem samsvarar "read" þjónustuaðgerðinni) í staðinn, eins og hér:

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

Þú ættir auðvitað að skipta út '123456' fyrir reikningsnúmer viðskiptavinarins sem þú vilt lesa.

Deildu á BlueskyDeildu á FacebookDeildu á LinkedInDeildu á TumblrDeildu á XDeildu á LinkedInFestu á Pinterest

Mikkel Christensen

Um höfundinn

Mikkel Christensen
Mikkel er skapari og eigandi miklix.com. Hann hefur yfir 20 ára reynslu sem faglegur tölvuforritari/hugbúnaðarhönnuður og er nú í fullu starfi hjá stóru evrópsku upplýsingatæknifyrirtæki. Þegar hann er ekki að blogga eyðir hann frítíma sínum í margs konar áhugamál, áhugamál og athafnir, sem geta að einhverju leyti endurspeglast í margs konar efni sem fjallað er um á þessari vefsíðu.