Semakin sering Anda bereksperimen menggunakan PHPMaker dalam membangun Aplikasi Web, maka akan semakin banyak hal-hal baru yang akan Anda ketahui. Tidak hanya hal baru saja yang akan Anda temui, tetapi juga banyak sekali keuntungan yang akan Anda alami dan rasakan sendiri. Sayang sekali jika Anda sebagai Web Developer mengabaikan dan tidak mengoptimalkan semua itu.
Hari ini kita akan mengeksplorasi lagi salah satu kemampuan PHPMaker yang demikian hebat dan powerful. Namun, di balik kehebatannya itu, PHPMaker masih tetap mengandalkan kesederhanaan. Artinya, sekalipun tujuan yang kita inginkan bisa tercapai dengan sangat mudah dan cepat, tetapi PHPMaker masih tetap mengutamakan kesederhanaan dalam penulisan kode.
Contoh, seperti yang Anda baca pada judul artikel ini. Kita dapat memperbarui nilai Total di table Master berdasarkan hasil penjumlahan field tertentu yang terdapat di tabel Detail. Ya, betul. Dalam hal ini ada dua table yang kita libatkan, dan keduanya memiliki relasi sebagai Master/Detail.
Artinya, kita sebagai Web Developer dapat memperoleh dengan sangat mudah dan cepat nilai hasil penjumlahan field terkait di table Detail, lalu memperbarui field tertentu di table Master dengan hasil tadi. Masih bingung juga? Jangan khawatir, karena Anda dapat memahaminya melalui contoh kasus yang sangat sederhana berikut.
Katakanlah kita memiliki dua buah table yang masing-masing sebagai Master dan Detail, yaitu: categories (Master) dan category_detail (Detail). Struktur kedua tabel dan datanya adalah sebagai berikut:
-- ---------------------------- -- Table structure for categories -- ---------------------------- DROP TABLE IF EXISTS `categories`; CREATE TABLE `categories` ( `Cat_ID` int(11) NOT NULL AUTO_INCREMENT, `Cat_Name` varchar(50) DEFAULT NULL, `Cat_Date` datetime DEFAULT NULL, `Cat_Total` int(11) DEFAULT NULL, PRIMARY KEY (`Cat_ID`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of categories -- ---------------------------- INSERT INTO `categories` VALUES ('1', 'First Category', '2014-11-26 09:33:26', '150'); INSERT INTO `categories` VALUES ('2', 'Second Category', '2014-11-26 09:33:41', '45'); -- ---------------------------- -- Table structure for category_detail -- ---------------------------- DROP TABLE IF EXISTS `category_detail`; CREATE TABLE `category_detail` ( `Det_ID` int(11) NOT NULL AUTO_INCREMENT, `Cat_ID` int(11) DEFAULT NULL, `Description` varchar(50) DEFAULT NULL, `Value` int(11) DEFAULT NULL, PRIMARY KEY (`Det_ID`) ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of category_detail -- ---------------------------- INSERT INTO `category_detail` VALUES ('1', '1', 'First Detail in First Cat', '10'); INSERT INTO `category_detail` VALUES ('2', '1', 'Second Detail in First Cat', '20'); INSERT INTO `category_detail` VALUES ('3', '1', 'Third Detail in First Cat', '30'); INSERT INTO `category_detail` VALUES ('4', '2', 'First Detail in Second Cat', '5'); INSERT INTO `category_detail` VALUES ('5', '2', 'Second Detail in Second Cat', '7'); INSERT INTO `category_detail` VALUES ('6', '2', 'Third Detail in Second Det', '9'); INSERT INTO `category_detail` VALUES ('7', '2', 'Fourth Detail in Second Det', '11'); INSERT INTO `category_detail` VALUES ('8', '1', 'Fourth detail in First Cat', '40'); INSERT INTO `category_detail` VALUES ('9', '1', 'Fifth Detail in First Cat', '50'); INSERT INTO `category_detail` VALUES ('10', '2', 'Fifth detail in Second cat', '13');
Berdasarkan kedua table tersebut, ada kebutuhan untuk memperbarui hasil penjumlahan di kolom Value pada table category_detail berdasarkan Cat_ID tertentu, lalu hasilnya akan memperbarui nilai field Cat_Total yang terdapat di table categories. Sudah semakin jelas sekarang?
Nah, pertanyaannya adalah, bagaimana cara kita memperbarui nilai field Cat_Total di table categories (Master) setiap kali Pengguna menambahkan data detail di table category_detail?
Jawabannya ternyata sangatlah simpel. Kita cukup menambahkan dua baris (betul, hanya dua baris!) kode PHP berikut ke dalam server event Row_Inserted milik table category_detail (Detail):
$tot_det = ew_ExecuteScalar("SELECT SUM(Value) FROM category_detail WHERE Cat_ID = ".$rsnew["Cat_ID"].""); ew_Execute("UPDATE categories SET Cat_Total = ".$tot_det." WHERE Cat_ID = ".$rsnew["Cat_ID"]."");
Perhatikanlah kode tersebut. Kode di baris pertama berfungsi untuk menjumlahkan nilai di field Value berdasarkan data kunci di field Cat_ID. Kode di baris kedua selanjutnya akan memperbarui nilai di field Cat_Total pada table categories berdasarkan hasil penjumlahan yang sebelumnya sudah ditampung di variabel $tot_det.
Kita menggunakan server event Row_Inserted untuk memastikan data yang ditambahkan oleh Pengguna sudah berhasil masuk ke Database, dan setelah itu barulah mengeksekusi kedua baris kode di atas. Dengan cara ini, maka kita dapat mengoptimalkan nilai kunci yang terdapat di $rsnew[“Cat_ID”].
Jadi, setiap kali Pengguna menambahkan data baru di table category_detail, maka hasil penjumlahan di kolom Value untuk Cat_ID yang terpilih akan otomatis memperbarui nilai di field Cat_Total pada table categories.
Eit, tapi jangan puas dulu. Mungkin di antara Anda ada yang bertanya “Lha itu kan kalau saat menambah data. Lalu bagaimana saat mengubah dan menghapus data detail?”. Hohoho! Pertanyaan yang sangat bagus!
Jika Pengguna mengubah data pada field Value di table Detail, maka itu artinya nilai ID yang digunakan adalah nilai ID yang sudah ada. Artinya, nilai ID berasal dari Recordset yang lama ($rsold), sehingga kode di atas tadi menjadi seperti ini di dalam server event Row_Updated:
$tot_det = ew_ExecuteScalar("SELECT SUM(Value) FROM category_detail WHERE Cat_ID = ".$rsold["Cat_ID"].""); ew_Execute("UPDATE categories SET Cat_Total = ".$tot_det." WHERE Cat_ID = ".$rsold["Cat_ID"]."");
Sedangkan jika Pengguna menghapus data, maka Anda harus menangani sampai dengan kemungkinan jika Record di table Detail tersebut sudah tidak ada lagi. Selain itu, server event yang terkait dengan penghapusan data tidak memiliki recordset $rsold dan $rsnew, tapi menggunakan $rs saja, sehingga kode di atas menjadi seperti berikut ini di dalam server event Row_Deleted:
$rec_cnt_det = ew_ExecuteScalar("SELECT COUNT(Value) FROM category_detail WHERE Cat_ID = ".$rs["Cat_ID"].""); if ($rec_cnt_det > 0) { $tot_det = ew_ExecuteScalar("SELECT SUM(Value) FROM category_detail WHERE Cat_ID = ".$rs["Cat_ID"].""); ew_Execute("UPDATE categories SET Cat_Total = ".$tot_det." WHERE Cat_ID = ".$rs["Cat_ID"].""); } else { ew_Execute("UPDATE categories SET Cat_Total = 0 WHERE Cat_ID = ".$rs["Cat_ID"].""); }
Wow, betapa mudah dan cepatnya, bukan? Kita hanya perlu menambahkan sedikit kode saja untuk mengimplementasikan kebutuhan tadi! Selebihnya, untuk yang hal-hal/urusan teknis, cukup kita serahkan kepada PHPMaker!
Bayangkan, betapa PHPMaker telah menyediakan kerangka kerja yang demikian rapi dan sangat terstruktur, yang memungkinkan Web Developer dapat bekerja dengan sangat mudah dan cepat! 😀
Herman mengatakan
Terima kasih Master ini yang saya tunggu-tunggu…
Masino Sinaga mengatakan
Hehehe… sama-sama. 🙂
ardi mengatakan
pak, saya mau tanya kebetulan pake php maker10
saya buat 3 buah input
1. kolom input jumlah
2. kolom input harga
3. kolom input total harga
gimana caranya ketika kita menginputkan data pada kolom input jumlah dan input harga otomatis kolom input total harga akan keluar otomatis hasil dari perkalian jumlah dan harga
Masino Sinaga mengatakan
Mengenai hal ini sudah pernah dibahas, langsung saja ke artikel Menampilkan Hasil Perhitungan pada Sisi Client di Aplikasi Web dari PHPMaker.
ARDI mengatakan
makasih pak. saya udah nyari 3 hari gak ketemu ketemu akhirnya ketemu. kesulitan saya pake script di di phpmaker karena tidak tau nama nama kelas yang di phpmaker contohnya keyup(function ()) ini juga baru tahu. tutorialnya banyak banget pak, makasih banyak. kalo boleh minta tolong bagaimana cara membuat tabel didalam frame. karena kesulitan ketika menampilkan tabel dengan jumlah field yang banyak. contoh seperti ini http://loebizpiss.blogspot.com/2012/11/membuat-frame-tabel-html-dan-php.html
Masino Sinaga mengatakan
Anda tidak perlu membuat fitur seperti itu di Aplikasi Web yang dihasilkan oleh PHPMaker. Tentu Anda akan bertanya: Mengapa?
Jawabannya: Karena PHPMaker sudah menangani hal ini melalui pemakaian extension yang bernama ScrollingTable. Jadi, ketika jumlah field terlalu banyak sehingga lebar total tabel melebihi lebar layar komputer, maka sistem akan otomatis menampilkan horizontal scroll di table-nya.
Extension ini saya kembangkan lagi dengan menambahkan banyak fitur advanced sehingga menghasilkan MasinoFixedWidthSite11 (untuk PHPMaker 11), dan bisa didownload jika sudah menjadi member di situs http://www.ilovephpmaker.com
Edi mengatakan
kalo di implementasikan di aplikasi Penjualan bgaimana ya ?
ketika ada proses Penjualan Barang berarti otomatis ada pengurangan jumlah Stok di Tabel Barang.
Masino Sinaga mengatakan
Anda bisa melihat contoh pengimplementasiannya melalui salah satu project open-source yang saya bikin di http://sourceforge.net/projects/stock-inventory-management/
Jika ingin memperoleh file project PHPMaker-nya, silahkan download dari http://www.ilovephpmaker.com.
Adhie mengatakan
Selamat siang pak,
Saya sedang membangun inventory system, misal ada 2 table: “products” dan “checkout”
Bagaimana caranya supaya ketika saya memasukan “quantity” di check out, maka otomatis akan mengurangi “stock” di table “products”.
Terakhir, bagaimana cara menampilkan peringatan, atau error message jika “quantity” yang diminta melebihi sisa stock.
Terimakasih sebelumnya.
Salam.
Masino Sinaga mengatakan
Anda bisa menggunakan server event Row_Inserted di table checkout dengan menjalankan SQL Update untuk mengurangi jumlah stok di table products.
Untuk menampilkan pesan peringatan dan membatalkan proses transaksi, Anda bisa menggunakan server event Row_Inserting di table checkout.
Untuk info lebih lanjut, silahkan pelajari topik Server Events and Client Scripts dari menu Help PHPMaker.
Liang mengatakan
Kalau kek gini salahnya dimana ya?
$MyResult = ew_Execute(“UPDATE products SET quantity=quantity-qty WHERE id=product_id”);
Keterangan:
products = tabel produk
quantity = field jumlah stok di tabel produk
qty = field jumlah barang keluar di tabel checkout
id = primary key di tabel produk
product_id = foreign key untuk id produk di tabel checkout
makasih
Masino Sinaga mengatakan
Salahnya di bagian clausa WHERE id=product_id.
Taufiq mengatakan
Pak saya sedang buat database visitor management. Yang ingin saya tanyakan bagaimana cara buat data visitor check out dengan mengupdate di data table visitor check in-out.
Terima kasih
Masino Sinaga mengatakan
Caranya ya dibuat saja dulu. 🙂
Irwanto mengatakan
Selamat Siang . saya punya form master detail (permintaan pembelian).
-> Next process pembuatan PO,
yang mau saya tanyakan, saat pembuatan PO, setelah pilih No permintaan pembelian(form 1) , maka detailnya otomatis terisi dari detail permintaan pembelian.
untuk PHPMaker Apa memungkinkan?