Memanggil Layanan Dokumen AIF Langsung dari X++ di Dynamics AX 2012
Diterbitkan: 16 Februari 2025 pukul 11.23.00 UTC
Terakhir diperbarui: 12 Januari 2026 pukul 08.55.15 UTC
Pada artikel ini, saya menjelaskan cara memanggil layanan dokumen Application Integration Framework (AIF) di Dynamics AX 2012 langsung dari kode X++, dengan meniru panggilan masuk dan keluar, yang dapat mempermudah pencarian dan debugging kesalahan dalam kode AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informasi dalam posting ini didasarkan pada Dynamics AX 2012 R3. Informasi ini mungkin berlaku atau mungkin tidak berlaku untuk versi lain.
Baru-baru ini saya membantu pelanggan mengimplementasikan port masuk Application Integration Framework (AIF) untuk membuat pelanggan berdasarkan data yang mereka terima dari sistem lain. Karena Dynamics AX sudah menyediakan layanan dokumen CustCustomer, yang mengimplementasikan logika untuk hal ini, kami memutuskan untuk menyederhanakannya dan menggunakan solusi standar.
Namun, segera terungkap bahwa ada banyak masalah dalam membuat sistem eksternal menghasilkan XML yang dapat diterima oleh Dynamics AX. Skema XML yang dihasilkan oleh Dynamics AX cukup kompleks dan tampaknya ada beberapa bug di Dynamics AX yang terkadang menyebabkannya menolak XML yang menurut alat lain valid secara skema, jadi secara keseluruhan, ternyata tidak sesederhana yang saya kira.
Selama proses tersebut, saya sering kesulitan untuk mengetahui secara pasti apa masalahnya dengan file XML tertentu karena pesan kesalahan yang diberikan oleh AIF kurang informatif. Hal ini juga membosankan, karena saya harus menunggu sistem eksternal mengirim pesan baru melalui MSMQ dan kemudian menunggu AIF untuk mengambil pesan dan memprosesnya sebelum saya dapat melihat kesalahan.
Oleh karena itu, saya menyelidiki apakah mungkin untuk memanggil kode layanan secara langsung dengan file XML lokal untuk pengujian yang lebih cepat, dan ternyata itu mungkin - dan tidak hanya itu, caranya sangat sederhana dan sebenarnya memberikan pesan kesalahan yang jauh lebih bermakna.
Contoh pekerjaan di bawah ini membaca file XML lokal dan mencoba menggunakannya dengan kelas AxdCustomer (yang merupakan kelas dokumen yang digunakan oleh layanan CustCustomer) untuk membuat pelanggan. Anda dapat membuat pekerjaan serupa untuk semua kelas dokumen lainnya, misalnya AxdSalesOrder, jika diperlukan.
{
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 metode customer.create() (yang sesuai dengan operasi layanan "create" di AIF) berisi informasi tentang pelanggan mana yang dibuat, antara lain RecId dari catatan CustTable yang dibuat.
Jika yang ingin Anda uji adalah port keluar atau jika Anda hanya memerlukan contoh bagaimana tampilan XML pada port masuk, Anda juga dapat menggunakan kelas dokumen untuk mengekspor pelanggan ke file dengan memanggil metode read() (yang sesuai dengan operasi layanan "read"), seperti ini:
{
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 tentu saja harus mengganti '123456' dengan nomor rekening pelanggan yang ingin Anda baca.
Bacaan Lebih Lanjut
Jika Anda menikmati postingan ini, Anda mungkin juga menyukai saran berikut:
- Kesalahan "Tidak ada kelas metadata yang ditentukan untuk objek kontrak data" di Dynamics AX 2012
- Menggunakan Kueri dalam Kelas Kontrak Data SysOperation di Dynamics AX 2012
- Menggunakan Kerangka Kerja SysExtension untuk Menemukan Subkelas Mana yang Akan Dibuat Instansi di Dynamics AX 2012
