Miklix

AIF փաստաթղթային ծառայությունների կանչը անմիջապես X++ -ից Դինամիկայում AX 2012

Հրապարակվել է՝ 16 փետրվարի, 2025 թ., 11:24:24 UTC

Այս հոդվածում ես բացատրում եմ, թե ինչպես կարելի է զանգահարել Application Integration Framework document services in Dynamics AX 2012 անմիջապես X++ կոդից, ընդօրինակելով եւ՛ ներհուն, եւ՛ դուրս գրված զանգերը, ինչը կարող է զգալիորեն հեշտացնել AIF կոդում գտնել եւ դեբյուգացնել սխալները:


Այս էջը ավտոմատ կերպով թարգմանվել է անգլերենից՝ հնարավորինս շատ մարդկանց համար հասանելի դարձնելու համար: Ցավոք, մեքենայական թարգմանությունը դեռ կատարելագործված տեխնոլոգիա չէ, ուստի կարող են սխալներ առաջանալ: Եթե ​​նախընտրում եք, կարող եք դիտել բնօրինակ անգլերեն տարբերակը այստեղ.

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

Այս պոստում տեղադրված տեղեկատվությունը հիմնված է Dynamics AX 2012 R3-ի վրա: Այն կարող է կամ չի կարող վավերական լինել այլ տարբերակների համար։

Վերջերս ես օգնում էի հաճախորդին իրականացնել Application Integration Framework (AIF) ներխմբային նավահանգիստ հաճախորդների ստեղծման համար, որոնք հիմնված էին այլ համակարգից ստացած տվյալների վրա: Քանի որ Dynamics AX-ն արդեն ապահովում է CustCustomer փաստաթղթային ծառայությունը, որն իրականացնում է դրա տրամաբանությունը, մենք որոշեցինք այն պարզ պահել եւ օգտագործել ստանդարտ լուծումը:

Սակայն շուտով պարզվեց, որ շատ խնդիրներ են առաջանում, որպեսզի արտաքին համակարգը ստեղծի XML, որը Dynamics AX-ը կընդունի: Dynamics AX-ի կողմից գեներացված XML schema-ը բավականին բարդ է եւ երեւում է նաեւ, որ Dynamics AX-ում քիչ են այն խայթոցները, որոնք երբեմն պատճառ են դառնում, որ այն մերժի XML-ը, որը schema-valid է ըստ այլ գործիքների, այնպես որ, ընդհանուր առմամբ, այն ապացուցվեց ավելի քիչ պարզ, քան ես էի կարծում:

Այդ ընթացքում ես հաճախ էի դժվարանում հասկանալ, թե կոնկրետ ինչ խնդիր կա որոշակի XML ֆայլերի հետ, քանի որ AIF-ի կողմից տրված սխալների հաղորդագրությունները ավելի քիչ են, քան տեղեկատվական։ Նաեւ հոգնեցուցիչ էր, քանի որ ես պետք է սպասեի, որ արտաքին համակարգը MSMQ-ի վրա նոր հաղորդագրություն ուղարկեր, իսկ հետո կրկին AIF-ը վերցներ հաղորդագրությունը եւ մշակեր այն, նախքան սխալ տեսնելը։

Հետեւաբար, ես հետազոտեցի, թե արդյոք հնարավոր է ծառայության կոդը ուղղակիորեն զանգահարել տեղական XML ֆայլով ինչ-որ չափով ավելի արագ ստուգման համար, եւ պարզվում է, որ դա - եւ ոչ միայն դա, դա իսկապես պարզ է անել եւ իրականում շատ ավելի իմաստալից սխալ հաղորդագրություններ է տալիս:

Ստորեւ բերված օրինակի աշխատանքը կարդում է տեղական XML ֆայլը եւ փորձում է այն օգտագործել AxdCustomer դասի հետ (որը հանդիսանում է փաստաթղթերի դասը, որն օգտագործվում է CustCustomer ծառայության կողմից) հաճախորդի ստեղծման համար: Դուք կարող եք կատարել նմանատիպ աշխատանքներ փաստաթղթերի մյուս բոլոր դասերի համար, օրինակ, AxdSalesOrder, եթե անհրաժեշտ է:

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 օբյեկտը, որը վերադարձվել է հաճախորդի կողմից.create() մեթոդով (որը համապատասխանում է AIF-ում «ստեղծել» ծառայության գործողությանը) պարունակում է տեղեկատվություն, թե որ հաճախորդին է ստեղծվել, ի թիվս այլ բաների, ստեղծված CustTable արձանագրության RecId-ը:

Եթե այն, ինչ դուք փորձում եք փորձարկել, փոխարենը Outbound պորտն է, կամ եթե ձեզ պարզապես անհրաժեշտ է օրինակ, թե ինչպես պետք է XML-ը տեսք ունենա Inbound նավահանգստում, ապա դուք կարող եք նաեւ փաստաթղթի դասի միջոցով հաճախորդին արտահանել ֆայլ՝ փոխարենը զանգահարելով ընթերցանության () մեթոդին (համապատասխանում է «կարդալ» ծառայության գործողությանը), ինչպես եւ այսպես.

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

Դուք, իհարկե, պետք է «123456» փոխարինեք այն հաճախորդի հաշվի համարով, որը ցանկանում եք կարդալ:

Կիսվեք Bluesky-ումԿիսվել Facebook-ումԿիսվեք LinkedIn-ումԿիսվեք Tumblr-ումԿիսվեք X-ումԿիսվեք LinkedIn-ումԿպցնել Պինթրեսթում

Միկել Բանգ Քրիստենսեն

Հեղինակի մասին

Միկել Բանգ Քրիստենսեն
Mikkel-ը miklix.com-ի ստեղծողն ու սեփականատերն է: Նա ունի ավելի քան 20 տարվա աշխատանքային փորձ՝ որպես պրոֆեսիոնալ համակարգչային ծրագրավորող/ծրագրային ապահովման մշակող և ներկայումս լրիվ դրույքով աշխատում է եվրոպական խոշոր ՏՏ կորպորացիայի մեջ: Երբ նա բլոգ չի գրում, նա իր ազատ ժամանակն անցկացնում է հետաքրքրությունների, հոբբիների և գործունեության լայն շրջանակի վրա, որոնք որոշ չափով կարող են արտացոլվել այս կայքում ընդգրկված թեմաների բազմազանության մեջ: