Fórum Stored Procedure #403956

28/06/2011

0

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:

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

Robson Morais

Responder

Posts

29/06/2011

Emerson Nascimento

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

Responder

Gostei + 0

29/06/2011

Robson Morais

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar