SQL Server Trigger #Programming
by Elo Hansen Panjaitan on Wednesday, November 24, 2010 at 11:47pm
Tabel INOVICE
NoInvoice (PK)
KdCust
...
Jumlah
Indeks
Total
Bayar
Sisa (Jumlah*Indeks-bayar)
Tabel Bayar
NoInvoice (PK)
Tanggal (PK)
Bayar
secara mekanisme yang digunakan adalah apabila tabel bayar terisi maka secara otomatis akan memicu trigger untuk mengisi tabel invoice pada field bayar.
berikut ini adalah triggernya
CREATE TRIGGER BayarToInvoice ON [dbo].[BAYAR] FOR INSERT, UPDATE, DELETE AS
DECLARE @NOINVOICE AS CHAR(4),
@NREC Int,
@BAYAR DECIMAL
SELECT @NOINVOICE = e.NOINVOICE, @
NREC = Count(*),
@BAYAR = SUM(e.Bayar)
FROM Bayar e INNER JOIN inserted i ON e.NOINVOICE = i.NOINVOICE
GROUP BY e.NOINVOICE
IF (@NREC > 0)
BEGIN
UPDATE INVOICE SET
BAYAR = @BAYAR WHERE NOINVOICE = @NOINVOICE
END
Setelah ditest pada saat pengisian tabel bayar maka secara otomatis table bayar pada invoice akan ter-isi dengan benar sesuai dengan entry pada tabel bayar.Namun ada sesuatu yang aneh. Pada saat update pada tabel invoice (bukan dipicu trigger) isi field bayar pada invoice ter-isi dengan jumlah dari bayar untuk nomor invoice yang sama dikali dengan jumlah record pada tabel bayar dengan nomor invoice yang sama.Berarti ada bug pada trigger tersebut. Setelah saya analisa dengan baik maka triggernya saya rubah menjadi
CREATE TRIGGER BayarToInvoice ON [dbo].[BAYAR] FOR INSERT, UPDATE, DELETE AS
DECLARE @NOINVOICE AS CHAR(4),
@NREC Int,
@BAYAR DECIMAL
SELECT @NOINVOICE = e.NOINVOICE
FROM inserted e
SELECT @NOINVOICE = e.NOINVOICE,
@BAYAR = SUM(e.Bayar)
FROM Bayar e Where
e.NOINVOICE = @NOINVOICE
Group By e.NoInvoice
IF ISNULL(@BAYAR,0) <> 0
BEGIN
UPDATE INVOICE
SET BAYAR = @BAYAR
WHERE NOINVOICE = @NOINVOICE
END
Perhatikan bedanya. Ini mungkin sudah pernah menjadi kendala bagi anda.
Semoga bermanfaat
Tidak ada komentar:
Posting Komentar