Ver Mensaje Individual
  #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
Reputación: 30
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