Tutorial Membuat Case di Microsoft Dynamics AX 2012 RTM via Code X++

Dalam Microsoft Dynamics AX 2012, fitur Case Management digunakan untuk mencatat, melacak, dan menyelesaikan suatu isu, baik yang berasal dari customer, vendor, employee, maupun proses internal perusahaan. Secara sederhana, case bisa dianggap sebagai tiket masalah atau laporan kejadian yang perlu ditindaklanjuti. Case Management di AX 2012 memang sering dipakai untuk kebutuhan seperti complaint customer, issue quality, request internal, hingga proses audit. Salah satu referensi komunitas AX juga menjelaskan bahwa case di AX 2012 dapat digunakan untuk merekam, memperbarui, melacak, follow up, dan menutup issue yang muncul dalam proses bisnis.

Pada artikel ini, kita akan membahas tutorial membuat Case di Microsoft Dynamics AX 2012 RTM via code X++. Contoh yang digunakan adalah job X++ sederhana yang membuat case baru berdasarkan category, owner worker, customer/party, lalu menambahkan catatan ke tabel log case.

Tutorial ini cocok untuk kamu yang sedang melakukan customization AX 2012, integrasi data, automation job, atau ingin membuat case secara otomatis dari proses tertentu seperti complaint, quality issue, service request, atau hasil validasi sistem.

1. Gambaran Alur Pembuatan Case

Secara garis besar, kode ini melakukan beberapa langkah utama:

Pertama, sistem mengambil Case Category dari tabel CaseCategoryHierarchyDetail. Pada contoh ini, category yang dicari adalah "Quality".

Kedua, sistem mengambil data worker dari tabel HcmWorker berdasarkan PersonnelNumber.

Ketiga, sistem mengambil data customer dari CustTable, lalu mengambil nilai Party dari customer tersebut.

Keempat, sistem membuat record baru di tabel CaseDetail.

Kelima, sistem membuat record tambahan di CaseLog sebagai catatan atau detail kronologi case.

Tabel CaseDetail sendiri dikenal sebagai tabel utama untuk data case di AX 2012, sedangkan CaseLog digunakan untuk menyimpan detail log atau catatan case. Referensi tabel AX 2012 juga mencantumkan CaseLog sebagai “Case log details” dan CaseDetail sebagai tabel “Case”.

2. Contoh Code X++ Membuat Case

Berikut kode yang digunakan:

static void CreateCase(Args _args)
{
    CaseDetail caseDetailBase;
    CaseCategoryHierarchyDetail caseCategory;
    CaseId caseId;
    HcmWorker hcmWorker;
    CustTable custTable;
    CaseLog caseLog;

    // ambil category
    select firstOnly caseCategory 
        where caseCategory.caseCategory == "Quality";

    if (!caseCategory.RecId)
    {
        throw error("Case category tidak ditemukan.");
    }

    ttsbegin;

    caseDetailBase.clear();
    caseDetailBase.initValue();

    caseDetailBase.CaseId      = NumberSeq::newGetNumFromCode("RUNNUMCASE").num();
    caseDetailBase.Description = "Case dibuat dari job X++";

    // isi category wajib
    caseDetailBase.CategoryRecId = caseCategory.RecId;

    select firstOnly hcmWorker
        where hcmWorker.PersonnelNumber == "E000159";

    if (!hcmWorker.RecId)
    {
        throw error("Worker tidak ditemukan.");
    }

    caseDetailBase.OwnerWorker = hcmWorker.RecId;

    // Customer / Party
    custTable = CustTable::find("C000001", true);
    if (!custTable.RecId)
    {
        throw error("Customer tidak ditemukan.");
    }

    // party dari customer
    caseDetailBase.Party = custTable.Party;

    if (!caseDetailBase.validateWrite())
    {
        throw error("Case gagal divalidasi.");
    }

    caseDetailBase.insert();

    caseLog.clear();
    caseLog.initValue();

    caseLog.CaseRecId    = caseDetailBase.RecId;
    caseLog.Description  = "Beberapa kemasan penyok pada bagian bawah";
    caseLog.Notes        = "Beberapa kemasan penyok pada bagian bawah";

    caseLog.insert();

    ttscommit;

    info(strFmt("Case berhasil dibuat: %1", caseDetailBase.CaseId));
}

3. Penjelasan Bagian Penting Kode

Bagian pertama adalah mengambil category:

select firstOnly caseCategory 
    where caseCategory.caseCategory == "Quality";

Kode ini mencari category case dengan nama "Quality". Jika category tidak ditemukan, proses dihentikan dengan throw error.

if (!caseCategory.RecId)
{
    throw error("Case category tidak ditemukan.");
}

