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.
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)