Res: RES: RES: [firebase-br] Problema Com Alteração / Criação de Trigger

marcos thomaz marcosthomazs em yahoo.com.br
Seg Ago 20 12:11:56 -03 2007


Ivan, minha procedure está assim:

 IF (DELETING OR UPDATING) THEN
    UPDATE CLIENTES SET DEBITO = COALESCE(DEBITO,0) + OLD.VALOR WHERE ID = OLD.CLIENTE;
  IF (INSERTING OR UPDATING) THEN
    UPDATE CLIENTES SET DEBITO = COALESCE(DEBITO,0) - NEW.VALOR WHERE ID = NEW.CLIENTE;

Se você for olhar, a parte do DELETE não está usando NEW. E outra, a tabela fica como readonly, tipo, não consigo, alterar, inserir ou excluir nada. Esse é o mais estranho. E o erro que aparece, não descreve nada praticamente, pois é um erro que aparece ao tentar alterar uma coluna calculada (computed by), que não é meu caso. Já estou ficando intrigado com isso, pois uso o Firebird em muitos de meus projetos, e alguns deles muito complicados, e essa é a primeira vez que tenho problemas com o banco. Agradeço a você por estar me ajudando... se precisar de ajuda, fico a disposição.

----- Mensagem original ----
De: Ivan Guimarães Meirelles <igmeirelles em gmail.com>
Para: FireBase <lista em firebase.com.br>
Enviadas: Segunda-feira, 20 de Agosto de 2007 6:05:22
Assunto: RES: RES: [firebase-br] Problema Com Alteração / Criação de Trigger

Olá Marcos...

Olhando novamente sua lógica... "acho" que o problema deve ocorrer quando vc
executa um delete na tabela PAGAMENTOCLIENTES, pois vc utiliza um select q
tenta fazer alteração no campo NEW.VALORANTERIOR, porém se vc está excluindo
esse campo não poderá ser alterado... vc não tem acesso ao New (novo) valor
desse campo, porque se trata de uma exclusão. Não existe NEW em exclusão.

Bem coloquei "acho" entre aspas porque não testei... apenas analisei a
lógica, faça um teste com um IF separado para o delete sem o select...

Veja se dá certo assim:

CREATE TRIGGER PAGAMENTOCLIENTES_AIUD0 FOR PAGAMENTOCLIENTES 
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0 AS 
Begin

    IF (DELETING) THEN
        UPDATE CLIENTES SET DEBITO = COALESCE(DEBITO,0) + OLD.VALOR
WHERE ID = OLD.CLIENTE;

    ELSE IF (UPDATING) THEN
        BEGIN
            UPDATE CLIENTES SET DEBITO = COALESCE(DEBITO,0) +
OLD.VALOR WHERE ID = OLD.CLIENTE;
            SELECT DEBITO FROM CLIENTE WHERE ID = NEW.CLIENTE
INTO NEW.VALORANTERIOR;
        END;

    ELSE IF (INSERTING) THEN
        UPDATE CLIENTES SET DEBITO = COALESCE(DEBITO,0) - NEW.VALOR
WHERE ID = NEW.CLIENTE; 
End

----------------------------------------------------------------------------
-----

Um abraço.

Ivan Guimarães Meirelles
Três Lagoas/MS - igmeirelles em gmail.com


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.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







      Flickr agora em português. Você clica, todo mundo vê.
http://www.flickr.com.br/


Mais detalhes sobre a lista de discussão lista