PDA

Ver la Versión Completa : Como averiguar si hay un campo en la Db


Jose Manuel
23-08-2003, 11:39:43
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


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:

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 :


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 :


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


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



Saludos desde Puebla Mexico
asanxt@hotmail.com