Miklix

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.


Halaman ini diterjemahkan oleh mesin dari bahasa Inggris agar dapat diakses oleh sebanyak mungkin orang. Sayangnya, terjemahan mesin belum merupakan teknologi yang sempurna, sehingga kesalahan dapat terjadi. Jika Anda mau, Anda dapat melihat versi bahasa Inggris aslinya di sini:

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.

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');
}

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:

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');
}

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:


Bagikan di BlueskyBagikan di FacebookBagikan di LinkedInBagikan di TumblrBagikan di XBagikan di LinkedInPin di Pinterest

Mikkel Christensen

Tentang Penulis

Mikkel Christensen
Mikkel adalah pencipta dan pemilik miklix.com. Dia memiliki lebih dari 20 tahun pengalaman sebagai pemrogram komputer profesional/pengembang perangkat lunak dan saat ini bekerja penuh waktu di sebuah perusahaan IT besar di Eropa. Ketika tidak menulis blog, ia menghabiskan waktu luangnya untuk beragam minat, hobi, dan kegiatan, yang mungkin sampai batas tertentu tercermin dalam berbagai topik yang dibahas di situs web ini.