Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Saber si un campo existe mediante sql falla (https://www.clubdelphi.com/foros/showthread.php?t=88658)

tarco35 10-07-2015 23:36:08

Saber si un campo existe mediante sql falla
 
Hola compañeros. Tengo el siguiente código:
Código Delphi [-]
  TablaTextos.Close;
  with SQLReestructuraTabla do begin
    SQL.Text:= 'SELECT * FROM \BIA_TEST\DataBase\Textos';
    ExecSQL;
    If FindField('Texto')= NIL then Existe := false
    else Existe := true;
    Close;
  end;
  If Not Existe then begin
    SQLReestructuraTabla.SQL.Clear;
    with SQLReestructuraTabla do begin
      SQL.Text:= 'ALTER TABLE \BIA_Test\DataBase\Textos ADD Texto VARCHAR(10)';
      ExecSQL;
      Close;
    end;
  end;
  TablaTextos.Open;

Con el cual pretendo verificar si existe el campo "Texto" en la tabla "TEXTOS", la primera vez que pasa, funciona correctamente y crea el campo, pero a la siguiente ejecución sigue diciendo que dicho campo no existe... ¿por que me falla??? (delphi 6 , paradox 7)

AgustinOrtu 11-07-2015 00:15:06

Saludos tarco35

Código Delphi [-]
  TablaTextos.Close;
  with SQLReestructuraTabla do begin
    Close;
    SQL.Text:= 'SELECT * FROM \BIA_TEST\DataBase\Textos';
    Open;
    Existe := FindField('Texto') <> NIL;
  end;

Prueba de este modo a ver

tarco35 11-07-2015 23:26:23

Muchas gracias.. probado y funcionando correctamente.

tarco35 12-07-2015 02:26:14

Ahora me da un error cuando, por ejemplo, intento hacer:

Código Delphi [-]

TablaTextos.FieldByName('Texto').AsString := 'Hola';

me dice que ese campo no existe... (aunque realmente si que existe, ya que se crea bien)

AgustinOrtu 12-07-2015 04:52:23

Saludos nuevamente tarco35

Debes refrescar tu componente TablaTextos cuando agregas el nuevo campo. Si es un query deberia bastarle con Requery; sino tambien podes usar Close y luego Open

Otra cosa, al modificar el contenido de un campo acordate de poner el DataSet en Edicion, es decir

Código Delphi [-]
 TablaTextos.Edit
 TablaTextos.FieldByName.AsString := 'Hola Mundo';
 TablaTextos.Post;

Prueba y nos dices ^\||/

ecfisa 12-07-2015 05:42:57

Hola tarco35.

Un detalle; cotejar la existencia de la columna comparando el resultado de la función FindField con nil, te puede dar problemas ante un involuntario doble intento de creación.

Creo que es mas seguro hacerlo de este modo:
Código Delphi [-]
function ExistsField(aDataSet: TDataSet; const aFieldName: string): Boolean;
var
  TS: TStrings;
begin
  Result := False;
  TS := TStringList.Create;
  try
    aDataSet.GetFieldNames(TS);
    Result := TS.IndexOf(aFieldName) <> -1;
  finally
    TS.Free;
  end;
end;

El código para agregar una columna quedaría mas o menos así:
Código Delphi [-]
...
begin
 if not ExistsField(TablaTextos, 'TEXTO') then
  begin
    TablaTextos.Close;
    SQLReestructuraTabla.Close;
    SQLReestructuraTabla.SQL.Text := 'ALTER TABLE TU_TABLA ADD TEXTO VARCHAR(10)';
    SQLReestructuraTabla.ExecSQL;
    TablaTextos.Open;
  end;
end;

Y para eliminarla:
Código Delphi [-]
...
begin
  if ExistsField(TablaTextos, 'TEXTO') then
  begin
    TablaTextos.Close;
    SQLReestructuraTabla.Close;
    SQLReestructuraTabla.SQL.Text := 'ALTER TABLE TU_TABLA DROP TEXTO';
    SQLReestructuraTabla.ExecSQL;
    TablaTextos.Open;
  end;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 16:17:37.

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