Trigger Stok Takip
-
Merhaba arkadaşlar
Stok takibini trigger ile yapmak istiyorum fakat karşılaştığım bir sorun var çözemedim.
3 tip ürün grubum var. Satışı yapılan ürünleri "TopluSatisSub" tablosunda tutuyorum.
ürünleri de "Urun_Tip"ine göre stoktan düşüyorum.
Aşağıdaki gibi....
ALTER trigger [dbo].[StokTakip_Insert] on [dbo].[TopluSatisSub] for insert as begin declare @UrunId int declare @StokAdet int declare @Urun_Tip int Select @UrunId = [UrunID] from inserted Select @StokAdet = [Adet] from inserted Select @Urun_Tip=[Urun_Tip] from inserted IF @Urun_Tip=1 BEGIN Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu- @StokAdet where MontajUrunID=@UrunId END ELSE if @Urun_Tip=2 BEGIN Update dbo.ServisProduc set UrunMevcudu=UrunMevcudu- @StokAdet where ServisProducID=@UrunId end else if @Urun_Tip=3 BEGIN Update dbo.YedekParca set Mevcudu=Mevcudu- @StokAdet where YedekParcaID=@UrunId END end
Fakat yapamadığım şey;
Satış formunu düzenlerken bu düzenlemelere göre stok adedini güncelleyemiyorum.
örneğim satış adeti 1 olaran ürün sonradan 2 adet olarak düzeltildiğinde stoktan
yeni girilen stok adedi ile önceki stok adenin farkı kadar stok düşülmesi yada artırılması gerekiyor.
malum trigger larda update before diye birşey olmadığı için bunu yukarıdaki gibi kolay bir şekilde yapamıyorum
Bu konuda yardımcı olabilecek var mı?
Asayisci tarafından 04/Şub/21 01:54 tarihinde düzenlenmiştir -
Forumda biraz araştırma yaptıktan sonra trigger deleted tablosundan sorgu yapabileceğimi
ve sorunumu aşağıdaki şekilde çözebileceğimi öğrendim. :)
lazım olursa diye şurada dursun
ALTER trigger [dbo].[StokTakip_Update] on [dbo].[TopluSatisSub] after Update as begin declare @UrunId int declare @StokAdet int declare @Urun_Tip int declare @OncekiAdet int declare @SatisAltID int declare @GuncelAdet int Select @UrunId = [UrunID] from inserted Select @StokAdet = [Adet] from inserted Select @Urun_Tip=[Urun_Tip] from inserted select @SatisAltID=[SatisAltID] from inserted select @OncekiAdet=[Adet] from deleted where @SatisAltID=[SatisAltID] set @GuncelAdet=@OncekiAdet-@StokAdet IF @Urun_Tip=1 BEGIN Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu+@GuncelAdet where MontajUrunID=@UrunId END ELSE if @Urun_Tip=2 BEGIN Update dbo.ServisProduc set UrunMevcudu=UrunMevcudu+@GuncelAdet where ServisProducID=@UrunId end else if @Urun_Tip=3 BEGIN Update dbo.YedekParca set Mevcudu=Mevcudu+@GuncelAdet where YedekParcaID=@UrunId END end
-
trigger yazarken tek satir gelecekmis gibi kod yazman disinda bir problem yok.
ama bahsettigim problem de hic de yamana atilacak bir problem degil haberin olsun.
https://stackoverflow.com/a/408381
guru tarafından 04/Şub/21 18:58 tarihinde düzenlenmiştir -
guru bunu yazdı
trigger yazarken tek satir gelecekmis gibi kod yazman disinda bir problem yok.
ama bahsettigim problem de hic de yamana atilacak bir problem degil haberin olsun.
https://stackoverflow.com/a/408381
şuanki haliyle birden fazla satır geldiğinde de çalışıyor diye biliyorum ama yanılıyor muyum?
çoklu satır derken tam olarak neyi kastettin hocam.
-
Hocam her güncelleme de eski kaydı silip yeni kayıt oluştursan ve böylelikle upda ile uğraşmasan olmaz mı?
-
Asayisci bunu yazdıguru bunu yazdı
trigger yazarken tek satir gelecekmis gibi kod yazman disinda bir problem yok.
ama bahsettigim problem de hic de yamana atilacak bir problem degil haberin olsun.
https://stackoverflow.com/a/408381
şuanki haliyle birden fazla satır geldiğinde de çalışıyor diye biliyorum ama yanılıyor muyum?
çoklu satır derken tam olarak neyi kastettin hocam.
ornek olarak
update [table] set [valcolumn] = [valcolumn] + 5 where [idcolumn] in (1,2,3,4)
seklindeki bir sorgu sonucu, senin trigger 1 kere calistirilir ancak inserted ve deleted tablolarinda 4 satir vardir.
ancak senin trigger
Select @UrunId = [UrunID] from inserted
su sekilde kodlar icerdigi icin, yanlizca son satir icin trigger gorevini yerine getirir. Cunku @UrunId 4 olur. halbuki birden fazla deger var inserted ve deleted icinde
onun yerine ornegin
Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu- @StokAdet where MontajUrunID=@UrunId
bu sorgu yerine
Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu- @StokAdet where MontajUrunID in (select [UrunID] from inserted)
bu sekilde yapman lazim.
-
guru bunu yazdıAsayisci bunu yazdıguru bunu yazdı
trigger yazarken tek satir gelecekmis gibi kod yazman disinda bir problem yok.
ama bahsettigim problem de hic de yamana atilacak bir problem degil haberin olsun.
https://stackoverflow.com/a/408381
şuanki haliyle birden fazla satır geldiğinde de çalışıyor diye biliyorum ama yanılıyor muyum?
çoklu satır derken tam olarak neyi kastettin hocam.
ornek olarak
update [table] set [valcolumn] = [valcolumn] + 5 where [idcolumn] in (1,2,3,4)
seklindeki bir sorgu sonucu, senin trigger 1 kere calistirilir ancak inserted ve deleted tablolarinda 4 satir vardir.
ancak senin trigger
Select @UrunId = [UrunID] from inserted
su sekilde kodlar icerdigi icin, yanlizca son satir icin trigger gorevini yerine getirir. Cunku @UrunId 4 olur. halbuki birden fazla deger var inserted ve deleted icinde
onun yerine ornegin
Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu- @StokAdet where MontajUrunID=@UrunId
bu sorgu yerine
Update dbo.MontajUrun set UrunMevcudu=UrunMevcudu- @StokAdet where MontajUrunID in (select [UrunID] from inserted)
bu sekilde yapman lazim.
hocam inan hiçbirşey anlamadım. Bu biraz da benden kaynaklı. trigger konusunda çok iyi değilim.
Ancak şu haliyle veritabanına sorgu gönderiyorum C# tarafında.
SatisID si atıyorum 10 olan tüm ürünlerin adetlerini 5 yap diyorum.
listede 4 ürün var. 4 ününde 1 olan adetleri 5 oluyor. ve stok adetleri otomatik olarak -5'e düşüyor. (başlangıçta stok adetleri "0" )
problemsiz çalışıyor gibi görünüyor.
yanıldığım nokta neresi. ileride nerde sorun yaşarım?
-
Hocam senin icin iki adet sql fiddle hazirladim
birincisindeki trigger sende isaret etmeye calistigim hatalarin oldugu sekilde
CREATE TABLE [tbSample] ( [ID] INT IDENTITY(0,1), [Value] INT); CREATE TRIGGER [trSample] ON [tbSample] AFTER UPDATE AS BEGIN DECLARE @dID INT DECLARE @dValue INT SELECT @dID = [ID] FROM INSERTED SELECT @dValue = [Value] FROM INSERTED UPDATE [tbSample] SET [Value] = @dValue + 5 WHERE [ID] = @dID END; INSERT INTO [tbSample]([Value]) VALUES (5), (10), (15);
ikincisindeki trigger ise duzeltilmis hali
CREATE TABLE [tbSample] ( [ID] INT IDENTITY(0,1), [Value] INT); CREATE TRIGGER [trSample] ON [tbSample] AFTER UPDATE AS BEGIN UPDATE [tbSample] SET [Value] = [I].[Value] + 5 FROM [tbSample] [S] INNER JOIN INSERTED [I] ON [S].[ID] = [I].[ID] END; INSERT INTO [tbSample]([Value]) VALUES (5), (10), (15);
ikisinde de ayni asagidaki kodu calistiriyorum
SELECT * FROM [tbSample]; UPDATE [tbSample] SET [Value] = 100 WHERE [ID] IN (0, 1, 2); SELECT * FROM [tbSample];
normal sartlarda, trigger amacina uygun calisinca, butun satirlarin yeni attigim degerden 5 fazlasi olmasi beklenir. yani hepsi 105 olmali
ancak 1. sekilde asagidaki sonucu aliyoruz.
2. sekilde ise dogru sonucu aliyoruz.
sql fiddle linkleri
http://sqlfiddle.com/#!18/055b9/4
http://sqlfiddle.com/#!18/096321/1
umarim anlasilir olmustur.
-
guru bunu yazdı
Hocam senin icin iki adet sql fiddle hazirladim
birincisindeki trigger sende isaret etmeye calistigim hatalarin oldugu sekilde
CREATE TABLE [tbSample] ( [ID] INT IDENTITY(0,1), [Value] INT); CREATE TRIGGER [trSample] ON [tbSample] AFTER UPDATE AS BEGIN DECLARE @dID INT DECLARE @dValue INT SELECT @dID = [ID] FROM INSERTED SELECT @dValue = [Value] FROM INSERTED UPDATE [tbSample] SET [Value] = @dValue + 5 WHERE [ID] = @dID END; INSERT INTO [tbSample]([Value]) VALUES (5), (10), (15);
ikincisindeki trigger ise duzeltilmis hali
CREATE TABLE [tbSample] ( [ID] INT IDENTITY(0,1), [Value] INT); CREATE TRIGGER [trSample] ON [tbSample] AFTER UPDATE AS BEGIN UPDATE [tbSample] SET [Value] = [I].[Value] + 5 FROM [tbSample] [S] INNER JOIN INSERTED [I] ON [S].[ID] = [I].[ID] END; INSERT INTO [tbSample]([Value]) VALUES (5), (10), (15);
ikisinde de ayni asagidaki kodu calistiriyorum
SELECT * FROM [tbSample]; UPDATE [tbSample] SET [Value] = 100 WHERE [ID] IN (0, 1, 2); SELECT * FROM [tbSample];
normal sartlarda, trigger amacina uygun calisinca, butun satirlarin yeni attigim degerden 5 fazlasi olmasi beklenir. yani hepsi 105 olmali
ancak 1. sekilde asagidaki sonucu aliyoruz.
2. sekilde ise dogru sonucu aliyoruz.
sql fiddle linkleri
http://sqlfiddle.com/#!18/055b9/4
http://sqlfiddle.com/#!18/096321/1
umarim anlasilir olmustur.
hacım şeye anlatır gibi anlatmışsın eline emeğine sağlık.
hala forumlarda böyle insanlar varmış dedirttin bana
çok teşekkür ediyorum.
-
Asayisci bunu yazdı
hacım şeye anlatır gibi anlatmışsın eline emeğine sağlık.
hala forumlarda böyle insanlar varmış dedirttin bana
çok teşekkür ediyorum.
ne demek, ben tesekkur ederim hocam, iyi calismalar.