Miklix

डायनॅमिक्स एएक्स 2012 मध्ये एक्स ++ वरून थेट एआयएफ दस्तऐवज सेवांवर कॉल करणे

प्रकाशित: १६ फेब्रुवारी, २०२५ रोजी ११:२३:३८ AM UTC
शेवटचे अपडेट केलेले: १२ जानेवारी, २०२६ रोजी ८:५५:३२ AM UTC

या लेखात, मी डायनॅमिक्स AX २०१२ मध्ये अॅप्लिकेशन इंटिग्रेशन फ्रेमवर्क डॉक्युमेंट सर्व्हिसेसना X++ कोडवरून थेट कसे कॉल करायचे ते स्पष्ट करतो, जे इनबाउंड आणि आउटबाउंड दोन्ही कॉलचे अनुकरण करते, ज्यामुळे AIF कोडमधील त्रुटी शोधणे आणि डीबग करणे लक्षणीयरीत्या सोपे होऊ शकते.


हे पान जास्तीत जास्त लोकांना उपलब्ध व्हावे म्हणून इंग्रजीतून मशीन भाषांतरित करण्यात आले आहे. दुर्दैवाने, मशीन भाषांतर अद्याप परिपूर्ण तंत्रज्ञान नाही, त्यामुळे चुका होऊ शकतात. तुम्हाला हवे असल्यास, तुम्ही मूळ इंग्रजी आवृत्ती येथे पाहू शकता:

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

या पोस्टमधील माहिती डायनॅमिक्स AX २०१२ R3 वर आधारित आहे. ती इतर आवृत्त्यांसाठी वैध असू शकते किंवा नसू शकते.

मी अलिकडेच एका ग्राहकांना दुसऱ्या सिस्टमकडून मिळणाऱ्या डेटावर आधारित ग्राहक तयार करण्यासाठी अॅप्लिकेशन इंटिग्रेशन फ्रेमवर्क (AIF) इनबाउंड पोर्ट लागू करण्यास मदत करत होतो. डायनॅमिक्स AX आधीच CustCustomer डॉक्युमेंट सेवा प्रदान करत असल्याने, जी यासाठी लॉजिक लागू करते, आम्ही ते सोपे ठेवण्याचा आणि मानक उपाय वापरण्याचा निर्णय घेतला.

तथापि, लवकरच असे दिसून आले की डायनॅमिक्स AX स्वीकारेल अशा बाह्य प्रणालीला XML जनरेट करण्यात अनेक समस्या येत होत्या. डायनॅमिक्स AX द्वारे जनरेट केलेला XML स्कीमा खूपच गुंतागुंतीचा आहे आणि असेही दिसते की डायनॅमिक्स AX मध्ये काही बग आहेत ज्यामुळे कधीकधी ते इतर साधनांनुसार स्कीमा-वैध असलेल्या XML ला नाकारते, त्यामुळे एकंदरीत, ते माझ्या विचारापेक्षा कमी सोपे असल्याचे सिद्ध झाले.

या प्रयत्नादरम्यान, AIF द्वारे प्रदान केलेले त्रुटी संदेश माहितीपूर्ण नसल्यामुळे, काही XML फायलींमध्ये नेमकी समस्या काय आहे हे शोधण्यासाठी मला अनेकदा संघर्ष करावा लागला. ते देखील कंटाळवाणे होते, कारण मला बाह्य प्रणाली 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() पद्धत ("रीड" सर्व्हिस ऑपरेशनशी संबंधित) कॉल करून ग्राहकाला फाइलमध्ये निर्यात करण्यासाठी डॉक्युमेंट क्लास देखील वापरू शकता, जसे की:

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');
}

अर्थात, तुम्ही ज्या ग्राहकाचे खाते क्रमांक वाचू इच्छिता त्याचा खाते क्रमांक '१२३४५६' ने बदलला पाहिजे.

पुढील वाचन

जर तुम्हाला ही पोस्ट आवडली असेल, तर तुम्हाला हे सूचना देखील आवडतील:


ब्लूस्की वर शेअर कराफेसबुक वर शेअर करालिंक्डइन वर शेअर कराटंबलर वर शेअर कराX वर शेअर करालिंक्डइन वर शेअर कराPinterest वर पिन करा

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

लेखकाबद्दल

मिकेल क्रिस्टेनसेन
मिकेल हे miklix.com चे निर्माता आणि मालक आहेत. त्यांना व्यावसायिक संगणक प्रोग्रामर/सॉफ्टवेअर डेव्हलपर म्हणून २० वर्षांहून अधिक अनुभव आहे आणि सध्या ते एका मोठ्या युरोपियन आयटी कॉर्पोरेशनमध्ये पूर्णवेळ नोकरी करतात. ब्लॉगिंग करत नसताना, ते आपला मोकळा वेळ विविध आवडी, छंद आणि क्रियाकलापांमध्ये घालवतात, जे काही प्रमाणात या वेबसाइटवर समाविष्ट असलेल्या विविध विषयांमध्ये प्रतिबिंबित होऊ शकतात.