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
De donde se levanta el mensaje de error?

Ya he desmarcado la opcion "Tools, Debugger Options, Stop on Delphi Exceptions", pero al parecer no tiene efecto sobre este codigo:
try
Query.Post;
DM.DB.ApplyUpdates([Query]);
except
on E:EDataBaseError do
begin
ShowMessage(E.message);
Query.Edit;
exit;
end;
end;
La ejecucion se detiene en el metodo ApplyUpdates y no continua la ejecucion, es decir no ingresa al bloque except, alguien podria explicarme porque el mensaje de error, se levanta desde el lenguaje de programacion y no desde el gestor de base de datos?
Repito ya he desmarcado la opcion "Tools, Debugger Options, Stop on Delphi Exceptions".
Responder Con Cita
  #2  
Antiguo 31-08-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por Morphine
La ejecucion se detiene en el metodo ApplyUpdates...
Será porque es la linea que hace saltar la excepción?

Cita:
Empezado por Morphine
...y no continua la ejecucion, es decir no ingresa al bloque except
Seguro que no????? Lo siento, pero no me lo creo. Otra cosa es que la Excepción producida no sea del tipo que tu controlas, ya que sólo estás controlando excepciones del tipo EDataBaseError y, te aseguro que hay unas pocas más. Mira de poner algo así y verás como te salta y ves el mensaje
Código Delphi [-]
try
  Query.Post;
  DM.DB.ApplyUpdates([Query]);
except
  on E:Exception do
  begin
    // así sabes el nombre de la clase y el mensaje de la excepción
    ShowMessage(E.ClassName + ' - ' + E.Message);  
    Query.Edit;
    exit;
  end;
end;
Responder Con Cita
  #3  
Antiguo 31-08-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Muchas Gracias y Ayuda II

Muchas gracias por el consejo, ahora me podrias ayudar a cambiar el mensaje? lo he intentado por todos los medios y no he obtenido la forma de hacerlo.
Desde ya gracias de nuevo.
Responder Con Cita
  #4  
Antiguo 31-08-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por Morphine
ahora me podrias ayudar a cambiar el mensaje? lo he intentado por todos los medios y no he obtenido la forma de hacerlo.
Qué significa "cambiar el mensaje"? Qué quieres poner? Qué has intentado?
Responder Con Cita
  #5  
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
  #6  
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
  #7  
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
  #8  
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
  #9  
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
  #10  
Antiguo 31-08-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
No paso nada, excepto...

No hubo caso no pude levantar el mensaje, sere muy lento, lo que si me muestra ahora es la clase del error, junto con el mensaje anterior.

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


EAbort - Operation Aborted.

Ahora si ingresa al bloque except.
Responder Con Cita
  #11  
Antiguo 31-08-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
a parte de que lo que comenta el amigo Román funciona y es la mejor opción, prueba...

Código Delphi [-]
try
  MiTabla.Post;
except
  ShowMessage('Error grabando registro');
end;
Responder Con Cita
  #12  
Antiguo 01-09-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 cadetill
a parte de que lo que comenta el amigo Román funciona y es la mejor opción, prueba...

Código Delphi [-]
try
  MiTabla.Post;
except
  ShowMessage('Error grabando registro');
end;
¡Oops! Pero salvo por el ApplyUpdates aquí es por donde empezamos.

Yo aquí veo cosas muy raras. Sé, Morphine, que aseguras haber quitado la opción "Stop on Dephi Exceptions" pero la cosa es que el útimo mensaje que mencionas: "EAbort - Operation aborted" no sale ni con dicha opción activada. La única forma que yo conozco para que dicho mensaje te salga es que lo hayas quitado de la lista de excepciones (en la misma ficha de las opciones) así que creo que ya nos estamos confundiendo en esto.

De cualquier forma me gustaría saber qué componentes estás usando (¿las del BDE?) y contra qué base de datos.
Responder Con Cita
  #13  
Antiguo 01-09-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Estoy utilizando un modulo de datos llamado DM y dentro de este tengo un componente Database (DB).
En un formulario "ancestro" inserte dos Querys (QCabecera y QDetalle) los datasources correspondientes y dos componentes UpdateSQL, todos los componentes del BDE.

DSDetalle.Dataset:=QDetalle;
QDetalle.Datasource:=DSCabecera;
DSCabecera.Dataset:=QCabecera;

Para grabar utilizo este codigo

Código Delphi [-]
procedure TFormCabDet.BitBtnGuardarClick(Sender: TObject);
begin
try
      QCabecera.Post;
      QDetalle.DataSource := nil;
      DM.DB.ApplyUpdates([QCabecera,QDetalle]);
except
       on E:Exception do
       begin
          ShowMessage(E.ClassName + ' - ' + E.Message);
          QCabecera.Edit;
          QDetalle.DataSource := DSCabecera;     
           exit;
       end;
end;
end;

Y luego heredo el formulario.
La base de datos es Interbase 6.5.

Última edición por Morphine fecha: 01-09-2004 a las 13:24:17.
Responder Con Cita
  #14  
Antiguo 01-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
NO has leido lo que te ha dicho antes cadetill sobre la etiqueta [delphi] ¿¿??

¿o es que esperas que siempre un moderador edite tus mensajes?

Yo en lo personal, paso de los mensajes que no usan estas etiquetas, pues el código es realmente ilegible.

Te recomiendo, si esperas seguir obteniendo ayuda, que edites vos mismo tu mensaje y uses las etiquetas. Si no sabes como, en mi firma hay un vínculo a la ayuda de la etiqueta [code], que sigue el mismo principio de las otras, y al inicio de cada foro un mensaje que te explica cuales están disponibles y su funcionamiento.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #15  
Antiguo 01-09-2004
Morphine Morphine is offline
Miembro
 
Registrado: ago 2004
Posts: 28
Poder: 0
Morphine Va por buen camino
Ahi arregle el codigo, disculpas.
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 02:58:54.


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