Miklix

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 के लिए समान कार्य कर सकते हैं।

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