Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Crear campo en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=79335)

tarco35 26-06-2012 20:27:00

Crear campo en tiempo de ejecucion
 
Saludos... trabajo con delphi 6 y tablas pdx. Quisiera ver si en una tabla existe un campo y si no existe pues crearlo (seria de tipo boolean) y realizar esto cuando ejecuto el programa (la tabla ya existe y tiene datos).
Gracias

Casimiro Notevi 26-06-2012 20:49:10

¿pdx?, ¿eso es paradox?

ecfisa 26-06-2012 20:52:42

Hola.

Proba de este modo:
Código Delphi [-]
var
  Field: TField;
  i: Integer;
begin
  Table1.Close;
  for i:=0 to Table1.FieldDefs.Count-1 do
    Field:= Table1.FieldDefs[i].CreateField(Table1);

  Field:= TBooleanField.Create(Table1); 
  with Field do
  begin
    FieldName:= 'NUEVO_CAMPO';
    Calculated:= True;
    DataSet:= Table1;
  end;
  Table1.Open;
end;

Saludos.

ecfisa 26-06-2012 21:46:32

Hola.

Me quedé pensando que tal vez no deseabas crear un campo calculado sino uno permantente.

Podes hacerlo mediante un TQuery, por ejemplo:
Código Delphi [-]
procedure TForm1.CrearCampo(aFieldName, aType: string);
var
  i: Integer;
  Exists: Boolean;
begin
  Table1.Open;
  Exists:= False;
  for i:=0 to Table1.FieldDefs.Count-1 do
    Exists:= Table1.Fields[i].FieldName = aFieldName;
  if not Exists then
  begin
    Table1.Close;
    with Query1 do
    begin
      SQL.Text:= 'ALTER TABLE TU_TABLA ADD '+aFieldName+' '+aType;
      ExecSQL;
      Close;
    end;
  end;
  if not Table1.Active then
    Table1.Open;
end;

Llamada:
Código Delphi [-]
   CrearCampo('NUEVO', 'BOOLEAN');


Saludos.

tarco35 27-06-2012 09:59:22

EL codigo funciona correctamente cuando lo ejecuto por primera vez y crea el campo. Pero la segunda vez que lo ejecuto me da error:
List index out of bounds en el "for i:=0 ...

Código Delphi [-]
  If NOT TablaPuntos.Active Then TablaPuntos.Open;
  Exists:= False;
  for i:=0 to TablaPuntos.FieldDefs.Count-1 do
    Exists:= TablaPuntos.Fields[i].FieldName = 'Desglose';
  If Not Exists then begin
    TablaPuntos.Close;
    with SQLReestructuraTabla do begin
      SQL.Text:= 'ALTER TABLE PuntosMedicion ADD Desglose BOOLEAN';
      ExecSQL;
      Close;
    end;
  end;
  If Not TablaPuntos.Active Then TablaPuntos.Open;

ecfisa 27-06-2012 18:04:07

Hola.

No sé como estés implementando el código.

Por si te pudiera ayudar, te adjunto un ejemplo que usa la tabla items.db (que viene con Delphi) en el cuál se agregan siete campos calculados en el evento OnClick de un TButton, sin provocar ningún error.

Saludos.

tarco35 28-06-2012 09:18:39

Detalle
 
Pues el codigo funciona bien, hasta que le das por segunda vez al boton, para que funcione correcto hay que cambiar el bucle FOR por un While quedando así:
Código Delphi [-]
  While (i<=Table1.FieldDefs.Count-1) AND Not Exists Do Begin
    Exists:= Table1.Fields[i].FieldName = aFieldName;
    Inc(i);
  end;

Gracias por la ayuda....

ecfisa 28-06-2012 11:00:00

Hola Tarco35.

Me acordé de una función que simplifica mucho el código y trabaja correctamente:
Código Delphi [-]
procedure TForm1.CrearCampo(aFieldName, aType: string);
begin
  if Table1.FindField(aFieldName) = nil then
  begin
    Table1.Close;
    with Query1 do
    begin
      SQL.Text:= 'ALTER TABLE ITEMS ADD ' + aFieldName  + ' ' + aType;
      ExecSQL;
      Close;
    end;
    Table1.Open;
  end;
end;

Saludos.

Casimiro Notevi 28-06-2012 11:28:01

Lo peligroso de estas cosas es que si hay alguien más conectado... le va a dar una risa :D

tarco35 28-06-2012 11:32:35

sin riesgo
 
No hay peligro para otros, ya que el sistema no trabaja en red.
Gracias


La franja horaria es GMT +2. Ahora son las 14:39:27.

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