[delphi-br] Importação ignora 1ª linha do arquivo
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
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