Miklix

استدعاء خدمات مستندات 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، إذا كنت بحاجة إلى ذلك.

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() (التي تتوافق مع عملية الخدمة "إنشاء" في AIF) على معلومات حول العميل الذي تم إنشاؤه، من بين أمور أخرى، معرف RecId لسجل CustTable الذي تم إنشاؤه.

إذا كنت تحاول اختبار منفذ خارجي بدلاً من ذلك أو إذا كنت تحتاج فقط إلى مثال لكيفية ظهور XML على المنفذ الوارد، فيمكنك أيضًا استخدام فئة المستند لتصدير عميل إلى ملف بدلاً من ذلك عن طريق استدعاء طريقة 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');
}

يجب عليك بالطبع استبدال "123456" برقم حساب العميل الذي ترغب في قراءته.

شارك على بلوسكايشارك على الفيسبوكشارك على لينكدإنشارك على تمبلرشارك على إكسشارك على لينكدإنثبت على بينتريست

ميكيل بانج كريستنسن

عن المؤلف

ميكيل بانج كريستنسن
ميكيل هو مؤسس ومالك موقع miklix.com. يتمتع بخبرة تزيد عن 20 عامًا كمبرمج كمبيوتر/مطور برامج محترف ويعمل حاليًا بدوام كامل في إحدى شركات تكنولوجيا المعلومات الأوروبية الكبرى. عندما لا يقوم بالتدوين، يقضي وقت فراغه في مجموعة واسعة من الاهتمامات والهوايات والأنشطة، والتي قد تنعكس إلى حد ما في تنوع الموضوعات التي يغطيها هذا الموقع.