استدعاء خدمات مستندات AIF مباشرةً من X++ في Dynamics AX 2012
نُشرت: ١٦ فبراير ٢٠٢٥ م في ١١:٢٢:٥٠ ص 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، والتي تنفذ المنطق الخاص بذلك، فقد قررنا أن نجعل الأمر بسيطًا وأن نستخدم الحل القياسي.
ومع ذلك، سرعان ما تبين أن هناك الكثير من المشاكل التي واجهتها عملية جعل النظام الخارجي ينشئ 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() (التي تتوافق مع عملية الخدمة "إنشاء" في 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" برقم حساب العميل الذي ترغب في قراءته.