فراخوانی مستقیم سرویس های سند AIF از X++ در Dynamics AX 2012
منتشر شده: ۱۶ فوریهٔ ۲۰۲۵ ساعت ۱۱:۲۳:۳۲ (UTC)
در این مقاله، نحوه فراخوانی سرویس های سند Application Integration Framework در Dynamics AX 2012 را مستقیما از کد X++ توضیح می دهم، با شبیه سازی تماس های ورودی و خروجی، که می تواند یافتن و اشکال زدایی خطاها در کد AIF را به طور قابل توجهی آسان تر کند.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
اطلاعات این بر اساس Dynamics AX 2012 R3 است. ممکن است برای نسخه های دیگر معتبر باشد یا نباشد.
من اخیرا به یک مشتری کمک می کردم تا یک پورت ورودی Application Integration Framework (AIF) را برای ایجاد مشتریان بر اساس داده هایی که از سیستم دیگری دریافت می کردند، پیاده سازی کند. از آنجایی که Dynamics AX در حال حاضر سرویس سند CustCustomer را ارائه می دهد که منطق این کار را پیاده سازی می کند، تصمیم گرفتیم آن را ساده نگه داریم و از راه حل استاندارد استفاده کنیم.
با این حال، به زودی معلوم شد که مشکلات زیادی برای وادار کردن سیستم خارجی به تولید XML وجود دارد که Dynamics AX آن را می پذیرد. طرحواره XML تولید شده توسط Dynamics AX یک طرح کاملا پیچیده است و همچنین به نظر می رسد که اشکالات کمی در Dynamics AX وجود دارد که گاهی اوقات باعث می شود XML را که با توجه به ابزارهای دیگر معتبر است رد کند، بنابراین در مجموع، ثابت شد که ساده تر از آن چیزی است که فکر می کردم.
در طول تلاش، من اغلب تلاش می کردم تا بفهمم دقیقا مشکل برخی از فایل های XML چیست زیرا پیام های خطای ارائه شده توسط AIF کمتر از آموزنده هستند. همچنین خسته کننده بود، زیرا مجبور شدم منتظر بمانم تا سیستم خارجی پیام جدیدی را از طریق MSMQ ارسال کند و سپس دوباره برای AIF برای دریافت پیام و پردازش آن قبل از اینکه بتوانم خطایی را ببینم.
بنابراین من بررسی کردم که آیا می توان کد سرویس را مستقیما با یک فایل XML محلی برای آزمایش سریعتر فراخوانی کرد و معلوم شد که اینطور است - و نه تنها این، انجام آن واقعا ساده است و در واقع پیام های خطای معنی دارتری را ارائه می دهد.
job مثال زیر یک فایل 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() بازگردانده می شود (که مربوط به عملیات سرویس "ایجاد" در AIF است) حاوی اطلاعاتی در مورد اینکه کدام مشتری ایجاد شده است، از جمله موارد دیگر RecId رکورد CustTable ایجاد شده است.
اگر چیزی که می خواهید آزمایش کنید به جای آن یک پورت خروجی است یا اگر فقط به نمونه ای از نحوه ظاهر XML در پورت ورودی نیاز دارید، می توانید از کلاس سند برای صادرات مشتری به یک فایل استفاده کنید و به جای آن متد 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');
}
البته باید "123456" را با شماره حساب مشتری که می خواهید بخوانید جایگزین کنید.