Ketika Anda membuat relasi Master/Detail, Anda menghubungkan dua buah Tables sehingga semua record dari salah satu tabel (tabel Detail) selalu terkait dengan satu record di tabel lainnya (tabel Master). Setiap Table dapat memiliki beberapa table Master dan juga beberapa table Detail.
PHPMaker sebagai tools PHP Code Generator sudah menyediakan fitur Master/Detail yang memungkinkan Web Developer dapat membuat halaman yang terdiri dari beberapa tabel yang memiliki relasi Master/Detail dengan mudah, cepat, dan menyenangkan. Fitur Master/Detail berada di bawah menu tab Table. Supaya Anda dapat menampilkan menu tab Table, maka pastikan Anda sudah memilih (klik) salah satu object Table dari panel Database.
Anda dapat membuat relasi Master/Detail (One-To-Many) di antara dua buah tabel dengan cara sebagai berikut:
- Pilih sebuah Table di grid table,
- Di panel [Master/Detail] pada bagian paling bawah sebelah kanan, klik [Modify…] untuk menampilkan editor visual relasi Master/Detail.
- Klik [Add table] untuk menambahkan table Master dan Detail ke dalam diagram.
- Buat relasi di antara mereka dengan cara menyeret (drag) field di table Master (field kunci di table Master) ke field Detail (field foreign key di table Detail). Jika ada lebih dari satu field yang ingin direlasikan, ulangi langkah tadi sampai semua relasi berhasil dibentuk.
Jika Anda ingin menghapus relasi suatu Master/Detail, pilih link pada diagram, lalu klik [Delete]. Setelah itu, klik tombol [OK] untuk mengkonfirmasikan.
Sejak versi 10, PHPMaker menambahkan tiga buah fitur baru di Master/Detail yang memungkinkan Web Developer menentukan apakah dalam relasi Master/Detail tersebut diterapkan beberapa aturan untuk menjaga integritas data antara table Master dan Detail. Kalau dulu Anda pernah mencoba Referential Integrity, Cascade Delete, dan Cascade Update di database Microsoft Access, maka seperti itu jugalah fitur yang akan kita bahas berikut.
Referential Integrity
Fitur ini memaksa Pengguna tidak dapat menambah/mengubah sebuah record di table Detail, kecuali data di field yang bertindak sebagai foreign key, mengacu ke sebuah record yang valid di table Master. Pengguna aplikasi web Anda akan melihat pesan bahwa foreign key dari record yang akan ditambah/diubah tidak mengacu ke record yang valid di table Master. Dengan kata lain, data di table Detail hanya bisa diubah jika data foreign key di table Master sudah terdapat di sana.
Cascade Delete
Fitur ini mengatur jika sebuah record di table Master dihapus, maka semua record yang terkait di table Detail akan dihapus juga. Sebelum fitur ini ditambahkan di PHPMaker, maka Anda harus menangani kemungkinan tersebut dengan menggunakan Server Events di PHPMaker. Perlu diingat bahwa jika Anda sudah menggunakan ON DELETE CASCADE pada Table di database, maka Anda tidak perlu mengaktifkan fitur ini. Hanya gunakan fitur ini jika database Anda tidak mendukung ON DELETE CASCADE.
Cascade Update
Fitur ini akan mengatur jika kunci utama primary key untuk sebuah record yang berada di table Master diubah/diperbarui, maka semua record yang terkait di table Detail akan diperbarui. Sebelum fitur ini ditambahkan di PHPMaker, maka Anda harus menangani kemungkinan tersebut dengan menggunakan Server Events di PHPMaker. Perlu diingat bahwa jika Anda sudah menggunakan ON UPDATE CASCADE pada Table di database, tidak perlu mengaktifkan pengaturan ini. Hanya gunakan fitur ini jika database yang Anda gunakan tidak mendukung ON UPDATE CASCADE.
Tidak berhenti di situ saja. Sejak PHPMaker versi 10, Anda sebagai Web Developer dapat mengoptimalkan fitur Master/Detail Add untuk membuat form untuk menginput data yang melibatkan satu table Master dengan beberapa table Detail. Hal yang sama juga dengan fitur Master/Detail Edit untuk mengubah data yang melibatkan satu table Master dengan beberapa table Detail, dan Master/Detail View untuk menampilkan data yang melibatkan satu table Master dengan beberapa table Detail.
Bahkan, PHPMaker juga memungkinkan Pengguna aplikasi web Anda nantinya menambahkan, mengubah, dan menghapus beberapa record di bagian Detail dalam format grid table (Grid-Add dan Grid-Edit), sebelum akhirnya menyimpan semua perubahan tadi ke database cukup dengan sekali klik saja.
jen mengatakan
Bang Masino..
Mohon pencerahannya.. Gimana caranya supaya bisa menapilkan beberapa tabel sekaligus di master/detail? kalau saya aktifkan “multiple detail tables” tidak terjadi apa-apa setelah klik tombol master/detail. kalau tidak diaktifkan, harus pilih detailnya satu-satu.. cukup merepotkan.. 🙂
thanks in advance..
Masino Sinaga mengatakan
Mengaktifkan “Multiple detail tabels” itu baru hanya untuk tabel master-nya. Sedangkan untuk tabel-tabel detail-nya, pastikan juga Anda sudah mengaktifkan setting “Master/Detail Add (as Detail)”, “Master/Detail Edit (as Detail)”, dan “”Master/Detail View (as Detail)”.
jen mengatakan
thank you so much Master.. it perfectly works..
firman mengatakan
mas saya mau tanya ,
ini saya buat relasi tabel a dan tabel b hasilnya kalau di klik ada pilihan add tapi kenapa kalau saya buat relasi tabel A tabel B tabel C tidak mau keluar tanda add nya dan nama nya berubah menjadi master detail ? bagaimana solisinya???
Masino Sinaga mengatakan
Maksudnya Tabel C adalah detail dari Tabel B, dan Tabel B adalah detail dari Tabel A, gitu? Atau bagaimana?
firman mengatakan
kemarin udah bisa mas ternyata … masalahnya master detailnya kecentang …. btw emang kalau master detailnya kecentang itu ga bisa kita add item ya …
oh iya mau tanya lagi mas gimana cara nya supaya text field itu bisa lebih dari satu tapi di simpannya dalam 1 field kayak kalau kita buat check box kan bisa milih banyak item tapi ini bedanya di ketikan soal nya item ya kan banyak mungkin contoh nya seperti http://jsfiddle.net/gtWu3/ , kalau kasus nya seperti ini umpamanya sudah ada data base penyakit nah kemudian saya tinggal ketikan umpama panas dan batuk nanti kesimpan dalam 1 field yang sama ..
thx 😀
veronice mengatakan
mas, kalo mau nampilin relasi one-to-many di access gmn ya?
punyaku yg muncul cuma garis relasinya, g ada tulisan 0 .. 1 gitu.
mhn bantuanya,
Masino Sinaga mengatakan
Di Access atau di PHPMaker? Ini kan membahas tentang PHPMaker, kok jadi lari ke Access? 🙂
irsyad mengatakan
Mas saya mau tanya untuk One-To-One buat Master/Detail.
Saya pengen bikin Master/Detail untuk One-To-One.
Kalau bawaan PHP maker One-To-Many, Many-To-One.
Masino Sinaga mengatakan
Pada dasarnya, relasi tabel Master/Detail adalah One-To-Many. Jika ingin membuat One-To-One, tinggal buat validasi saja saat menambahkan data di tabel Detail, hitung jumlah Record berdasarkan key di tabel Master. Jika sudah ada satu, maka proses penambahan Record berikutnya langsung dibatalkan.
Gunakan server event Row_Inserting. Baca topik Server Events and Client Scripts dari menu Help PHPMaker untuk informasi dan contoh lebih lanjut.
irsyad mengatakan
tapi kalau kayak gitu jadi semua tabel detail validasi penambahan tidak berlaku?
dari beberapa tabel detail saya itu ada yang memang di perlukan one to many.
tapi ada beberapa tabel saya perlu tabel tersebut one to one
Masino Sinaga mengatakan
Anda bisa meng-clone tabel Detail yang sudah ada menjadi tabel Detail yang lain, lalu gunakan untuk relasi yang Anda inginkan, apakah One-To-One, atau One-To-Many.
irsyad mengatakan
wah mas, saya bingung.
hasilnya saya mau ubah default format grid add nya detail ajah deh mas, gmn yah?
supaya pas add master detail. tabel yg saya mau row nya tidak berisi 5 baris
Masino Sinaga mengatakan
Kalau bingung, ya belajar lagi dong yang sungguh-sungguh, hehehe… 🙂
Jika mau mengganti default jumlah row di tabel detail saat tambah data, cukup masukkan kode ini ke dalam server event Page_Load dari halaman List milik table detail, lalu generate ulang file script dengan PHPMaker:
ame isfine mengatakan
Pagi pak Masino, saya punya Master Table dan Detail Table, hanya saja kondisinya foreign key nya ada beberapa field (di Detail Table) yang berisi data tidak sama, karena dia dihasilkan dari Multiple Select. Jika berisi satu data maka relationshipnya normal terjadi, sementara yg multidata jadi tidak terbaca.
bagaimana supaya bisa membaca field yang berisi multidata hasil dari multiple select tersebut (datanya dipisah koma)? adakah cara untuk bisa menghasilkan relationship dg Master? Atas help n tipsnya makasih.
Masino Sinaga mengatakan
Kalau tujuannya untuk membuat relationship Master/Detail, maka Anda harus memproses nilai multiple select tadi menjadi beberapa record sesuai banyaknya nilai data yang disimpan tadi. Untuk ini, maka sebaiknya Anda harus membuat tabel baru yang menyimpan setiap nilai tersebut dalam masing-masing record.
ame isfine mengatakan
Yang menyulitkan saya adalah karena jumlah data (dari multiple select ) ini bervariasi tidak tetap jumlahnya sehingga sy tidak bisa membuat tablenya. Lalu saya coba membuat view dengan tujuan datanya ter-ekstract dan diberi unique-ID.
Code view saya :
SELECT SubString_Index(SubString_Index(t.ref_num, ‘,’, n.n), ‘,’, -1) AS Refnum,
t.Purchase_Number,
t.Supplier_ID
FROM a_purchases t
CROSS JOIN (SELECT a.N + b.N * 10 + 1 n
FROM (SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) a,
(SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) b
ORDER BY n) n
WHERE n.n <= 1 + (Length(t.ref_num) – Length(Replace(t.ref_num, ',', '')))
ORDER BY Refnum
Hasilnya :
1. Jika saya Execute (F9) hasilnya keluar dengan benar (datanya ter-extract)
2. Tapi tidak bisa create view, muncul error #HY000View's SELECT contains a subquery in the FROM clause
saya sudah googling ini error karena versi mysql yg tidak support padahal mysql sy sudah updated. Mohon pencerahannya mungkin ada tips untuk berubah syntax atau apanya Pak. Thank in advance
Masino Sinaga mengatakan
Justru karena jumlah recordnya bervariasi itulah, makanya Anda harus membuat tabel baru, di mana untuk setiap nilai yang Anda extract dari multiple values tadi, dikonversikan ke satu record.
Jadi, misalnya multiple values-nya adalah 7,8,9,10,11 maka di tabel baru tersebut akan terbentuk 5 record hasil pemecahan dari multiple values tadi. Jadi, tidak membuat View yang justru menimbulkan error tersebut. Ngerti maksudnya kan?
ame isfine mengatakan
Masih coba sy cerna Pak. Logikanya udah nangkep tapi blum nemu sysntaxnya. Makasih banyak pak
Masino Sinaga mengatakan
Sama-sama. Saya kasih clue-nya ya untuk mengambil setiap nilai dari multiple values tadi.
Anda bisa menggunakan fungsi PHP yang bernama explode(). Google aja, banyak contoh2 penggunaannya.
ame isfine mengatakan
Saya sudah bisa pake explode di Row_Inserted
$ponumber = $rsnew[“Purchase_Number”];
$ar = explode(‘,’, $rsnew[“ref_num”]);
foreach ($ar as $value) {
ew_Execute(“INSERT INTO a_refnumpo (PO_Number, Ref_Num) VALUES (‘$ponumber’, ‘$value’)”);
}
}
sekarang sy bingung untuk event Row_Updated nya…
gimana ya mendeteksi perubahan / pengurangan value ..??
Sebelumnya makasih
Masino Sinaga mengatakan
Ya tinggal dibandingkan aja nilai field pada $rsnew dan $rsold.
Bayu mengatakan
Bang.
Membuka page yang ada master detail. Saya add detail 15. Save. Lancar.
Tetapi setelah detail ke 16, maka kalau add sekaligus 2 atau 3, kemudian Save, malah blank.
Kayak lemot banget.
Kenapa ya Bang?
Terima kasih.
Eka Dalas Pangestu mengatakan
Hallo pak masino
apakah bisa tampilannya selain grid add pak ? saat ini menambahkan data
Terima Kasih