Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Como averiguar si hay un campo en la Db (https://www.clubdelphi.com/foros/showthread.php?t=3136)

Jose Manuel 23-08-2003 11:39:43

Como averiguar si hay un campo en la Db
 
Hola, trabajo con Delphi4 y con Dbase y quisiera saber como puedo averiguar si una tabla tiene un determinado campo.

Por ejemplo: como saber si la base de datos de "proveedores" tiene el campo "fax" antes de poner la propiedad Active a true.

Un saludo
Jose Manuel

__cadetill 23-08-2003 13:35:06

puedes recorrerte los campos del dataset y mirar si existe

Código:

var
  i : integer;
begin
  i := 0;
  while (i <= Table1.Fields.Count - 1) and (Table1.Fields[i].FieldName = 'fax') do
    inc(i);

  if i > Table1.Fields.Count - 1 then
    ShowMessage('no existe')
  else
    ShowMessage('existe');
end;


Jose Manuel 23-08-2003 17:53:05

Hola, el problema que hay que es son campos persistentes, de manera que siempre me dice que existe el campo en la tabla fDatamodulo.tbproveedores, pero luego si falta realmente el campo en la base de datos se produce el error.

Tambien he probado calculando el nº total de campos que debe tener la tabla, por ejemplo

If fDatamodulo.tbproveedor.FieldCount<=26 then "hay que actualizar"

pero esta instrucción siempre da el mismo nº de campos.

Gracias y saludo a todos
Jose Manuel

sanxpue 23-08-2003 19:08:50

:( :mad:
Código:

var
  i : integer;
begin
  i := 0;
  // Si  Fields[0].FieldName = 'Indice' (supongamos)
  // entonces no entra y te va a regresar que existe i = 0
  //mala rutina
  while (i <= Table1.Fields.Count - 1) and (Table1.Fields[i].FieldName = 'fax') do
    inc(i);

  if i > Table1.Fields.Count - 1 then
    ShowMessage('no existe')
  else
    ShowMessage('existe');

end;

Bueno la idea es la siguiente que tengas otra TTable que llame a la tabla
que llama fDatamodulo.tbproveedor pero sin campos persistentes, (supongamos que
la tabla se llama proveedor.db) puedes tener una ttable que se llame tbLibre y
a la hora que quieras probar eso entonces :

Código:

Function SeEncuentraCampo : Boolean;
Var
        I : Integer;
Begin
        Result := False;
  fDatamodulo.tbLibre.Close //por si esta abierta por algun lado
        fDatamodulo.tbLibre.TableName := 'proveedor.db';
        fDatamodulo.tbLibre.Open;
        While (I <= fDatamodulo.tbLibre.Fields.Count-1) And (Not Result) Do
                If fDatamodulo.tbLibre.Fields[i].FieldName = 'fax' Then
                  Result := True
    Else
            Inc(I);
  fDatamodulo.tbLibre.Close;
End;

Ahora si vas a usar esto para varias tablas solo hay que hacer unas pequeñas
modificaciones a lo anterior :

Código:

Function SeEncuentraCampo(NomTab,Campo : String) : Boolean;
Var
        I : Integer;
Begin
        Result := False;
  fDatamodulo.tbLibre.Close //por si esta abierta por algun lado
        fDatamodulo.tbLibre.TableName := NomTab;
        fDatamodulo.tbLibre.Open;
        While (I <= fDatamodulo.tbLibre.Fields.Count-1) And (Not Result) Do
                If fDatamodulo.tbLibre.Fields[i].FieldName = Campo Then
                  Result := True
    Else
            Inc(I);
  fDatamodulo.tbLibre.Close;
End;

entonces ya en el procedimiento grande

Código:

  if  SeEncuentraCampo('proveedor.db','fax') then
  Begin
      fDatamodulo.tbproveedor.open;   
    .
    .
  end
  Else
    ShowMessage('No existe el campillo');


Saludos desde Puebla Mexico
[email protected]


La franja horaria es GMT +2. Ahora son las 01:48:57.

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