Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtener lista de campos llaves... (https://www.clubdelphi.com/foros/showthread.php?t=65990)

Mystery 26-01-2010 16:36:13

Obtener lista de campos llaves...
 
Hola a todos...
Estoy haciendo una aplicacion que trabaja con bases de datos en access y SQL Server. me hace falta saber cual es la estructura de una tabla en access y en SQL desde mi delphi con el proposito de sabes cuales son los campos llaves de esta tabla... que recalco puede estar en access o SQL Server.
estube leyendo en el foro pero no pude sacar nada en claro
http://www.clubdelphi.com/foros/showthread.php?t=28183
lo de las tablas de sistema en SQL he podido mirar algo y aunque no he logrado sacar nada por lo menos he encontrado algo... no asi en access porque en ninguna tabla de sistema encuentro las columnas de la Base de Datos como en SQL Server... si existiese algun metodo.. o alguna manera le estare eternamete agradecido....
muchas gracias de antemano... sin mas
Mystery

jcarteagaf 26-01-2010 17:23:55

En SQL Server podrias usar el siguiente Select para obtener los campos

Código SQL [-]
select     c.COLUMN_NAME 
    from     INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    where     pk.TABLE_NAME = Nombre_Tabla
    and    CONSTRAINT_TYPE = 'PRIMARY KEY'
    and    c.TABLE_NAME = pk.TABLE_NAME
    and    c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

Lo pones en un TQuery (o TADOQuery) y reemplazas Nombre_Tabla por parametros y te devolvera la lista de los campos clave.

Lastimosamente no uso Access asi que no puedo ayudarte con eso.

Saludos.

delphi.com.ar 26-01-2010 17:25:58

Investiga un poco el diccionario de datos de SQLServer, ahí esta toda la información!... navegando muy poquito encontré esto:

Código SQL [-]
SELECT keys.xtype, keys.name, syscolumns.name, sysindexkeys.indid, sysobjects.type
  FROM syscolumns
  LEFT JOIN sysobjects ON syscolumns.id = sysobjects.id
  LEFT JOIN sysindexkeys ON (syscolumns.id = sysindexkeys.id AND 
                             syscolumns.colid = sysindexkeys.colid)
  JOIN sysobjects keys on keys.parent_obj = sysindexkeys.id
 WHERE sysobjects.name = :pTableName
   AND keys.type = 'K'
   AND sysindexkeys.indid IS NOT NULL
ORDER BY keys.id, sysindexkeys.indid, sysindexkeys.keyno

PD: Que raro que me suena "llaves"!

Saludos!

Neftali [Germán.Estévez] 26-01-2010 17:39:43

Conectando con ADO puedes llegar a obtener la información de las Tablas de la Base de Datos. A partir de ahí utilizando ADOTable puedes llegar a obtener información de los campos de esa tabla.

Estoy pensando en Access, ya que como han dicho para SQL Server puedes acceder directamente al diccionario.

Neftali [Germán.Estévez] 26-01-2010 17:46:21

Si colocas un ADOTable en un formulario, y haces el Open, puedes programar algo así:

Código Delphi [-]
  for i := 0 to (ADOTable1.FieldDefList.Count - 1) do begin
    Memo1.Lines.Add(ADOTable1.FieldDefList[i].Name);
    Memo1.Lines.Add('  ' + IntToStr(Ord(ADOTable1.FieldDefList[i].DataType)));
    Memo1.Lines.Add('  ' + IntToStr(ADOTable1.FieldDefList[i].Size));
  end;

Mystery 26-01-2010 18:01:19

gracias...!!!
 
hola otra vez...
si como dices neftalí ahora el problema esta en access gracias a jcarteagaf y a delphi.com.ar (Federico Firenze).... por sus aportes ademas encontre en la RED este articulo bastante interzante...
http://www.sqlmax.com/procnodoc.asp
...he probado el codigo ese que me das esta bastante bueno pero para las claves serian el indexfieldcount y el IndexFields... pero no se si es porque acabo de crearlas me dice que el indexfieldcount=0... y la tabla tiene al menos una llave... entonces ahi es donde esta el lio OK ire por la pista que me diste y despues te cuento... claro que si se les ocurre algo les agradeceria que me lo comenten gracias y chaoooo

define llave: http://www.google.com.cu/search?hl=e...G=Buscar&meta=

Mystery 27-01-2010 14:45:01

Aquí les dejo una función que me resuelve el problema expuesto.....
Código Delphi [-]
function keys(Conn: PConn; Tabla: String): string;
var
  i:integer;
  CAD:String;
begin
  CAD:='';
  with TADOTable.Create(nil)do
  try
    Active:=False;
    Connection:=Conn^;
    IndexName:='PrimaryKey';
    TableName:=Tabla;
    Active:=True;
    for i:=0 to IndexFieldCount-1 do
      if ithen
        CAD:=CAD+IndexFields[i].FieldName+';'
      else
        CAD:=CAD+IndexFields[i].FieldName;
  finally
    Free;
    Result:=CAD;
  end;
end;


los parámetros son un puntero a la conexión el nombre de la Tabla de la cual queremos obtener el listado de Claves y esta función nos devuelve una cadena con las llaves de la tabla separadas por ';', lista para usar en un locate jejejejee...
algo así... CAD:=key1;key2;etc...

bueno muchas gracias por su ayuda. Sin más
Mystery


La franja horaria es GMT +2. Ahora son las 02:56:21.

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