فراخوانی مستقیم سرویس های سند 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، انجام دهید.
{
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() (متناظر با عملیات سرویس "خواندن") به جای آن، مانند زیر عمل کنید:
{
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');
}
البته باید «۱۲۳۴۵۶» را با شماره حساب مشتری مورد نظر خود جایگزین کنید.
مطالعه بیشتر
اگر از این پست لذت بردید، ممکن است این پیشنهادات را نیز بپسندید:
- استفاده از چارچوب SysExtension برای یافتن اینکه کدام زیر کلاس را در Dynamics AX 2012 نمونه سازی کنیم
- استفاده از یک کوئری در کلاس قرارداد داده SysOperation در Dynamics AX 2012
- تبدیل یک واقعی به رشته با تمام اعشار در Dynamics AX 2012
