PDA

Ver la Versión Completa : Obtener lista de campos llaves...


Mystery
26-01-2010, 16:36:13
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

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:


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í:


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
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=es&num=100&q=define%3A+key&btnG=Buscar&meta=

Mystery
27-01-2010, 14:45:01
Aquí les dejo una función que me resuelve el problema expuesto.....

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 i<IndexFieldCount-1 then
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