Dynamics AX २०१२ मा X++ बाट सिधै AIF कागजात सेवाहरू कल गर्दै
प्रकाशित: २०२५ फेब्रुअरी १६: ११:२५:२३ UTC
यस लेखमा, म Dynamics AX २०१२ मा अनुप्रयोग एकीकरण फ्रेमवर्क कागजात सेवाहरूलाई X++ कोडबाट सिधै कसरी कल गर्ने भनेर व्याख्या गर्छु, जसले इनबाउन्ड र आउटबाउन्ड कलहरू दुवैको अनुकरण गर्दछ, जसले AIF कोडमा त्रुटिहरू फेला पार्न र डिबग गर्न धेरै सजिलो बनाउन सक्छ।
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
यस पोस्टमा भएको जानकारी Dynamics AX २०१२ R3 मा आधारित छ। यो अन्य संस्करणहरूको लागि मान्य हुन पनि सक्छ वा नहुन पनि सक्छ।
म हालसालै एक ग्राहकलाई अर्को प्रणालीबाट प्राप्त गरिरहेको डेटाको आधारमा ग्राहकहरू सिर्जना गर्न एप्लिकेसन इन्टिग्रेसन फ्रेमवर्क (AIF) इनबाउन्ड पोर्ट कार्यान्वयन गर्न मद्दत गरिरहेको थिएँ। Dynamics AX ले पहिले नै CustCustomer कागजात सेवा प्रदान गर्दछ, जसले यसको लागि तर्क लागू गर्दछ, हामीले यसलाई सरल राख्ने र मानक समाधान प्रयोग गर्ने निर्णय गर्यौं।
यद्यपि, चाँडै नै यो पत्ता लाग्यो कि Dynamics AX ले स्वीकार गर्ने XML उत्पन्न गर्न बाह्य प्रणाली प्राप्त गर्न धेरै समस्याहरू थिए। Dynamics AX द्वारा उत्पन्न XML स्कीमा एकदम जटिल छ र यो पनि देखिन्छ कि Dynamics AX मा केही बगहरू छन् जसले कहिलेकाहीं यसलाई अन्य उपकरणहरू अनुसार स्कीमा-मान्य XML अस्वीकार गर्न बाध्य पार्छ, त्यसैले समग्रमा, यो मैले सोचेभन्दा कम सरल साबित भयो।
प्रयासको क्रममा, AIF द्वारा प्रदान गरिएका त्रुटि सन्देशहरू जानकारीमूलक भन्दा कम भएकाले केही XML फाइलहरूमा वास्तवमा के समस्या थियो भनेर पत्ता लगाउन म प्रायः संघर्ष गर्थें। यो पनि थकाइलाग्दो थियो, किनकि मलाई बाह्य प्रणालीले 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() विधि (जुन AIF मा "create" सेवा सञ्चालनसँग मेल खान्छ) द्वारा फिर्ता गरिएको AifEntityKey वस्तुमा सिर्जना गरिएको CustTable रेकर्डको RecId सहित कुन ग्राहक सिर्जना गरिएको थियो भन्ने बारे जानकारी समावेश हुन्छ।
यदि तपाईंले परीक्षण गर्न खोजिरहनुभएको कुरा आउटबाउन्ड पोर्ट हो वा तपाईंलाई इनबाउन्ड पोर्टमा XML कस्तो देखिनुपर्छ भन्ने उदाहरण चाहिन्छ भने, तपाईंले read() विधि ("read" सेवा सञ्चालनसँग सम्बन्धित) कल गरेर ग्राहकलाई फाइलमा निर्यात गर्न document class प्रयोग गर्न सक्नुहुन्छ, जस्तै:
{
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');
}
तपाईंले अवश्य पनि '१२३४५६' लाई तपाईंले पढ्न चाहनुभएको ग्राहकको खाता नम्बरले बदल्नुपर्छ।