დარეკვა 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, თუ გჭირდებათ.
{
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" სერვისის ოპერაციას) გამოძახებით, მაგალითად:
{
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' იმ მომხმარებლის ანგარიშის ნომრით, რომლის წაკითხვაც გსურთ.