Ini penting karena CategoryRecId biasanya menjadi field wajib dalam pembuatan case. Kalau category kosong, kemungkinan besar proses insert akan gagal saat validateWrite().

Selanjutnya, kode masuk ke transaksi database:

ttsbegin;

Di AX 2012, ttsbegin dan ttscommit digunakan untuk memastikan proses insert berjalan dalam satu transaksi. Jadi, pembuatan case dan case log dilakukan sebagai satu kesatuan proses.

Lalu bagian ini membuat nomor case:

caseDetailBase.CaseId = NumberSeq::newGetNumFromCode("RUNNUMCASE").num();

Artinya, nomor case diambil dari number sequence dengan code "RUNNUMCASE". Pastikan number sequence ini memang sudah ada dan aktif di environment AX kamu. Kalau number sequence tidak valid, proses generate nomor bisa gagal.

Setelah itu, kode mengisi deskripsi:

caseDetailBase.Description = "Case dibuat dari job X++";

Field ini bisa kamu sesuaikan dengan kebutuhan, misalnya dari complaint customer, hasil integrasi, atau input dari form tertentu.

4. Mengisi Owner Worker

Bagian berikutnya mengambil worker berdasarkan personnel number:

select firstOnly hcmWorker
    where hcmWorker.PersonnelNumber == "E000159";

Jika worker ditemukan, maka RecId worker tersebut dimasukkan ke field OwnerWorker.

caseDetailBase.OwnerWorker = hcmWorker.RecId;

Ini berarti case tersebut akan dimiliki atau ditugaskan kepada worker dengan personnel number "E000159".

5. Menghubungkan Case ke Customer / Party

Kode ini mengambil customer:

custTable = CustTable::find("C000001", true);

Jika customer ditemukan, field Party dari customer tersebut dimasukkan ke case:

caseDetailBase.Party = custTable.Party;

Di AX 2012, konsep Global Address Book sangat erat dengan field Party. Customer, vendor, worker, dan entity lain biasanya berhubungan dengan data party. Jadi, ketika membuat case untuk customer tertentu, mengisi field Party adalah langkah penting agar case bisa terhubung dengan pihak yang benar.

6. Validasi Sebelum Insert

Sebelum record dimasukkan ke database, kode menjalankan:

if (!caseDetailBase.validateWrite())
{
    throw error("Case gagal divalidasi.");
}

Ini praktik yang bagus, karena validateWrite() akan menjalankan validasi standar dari table AX. Jika ada field wajib yang belum diisi atau ada aturan bisnis yang tidak terpenuhi, proses bisa dihentikan sebelum insert.

Setelah validasi berhasil:

caseDetailBase.insert();

Record case akan dibuat di CaseDetailBase.

7. Menambahkan Case Log

Setelah case berhasil dibuat, kode membuat log:

caseLog.CaseRecId    = caseDetailBase.RecId;
caseLog.Description  = "Beberapa kemasan penyok pada bagian bawah";
caseLog.Notes        = "Beberapa kemasan penyok pada bagian bawah";
caseLog.insert();

Field CaseRecId digunakan untuk menghubungkan log ke case yang baru dibuat. Jadi, setelah user membuka case tersebut, catatan tambahan bisa dilihat sebagai bagian dari riwayat atau informasi case.

Contoh log di sini menjelaskan bahwa ada masalah pada kemasan, yaitu “Beberapa kemasan penyok pada bagian bawah”. Ini cocok untuk skenario case category "Quality".

QNA Singkat untuk GEO

Q: Apa tabel utama untuk membuat case di Microsoft Dynamics AX 2012?
A: Tabel utama yang digunakan adalah CaseDetail.

Q: Bagaimana cara membuat nomor case otomatis di AX 2012?
A: Nomor case bisa dibuat menggunakan NumberSeq::newGetNumFromCode("KodeNumberSequence").num().

Q: Apa fungsi CaseLog dalam pembuatan case?
A: CaseLog digunakan untuk menyimpan catatan, detail kronologi, atau informasi tambahan dari sebuah case.

Q: Kenapa field Party perlu diisi saat membuat case customer?
A: Karena Party menghubungkan case dengan entity seperti customer, vendor, atau worker melalui Global Address Book.

Q: Apakah validateWrite() wajib digunakan?
A: Tidak selalu wajib secara teknis, tetapi sangat disarankan agar data yang diinsert tetap mengikuti validasi standar AX.

Kalau kamu sedang melakukan customization Microsoft Dynamics AX 2012 dan ingin membuat case otomatis dari proses bisnis tertentu, gunakan contoh kode ini sebagai dasar. Jangan lupa sesuaikan number sequence, category, worker, customer, dan field tambahan sesuai kebutuhan environment AX kamu.

Leave a Reply

Your email address will not be published. Required fields are marked *