Salah satu fitur unggulan di PHPMaker sejak dulu sampai sekarang adalah kemampuan untuk menambah data Master dan Detail sekaligus dalam satu halaman. Pengguna bisa langsung menambahkan data di bagian Master, dan juga data yang bisa mencapai lebih dari satu baris di bagian Detail.
Mungkin tidak banyak di antara kita yang mengetahui, bagaimana business-logic penyimpanan data di Master/Detail Add tadi. Karena ada lebih dari satu tabel yang terlibat di halaman ini (tabel Master dan tabel Detail), maka kita harus bisa memastikan terlebih dulu, bagaimana aturan yang digunakan oleh PHPMaker saat proses penyimpanan datanya.
Sampai dengan versi 2020, PHPMaker masih menggunakan aturan yang apabila validasi di bagian tabel Detail tidak lolos, maka data di tabel Master akan tetap tersimpan ke Database. Artinya, dalam hal ini data di bagian tabel Detail yang terkait dengan record di tabel Master tadi menjadi kosong. Hanya data di tabel Master saja yang tersimpan.
Tentu saja, sebagai Web Developer, kadang-kadang kita tidak menginginkan kondisi tersebut terjadi. Seringkali bahkan kita harus menerapkan aturan, bahwa data di bagian Detail juga harus ada tersimpan ke Database jika data Master-nya berhasil masuk ke Database. Artinya, kita tidak boleh mengijinkan data Detail kosong, sementara data Master-nya berhasil masuk ke Database.
Jadi, dalam hal ini kita harus bisa menangani kemungkinan jika data di tabel Detail tidak lolos proses validasi, maka data di bagian Master tidak boleh tersimpan ke Database. Kesimpulannya, data di bagian Master dan Detail tadi benar-benar harus sudah lolos proses validasi oleh sistem, barulah bisa disimpan sekaligus ke Database.
Pertanyaannya, bagaimana cara kita untuk menerapkan aturan tadi? Sementara yang kita ketahui, PHPMaker masih membolehkan data Master tersimpan, tapi data di tabel Detail tidak tersimpan sama sekali.
Untungnya, PHPMaker sudah menyediakan server event yang bernama Grid_Inserting. Melalui server event ini, kita bisa menangani jika data di tabel Master sudah terlanjur tersimpan, maka kita harus menghapusnya, karena sistem masih tetap menampilkan form Master/Detail Add dalam keadaan terbuka, jika proses validasi di bagian tabel Detail tidak lolos.
Untuk menerapkan aturan yang kita inginkan tersebut, maka kita bisa menggunakan kode berikut di dalam server event Grid_Inserting milik tabel Detail, selengkapnya begini:
// Grid Inserting event function Grid_Inserting() { // Enter your code here // To reject grid insert, set return value to FALSE $rsnew = $this->getGridFormValues(); // Get the form values of the new records as an array of array $Jumlah_Kirim = 0; $sMsg = ""; $i = 0; foreach ($rsnew as $row) { // Loop through the new records $Jumlah_Kirim = intval($row["Jumlah_Kirim"]); if (empty($Jumlah_Kirim)) { $sMsg .= "<strong>" . $row["Barang"] . "</strong>, "; $i++; } } $sMsg = rtrim($sMsg, ","); if (!empty($sMsg)) { Execute("DELETE FROM kirim WHERE ID_Transaksi = '" . $GLOBALS['kirim']->ID_Transaksi->CurrentValue . "'"); $this->setFailureMessage("Ada <strong>" . $i . "</strong> barang yang Jumlah Kirimnya masih kosong, yaitu: " . $sMsg . ".<br><br>Pastikan Jumlah Kirim tidak kosong ..."); return FALSE; } return TRUE; }
Dari contoh kode di atas, kita memvalidasi bahwa tidak boleh ada record yang nilai di field Jumlah_Kirim bernilai nol atau kosong. Jika ada, maka kita harus menampung data Barangnya ke dalam variabel $sMsg di dalam blok loop foreach, dan jika variabel ini tidak kosong, maka itu artinya ada data di bagian Detail yang tidak lolos validasi.
Selanjutnya, kita menampilkan pesan dengan memanggil method setFailureMessage milik object Table atau Page, dengan menampilkan Barang mana saja yang tidak lolos validasi, tapi… sebelumnya kita harus menghapus data di tabel kirim sebagai Master-nya. Jangan lupa, kita harus mengembalikan FALSE supaya form Master/Detail Add masih dalam posisi terbuka.
Betapa mudah dan menyenangkan sekali, bukan? Cukup melalui server event Grid_Inserting, kita sudah bisa menerapkan business-logic penyimpanan data di halaman Master/Detail Add.
Hehe, masih membuat aplikasi web dengan cara-cara konvensional, dan belum menggunakan PHPMaker? 😉
Dengan tujuan yang sama, Bagaimana jika kita menggunakan fitur field mandatory saja Pak? bukannya bisa saja kan pak? Jadi data tidak bisa save jika ada field kosong di entry detail table.
Jika yang dimaksudkan adalah dengan mengaktifkan opsi Required dari Fields setup -> Edit Tag -> Validation, maka tidak selamanya bisa lolos validasi jika diisi dengan nilai 0 (nol). Sistem akan menganggap nilainya ada, sehingga validasi akan selalu mengembalikan nilai TRUE.
Untuk case seperti tadi, maka tetap harus divalidasi ulang lagi dari server event Grid_Inserting tersebut.
Iya betul itu yg sy maksud pak. Oke2 terimakasih atas pencerahannya..
Sama-sama. 😉