Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-06-2012
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 21
tarco35 Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 26-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿pdx?, ¿eso es paradox?
Responder Con Cita
  #3  
Antiguo 26-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-06-2012 a las 20:56:03.
Responder Con Cita
  #4  
Antiguo 26-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-06-2012 a las 21:49:55. Razón: ortografía
Responder Con Cita
  #5  
Antiguo 27-06-2012
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 21
tarco35 Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 27-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 28-06-2012 a las 11:03:31.
Responder Con Cita
  #7  
Antiguo 28-06-2012
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 21
tarco35 Va por buen camino
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....
Responder Con Cita
  #8  
Antiguo 28-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 28-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo peligroso de estas cosas es que si hay alguien más conectado... le va a dar una risa
Responder Con Cita
  #10  
Antiguo 28-06-2012
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 21
tarco35 Va por buen camino
sin riesgo

No hay peligro para otros, ya que el sistema no trabaja en red.
Gracias
Responder Con Cita
Respuesta



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
Crear campo calculado en tiempo de ejecucion-Ibquery andresenlared Varios 12 19-06-2014 06:44:39
Campo nuevo en tiempo de ejecución Adrianmex Tablas planas 14 17-03-2009 18:54:21
Crear QRDbtext en tiempo de ejecucion lbidi Impresión 8 07-10-2006 21:31:55
Crear Tabla en Tiempo de ejecucion alcides Varios 4 01-07-2005 20:23:52
Crear un DSN en tiempo de ejecucion neyvan Conexión con bases de datos 7 21-05-2004 17:41:45


La franja horaria es GMT +2. Ahora son las 06:09:45.


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