[firebase-br] ajuda com stored procedure

Sandro Souza escovadordebits em gmail.com
Qui Maio 7 14:17:45 -03 2009


Bom dia/tarde Reijanio.

Grande Reijanio, acredito que o código UPDATE que está nessa stored
procedure necessite de um pequeno ajuste.

O SELECT verifica se já existe um registro na tabela de ESTOQUE com o código
do produto e do local informados, mas se já constar, você não está apenas
atualizando a quantidade disponível daquele mesmo registro, o UPDATE como
está ali, está trocando o código do local de todos os registros que tenham o
mesmo código de produto, assim como atualizando as quantidades disponíveis
de todos eles.

Tente substituir apenas aquele código UPDATE, desse:

UPDATE ESTOQUE
SET
COD_LOCAL = :COD_LOCAL,
QTDE_DISP = QTDE_DISP +:QTDE_DISP
WHERE (CODPROD =:CODPROD);

Para esse:

UPDATE ESTOQUE SET
   QTDE_DISP = QTDE_DISP +:QTDE_DISP
WHERE
  (CODPROD =:CODPROD)AND
  (COD_LOCAL = :COD_LOCAL);

Dessa nova forma, apenas aquele exato registro que já existe com o código de
produto e local informados será atualizado, e não mais todos os outros
registros do mesmo produto.

Espero ter ajudado mais que atrapalhado. :D

2009/5/7 Reijanio Nunes Ribeiro <rnribeiro em gmail.com>

> bom dia a todos estou com um pequeno problema e gostaria de sua ajuda
> tenho a seguinte sp e funciona sem problemas pra um item so mais qdo é mais
> de um item fica meio dificil gostaria da ajuda de vc's, ficarei grato se
> puderem ajudar
>
> a sintaxe é a seguinte
>
> SET TERM ^ ;
>
> CREATE PROCEDURE UPD_INS_ESTOQUE (
>    codprod varchar(18),
>    cod_local char(3),
>    qtde_disp numeric(10,2))
> as
> BEGIN
> if (EXISTS(SELECT CODPROD FROM ESTOQUE WHERE(CODPROD = :CODPROD)AND
> (COD_LOCAL = :COD_LOCAL))) then
> UPDATE ESTOQUE
> SET
> COD_LOCAL = :COD_LOCAL,
> QTDE_DISP = QTDE_DISP +:QTDE_DISP
> WHERE (CODPROD =:CODPROD);
> ELSE
> INSERT INTO ESTOQUE(
> CODPROD,
> COD_LOCAL,
> QTDE_DISP)
> VALUES
> (
> :CODPROD,
> :COD_LOCAL,
> :QTDE_DISP);
> END^
>
> SET TERM ; ^
>
>
> e a chamda nessa procedure é feita assim nela tem um laço no dataset
> temporário que antes funcionava bem usando uma senteça sel update, mais com
> a sp n ta funcionando
>
> procedure TF_Mov_Estoq.atlz_estoque;
> begin
> if rbmov.Value = 'E' then
> begin
>
>    while not (cds_m_stoq.Eof) do //Cds_m_stoq = clientdataset temporário
>    begin
>    sp_up_ins.Params[0].AsString := Cds_M_StoqCODPROD.AsString;
>    sp_up_ins.params[1].AsString := Dbedit2.Field.AsString;
>    sp_up_ins.params[2].AsFMTBCD := cds_M_StoqQTDE.AsBCD;
>    sp_up_ins.execproc;
>    cds_m_stoq.Next;
>    f_dmm.Estoque.Close;
>  f_dmm.Estoque.Open;
>
>    end;
> se tirar o laço funciona mais so pra um item o que seria melhor nesse caso
> colocar uma trigger pra chamar essa sp, não sei poderiam me ajudar
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista