Forum
Bir adet tablom var,PersonelID, PrimMiktari diye de iki kolonu ... Bir Satış gerçekleştiği taktirde personel sattığı urunun %2 oranında prim alacaktr. Eger satılan urun iade yada bir kısım iade olursa aradaki fark primden dusulecektir. Eger satış kaydı silinirse prim oranı da eksiltilecektir.Ben şöyle yaptım :
CREATE TABLE Prim
(
PersonelID INT PRIMARY KEY IDENTITY (1,1),
PrimMiktari MONEY
)
GO
ALTER TRIGGER PrimHesapla
ON [Siparis Detaylari]
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
DECLARE @UrunID INT , @Adet INT, @CalisanID INT
DECLARE @PrimMiktari MONEY,@SonPrimMiktari MONEY
DECLARE @Ad NVARCHAR(20), @Soyad NVARCHAR(20)
DECLARE @Fiyat MONEY
IF EXISTS (SELECT * FROM inserted)
BEGIN
SELECT @UrunID = P.UrunID, @Adet = P.Adet, @Ad = C.Ad, @Soyad = C.Soyad,
@CalisanID =C.CalisanID FROM inserted P
JOIN Siparisler S ON P.SiparisID=S.SiparisID
JOIN Calisanlar C ON C.CalisanID=S.CalisanID
SELECT @PrimMiktari = ((@Adet*@Fiyat)*0.02) FROM inserted
IF EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
UPDATE Prim SET PrimMiktari += @PrimMiktari
ELSE IF NOT EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
INSERT INTO Prim (PersonelID,PrimMiktari) VALUES(@CalisanID,@PrimMiktari)
END
ELSE IF EXISTS (SELECT * FROM deleted)
BEGIN
SELECT @UrunID = P.UrunID, @Adet = P.Adet, @Ad = C.Ad, @Soyad = C.Soyad,
@CalisanID =C.CalisanID FROM deleted P
JOIN Siparisler S ON P.SiparisID=S.SiparisID
JOIN Calisanlar C ON C.CalisanID=S.CalisanID
SELECT @PrimMiktari = ((@Adet*@Fiyat)*0.02) FROM deleted
IF EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
UPDATE Prim SET PrimMiktari -= @PrimMiktari
END
ELSE IF UPDATE(Adet) AND UPDATE(Fiyat)
BEGIN
SELECT @UrunID = P.UrunID, @Adet = P.Adet, @Ad = C.Ad, @Soyad = C.Soyad,
@CalisanID =C.CalisanID FROM deleted P
JOIN Siparisler S ON P.SiparisID=S.SiparisID
JOIN Calisanlar C ON C.CalisanID=S.CalisanID
SELECT @PrimMiktari = (((ins.Adet-dl.Adet)*@Fiyat)*0.02) FROM inserted ins
JOIN deleted dl ON ins.SiparisID=DL.SiparisID
IF EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
UPDATE Prim SET PrimMiktari += @PrimMiktari
ELSE IF NOT EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
INSERT INTO Prim (PersonelID,PrimMiktari) VALUES(@CalisanID,@PrimMiktari)
END
END
Hata vermiyor ama tam olarak çalışmıyor nerde hata yapıyorumdur ?
UPDATE Prim SET PrimMiktari += @PrimMiktari
ELSE IF NOT EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
INSERT INTO Prim (PersonelID,PrimMiktari) VALUES(@CalisanID,@PrimMiktari) kısmındaki ELSE IF NOT EXISTS kontrolü de gereksiz çünkü zaten varsa bir önceki adımı gerçekleştirecek yoksa bunu yapacak. Bir daha niye yoksa ile başlayan bir kontrol gerçekleşiyor ki.
trigger yerine view kullanımı daha sağlıklı olabilir
Bu trigger yapınızın doğru çalışmaması çok doğal çünkü üstünkörü incelediğim birkaç yerde mantık hataları mevcut. İlk ve en büyük yanlış inserted tablosunun varlığını kontrol eden if yapısının içine deleted tablosunun varlığının kontrolünü almanız. DELETE sorgularında sizin bu trigger'ınız tablolarda hiçbir işlem yapmayacaktır. Ayrıca IF EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
UPDATE Prim SET PrimMiktari += @PrimMiktari
ELSE IF NOT EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
INSERT INTO Prim (PersonelID,PrimMiktari) VALUES(@CalisanID,@PrimMiktari) kısmındaki ELSE IF NOT EXISTS kontrolü de gereksiz çünkü zaten varsa bir önceki adımı gerçekleştirecek yoksa bunu yapacak. Bir daha niye yoksa ile başlayan bir kontrol gerçekleşiyor ki.Bir de bu tipte bir işlem için trigger yerine view kullanımı daha sağlıklı olabilir. Çünkü primi her zaman görüntülemezsiniz ancak sürekli olarak yeni satış gerçekleştirirsiniz (inşallah). Dolayısıyla trigger burada sunucuya anlamsız bir ek yük getirir her işlemde. Oysa ki oluşturacağınız basit bir view sayesinde kullanıcıların o anda elde etmiş oldukları primi hesaplatabilirsiniz ki bu hesaplama da çok uzun bir işlem değildir.
Bu tipte bir işlem için trigger yerine view kullanmak daha sağlıklı olur demişsiniz ancak benim bunu tek triggerle yapmam lazım.Bir de IF EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
UPDATE Prim SET PrimMiktari += @PrimMiktari
ELSE IF NOT EXISTS (SELECT * FROM Prim WHERE PersonelID = @CalisanID)
INSERT INTO Prim (PersonelID,PrimMiktari) VALUES(@CalisanID,@PrimMiktari) kısmındaki ELSE IF NOT EXISTS kontolünün gereksiz olduğunu farkettim sonra.Ancak istediğim gibi olmuyor !!!
Hata tespiti için şu adımları uygulayın:
bütün halde hata aramak yerine her bir sorguyu adım adım ekleyerek problemli yerleri tespit edin ve düzelterek ilerleyin.
Select, insert vb. ifadelerde bulunan parametrelere olası değerler vererek davranışlarını inceleyin.
inserted ve deleted tabloları için ilgili tabloyu ya da tablonun az datalı klonunu kullanabilirsiniz.
Şöyle ki :
Hata vermiyor çalıştığında ancak kodla yeni prim eklediğimde bakıyorum da tablo bomboş demek ki eklemiyor ama düzeltemedim de.Çünkü mantık olarak hatalı bir yer yok gibi.
Söylediğim prosedürleri uygulamaya çalıştığınız halde sonuç alamadıysanız, mevcut sorguda da uzun süredir hatayı tespit edemediyseniz, işlerinizin daha fazla aksamaması için yerinde uzman desteği almanızı tavsiye ederim.
nasıl?
ne nasıl
"yerinde uzman desteği almanızı tavsiye ederim" demişsiniz nasıl alabilirim diye sormak istedim?
Bu konuda danışmanlık hizmeti veren kişi ve kurumlarla irtibata geçebilirsiniz.
siz veriyor musunuz?
Özel mesajlarınızı kontrol ediniz.