PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Não importa a 1ª linha do arquivo #382040

23/07/2010

0

Nobres colegas,

Estou tendo um problema com a importação da 1ª linha de um arquivo.

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:=fCdsDadosTratados.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.

Ralp Bezerra

Ralp Bezerra

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar