Fórum Problemas com trigger ao gerar o exeption? #57700
16/01/2007
0
Olah pessoal, fir uma Trigger assim:
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.
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
Curtir tópico
+ 0
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 e Nao funcionou, ai apaguei ela tambem e fiz desta forma
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
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]
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);
/******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE UNIQUE INDEX UNQ_TODOMES ON TODOMESCONTA (ANO, CONTA_D, CONTA_C, DATALCTO);
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.
Desculpe pelo post.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)