Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Cari Blog Ini

26 Mei 2023

Dynamics AX 2012 parameter Args with record

Suatu saat terjadi hal aneh di AX. Dimana ketika user menekan tombol proses, tetapi record yang terupdate bukan record yang dipilih. Saya coba reporduksi bagaimana error tersebut terjadi, namun tidak berhasil. Apa yang saya coba sesuai dengan yang diharapkan. Hingga suatu saat secara tidak sengaja ada rekan saat mencoba fitur baru, dia menekan sebuah tombol dimana tombol tersebut menampilkan dialog terlebih dahulu. Dialog tersebut tanpa modal, setelah dialog muncul, user tetap bisa interaksi dengan form, termasuk menggeser pilihan record yang terpilih. Ternyata ketika dialog muncul dan user menggeser pilihan row maka yang terproses adalah pilihan row yang baru dipilih. Bukan row yang dipilih sebelum dialog tersebut muncul. 

Ternyata di AX jika kita memakai arg.record() sebagai data terpilih, data tersebut bersifat byref (mengambil istilah VB). Jadi ketika user mengganti pilihan record, maka data ikut berubah.

Contoh source dibawah ini:

public static void main(Args arg)
{
    Dialog dlg = new Dialog("TEST");
    
    CustTable tbl = arg.record();
    
    dlg.addText(tbl.AccountNum);
    if (dlg.run())
    {
        info("Selected: " + tbl.AccountNum );
    }
}

Code diatas adalah dialam sebuah Class yang dipanggil oleh MenuAction, dan menu Action menempel pada form yang memiliki data source tabel "CustTable"

Ketika saya pilih baris pertama (kode: 000001), maka tampilan dialog seperti dibawah ini:


Terlihat yang ditampilkan dialog adalah sesuai. Namun kemudian saya pilih row yang lain saat dialog tersebut masih muncul (karena bukan modal).

Terlihat dialog masih menampilkan record awal. Namun saat saya tekan tombol OK maka record yang dipilih ternyata sesuai pilihan terakhir.


Ternyata berbahaya sekali. Karena bisa salah update/proses data. Solusi untuk kasus ini adalah dengan menjadikan dialog menjadi modal. Lihat caranya disini: System Modal Dialog - Microsoft Dynamics AX Forum Community Forum

Cara kedua adalah membiarkan dialog tanpa modal, namun data yang diproses benar, yaitu dengan mengubah code menjadi dibawah ini:

public static void main(Args arg)
{
    Dialog dlg = new Dialog("TEST");
    
    //OLD CODE CustTable tbl = arg.record();
    CustTable tbl = CustTable::findRecId(arg.record().RecId);
    
    dlg.addText(tbl.AccountNum);
    if (dlg.run())
    {
        info("Selected: " + tbl.AccountNum );
    }
}

Pada code yang saya warna biru terlihat variabel tbl bukan dari arg.record() lagi namun query lagi dengan mengambil arg.record().recId. Hasilnya seperti gambar dibawah ini.