Duvida Procedure/Trigger
Olá Pessoal,
Eu criei uma procedure onde eu coloco todos meus dados e a chamo na trigger. Na tabela DETALLE_CONFERENCIA.
No qual eu utilizo 3 tabelas: DETALLE_CONFERENCIA, CONFERENCIA, PRODUCTO.
1º Eu tinha estes comandos na procedure onde assim que 'After Insert' ele faria a ENTRADA, ou seja, aumentaria o valor no meu estoque da minha tabela PRODUCTO e funcionou perfeitamente, até ai só utilizei a tabela DETALLE_CONFERENCIA e PRODUCTO.
INPUT PARAMETERS:
-ID_PRODUCTO / INTEGER
-CANTIDAD / FLOAT
VARIABLES
-QTD_TEMPORARIO / FLOAT
-QTD_REAL / FLOAT
Porém surgiu um problema em que além de ele fazer uma ENTRADA também vai ter a SAIDA e para isso eu teria que utilizar um IF, pois a SAIDA vai diminuir e não somar, mas eu não estou conseguindo fazer isso, pois ai entra a outra tabela CONFERENCIA, onde no campo MOVIMIENTO é onde está registrado se foi uma ENTRADA ou uma SAIDA, no qual eu preciso utilizar ele para fazer as comparações. E para que funcione a ENTRADA e a SAIDA eu tenho que fazer 2 coisas:
-Fazer uma busca e encontrar o ID_CONFERENCIA (PK) da tabela CONFERENCIA igual ao que está na tabela DETALLE_CONFERENCIA que também tem o campo nomeado de ID_CONFERENCIA (FK)
-E depois pegar o campo MOVIMIENTO desse ID_CONFERENCIA encontrado na tabela CONFERENCIA, para utilizar o IF e fazer as comparações se é SAIDA ou ENTRADA.
Eu até o momento fiz desta forma porém eu não sei como vou fazer esse filtro entre os ID's e meus If estão com erros. Alguem poderia me ajudar?
INPUT PARAMETERS:
-ID_PRODUCTO / INTEGER
-CANTIDAD / FLOAT
VARIABLES
-QTD_TEMPORARIO / FLOAT
-QTD_REAL / FLOAT
Tem mais um detalhe que talvez ajude o ID que tem o campo MOVIMIENTO no qual eu preciso utilizar para saber se é ENTRADA ou SAIDA ele sempre vai ser o ultimo nessa ocasião pois ele vai ter sido adicionado recentemente. E so relembrando eu estou utilizando essa procedure em uma trigger dentro da tabela DETALLE_CONFERENCIA.
Desde já agradecido!
Eu criei uma procedure onde eu coloco todos meus dados e a chamo na trigger. Na tabela DETALLE_CONFERENCIA.
No qual eu utilizo 3 tabelas: DETALLE_CONFERENCIA, CONFERENCIA, PRODUCTO.
1º Eu tinha estes comandos na procedure onde assim que 'After Insert' ele faria a ENTRADA, ou seja, aumentaria o valor no meu estoque da minha tabela PRODUCTO e funcionou perfeitamente, até ai só utilizei a tabela DETALLE_CONFERENCIA e PRODUCTO.
INPUT PARAMETERS:
-ID_PRODUCTO / INTEGER
-CANTIDAD / FLOAT
VARIABLES
-QTD_TEMPORARIO / FLOAT
-QTD_REAL / FLOAT
begin
select ESTOQUE_TEMPORARIO, ESTOQUE_REAL
from PRODUCTO A, CONFERENCIA B
where A.ID_PRODUCTO = :ID_PRODUCTO
into :QTD_TEMPORARIO, :QTD_REAL;
if (B.MOVIMIENTO = 'ENTRADA') then
begin
update PRODUCTO
set A.ESTOQUE_TEMPORARIO = :QTD_TEMPORARIO + :CANTIDAD,
A.ESTOQUE_REAL = :QTD_REAL + :CANTIDAD
where A.ID_PRODUCTO = :ID_PRODUCTO;
end
Porém surgiu um problema em que além de ele fazer uma ENTRADA também vai ter a SAIDA e para isso eu teria que utilizar um IF, pois a SAIDA vai diminuir e não somar, mas eu não estou conseguindo fazer isso, pois ai entra a outra tabela CONFERENCIA, onde no campo MOVIMIENTO é onde está registrado se foi uma ENTRADA ou uma SAIDA, no qual eu preciso utilizar ele para fazer as comparações. E para que funcione a ENTRADA e a SAIDA eu tenho que fazer 2 coisas:
-Fazer uma busca e encontrar o ID_CONFERENCIA (PK) da tabela CONFERENCIA igual ao que está na tabela DETALLE_CONFERENCIA que também tem o campo nomeado de ID_CONFERENCIA (FK)
-E depois pegar o campo MOVIMIENTO desse ID_CONFERENCIA encontrado na tabela CONFERENCIA, para utilizar o IF e fazer as comparações se é SAIDA ou ENTRADA.
Eu até o momento fiz desta forma porém eu não sei como vou fazer esse filtro entre os ID's e meus If estão com erros. Alguem poderia me ajudar?
INPUT PARAMETERS:
-ID_PRODUCTO / INTEGER
-CANTIDAD / FLOAT
VARIABLES
-QTD_TEMPORARIO / FLOAT
-QTD_REAL / FLOAT
begin
select ESTOQUE_TEMPORARIO, ESTOQUE_REAL
from PRODUCTO A, CONFERENCIA B
where A.ID_PRODUCTO = :ID_PRODUCTO
into :QTD_TEMPORARIO, :QTD_REAL;
if (B.MOVIMIENTO = 'ENTRADA') then
begin
update PRODUCTO
set A.ESTOQUE_TEMPORARIO = :QTD_TEMPORARIO + :CANTIDAD,
A.ESTOQUE_REAL = :QTD_REAL + :CANTIDAD
end
else
if (B.MOVIMIENTO = 'SAIDA') then
begin
update PRODUCTO
set A.ESTOQUE_TEMPORARIO = :QTD_TEMPORARIO - :CANTIDAD,
A.ESTOQUE_REAL = :QTD_REAL - :CANTIDAD
end
where A.ID_PRODUCTO = :ID_PRODUCTO;
end
Tem mais um detalhe que talvez ajude o ID que tem o campo MOVIMIENTO no qual eu preciso utilizar para saber se é ENTRADA ou SAIDA ele sempre vai ser o ultimo nessa ocasião pois ele vai ter sido adicionado recentemente. E so relembrando eu estou utilizando essa procedure em uma trigger dentro da tabela DETALLE_CONFERENCIA.
Desde já agradecido!
Edson Vilhalba
Curtidas 0
Respostas
Edson Vilhalba
22/03/2014
Pessoal eu já tive um avanço porém está acontecendo um erro, no qual não sei resolver:
Toda vez quando eu faço uma SAIDA da este erro mas quando eu faço uma ENTRADA funciona normalmente.
ERRO:
Error Message:
----------------------------------------
multiple rows in singleton select.
multiple rows in singleton select.
At procedure 'ENTRADA' line: 9, col: 3
At trigger 'DETALLE_CONFERENCIA_ENTRADA' line: 5, col: 3.
Meu codigo SQL:
Desde já agradecido!
Toda vez quando eu faço uma SAIDA da este erro mas quando eu faço uma ENTRADA funciona normalmente.
ERRO:
Error Message:
----------------------------------------
multiple rows in singleton select.
multiple rows in singleton select.
At procedure 'ENTRADA' line: 9, col: 3
At trigger 'DETALLE_CONFERENCIA_ENTRADA' line: 5, col: 3.
Meu codigo SQL:
begin
select A.ESTOQUE_TEMPORARIO, A.ESTOQUE_REAL, B.MOVIMIENTO
from PRODUCTO A, CONFERENCIA B, DETALLE_CONFERENCIA C
where A.ID_PRODUCTO = :ID_PRODUCTO and
C.ID_CONFERENCIA = B.ID_CONFERENCIA
into :QTD_TEMPORARIO, :QTD_REAL, :MOVIMIENTO;
if (:MOVIMIENTO = 'ENTRADA') then
begin
update PRODUCTO
set ESTOQUE_TEMPORARIO = :QTD_TEMPORARIO + :CANTIDAD,
ESTOQUE_REAL = :QTD_REAL + :CANTIDAD
where ID_PRODUCTO = :ID_PRODUCTO;
end
else
if (:MOVIMIENTO = 'SAIDA') then
begin
update PRODUCTO
set ESTOQUE_TEMPORARIO = :QTD_TEMPORARIO - :CANTIDAD,
ESTOQUE_REAL = :QTD_REAL - :CANTIDAD
where ID_PRODUCTO = :ID_PRODUCTO;
end
end
Desde já agradecido!
GOSTEI 0