Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Smile Manejo De Errores En Bases De Datos

Hola,

Sigo desarrollando una aplicacion de delphi que accesa un BD de FIREBIRD.

He avanzado gradualmente sobre algunos obstaculos.

En este momento me encuentro frente a dos situaciones de manejo de errores:

La primera:

Cuando el usuario intenta grabar un nuevo registro de la tabla CLIENTES, se pueden presentar tres posibles errores
1. Que intenta duplicar la Clave.
2. Que intenta Duplicar el Nombre del cliente.
3. Que intenta colocar un cupo de credito Negativo.

La primera es una restriccion de PRIMARY KEY, la segunda es una de indice UNICO, y la tercera es violacion a un CHECK.


Mi pregunta es..... como detecto que violacion me genero el error para mandarle al Usuario el mensaje apropiado:
"Intenta crear un Codigo ya existente" ó
"Nombre de cliente ya existente" ó
"VAlor debe ser mayor que cero"

Si no es posible, ayudenme con una alternativa para enfrentar la situacion.


--------------------------

y Segunda:

Por medio de un artificio, un dato que es flotante, ejemplo: "0,055", se muestra en un DBEdit como "5%", osea expresado en porcentajes, mediante las porpiedades del campo getText y SetText.

Cuando el usuario esta editando el DBGrid, existe la posibilidad que no borre el signo %, y este quede como una entrada.

(El DBEdit, impide que el usuario teclee el signo %, directamente, pero este no es el caso porque se ingreso por codigo, por als propiedades mencionadas)


El problema es que cuando el usuario hace POST, estando el signo %, se genera un Error, algo asi como.....EConvertError.

He tratado de buscar la forma de bloquearlo y mas bien obligar a que el usuario quite ese signo. Pero No se dodne ubicarlo, no se como capturarlo.


Espero haberme explicado bien.

Saludos.

Felipe Diaz.
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #2  
Antiguo 14-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por FelipeDiaz Ver Mensaje
Mi pregunta es..... como detecto que violacion me genero el error para mandarle al Usuario el mensaje apropiado:
Lo lógico sería que utilizaras un Try..except. Cuando te salte las excepción, revisa si además del tipo tiene un code; Normalmente ese code es el que te distingue entre esos tres casos que has comentado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 14-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Question

Hola neftali, yo hago uso del Try Except, solo que no se como obtener los codigos de los mensajes, porque el error no me los informa.
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!

Última edición por FelipeDiaz fecha: 14-12-2007 a las 14:55:45.
Responder Con Cita
  #4  
Antiguo 14-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Primero hay que saber de que tipo es la excepción.
Por ejemplom capturas la excepción con try..except y el tipo Exception y a partir de ahí muestras el ClassName de E.

Código Delphi [-]
  try
    error
  except
    on E:exception do begin
      Mostrar E.ClassName
    end;
  end;

E.ClassName te mostrará de que tipo es la excepción. Por ejemplo si fuera con ADO sería un EOLEException.

Buscas en la ayuda EOLEException y varás que posee las propiedades E.Message y E.ErrorCode. LA que tú captures tal vez también lo tenga (No estoy familiarizado con las que devolverá FB).

Una vez que tengas la Clase y el Código (opcional) puedes usar un try..except más
específico:

Código Delphi [-]
  try
    error
  except
    on E:EOLEException do begin

      if (E.ErrorCode =555) then begin
        ...
      end
      else if (E.ErrorCode =666) then begin
        ...
      end
      else begin
        ....
      end;
    end;
  end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 14-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Los errores dependen de tus componentes de acceso, yo uso los mdo y capturo los errores así:
Código Delphi [-]
  if (e is EMDOError) then
  begin
    strDebug := 'SqlCode: ' +inttostr(EMDOError(E).SQLCode) + espacio + E.ClassName;
    strMessage:=EMDOError(E.Message);

Por el SQLCode, puedes saber qué tipo de error es. Existe un listado de esos números en www.firebird.com.mx

El mejor sitio para capturar el error, sería el OnPostError de tu dataset. En algunos casos, en el propio mensaje de error, dice que se viola la restricción "PK_CLIENTES_1", ese nombre lo verás en el Ib Expert, en las restricciones de esa tabla (Constraints, secondary indices, etc).

Además de lo anterior, en un ApplicationsEvents.OnException puedes añadir mensajes que ocurren para casos generales.

