Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2013
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 361
Poder: 18
Jose Roman Va por buen camino
Question Captura de Error personalizado

Hola a todos,

Resulta que por medio de este codigo capturo un error de la base de datos:
Código Delphi [-]
procedure TwPaciente.CapturaError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
  if E.ClassNameIs('EFIBInterBaseError') then
  case EFIBError(E).IBErrorCode of
//  Not Null
    335544347 : begin
                  E.Message := 'El campo NOMBRE o puede estar vacio.';
                  dbNombre.SetFocus;
                end;
//  UNIQUE Key
    335544665 : begin
                  E.Message := 'CEDULA ya existe.';
                  dbNombre.SetFocus;
                end;
  end;
end;
Mi pregunta es:
Como reemplazo la parte E.Message por MessageDlg esto debido a que deseo algo mas personalizado que ese cuadro de dialogo sencillo que aparece.
Responder Con Cita
  #2  
Antiguo 30-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jose.

Si no te entiendo mal, por ejemplo sobre tu código:
Código Delphi [-]
procedure TwPaciente.CapturaError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
  if E.ClassNameIs('EFIBInterBaseError') then
  case EFIBError(E).IBErrorCode of
//  Not Null
    335544347 : begin
                  MessageDlg('El campo NOMBRE no puede estar vacio', mtError,[mbYes],0);
                  dbNombre.SetFocus;
                end;
//  UNIQUE Key
    335544665 : begin
                  MessageDlg('CEDULA ya existe.', mtError,[mbYes],0);
                  dbNombre.SetFocus;
                end;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 30-08-2013
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 361
Poder: 18
Jose Roman Va por buen camino
Gracias ecfisa, el dialogo se muestra bien como me lo colocaste en el codigo:

pero en cuanto le doy clic a YES me aparece este dialogo, el cual no deseo que le aparesca al usuario:

¿Como evito este ultimo cuadro de dialogo?
Responder Con Cita
  #4  
Antiguo 30-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola José.

No sé como estas capturando las excepciones te pongo un ejemplo muy, pero muy simplificado para que pruebes:
Código Delphi [-]
...
type
  TfrmMain = class(TForm)
  ...
  procedure FormCreate(Sender: TObject);
  ...
  private
    ...
  public
    ...
  end;

  TwPaciente = class(TObject)
  public
    procedure ShowException(Sender: TObject; E: Exception);
  end;

var
  frmMain: TfrmMain;
  wPaciente : TwPaciente;

implementation

procedure TwPaciente.ShowException(Sender: TObject; E: Exception);
var
  Msg: string;
begin
  case EIBInterbaseError(E).IBErrorCode of
    335544347: Msg := 'El campo NOMBRE no puede estar vacio';
    //...
  end;
  MessageDlgPos(Msg,mtError,[mbOk], 0, 100, 200);
  frmMain.IBTransaction1.RollbackRetaining;
  //...
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := wPaciente.ShowException;
end;
...
De este modo tiene que funcionarte sin presentar la segunda pantalla. Pero debo decirte que en la práctica, queda por tu cuenta manejar cada una de las excepciones que pudiera presentar cualquier tabla de tu bd.

Fijate que estoy utilizando IBX por lo que deberás cambiar:
Código Delphi [-]
EIBInterbaseError(E).IBErrorCode
por:
Código Delphi [-]
EFIBError(E).IBErrorCode

Saludos

Edito: Si te decidis por este modo de manejo, te aconsejo crearte una unidad para encapsular todo el código relativo al manejo de las excepciones.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 30-08-2013 a las 19:24:53.
Responder Con Cita
  #5  
Antiguo 30-08-2013
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Hola,

Según los nombres de los parámetros del procedimiento CapturaError, parece que espera que se asigne cierto valor al parámetro Action.

Ya que no dice qué componentes de acceso a bases de datos usa y no los logré adivinar, busqué en Google: (DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction) para encontrar un ejemplo del uso del evento OnPostError de un TDataSet en:
Con esa información, encontré la declaración del tipo TDataAction en la unidad Data.DB:
Código Delphi [-]
TDataAction = (daFail, daAbort, daRetry);

Espero que sirva.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #6  
Antiguo 31-08-2013
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 361
Poder: 18
Jose Roman Va por buen camino
gracias ese ejemplo tambien se ve muy claro y mas complejo, utilizo los componentes FIBPlus por cierto.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Transaccion, captura de error vmorillos MySQL 4 20-01-2011 16:43:07
Procedimiento almacenado no captura error Carlos Hurtado Firebird e Interbase 0 27-01-2007 15:07:39
Captura de error en Procedimiento almacenado lucasarts_18 Firebird e Interbase 11 28-12-2005 15:02:42
Captura de GDSCODE Error en Stored Procedure Carlos Hurtado Firebird e Interbase 0 06-12-2005 17:05:15
captura de Error de Interbase digital Firebird e Interbase 2 25-06-2003 10:22:14


La franja horaria es GMT +2. Ahora son las 10:45:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi