Yo tengo implementado un procedimiento genérico en las base de datos que devuelve los nombres y los tipos de los campos de una tabla que se le sa como parámetro de entrada y devuelve dos parámetros de tipo cadena, uno indicando los nombres de los campos y otro los tipos de los campos, ambos separados por comas. Los tipos son unos números que indican justamente eso, de que tipo es el campo. Sería tal que asi:
Código SQL
[-]CREATE PROCEDURE OBTENERCAMPOS (
TABLA VARCHAR(30)
)
RETURNS (
CAMPOS VARCHAR(500),
TIPOS VARCHAR(80)
)
AS
declare variable uncampo char(30);
declare variable untipo varchar(3);
begin
campos = '';
tipos = '';
for execute statement
'Select lower(a.rdb$field_name),cast(b.rdb$field_type as varchar(3)) from rdb$relation_fields a
join rdb$fields b on a.rdb$field_source = b.rdb$field_name where a.rdb$relation_name = '''
|| upper(tabla) || '''' into :uncampo, :untipo
do
begin
if (uncampo is not null) then campos = campos || rtrim(uncampo) || ' ';
if (untipo is not null) then tipos = tipos || untipo || ' ';
end
end
;
Luego en mi aplicación hago que cuando necesite saber los tipos de campo que tiene una tabla, lo consulto, por ejemplo si necesito meter los campos de la tabla facturas en un combobox, sabiendo de qué tipo es cada campo hago así:
Código Delphi
[-]dm.QrEscritura.SQL.Text := 'execute procedure obtenercampos(''FACTURAS'')';
dm.TrEscritura.StartTransaction;
dm.QrEscritura.ExecQuery;
Cbcampos.Properties.Items.CommaText := dm.QrEscritura.FldByName['CAMPOS'].Asstring;
Tipos.CommaText := dm.QrEscritura.FldByName['TIPOS'].Asstring;
dm.QrEscritura.Close;
dm.TrEscritura.Commit;
En este caso puedo ver de que tipo es cada campo cuando el usuario selecciona un campo del combobox que he rellenado, simplemente mirando el TStrings "Tipos" y pasandole el índice del combobox.
Aquí algunos de los números de los tipos:
7 -> smallint
8 -> integer
12 -> date
14 ->char
37 -> varchar
Puedes adaptar todo esto a lo que necesites