Arsip: Bingung Trigger Nggak Jalan Pd Tabel Master - Detail

 
user image
more 13 years ago

huaha

Masih tentang tabel master-detail........kali ini aku bingung soal triggernya.... Aku punya 2 tabel ...Jual dan JualD (On Cascade Delete) Di JualD aku pasang trigger untuk mengembalikan stok seperti semula.... Nah sekarang misalnya aku ada sebuah transaksi jual yg punya 5 detail produk..... Ketika aku hapus master transaksi (Jual) nya.....detail2nya (JualD) memang otomatis ikut kehapus.... Masalahnya....stok produk yang dikembalikan cuma milik produk terakhir pd nota tsb..... Jadi 4 produk lain yg ada pd nota tsb jumlahnya tetap berkurang (nggak balik awal)..... Pusing..... Ada yg bisa bantu ? Makasih sebelumnya ! (Contoh trigger disertakan di bawah) ------------------------------------------------------------------------ CREATE TRIGGER TriggerJualDDelete ON JualD FOR Delete AS DECLARE @JmlStok as int, @ProdukID as int Select @ProdukID = d.ProdukID, @JmlStok = (p.JmlStok + d.Jumlah) from Produk p, Deleted d where p.ProdukID = d.ProdukID if (@JmlStok < 0) BEGIN set @Msg = 'Jumlah Stok Tidak Mencukupi' RAISERROR ( @Msg, 16, 1) END ELSE BEGIN Update Produk set Produk.JmlStok = @JmlStok where Produk.ProdukID = @ProdukID END
user image
more 13 years ago

_lmz

[quote:e1a2c771b9="huaha"] CREATE TRIGGER TriggerJualDDelete ON JualD FOR Delete AS DECLARE @JmlStok as int, @ProdukID as int Select @ProdukID = d.ProdukID, @JmlStok = (p.JmlStok + d.Jumlah) from Produk p, Deleted d where p.ProdukID = d.ProdukID if (@JmlStok < 0) BEGIN set @Msg = 'Jumlah Stok Tidak Mencukupi' RAISERROR ( @Msg, 16, 1) END ELSE BEGIN Update Produk set Produk.JmlStok = @JmlStok where Produk.ProdukID = @ProdukID END [/quote:e1a2c771b9] wow, SQL server... mumpung gak ngerti, asal jawab ah :) Select @ProdukID = d.ProdukID, @JmlStok = (p.JmlStok + d.Jumlah) from Produk p, Deleted d where p.ProdukID = d.ProdukID ...dilanjutkan... Update Produk set Produk.JmlStok = @JmlStok where Produk.ProdukID = @ProdukID terus terang saya tidak tahu bahwa variabel di SQL server bisa banyak nilainya... kalau nilainya cuma bisa satu ya berarti select itu kan cuma diambil satu baris saja (baris mana tapi?) yang masuk ke @ProdukId dan @JmlStok mungkin lebih baik anda melakukan loop terhadap query anda yang pertama (syntaxnya saya tidak tahu, jadi asal saja ya...) FOR row IN ( Select d.ProdukID, p.JmlStok, d.Jumlah from Produk p, Deleted d where p.ProdukID = d.ProdukID ) DO IF row.jmlstok + row.jumlah < 0 THEN raise error ELSE UPDATE Produk SET Produk.JmlStok = row.jmlstok + row.jumlah WHERE Produk.ProdukID = row.produkid END
user image
more 13 years ago

Bahrul_power

Sebenarnya gampang, data yang dihapus dari tabel penjualan detail kan lebih dari 1 record, untuk memprosesnya, agar semua item produk dapat kembali ke stok semula harus diproses per satu record, jadi terlebih dahulu masukan dalam cursor dan masukan dalam variabel,coba dengan trigger ini. CREATE TRIGGER TriggerJualDDelete ON JualD FOR DELETE AS BEGIN DECLARE @ProdukId varchar(10) DECLARE @NoJual Int DECLARE @Qty Float SELECT @NoJual = NoJual FROM deleted --Definisikan attribut cursor dan isi dengan data yang dihapus DECLARE c_deleted CURSOR FOR SELECT ProdukId, Qty FROM deleted INNER JOIN Jual ON deleted.NoJual = Jual.NoJual WHERE deleted.NoJual = @NoJual OPEN c_deleted --Mengambil isi cursor dan simpan dalam variabel FETCH NEXT FROM c_deleted INTO @ProdukID , @Qty --Update produk sebanyak jumlah baris cursor WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Produk SET Stock = Stock - @Qty WHERE ProdukID = @ProdukID FETCH NEXT FROM c_deleted INTO @ProdukID, @Qty END --Tutup cursor CLOSE c_deleted --Hapus referensi cursor DEALLOCATE c_deleted --Kembali ke aplikasi RETURN error: raiserror( 'Gagal hapus detil penjualan!',16,1) rollback transaction end coba mas, moga berhasil ya..... :lol:
user image
more 13 years ago

huaha

udah aku coba cara yg pake cursor.....ternyata bisa ! heheheheheheh hebat hebat penjelasannya knapa ya ? apa ketika master didelete....trigger2 delete untuk masing2 detailnya nggak otomatis dijalankan smua ya ? salah satu aja ? tapi masih ada yg bingung..... trigger untuk insert dan update yg aku bikin tanpa cursor...jalan baik2 saja.... nah yang untuk delete....harus pake cursor baru bisa bener.... trus untuk trigger insert sama updatenya sebaiknya gimana.......apa sebaiknya pake cursor juga (kan jadi panjangggggg)....ato ngga perlu ?
user image
more 13 years ago

jrp

Sekedar nimbrung komentar: IMHO logika bisnis seperti ini lebih tepat diimplementasikan dengan stored procedure. jrp
user image
more 13 years ago

