Trigger Stok Takip

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsayisciAsayisci
    Asayisci
    Asayisci's avatar
    Kayıt Tarihi: 14/Eylül/2009
    Erkek

    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
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsayisciAsayisci
    Asayisci
    Asayisci's avatar
    Kayıt Tarihi: 14/Eylül/2009
    Erkek

    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


     

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    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

    ..
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsayisciAsayisci
    Asayisci
    Asayisci's avatar
    Kayıt Tarihi: 14/Eylül/2009
    Erkek
    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.

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    esinti
    esinti's avatar
    Kayıt Tarihi: 27/Ağustos/2015
    Erkek

    Hocam her güncelleme de eski kaydı silip yeni kayıt oluştursan ve böylelikle upda ile uğraşmasan olmaz mı?

     
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek
    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.


    ..
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsayisciAsayisci
    Asayisci
    Asayisci's avatar
    Kayıt Tarihi: 14/Eylül/2009
    Erkek
    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?

  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    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.


    ..
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AsayisciAsayisci
    Asayisci
    Asayisci's avatar
    Kayıt Tarihi: 14/Eylül/2009
    Erkek
    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.

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek
    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.


    ..
Toplam Hit: 1973 Toplam Mesaj: 10
trigger stok takip