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 18-07-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
Detectar llaves foraneas con TFields

hola

alguien sabe si es posible detectar si un campo es llave foranea accesando a los procedimientos, funciones o propiedades del tfield,
y si no es posible por esos medios es posible hacer esto de alguna otra forma ?

creo esto seria muy util para poder generar formularios dinamicamente

saludos

Última edición por jasmad fecha: 18-07-2012 a las 01:20:36.
Responder Con Cita
  #2  
Antiguo 18-07-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
A través de TFields no, pero dependiendo del motor de base de datos que estés utilizando puedes hacer consultas a los metadatos.

Por ejemplo, si tu base de datos fuese Firebird, en ella podrías acceder a diversas tablas especiales como RDB$Index_Segments, RDB$Relation_Constraints y RDB$Ref_Constraints para averiguar si un campo en particular forma parte de un índice de llave externa y cuál es ese índice y el nombre de la respectiva restricción.

NOTA: Siempre es bueno indicar con qué tecnologías trabajas.

Saludos.
Responder Con Cita
  #3  
Antiguo 19-07-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
Detectar llaves foraneas

hola,

estoy con motor Firebird
codetyphon 2.50
lazarus 0.9.31
componentes de acceso a bd ibdac

ya conocia esa forma de accesar a las tablas de sistema de firebird pero estoy buscando una manera de saber si el campo es llave foranea y a que tabla referencia desde la aplicacion; de hecho casi siempre los paquetes de acceso a datos tienen un componente de metadatos pero eso depende del paquete que uses.
Responder Con Cita
  #4  
Antiguo 19-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si es firebird, entonces lo que te ha indicado Al González:

Cita:
Empezado por Al González
Por ejemplo, si tu base de datos fuese Firebird, en ella podrías acceder a diversas tablas especiales como RDB$Index_Segments, RDB$Relation_Constraints y RDB$Ref_Constraints para averiguar si un campo en particular forma parte de un índice de llave externa y cuál es ese índice y el nombre de la respectiva restricción.
Responder Con Cita
  #5  
Antiguo 19-07-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por jasmad Ver Mensaje
[...] y si no es posible por esos medios es posible hacer esto de alguna otra forma ?
Cita:
Empezado por jasmad Ver Mensaje
[...] desde la aplicacion; de hecho casi siempre los paquetes de acceso a datos tienen un componente de metadatos pero eso depende del paquete que uses.
Bueno, como has de imaginar, puedes hacer la consulta respectiva desde la propia aplicación.

Seguramente los hay, pero no conozco un paquete de componentes que te dé esa información de manera fácil, salvo un "FirebirdSQLConnection" que hace tiempo derivé de TSQLConnection. Es para Delphi y no creo que compile en Lazarus, así que al menos podría poner aquí una copia de los métodos que hacen el trabajo sucio:

Código Delphi [-]
  // Saber la tabla que refiere un campo de llave externa ("foránea")
  Function TMagiaSQLConnection.FieldRefTable (Const Table, Field :String)
    :String;
  Begin
    Result := ConstraintRefTable (FieldConstraint (Table, Field));
  End;

  // Saber el nombre de la restricción ("constraint") —necesarias para llaves externas— aplicada a un campo
  Function TMagiaFirebirdSQLConnection.FieldConstraint (
    Const Table, Field :String) :String;
  Begin
    Result := SelectTrim (
      'First 1 RC.RDB$Constraint_Name From RDB$Relation_Constraints RC ' +
      'Inner Join RDB$Index_Segments ISe On ISe.RDB$Index_Name = ' +
      'RC.RDB$Index_Name Where (RC.RDB$Relation_Name = ' +
      QuotedCasedName (Table) + ') And (ISe.RDB$Field_Name = ' +
      QuotedCasedName (Field) + ') And (ISe.RDB$Field_Position = 0)');
  End;

  // Saber la tabla de referencia de una restricción
  Function TMagiaFirebirdSQLConnection.ConstraintRefTable (
    Const Constraint :String) :String;
  Begin
    { Get reference table of constraint }
    Result := SelectTrim (
      'Select RelC.RDB$Relation_Name From RDB$Relation_Constraints RelC ' +
      'Inner Join RDB$Ref_Constraints RefC On RefC.RDB$Const_Name_UQ = ' +
      'RelC.RDB$Constraint_Name Where RefC.RDB$Constraint_Name = ' +
      QuotedCasedName (Constraint));
  End;

SelectTrim es un método que ejecuta un simple Select sobre un campo de la base de datos (mediante el método nativo Execute), devolviendo el resultado como cadena de caracteres y quitándole espacios que tuviera en ambos extremos. QuotedCasedName es una función que lo único que hace (en este caso y para simplificar) es convertir a mayúsculas una cadena de caracteres y encerrarla entre comillas simples. El código completo de esa y otras clases está aquí (pasen por alto la licencia, estoy por cambiarla a open source).

A partir de aquí y con lo que ya conoces sobre cómo acceder a las tablas del sistema (metadatos), jasmad, creo que podrás conseguir lo que pides. Espero sea de ayuda.

Algunas otras monerías de estas clases:

Código Delphi [-]
  // Ejecutar procedimiento almacenado dando nombre y argumentos
  Function TMagiaSQLConnection.ExecProc (Const Proc :String;
    Const AParams :Variant) :Variant;

  // Obtener la fecha y hora del servidor
  Function TMagiaSQLConnection.CurrentTimeStamp :TDateTime;

  // Obtener el mayor valor de un campo
  Function TMagiaSQLConnection.Max (Const Table, Field :String;
    Const Conditions :String = '') :Variant;

  // Obtener el siguiente valor de una secuencia (generador en Firebird)
  Function TMagiaSQLConnection.NextValue (Const Sequence :String) :Integer;

  // Obtener la tabla, el campo y un ID de error a partir de los mensajes de excepción más comunes
  Function TMagiaFirebirdSQLConnection.TableError (Const Msg :String)
    :TghTableError;

Saludos.

Al González.
Responder Con Cita
  #6  
Antiguo 19-07-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
gracias por tu ayuda Al
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
Problemas con llaves foraneas jcrg666 MySQL 1 01-04-2010 00:41:36
Relación de tablas con llaves foráneas egostar Firebird e Interbase 8 05-07-2007 20:08:57
LLaves foraneas... Luis Castillo SQL 2 13-11-2005 18:45:34
Llaves Foraneas RainFall MySQL 1 26-07-2004 04:19:28
Llaves foraneas en BDD distintas StartKill Firebird e Interbase 7 31-01-2004 01:14:01


La franja horaria es GMT +2. Ahora son las 01:01:27.


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