Bahrul_power

Pengertian saya trigger itu dapat dijalankan oleh satu record saja, jadi jika ingin menjalankan trigger kita harus eksekusi per record. Untuk Insert atau Update terserah pada yang mengelola aja, enaknya pakai yang ginama.... asal hasilnya sama kan ga masalah tapi saya sering menggunakan cursor untuk menghindari konflik. Jika menggunakana stored procedure, kita harus mengeksekusi stored procedure tersebut setiap kali mengengesekusi tabel, tapi jika dengan trigger, tidak perlu mengeksekusi stored procedure, kita tinggal eksekusi tabel saja, logika bisnisnya sudah jalan sendiri. Untuk trigger Insert pada kasus tersebut seperti ini. CREATE TRIGGER TriggerJualDInsert ON JualD FOR Insert AS BEGIN DECLARE @ProdukId varchar(10) DECLARE @NoJual Int DECLARE @Qty Float SELECT @NoJual = NoJual FROM inserted --Definisikan attribut cursor dan isi dengan data yang ditambah DECLARE c_inserted CURSOR FOR SELECT ProdukId, Qty FROM inserted INNER JOIN Jual ON inserted.NoJual = Jual.NoJual WHERE inserted.NoJual = @NoJual OPEN c_inserted --Mengambil isi cursor dan simpan dalam variabel FETCH NEXT FROM c_inserted INTO @ProdukID , @Qty --Update produk sebanyak jumlah baris cursor WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Produk SET Stock = Stock + @Qty WHERE ProdukID = @ProdukID FETCH NEXT FROM c_inserted INTO @ProdukID, @Qty END --Tutup cursor CLOSE c_inserted --Hapus referensi cursor DEALLOCATE c_inserted --Kembali ke aplikasi RETURN error: raiserror( 'Gagal hapus detil penjualan!',16,1) rollback transaction end Sedangkan untuk Trigger Updatenya seperti di bawah ini : CREATE TRIGGER TriggerJualDUpdate ON JualD FOR UPDATE AS BEGIN DECLARE @ProdukId varchar(10) DECLARE @NoJual Int DECLARE @Qty Float SELECT @NoJual = NoJual FROM deleted --Definisikan attribut cursor dan isi dengan data yang dihapus DECLARE c_deleted CURSOR FOR SELECT ProdukId, Qty FROM deleted INNER JOIN Jual ON deleted.NoJual = Jual.NoJual WHERE deleted.NoJual = @NoJual OPEN c_deleted --Mengambil isi cursor dan simpan dalam variabel FETCH NEXT FROM c_deleted INTO @ProdukID , @Qty --Update produk sebanyak jumlah baris cursor WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Produk SET Stock = Stock - @Qty WHERE ProdukID = @ProdukID FETCH NEXT FROM c_deleted INTO @ProdukID, @Qty END --Tutup cursor CLOSE c_deleted --Hapus referensi cursor DEALLOCATE c_deleted SELECT @NoJual = NoJual FROM inserted --Definisikan attribut cursor dan isi dengan data yang ditambah DECLARE c_inserted CURSOR FOR SELECT ProdukId, Qty FROM inserted INNER JOIN Jual ON inserted.NoJual = Jual.NoJual WHERE inserted.NoJual = @NoJual OPEN c_inserted --Mengambil isi cursor dan simpan dalam variabel FETCH NEXT FROM c_inserted INTO @ProdukID , @Qty --Update produk sebanyak jumlah baris cursor WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Produk SET Stock = Stock + @Qty WHERE ProdukID = @ProdukID FETCH NEXT FROM c_inserted INTO @ProdukID, @Qty END --Tutup cursor CLOSE c_inserted --Hapus referensi cursor DEALLOCATE c_inserted --Kembali ke aplikasi RETURN error: raiserror( 'Gagal Update Penjualan!',16,1) rollback transaction end Mudah-mudahan berhasil ya....?
user image
more 13 years ago

huaha

wah insert-update pake cursor jadi panjang ya....... keunggulan dan kelemahan dengan atau tanpa cursor itu sebetulnya bagaimana ya ?? trus maksudnya pake cursor untuk menghindari konflik itu contohnya sperti apa ? makasih ! :D :D :D
user image
more 13 years ago

huaha

wah muncul kebingungan baru....... misalnya aku pengen hapus 1 record tabel pelanggan (beserta record2 penjualan dan detail dr pelanggan tsb) tanpa mengembalikan stok barang yg sudah dibeli ato jumlah kas yg sudah dibayar..... gimana ya caranya ? soalnya di trigger delete kan sudah otomatis stok dikembalikan dan kas dikurangi ? oh pusing..............
user image
more 13 years ago

Bahrul_power

Saya sering pake cursor dalam trigger karena sebelum data diproses oleh trigger data tersebut dimasukan terlebih dahulu kedalam trigger tersebut, hal ini dimaksudkan agar trigger akan mengeksekusi nilai yang ada dalam cursor tersebut, nah jika terjadi masalah pada eksekusi tersebut, maka trigger akan melakukan rollback transaction sebanyak nilai yang ada dalam cursor tersebut, sehingga jika ditengah jalan ada kesalahan, maka data yang dipengaruhi oleh trigger tersebut masih aman. Semua sistem yang diterapkan ada kelebihan dan ada kekurangannya, jadi tergantung kita menyikapinya mau yang mana,Saya juga punya masalah seperti itu sampai sekarang belum ketemu gimana cara bikin trigger yang bisa menangani masalah tersebut. hehe..... :D Mungkin teman2 lain bisa bantuin masalah kami....?
more ...
  • Pages:
  • 1
Share to
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com