Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Selasa, 22 Maret 2016

Dynamics AX Error ketika melakukan Report As Finished Production Order/Batch Order

Sebuah BO (Batch Order/Production Order) dengan tipe Rework dilakukan proses Report as Finished. Namun keluar error: 
The quantity cannot be reduced. The number of inventory transactions on order is too low because the quantity or part of it is referenced by an output order or a production order or is marked against other transactions.
Permasalahannya adalah karena jumlah inventory transaction dengan status Physical. Hal ini bisa dilihat di source tempat error tersebut keluar:
Class: 
class InventUpd_Estimated extends InventUpdate

Method:
protected void updateDepreciateIssue()

Pada method tersebut terlihat dilakukan query terhadap tabel InvenTrans dengan StatusIssue adalah >= StatusIssue::ReservPhysical

Seperti yang diketahui, untuk BO tipe rework harus dilakukan manual reservation dan tidak perlu dilakukan proses  pick saat membuat journal Picking List. Jika dilakukan proses picking maka manual reservation yang telah dibuat akan diupdate statusnya menjadi Picked.

Saat proses Report as Finished maka AX akan melakukan clearing terhadap status-status di inventrans, Karena dengan status Report as Finished maka remainder Qty RAF akan menjadi nol. Akibat adanya status Picked maka qty yg di clear tidak sama dengan nol.


Solusi untuk permasalahan ini adalah dengan melakukan un-pick. 


Maka proses Report as Finished akan berhasil.


Rabu, 27 Januari 2016

Custom Emal Notifikasi Workflow AX

Di dalam AX, fitur workflow akan menghasilkan notifikasi pada setiap step nya. Ketika submit, approve, reject, dan lainnya. Isi dari notifikasi tersebut dapat dibuat sesuai kebutuhan. Namun terbatas sesuai field-field yang telah di sediakan. Pada workflow tabel yang memiliki master dan detail maka tampilan detailnya secara standart sangat tidak informatif, yaitu memanjang ke samping, bukan per baris kebawah. Alhamdulillah, ada cara untuk mendesain notifikasi tersebut lebih bagus. Namun notifikasi via email. Pada dasarnya, yang di custom adalah tag pada mail template, bukan tag pada workflow instruction.

Sumber blog sebagai rujukan: https://workflowax.wordpress.com/2012/12/12/customize-your-ax-workflow-email-templates/

1. Membuat template email untuk workflow

Contoh yang saya buat:
Microsoft Dynamics AX alert
%for%

Alert Message
%message%
Additional Information:
%lpiwflinesdescription%
Sent by Dynamics AX Workflow System  
Please do not reply this email

Tag tambahan yang saya buat adalah %lpiwflinesdescription%.  Sedangkan tag-tag lain (seperti %for%) adalah standart yang ada di AX. Jika dijalankan sekarang, maka custom tag tersebut tidak akan di parsing.

2. Melakukan modifikasi kode untuk custom tag di email template

Ada dua bagian utama yang perlu di tambah, yaitu di tabel SysEmailTable dan di class EventNotificationWorkflow.
Pada tabel SysEmailTable, lakukan modifikasi pada method htmlEncodeParameters
(line 16)

while (mapEnum.moveNext()) { 
 //Modified by shindu 
 //10 Nov 2015 
 //Disable htmlEncode for customEmailTag 
 //OLD code: //encodedMap.insert(mapEnum.currentKey(),SysEmailTable::htmlEncode(mapEnum.currentValue())); 
 //New Code: 
if (subStr(mapEnum.currentKey(),1,3) == 'lpi') //All custom tag must start with lpi    encodedMap.insert(mapEnum.currentKey(), mapEnum.currentValue()); 
else encodedMap.insert(mapEnum.currentKey(),SysEmailTable::htmlEncode(mapEnum.currentValue())); //end by shindu 
 }

