Assalamu'alaikum Warahmatullahi Wabarakatuh,
Bismillah... pada kesempatan kali ini sy akan sedikit berbagi pengelaman terkait cara agar ketika field pada one2many bisa di filter ketika sudah di pilih pada record header yang sama.
Misalkan pada sebuah objek bernama res.upkeep, ada sebuah field bertipeone2many bernama upkeep_block_line ke tabel upkeep.block. pada one2many(ke upkeep.block) ada many2one bernama block_id. relasi many2one dari upkeep.block(child) ke res.upkeep(parent) adalah upkeep_id.
contoh nya:
kita akan memilih block 01-00-aa
maka ketika kita menambahkan record baru pada one2many dan memilih block, block yang sudah dipilih yaitu 01-00-aa tidak akan muncul lagi
metode yang akan kita gunakan adalah onchange pada objek upkeep.block(child) dengan trigger nya adalah field many2one ke parent nya yaitu upkeep_id, logika yang kita gunakan adalah memfilter yang block nya tidak ada dalam daftar. pertama kita buat local variable list dan diisi tipe data list, upkeep_block = [ ]
setelah itu kita buat kondisi untuk mengecek apakah upkeep_id nya kosong atau tidak, dengan
if self.upkeep_id: dan di dalam kondisi if tersebut kita buat perulangan one2many upkeep_block_line yang ada di header ke child, karena method kita berada di child maka kita harus menggunakan relasi ke header untuk melakukan perulangan dengan kode
for i in self.upkeep_id.upkeep_block_line: kemudian di dalam perulangan kita buat kondisi menggunakan logika yang sudah kita buat yaitu memfilter yang block nya tidak ada dalam daftar dengan kode
if not i.block_id.id in upkeep block:
jika block pada one2many masih belum ada pada daftar maka masukan ke dalam daftar
upkeep_block.append(i.block_id.id)
setelah mendapatkan daftar block yang boleh ditampilkan alias belum dipilih maka tinggal kita return domain pada method tersebut
return {
'domain': {
'block_id': [('id', 'not in ', upkeep_block)]
}
}
kode lengkap nya seperti ini
Kesimpulannya, kita bisa memfilter agar suatu field pada one2many tidak akan terpilih dua kali pada satu record header dengan metode.
Jazakumullahu Khoiron . . .
Additional
cara ini bisa di akali dengan pengecekan algoritma seperti berikut
filtered_list = [ ]
warna = ['biru', 'hijau', 'hijau', 'merah', 'hitam', 'biru']
for i in warna:
if not i in filtered_list:
filtered_list.append(i)
list yang akan di filter di loop, kemudian di cek apakah data ini sudah ada atau belum pada hasil filter
jika belum ada maka masukan data itu ke dalam list hasil filter
ketika menemukan data yang sama maka data itu tidak akan dimasukan lagi ke dalam list hasil filter
dah hasil yang sudah di filter ada pada list filtered_list