Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Capturar informacion en una excepción firebird (https://www.clubdelphi.com/foros/showthread.php?t=47015)

GuerreroDelphi 16-08-2007 07:42:24

Capturar informacion en una excepción firebird
 
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!

Cita:

Empezado por GuerreroDelphi (Mensaje 223469)
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:
Código SQL [-]
  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:
Código SQL [-]
  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

Capturar información en una excepción firebird
 
Muchas gracias, Al, voy a probar tu sugerencia. Gracias por tu tiempo y tu colaboración.

jhonny 16-08-2007 18:47:46

Cita:

Empezado por Al González (Mensaje 223470)
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

Código SQL [-]
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...

Código SQL [-]
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:

Código SQL [-]
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

Cita:

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


La franja horaria es GMT +2. Ahora son las 12:53:32.

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