Ada yang masih ingat dengan artikel saya berjudul Dahsyatnya Referential Integrity pada Master/Detail di Aplikasi Web dari PHPMaker? Sekedar menyegarkan ingatan kita, artikel itu membahas pilihan Referential Integrity yang akan memastikan bahwa data di table Detail tidak dapat ditambah atau diubah jika data tersebut tidak terkait dengan Foreign Key di table Master-nya. Artinya, PHPMaker akan mencegah Pengguna menambah data di table Detail jika tidak mengandung data yang terkait di table Master.
Ternyata tidak selamanya kita harus mengaktifkan pilihan Referential Integrity yang terdapat di bawah pengaturan Master/Detail pada bagian Table setup di project PHPMaker. Ada kalanya kita harus menonaktifkan pilihan ini hanya pada kondisi tertentu. Lho, mengapa begitu? Pasti Anda bertanya demikian (sok tahu, ah!).
Oke, langsung saja. Ternyata kita perlu menonaktifkan pilihan Referential Integrity ini jika:
- Table Detail menggunakan field yang bertipe Auto-Increment sebagai Primary Key, dan relasi antara kedua table Master dan Detail tidak menggunakan field Auto-Increment tadi.
- Field yang digunakan untuk relasi di table Master menggunakan Lookup Table, sementara field yang digunakan untuk relasi di table Detail tidak menggunakan Lookup Table
Artinya, jika kondisi Nomor 1 DAN Nomor 2 di atas tadi terjadi, maka Aplikasi Web akan menampilkan pesan You cannot add or update a record because the foreign key value does not exist in the master table ‘{nama_master_table}’ ketika Pengguna berusaha menambah data di table Detail.
Paling tidak ini yang terjadi saat salah satu Aplikasi Web yang saya hasilkan menggunakan PHPMaker versi 12.0.6. Ketika pilihan ini diaktifkan di project PHPMaker, maka ketika Pengguna menyimpan data di table Detail melalui Aplikasi Web, maka akan muncul pesan tadi. Tapi yang anehnya, setelah pesan tadi diklik, lalu Pengguna mencoba lagi menyimpan data untuk yang kedua kalinya, maka proses ini berlangsung dengan mulus. Data berhasil disimpan. Sedikit membingungkan memang, ya.
Akhirnya, solusi akhir untuk menghilangkan pesan error tadi sama sekali, saya menonaktifkan pilihan Referential Integrity, lalu generate ulang kembali semua file script. Setelah itu, pesan error benar-benar hilang. Hm…
Analisis sementara saya, jika pilihan Referential Integrity kita aktifkan, maka ketika Pengguna menginput data di table Detail yang nilainya seharusnya berasal dari Lookup Table. Sepertinya data di table Detail tadi tidak bisa otomatis tersimpan karena ID di table Detail tersebut masih belum terbentuk. Baru setelah usaha yang kedua data tersimpan, kemungkinan besar saat itu sistem sudah berhasil mengambil data ID dari table Master. Itulah mengapa pada usaha kedua bisa tersimpan.
Jadi, jika Anda tetap ingin mengaktifkan pilihan Referential Integrity tadi, maka pastikan field yang digunakan untuk relasi di table Detail sudah diset Lookup Table-nya sama seperti field relasi di table Master. Ternyata simpel saja solusinya supaya kita tetap bisa mengaktifkan Referential Integrity, uhuuuiii… 🙂
Saya juga ada kasus aneh..
Kalau sbg administrator bisa add mster detil tp juga pakai user lain jadi muncul pesan error itu..
Padahal sudah saya kasih hak akses.
Saya juga mengalami hal sama, (Versi 2018)
jadi saya punya Tabel {User}, {Master_Jenis_Buku} dan {Detail_Buku}
{Tabel_User} :
nik , nama
001 | Arif
002 | Budi
003 | Satria
{Master_Jenis_Buku} :
ID | kode_jenis | jenis_buku | user_entry
1 | A-1 | Komputer | 001
2 | A-2 | Akuntansi | 001
3 | A-3 | Politik | 003
{Detail_Buku }:
ID | kode_buku | kode_jenis | nama_buku | user_entry
1 | B1 | A-1 | Pemrograman Web | 001
2 | B2 | A-3 | Politik bla bla | 001 ==> ERROR
yang dijadikan Relasi : kode_jenis = kode_jenis . (tabel user tidak jadi bagian dari relasi, namun sbegai rujukan => AutoUpdateValue) untuk ID di kedua tabel AutoIncrement.
kode_jenis di Tabel Detail Lookup ke kode_jenis Master_Jenis_Buku.
User_Entry = User yang melakukan Input terhadap Record (menggunakan Auto Update Value => CurrentUserID)
Permasalahannya :
Ketika User dengan NIK – 001 (nik = user_entry) melakukan input kode_jenis di Tabel Detail (sementra kode_jenis di Tabel Master hasil input User lain = misal User dengan NIK – 003) akan mengalami pesan Error seperti artikel diatas, namun jika User Administrator engga masalah.
mohon maaf saya masih belum menemui solusi dengan ini :
saya masih belum ada gambaran yang Tabel Master seperti Konsep Tabel saya diatas , harus Set Lookup nya ke tabel mana ?
maksudnya yang Detail , Lookup nya:
Detail_Buku.kode_jenis = Master_Jenis_Buku.kode_jenis
sedangkan yang Master Lookup nya kemana yaa :
Master_Jenis_Buku.kode_jenis = ….. ?
Terimakasih
Ya kan sudah jelas, lookup ke table referensi jenis dong.
Lanjutan :
Pengguna saat ini (001) tidak diotorisasi untuk menambahkan record. Penyaringan Master: `kode_jenis`=’A-3′
Saya juga mengalami hal sama, (Versi 2018)
jadi saya punya Tabel {User}, {Master_Jenis_Buku} dan {Detail_Buku}
{Tabel_User} :
nik , nama
001 | Arif
002 | Budi
003 | Satria
{Master_Jenis_Buku} :
ID | kode_jenis | jenis_buku | user_entry
1 | A-1 | Komputer | 001
2 | A-2 | Akuntansi | 001
3 | A-3 | Politik | 003
{Detail_Buku }:
ID | kode_buku | kode_jenis | nama_buku | user_entry
1 | B1 | A-1 | Pemrograman Web | 001
2 | B2 | A-3 | Politik bla bla | 001 ==> ERROR
yang dijadikan Relasi : kode_jenis = kode_jenis . (tabel user tidak jadi bagian dari relasi, namun sbegai rujukan => AutoUpdateValue) untuk ID di kedua tabel AutoIncrement.
kode_jenis di Tabel Detail Lookup ke kode_jenis Master_Jenis_Buku.
User_Entry = User yang melakukan Input terhadap Record (menggunakan Auto Update Value => CurrentUserID)
Permasalahannya :
Ketika User dengan NIK – 001 (nik = user_entry) melakukan input kode_jenis di Tabel Detail (sementra kode_jenis di Tabel Master hasil input User lain = misal User dengan NIK – 003) akan mengalami pesan Error seperti artikel diatas, namun jika User Administrator engga masalah.
mohon maaf saya masih belum menemui solusi dengan ini :
saya masih belum ada gambaran yang Tabel Master seperti Konsep Tabel saya diatas , harus Set Lookup nya ke tabel mana ?
maksudnya yang Detail , Lookup nya:
Detail_Buku.kode_jenis = Master_Jenis_Buku.kode_jenis
sedangkan yang Master Lookup nya kemana yaa :
Master_Jenis_Buku.kode_jenis = ….. ?
* Pesan Error :
Pengguna saat ini (001) tidak diotorisasi untuk menambahkan record. Penyaringan Master: `kode_jenis`=’A-3′
Terimakasih
maaf, yg Lanjutan kesimpan terlebih dahulu
Sudah dijawab di atas.