Fungsi modifikasi ini adalah agar tag HTML tidak diencode menjadi plain text. Jika standartnya semua HTML tag akan di konversi menjadi plain text. Namun tidak semua, hanya untuk tag tertentu. Dalam hal ini tag yang huruf depannya adalah lpi, karena nama tag barunya lpiwflinesdescription.

Kemudian lakukan modifikasi pada class EventNotificationWorkflow. Tambah method baru addCustomMergeValues

///
/// Function to add custom merge values.//////
/// Created by shindu 10 Nov 2015///
private void addCustomMergeValues(){
SysDictTable dictTable; 
ExecutePermission perm; 
str description; ; 
// 
if (!record) 
return; 
dictTable = new SysDictTable(record.tableid); 
if (!dictTable) return; 
if (dictTable.isMethodActual('lpiWFLinesDescription')) 
// Grants permission to execute the DictClass.callObject method. // DictClass.callObject is protected by code access security. 
perm = new ExecutePermission(); 
perm.assert(); 
try
description = dictTable.callObject('lpiWFLinesDescription',record); 
} catch (Exception::Error){ 
description = ""; 
} // // Closes the code access permission scope. 
CodeAccessPermission::revertAssert(); 
} else { 
description = ""; 
} this.addMergeValue("lpiwflinesdescription", description);
}

Method baru ini digunakan untuk mengisi data di tag baru yang telah dibuat. Karena tujuannya mencustom semua message dari workflow yang tabelnya berbeda-beda maka di method ini terlihat dilakukan proses call ke object table referensi ke method: lpiWFLinesDescription. Contoh jika refernsinya PurchTable maka akan dipanggil methode  lpiWFLinesDescription di tabel PurchTable. Untuk itu di langkah nomor 3 dibuat method tersebut pada setiap tabel yang ada workflownya.

