Direktang pagtawag sa AIF Document Services mula sa X++ sa Dynamics AX 2012
Nai-publish: Marso 19, 2025 nang 9:35:27 PM UTC
Sa artikulong ito, ipinapaliwanag ko kung paano tumawag sa mga serbisyo ng dokumento ng Application Integration Framework sa Dynamics AX 2012 nang direkta mula sa X++ code, na tinutulad ang parehong mga papasok at papalabas na tawag, na maaaring gawing mas madali ang paghahanap at pag-debug ng mga error sa AIF code.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Ang impormasyon sa post na ito ay batay sa Dynamics AX 2012 R3. Maaaring hindi ito wasto para sa iba pang mga bersyon.
Kamakailan lamang, tinutulungan ko ang isang customer na mag-implementa ng Application Integration Framework (AIF) inbound port para sa paglikha ng mga customer batay sa data na kanilang natanggap mula sa ibang sistema. Dahil ang Dynamics AX ay mayroong CustCustomer document service, na nag-iimplementa ng lohika para dito, nagpasya kaming gawing simple at gamitin ang standard na solusyon.
Gayunpaman, mabilis na lumabas na maraming problema sa pagpapagawa ng XML mula sa external na sistema na tatanggapin ng Dynamics AX. Ang XML schema na ginawa ng Dynamics AX ay medyo kumplikado at tila may mga bug sa Dynamics AX na minsan ay nagiging sanhi upang tanggihan nito ang XML na ayon sa ibang mga tools ay valid sa schema, kaya sa kabuuan, napatunayan itong mas kumplikado kaysa sa inaasahan ko.
Habang ginagawa ko ito, madalas akong nahirapan na malaman kung ano ang eksaktong problema sa ilang XML files dahil ang mga error message na ibinibigay ng AIF ay hindi gaanong nakakatulong. Nakakapagod din ito, dahil kailangan ko pang maghintay na magpadala ang external na sistema ng bagong mensahe sa MSMQ at pagkatapos ay maghintay muli para ang AIF ay kunin ang mensahe at iproseso ito bago ko makita ang error.
Kaya't nagsagawa ako ng pagsusuri kung posible bang tawagan nang direkta ang service code gamit ang lokal na XML file para sa mas mabilis na pagsusuri, at lumabas na posible ito - at hindi lang iyon, napakasimple itong gawin at talagang nagbibigay ng mas makabuluhang mga error message.
Ang halimbawa ng trabaho sa ibaba ay nagbabasa ng lokal na XML file at sinusubukang gamitin ito sa AxdCustomer class (na siyang document class na ginagamit ng CustCustomer service) upang lumikha ng customer. Maaari ka ring gumawa ng mga katulad na trabaho para sa ibang document classes, tulad ng AxdSalesOrder, kung kinakailangan.
{
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');
}
Ang AifEntityKey object na ibinabalik ng customer.create() method (na tumutugma sa "create" service operation sa AIF) ay naglalaman ng impormasyon tungkol sa kung aling customer ang nalikha, kasama na ang RecId ng nilikhang CustTable record.
Kung ang sinusubukan mong i-test ay isang Outbound port sa halip, o kung kailangan mo lang ng halimbawa kung paano dapat magmukhang XML sa Inbound port, maaari mo ring gamitin ang document class upang i-export ang customer sa isang file sa halip sa pamamagitan ng pagtawag sa read() method (na tumutugma sa "read" service operation), tulad ng ganito:
{
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');
}
Dapat mong palitan siyempre ang '123456' ng account number ng customer na nais mong basahin.