Sering sekali Web Developer bertanya kepada saya, Bagaimana cara menambahkan business-logic tertentu ketika sebuah atau bahkan beberapa Record akan dihapus dari Database? Atau pertanyaan yang mirip dengan itu adalah, Bagaimana cara mendapatkan data record yang akan sedang dihapus di sebuah Aplikasi Web?
Ketika sebuah Record atau bahkan beberapa Record akan dihapus dari Database melalui sebuah Aplikasi Web, maka beragam business-logic bisa diterapkan oleh Web Developer. Ada yang ingin merekam data tersebut terlebih dulu ke dalam tabel lain; ada juga yang ingin hanya merekam data tersebut ke file log, sebelum data tersebut akhirnya benar-benar dihapus. Atau bahkan, ada juga Web Developer yang ingin menjalankan pernyataan SQL tertentu untuk mengubah data terkait di tabel lain.
Tentu tidak ada yang salah dengan semua itu. Sayangnya, masih banyak Web Developer yang kesulitan dan kebingungan bagaimana cara menerapkan business-logic tersebut. PHPMaker bisa menangani setiap kemungkinan yang bisa terjadi saat event penghapusan Record. Tentu saja Anda sebagai Web Developer tidak akan mengalami kesulitan jika menggunakan PHPMaker sebagai tools untuk mengembangkan aplikasi berbasis web dengan cepat sekaligus berkualitas.
PHPMaker sudah menyediakan sebuah server event yang bernama Row_Deleting yang lokasinya berada di bawah Server Events -> Table-Specific -> Common di dalam project PHPMaker Anda. Pastikan sebelumnya Anda sudah memilih salah satu Table yang Anda inginkan dari panel Database di sebelah kiri dari project PHPMaker Anda, untuk memastikan Anda menambahkan kode di server event pada Table yang tepat.
Sesuai dengan namanya, server event ini akan dipanggil ketika ada Record yang akan dihapus dari Database. Yang enaknya adalah, server event ini dijalankan bukan hanya untuk menghapus satu Record saja, tapi berlaku juga untuk proses penghapusan beberapa Record sekaligus. Seperti yang kita ketahui, PHPMaker juga mendukung untuk pembuatan fitur penghapusan beberapa record sekaligus (Multiple-Delete).
Itulah mengapa server event ini disebut dengan Row_Deleting yang kurang lebih artinya adalah saat Baris atau Record atau Row sedang dihapus. Jadi, di samping berlaku untuk penghapusan satu Row, server event ini berlaku juga untuk penghapusan beberapa Row sekaligus dengan memanggil ulang server event ini untuk setiap Row yang dihapus.
Server event ini merupakan member dari Class Table. Anda sebagai Web Developer dapat menggunakan member lainnya yang terdapat di Class ini (jika dibutuhkan). Server event ini memiliki sebuah argumen yang berupa sebuah Record yang akan dihapus sebagai sebuah array. Artinya, Anda bisa menggunakan argumen ini untuk mengambil nilai di field tertentu dari Record yang akan dihapus tadi, menggunakan sintaks untuk mengakses elemen yang terdapat di sebuah array.
Supaya lebih jelas, mari kita simak contoh berikut. Katakanlah Anda ingin menampilkan data nama lengkap dari field Nama_Lengkap di tabel pelanggan sesaat sebelum sebuah Record dihapus. Untuk itu, maka kita dapat menggunakan kode seperti ini:
// Row Deleting event function Row_Deleting(&$rs) { // Enter your code here // To cancel, set return value to False $this->setSuccessMessage("Nama lengkap dari record yang dihapus: " . $rs["Nama_Lengkap"]); return TRUE; }
Setelah file script di-generate ulang oleh PHPMaker lalu Aplikasi Web dijalankan lewat browser, maka ketika Pengguna menghapus Record di tabel pelanggan maka sistem akan menampilkan pesan yang berisi Nama Lengkap data pelanggan yang dihapus. Artinya, jika hanya ada satu Record yang berhasil dihapus, maka akan muncul pesan sebanyak satu kali. Sedangkan jika ada beberapa Record dihapus (misalnya 3 Record), maka akan ada tiga baris pesan yang muncul memberitahukan data Nama Lengkap dari Record yang sedang dihapus.
Hal penting lainnya yang perlu Anda ketahui dari server event Row_Deleting adalah, bahwa dia dapat digunakan untuk mem-validasi terlebih dulu Record yang akan dihapus. Artinya, Anda sebagai Web Developer masih diberi kesempatan oleh PHPMaker untuk memeriksa data mana saja yang boleh dihapus, dan mana yang tidak.
Jika Anda tidak ingin menghapus Record tertentu, maka Anda dapat menambahkan kondisi tertentu, dan jika kondisi tersebut memenuhi syarat, maka cukup kembalikan nilai FALSE, sebaliknya untuk Record yang boleh dihapus, maka Anda cukup mengembalikan nilai TRUE. Wouw. Mudah sekali, bukan?
Pada contoh berikut akan ditunjukkan bagaimana caranya memeriksa record yang tidak boleh dihapus jika memenuhi kriteria tertentu. Katakanlah dari 10 Record yang akan dihapus (menggunakan fitur Multiple-Delete di PHPMaker), terdapat 3 Record yang tidak boleh dihapus.
Kriteria dari Record-Record yang tidak boleh dihapus itu adalah jika nilai field Nama_Lengkap-nya masing-masing sama dengan Masino Sinaga, Dorce Simatupang, dan Elvis Sinaga. Mari langsung simak kode berikut:
// Row Deleting event function Row_Deleting(&$rs) { // Enter your code here // To cancel, set return value to False if ($rs["Nama_Lengkap"] == "Masino Sinaga" || $rs["Nama_Lengkap"] == "Dorce Simatupang" || $rs["Nama_Lengkap"] == "Elvis Sinaga") { $this->setWarningMessage("Tidak diijinkan dihapus: " . $rs["Nama_Lengkap"]); return FALSE; } return TRUE; }
Setelah file script untuk Aplikasi Web di-generate ulang oleh PHPMaker, kemudian Aplikasi Web dijalankan dari browser, lalu Pengguna mencoba menghapus 10 Record, di mana tiga di antaranya memenuhi kondisi yang tidak boleh dihapus, maka jika sistem baru menemukan satu Record saja yang memenuhi syarat untuk tidak boleh dihapus, sistem akan menampilkan pesan yang menyatakan bahwa Record tersebut tidak dapat dihapus. Seketika itu juga proses penghapusan akan dibatalkan oleh sistem.
Artinya, ketika satu Record saja tidak boleh dihapus sesuai dengan kondisi tadi, maka Record-Record lainnya yang meskipun memenuhi syarat untuk dihapus pun akan dibatalkan penghapusannya. Jadi, penghapusan beberapa Record lainnya baru bisa dilakukan jika tidak ada satupun Record yang memenuhi syarat untuk tidak boleh dihapus.
Sekarang mari kita simak contoh lainnya bagaimana Web Developer dapat mengupdate data di Table terkait lainnya ketika sebuah Record yang terkait dengan Table tersebut dihapus dari Database:
function Row_Deleting(&$rs) { // Enter your code here // To cancel, set return value to False ew_Execute("UPDATE table_lain SET Field1 = 'deleted' WHERE ID_Table = '".$rs["id"]."'"); return TRUE; }
Betapa mudahnya kita bisa memperbarui record di Table lain hanya dengan menambahkan satu baris kode saja. Kode ini akan berlaku juga untuk penghapusan beberapa Record sekaligus, dan akan memperbarui Record yang terkait di Table lainnya.
Inilah beberapa bukti yang menunjukkan bahwa server event ini akan dijalankan untuk setiap Record atau Row yang dihapus di level Table. Setiap Record akan memanggil server event ini saat sedang dihapus. Sampai di sini saya berharap Anda memahami kemampuan dan kehebatan dari server event ini sehingga dapat Anda gunakan sebagaimana mestinya.
See? Betapa mudah, cepat, sekaligus menyenangkan sekali bukan menerapkan business-logic sendiri melalui server event yang telah disediakan oleh PHPMaker? Betapa PHPMaker sudah menangani hal-hal seperti ini, yang justru sering kali dirasakan sebagai hambatan bagi Web Developer ketika akan menerapkan business-logic tertentu saat Record akan dihapus dari Database pada Aplikasi Web yang mereka bangun. π
Rijal mengatakan
Pak Masino, sy mau taya nihhh, bagaimana cara memunculkan Form (hanya Textarea) di halaman Konfirmasi Hapus.
Jadi kasusnya gini Pak.
Misal saya Punya Tabel :
1. Tabel Barang : kode_barang, nama_barang.
2. Tabel Hapus_Barang : id_hapus, kode_barang, nama_barang, keterangan.
Jadi ketika mau Hapus Data di Tabel barang , akan di arahkan ke Halaman Konfirmasi Hapus dulu, namun disitu akan di munculkan Textarea => untuk menginput Keterangan (mengapa data tsb di hapus).
Jika Textarea (field keterangan) tsb sudah di isikan maka Data Barang tsb (sesuai kode_barang) akan di insert ke Tabel Hapus_Barang.
Tujuannya agar Setiap Barang yg di hapus tetap ada Dokumentasinya di Tabel Hapus Barang.
Masino Sinaga mengatakan
Kalau menggunakan fitur Hapus langsung milik tabel Barang memang tidak bisa, karena tidak ada fitur khusus seperti itu.
Tapi bukan PHPMaker namanya jika Web Developer tidak bisa mengakalinya. Anda bisa saja tetap menggunakan link Delete dari tabel Barang, lalu mengarahkannya ke halaman Add milik tabel Hapus_Barang, dengan menyertakan parameter yang diperlukan pada link Delete yang bisa Anda ubah menggunakan server event ListOptions_Rendered milik tabel Barang.
Selanjutnya, tampung data yang terkait dari URL atau link dari tabel Barang tadi ke dalam form Add milik tabel Hapus_Barang. Jadi, tidak perlu lagi mengaktifkan halaman konfirmasi.
Setelah itu, maka cukup eksekusi script DELETE data di tabel Barang dari server event Row_Inserted milik tabel Hapus_Barang tersebut. Tujuannya untuk memastikan log dokumentasi penghapusan ditambahkan terlebih dulu, baru setelah itu menghapus data terkait di tabel Barang.
Gampang sekali, kan? π
Rijal mengatakan
sudah ada gambaran pak, tapi masih agak bingung, hehe…
di bagian ini Pak :
Bagaimana cara merubah default Link Delete di Tabel Barang melalui Project.
yg tadinya : barangdelete.php?kode_barang=100 menjadi hapus_barangadd.php?kode_barang=100
(merubah default Link Delete menjadi diarahkan ke halaman hapus_barang add dgn menyertakan ID/ Kode Barang terkait)
Trimakasih atas Responnya.
Masino Sinaga mengatakan
Ini dia cara mengubah link Hapus di halaman List: Mudahnya Mengubah Link Hapus di Halaman List Aplikasi Web dari PHPMaker.
Dadan Hermansah mengatakan
pak, jika kita menghapus record dari sebuah tabel dan record yang telah kita hapus tadi ingin ditambahkan di tabel lain contohnya penghapusan. Bagaimana ya?
Mohon pencerahannya, terima kasih!
Masino Sinaga mengatakan
Sama seperti code pada server event Row_Deleting di atas yang mengubah data di table lain.
Tinggal tambahkan aja kode yang memanggil function ew_Execute() untuk menjalankan perintah penambahan (INSERT INTO) data ke table lain.
roni mengatakan
Pak saya mau tanya bagaimana cara memvalidasi hapus tabel barang yang sudah terjadi transaksi penjualan supaya tabel tersebut divalidasi bahwa tabel tersebut tidak bisa dihapus karena sudah ada transaksi penjualan. Mohon pencerahannya pak.
Masino Sinaga mengatakan
Ya tinggal periksa aja di server event Row_Deleting dengan mengeksekusi query SQL SELECT ke table terkait. Jika data ditemukan, tampilkan pesan dan kembalikan nilai FALSE.
Pramudiyanto mengatakan
Seandainya yang dihapus adalah tabel detail di modul master/detail bagaimana?
Masino Sinaga mengatakan
Ya tinggal tambahkan saja kode Anda di server event Row_Deleting milik tabel detail tersebut.
ameisfine mengatakan
Pak Masino, sy punya script sbb:
Saya pasang di Row_Inserted dan Row_Updated hasilnya sesuai (bisa update) tapi ketika saya pasang di Row_Deleted kok tidak ada update di dbnya ya? apa harus ada perlakukan khusus? what’s wrong ? Thnks
$abc = $this->Product_Code->CurrentValue;
$cogs = ew_ExecuteScalar(“SELECT SUM(Cogs_Cost) FROM a_costing_cogs WHERE Product_Code = ‘$abc'”);
$usdrate = ew_ExecuteScalar(“SELECT USD_Rate FROM a_usdrate WHERE Rate_ID = ‘1’”);
$volpack = ew_ExecuteScalar(“SELECT vol_pack FROM products WHERE Product_Code = ‘$abc'”);
$over1 = ew_ExecuteScalar(“SELECT sum(Overhead1_Cost_Year) FROM a_overhead1 WHERE Overhead1_ID between 0 and 20”);
$total_prod_usd = ($cogs + ($over1 * $volpack)) / $usdrate;
ew_Execute(“UPDATE products SET Total_Production_CostUSD = “.$total_prod_usd.” WHERE Product_Code = ‘$abc'”);
Masino Sinaga mengatakan
Pastikan variable $abc nilainya valid. Coba tampilkan dengan kode:
$this->setMessage(“Nilai $abc = ” . $abc);
setelah baris ini:
$abc = $this->Product_Code->CurrentValue;
ameisfine mengatakan
Iya pak sudah saya pasang $this->setMessage(βNilai $abc = β . $abc);
hasilnya
di Row_Inserted = keluar hasilnya benar
di Row_Updated = keluar hasilnya benar
di Row_Deleted = tidak muncul apa2
berarti systaxnya musti dibenerin gimana ya pak?
Masino Sinaga mengatakan
Gunakan $rs[“Product_Code”].
ameisfine mengatakan
Makasih makasih
Hafiedh mengatakan
Pak saya mau tanya cara menghapus isi tabel database tapi kalau ada data yang sama/saling berhubung tidak dapat dihapus itu bagaimana caranya??
Masino Sinaga mengatakan
Caranya tinggal dibuatkan dulu query SELECT untuk menampilkan data dengan kriteria yang sama/saling berhubungan tadi.
Setelah itu, buatkan lagi query SELECT untuk menampilkan data di luar kriteria tadi, lalu pastikan bahwa kedua bagian terpisah tadi sesuai dengan yang Anda inginkan.
Jika sudah yakin, ganti perintah SELECT menjadi DELETE FROM … untuk menghapus data di luar kriteria tadi.