27/08/2004

Tratar erro usando TClientDataSet!

Como faço para mostrar o erro que ocorreu na aplicação de uma forma personalizada e que o usuário possa entender e tomar as providencias cabiveis.

Quando o usuário dispara o evento para tentar gravar, executo os seguintes códigos:

procedure TfrmNivel.btnGravarClick(Sender: TObject);
begin
try
with DTMNivel.CDSNivel do begin
Post;
if ApplyUpdates(0) <> 0 then CancelUpdates;
end;

except
on E: Exception do begin
ShowMessage(E.Message);
end;
end;

end;

Isso está certo?
Alguem tem algum exemplo para tratar os erros mais comuns?

Estou usando o banco de dados Interbase 6.0, dbexpress, clientdataset, delphi 7

Obrigado


Silviomorelo

Respostas

27/08/2004

Vinicius2k

Colega,

Está quase certo... menos com relação ao Try/Except, que não faz sentido com ClientDataSets pq nunca geram exceção em caso de erros no ApplyUpdates...

procedure TfrmNivel.btnGravarClick(Sender: TObject); 
begin 
  with DTMNivel.CDSNivel do begin 
    Post; 
    if ApplyUpdates(0) > 0 then CancelUpdates; 
  end; 
end;


Sua rotina para exibição da mensagem e tratamento do erro deve estar no evento [b:3b581611e2]OnReconcileError[/b:3b581611e2] do ClientDataSet...
ShowMessage(E.Message);


Espero ter ajudado...
T+


Responder Citar

27/08/2004

Silviomorelo

Eu devo usar no final do código o comando abaixo caso tudo ocorra bem?

DTMNivel.CDSNivel.Refresh;

Outra duvida como faço para traduzir as mensagem de erros?


Responder Citar

27/08/2004

Vinicius2k

Normalmente sim, se vc tiver campos auto-incremento com gerenators + triggers, por exemplo...
Mas vc não deve generalizar, pq depedendo do tamanho da tabela, isto pode ser ruim (lento)... vc deve analizar cada caso separadamente...

Para traduzir as mensagens vc pode usar a função POS e dar uma mensagem personaliza, ou (muito mais difícil) traduzir o arquivo ´firebird.msg´ -- a ferramenta IBExpert ( www.ibexpert.com ) tem recursos para a tradução do firebird.msg

Um exemplo de uso da função POS :
...
var Msg: String;
begin
  if (Pos(´violation of PRIMARY or UNIQUE KEY´, E.Message) > 0) or
     (Pos(´attempt to store duplicate value´, E.Message) > 0) then
    begin
      Msg:= ´A tentativa de inserção/edição iria resultar em duplicidade ´ +
            ´de registros nesta tabela.´;
    end;
  ShowMessage(Msg);
end;


T+


Responder Citar

30/08/2004

Silviomorelo

Obrigado pela ajuda!


Responder Citar