Dicho de otra forma, escribes código en el OnPostError para los mensajes de clave primaria. Si se viola una restricción UNIQUE, el código lo escribes en el ApplicationsEvents informando con un mensaje más general:"El valor introducido ya existe en la base de datos".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 14-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Talking Eureka

Hola neftali y Lepe.

Antes que todo muchas gracias de seguro que ambas funcionan.
El problema es que no domino el tema bien pero con la orientacion de ustedes uno se acerca y parende, me demore en dar con la forma apropiada para el codigo.

A la alternativa de Neftali es facil hacerle seguimiento, y comprenderla...la E.ClassName es...... "EFIBInterBaseError"

y con la instruccion.. Showmessage(inttostr(E.SQLCode));,

pude saber cual es el codigo.

PERO..... para la violacion de la clave Primaria y para la violacion de la unicidad del Nombre del cliente, me genera el mismo error. "-803"

En cambio para la violacion del check de "CUPO<=0", si me da Error "'297".

El codigo al final queda de esta forma:

Código Delphi [-]
 
  except
     on E:EFIBInterBaseError do
         begin
            datamodule1.Database2.Rollback;
            if (E.SQLCode =-803) then
                 showmessage('Intenta crear un codigo de usuario que ya existe ')
            else
                 if (E.SQLCode =-297) then
                       showmessage('El cupo asignado debe ser un valor mayor que cero');
            end;
  end;


La alternativa de Lepe es mas avanzada, no la comprendí (ando a un nivel bajo aun) y no se que Unidad soporta el literal: strDebug.

Bueno en todo caso AUN SIGO SIN PODER IDENTIFICAR ENTRE LOS DOS PRIMEROS ERRORES... En el librode firebird dice:

Error -297 : Operation violates CHECK Constraint
Error -803 : Violation of PRIMARY or UNIQUE KEY Constraint

Pero ya comprendo que cuando se produce el mensaje de error el dice que clase es y la traduccion del Codigo como parece lineas arriba, ademas ese mensaje me dice en que constrain ocurre (es decir conociendo la REstriccion, se que campo afecta) pero no se como obtener la restriccion.

Para ampliar mas,
Cuando se produce el Error -803 ademas del mensaje "Operation violates ....." me aparece que ocurre en PK_Clientes, (ese es el nombre del constrain para la clave primaria).


Mi pregunta ahora es....... Como obtengo el nombre de la Constraint.?
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #7  
Antiguo 14-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Eureka Ii

Lo logre de esta forma, no se que tan buena sea....

Aprovechando que E.IBMessage, si me da el mensaje especifico incluyendo el nombre d ela Constraint, mientras que E.SQLMessage, me da uno generico sin detalles. y ademas utilizando la funcion POS.


Código Delphi [-]
 
   try
      Datamodule1.CLIENTES.Post;
      CodBusCli:= Datamodule1.CLIENTESIDCLI.Value;
      Datamodule1.Database2.Commit;
  except
     on E:EFIBInterBaseError do
     begin
       datamodule1.Database2.Rollback;
       if (E.SQLCode =-803) then

          if Pos('PK_CLIENTES', E.IBMessage) <> 0 then
            showmessage('Intenta crear un codigo de Cliente que ya existe ')
          else
            if Pos('UNQ1_CLIENTES', E.IBMessage) <> 0 then
              showmessage('El Nombre de cliente que ya existe ')
            
            else
              if (E.SQLCode =-297) then
                  showmessage('El cupo asignado debe ser un valor mayor que cero');
      end;
  end;


-------------------------------------------------------------

Bueno, hasta aqui va solo resuelta la primera parte ......falta la segunda parte del mensaje original ?

(a proposito, como hago para colocar aqui un cuadro con flecha azul ">", para crear un vinculo al mensaje)?
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #8  
Antiguo 14-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En el campo:
EditFormat := '0.00'
DisplayFormat:= '0.00 %'

Solo verás el % mientras no tenga el cursor dentro del DBEdit.

Por cierto, a preguntas distintas, hilos distintos, espero lo recuerdes la próxima vez.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
captura de errores de bases de datos en delphi 7 godie12345 Varios 5 11-12-2007 17:51:55
Manejo de consultas SQL y Bases de datos metroyd SQL 0 07-10-2007 22:28:59
manejo de errores douglas OOP 2 28-09-2007 12:54:32
manejo de errores de base de datos usando dbexpress e interbase ramirezjas Conexión con bases de datos 1 07-07-2007 21:15:13
manejo bases de datos anubis Tablas planas 2 14-05-2007 09:26:43


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


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