2016-10-01 5 views
-2

友人私はトリガを書いていますが、私が逃したか、それとも間違っていましたかわかりません。 問題はおそらく私が書いたコードを取得するためのコードにあります。問題があります。しかし、私は確信していませんでした。 トリガーに入ったときの目録の目的は、ピースを取り除くときにあなたの負債の部分に追加します。追加したとき 同じよう正確には何のトリガーが動作しません

create trigger StokHareketGirisCikis 
on StokHareket 
after insert,update,delete 
as 
declare @stokKodu nvarchar(50),@gc int,@stokId int,@adet int 
if exists (select * from deleted) 
begin 
    select @stokId=id from deleted 
    select @stokKodu=(select StokKodu from StokKarti where [email protected]),@adet=Miktar,@gc=GC from deleted 
    if @gc=1 
    begin 
     update StokToplam set [email protected] where [email protected] 
     end 
     else 
     update StokToplam set [email protected] where [email protected] 
end 
if exists(select * from inserted) 
begin 
select @stokId=id from inserted 
select @stokKodu=(select StokKodu from StokKarti where [email protected]),@adet=Miktar,@gc=GC from inserted 
    if @gc=1 
    begin 
     update StokToplam set [email protected] where [email protected] 
     end 
     else 
     update StokToplam set [email protected] where [email protected] 
end 
+0

全く不明で –

+0

ヒントをとても感謝:トリガーを避けてください。ほとんどの場合、悪い設計を修正しようとしています。 – shadow

+0

私はあなたがdownvotedされた理由を理解していない、それはかなり良い質問です、ここに私のアップです。 – gofr1

答えて

-1

私は問題の世話をしました。 'StokId' 'StokKodu'に変更しました。うまく動作します。 gofr1 @

create trigger [dbo].[StokHareketGirisCikis] 
on [dbo].[StokHareket] 
after insert,update,delete 
as 
declare @stokKodu nvarchar(50),@gc int,@adet int 
if exists (select * from deleted) 
begin 
    select @stokKodu=StokKodu,@adet=Miktar,@gc=GC from deleted 
    if @gc=1 
    begin 
     update StokToplam set [email protected] where [email protected] 
     end 
     else 
     update StokToplam set [email protected] where [email protected] 
end 
if exists(select * from inserted) 
begin 
select @stokKodu=StokKodu,@adet=Miktar,@gc=GC from inserted 
    if @gc=1 
    begin 
     update StokToplam set [email protected] where [email protected] 
     end 
     else 
     update StokToplam set [email protected] where [email protected] 
end 

+0

そして、一度に異なる「StokKodu」が挿入された3行があった場合はどうなりますか?あなたのトリガーは、そのうちの一つでしか動作しません、私は私の答えで述べたように非常に悪いアプローチです。 – gofr1

+0

あなたはそれのために働く。どうもありがとうございました。 –

1

幕主な問題は、あなたが1行(f.e. select @stokId=id from deleted)を使用しますが、inserteddeletedであり、多分それ以上の行されています。この表から値を取るために変数を使用する必要はありません.JOINを使用してください。

F.e.この部分:

select @stokId=id from deleted 
select @stokKodu=(select StokKodu from StokKarti where [email protected]),@adet=Miktar,@gc=GC from deleted 
if @gc=1 
begin 
    update StokToplam set [email protected] where [email protected] 
    end 
    else 
    update StokToplam set [email protected] where [email protected] 

は次のように書き換え中のようになります。

;WITH cte AS (
    select sk.StokKodu, 
      d.Miktar, 
      d.GC 
    from deleted d 
    inner join StokKarti sk 
     ON sk.id = d.id 
) 

update st 
set borc-=c.Miktar 
FROM StokToplam st 
INNER JOIN cte с 
    ON c.stokKodu=st.stokKodu 
     AND c.GC = 1 

update st 
set alacak-=c.Miktar 
FROM StokToplam st 
INNER JOIN cte с 
    ON c.stokKodu=st.stokKodu 
     AND c.GC != 1 
+0

私はトリガーなしでこの仕事をしなければなりませんか? –

+0

この変更をすぐに行う必要がある場合は、トリガーを使用してください。これを1時間に1回行うことができます。ストアドプロシージャとジョブを時間単位のスケジュールで効率良く使用する。 – gofr1

+0

これを行う必要があります。その瞬間に残りの株式の数を見る必要があるからです。 –

関連する問題