PDA

Ver la Versión Completa : Capturar informacion en una excepción firebird


GuerreroDelphi
16-08-2007, 07:42:24
Deseo capturar la información relacionada a una excepción en firebird desde Delphi 5. Por ejemplo, si trato de eliminar un registro que es llave foránea, necesito saber las tablas en la que aparece dicha llave, y si es posible también saber información acerca del registro relacionado.
Si alguien me puede colaborar, le agradezco enormemente.

Al González
16-08-2007, 08:24:29
¡Hola a todos!

Deseo capturar la información relacionada a una excepción en firebird desde Delphi 5. Por ejemplo, si trato de eliminar un registro que es llave foránea, necesito saber las tablas en la que aparece dicha llave, y si es posible también saber información acerca del registro relacionado.
Si alguien me puede colaborar, le agradezco enormemente.
En el mensaje de error "violation of FOREIGN KEY constraint "X"", X es el nombre de la llave foránea. Extraigo ese nombre que está entre comillas dobles para hacer una consulta en los metadatos (Firebird 1.5 y otras versiones).

Normalmente el índice de la llave foránea se llama igual que ésta. Así que, en ese caso, puede hacerse la consulta:

Select RDB$Relation_Name From RDB$Indices Where RDB$Index_Name = 'X'

Para obtener el nombre de la tabla que tiene esa llave foránea. Y para obtener el nombre del primer campo relacionado con ese índice:

Select RDB$Field_Name From RDB$Index_Segments Where
(RDB$Index_Name = 'X') And (RDB$Field_Position = 0)


Esto lo escribí a botepronto, porque ya me retiraba a dormir. Mas espero pueda serte de utilidad.

Un meta abrazo.

Al González. :)

GuerreroDelphi
16-08-2007, 16:52:49
Muchas gracias, Al, voy a probar tu sugerencia. Gracias por tu tiempo y tu colaboración.

jhonny
16-08-2007, 18:47:46
Normalmente el índice de la llave foránea se llama igual que ésta. Así que, en ese caso, puede hacerse la consulta:


Para capturar el nombre del indice, en caso de que sea diferente

Select RC.RDB$Index_Name From RDB$RELATION_CONSTRAINTS RC Where
RC.RDB$Constraint_Name = 'X'

Para capturar el nombre de la tabla,
a la cual hace referencia la llave foranea...

SELECT I.RDB$RELATION_NAME
FROM RDB$REF_CONSTRAINTS RF
INNER JOIN RDB$RELATION_CONSTRAINTS RC ON (RF.RDB$CONST_NAME_UQ = RC.RDB$CONSTRAINT_NAME)
INNER JOIN RDB$INDICES I ON (I.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
WHERE RF.RDB$CONSTRAINT_NAME = 'X'

Lo que aún no encuentro como hacer es capturar los campos de la tabla,
a los cuales hace referencia la llave foranea.

jhonny
16-08-2007, 19:40:47
Listo, para listar los campos a los cuales esa llave foranea hace referencia, la consulta debe ser asi:

SELECT S.RDB$FIELD_NAME FROM RDB$INDICES I
INNER JOIN RDB$INDEX_SEGMENTS S ON(S.RDB$INDEX_NAME = I.RDB$FOREIGN_KEY AND
I.RDB$INDEX_NAME='X')

jhonny
17-08-2007, 17:18:56
Una pregunta, ¿Esas consultas que coloque le sirvieron a alguien?, es que quiero meterlas en la sección de trucos (En su categoria FireBird), pero antes quiero saber si alguien mas aparte de mi, le hizo alguna prueba y si encontro algo bueno o algo malo, solo eso ;), gracias.

Delfino
20-08-2007, 01:22:59
Deseo capturar la información relacionada a una excepción en firebird
Creo q lo mejor es hacerlo de la manera q lo hacen los propios componentes, IBX o MDO, para eso hay q investigar el codigo fuente de esos componentes, si no me equivoco cuando el servidor devuelve un mensaje de error lo devuelve en un array (status vector), en ese array esta el mensaje y tb las tablas y campos implicados, eso evitaria tener q hacer esas consultas,

si alguien lo puede hacer sera una ayuda muy valorable para todos..