Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Control Errores en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=32145)

joanajj 27-05-2006 13:58:02

Control Errores en Firebird
 
Bueno, seguimos con las preguntas(estaréis hartos de ver hilos de Joanajj, pero gracias a estas consultillas y lo que leo en manuales via web voy avanzando y he hecho mis pinillos con Firebird).

Sabe alguien como controlar los errores que se generan en Firebird, por ej. cuando se duplica un índice UNIQUE se lanza un error que dice que el valor está duplicado en un campo que es UNIQUE(algo así, creo que se entiende), y la pregunta es si ese error lo puedo gestionar desde código de forma que si se produce un error haga una cosa u otra, o lance un mensaje. Algo como los TRY EXCEPT de Delphi ...

Saludos y gracias de nuevo...

Héctor Randolph 27-05-2006 17:46:25

Te pongo un ejemplo, este código lo escribes en el evento OnPostError de tu tabla que es donde se detectarán los errores de registros duplicados.

Código Delphi [-]
procedure TForm1.Table1PostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
  if EIbInterbaseError(E).IBErrorCode=isc_unique_key_violation then
  begin
     ShowMessage('Registro duplicado');
     Action:=daAbort;
  end;
end;

En este caso el mensaje se muestra si se produce un error de tipo isc_unique_key_violation, existen otras constantes definidas para controlar el resto de los errores.

Saludos

JCDiaz999 31-05-2006 19:16:23

Hola joanajj

Supongo que te refieres a controlar errores en procedimientos almacenados.
Yo tengo en algún procedimiento algo como esto:



Código SQL [-]
FOR SELECT CODIGO, CAMPO1, CAMPO2
FROM INTERFAZ_DATOS
WHERE TRATADO='N'
INTO S_CODIGO, S_CAMPO1, S_CAMPO2 DO
BEGIN
INSERT INTO TABLA_XXX ....
----

UPDATE INTERFAZ_DATOS
SET TRATADO='S'
WHERE CODIGO=S_CODIGO

WHEN ANY DO
BEGIN
INSERT INTO LOG_ERRORES -----
END
END






Este bucle recorre registros de la tabla INTERFAZ_DATOS, va insertando en TABLA_XXX y marca el registro actual como ya tratado.
Si en el insert se produce alguna excepción, salta al WHEN ANY sin pasar por el update. Se inserta en LOG_ERRORES y continua el bucle.
De este modo podemos recorrer todo el bucle. Donde se produzca algún error podemos hacer algo distinto.

Supongo que además te interesará actuar de distinto modo si en error es de primary key, de foreign key, tipo de dato. No lo he probado aún, pero mirando en la documentación de firebird aparecen cosas como:


<FONT face=Courier><FONT size=2><DIV class=frame_codigo_sql>Código SQL [-]<DIV class=texto_codigo_sql id=sql_div_447dcf379d02e><FONT face=Courier>

joanajj 01-06-2006 20:38:29

Gracias por la respuesta
 
Gracias por las respuestas, pero en concreto me refería a algo como lo que sugiere Hector. Controlar los errores que lanza Delphi ante un error de Firebird, por ej. cuando se pierde la relacion entre las clave foránea y primaria de dos tablas, o algo así. Que no se vaya abajo la aplicación, sino que yo gestione el error.

Un saludo...


La franja horaria es GMT +2. Ahora son las 13:09:57.

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