Hola.
Yo ahora estoy en la tarea de pasar mis aplicaciones a la versión Berlin de delphi y uno de los problemas que me he encontrado es la creación y manipulación de tablas .DBF. al final he optado por usar ADO y creo que va bastante bien y no tienes que instalar componentes externos. Te paso la función con la que creo la tabla por si te sirve de ayuda.
Código Delphi
[-]
procedure CreaTablaDBF(Panel: Smallint; CamposTabla: TStringList; CampoTabla: String; Creada: Boolean);
var
Path,NombreTabla,Parametros: String;
i: Smallint;
ConnStringDBF: String;
begin
if not Creada then begin
if CampoTabla = 'VACIO' then begin
ConnStringDBF := 'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=%s;';
NombreTabla := ExtractFileName(EditFichero.Text);
Path:=ExtractFilePath(EditFichero.Text);
Path:=Copy(Path,1,Length(Path)-1);
if Trim(NombreTabla) = '' then NombreTabla := 'Salida.dbf';
if UpperCase(Trim(ExtractFileExt(NombreTabla))) = '' then begin
NombreTabla := NombreTabla + '.DBF';
end else if UpperCase(Trim(ExtractFileExt(NombreTabla))) <> '.DBF' then begin
ShowMessage('Si se especifica extension DEBE ser DBF.');
Exit;
end;
if Length(ExtractFileName(NombreTabla)) > 12 then begin
ShowMessage('Se debe especificar un nombre de fichero de longitud inferior a 8 caracteres.');
Exit;
end;
if not FileExists(ExtractFilePath(EditFichero.Text)+NombreTabla) then begin
ADOConnDBF := TADOConnection.Create(nil);
ADOConnDBF.LoginPrompt := False;
ADOConnDBF.ConnectionString := Format(ConnStringDBF, [Path]);
ADOCommand := TADOCommand.Create(nil);
ADOCommand.Connection := ADOConnDBF;
Parametros:= 'Create Table ' + NombreTabla + ' (';
for i:=Low(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) to High(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) do begin
case ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento[i].TipoCampo of
teCadena: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CHAR('+IntToSTr(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento[i].Longitud)+'),';
teEntero: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' INTEGER,';
teReal: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CURRENCY,';
teHora: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CHAR(5),';
teFecha: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' DATE,';
teMoneda: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CURRENCY,';
teLogico: Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CHAR(1),';
else Parametros:=Parametros+'CAMPO_'+IntToStr(i)+' CHAR(255),';
end;
end; Parametros:= Copy(Parametros,1,Length(Parametros)-1)+')';
ADOCommand.CommandText := Parametros;
ADOCommand.Execute;
if ExtractFileName(EditFichero.Text) = '' then begin
NombreTabla := 'Salida.dbf';
end else begin
if UpperCase(Trim(ExtractFileExt(EditFichero.Text))) = '' then begin
NombreTabla := ExtractFileName(EditFichero.Text) + '.DBF';
end else begin
NombreTabla := ExtractFileName(EditFichero.Text);
end;
end;
NombreTabla := ExtractFilePath(EditFichero.Text) + NombreTabla;
ADOTable:=TADOTable.Create(nil);
ADOTable.Connection := ADOConnDBF;
ADOTable.TableName := ExtractFileName(EditFichero.Text);
ADOTable.Open;
end; end; end else begin
Try
ADOTable.append;
try
for i:=Low(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) to High(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) do begin
ADOTable.FieldByName('CAMPO_' + IntToStr(i)).AsString := CamposTabla[i];
end; finally
ADOTable.Post;
end;
finally
CamposTabla.Clear;
end;
end;
end;
Saludos