Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   De donde se levanta el mensaje de error? (https://www.clubdelphi.com/foros/showthread.php?t=13798)

Morphine 31-08-2004 15:46:04

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

__cadetill 31-08-2004 15:57:20

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;

Morphine 31-08-2004 16:09:32

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.

__cadetill 31-08-2004 16:21:39

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?

Morphine 31-08-2004 20:40:53

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.

Morphine 31-08-2004 20:46:24

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.

__cadetill 31-08-2004 21:22:43

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 :p

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" :confused:

Morphine 31-08-2004 21:53:09

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.

roman 31-08-2004 22:22:07

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

Morphine 31-08-2004 23:27:00

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.

__cadetill 31-08-2004 23:42:48

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;

roman 01-09-2004 02:05:53

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.

Morphine 01-09-2004 04:42:19

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.

jachguate 01-09-2004 06:13:39

NO has leido lo que te ha dicho antes cadetill sobre la etiqueta [delphi] ¿¿:confused:??

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

;)

Morphine 01-09-2004 13:27:17

Ahi arregle el codigo, disculpas.


La franja horaria es GMT +2. Ahora son las 13:24:46.

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