Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Captura y "traducción" de errores (https://www.clubdelphi.com/foros/showthread.php?t=45014)

ghuttemann 20-06-2007 18:26:06

Captura y "traducción" de errores
 
Desarrollo aplicaciones con Delphi y los gestores de base de datos Firebird y PostgreSQL.

El problema que tengo que solucionar es desplegar mensajes de error apropiados, cuando el error se produce del lado servidor, es decir, en la base de datos.

Básicamente, los errores que debería manejar son los siguientes:
  1. Violación de clave foránea, al eliminar o editar algún registro.
  2. Violación de clave primaria (o única).
  3. Violación de campos requeridos (campos NOT NULL).
Estuve considerando varias opciones para solucionar este problema; los cito a continuación, especificando sus inconvenientes asociados:
  1. Utilizar la propiedad Required de los TField de un TDataSet, de manera a poder realizar el control de campos requeridos del lado cliente. El inconveniente con esto es que dicha propiedad nada tiene que ver con la restricción del campo en la base de datos, si cambia un campo de la base, es decir, si deja de ser o se vuelve requerido, habría que cambiar eso también en la aplicación y recompilarla.
  2. Capturar el código de error ocurrido en la base de datos y mapearlo a un mensaje apropiado según el significado del mismo. El inconveniente con esto es que no funciona con PostgreSQL, sí con Interbase o Firebird. Talvez haya otros gestores con los que tampoco funcione. En fin, no es una solución general.
  3. Crear triggers que verifiquen los tres tipo de violaciones mencionados más arriba y de acuerdo al caso lanzar una excepción con un mensaje correspondiente, que sea entendible por el usuario común. Al parecer esta es la opción más general pero a la vez más trabajosa, tampoco es muy portable si llegásemos a cambiar de gestor, pero por lo menos dejamos el control solo de un lado (el del gestor).
Será que existe algún mecanismo conocido por Ustedes que pueda ayudarme a solucionar este problema. Qué pueden decir al respecto.

Desde ya muchas gracias.

ContraVeneno 20-06-2007 18:45:07

Código Delphi [-]

Try
 ExecSQL;
except on E:EDBEngineError do begin
   If E.Errors[0].ErrorCode = 9729 then begin
     Showmessage('Ya existe');
   end else begin
     raise;
   end; //if errorcode
 end; //exception
End; //try

Lo que tienes que manejar es el código de error. En mi caso por utilizar SQL Server, el error es el 9729 para una llave duplicada (única); tienes que identificar que código de error te arroja firebird y/o postrgeSQL en cada uno de los casos que quieres identificar.

Teniendo esto, podrías utilizar un "Case E.Errors[0].ErrorCode Of" para cada caso en particular.

Bienvenido a los foros, dale una leída a este enlace para tener mayor información.

sinaloenc 20-06-2007 20:48:41

busqueda con datos alfanumericos
 
tengo un problema con un adoquery, no puedo buscar un campo que tenga numeros y letras, ejemplo quiero buscar el registro 982abbp0215 y manda un error que no hay una columna con ese nombre.:confused:


o si se puede saber como usar un like en una consulta con un adoquery.


gracias de antemano...:D .

eduarcol 20-06-2007 21:08:26

En cualquier consulta sql puedes usar un like, ahora por el error que te da asumo que estas pasando mal los parametros la cosa seria algo asi

Código SQL [-]
Select * from tutabla where elcampo like '%algun valor%'
segun lo que escribes lo debes tener asi:

Código SQL [-]
Select * from tutabla where '%algun valor%' like elcampo

Por cierto bienvenido al club, leete la guia de estilo, que no debes comenzar una pregunta en un hilo abierto

sinaloenc 24-06-2007 02:09:11

Captura y traduccion
 
bueno ps gracias por la respuesta pero coreo que no esta bien editada mi pregunta, si se como usar el like, lo que pasa es que en delphi quiero tomar el valor de un edit, por consiguiente la sentencia seria algo asi....




('select * from MITABLA where MICAMOPO like " ' %+edit.text+%' "


o la otra opcion a eso seria oen la misma sentencia hacer la busqueda pero el campo a buscar contiene numeros y letras revueltos.....


ejemplo :

('select * from MITABLA where MICAMOPO = '+edit.text+' '

donde edit.text contiene el valor de 982abbp2548

gracias....

eduarcol 25-06-2007 14:06:13

A ver vamos por parte que tiene que ver el like con que el valor sea alfanumerico????

ok si el valor es exacto no utilizes like toma menos tiempo a la consulta

si el campo es numerico
Código SQL [-]
'select * from MITABLA where MICAMOPO = '+edit.text

si el campo es alfabetico
Código SQL [-]
'select * from MITABLA where MICAMOPO = ' + QuotedStr(edit.text)

Ahora si por alguna otra razon la busqueda es inexacta utilizando el like

Código SQL [-]
'select * from MITABLA where MICAMOPO like '' %' + edit.text + '% ''
Fijate en la posicion de los % y en ves de comillas usas apostrofes

suerte avisa si entendi mal

sinaloenc 29-06-2007 22:13:58

Saber que Filtro el query..
 
gracias amigo tus respuestan me han sido de mucha ayuda solo que ahora me tope con pared cuando necesito sacar los valores que filtro el query, por ejemplo cuando hago una busqueda de un numero de usuario y necesito sacar los valores como son apellido nombre y esas cosas no se como sacarlas de la seleccion y ponerlas en un edit.....


me eres de mucha ayuda creemelo:D ..


gracias...

eduarcol 30-06-2007 02:41:46

Dos formas

1.- Enlaza un dbedit al dataset por medio de un datasource

2.- por codigo

Código Delphi [-]
edit2.Text := MiDataSet.FieldByName('MiCampo').AsString;

depende tus necesidades


La franja horaria es GMT +2. Ahora son las 04:42:32.

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