REVELAR

Fórum Problemas com trigger ao gerar o exeption? #57700

16/01/2007

0

Olah pessoal, fir uma Trigger assim:

ET SQL DIALECT 3;

SET NAMES ISO8859_1;


SET TERM ^ ;


CREATE TRIGGER UNIQUE_RESTTODOMES FOR TODOMESCONTA
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
  if ( Exists(Select * from todomesconta WHERE ano = NEW.ano and conta_d = new.conta_d and conta_c = new.conta_c and datalcto = new.datalcto ) )
then
  Exception RESTRICAO ´Atenção Usuário!!! Dados já consta cadastrado no Banco de Dados!´;
end
^


SET TERM ; ^

Para que NAO grave no banco dados que ja foram cadastrados, esta funcionando o exeption, mais estou com um pequeno problema:

Fiz uns testes e percebi um pequeno problema, tipo assim se gerar um exeption uma vez ele fica gerando outros exeptions que nao tem nada haver, ai tenho que sair do programa de voltar novamente para conseguir incluir os dados.

Algeum pode me dizer o que esta acontecendo?

Grato
Adriano.


Adriano_servitec

Adriano_servitec

Responder

Posts

16/01/2007

Adriano_servitec

Tambem tentei usar unique e fica a mesma coisa, ou seja tenho que fechar e abrir novamente o programa

fica igual ao trigger, somente fechando e abrindo novamente o programa para poder gravar novamente se apareçer pela primeira vez a mensagem

Essa eh a mensagem que dispara ao gravar
[b:76db1a2a73]violation of primary or unique key constraint ´Uniq_TabelaTodoMes´ on table ´TableTodoMes´[/b:76db1a2a73]

Fiz a unique assim
ALTER TABLE TODOMESCONTA ADD CONSTRAINT UNQ1_TODOMESCONTA UNIQUE (ANO, CONTA_D, CONTA_C, DATALCTO);
e Nao funcionou, ai apaguei ela tambem e fiz desta forma
/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE UNIQUE INDEX UNQ_TODOMES ON TODOMESCONTA (ANO, CONTA_D, CONTA_C, DATALCTO);
e tambem nao funciona depois que apareçe a mensagem

A mensagem eh esta
[b:76db1a2a73]ATTEMPT TO STORE DUPLICATE DATE VALUE(VISIBLE TO ACTIVE TRANSACTIONS) IN UNIQUE INDEX ´UNQ_TODOMES´[/b:76db1a2a73]

Talvez eu precise fazer um try ... exeption no botao gravar, mais nao sei como fazer ao certo :oops:

Olhe como tentei fazer num button
N := ComponentCount; for I := 0 to N-1 do begin if (Components[I] is TEdit) AND ((Components[I] as TEdit).Tag > 0) AND ((Components[I] as TEdit).Tag < 19) and ((Components[I] as TEdit).Text <> ´´) then begin dm.IBTodoMes.Append; {para incluir na Tabela usando um DataSet} {passando os dados do edit para o DataSet} dm.IBTodoMesano.Value := edtAno.Text; dm.IBTodoMesConta_D.Value := edtDebito.Text; dm.IBTodoMesConta_C.Value := edtCredito.Text; dm.IBTodoMesMes.Value := (Components[I] as TEdit).Tag; if RadioButton1.checked = true then begin Case (Components[I] as TEdit).Tag of 1: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit2.Text; 2: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit3.Text; 3: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit4.Text; 4: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit5.Text; 5: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit6.Text; 6: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit7.Text; 7: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit8.Text; 8: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit9.Text; 9: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit10.Text; 10: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit11.Text; 11: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit12.Text; 12: DM.IBTodoMesHistorico.Value := edtHistorico.Text + ´ ´+ Edit13.Text; end; //pertence ao case end else begin//pertence ao radiobutton dm.IBTodoMesHistorico.Value := edtHistorico.Text; end; // final do if Case (Components[I] as TEdit).Tag of 1: DM.IBTodoMesValor.Value := StrToFloat((Components[I] as TEdit).Text); 2: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 3: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 4: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 5: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 6: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 7: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 8: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 9: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 10: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 11: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); 12: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text); end; Case (Components[I] as TEdit).Tag of 1: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/01/´+edtAno.Text ); 2: DM.IBTodoMesdatalcto.Value :=strtodate( ´28/02/´+edtAno.Text ); 3: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/03/´+edtAno.Text ); 4: DM.IBTodoMesdatalcto.Value :=strtodate( ´30/04/´+edtAno.Text ); 5: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/05/´+edtAno.Text ); 6: DM.IBTodoMesdatalcto.Value :=strtodate( ´30/06/´+edtAno.Text ); 7: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/07/´+edtAno.Text ); 8: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/08/´+edtAno.Text ); 9: DM.IBTodoMesdatalcto.Value :=strtodate( ´30/09/´+edtAno.Text ); 10: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/10/´+edtAno.Text ); 11: DM.IBTodoMesdatalcto.Value :=strtodate( ´30/11/´+edtAno.Text ); 12: DM.IBTodoMesdatalcto.Value :=strtodate( ´31/12/´+edtAno.Text ); end; [color=red:76db1a2a73] try dm.ibqtodomes.active:=true; dm.IBTodoMes.Post; {para gravar na tabela} dm.tLConta.Commit; //comitar o transaction DM.IBQTODOMES.Close; DM.IBQTODOMES.Sql.Clear; DM.IBQTODOMES.Sql.Add(´select * from todomesconta order by sequencia desc´); DM.IBQTODOMES.Open; except on E:Exception do begin dm.TLConta.RollBack; //Rollback no Trasaction ShowMessage(´Falha na Exclusão dos Dados!´#1310´ Mensagem: ´+E.Message); end; end;[/color:76db1a2a73] end; dm.ibqtodomes.active:=true; end; {Para abir a tabela e atualizar o dbgrid} { DM.IBQTODOMES.Close; DM.IBQTODOMES.Sql.Clear; DM.IBQTODOMES.Sql.Add(´select * from todomesconta order by sequencia desc´); DM.IBQTODOMES.Open;} end;

Acho que essa parte em vermelho esta errado, pois assim nao abre a tabela e da o erro
[b:76db1a2a73]Cannot perform this operation on a closed dataset[/b:76db1a2a73]


Responder

Gostei + 0

16/01/2007

Adriano_servitec

Resolvido, pessoal, faltava eu fechar a tabela depois do rollback, por isso a unique ficava sempre ativa. :oops:

Desculpe pelo post.


Responder

Gostei + 0

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

Aceitar