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