Stored Procedure
Pessoal não sei se alguém ai pode me ajudar.....mas estava tenho um caso que ao deletar um produto de uma determinada entrada de estoque ele tem que ir na tabela entrada e diminuir a quantidade e valor ai estava ká comigo querendo deixar para o banco de dados fazer esse procedimento, sendo assim pensei na Stored procedure em vez até de criar uma função no sistema para isso....
eu uso o banco de dados firebird e estou tentando fazer essa stored procedure abaixo:
mas dá esse erro:
alguem pode me ajudar ?
eu uso o banco de dados firebird e estou tentando fazer essa stored procedure abaixo:
CREATE PROCEDURE P_PRD_ENTRADAS_AtuQtVlTotal ( vEmpCodigo integer, vEntCodigo Integer, vEntData Integer, vCodProduto INTEGER, vEntQtdTotal Numeric (10,4), vEntVlTotalProd Numeric (10,6) ) returns ( vEntQtdTotal Numeric (10,4), vEntVlTotalProd Numeric (10,6) ) as begin Update Prd_Entradas Set EntQtdTotal = :vEntQtdTotal where EmpCodigo = :vEmpCodigo and EntCodigo = :vEmpCodigo and EntData = :vEntData; end
mas dá esse erro:
This operation is not defined for system tables. unsuccessful metadata update. STORE RDB$PROCEDURE_PARAMETERS failed. attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_18".
alguem pode me ajudar ?
Robson Morais
Curtidas 0
Respostas
Emerson Nascimento
28/06/2011
explique como deve ser o procedimento.
porque o normal seria você ter ao menos 3 tabelas:
produtos
entradas
saidas
onde o saldo estaria registrado no produto.
ou, num modelo mais detalhado:
produtos
saldos
entradas
saidas
movimentacoes (para producao)
onde o saldo seria gravado na tabela saldos, em função das movimentacoes de entradas, saidas e producoes, observando qual o 'almoxarifado' a ser movimentado (levando-se em conta outras variáveis, como saldo inicial, controle de saldo de processos, etc.)
mas partindo para o básico,
produtos
entradas
saidas
vou supor que o saldo está na tabela produtos. a cada movimentacao de entrada, saida ou producao, você manipula o saldo do produto.
dessa forma, a sua stored procedure deveria ficar mais ou menos assim:
CREATE PROCEDURE P_MOV_SALDO
(
vEmpCodigo integer,
vEntCodigo Integer,
vCodProduto INTEGER,
vQtd Numeric (10,4),
vTipo char(1)
)
as
declare multiplicador smallint;
begin
if (vTipo = 'E') then -- entrada, soma ao saldo
multiplicador := 1;
else
multiplicador := -1;
Update Produtos Set Saldo = Saldo + (:vQtd * :multiplicador)
where EmpCodigo = :vEmpCodigo and
EntCodigo = :vEmpCodigo and -- ????
CodProd = :vCodProduto;
end
e, nas tabelas de entradas, saidas e movimentacao, devem ser criadas as triggeres ao incluir e ao deletar, que devem chamar a SP acima. por exemplo:
CREATE OR ALTER trigger entradas_saldo for entradas
active after insert or delete position 0
as
begin
if (inserting) then
execute produre P_MOV_SALDO(new.empcodigo, new.empcodigo, new.codprod, new.quantidade, 'E');
else
execute produre P_MOV_SALDO(old.empcodigo, old.empcodigo, old.codprod, old.quantidade, 'S');
end
CREATE OR ALTER trigger saidas_saldo for saidas
active after insert or delete position 0
as
begin
if (inserting) then
execute produre P_MOV_SALDO(new.empcodigo, new.empcodigo, new.codprod, new.quant, 'S');
else
execute produre P_MOV_SALDO(old.empcodigo, old.empcodigo, old.codprod, old.quant, 'E');
end
porque o normal seria você ter ao menos 3 tabelas:
produtos
entradas
saidas
onde o saldo estaria registrado no produto.
ou, num modelo mais detalhado:
produtos
saldos
entradas
saidas
movimentacoes (para producao)
onde o saldo seria gravado na tabela saldos, em função das movimentacoes de entradas, saidas e producoes, observando qual o 'almoxarifado' a ser movimentado (levando-se em conta outras variáveis, como saldo inicial, controle de saldo de processos, etc.)
mas partindo para o básico,
produtos
entradas
saidas
vou supor que o saldo está na tabela produtos. a cada movimentacao de entrada, saida ou producao, você manipula o saldo do produto.
dessa forma, a sua stored procedure deveria ficar mais ou menos assim:
CREATE PROCEDURE P_MOV_SALDO
(
vEmpCodigo integer,
vEntCodigo Integer,
vCodProduto INTEGER,
vQtd Numeric (10,4),
vTipo char(1)
)
as
declare multiplicador smallint;
begin
if (vTipo = 'E') then -- entrada, soma ao saldo
multiplicador := 1;
else
multiplicador := -1;
Update Produtos Set Saldo = Saldo + (:vQtd * :multiplicador)
where EmpCodigo = :vEmpCodigo and
EntCodigo = :vEmpCodigo and -- ????
CodProd = :vCodProduto;
end
e, nas tabelas de entradas, saidas e movimentacao, devem ser criadas as triggeres ao incluir e ao deletar, que devem chamar a SP acima. por exemplo:
CREATE OR ALTER trigger entradas_saldo for entradas
active after insert or delete position 0
as
begin
if (inserting) then
execute produre P_MOV_SALDO(new.empcodigo, new.empcodigo, new.codprod, new.quantidade, 'E');
else
execute produre P_MOV_SALDO(old.empcodigo, old.empcodigo, old.codprod, old.quantidade, 'S');
end
CREATE OR ALTER trigger saidas_saldo for saidas
active after insert or delete position 0
as
begin
if (inserting) then
execute produre P_MOV_SALDO(new.empcodigo, new.empcodigo, new.codprod, new.quant, 'S');
else
execute produre P_MOV_SALDO(old.empcodigo, old.empcodigo, old.codprod, old.quant, 'E');
end
GOSTEI 0
Robson Morais
28/06/2011
Consegui resolver :
CREATE PROCEDURE P_PRD_ENTRADAS_ATUQTVLTOTAL ( vempcodigo integer, ventcodigo integer, ventdata date, ventqtdtotal numeric(10,4), ventvltotalprod numeric(10,6), ventvltotentrada numeric(10,6)) as begin Update Prd_Entradas Set EntQtdTotal = :vEntQtdTotal, EntVlTotalProd = :vEntVlTotalProd, EntVlTotEntrada = :vEntVlTotEntrada where EmpCodigo = :vEmpCodigo and EntCodigo = :vEntCodigo and EntData = :vEntData; end
GOSTEI 0