Miklix

დარეკვა AIF დოკუმენტის სერვისებზე პირდაპირ X++-დან Dynamics AX 2012-ში

გამოქვეყნებულია: 16 თებერვალი, 2025, 11:25:02 UTC

ამ სტატიაში მე ავხსნი, თუ როგორ გამოვიძახოთ Application Integration Framework დოკუმენტის სერვისები 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 უკვე გთავაზობთ კლიენტის დოკუმენტის სერვისს, რომელიც ახორციელებს ამის ლოგიკას, ჩვენ გადავწყვიტეთ შევინარჩუნოთ ეს მარტივი და გამოვიყენოთ სტანდარტული გადაწყვეტა.

თუმცა, მალევე გაირკვა, რომ ბევრი პრობლემა იყო გარე სისტემის მიერ XML-ის გენერირებისთვის, რომელსაც Dynamics AX მიიღებდა. 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-ს.

თუ ის, რის გამოც ცდილობთ, არის გამავალი პორტი, ან თუ უბრალოდ გჭირდებათ მაგალითი იმისა, თუ როგორ უნდა გამოიყურებოდეს XML შემომავალი პორტზე, ასევე შეგიძლიათ გამოიყენოთ დოკუმენტის კლასი კლიენტის ფაილში ექსპორტისთვის, ნაცვლად 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-ზეPinterest-ზე დამაგრება

მიკელ ბანგ კრისტენსენი

ავტორის შესახებ

მიკელ ბანგ კრისტენსენი
მაიკლ არის miklix.com-ის შემქმნელი და მფლობელი. მას აქვს 20 წელზე მეტი გამოცდილება, როგორც პროფესიონალი კომპიუტერული პროგრამისტი/პროგრამული უზრუნველყოფის შემქმნელი და ამჟამად მუშაობს სრულ განაკვეთზე დიდ ევროპულ IT კორპორაციაში. როდესაც ბლოგს არ წერს, თავისუფალ დროს ატარებს ინტერესების, ჰობიებისა და აქტივობების უზარმაზარ სპექტრზე, რაც შეიძლება გარკვეულწილად აისახოს ამ ვებსაიტზე გაშუქებულ თემებზე.