Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Saber detalles de los campos

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.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 23-06-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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/...em_tables.html


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 23-06-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
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.
Código SQL [-]
/******************************************************************************/
/*                                   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

Código SQL [-]
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 24-06-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias por la referencia, Javier. Aunque ya no reconozco casi nada de ese código que has puesto.

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á.

Código SQL [-]
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.
Responder Con Cita
  #5  
Antiguo 24-06-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Muchas Gracias Pero, lo que quiero es pasarlos a un listview y pensaba no tener que montar otra base de datos para ello?..
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #6  
Antiguo 24-06-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.055
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por José Luis Garcí Ver Mensaje
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.
Responder Con Cita
  #7  
Antiguo 24-06-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.055
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Al González Ver Mensaje
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como seleccionar campos de una tabla sin saber cuantos van a seleccionar david duarte SQL 7 05-04-2010 21:15:43
Saber Campos Con Clave Forana, Saber campos con clave FORANA vivamotos Firebird e Interbase 2 18-09-2007 13:09:41
como puedo saber la cantidad de campos que tiene una tabla CottonMouth OOP 1 27-06-2007 07:02:49
Campos calculados, facturas y detalles de facturas. Letty Conexión con bases de datos 7 07-11-2003 11:19:44
cómo saber el nombre de los campos en ejecucion? ramiretor Conexión con bases de datos 5 26-05-2003 17:20:47


La franja horaria es GMT +2. Ahora son las 09:18:28.


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
Copyright 1996-2007 Club Delphi