2016-10-01 3 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

Я не понимаю, почему вы были остановлены, это довольно хороший вопрос, вот и я. – gofr1

ответ

-1

Я заботилась о проблеме. 'StokId' 'StokKodu' Я изменил его. работает просто отлично.

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 

@ gofr1 спасибо большое

+0

А что, если в один момент были вставлены 3 строки с разными «StokKodu»? Ваш триггер будет работать только с одним из них, это очень плохой подход, как я упоминал в своем ответе. – gofr1

+0

вы работаете для этого. Большое спасибо. –

1

Основная проблема заключается в использовании 1 строку (F.E. select @stokId=id from deleted), но, возможно, больше строк в inserted и deleted. Вам не нужно использовать переменные для принятия значений из этих таблиц, используйте 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

Если вам нужно, чтобы изменения были сделаны немедленно - используйте триггер, если вы можете сделать это один раз в час F.e. лучше использовать хранимую процедуру и работу с почасовым графиком. – gofr1

+0

теперь это нужно сделать. потому что в этот момент мне нужно увидеть количество оставшихся запасов. –

Смежные вопросы