Forum

inserte , delete ve...
 
Bildirimler
Hepsini Temizle

inserte , delete ve update i tek bir yerden kontrol etme

14 Yazılar
2 Üyeler
0 Likes
1,283 Görüntüleme
(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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

 
Gönderildi : 28/10/2011 13:55

(@cozumpark)
Gönderiler: 16309
Illustrious Member 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.

 
Gönderildi : 28/10/2011 14:03

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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

 
Gönderildi : 29/10/2011 22:54

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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.

 
Gönderildi : 29/10/2011 23:23

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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

 
Gönderildi : 30/10/2011 00:13

(@cozumpark)
Gönderiler: 16309
Illustrious Member 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.

 
Gönderildi : 30/10/2011 12:20

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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

 
Gönderildi : 30/10/2011 12:30

(@cozumpark)
Gönderiler: 16309
Illustrious Member 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.

 
Gönderildi : 30/10/2011 15:43

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

nasıl?

 
Gönderildi : 03/11/2011 16:27

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

ne nasıl

 
Gönderildi : 03/11/2011 18:46

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

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

 
Gönderildi : 04/11/2011 23:51

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

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

 
Gönderildi : 05/11/2011 00:47

(@tarik_kara)
Gönderiler: 406
Honorable Member
Konu başlatıcı
 

siz veriyor musunuz?

 
Gönderildi : 12/11/2011 00:42

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

Özel mesajlarınızı kontrol ediniz.

 
Gönderildi : 12/11/2011 14:06

Paylaş: