Membuat Popup Notifikasi Di AX

Disini kami menggunakan dynamics AX 2009, dimana pada AX versi ini sebenarnya tidak tersedia fitur real-time push notification antar user secara native. Artinya, ketika User A melakukan transaksi, sistem tidak bisa langsung menampilkan popup otomatis ke User B tanpa mekanisme tambahan.

Namun, sebagai programmer AX, kita bisa membuat solusi near real-time notification menggunakan:

  1. Tabel notifikasi
  2. Form listener
  3. Timer (setTimeOut)
  4. Startup class

Artikel ini membahas step-by-step lengkap dan best practice production-nya

🎯 Studi Kasus

  • User A membuat transaksi
  • User B yang sedang membuka AX langsung mendapatkan popup notifikasi.

1️⃣ Konsep Solusi di AX 2009

Karena AX 2009 berbasis session terpisah per user:

  • Tidak ada broadcast antar client
  • Tidak ada event push system
  • Tidak ada SignalR / Notification service

Solusi yang stabil & bisa digunakan adalah:

✅ Simpan notifikasi di tabel
✅ Client melakukan polling tiap beberapa detik
✅ Jika ada data → tampilkan popup

2️⃣ Step 1 – Membuat Tabel Notifikasi

AOT → Data Dictionary → Tables → New Table

Nama tabel: MyUserNotification

Field yang Dibutuhkan:

Field NameTypeKeterangan

ToUserId UserId (EDT) User tujuan
MessageText String (500) Isi pesan
IsRead NoYesId Status sudah dibaca
CreatedDateTime UtcDateTime Waktu dibuat

🔹 Wajib Tambahkan Index (Penting untuk Performa)

Index Name: IdxUser

Kenapa membuat index penting?
Karena timer akan melakukan query berkala. Tanpa index, performa bisa drop.

3️⃣ Step 2 – Mengirim Notifikasi (Dari User A)

Contoh coding ketika transaksi berhasil:

MyUserNotification notif;

ttsBegin;

notif.clear();
notif.ToUserId = ‘USERB’;
notif.MessageText = “Transaksi baru telah dibuat.”;
notif.IsRead = NoYes::No;
notif.CreatedDateTime = DateTimeUtil::utcNow();
notif.insert();

ttsCommit;

Anda bisa letakkan kode ini di:

  1. Button clicked()
  2. Method posting()
  3. Class service

Atau event transaksi tertentu

4️⃣ Step 3 – Membuat Form Listener

AOT → Forms → New Form

Nama: NotificationListener
>> Form ini tidak perlu design kompleks.

5️⃣ Step 4 – Menambahkan Timer di Form

Override method init():

public void init()
{
super();

element.setTimeOut(identifierStr(checkNotification), 5000);
}

Penjelasan:

5000 = 5 detik

Setiap 5 detik sistem akan menjalankan method checkNotification()

🔹 Tambahkan Method Baru di Form

void checkNotification()
{
MyUserNotification notif;

while select forUpdate notif
where notif.ToUserId == curUserId()
&& notif.IsRead == NoYes::No
{
Box::info(notif.MessageText);

notif.IsRead = NoYes::Yes;
notif.update();
}

element.setTimeOut(identifierStr(checkNotification), 5000);
}

⚠ Penting:
Timer harus dipanggil kembali di akhir method agar terus berjalan.

6️⃣ Step 5 – Menjalankan Listener Otomatis Saat Login

Agar semua user otomatis mengaktifkan listener saat login.

Buka:

Classes → SysStartupCmd

Override method run():

public void run()
{
super();

new MenuFunction(menuitemDisplayStr(NotificationListener),
MenuItemType::Display).run();
}

Sekarang setiap user login, form listener akan berjalan otomatis.

🎯 Hasil Akhir:

✔ User A kirim notifikasi
✔ Tersimpan di tabel
✔ User B dalam ±5 detik muncul popup
✔ Tidak perlu restart AX
✔ Stabil di AX 2009

⚠️ Best Practice Production (Sangat Disarankan)

1️⃣ Jangan Polling Terlalu Cepat

Ideal: 5000–10000 ms
Terlalu cepat bisa membebani SQL Server.

2️⃣ Hindari Spam Popup

Jika notifikasi banyak, gunakan agregasi:

int countNotif;

select count(RecId) from notif
where notif.ToUserId == curUserId()
&& notif.IsRead == NoYes::No;

if (countNotif > 0)
{
Box::info(strFmt(“Anda memiliki %1 notifikasi baru.”, countNotif));
}

3️⃣ Tambahkan Expiry Date (Optional Advanced)

Tambahkan field: ExpiredDateTime

Agar notifikasi lama tidak diproses lagi.

4️⃣ Tambahkan DataAreaId (Multi Company)

Jika sistem multi-company, tambahkan filter:

&& notif.dataAreaId == curext()

🚀 Pengembangan Lebih Lanjut

Solusi ini bisa dikembangkan menjadi:

  1. Notifikasi ke semua user
  2. Notifikasi berdasarkan role
  3. Notifikasi approval workflow
  4. Sistem alert overdue otomatis
  5. Popup non-blocking (form kecil modeless)

Di Microsoft Dynamics AX 2009 (5.0) memang tidak ada sistem broadcast notification bawaan, namun dengan kombinasi:

  • Tabel notifikasi
  • Timer pada form
  • Startup trigger

Anda dapat membuat sistem notifikasi antar user yang stabil dan production-ready.

Dengan memanfaatkan tabel notifikasi dan mekanisme timer pada form, Anda dapat membangun sistem popup antar user yang stabil dan mendekati real-time di Microsoft Dynamics AX 2009 (versi 5.0).

Meskipun AX 2009 tidak menyediakan fitur broadcast notification secara native, pendekatan polling berbasis database ini terbukti aman, fleksibel, dan mudah dikembangkan sesuai kebutuhan bisnis. Baik untuk approval, alert transaksi, reminder, maupun monitoring operasional.

Dengan penerapan index yang tepat dan interval timer yang terkontrol, solusi ini dapat digunakan pada environment production tanpa membebani performa sistem secara signifikan.


Mukena Parasut Ringan & Anti Kusut!

🌟 Mukena parasut berkualitas, ringan, cepat kering, dan tidak mudah kusut. Cocok untuk aktivitas harian maupun traveling. Tampil simpel tapi tetap nyaman saat ibadah! ✨

~ shopee.co.id ~

Mukena Terusan Modern & Super Praktis

⚡ Mukena terusan dengan desain kekinian, rapi dan tidak ribet. Nyaman digunakan tanpa harus mengatur bagian atas dan bawah. Solusi praktis untuk wanita aktif! 🌸

~ shopee.co.id ~