Miklix

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

გამოქვეყნებულია: 16 თებერვალი, 2025, 11:25:02 UTC
ბოლო განახლება: 12 იანვარი, 2026, 08:55:39 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-ის მიერ მოწოდებული შეცდომის შეტყობინებები არასაკმარისად ინფორმაციულია. ეს ასევე დამღლელი იყო, რადგან შეცდომის დანახვამდე გარე სისტემის მიერ ახალი შეტყობინების გაგზავნას და შემდეგ 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-ში „create“ სერვისის ოპერაციას) შეიცავს ინფორმაციას იმის შესახებ, თუ რომელი მომხმარებელი შეიქმნა, სხვა საკითხებთან ერთად, შექმნილი CustTable ჩანაწერის RecId-საც.

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

მიკელ კრისტენსენი

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

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