PDA

Ver la Versión Completa : Saber detalles de los campos


José Luis Garcí
23-06-2011, 21:43:00
Hola compañeros mi ayuda va con respecto a saber los detalles de los campos de una tabla firebird, hasta el momento he logrado detectar tipos Varchar y su tamaño, 'DOUBLE PRECISION, INTEGER, DATE, TIME, TIMESTAMP, BLOB aunque no de que tipo y si el campo es NOT NULL, pero me falta el resto de tipos y si es co decimales, si tienen un ValueIn, o en el Caso del Blob si es binario o memo. Como siempre si podéis ayudarme os lo agradecería, y una vez termine la aplicación la publicare.
Con respecto a la aplicación es un sistema para crear la base de datos y las tablas con campos pre asignados.

maeyanes
23-06-2011, 21:52:57
Hola...

Si buscas obtener de una base de datos ya creada esta información, una forma es extrayendo el metadata de la base de datos, otra es consultando las tablas de sistema que se crean en todas las bases de datos de Firebird. Tal vez este enlace te sirva de algo: http://www.felix-colibri.com/papers/db/interbase/using_interbase_system_tables/using_interbase_system_tables.html


Saludos...

fjcg02
23-06-2011, 22:29:16
Muy buena la página relacionada.

Prueba esto que por cortesía de Al González pude conocer. Luego le añadí alguna cosilla.

Necesitas crear esta tabla para que te rule el procedimiento almacenado.

/******************************************************************************/
/* Tables */
/******************************************************************************/


CREATE GENERATOR GEN_Z_DEFINICION_CAMPO;

CREATE TABLE Z_DEFINICION_CAMPO (
IDCAMPO INTEGER NOT NULL,
TABLA VARCHAR(20) NOT NULL,
CAMPO VARCHAR(20) NOT NULL,
LABEL VARCHAR(20),
MASCARA VARCHAR(20),
TAMANIO INTEGER,
NOMBRE_SI_FK VARCHAR(20),
LABEL_SI_FK VARCHAR(20),
QUERY_SI_FK VARCHAR(200)
);




/******************************************************************************/
/* Primary Keys */
/******************************************************************************/

ALTER TABLE Z_DEFINICION_CAMPO ADD CONSTRAINT FK_Z_DEFINICION_CAMPO PRIMARY KEY (IDCAMPO);


/******************************************************************************/
/* Indices */
/******************************************************************************/

CREATE UNIQUE INDEX Z_DEFINICION_CAMPO_IDX1 ON Z_DEFINICION_CAMPO (TABLA, CAMPO);


/******************************************************************************/
/* Triggers */
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/* Triggers for tables */
/******************************************************************************/



/* Trigger: Z_DEFINICION_CAMPO_BI0 */
CREATE OR ALTER TRIGGER Z_DEFINICION_CAMPO_BI0 FOR Z_DEFINICION_CAMPO
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
IF (NEW.IDCAMPO IS NULL) THEN
NEW.IDCAMPO = GEN_ID(gen_z_definicion_campo,1);
end
^


SET TERM ; ^



Ahora el procedimiento almacenado

SET TERM ^ ;

CREATE OR ALTER PROCEDURE Z_TABLAS
returns (
tabla varchar(20),
posicion integer,
campo varchar(20),
tipo varchar(25),
longitud integer,
decimales integer,
permite_nulos char(2),
pk integer,
fk_campo varchar(50),
fk_tabla varchar(50),
descripcion varchar(500),
label varchar(20),
mascara varchar(20),
tamanio varchar(20),
nombre_si_fk varchar(20),
label_si_fk varchar(20),
query_si_fk varchar(200))
as
declare variable wtipo integer;
declare variable subtipo integer;
declare variable wprecision integer;
declare variable escala integer;
declare variable nulo integer;
begin
/* Procedure Text */
for
Select

RF.RDB$Relation_Name TABLA, /* Nombre de la tabla/vista */
RF.RDB$Field_Name CAMPO, /* Nombre del campo */
RF.RDB$Field_Position POSICION, /* Posición del campo */
RF.RDB$Description DESCRIPCION, /* Descripción del campo */
F.RDB$Field_Type,
F.RDB$Field_Sub_Type,
/* Tipo concreto */
F.RDB$Field_Length,
F.RDB$Field_Precision,
/* Decimales */
F.RDB$Field_Scale,
/* Permite o no valores nulos */
RF.RDB$Null_Flag

From RDB$Relation_Fields RF

/* La información de campos está distribuida en las tablas
RDB$Relation_Fields y RDB$Fields */
Left Join RDB$Fields F On RF.RDB$Field_Source = F.RDB$Field_Name

/* No incluir tablas del sistema */
Where RF.RDB$System_Flag = 0
order by
RF.RDB$Relation_Name,RF.RDB$Field_Position

INTO :tabla, :campo, posicion, :descripcion, :wtipo, :subtipo, :longitud,
:wprecision, :escala, :nulo
do begin
tipo= 'Desconocido';
if (wtipo = 261) /* BLOb */ Then
begin
if (subtipo = 1) Then
tipo='Texto BLOb';
else
tipo='BLOb';
end
if (wtipo = 14) Then tipo='Texto Char';
if (wtipo = 40) Then tipo='Texto CString';
if (wtipo = 11) Then tipo='Numérico D_Float';
if (wtipo = 27) Then tipo='Numérico Double' ;
if (wtipo = 10) Then tipo='Numérico Float' ;
if (wtipo = 16) Then
begin
if (subtipo = 1) Then tipo='Numérico';
if (subtipo = 2) Then
tipo='Decimal';
Else
tipo='Entero Int64';
End
if (wtipo = 8) /* Integer */ Then
begin
if (subtipo = 1) Then tipo='Numérico';
if (subtipo = 2) Then tipo='Decimal'; Else tipo='Entero Integer';
End
if (wtipo = 9) Then tipo='Quad';
if (wtipo = 7 )/* SmallInt */ Then
begin
if (subtipo = 1) Then tipo='Numérico';
if (subtipo = 2) Then tipo='Decimal' ;Else tipo='Entero SmallInt';
End
if (wtipo = 12) Then tipo='Fecha Date';
if (wtipo = 13) Then tipo='Hora Time';
if (wtipo = 35) Then tipo='Fecha y hora TimeStamp';
if (wtipo= 37) Then tipo='Texto Varchar';

if (wtipo= 11) /* D_Float */ Then longitud= wPrecision;
if (wtipo= 27) /* Double */ Then longitud= wPrecision;
if (wtipo= 10) /* Float */ Then longitud= wPrecision;
if (wtipo= 16) /* Int64 */ Then
if (subtipo = 1 or subtipo =2) Then longitud= wPrecision;
if (wtipo= 8) /* Integer */ Then
if (subtipo= 1 or subtipo=2) Then longitud= wPrecision;
if (wtipo= 7 )/* SmallInt */ Then
if (subtipo=1 or subtipo= 2) /* Decimal */ Then longitud= wPrecision;

if (escala = 0) Then DECIMALES= Null;
if (escala <> 0 and escala is not null) then DECIMALES= Cast (ESCALA * -1 As integer);

if (NULO = 1) Then PERMITE_NULOS= 'No'; Else PERMITE_NULOS= 'Si';
PK = null;
select i.rdb$field_position
from rdb$relation_constraints rc, rdb$index_segments i, rdb$indices idx
where (i.rdb$index_name = rc.rdb$index_name) and
(idx.rdb$index_name = rc.rdb$index_name) and
(rc.rdb$constraint_type = 'PRIMARY KEY') and
(rc.rdb$relation_name = :TABLA) and
(i.rdb$field_name = :CAMPO)
into :PK ;
if (pk is not null ) then pk = pk+1;

FK_CAMPO = null;
FK_TABLA = Null;
select trim(D.RDB$FIELD_NAME), trim(C.RDB$RELATION_NAME)
from RDB$REF_CONSTRAINTS B, RDB$RELATION_CONSTRAINTS A, RDB$RELATION_CONSTRAINTS C,
RDB$INDEX_SEGMENTS D, RDB$INDEX_SEGMENTS E, RDB$INDICES I
where (A.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY') and
(A.RDB$CONSTRAINT_NAME = B.RDB$CONSTRAINT_NAME) and
(B.RDB$CONST_NAME_UQ=C.RDB$CONSTRAINT_NAME) and (C.RDB$INDEX_NAME=D.RDB$INDEX_NAME) and
(A.RDB$INDEX_NAME=E.RDB$INDEX_NAME) and
(A.RDB$INDEX_NAME=I.RDB$INDEX_NAME) and
(A.RDB$RELATION_NAME = :TABLA) and
(D.RDB$FIELD_NAME = :CAMPO)
into :FK_CAMPO, :FK_TABLA;

LABEL= Null;
MASCARA= null;
TAMANIO=Null;
NOMBRE_SI_FK = Null;
LABEL_SI_FK = Null;
QUERY_SI_FK = Null;
select LABEL,MASCARA, TAMANIO, NOMBRE_SI_FK, LABEL_SI_FK,QUERY_SI_FK
FROM z_definicion_campo
WHERE TABLA=:TABLA AND CAMPO = :CAMPO
INTO :LABEL, :MASCARA, :TAMANIO, :NOMBRE_SI_FK, :LABEL_SI_FK,:QUERY_SI_FK;

suspend;
end

end^

SET TERM ; ^

GRANT SELECT ON Z_DEFINICION_CAMPO TO PROCEDURE Z_TABLAS;



Espero qiue te mole. Si quieres condensar, quita todo lo que dependa de la tabla que te he comentado para crear.

Para usarlo, utiliza "select * from z_tablas". Puedes filtrar por la tabla que quieras.

Saludos

Al González
24-06-2011, 05:02:54
Gracias por la referencia, Javier. Aunque ya no reconozco casi nada de ese código que has puesto. :o

Aprovecho para dejarles la vista que uso en las bases de datos Firebird. Me ayuda a encontrar detalles de un campo, sobre todo cuando solamente recuerdo su nombre pero no en qué tabla está.


CREATE VIEW VWCAMPOS(
TABLA,
CAMPO,
POSICION,
DESCRIPCION,
TIPO,
TAMAO,
DECIMALES,
PERMITENULOS)
AS

/* Vista para listar todos los campos de nuestra base de datos */

Select

RF.RDB$Relation_Name, /* Nombre de la tabla/vista */
RF.RDB$Field_Name, /* Nombre del campo */
RF.RDB$Field_Position, /* Posición del campo */
RF.RDB$Description, /* Descripción del campo */

/* Tipo concreto */
Case F.RDB$Field_Type
When 261 /* BLOb */ Then
Case F.RDB$Field_Sub_Type
When 1 Then 'Texto BLOb'
Else 'BLOb'
End
When 14 Then 'Texto Char'
When 40 Then 'Texto CString'
When 11 Then 'Numérico D_Float'
When 27 Then 'Numérico Double'
When 10 Then 'Numérico Float'
When 16 /* Int64 */ Then
Case F.RDB$Field_Sub_Type
When 1 Then 'Numérico'
When 2 Then 'Decimal'
Else 'Entero Int64'
End
When 8 /* Integer */ Then
Case F.RDB$Field_Sub_Type
When 1 Then 'Numérico'
When 2 Then 'Decimal'
Else 'Entero Integer'
End
When 9 Then 'Quad'
When 7 /* SmallInt */ Then
Case F.RDB$Field_Sub_Type
When 1 Then 'Numérico'
When 2 Then 'Decimal'
Else 'Entero SmallInt'
End
When 12 Then 'Fecha Date'
When 13 Then 'Hora Time'
When 35 Then 'Fecha y hora TimeStamp'
When 37 Then 'Texto Varchar'
End,

/* Tamaño (sólo para Char, VarChar y flotantes) */
Case F.RDB$Field_Type
When 14 /* Char */ Then F.RDB$Field_Length
When 11 /* D_Float */ Then F.RDB$Field_Precision
When 27 /* Double */ Then F.RDB$Field_Precision
When 10 /* Float */ Then F.RDB$Field_Precision
When 16 /* Int64 */ Then
Case F.RDB$Field_Sub_Type
When 1 /* Numeric */ Then F.RDB$Field_Precision
When 2 /* Decimal */ Then F.RDB$Field_Precision
End
When 8 /* Integer */ Then
Case F.RDB$Field_Sub_Type
When 1 /* Numeric */ Then F.RDB$Field_Precision
When 2 /* Decimal */ Then F.RDB$Field_Precision
End
When 7 /* SmallInt */ Then
Case F.RDB$Field_Sub_Type
When 1 /* Numeric */ Then F.RDB$Field_Precision
When 2 /* Decimal */ Then F.RDB$Field_Precision
End
When 37 /* VarChar */ Then F.RDB$Character_Length
End,

/* Decimales */
Case F.RDB$Field_Scale
When 0 Then Null
Else Cast (F.RDB$Field_Scale * -1 As SmallInt)
End,

/* Permite o no valores nulos */
Case RF.RDB$Null_Flag
When 1 Then 'No'
Else 'Si'
End

From RDB$Relation_Fields RF

/* La información de campos está distribuida en las tablas
RDB$Relation_Fields y RDB$Fields */
Left Join RDB$Fields F On RF.RDB$Field_Source = F.RDB$Field_Name

/* No incluir tablas del sistema */
Where RF.RDB$System_Flag = 0;


Saludos.

Al González.

José Luis Garcí
24-06-2011, 08:20:43
Muchas Gracias Pero, lo que quiero es pasarlos a un listview y pensaba no tener que montar otra base de datos para ello?..

Casimiro Notevi
24-06-2011, 10:23:29
Aprovecho para dejarles la vista que uso en las bases de datos Firebird. Me ayuda a encontrar detalles de un campo, sobre todo cuando solamente recuerdo su nombre pero no en qué tabla está.
Muy interesante, buena aportación :)

Casimiro Notevi
24-06-2011, 10:24:23
Muchas Gracias Pero, lo que quiero es pasarlos a un listview y pensaba no tener que montar otra base de datos para ello?..
¿Montar otra base de datos?, no he entendido bien qué es lo que necesitas.

José Luis Garcí
24-06-2011, 15:09:20
Cierto Casimiro AI González lo que monta es una vista, como fjcg02 empezaba creando una tabla, pensé que el códiigo de Ai González, también empezaba con crear una tabla. Eso si nunca he montado una vista, así que pregunto, los monto en un IBQuery??

maeyanes
24-06-2011, 15:15:53
Hola...

Una vista es un objeto más de la base de datos, así que la tienes que crear como si crearas una tabla o un procedimiento almacenado.

Otra cosa, es AL González, no AI González... :D :D :D



Saludos...

Al González
24-06-2011, 17:24:23
Otra cosa, es AL González, no AI González... :D :D :D
Gracias Marcos, llevo como dos años tratando de hacérselo saber. Hasta he llegado a pensar que lo hace a propósito. :o

José Luis Garcí
24-06-2011, 17:44:14
Pues de verdad que llevo todo este tiempo pensado que Era AI y No Al, te pido disculpas, y debo comfesar que no sabia si era una abreviatura ni nada por el Estilo.

Al González
24-06-2011, 18:15:15
No hay problema, José Luis. Un abrazo hasta aquellas Islas Afortunadas. :)

fjcg02
25-06-2011, 14:33:42
Hola a todos,
parece que mi código a alguno le ha parecido un poco fuerte.
Si os fijais, es casi igual al que Al publica. De hecho, lo saqué de una bbdd que tenía publicada en su antigua página.

Lo que ocurre, es que yo añadí una tabla ( que es la que se crea al principio), en la que guardo información mía propia de cada query, campo, ...

Estos son los campos que devuelve la procedure:
tabla varchar(20),
posicion integer,
campo varchar(20),
tipo varchar(25),
longitud integer,
decimales integer,
permite_nulos char(2),
pk integer,
fk_campo varchar(50) -> si es foreign key, indica el campo
fk_tabla varchar(50), -> tabla de la fk
descripcion varchar(500),
label varchar(20), -> label queusaré en los formularios
mascara varchar(20) -> máscara para editar si lo necesita
tamanio varchar(20)-> tamaño en el formulario
nombre_si_fk varchar(20)
label_si_fk varchar(20),
query_si_fk varchar(200)) -> si es fk la query asociada para buscar el valor

No sé si es suficientemente claro, pero a mi me simplifica mucho el trabajo. Tengo una tabla en la que defino todo lo que puedo de los campos, y en los formularios, éstos se van montando y configurando 'al vuelo' al crearlo. Al crear el formulario, le indico cual es la query pricipal, y el resto lo monta 'sólo'.

Espero que os sirva de ayuda. No tengo todo desarrollado por falta de tiempo, pero creo que por ahí hay que pegarle.

Un saludo

Casimiro Notevi
25-06-2011, 16:39:27
Espero que os sirva de ayuda. No tengo todo desarrollado por falta de tiempo, pero creo que por ahí hay que pegarle.

Un saludo

Por supuesto que sirve, ya lo tengo también en mi "almacén" :)

José Luis Garcí
25-06-2011, 20:37:25
Perdona, fjcg02, pero donde dices

Para usarlo, utiliza "select * from z_tablas". Puedes filtrar por la tabla que quieras.

Donde tengo que ponerlo, estoy más perdido que un pulpo en el garaje:rolleyes:, no veo la luz:cool:, estoy ciego, Bromas aparte:D:D:D:D, tu planteamiento me convence, he colocado tu primera parte de la coloque en un ibScript y perfecto, la segunda en otro y no vi nada, pero claro seguro que algo estoy haciendo mal y esa frase seguro que es la solución pero donde la pongo, como actuar, si puedes echarme una mano muchas gracias

fjcg02
26-06-2011, 21:31:28
Hola Jose Luis,
te comento por encima cómo me gustaría hacer el tema, ya que como te he comentado, no lo tengo casi ni empezado.

En este caso, tengo el procedimiento almacenado, y dos tablas llamadas Z_Tablas y Z_Definicion_Campos. Lo puedes ver en la imagen del ibexpert que te incluyo.

En la tabla Z_Tablas tengo simplemente la lista de tablas y vistas.
En la tabla Z_Definicion _campos, los campos de cada tabla ovista, y todas sus propiedades.
IDCAMPO INTEGER NOT NULL,
IDTABLA INTEGER,
TABLA VARCHAR(20) NOT NULL,
CAMPO VARCHAR(20) NOT NULL,
TIPOCAMPO Tipos definidos por mi
LABEL Etiqueta del campo tal y como la quiero visualizar
MASCARA Mascara para editar
MASCARADISPLAY Mascara para displayar
TAMANIO tamaño para la visualizacion
NOMBRE_SI_FK Que nombre tiene si es FK ( ejemplo, si el campo es ID_ARTICULO, y es fk, pondré ARTICULO
LABEL_SI_FK igual
QUERY_SI_FK Query de dondeviene el dato
CAMPOSACTUALIZA qué campos actualiza si el usuario lo edita. Ejemplo articulo, cambia el idartivulo y el precio
NEWVALUE valor del campo cuando se da de alta un registro nuevo ( ejemplo 0 para los enteros o flotantes) o funcion que devuelve un valor calculado
ONVALIDATE funcion que valida el dato si es necesario
LISTA si es una lista de valores, que lita es para recuperarla de una tabla donde las tengo definidas.

En este caso el procedimiento almacenado lo utilizo para dar de alta automáticamente los campos cuando soy de alta una tabla o query. Pones un Dataset con la query select * from z_tablas where tabla='nombretabla' y al abrirlo, ya tienes todos los datos de los campos de la tabla que quieras. Si sólo quieres un campo, añade un filtro para que lo localice.

Luego, en el programa, lo que hago es montar 'al vuelo' los datasets y los grids, dándoles las propiedades 'al vuelo'.

Esto es lo que se ejecuta en la creación de la ventana del dibujo que adjunto. ( Nota: no puedo adjuntar más archivos, y paso de esas páginas de almacenar imágenes que hay por ahí )

procedure TForm2.FormCreate(Sender: TObject);
begin
Frame1:=CrearFrameGrid( 'Maestro',Form2, Panel1, DMP.BBDD,
'SELECT * FROM PACIENTE', 'PACIENTE' );
PrepararDS(Form2,DMP.BBDD,Frame1.SQLDataSet1,'PACIENTE','');
PrepararDS(Form2,DMP.BBDD,Frame1.ClientDataSet1,'PACIENTE','');
PrepararGrid( DMP.BBDD, Frame1.cxGrid1DBTableView1, Frame1.DataSource1, 'PACIENTE');
Frame1.ClientDataSet1.AfterDelete:= DMP.CDSTablaAfterDelete;
Frame1.ClientDataSet1.AfterPost:= DMP.CDSTablaAfterPost;
Frame1.ClientDataSet1.BeforePost:= DMP.CDSTablaBeforePost;
Frame1.ClientDataSet1.OnNewRecord:= DMP.CDSNewRecord;
Frame1.ClientDataSet1.OnReconcileError:= DMP.CDSReconcileError;

Frame2:=CrearFrameGrid( 'Detalle', Form2, TabSheet1, DMP.BBDD,
'SELECT CITA.* FROM CITA', 'CITA'); // WHERE IDPACIENTE=:IDPACIENTE';

Frame3:=CrearFrameGrid( 'Patologia', Form2, TabSheet2, DMP.BBDD,
'SELECT * FROM PATOLOGIA', 'PATOLOGIA'); // WHERE IDPACIENTE=:IDPACIENTE';

Frame4:=CrearFrameGrid( 'V_CITAS', Form2, TabSheet3, DMP.BBDD,
'SELECT * FROM V_CITAS', 'CITA'); // WHERE IDPACIENTE=:IDPACIENTE';

// PrepararDS(Form2,DMP.BBDD,Frame2.SQLDataSet1,'CITA','');
PrepararDS(Form2,DMP.BBDD,Frame2.ClientDataset1,'CITA','');
PrepararGrid( DMP.BBDD, Frame2.cxGrid1DBTableView1, Frame2.DataSource1, 'CITA');
Frame2.ClientDataSet1.AfterDelete:= DMP.CDSTablaAfterDelete;
Frame2.ClientDataSet1.AfterPost:= DMP.CDSTablaAfterPost;
Frame2.ClientDataSet1.BeforePost:= DMP.CDSTablaBeforePost;
Frame2.ClientDataSet1.OnNewRecord:= DMP.CDSNewRecord;
Frame2.ClientDataSet1.OnReconcileError:= DMP.CDSReconcileError;

Frame2.ClientDataSet1.MasterSource:= Frame1.DataSource1;

...

No sé si ha sido suficientemente aclaratorio. Si alguien está interesado, le puedo dar más información si me quiere ayudar a terminarlo o a estudiarlo.

Con media docena de ventanas 'maestras' y sobre todo, resolver bien cómo enlazar procesos desde una ventana con los datos de la misma, se puede hacer una cosa interesante.

He estado mirando frameworks varios, y en cuanto se ponen a hablar de objetos, instanciar, ... me mareo.
Si además puedo encajar todo esto con herencia, ... pues sería ideal. Pero mi tiempo y conociemientos son limitados.

Un saludo

José Luis Garcí
27-06-2011, 08:42:59
fjcg02 me quedo :eek::eek::eek:, esto yo quería algo en delphi,:D:D:D bromas a parte, me gustaría si puedes podrías poner una pequeña demo, veras, lo que quiero hacer es lo siguiente, tengo un programa que se llama autoabm, para la generación de Forms, de momento con un sólo tipo (modelo), tanto de form como de búsqueda, ahora estoy preparando un programa, que genera las bases de datos en firebird, por tipos grupos o bases preestablecidas, sólo crea no modifica, explico un poco los tipos para que me entendais tipos, son los diferentes campos por valores propios (integer, varchar, etc) o propios notas (Blob subtipo 0 creo), grupos si elegimos el grupo dirección sería Dirección, cp, población provincia y por bases preestablecidas, si elegimos clientes, los datos típicos de una base de datos clientes, cada campo tendrá las opciones normales, por supuesto podemos desechar si crearlo o no, etc pero además añadirá si pertenece a un grupo (nombre del Grupo)1, el hint del campo, el displaylabel, el mask, wl whith de su tamaño, etc.

una vez terminado se montaría con el auto abm creando el form con los campos de la base de datos, a falta de conectar el Datasource.


1 en el programa se montaría dentro de un Groupbox

José Luis Garcí
27-06-2011, 19:57:46
fjcg02, Esta tarde me he puesto de nuevo con el código que aportaste, y por fin entendí su funcionamiento (si ya sé que soy un tronco, pero que le vamos a hacer, puse 2 ibscript, en el primero metí el primer código que genera la base tabla para la base de datos, ok, en el segundo el código para la vista (eso es por lo menos lo que entiendo, aunque no vi el tema del View), pero este no me aparece en Ibexpert, luego puse un Ibquery, con su datasource y dbgrid, le doy al botón para ejecutar con el "select * from z_tablas", que me comentabas y funciono perfecto, falta como ya comentabas añadirle un where para ver la tabla que quiera, en vez de todas.

Muchas gracias funciona muy bien.

fjcg02
27-06-2011, 20:56:35
No te preocupes, aquí no eres el unico trontxo que hay :D

Somos varios ...

Saludos