Memanggil Perkhidmatan Dokumen AIF Terus daripada X++ dalam Dynamics AX 2012
Diterbitkan: 19 Mac 2025 pada 9:35:23 PTG UTC
Dalam artikel ini, saya menerangkan cara memanggil perkhidmatan dokumen Rangka Kerja Integrasi Aplikasi dalam Dynamics AX 2012 terus daripada kod X++, mencontohi kedua-dua panggilan masuk dan keluar, yang boleh menjadikannya lebih mudah untuk mencari dan menyahpepijat ralat dalam kod AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Maklumat dalam pos ini adalah berdasarkan Dynamics AX 2012 R3. Ia mungkin sah atau tidak sah untuk versi lain.
Saya baru-baru ini membantu seorang pelanggan melaksanakan port masuk Application Integration Framework (AIF) untuk mencipta pelanggan berdasarkan data yang mereka terima daripada sistem lain. Memandangkan Dynamics AX sudah menyediakan perkhidmatan dokumen CustCustomer, yang melaksanakan logik untuk ini, kami memutuskan untuk mengekalkannya dengan mudah dan menggunakan penyelesaian standard.
Bagaimanapun, tidak lama kemudian, ternyata terdapat banyak masalah untuk mendapatkan sistem luaran menghasilkan XML yang akan diterima oleh Dynamics AX. Skema XML yang dihasilkan oleh Dynamics AX adalah agak kompleks dan ia juga kelihatan terdapat beberapa pepijat dalam Dynamics AX yang kadang-kadang menyebabkan ia menolak XML yang sah dari segi skema menurut alat lain, jadi secara keseluruhannya, ia terbukti kurang mudah daripada yang saya sangkakan.
Semasa usaha tersebut, saya sering bergelut untuk mengetahui apakah sebenarnya masalah dengan fail XML tertentu kerana mesej ralat yang disediakan oleh AIF kurang memberi maklumat. Ia juga membosankan, kerana saya perlu menunggu sistem luaran menghantar mesej baharu melalui MSMQ dan kemudian sekali lagi untuk AIF mengambil mesej tersebut dan memprosesnya sebelum saya dapat melihat ralat.
Oleh itu, saya menyiasat sama ada ia mungkin untuk memanggil kod perkhidmatan secara langsung dengan fail XML tempatan untuk ujian yang lebih pantas dan ternyata ia adalah - dan bukan hanya itu, ia sangat mudah untuk dilakukan dan sebenarnya memberikan mesej ralat yang lebih bermakna.
Contoh tugas di bawah ini membaca fail XML tempatan dan cuba menggunakannya dengan kelas AxdCustomer (yang merupakan kelas dokumen yang digunakan oleh perkhidmatan CustCustomer) untuk mencipta pelanggan. Anda boleh membuat tugas serupa untuk semua kelas dokumen lain, contohnya AxdSalesOrder, jika perlu.
{
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');
}
Objek AifEntityKey yang dikembalikan oleh kaedah customer.create() (yang sepadan dengan operasi perkhidmatan "create" dalam AIF) mengandungi maklumat tentang pelanggan yang telah dicipta, antara lain RecId bagi rekod CustTable yang telah dicipta.
Jika apa yang anda cuba uji adalah port Outbound sebaliknya atau jika anda hanya memerlukan contoh tentang bagaimana XML sepatutnya kelihatan pada port Inbound, anda juga boleh menggunakan kelas dokumen untuk mengeksport pelanggan ke fail sebaliknya dengan memanggil kaedah read() (yang sepadan dengan operasi perkhidmatan "read") seperti berikut:
{
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');
}
Anda semestinya perlu menggantikan '123456' dengan nombor akaun pelanggan yang ingin anda baca.