Arsip: Bingung Trigger Nggak Jalan Pd Tabel Master - Detail

more 17 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

more 17 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

more 17 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:

more 17 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 ?

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

more 17 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....?

more 17 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

more 17 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..............

more 17 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
reply |
Report Obsolete
AI Forward

🚀 We're thrilled to partner with Alibaba Cloud for "AI Forward - Alibaba Cloud Global Developer Summit 2025" in Jakarta! Join us and explore the future of AI. Register now:
https://int.alibabacloud.com/m/1000400772/
#AlibabaCloud #DeveloperSummit #Jakarta #AIFORWARD
Last Articles
Last Topic
- PascalTalk #6: (Podcast) Kuliah IT di luar negeri, susah gak sih?
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #5: UX: Research, Design and Engineer
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #4: Obrolan Ringan Seputar IT
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #2: Membuat Sendiri SMART HOME
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #3: RADically Fast and Easy Mobile Apps Development with Delphi
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #1: Pemanfaatan Artificial Intelligence di Masa Covid-19
by LuriDarmawan in Tutorial & Community Project more 4 years ago - Tempat Latihan Posting
by LuriDarmawan in OOT more 5 years ago - Archive
- Looping lagi...
by idhiel in Hal umum tentang Pascal Indonesia more 12 years ago - [ask] koneksi ke ODBC user Dsn saat runtime dengan ado
by halimanh in FireBird more 12 years ago - Validasi menggunakan data tanggal
by mas_kofa in Hal umum tentang Pascal Indonesia more 12 years ago
Random Topic
- [?] Menghapus Record Master Detail di Paradox
by babypigs in Paradox more 16 years ago - proteksi agar file jlan 1x
by Cip_rud in Lain-lain more 16 years ago - Bewara SQL for maniak
by ImanD in MySQL more 17 years ago - simpan jpg
by lela in Tip n Trik Pemrograman more 19 years ago - firebird untuk aplikasi client-server
by ho2sly in FireBird more 16 years ago - insert data pake sql server di delphi.net
by strevo in Delphi.NET more 18 years ago - Store Procedure???
by eena in MySQL more 18 years ago - Problem Query di SQLITE
by kenjiro in Tip n Trik Pemrograman more 16 years ago - Ujian kayak UMPTN
by budi_bunga in Hal umum tentang Pascal Indonesia more 18 years ago - Install Package pada Database MySQL
by stack_overflow in MySQL more 14 years ago