Miklix

ডায়নামিক্স এএক্স 2012 এ সরাসরি এক্স ++ থেকে এআইএফ ডকুমেন্ট পরিষেবাদিতে কল করা

প্রকাশিত: ১৬ ফেব্রুয়ারী, ২০২৫ এ ১১:২৩:৩৭ AM UTC
সর্বশেষ আপডেট: ১২ জানুয়ারী, ২০২৬ এ ৮:৫৫:৩১ AM UTC

এই প্রবন্ধে, আমি ব্যাখ্যা করব কিভাবে Dynamics AX 2012-এ অ্যাপ্লিকেশন ইন্টিগ্রেশন ফ্রেমওয়ার্ক ডকুমেন্ট পরিষেবাগুলিকে সরাসরি X++ কোড থেকে কল করা যায়, যা ইনবাউন্ড এবং আউটবাউন্ড উভয় কলকেই অনুকরণ করে, যা AIF কোডে ত্রুটি খুঁজে বের করা এবং ডিবাগ করা উল্লেখযোগ্যভাবে সহজ করে তুলতে পারে।


এই পৃষ্ঠাটি যতটা সম্ভব মানুষের কাছে পৌঁছানোর জন্য ইংরেজি থেকে মেশিন অনুবাদ করা হয়েছে। দুর্ভাগ্যবশত, মেশিন অনুবাদ এখনও একটি নিখুঁত প্রযুক্তি নয়, তাই ত্রুটি হতে পারে। আপনি যদি চান, আপনি এখানে মূল ইংরেজি সংস্করণটি দেখতে পারেন:

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

এই পোস্টের তথ্য Dynamics AX 2012 R3 এর উপর ভিত্তি করে তৈরি। এটি অন্যান্য সংস্করণের জন্য বৈধ হতে পারে আবার নাও হতে পারে।

আমি সম্প্রতি একজন গ্রাহককে অন্য সিস্টেম থেকে প্রাপ্ত ডেটার উপর ভিত্তি করে গ্রাহক তৈরি করার জন্য একটি অ্যাপ্লিকেশন ইন্টিগ্রেশন ফ্রেমওয়ার্ক (AIF) ইনবাউন্ড পোর্ট বাস্তবায়নে সাহায্য করছিলাম। যেহেতু Dynamics AX ইতিমধ্যেই CustCustomer ডকুমেন্ট পরিষেবা প্রদান করে, যা এর জন্য যুক্তি প্রয়োগ করে, তাই আমরা এটিকে সহজ রাখার এবং স্ট্যান্ডার্ড সমাধান ব্যবহার করার সিদ্ধান্ত নিয়েছি।

তবে, শীঘ্রই দেখা গেল যে ডাইনামিক্স AX গ্রহণ করবে এমন এক্সটার্নাল সিস্টেমের XML তৈরি করতে অনেক সমস্যা হচ্ছে। ডাইনামিক্স 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() পদ্ধতি দ্বারা ফেরত পাঠানো 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-এ শেয়ার করুনলিংকডইনে শেয়ার করুনপিন্টারেস্টে পিন করুন

মিকেল ক্রিস্টেনসেন

লেখক সম্পর্কে

মিকেল ক্রিস্টেনসেন
মিকেল হলেন miklix.com এর স্রষ্টা এবং মালিক। একজন পেশাদার কম্পিউটার প্রোগ্রামার/সফ্টওয়্যার ডেভেলপার হিসেবে তার ২০ বছরেরও বেশি অভিজ্ঞতা রয়েছে এবং বর্তমানে তিনি একটি বৃহৎ ইউরোপীয় আইটি কর্পোরেশনে পূর্ণকালীন কর্মরত। ব্লগিং না করার সময়, তিনি তার অবসর সময় বিভিন্ন আগ্রহ, শখ এবং কার্যকলাপে ব্যয় করেন, যা কিছুটা হলেও এই ওয়েবসাইটে কভার করা বিভিন্ন বিষয়ের মধ্যে প্রতিফলিত হতে পারে।