Miklix

فراخوانی مستقیم سرویس های سند AIF از X++ در Dynamics AX 2012

منتشر شده: ۱۶ فوریهٔ ۲۰۲۵ ساعت ۱۱:۲۳:۳۲ (UTC)
آخرین به روز رسانی: ۱۲ ژانویهٔ ۲۰۲۶ ساعت ۸:۵۵:۳۰ (UTC)

در این مقاله، نحوه فراخوانی سرویس‌های سند چارچوب یکپارچه‌سازی برنامه (Application Integration Framework) در Dynamics AX 2012 را مستقیماً از کد X++ توضیح می‌دهم، که فراخوانی‌های ورودی و خروجی را شبیه‌سازی می‌کند، که می‌تواند یافتن و اشکال‌زدایی خطاها در کد AIF را به طور قابل توجهی آسان‌تر کند.


این صفحه ماشینی از انگلیسی ترجمه شد تا در دسترس هر چه بیشتر مردم باشد. متأسفانه، ترجمه ماشینی هنوز یک فناوری کامل نشده است، بنابراین ممکن است خطاهایی رخ دهد. در صورت تمایل می توانید نسخه اصلی انگلیسی را در اینجا مشاهده کنید:

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

اطلاعات موجود در این پست بر اساس Dynamics AX 2012 R3 است. ممکن است برای نسخه‌های دیگر معتبر باشد یا نباشد.

من اخیراً به یک مشتری در پیاده‌سازی یک پورت ورودی چارچوب یکپارچه‌سازی برنامه (AIF) برای ایجاد مشتریان بر اساس داده‌هایی که از سیستم دیگری دریافت می‌کردند، کمک می‌کردم. از آنجایی که Dynamics AX از قبل سرویس سند CustCustomer را ارائه می‌دهد که منطق این کار را پیاده‌سازی می‌کند، تصمیم گرفتیم آن را ساده نگه داریم و از راه‌حل استاندارد استفاده کنیم.

با این حال، خیلی زود معلوم شد که مشکلات زیادی در تولید XML توسط سیستم خارجی وجود دارد که Dynamics AX آن را بپذیرد. طرح XML تولید شده توسط Dynamics AX بسیار پیچیده است و همچنین به نظر می‌رسد که چند باگ در 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');
}

شیء AifEntityKey که توسط متد customer.create() برگردانده می‌شود (که مربوط به عملیات سرویس "create" در AIF است) حاوی اطلاعاتی در مورد اینکه کدام مشتری ایجاد شده است، از جمله RecId رکورد CustTable ایجاد شده، می‌باشد.

اگر چیزی که می‌خواهید آزمایش کنید پورت خروجی است یا اگر فقط به مثالی از نحوه نمایش XML در پورت ورودی نیاز دارید، می‌توانید از کلاس document برای خروجی گرفتن از یک مشتری به یک فایل استفاده کنید، به جای آن می‌توانید با فراخوانی متد 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');
}

البته باید «۱۲۳۴۵۶» را با شماره حساب مشتری مورد نظر خود جایگزین کنید.

مطالعه بیشتر

اگر از این پست لذت بردید، ممکن است این پیشنهادات را نیز بپسندید:


در Bluesky به اشتراک بگذاریددر فیسبوک به اشتراک بگذاریددر لینکدین به اشتراک بگذاریددر Tumblr به اشتراک بگذاریددر X به اشتراک بگذاریددر لینکدین به اشتراک بگذاریدپین در پینترست

میکل کریستنسن

درباره نویسنده

میکل کریستنسن
مایکل خالق و صاحب miklix.com است. او بیش از 20 سال تجربه به عنوان یک برنامه نویس حرفه ای کامپیوتر / توسعه دهنده نرم افزار دارد و در حال حاضر به طور تمام وقت برای یک شرکت بزرگ فناوری اطلاعات اروپایی مشغول به کار است. هنگامی که وبلاگ نویسی نمی کند، اوقات فراغت خود را صرف مجموعه وسیعی از علایق، سرگرمی ها و فعالیت ها می کند، که ممکن است تا حدی در موضوعات مختلف پوشش داده شده در این وب سایت منعکس شود.