Fabrício Desbessel
Delphiano de coração
Colégio
 Downloads | Mapa do Site | 17 visitantes on-line 


 Login
   
    
 Lembrar de mim
Esqueceu sua senha?

 MENU
 :: Inicial
 :: Currículo
 :: Lições
 :: Contato
 :: Delphi
 :: Publicações
 :: Livros
 :: Lattes
 :: Projetos

 Buscar no site
  

 Ajuda...


 Clube Delphi


 Busca Google

  
 Delphi - Tratando erros de banco de dados

Além de tratarmos os erros que podem acontecer em nossos sistemas, como dados informados incorretamente (máscara), data inválida, campo deve ter valor, etc, precisamos ainda tratar os erros que podem acontecer no Sistema Gerenciador de Banco de Dados (SGDB). Os erros mais comuns no banco de dados são de chave primária duplicada e chaves estrangeiras faltando.

Como o objetivo desse artigo é facilitar o máximo, iremos utilizar um formulário padrão do Delphi, chamado de ReconcileError. Esse formulário padrão é utilizado para tratar todas as exceções que acontecem no banco de dados, possibilitando que nossa aplicação interfira no processo. Inclusive possibilita que o usuário altere os dados, ou simplesmente desista da alteração ou inserção.

Para utilizar o ReconcileError, acesse o menu File > New > Other e escolha a aba Dialogs. Selecione Reconcile Error Dialog. Agora é necessário chamar o formulário. Para tanto, no evento OnReconcileError de todos os ClientDataSet coloque o código exibido abaixo:

   Action := HandleReconcileError(DataSet, UpdateKind, E);

* Você pode colocar o código em somente um ClientDataSet e nos outras fazer a ligação do evento, assim centralizando esse código em um único local e diminuíndo o trabalho.

Adicione a Unit do ReconcileError no DataModule. Isso pode ser feito através do menu File > Use unit.

Quando o ReconcileError é chamado apresentará os dados que foram informados na aplicação, inclusive oferecendo a opção de visualizar somente os campos que sofreram alteração. Além disso, nos possibilita três ações para tratar a exceção (Reconcile Action):

· Skip : Simplesmente “escapa” sem tratar o evento, voltando para o formulário que o usuário estava;

· Cancel : Cancela a inserção ou alteração do registro;

· Correct : A mais interessante de todas, pois ao selecioná-la é possibilitado ao usuário a alteração dos dados no próprio formulário.

Além dessas três ações mais comuns, temos outras ações para tratar conflitos de registros que foram alterados ao mesmo tempo por mais usuários:

· Abort : Aborta o tratamento voltando para o formulário que o usuário estava.

· Merge : Possibilita a verificação dos dados que foram alterados por outros usuários e a junção com os dados alterados na sua aplicação.

* Depois que for exibido o ReconcileError e o usuário tomar uma das possíveis decisões ainda será necessário dar um comando ApplyUpdates para efetivamente gravar as alterações no banco de dados

Agora, para você utilizar o ReconcileError em suas aplicações falta somente fazer algumas traduções para que fique mais entendível para o usuário. Todos os componentes visíveis podem ser facilmente traduzidos. O trabalho mais pesado fica na hora de fazer algumas traduções nos código. Comece alterando as constantes conforme mostra o código abaixo:

const
 ActionStr: array[TReconcileAction] of string = ('Escapar', 'Abortar', 'Merge', 'Corrigir', 'Cancelar', 'Atualizar');
 UpdateKindStr: array[TUpdateKind] of string = ('Alteração', 'Inserção', 'Exclusão'); SCaption = 'Erro - %s';
 SUnchanged = '<não alterado>';
 SBinary = '(Binary)';
 SAdt = '(ADT)';
 SArray = '(Array)';
 SFieldName = 'Nome do Campo';
 SOriginal = 'Valor Original';
 SConflict = 'Valor conflitante';
 SValue = ' Valor';
 SNoData = '<sem registro>';
 SNew = 'Novo';

