Miklix

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

Հրապարակվել է՝ 16 փետրվարի, 2025 թ., 11:24:24 UTC
Վերջին թարմացումը՝ 12 հունվարի, 2026 թ., 08:55:37 UTC

Այս հոդվածում ես բացատրում եմ, թե ինչպես կանչել Dynamics AX 2012-ում Application Integration Framework փաստաթղթային ծառայությունները անմիջապես X++ կոդից՝ նմանակելով ինչպես մուտքային, այնպես էլ ելքային զանգերը, ինչը կարող է զգալիորեն հեշտացնել AIF կոդում սխալների որոնումը և վրիպազերծումը։


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

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

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

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

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

Աշխատանքի ընթացքում ես հաճախ դժվարանում էի հասկանալ, թե կոնկրետ ինչ խնդիր կար որոշակի 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');
}

Customer.create() մեթոդի կողմից վերադարձված AifEntityKey օբյեկտը (որը համապատասխանում է AIF-ում «ստեղծել» ծառայության գործողությանը) պարունակում է տեղեկատվություն այն մասին, թե որ հաճախորդն է ստեղծվել, ի թիվս այլ բաների՝ ստեղծված CustTable գրառման RecId-ը։

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

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 տարվա աշխատանքային փորձ՝ որպես պրոֆեսիոնալ համակարգչային ծրագրավորող/ծրագրային ապահովման մշակող և ներկայումս լրիվ դրույքով աշխատում է եվրոպական խոշոր ՏՏ կորպորացիայի մեջ: Երբ նա բլոգ չի գրում, նա իր ազատ ժամանակն անցկացնում է հետաքրքրությունների, հոբբիների և գործունեության լայն շրջանակի վրա, որոնք որոշ չափով կարող են արտացոլվել այս կայքում ընդգրկված թեմաների բազմազանության մեջ: