Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (http://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Campos creados dinámicamente vs creados estáticamente (http://www.clubdelphi.com/foros/showthread.php?t=9056)

Jose_Pérez 13-04-2004 13:48:08

Campos dinámicos vs persistentes
 
Hola a todos:

Los componentes que representan a los campos (derivados de TField), pueden crearse dinámicamente (de forma "automática" durante la ejecución) o estáticamente (abriendo el editor de columnas del componente TTable durante la fase de desarrollo). Respectivamente, a cada tipo de campo se le conoce como dinámicos o persistentes.

Si se utilizan campos persistentes se limita el número de columnas (campos) disponibles al abrir la tabla, de forma similar a como lo hace una consulta SQL.

El problema se me presenta cuando necesito modificar la estructura de una tabla durante la ejecución de la aplicación (mediante SQL). Si ya he creado campos persistentes entonces los nuevos campos creados (dinámicos) no son reconocidos por el correspondiente componente TTable.

Evidentemente, la opción más sencilla sería no crear campos persistentes. Muy fácil, ¿pero que ocurre cuando tengo que añadir un campo calculado a esa misma tabla durante la fase de diseño?. Que entonces el componente TTable piensa que todos los campos se añaden estáticamente, y no hay manera de que reconozca los nuevos campos.

Estoy trabajando con tablas dBase. ¿Como puedo solucionarlo?.

Gracias y saludos.

LBriceno 14-04-2004 01:09:23

Hola José:

Segun te entendí, lo que quieres es agregar o eliminar campos persistentes en un qry., yo trabajo con ADO y esto me funciona bastante bien:

trabajaremos con un query de nombre Query y un campo de nombre NomCampo de tipo Integer

QueryNomCampo.Free; //si deseas eliminarlo

With TIntegerField.Create(Self) do begin //si desaes agregarlo
FieldName := 'NomCampo';
Name := 'QueryNomCampo';
Index := Query.FieldCount;
DataSet := Query;
end;

Query.FieldDefs.UpDate; //actualiza la definicion de campos

espero que sea lo que nadas buscando y te sirva
LBP

Jose_Pérez 14-04-2004 12:34:03

Estimado Luis:

En lugar de ADO, yo trabajo con el TTable a través del BDE. Pero la idea me ha servido. Creo que es interesante que cuelgue el código tal y como lo tengo en el desarrollo de mi aplicación, para quien pueda interesar.

Código:

procedure TDataModulo.tbCabalbBeforeOpen(DataSet: TDataSet);
begin

{
  NOTA: Los campos persistentes se crean aquí para adaptar el programa a las nueva
        estructura de la tablas, creadas desde código. Una vez que las tablas han
        sido reestructuras en el equipo del usuario, "lo normal" es crear los
        campos persistentes desde el editor de columnnas del componente TTable co-
        rrespondiente.
}

  If tbCabalb.FieldDefs.IndexOf('RES_CALB')<>-1 Then
    Begin
    tbCabalbRES_CALB:=TStringField.Create(Self);
    tbCabalbRES_CALB.FieldName:='RES_CALB';
    tbCabalbRES_CALB.DataSet:=tbCabalb;
    tbCabalbRES_CALB.FieldKind:=fkData;
    end;

  If tbCabalb.FieldDefs.IndexOf('FRES_CALB')<>-1 Then
    Begin
    tbCabalbFRES_CALB:=TDateField.Create(Self);
    tbCabalbFRES_CALB.FieldName:='FRES_CALB';
    tbCabalbFRES_CALB.DataSet:=tbCabalb;
    tbCabalbFRES_CALB.FieldKind:=fkData;
    end;

end;

procedure TDataModulo.tbCabalbAfterClose(DataSet: TDataSet);
begin

  If tbCabalbRES_CALB<>Nil Then
    tbCabalbRES_CALB.Free;

  If tbCabalbFRES_CALB<>Nil Then
    tbCabalbFRES_CALB.Free;

end;

Saludos y gracias.


La franja horaria es GMT +2. Ahora son las 13:49:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi