inserte , delete ve...
 
Bildirimler
Hepsini Temizle

inserte , delete ve update i tek bir yerden kontrol etme  

  RSS
tarık_kara
(@tarik_kara)
Üye

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 ?

Northwind kullanıyorum bu arada

Alıntı
Gönderildi : 28/10/2011 13:55
CozumPark
(@cozumpark)
Onursal Üye Yönetici

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.

CevapAlıntı
Gönderildi : 28/10/2011 14:03
tarık_kara
(@tarik_kara)
Üye

trigger yerine view kullanımı daha sağlıklı olabilir

CevapAlıntı
Gönderildi : 29/10/2011 22:54
tarık_kara
(@tarik_kara)
Üye

[quote user="MERT DOĞAN"]

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.

[/quote]

CevapAlıntı
Gönderildi : 29/10/2011 23:23
tarık_kara
(@tarik_kara)
Üye

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 !!!

CevapAlıntı
Gönderildi : 30/10/2011 00:13
CozumPark
(@cozumpark)
Onursal Üye Yönetici

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.

CevapAlıntı
Gönderildi : 30/10/2011 11:20
tarık_kara
(@tarik_kara)
Üye

Şö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.

CevapAlıntı
Gönderildi : 30/10/2011 11:30
CozumPark
(@cozumpark)
Onursal Üye Yönetici

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.

CevapAlıntı
Gönderildi : 30/10/2011 14:43
tarık_kara
(@tarik_kara)
Üye

nasıl?

CevapAlıntı
Gönderildi : 03/11/2011 15:27
CozumPark
(@cozumpark)
Onursal Üye Yönetici

ne nasıl

CevapAlıntı
Gönderildi : 03/11/2011 17:46
tarık_kara
(@tarik_kara)
Üye

"yerinde uzman desteği almanızı tavsiye ederim" demişsiniz nasıl alabilirim diye sormak istedim?

CevapAlıntı
Gönderildi : 04/11/2011 22:51
CozumPark
(@cozumpark)
Onursal Üye Yönetici

Bu konuda danışmanlık hizmeti veren kişi ve kurumlarla irtibata geçebilirsiniz.

CevapAlıntı
Gönderildi : 04/11/2011 23:47
tarık_kara
(@tarik_kara)
Üye

siz veriyor musunuz?

CevapAlıntı
Gönderildi : 11/11/2011 23:42
CozumPark
(@cozumpark)
Onursal Üye Yönetici

Özel mesajlarınızı kontrol ediniz.

CevapAlıntı
Gönderildi : 12/11/2011 13:06
Paylaş: