Nobres colegas, 

 

Recentemente tive um problema com a importação de um arquivo.

 

Com a ajuda dos nobres colegas e o envio de um exemplo pelo Walter, consegui
sanar o problema.

 

A importação foi realizada. Porém, fazendo uma analise mais detalhada, notei
que primeira linha do arquivo nunca é importada. Fica sempre faltando o
primeiro registro do arquivo.

 

Estou postando abaixo o código utilizado. Se alguns dos nobres colegas poder
me ajudar fico grato.

 

Abraço.

 

unit ufAnaliseDados;

 

interface

 

uses

  Classes, Forms, DB, Controls, Grids, DBGrids, DBClient, DBXpress, FMTBcd,

  DBXAutoInc, Provider, SqlExpr, RXCtrls, RXDBCtrl, Buttons, ExtCtrls,

  XiPanel, Dialogs, JvDialogs, XiProgressBar;

 

type

  TfrmSIMNE = class(TForm)

    XiPanel1: TXiPanel;

    btImportar: TSpeedButton;

    dbgDados: TDBGrid;

    DBGrid1: TDBGrid;

    srcDados: TDataSource;

    JvOpenDialog1: TJvOpenDialog;

    Barra: TXiProgressBar;

    procedure btImportarClick(Sender: TObject);

  private

    fDadosTratados: TStringList;

    fCdsDadosTratados: TClientDataSet;

    procedure PrepararDados;

    procedure AnalisarArquivo;

    procedure CriarDataSet;

    procedure LiberarDados;

  public

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

  end;

 

var

  frmSIMNE: TfrmSIMNE;

 

implementation

 

uses SysUtils, uDM, uImportaProcesso;

 

{$R *.dfm}

 

{ TfrmAnaliseDados }

 

procedure TfrmSIMNE.CriarDataSet;

var

  i: integer;

  lLinhaDados: TStringList;

begin

  { Cria o ClientDataSet }

  fCdsDadosTratados := TClientDataSet.Create(Self);

 

  { Define os campos que o ClientDataSet terá }

  with fCdsDadosTratados.FieldDefs do

    for i := 1 to 16 do

      Add(Format('Campo%2.2d', [i]), ftString, 40);

 

  { Cria o ClientDataset com os campos definidos }

  fCdsDadosTratados.CreateDataSet;

 

  { Preenche o ClientDataSet com os dados tratados }

  lLinhaDados := TStringList.Create;

  try

    lLinhaDados.Delimiter := ',';

    lLinhaDados.QuoteChar := '"';

    while fDadosTratados.Count > 0 do

    begin

      fCdsDadosTratados.Append;

      lLinhaDados.DelimitedText := fDadosTratados[0];

      for i := 0 to 15 do

        fCdsDadosTratados.Fields[i].AsString := lLinhaDados[i];

      fDadosTratados.Delete(0);

    end;

  finally

    lLinhaDados.Free;

  end;

 

  { Vincula o ClientDataSet ao DataSource associado ao DBGrid }

  srcDados.DataSet := fCdsDadosTratados;

end;

 

procedure TfrmSIMNE.AnalisarArquivo;

var

  lQtde, lCampos: integer;

  lArquivo, lLinhaDados: TStringList;

  sLinhaDados: string;

begin

  If JvOpenDialog1.Execute then

  Begin

    lArquivo := TStringList.Create;

    try

      lArquivo.LoadFromFile(JvOpenDialog1.FileName);

      lCampos := 0;

      lLinhaDados := TStringList.Create;

      try

        lLinhaDados.Delimiter := ',';

        while lArquivo.Count > 0 do

        begin

          sLinhaDados := lArquivo[0];

          lLinhaDados.DelimitedText := sLinhaDados;

          lLinhaDados.QuoteChar := '"';

          lQtde := lLinhaDados.Count;

          if lCampos = 0 then

            lCampos := lQtde

          else if lQtde <> lCampos then

            raise Exception.CreateFmt(

              'Quantidade de campos das linhas de dados é variável.' +

              sLineBreak + sLineBreak +

              sLinhaDados +

              sLineBreak + sLineBreak +

              '(%d <> %d).', [lQtde, lCampos])

          else

            fDadosTratados.Add(sLinhaDados);

          lArquivo.Delete(0);

        end;

      finally

        lLinhaDados.Free;

      end;

    finally

      lArquivo.Free;

    end;

  end;

end;

 

constructor TfrmSIMNE.Create(AOwner: TComponent);

begin

  inherited Create(AOwner);

  PrepararDados;

  AnalisarArquivo;

  CriarDataSet;

end;

 

destructor TfrmSIMNE.Destroy;

begin

  LiberarDados;

  inherited Destroy;

end;

 

procedure TfrmSIMNE.LiberarDados;

begin

  if Assigned(fDadosTratados) then

    fDadosTratados.Free;

  if Assigned(fCdsDadosTratados) then

  begin

    fCdsDadosTratados.Close;

    fCdsDadosTratados.Free;

  end;

end;

 

procedure TfrmSIMNE.PrepararDados;

begin

  fDadosTratados := TStringList.Create

end;

 

procedure TfrmSIMNE.btImportarClick(Sender: TObject);

begin

  DM.cds_SIM601.Open;

  Try

    DM.cds_SIM601.DisableControls;

    fCdsDadosTratados.First;

    fCdsDadosTratados.DisableControls;

    Barra.Position:=0;

    Barra.Max:=fCdsDadosTratados.RecordCount;

    while not fCdsDadosTratados.Eof do

    Begin

        DM.cds_SIM601.Insert;

        DM.cds_SIM601.fieldbyname('Numero_NE').AsString
:=fCdsDadosTratados.Fields[6].AsString;        

        DM.cds_SIM601.fieldbyname('NP_Numero_Sub_Empenho').AsString
:=fCdsDadosTratados.Fields[7].AsString;

        DM.cds_SIM601.fieldbyname('NP_Numero_NP').AsString
:=fCdsDadosTratados.Fields[8].AsString;

        DM.cds_SIM601.fieldbyname('NP_Data_Ref_Doc').AsString
:=fCdsDadosTratados.Fields[9].AsString;

        DM.cds_SIM601.fieldbyname('NP_Num_Doc_Caixa').AsString
:=fCdsDadosTratados.Fields[10].AsString;

        DM.cds_SIM601.fieldbyname('NP_Data_NP').AsString
:=fCdsDadosTratados.Fields[11].AsString;

        DM.cds_SIM601.fieldbyname('NP_Valor_NP').Value
:=StrToFloat(StringReplace(fCdsDadosTratados.Fields[12].AsString, '.', ',',
[]));

 
DM.cds_SIM601.fieldbyname('NP_Num_CPF_Responsavel').AsString:=fCdsDadosTrata
dos.Fields[14].AsString;

        DM.cds_SIM601.fieldbyname('NP_Nome_Resp_Pag').AsString
:=fCdsDadosTratados.Fields[15].AsString;

        DM.cds_SIM601.Post;

        DM.cds_SIM601.ApplyUpdates(0);

        Barra.Position:=Barra.Position+1;

        fCdsDadosTratados.Next;

    end;

  finally

    DM.cds_SIM601.EnableControls;

    fCdsDadosTratados.EnableControls;

    Barra.Position:=0;

    frmImportaProc.lblArquivo.Caption:='Último Arquivo Importado: SIM 604';

    Close;

  end;

end;

end.

 

 



[As partes desta mensagem que não continham texto foram removidas]

Responder a