[firebase-br] RES: Firebird IBO ou Programador com erro

Jose Aparecido da Silva joseasilva em bol.com.br
Sex Jun 4 10:57:08 -03 2010


Bom dia Marcio!
Gostaria de dar algumas dicas que demorei pra aprender e sofri bastante no
inicio, visto que utilizava antes o Paradox. 
Aproveite o que te servir e descarta o resto

1. Não use aspas duplas para definir os nomes de tabelas e de campos na
criação do banco a não ser que seja realmente necessário. Não utilizar aspas
duplas facilita na escrita das sqls de consulta. Se você usa delphi vai
entender o que estou falando.
2. Quando se faz calculo com campos diretamente no sql, assegure-se que
sempre existira um valor, mesmo que zero. O FB, não sei sobre outros bancos,
não realiza operação com valores null. Por isso use sempre coalesce para
garantir que haverá um valor. 

3. Não consegui enxergar erro na tua trigger. Só não será processada as tuas
linhas nas seguintes condições: new.Movimento não traz exatamente o literal
'Devolucao', 'Entrada' e por isso nunca encontrara igualdade. Coisa comum de
acontecer quando definimos o campo como char. No delphi o campo é preenchido
com espaços no final da string para completar o tamanho do campo.
Ou a linha esta sendo processada, mas por motivo de valor null o campo não
esta sendo processado, encontrado. Ou ainda, você pode estar dando um
rollback na operação executada.

[ ]'s
Jose Aparecido da Silva
Fasystem


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Marcio Alves de Almeida
Enviada em: quarta-feira, 2 de junho de 2010 15:59
Para: lista em firebase.com.br
Assunto: Re: [firebase-br] Firebird IBO ou Programador com erro

Pois eh seguindo os conselhos dos amigo
fiz esta Trigger
mas onde estou errando

 Onde esta o erro pois só funciona a Primeira parte a 'venda'...
na venda a trigger funciona mas devolucao e outras nao funga

CREATE TRIGGER "MovSaida_BI" FOR "MovSaida" ACTIVE
BEFORE INSERT POSITION 0
 AS
 BEGIN
  /* Movimenta estoque dos produtos que foram marcados com Entrada ,
 Devolucao,Venda, Estorno */

  if (new."Movimento" = 'Venda') then
  begin
  update "Produto" P set P."Prod_UltimoEstoque" = P."Pro_Quantidade" -
 new."Quantidade"
  where P."Cod_Produto" = new."Cod_Produto";
  end

  if (new."Movimento" = 'Devolucao') then
  begin
  update "Produto" P set P."Prod_UltimoEstoque" = P."Pro_Quantidade" +
 new."Quantidade"
  where P."Cod_Produto" = new."Cod_Produto";
  end

  if (new."Movimento" = 'Entrada') then
  begin
  update "Produto" P set P."Prod_UltimoEstoque" = P."Pro_Quantidade" +
 new."Quantidade"
  where P."Cod_Produto" = new."Cod_Produto";
  end

  if (new."Movimento" = 'Estorno') then
  begin
  update "Produto" P set P."Prod_UltimoEstoque" = P."Pro_Quantidade" -
 new."Quantidade"
  where P."Cod_Produto" = new."Cod_Produto";
  end

 END


2010/5/26 Marcio Alves de Almeida <net.marcio em gmail.com>:
> Tenho um sistema vendas rodado depois de fazer o pedido um cliente
> vai ateh um caixa pagar e nesse momento
> eh dado a baixa no estoque acontece essa semana em uma venda na hora
> da baixa do estoque aconteceu algo estranho tenho uma tabela aparte
> que guarda as movimentacoes dos produto tipo UltimoEstroque  a
> quantidade de saida e Saldo depois da venda
> tipo Assim
> Cod   UltimoEstoque      Saida     EstoqueAtual    Hora cod_venda
> 1        500                       10           490          07:10:10
>     255551
> 1        490                       10           480          07:10:15
>     255555
> 1        480                       20           460          07:10:22
>     255569
>
>
> acontece que em um determinada venda 1 produto foi dar baixa ao
> mesmo tempo e aconteceu isso
> 1        401                       1            400          09:10:01
>      255571
>
> 1        400                       1            399          09:10:22
>      255902
> 1        400                       1            399          09:10:22
>      255940
>
> ele deveria ficar assim
>
> 1        399                       1            398          09:10:22
>      255940
>
> Delphi 7 IBO 4.7.16  Firebird 2.0
> alguem tem uma luz sobre isso o que eu poderia fazer para nao
> acontecer isso
> uma vez que no tabela produtos nao deu baixa no estoque isso nao pode
> acontecer.
>
>        If Q_Produto.RecordCount > 0 Then
>        Begin
>         Modulo.Q_MovSaida.Append;
>         Modulo.Q_MovSaidaCod_Venda.Value        :=
> Modulo.Q_VendaCod_Venda.Value;
>         //*******************************************
>         Modulo.Q_MovSaidaVen_NumNota.Value      :=
> Modulo.Q_VendaVen_NumNota.Value;
>         Modulo.Q_MovSaidaCod_Marca.Value        :=
Q_ItemVendaCod_Marca.Value;
>         //*******************************************
>         Modulo.Q_MovSaidaCod_ItemVenda.Value    :=
> Q_ItemVendaCod_ItemVenda.Value;
>         Modulo.Q_MovSaidaCod_Produto.Value      :=
> Q_ItemVendaCod_Produto.Value;
>         Modulo.Q_MovSaidaCod_Grupo.Value        :=
> Q_ItemVendaItem_Cod_Grupo.Value;
>         Modulo.Q_MovSaidaCod_vendedor.Value     :=
> Modulo.Q_VendaCod_Funcionario.Value;
>         Modulo.Q_MovSaidaCod_Caixa.Value        :=
> Modulo.Q_VendaCod_Caixa_Funcionario.Value;
>         Modulo.Q_MovSaidaNumeroNota.Value       :=
> Modulo.Q_VendaVen_NumNota.Value;
>         Modulo.Q_MovSaidaSaida_Estorno.Value    := 'Venda';
>         Modulo.Q_MovSaidaData.Value             :=
> Modulo.MemoriaDataServer.Value;
>         Modulo.Q_MovSaidaPrecoUnit.Value        :=
> Q_ItemVendaItem_VlrVenda.Value;
>         Modulo.Q_MovSaidaQuantidade.Value       :=
> Q_ItemVendaItem_QtddVenda.Value;
>         Modulo.Q_MovSaidaHora.Value             := Now;
>         Modulo.Q_MovSaidaValorTotal.Value       :=
Q_ItemVendaItem_Total.Value;
>         Modulo.Q_MovSaidaCod_Fecha_Nota.Value   :=
> Modulo.Q_Fecha_NotaCod_Fecha_Nota.Value;
>         Modulo.Q_MovSaidaEstoqueAnterior.Value  :=
> Q_ProdutoPro_Quantidade.Value;
>         Modulo.Q_MovSaidaEstoqueAtual.Value     :=
> Q_ProdutoPro_Quantidade.Value - Q_ItemVendaItem_QtddVenda.Value;
>         Modulo.Q_MovSaida.Post;
>
>         Q_Produto.Edit;
>         Q_ProdutoPro_Quantidade.Value          :=
> Q_ProdutoPro_Quantidade.Value - Q_ItemVendaItem_QtddVenda.Value;
>         Q_ProdutoPro_DtUltimaVenda.Value       :=
> Modulo.MemoriaDataServer.Value;
>         Q_Produto.Post;
>        end;
>

______________________________________________
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