PDA

Ver la Versión Completa : extraer nombre y tipo de campo


cuscus
02-11-2006, 08:30:41
Hola a todos.
Me gustaria saber si hay alguna manera de hacer una sql a una tabla, de manera que nos devuelva el nombre de los campos de la tabla y el tipo de dato de cada uno


muchas gracias

marcoszorrilla
02-11-2006, 09:06:34
Ésta puede ser la idea, pero no sé si funcionará con IbTables.
function HazSqlTabla(Dataset: TTable): string;
var
i: Integer;
str: string;
begin

try
Str:='Select ';
for i := 0 to DataSet.FieldCount-1 do
begin
str := str + ' ' + DataSet.Fields[i].FieldName;
if i < DataSet.FieldCount-1 then
Str:= Str+',';
end;
Str:=Str+(' FROM ' + DataSet.TableName);
Result:=str;
except
ShowMessage('Se ha producido un Error');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
begin
ShowMessage(HazSqlTabla(Table1));
end;
Un Saludo.

DarKraZY
02-11-2006, 11:58:06
hacer una sql a una tabla, de manera que nos devuelva el nombre de los campos de la tabla y el tipo de dato de cada uno

Para esto deberás utilizar las tabla del sistema de Interbase o Firebird. Estas son las comienzan por RDB$. Por ejemplo

select * from RDB$RELATION_FIELDS where ...


Ahora sólo te falta buscar la tabla que contiene la información de los campos, nombres y tipos.

cuscus
02-11-2006, 12:12:08
gracias a los 2

lo de las tablas de sistema, quisiera tirar por ahi, pero no encuentro donde guarda el nombre de los campos. esta la tabla RDB$fields, pero ahi guarda un identificador, pero no el nombre del campo. ¿sabes por donde puede estar?

DarKraZY
02-11-2006, 15:07:41
En el ejemplo que te he puesto están los nombres de los campos. Pero para vincular con la tabla, tipo y demás deberás esperar a que te conteste otro forero o buscar por Internet.

Un saludo!

Lepe
02-11-2006, 19:15:00
gracias a los 2

lo de las tablas de sistema, quisiera tirar por ahi,

¿Por qué? ¿No resulta acaso más cómodo tirar de delphi?:

var DAtaset : TQuery;
begin
Dataset.sql.text := 'select * from tabla where codigo = 1'; // solo necesitamos un registro.
Dataset.Open;
Dataset.FieldsDef.Update;
with Dataset.FieldsDef.item[i] do
begin
case DataType of
ftUnknown : TipoDato:= 'ftUnknown';
ftString : TipoDato:= 'ftString';
ftSmallint : TipoDato:= 'ftSmallint';
ftInteger : TipoDato:= 'ftInteger';
ftWord : TipoDato:= 'ftWord';
ftBoolean : TipoDato:= 'ftBoolean';
end;
tipodato := FieldName + ' 'TipoDato;
end;


Más o menos.

Saludos

DarKraZY
02-11-2006, 23:23:51
No lo tengo claro Lepe, pero quizás es algo que está intentando hacer dentro de un procedimiento almacenado (stored procedure). En ese caso si serían de utilidad las tablas del sistema, y de nada le serviría los componentes en Delphi.

jachguate
03-11-2006, 00:24:59
El hilo tablas del sistema te será de ayuda.

Hasta luego.

;)

rastafarey
03-11-2006, 17:55:53
No tengo estoy en lacasa por lo tanto nu puedo ver las tablas de sistemas para decirte con exactitub.

Pero si usas ibexpert hay puede ver las tablas de sistemas. Si no sabes como encontrar la tabla que quieres mandas a buscar el nombre del campo, si mas no recuerdo esto se relaiona con un dominio y el dominio con el tipo real.

Nota. Pero creo que en las tablas de sistema de aprarecen algo asi como double precision o integer ... no estoy completmanete seguro.

despues de verirficar en la casa te doy el sql exacto.

jachguate
03-11-2006, 17:59:04
dicho sql está en el hilo al que hice referencia.

rastafarey
03-11-2006, 18:17:08
Gracias. Osea que no tengo que responder. Ya tienen la respouesta