Ver Mensaje Individual
  #7  
Antiguo 09-03-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Reputación: 21
newtron Va camino a la fama
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
        //Cadena de conexión
        ConnStringDBF := 'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=%s;';

        //Nombre de la Tabla
        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;
          //Creamos la Tabla de salida
          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; // with TablaDbf do begin
          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; //if FileExist
      //
      end; //if CampoTabla = 'VACIO'
    //
    end else begin
    //
      Try
      //
        ADOTable.append;
        try
          for i:=Low(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) to High(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento) do begin
//          TablaSalida.FieldByName(ImpresoAnverso.SeccionPaneles.Panel[Panel].Elemento[i].Campo).AsString := CamposTabla[i];
            ADOTable.FieldByName('CAMPO_' + IntToStr(i)).AsString := CamposTabla[i];
          end; //for
//        TablaSalida.Post;
        finally
          ADOTable.Post;
        end;
      finally
      //
        CamposTabla.Clear;
      end;

    end; //if not Creada

  end;

Saludos
__________________
Be water my friend.
Responder Con Cita