Outra possibilidade interessante é alterar o evento FormCreate do ReconcileError colocando alguns testes para verificar o tipo de erro que ocorreu e acrescentar uma tradução ao erro. Veja como deve ficar o código desse evento abaixo:

if FDataSet = nil then Exit;
FDataFields := TList.Create;
InitDataFields;
Caption := Format(SCaption, [FDataSet.Name]);
UpdateType.Caption := UpdateKindStr[FUpdateKind];
ErrorMsg.Text := FError.Message;
if FError.Context <> '' then
ErrorMsg.Lines.Add(FError.Context);
if Pos('PRIMARY',ErrorMsg.Text) > 0 then
ErrorMsg.Lines.Add('Tradução: Erro de Chave Primária!');
if Pos('FOREIGN',ErrorMsg.Text) > 0 then
ErrorMsg.Lines.Add('Tradução: Erro de Chave Estrangeira!');
if Pos('*** null ***',ErrorMsg.Text) > 0 then
ErrorMsg.Lines.Add('Tradução: Campo obrigatório não foi informado!');
ConflictsOnly.Enabled := FCurColIdx > 0;
ConflictsOnly.Checked := ConflictsOnly.Enabled;
ChangedOnly.Enabled := FNewColIdx > 0;
InitReconcileActions;
UpdateData.DefaultRowHeight := UpdateData.Canvas.TextHeight('SWgjp') + 7; { Do not localize }

Depois dessas alterações teremos todos os erros de validação devidamente tratados, através de uma apresentação ao usuário, que poderá decidir o que fazer. Veja na Figura abaixo o ReconcileError com as traduções.


 
 Edição Atual

Edição Atual


 Aprendizagem

Para você que quer aprender SQL, abaixo tem o link para um Objeto de Aprendizagem (OA) sobre o assunto.

Aprendendo SQL


 Frases
