Miklix

Memanggil Layanan Dokumen AIF Langsung dari X++ di Dynamics AX 2012

Diterbitkan: 16 Februari 2025 pukul 11.23.00 UTC

Dalam artikel ini, saya menjelaskan cara memanggil layanan dokumen Application Integration Framework di Dynamics AX 2012 langsung dari kode X++, meniru panggilan masuk dan keluar, yang dapat mempermudah pencarian dan pendebugan 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 berdasarkan Dynamics AX 2012 R3. Informasi ini mungkin berlaku atau tidak berlaku untuk versi lain.

Baru-baru ini saya membantu seorang pelanggan menerapkan port masuk Application Integration Framework (AIF) untuk membuat pelanggan berdasarkan data yang mereka terima dari sistem lain. Karena Dynamics AX telah menyediakan layanan dokumen CustCustomer, yang menerapkan logika untuk ini, kami memutuskan untuk membuatnya tetap sederhana dan menggunakan solusi standar.

Namun, ternyata ada banyak masalah dalam membuat sistem eksternal menghasilkan XML yang dapat diterima Dynamics AX. Skema XML yang dihasilkan oleh Dynamics AX cukup rumit dan tampaknya ada beberapa bug di Dynamics AX yang terkadang menyebabkannya menolak XML yang skemanya valid menurut alat lain, jadi secara keseluruhan, ternyata tidak sesederhana yang saya kira.

Selama proses tersebut, saya sering kali kesulitan mencari tahu apa sebenarnya masalah dengan file XML tertentu karena pesan kesalahan yang diberikan oleh AIF kurang informatif. Proses ini juga membosankan, karena saya harus menunggu sistem eksternal mengirim pesan baru melalui MSMQ dan kemudian menunggu AIF mengambil pesan dan memprosesnya sebelum saya 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 memang mungkin - dan tidak hanya itu, hal itu sangat mudah dilakukan dan benar-benar memberikan pesan kesalahan yang jauh lebih berarti.

Pekerjaan contoh 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 Anda membutuhkannya.

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 "buat" di AIF) berisi informasi tentang pelanggan mana yang dibuat, antara lain RecId dari rekaman CustTable yang dibuat.

Jika yang Anda coba uji adalah port Keluar atau jika Anda hanya memerlukan contoh bagaimana XML seharusnya terlihat pada port Masuk, Anda juga dapat menggunakan kelas dokumen untuk mengekspor pelanggan ke file dengan memanggil metode read() (sesuai dengan operasi layanan "baca"), 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');
}

Tentu saja Anda harus mengganti '123456' dengan nomor rekening pelanggan yang ingin Anda baca.

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

Mikkel Bang Christensen

Tentang Penulis

Mikkel Bang 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.