Array
(
)

Tratar erro usando TClientDataSet!

Silviomorelo
   - 27 ago 2004

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


Vinicius2k
   - 27 ago 2004

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...

#Código

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 OnReconcileError do ClientDataSet...
#Código
ShowMessage(E.Message);


Espero ter ajudado...
T+


Silviomorelo
   - 27 ago 2004

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?


Vinicius2k
   - 27 ago 2004

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 :
#Código

...
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+


Silviomorelo
   - 30 ago 2004

Obrigado pela ajuda!