Miklix

Dynamics AX 2012 में X++ से सीधे AIF दस्तावेज़ सेवाएँ कॉल करना

प्रकाशित: 16 फ़रवरी 2025 को 11:23:27 am UTC बजे
आखरी अपडेट: 12 जनवरी 2026 को 8:55:27 am UTC बजे

इस आर्टिकल में, मैं समझाता हूँ कि Dynamics AX 2012 में X++ कोड से सीधे Application Integration Framework डॉक्यूमेंट सर्विस को कैसे कॉल करें, इनबाउंड और आउटबाउंड दोनों कॉल को एम्युलेट करके, जिससे AIF कोड में एरर को ढूंढना और डीबग करना काफी आसान हो सकता है।


इस पृष्ठ को अंग्रेजी से मशीन द्वारा अनुवादित किया गया है ताकि इसे अधिक से अधिक लोगों तक पहुँचाया जा सके। दुर्भाग्य से, मशीन अनुवाद अभी तक एक पूर्ण तकनीक नहीं है, इसलिए त्रुटियाँ हो सकती हैं। यदि आप चाहें, तो आप मूल अंग्रेजी संस्करण यहाँ देख सकते हैं:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

इस पोस्ट में दी गई जानकारी Dynamics AX 2012 R3 पर आधारित है। यह दूसरे वर्शन के लिए वैलिड हो भी सकती है और नहीं भी।

मैं हाल ही में एक कस्टमर को दूसरे सिस्टम से मिले डेटा के आधार पर कस्टमर बनाने के लिए एप्लीकेशन इंटीग्रेशन फ्रेमवर्क (AIF) इनबाउंड पोर्ट इम्प्लीमेंट करने में मदद कर रहा था। क्योंकि Dynamics AX पहले से ही CustCustomer डॉक्यूमेंट सर्विस देता है, जो इसके लिए लॉजिक इम्प्लीमेंट करता है, इसलिए हमने इसे सिंपल रखने और स्टैंडर्ड सॉल्यूशन इस्तेमाल करने का फैसला किया।

लेकिन, जल्द ही पता चला कि एक्सटर्नल सिस्टम से XML जेनरेट करने में बहुत सारी दिक्कतें थीं, जिसे Dynamics AX एक्सेप्ट कर सके। Dynamics AX से जेनरेट किया गया XML स्कीमा काफी कॉम्प्लेक्स है और ऐसा भी लगता है कि Dynamics AX में कुछ बग्स हैं जिनकी वजह से कभी-कभी यह दूसरे टूल्स के हिसाब से स्कीमा-वैलिड XML को रिजेक्ट कर देता है, इसलिए कुल मिलाकर, यह उतना आसान नहीं निकला जितना मैंने सोचा था।

इस काम के दौरान, मुझे अक्सर यह समझने में मुश्किल होती थी कि कुछ XML फ़ाइलों में असल में क्या प्रॉब्लम है, क्योंकि AIF से मिलने वाले एरर मैसेज ज़्यादा जानकारी वाले नहीं होते। यह थकाने वाला भी था, क्योंकि मुझे बाहरी सिस्टम से MSMQ पर नया मैसेज भेजने का इंतज़ार करना पड़ता था और फिर 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() मेथड (जो AIF में "create" सर्विस ऑपरेशन से जुड़ा है) से लौटाए गए AifEntityKey ऑब्जेक्ट में यह जानकारी होती है कि कौन सा कस्टमर बनाया गया था, और दूसरी चीज़ों के साथ, बनाए गए CustTable रिकॉर्ड का RecId भी होता है।

अगर आप आउटबाउंड पोर्ट को टेस्ट करने की कोशिश कर रहे हैं या आपको बस यह उदाहरण चाहिए कि इनबाउंड पोर्ट पर XML कैसा दिखना चाहिए, तो आप इसके बजाय 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' की जगह उस कस्टमर का अकाउंट नंबर डालना चाहिए जिसे आप पढ़ना चाहते हैं।

अग्रिम पठन

यदि आपको यह पोस्ट पसंद आई हो, तो आपको ये सुझाव भी पसंद आ सकते हैं:


ब्लूस्काई पर साझा करेंफेसबुक पर सांझा करेंलिंक्डइन पर साझा करेंटम्बलर पर साझा करेंX पर साझा करेंलिंक्डइन पर साझा करेंPinterest पर पिन करें

मिकेल क्रिस्टेंसन

लेखक के बारे में

मिकेल क्रिस्टेंसन
मिकेल miklix.com के निर्माता और मालिक हैं। उन्हें पेशेवर कंप्यूटर प्रोग्रामर/सॉफ्टवेयर डेवलपर के रूप में 20 से अधिक वर्षों का अनुभव है और वर्तमान में वे एक बड़े यूरोपीय आईटी निगम के लिए पूर्णकालिक रूप से कार्यरत हैं। जब वे ब्लॉगिंग नहीं करते हैं, तो वे अपना खाली समय विभिन्न प्रकार की रुचियों, शौक और गतिविधियों में बिताते हैं, जो कुछ हद तक इस वेबसाइट पर शामिल किए गए विषयों की विविधता में परिलक्षित हो सकते हैं।