[firebase-br] Trigger Não funciona!!! O FireBird tem Bug!!!

Eliomar eliomar em promediconet.com.br
Qui Maio 12 13:27:39 -03 2005


O assunto é comprido e complicado mas vamos lá... 
Eu fiz uma table Saidas, uma Table Saidas_Itens e table Itens
e fiz o relacionamento com a chave estrangeira em cascata.

Até perfeito... 
Na table Saidas_Itens eu fiz uma trigger no after post assim:

update itens
   set itens.estoque = itens.estoque - saidas_itens.quantidade
where itens.codigo = new.codigo_itens

perfeito o estoque foi atualizado... 

na table saidas_itens eu fiz uma trigger no before delete assim:

update itens
  set itens.estoque = itens.estoque + saidas_itens.quantidade
where itens.codigo = old.codigo_itens

até ai perfeito... o estoque volta para o que era antigamente quando
eu deleto um registro da table Saidas_Itens. Blz né... é isso mesmo
que tem que acontecer... 

Agora se eu apagar a table Saidas, o próprio banco apaga a saidas_itens
pois as duas estão relacionada, até ai... perfeito.

Agora acontece que a trigger não voltou o estoque para o lugar... 

Ai eu perguto... o registro da table Saidas_Itens não foi deletado?
Então deferia voltar o estoque ou seja fazer o que esta na trigger.
Isso é um BUG do FireBird?

Agradecido.
Eliomar,
ICQ - 167715482
MSN - eliomar0910 em hotmail.com
Soft-Data Softwares Administrativos
hptt://www.promediconet.com.br



------------- Segue mensagem original! -------------

De: Rodrigo - Alma Informática Ltda	<desenv28 em almainformatica.com.br>
Data: Thu, 12 May 2005 10:29:10 -0300
Para: "FireBase" <lista em firebase.com.br>,	"Pha-Lista" <lista em pha.com.br>
Assunto: [firebase-br] Store de Procedure

Amigos,

Estou precisando de uma ajuda de voces, e o seguinte estou com a seguinte store de procedure abaixo no qual eu peguei no site do firebase so que não estou conseguindo fazer ela funcionar, será que alguem poderia me ajudar.

Quando dou um select na procedure ela esta dando o seguinte erro :

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
CAIXA.
At line 1, column 15.


SET TERM ^ ;

CREATE PROCEDURE FLUXOCAIXA (
    INICIO DATE,
    FIM DATE)
RETURNS (
    DATA DATE,
    HISTORICO VARCHAR(30),
    VALOR NUMERIC(15,2),
    TIPO CHAR(1))
AS
DECLARE VARIABLE SALDO_ANT_CREDITO NUMERIC(15,2);
DECLARE VARIABLE SALDO_ANT_DEBITO NUMERIC(15,2);
DECLARE VARIABLE SALDO_FINAL NUMERIC(15,2);
begin

  /* Primeiro recuperamos a soma dos valores dos debitos anteriores ao
     periodo informado para posteriormente calcularmos nosso saldo inicial */

  select sum(ap.valor)
  from contasapagar ap
  where (ap.data < :inicio)
  into :saldo_ant_debito;

  /* Agora recuperamos a soma dos valores dos creditos anteriores ao
     periodo informado  */

  select sum(ar.valor)
  from contasareceber ar
  where (ar.data < :inicio)
  into :saldo_ant_credito;

  /* Caso não haja lancamentos anteriores, a variavel ficara no estado NULL,
     como no SQL qualquer operação matemática feita com valores NULL sempre
     resulta em NULL, temos que verificar isso e atribuir 0.00 na variavel nula
     para que forneça o resultado esperado */

  if (:saldo_ant_credito is null) then saldo_ant_credito = 0.00;
  if (:saldo_ant_debito is null) then saldo_ant_debito = 0.00;

  data = :inicio - 1;
  historico = 'SALDO ANTERIOR';
  valor = (saldo_ant_credito - saldo_ant_debito);

  /* Inicializando a variavel que armazenara o saldo final
     com o valor do saldo anterior */
  saldo_final = valor;

  /* Por questões "estéticas" não queremos ter valores negativos no campo valor,
     sendo assim, se o saldo anterior é negativo, devemos informar que o lançamento é
     de débito e tornar o valor do saldo positivo, caso contratio informamos que o
     lançamento é de crédito.*/

  if (:valor < 0) then
  begin
    tipo = 'D';
    valor = valor * -1;
  end
  else
  begin
    tipo = 'C';
  end

  suspend; /* Retornando a primeira linha (registro) com o saldo anterior */

  /* o comando a seguir seleciona os registros dentro do periodo informado
     buscando na tabela de contas a pagar */

  tipo = 'D'; /* Estamos recuperando débitos */

  for select ap.data, ap.historico, ap.valor
      from contasapagar ap
      where (ap.data between :inicio and :fim)
      into :data, :historico, :valor
  do
  begin
    /* Subtraimos o valor do lançamento do saldo final */
    saldo_final = saldo_final - valor;
    /* O suspend a seguir retorna uma "linha" contendo os campos
       data, historico, tipo e valor que tem seus valores armazenados
       nas variáveis de mesmo nome */
    suspend;
  end

  tipo = 'C'; /* Estamos recuperando créditos */

  /* seleciona os registros dentro do periodo informado
     buscando na tabela de contas a receber */
  for select ar.data, ar.historico, ar.valor
      from contasareceber ar
      where (ar.data between :inicio and :fim)
      into :data, :historico, :valor
  do
  begin
    /* Adicionamos o valor do lançamento ao saldo final */
    saldo_final = saldo_final + valor;
    /* O suspend a seguir retorna uma "linha" contendo os campos
       data, historico, tipo e valor que tem seus valores armazenados
       nas variáveis de mesmo nome */
    suspend;
  end

  /* Montamos o ultimo "registro" que conterá os valores do saldo FINAL */
  data = :fim;
  historico = 'SALDO FINAL';
  tipo = 'C';
  valor = saldo_final;

  suspend;

end
^

SET TERM ; ^

GRANT SELECT ON CONTASAPAGAR TO PROCEDURE FLUXOCAIXA;

GRANT SELECT ON CONTASARECEBER TO PROCEDURE FLUXOCAIXA;



Abraço a todos,


Rodrigo Cristiano Magno
Analista de Sistemas
 
Alma Informática Ltda - Consultoria e Desenvolvimento de Sistemas
Av. Raja Gabáglia 4055, salas 211/210/208 - São Bento - BH / MG - CEP: 30.360-670
TeleFax: (31) 3296.0084
homepage: http://www.almainformatica.com.br
e-mail: desenv28 em almainformatica.com.br
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa







Mais detalhes sobre a lista de discussão lista