Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-08-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Obtener el SQLCode y luego cambiar el mensaje de error

He intentado este codigo y nada:

Código Delphi [-]
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  Application.OnException:= Excepciones;
end;
 
procedure TfrmPrincipal.Excepciones(Sender: TObject; E: Exception);
var msg: String;
begin
  if E.ClassNameIs('EIBInterbaseError') then
    // Capturar Excepciones generada por la base de datos
    if EIBInterbaseError(e).SQLCode = -836 then begin
      msg:= RightStr(e.Message, StrLen(PChar(E.Message)) - Pos(Chr(10), PChar(E.Message)));
      MessageDlg(msg, mtError, [mbOk], 0);
    end
    else if EIBInterbaseError(e).SQLCode = -625 then
      MessageDlg('Datos de entrada no son validos. Verifique si se ingresó todos los datos requeridos', mtError, [mbOk], 0)
    else if EIBInterbaseError(e).SQLCode = -530 then
      MessageDlg('Hay registros relacionados, no se puede realizar la operación', mtError, [mbOk], 0)
    else if EIBInterbaseError(e).SQLCode = -803 then
      MessageDlg('El registro ya existe y no puede repetirse', mtError, [mbOk], 0)
    else
      MessageDlg('Ha ocurrido el siguiente error: ' + #13 + e.Message + #13 + #13 +
        Format('IBErrorCode: %d - SQLErrorCode: %d',
             [EIBInterbaseError(e).IBErrorCode, EIBInterbaseError(e).SQLCode]), mtError, [mbOk], 0)
  else
    ShowMessage(E.Message);
end;

Probablemente es por la version de Delphi que utilizo (4), que no posee los componentes IB (interbase), lo que no he podido es adaptar este codigo a la version que utilizo.

Última edición por __cadetill fecha: 31-08-2004 a las 21:19:04.
Responder Con Cita
  #2  
Antiguo 31-08-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Otra opcion que he probado es:

Código Delphi [-]
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
      // pasamos el control de las excepciones a
      // nuestra funcion maneja problemas =)
      Application.OnException := ManejoExcepciones;
end;
 
procedure TfrmPrincipal.ManejoExcepciones(Sender: TObject; e:Exception);
var
   Mensaje, Contexto: string;
   int_ref, transac: string;
begin
   int_ref := 'pg_indel: ERROR:  Cannot insert a duplicate key into unique';
   transac := 'pgTrans: pqReadData() --  read()';
   // Error de Base de Datos
   if e.ClassType = EDataBaseError then
     begin
        // Manejo de Identificadores duplicados
        if SameText(Copy(e.Message,1,Length(int_ref)),int_ref) then
          begin
           MessageDlg('El registro que desea insertar ya se encuentra asignado.', mtWarning, [mbOK], 0);
           exit;
          end;
        // Pérdida de conexión en run-time
        if SameText(Copy(e.Message,1,Length(transac)),transac) then
          begin
           MessageDlg('Se ha perdido la conexión con el servidor de base de datos!'
                 +chr(13)+'Finalizando la aplicación...', mtWarning, [mbOK], 0);
           Application.Terminate;
          end;
        // otros errores
           MessageDlg('El servidor de Base de Datos ha reportado un error.'
                 +chr(13)+'Mensaje del error:'+chr(13)+ e.Message, mtWarning, [mbOK], 0);
        exit;
     end;
   // Error de Conversión de Datos
   if e.ClassType = EConvertError then
     begin
      Application.MessageBox('Error de conversión de datos.'+chr(13)+
          'Este error podría deberse a que ingresó datos que no corresponden al formato'+
          ' en que debería ser ingresados. Verifiquelos y vuelva a cargar.', 'Conversión de Datos', 
          MB_ICONEXCLAMATION + MB_OK);
      exit;
     end;
   // Violación de Acceso en Memoria
   if e.ClassType = EAccessViolation then
     begin
      Application.MessageBox('Violación de acceso en memoria!', 'Violación de Acceso', MB_ICONEXCLAMATION + MB_OK);
      exit;
     end;
   // Error de Conversión de Datos Variant (String, Int, Variant, etc)
   if e.ClassType = EVariantError then
     begin
        MessageDlg('Error de conversión de tipo de datos.', mtWarning, [mbOK], 0);
        exit;
     end;

   // For debug purposes
   Mensaje := e.Message;
   Contexto := IntToStr(e.HelpContext);
   MessageDlg('Error del Sistema.'+
              chr(13) +
              'Mensaje del error: ' +
              chr(13) +
              e.Message +
              chr(13) +
              'Contexto: ' +
              chr(13) +
              Contexto,
         mtError, [mbOK], 0);
end;
No pude cambiar el mensaje de error.

Última edición por __cadetill fecha: 31-08-2004 a las 21:21:37.
Responder Con Cita
  #3  
Antiguo 31-08-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Me he permitido el lujo de modificar tus mensajes para poner el código entre las etiquetas [ delphi ] y [ /delphi ] (sin espacios)

Mucho mejor, verdad? Ahora al menos el código es legible

EDITO:
Bien, ahora que he visto el código, los comentarios

Esto.... pero que no estabamos hablando de un bloque try...except...end?? Lo que estás programando es un "concentrador" de excepciones. Y, aunque programes eso, has de poner las excepciones que quieres controlar, no las que te den los ejemplo. Aunque el segundo ejemplo que pones...... te ha de mostrar el mensaje de la excepción pertinente

Pero sigo sin entender lo que quieres decir con eso "no poder cambiar el mensaje de error"

Última edición por __cadetill fecha: 31-08-2004 a las 21:31:52.
Responder Con Cita
  #4  
Antiguo 31-08-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Por ejemplo al duplicar claves primarias

Al duplicar claves primarias obtengo este mensaje:

"KeyViolation.
Violation of Primary or Unique Key constraint"NOMBRE_CONSTRAINT" on table "NOMBRE_TABLA""

y sinceramente no es muy amigable.
Desearia poder cambiar este mensaje.
Responder Con Cita
  #5  
Antiguo 31-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Morphine
Al duplicar claves primarias obtengo este mensaje:

"KeyViolation.
Violation of Primary or Unique Key constraint"NOMBRE_CONSTRAINT" on table "NOMBRE_TABLA""

y sinceramente no es muy amigable.
Desearia poder cambiar este mensaje.
Intenta con el evento OnPostError del Query:

Código Delphi [-]
Action := daAbort;
raise Exception.Create('Mi propio mensaje');

// Saludos
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


La franja horaria es GMT +2. Ahora son las 18:09:32.


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