Setelah dibuat method baru di class ini, pada method sendMail dilakukan modifikasi sehingga custom tag yang kita buat dimasukkan di list xml yang dikirim ke template email.
(line 25)

 if (sysUserInfo && userInfo && SysEmailDistributor::validateEmail(sysUserInfo.emailDisplay()))
    {
        this.addBaseMergeValues();
        //
        //Add by Shindu
        //to enable custom merge values
        //6 Nov 2015
        this.addCustomMergeValues();
        //endd add


        mergeValuesXml = EventActionEmail::createEmailParameterXml(mergeValues);

3. Tambah method lpiWFLinesDescription di semua tabel yang memiliki workflow

Seperti yang telah dijelaskan dilangkah 2, dibagian ini lah isi message custom yang kita buat harus ditambahkan. Kita ambil contoh kasus workflow untuk Purchase Order. Maka kita buat method baru ini di tabel PurchTable.



Kita lakukan formating di bagian ini. 

Hasil akhir

Setelah semua proses compile dilakukan, maka hasilnya akan seperti dabawah ini:







Sabtu, 12 Desember 2015

Berkelana ke Gili Labak

Rekan-rekan dari induk perusahaan berencana mengadakan liburan ke Gili Labak dengan menyewa travel (open trip). Namun ternyata pesertanya sedikit karena para ibu yang sebelumnya berniat ikut akhirnya mundur teratur begitu mengetahui route yang harus dilalui. Jadilah saya di tawari ikut trip tersebut. Biaya yang harus di keluarkan sebesar 240 ribu per orang. Dengan fasilitas transportasi ke Gili Labak pp, makan 2x,  jaket pelampung, dan snorkeling
Sempat terjadi perubahan rencana (ganti Travel Agent) akhirnya pada tanggal 11 Desember 2015 kita berkumpul di RS PHC sebagai meeting point area Surabaya. Dari jadwal jam 11.45 an kita berangkat ternyata mundur sampai hampir jam 2 dinihari kendaraan Long ELF baru datang. Bertambah parah lagi begitu tahu jumlah seat nya kurang 1. Akhirnya peserta perempuan yang kebetulan berbadan kecil-kecil semua mau mengalah untuk berbagi kursi (kursi 3 di dudukin 4 orang). Pak Vins sebagai koordinator acara ini sempat marah-marah dengan pihak Travel mengingat perjalanannya cukup jauh.

Stage 1: Surabaya-Kalianget ( 4 jam)

Surabaya-Kalianget
Perjalanan dini hari dengan cukup lancar karena lalu lintas sangat sepi. Hanya beberapa kali berpapasan atau mendahului truck atau bus. Jika perjalanan ini dilakukan di siang hari, maka dipastikan akan lebih lama karena di beberapa titik terdapat pasar. Seperti pada gambar di atas diambil di pukul 12:00 terlihat warna kuning di beberapa titik. Dari surabaya sekitar pukul 02:00 sampai di kalianget sekitar pukul 06:00. Di kalianget kita beristirahat sekalian makan nasi kotak. Seharusnya nasi kotak sudah di konsumsi ketika di surabaya, namun karena datangnya terlambat maka makannya di undur 4 jam kemudian. 


Stage 2: Menuju ke rumah singgah di Pulau Puteran (30 menit)

Jika travel lain kebanyakan dari kalianget langsung menuju ke pulau Gili Labak, maka travel ini harus menyeberang ke pulau Puteran dulu untuk menyeberang ke Gili Labak. Dengan menyerberang ke pulau Puteran maka waktu tempuh perjalanan laut berkurang sekitar 1 jam. Dari kalianget ke gili labak waktu tempunya 2 jam lebih dengan menggunakan kapal nelayan.
Proses menyeberang ke pulau puteran sangat cepat. Hanya 5-10 menit.
Kapal untuk menyeberang

Cukup 5 menit
Setelah menyeberang, ELF long berjalan menyusuri jalan desa yang juga cukup sepi menuju rumah singgah. Rumah singgah tersebut adalah rumah pemilik kapal yang nanti akan digunakan untuk menyeberang ke Gili Labak. Menyusuri jalan desa tersebut mengingatkan saya akan kampung halaman di Situbondo. Rumah-rumah sederhana dikelilingi oleh kebun-kebun gersang.

Pulau Puteran
Rumah Singgah di Pulau Puteran

Stage 3: Menyeberang ke pulau Gili Labak (1 jam)

Istirahat di rumah Singgah sekitar 1 jam sambil menunggu hujan yang turun cukup lebat. Sempat terpikir apakah gagal? Oh tidak....Setelah hujan reda mulai lah kita berjalan menuju bibir pantai dimana perahu untuk berangkat tertambat di tengah laut. Pada pagi hari air laut surut sehingga untuk menuju kapal harus berjalan dipantai yang surut sampai 100 meter.
Menuju perahu
Tertambat di tengah laut
Hujan di tengah laut

Perjalanan laut memakan waktu sekitar 1 jam. Menempuh jarak 12 km. Sempat hujan cukup deras diperjalanan. Bagi yang membawa barang-barang elektronik cukup merepotkan karena walaupun di perahu ada penutupnya. Saya sudah bersiap kondisi ini dengan membawa jas hujan, jadi tas yang berisi HP dan Kamera cukup aman terlindungi.
Rute ke pulau
Suasana di perahu
Cukup menyenangkan perjalanan dengan perahu ini. Mungkin karena baru pertama perjalanan dengan perahu selama 1 jam. Walau badan terasa sakit semua karena perahu tersebut memang sebenarnya perahu untuk mencari ikan. Akhirnya terlihat lah pulau Gili Labak dari kejauhan.
Kecil di kejauhan

Makin mendekat
Mendarat


@Gili Labak

Alhamdulillah sudah mendarat. Sudah cukup ramai pulau tersebut oleh pendatang. Terlihat orang-orang yang ber-snorkeling ria dihiasi jaket pelampung warna orange Kita istirahat dulu sambil makan ransum yang kita bawa. Matahari sudah cukup terik sehingga kita agak malas untuk mengexplorasi pulau kecil ini. Harus menunggu hingga pemandu mengajak berkeliling mengitari pulau (walau sebenarnya hanya separuh lingkaran). Kita lewati garis tengah pulau melalui rumah-rumah dan kebun yang ada.

Antara rumah penduduk/penginapan

Kebun
Beberapa menter kemudian terhamparlah pasir putih dengan sampan-sampan yang bersandar. Seandainya datang lebih pagi akan lebih menyenangkan lagi. Dengan sengatan sinar matahari jika tidak di lindungi dengan topi maka terasa cepat pusing.
Pasir putih
Setelah menikmati keindahan pasir, pantai, laut, dan sengatan sinar matahari saat nya mencoba pengalaman snorkeling. Saya sudah pernah sebelumnya di pantai pasir butih situbondo namun tidak terlalu berkesan karena kondisi terumbu karang yang sudah rusak. Sempat berpikir seperti itu juga kondisi di gili labak. Namun ketika mencoba sendiri, ternyata luar biasa kondisinya. Serasa melayang diatas karang-karang. Ketika agak ke tengah maka terlihat kontour dasar pantai seperti tebing .
Masyaallah

Karang alami
Lokasi untuk snorkeling cukup luas jadi jangan takut untuk kehabisan stok snorkeling. Namun biasanya untuk setiap group travel mereka berkumpul di satu area. Jika mencoba agak menjauh akan di datangi oleh pemandu untuk diingatkan agar tidak terlalu jauh dari kelompok. Sebenarnya hal ini untuk keamanan peserta sendiri karena bagaimana pun areanya adalah laut lepas dengan kedalaman bisa mencapai 3m.
Saya lupa berapa lama ber snorkeling ria. Mungkin 30-45 menit. Yang pasti setelah itu badan terasa capai sekali. Kembali ke darat, mengeringkan badan, kemudian tiduran di lincak beratapkan pohon kelapa.
Capek!



Setelah makan siang yang diberikan oleh pihak travel ditambah beli mie rebus akhirnya saya tidur beneran. Mungkin 30 menit an. Lumayan terasa segar lagi setelah bangun. Saat nya menyiapkan tenaga lagi untuk pulang. Kita tidak mandi di pulau gili labak, walaupun ada pemandian umum. Kita akan mandi di rumah singgah.

Pulang

Kira-kira pukul dua siang kita mulai meninggalkan pulau ini. 
Perjalanan pulang
Kembali dengan route yang sama, menyeberang 1 jam menuju rumah singgah. Kali ini perjalanan ditemani dengan angin yang bertiup cukup kecang sehingga ombaknya terasa cukup besar bagi kita yang cupu di dunia per lautan. Perahu terguncang sehingga membuat ada sedikit rasa khawatir. Terlebih jarak antara bibir perahu dan air hanya sekitar 30 cm. Jika ada ombah lebih besar lagi bisa saja air masuk. 
Ombak

Persimpangan
Akhirnya kita sampai lagi di darat. Kali ini air surah menggenangi area yang tadi pagi masih belum tergenang, sehingga perahu dapat merapat lebih dekat ke daratan. Namun tetap harus berbasah-basah dulu untuk sampai ke darat.

Dengan jumlah kamar mandi tiga buah, cukup mengantri karena jumlah peserta adalah sebanyak 15 orang. Segar rasanya setelah mandi, walau air nya terasa masih lengket di badan. Selesai mandi dan sholat, kita berangkat menuju kalianget. Rekan-rekan terlihat capai semua sehingga ketika menyeberang di kalianget tidak ada yang turun dari mobil. Setelah menyeberang dilanjukan perjalanan panjang menuju Surabaya. Akan lebih panjang lagi bagi peserta yang berangkat dari Pandaan. Perjalanan kembali cukup lancar, walau kondisi lalulintas lebih padat karena malam minggu. Kita sampai di surabaya sekitar pukul 21:30. Alhamdulillah