[delphi-br] Importação ignora 1ª linha do arquivo

2010-07-23 Por tôpico Ralp Alves Bezerra
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

Re: [delphi-br] Importação ignora 1ª linha do arquivo

2010-07-23 Por tôpico Cláudio Duarte S . Moraes
 Na parte:

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);

 como sao os itens do ClientDataSet, entao, faca:

for i := 0 to Count(fCdsDadosTratados.FieldDefs)-1 do

e por ai vai.



***
*** Cláudio Duarte S. de Moraes ***
**   Gerente de T. I.   ***
***  Magazine Sapatos   ***
**    (82) 2121-0323    ***
**    (82) 9101-7609***
** skype: claudio.dsm**
***


--- Em sex, 23/7/10, Ralp Alves Bezerra ral...@gmail.com escreveu:

 De: Ralp Alves Bezerra ral...@gmail.com
 Assunto: [delphi-br] Importação ignora 1ª linha do arquivo
 Para: delphi-br@yahoogrupos.com.br
 Data: Sexta-feira, 23 de Julho de 2010, 10:11
 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