alm_entrada_produto_item a qual é inserida pela procedure [prc_ALM_InsertEntradaProdutoItem]
ALTER PROCEDURE [prc_ALM_InsertEntradaProdutoItem] @p_id_entidade int, @p_id_entrada_produto_item int, @p_id_entrada_produto_itemSaida int OUTPUT, @p_id_produto int, @p_qtde_produto int, @p_valor_unitario decimal(10, 2), @p_data_validade datetime, @p_numero_lote nvarchar(45), @p_id_entrada_produto int, @p_id_almoxarifado int, @p_observacao_entrada varchar(3000), @p_tipo_entrada varchar(45), @p_id_transferencia int, @p_id_estorno int AS
BEGIN TRANSACTION BEGIN try DECLARE @contador int
SELECT @contador = count_big(*) FROM dbo.alm_entrada_produto_item WHERE (id_entidade=@p_id_entidade) and alm_entrada_produto_item.id_entrada_produto_item = @p_id_entrada_produto_item
WHERE (id_entidade=@p_id_entidade) and alm_entrada_produto_item.id_entrada_produto_item = @p_id_entrada_produto_item ELSE BEGIN
INSERT dbo.alm_entrada_produto_item( id_entidade, id_produto, qtde_produto, valor_unitario, data_validade, numero_lote, id_entrada_produto, id_almoxarifado, observacao_entrada, tipo_entrada, id_transferencia, id_estorno) VALUES ( @p_id_entidade, @p_id_produto, @p_qtde_produto, @p_valor_unitario, @p_data_validade, @p_numero_lote, @p_id_entrada_produto, @p_id_almoxarifado, @p_observacao_entrada, @p_tipo_entrada, @p_id_transferencia, @p_id_estorno) END COMMIT TRANSACTION -- Efetivando alterações na base SET @p_id_entrada_produto_itemSaida=SCOPE_IDENTITY() return @p_id_entrada_produto_itemSaida END try BEGIN CATCH
PRINT ERROR_MESSAGE() ROLLBACK TRANSACTION -- Desfazendo as alterações na base
END CATCH
----------------------------------
e a Tabela alm_entrada_produto_item contém um trigger que atualiza o saldo do estoque na tabela
alter TRIGGER [tr_ObterIDAlmAtualizarSaldoEstoque] ON [dbo].[alm_entrada_produto_item] AFTER INSERT AS
DECLARE @p_id_entidade int
SELECT @p_id_entidade = (select top 1 id_entidade FROM inserted)
IF (@p_id_entidade is null) begin RAISERROR ('Informe a entidade antes de prosseguir', 11,1); Rollback; end ELSE begin
EXECUTE prc_ALM_AtualizarEstoque SELECT id_entidade, id_entrada_produto, id_produto, qtde_produto, id_almoxarifado, valor_unitario, data_validade, numero_lote FROM INSERTED END
que por sua vez chama a procedure prc_ALM_AtualizarEstoque para atualizar o saldo
ALTER PROCEDURE prc_ALM_AtualizarEstoque @p_id_entidade int, @p_id_entrada_produto int, @p_id_produto int, @p_qtde_produto int, @p_id_almoxarifado int, @p_valor_unitario decimal(10, 2), @p_data_validade datetime, @p_numero_lote nvarchar(45) AS BEGIN DECLARE @contador int
SELECT @contador = count_big(*) FROM alm_estoque WHERE (id_entidade=@p_id_entidade) AND id_produto = @p_id_produto AND id_almoxarifado = @p_id_almoxarifado AND numero_lote = @p_numero_lote AND data_validade = @p_data_validade AND id_entrada_produto = @p_id_entrada_produto
IF @contador > 0 begin UPDATE alm_estoque SET qtde_produto = qtde_produto + @p_qtde_produto, id_almoxarifado = @p_id_almoxarifado WHERE (id_entidade=@p_id_entidade) AND id_produto = @p_id_produto AND id_almoxarifado = @p_id_almoxarifado AND numero_lote = @p_numero_lote AND data_validade = @p_data_validade AND id_entrada_produto = @p_id_entrada_produto end ELSE begin INSERT dbo.alm_estoque( id_entidade, id_entrada_produto, id_produto, qtde_produto, id_almoxarifado, valor_unitario, data_validade, numero_lote) VALUES ( @p_id_entidade, @p_id_entrada_produto, @p_id_produto, @p_qtde_produto, @p_id_almoxarifado, @p_valor_unitario, @p_data_validade, @p_numero_lote) end END
Porém quando tento incluir na tabela alm_entrada_produto_item me aparece essa mensagem
A tabela de destino 'alm_entrada_produto_item' da instrução DML não pode ter gatilhos habilitados se a instrução contém uma cláusula OUTPUT sem cláusula INTO.
Já tentei de todas as formas, se alguém puder me ajudar, agradeço.
TRIGGER e Procedure instrução DML não pode ter gatilhos habilitados se a instrução contém uma cláusula OUTPUT sem cláusula INTO.
em SQL Server
Postado
Boa noite!
Estou com uma situação, tenho uma tabela chamada
alm_entrada_produto_item a qual é inserida pela procedure [prc_ALM_InsertEntradaProdutoItem]
ALTER PROCEDURE [prc_ALM_InsertEntradaProdutoItem]
@p_id_entidade int,
@p_id_entrada_produto_item int,
@p_id_entrada_produto_itemSaida int OUTPUT,
@p_id_produto int,
@p_qtde_produto int,
@p_valor_unitario decimal(10, 2),
@p_data_validade datetime,
@p_numero_lote nvarchar(45),
@p_id_entrada_produto int,
@p_id_almoxarifado int,
@p_observacao_entrada varchar(3000),
@p_tipo_entrada varchar(45),
@p_id_transferencia int,
@p_id_estorno int
AS
BEGIN TRANSACTION
BEGIN try
DECLARE
@contador int
SELECT @contador = count_big(*)
FROM dbo.alm_entrada_produto_item
WHERE (id_entidade=@p_id_entidade) and alm_entrada_produto_item.id_entrada_produto_item = @p_id_entrada_produto_item
IF @contador > 0
UPDATE dbo.alm_entrada_produto_item
SET
id_produto = @p_id_produto,
qtde_produto = @p_qtde_produto,
valor_unitario = @p_valor_unitario,
data_validade = @p_data_validade,
numero_lote = @p_numero_lote,
id_almoxarifado = @p_id_almoxarifado,
observacao_entrada = @p_observacao_entrada,
tipo_entrada = @p_tipo_entrada
WHERE (id_entidade=@p_id_entidade) and alm_entrada_produto_item.id_entrada_produto_item = @p_id_entrada_produto_item
ELSE
BEGIN
INSERT dbo.alm_entrada_produto_item(
id_entidade,
id_produto,
qtde_produto,
valor_unitario,
data_validade,
numero_lote,
id_entrada_produto,
id_almoxarifado,
observacao_entrada,
tipo_entrada,
id_transferencia,
id_estorno)
VALUES (
@p_id_entidade,
@p_id_produto,
@p_qtde_produto,
@p_valor_unitario,
@p_data_validade,
@p_numero_lote,
@p_id_entrada_produto,
@p_id_almoxarifado,
@p_observacao_entrada,
@p_tipo_entrada,
@p_id_transferencia,
@p_id_estorno)
END
COMMIT TRANSACTION -- Efetivando alterações na base
SET @p_id_entrada_produto_itemSaida=SCOPE_IDENTITY()
return @p_id_entrada_produto_itemSaida
END try
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK TRANSACTION -- Desfazendo as alterações na base
END CATCH
----------------------------------
e a Tabela alm_entrada_produto_item contém um trigger que atualiza o saldo do estoque na tabela
alter TRIGGER [tr_ObterIDAlmAtualizarSaldoEstoque]
ON [dbo].[alm_entrada_produto_item]
AFTER INSERT AS
DECLARE
@p_id_entidade int
SELECT @p_id_entidade = (select top 1 id_entidade FROM inserted)
IF (@p_id_entidade is null)
begin
RAISERROR ('Informe a entidade antes de prosseguir', 11,1);
Rollback;
end
ELSE
begin
EXECUTE prc_ALM_AtualizarEstoque
SELECT
id_entidade,
id_entrada_produto,
id_produto,
qtde_produto,
id_almoxarifado,
valor_unitario,
data_validade,
numero_lote
FROM INSERTED
END
que por sua vez chama a procedure prc_ALM_AtualizarEstoque para atualizar o saldo
ALTER PROCEDURE prc_ALM_AtualizarEstoque
@p_id_entidade int,
@p_id_entrada_produto int,
@p_id_produto int,
@p_qtde_produto int,
@p_id_almoxarifado int,
@p_valor_unitario decimal(10, 2),
@p_data_validade datetime,
@p_numero_lote nvarchar(45)
AS
BEGIN
DECLARE
@contador int
SELECT @contador = count_big(*)
FROM alm_estoque
WHERE
(id_entidade=@p_id_entidade) AND
id_produto = @p_id_produto AND
id_almoxarifado = @p_id_almoxarifado AND
numero_lote = @p_numero_lote AND
data_validade = @p_data_validade AND
id_entrada_produto = @p_id_entrada_produto
IF @contador > 0
begin
UPDATE alm_estoque
SET
qtde_produto = qtde_produto + @p_qtde_produto,
id_almoxarifado = @p_id_almoxarifado
WHERE (id_entidade=@p_id_entidade) AND
id_produto = @p_id_produto AND
id_almoxarifado = @p_id_almoxarifado AND
numero_lote = @p_numero_lote AND
data_validade = @p_data_validade AND
id_entrada_produto = @p_id_entrada_produto
end
ELSE
begin
INSERT dbo.alm_estoque(
id_entidade,
id_entrada_produto,
id_produto,
qtde_produto,
id_almoxarifado,
valor_unitario,
data_validade,
numero_lote)
VALUES (
@p_id_entidade,
@p_id_entrada_produto,
@p_id_produto,
@p_qtde_produto,
@p_id_almoxarifado,
@p_valor_unitario,
@p_data_validade,
@p_numero_lote)
end
END
Porém quando tento incluir na tabela alm_entrada_produto_item me aparece essa mensagem
A tabela de destino 'alm_entrada_produto_item' da instrução DML não pode ter gatilhos habilitados se a instrução contém uma cláusula OUTPUT sem cláusula INTO.
Já tentei de todas as formas, se alguém puder me ajudar, agradeço.