"Trate as pessoas da forma como elas devem ser e ajude-as a se tornarem o que elas são capazes de ser. "
Goethe

 Arquivo
 :: Acessando o Firebird através do Excel  
 :: Dar um pouco de amor incentiva muito as outras pessoas a fazerem o mesmo 
 :: Super produção da minha KX250F 
 :: Retorno a FAHOR/CFJL 
 :: O que você quer ser quando crescer? 
 :: Como a vida ensina 
 :: Delphi Conference 2010 - Uma certa indignação... 
 :: RadPHP XE o novo Delphi for PHP 
 :: Delphi - Tratando erros de banco de dados 
 :: Delphi - Tratando erros de sistemas 
 :: Delphi - Uilizando o Enter ao invés do TAB em projetos CLX 
 :: Delphi 2009 
 :: Crie uma loja virtual com Delphi for PHP - Parte XII 
 :: Crie uma loja virtual com Delphi for PHP - Parte XI 
 :: Crie uma loja virtual com Delphi for PHP - Parte X 
 :: Delphi - Como fazer o enter disparar um Click de um botão 
 :: Crie uma loja virtual com Delphi for PHP - Parte IX 
 :: Crie uma loja virtual com Delphi for PHP - Parte VIII 
 :: Crie uma loja virtual com Delphi for PHP - Parte VII 
 :: Delphi - Validando CNPJ 
 :: Crie uma loja virtual com Delphi for PHP - Parte VI 
 :: Crie uma loja virtual com Delphi for PHP - Parte V 
 :: Crie uma loja virtual com Delphi for PHP - Parte IV 
 :: Crie uma loja virtual com Delphi for PHP - Parte III 
 :: Encontro de Craques 
 :: Crie uma loja virtual com Delphi for PHP - Parte II 
 :: Você é Hands on? 
 :: Crie uma loja virtual com Delphi for PHP - Parte I 
 :: Autenticação no Delphi for PHP - Parte IV 
 :: Autenticação no Delphi for PHP - Parte III 
 :: Autenticação no Delphi for PHP - Parte II 
 :: Autenticação no Delphi for PHP - Parte I 
 :: Cá entre nós... – Horizontina e os horizontinenses 
 :: Window (Janelas) no Delphi For PHP 
 :: Nada substitui o Talento 
 :: MainMenu no Delphi For PHP 
 :: Aplicações MySQL com Delphi for PHP - Parte VII 
 :: Aplicações MySQL com Delphi for PHP - Parte VI 
 :: Delphi - Conexões dinâmicas ao Banco de Dados 
 :: Mundo Corporativo - A história da formiga 
 :: Aplicações MySQL com Delphi for PHP - Parte V 
 :: Impedir os cadastros em duplicidade 
 :: Aplicações MySQL com Delphi for PHP - Parte IV 
 :: Aplicações MySQL com Delphi for PHP - Parte III 
 :: Aplicações MySQL com Delphi for PHP - Parte II 
 :: Aplicações MySQL com Delphi for PHP - Parte I 
 :: Gráficos no Delphi II 
 :: Gráficos no Delphi I 
 :: Delphi For PHP 
 :: Delphi - Relatórios com Quick Report - Parte VI 
 :: Delphi - Relatórios com Quick Report - Parte V 
 :: Delphi Tour 
 :: Delphi - Relatórios com Quick Report - Parte IV 
 :: Delphi - Relatórios com Quick Report - Parte III 
 :: Delphi - CodeGear anuncia Delphi 2007 
 :: Delphi - CodeGear anuncia Delphi for PHP 
 :: Delphi - Relatórios com Quick Report - Parte II 
 :: Delphi - Relatórios com Quick Report - Parte I 
 :: Delphi - Mestre/Detail com dbExpress 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte V 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte IV 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte III 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte II 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte I 
 :: Delphi - Wizards para criação de banco de dados no Delphi 7 
 :: Delphi - Trabalhando com o Database Desktop 
 :: Delphi - Validando CPF 
 :: Delphi - Colocando Backup e Restauração em Sistemas com Firebird ou Interbase 
 :: Delphi - Artigo publicado na Revista ClubeDelphi 
 :: Palestrante na Borcon 
 :: Calculando o "Custo Brasil" em um PC 
 :: Delphi - Aplicações Web com Webbroker - Parte V 
 :: Políticos Honestos 
 :: Delphi - Aplicações Web com Webbroker - Parte IV 
 :: Delphi - Artigo publicado na revista Clube Delphi 
 :: Delphi - Aplicações Web com Webbroker - Parte III 
 :: Delphi - Artigo publicado na revista Clube Delphi 
 :: Delphi - Aplicações Web com Webbroker - Parte II 
 :: Delphi - Aplicações Web com Webbroker - Parte I 
 :: Delphi - Instalando o QuickReport no Delphi 7 
 :: Delphi - DLL's com formulários 
 :: Delphi - DLLs! Porque e Como utilizar 
 :: Delphi - Montando telas de cadastro dinamicamente 
 :: Delphi - Executando vídeo no Delphi através do ActiveX do Windows Media Player 
 :: Delphi - Listando arquivos de um diretório 
 :: Delphi - Como criar arquivos de Help com softwares gratuitos 
 :: Delphi - Consumindo RSS de notícias em .Net 
 :: Delphi - Criando uma instalação profissional para sua aplicação utilizando o InstallShield  
 :: Comissão Editorial da Revista Clube Delphi 
 :: Lançamento do Sistema SAS 
 :: Colunista ClubeDelphi 
 :: Delphi - Não perder dados com uma queda de energia 
 :: Delphi - Colocando a opção de configurar impressão 
 :: Delphi - Traduzindo as mensagens de erro 
 :: Exemplo de Persistência 
 :: Delphi - Colocando Backup em sistemas com tabelas Paradox 
 :: Delphi - Uilizando o Enter ao invés do TAB 
 :: Delphi - Deixando seus sistemas muito mais bonitos 
 :: Delphi - Impedir o fechamento da tela com ALT+F4 
 :: Delphi 2005 
 :: Delphi - Tela de Consultas Personalizáveis 
 ::  Delphi - Gerar planilhas do excel através de uma consulta (Query) 
 :: Delphi - Telas de Apresentação 
 :: Delphi - Filtrando Tabelas 

Fabrício Desbessel - É permitida a reprodução de qualquer material desse site desde que seja citada a fonte.