Dynamics AX 2012 में X++ से सीधे AIF दस्तावेज़ सेवाएँ कॉल करना
प्रकाशित: 16 फ़रवरी 2025 को 11:23:27 am UTC बजे
इस आलेख में, मैं समझाता हूँ कि Dynamics AX 2012 में एप्लीकेशन इंटीग्रेशन फ्रेमवर्क दस्तावेज़ सेवाओं को X++ कोड से सीधे कैसे कॉल किया जाए, इनबाउंड और आउटबाउंड दोनों कॉलों का अनुकरण कैसे किया जाए, जिससे AIF कोड में त्रुटियों को ढूंढना और डीबग करना काफी आसान हो जाता है।
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
इस पोस्ट में दी गई जानकारी Dynamics AX 2012 R3 पर आधारित है। यह अन्य संस्करणों के लिए मान्य हो भी सकती है और नहीं भी।
मैं हाल ही में एक ग्राहक को एप्लिकेशन इंटीग्रेशन फ्रेमवर्क (AIF) इनबाउंड पोर्ट लागू करने में मदद कर रहा था, ताकि वे किसी अन्य सिस्टम से प्राप्त डेटा के आधार पर ग्राहक बना सकें। चूंकि डायनेमिक्स AX पहले से ही CustCustomer दस्तावेज़ सेवा प्रदान करता है, जो इसके लिए तर्क को लागू करता है, इसलिए हमने इसे सरल रखने और मानक समाधान का उपयोग करने का निर्णय लिया।
हालाँकि, जल्द ही यह पता चला कि डायनेमिक्स AX द्वारा स्वीकार किए जाने वाले XML को उत्पन्न करने के लिए बाहरी सिस्टम को प्राप्त करने में बहुत सारी समस्याएँ थीं। डायनेमिक्स AX द्वारा उत्पन्न XML स्कीमा काफी जटिल है और ऐसा भी प्रतीत होता है कि डायनेमिक्स 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 में "create" सेवा ऑपरेशन के अनुरूप है) में अन्य बातों के अलावा, निर्मित 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' के स्थान पर उस ग्राहक का खाता नंबर लिखना चाहिए जिसे आप पढ़ना चाहते हैं।