I am doing the integration of a system with a banking file, and am having a problem in the process. I get a plain text file with approximately 1300Kb and about 5,500 lines from the credit card company.
I'm reading this file and storing it in a ClientDataSet
, only in memory, I do not insert into the database at any time. However I am finding that the reading process is very slow, since I am able to write at a rate of only 13 lines per second, I do not have much experience with ClientDataSet
and I do not know if this rate is acceptable. p>
To read the file I import the text file to a StringList
, then loop based on the number of lines in the file, importing each record type to its ClientDataSet
(Within the file can have 9 different record types, and each one places a different%%).
Loop in file:
EnableDisableControls(False);
{ Percorre todas as linhas do arquivo verificando o tipo e executando uma rotina para cada tipo de registro. }
for I := 0 to (Extrato.Count - 1) do
begin
CurrentLine := I;
case StrToInt(Copy(Extrato.Strings[I], 01, 01)) of
0: LerHeader;
1: LerRegistroDetalheRO; //Resumo de Operação
2: LerRegistroDetalheCV; //Comprovante de Venda
3: LerRegistroDetalheIDROSA; //Informativo detalhe do RO do Saldo em Aberto
4: LerRegistroDetalheIBSA; //Informativo por bandeira do Saldo em Aberto
5: LerRegistroDetalheIOAR; //Informativo de Operação de Antecipação de Recebíveis
6: LerRegistroDetalheIRODA; //Informações de RO da data antecipada
7: LerRegistroDetalheIDRODA; //Informações de débitos de ROs da data antecipada
9: LerTrailer;
end;
end;
{ Reativar todos os controles após a inserção. }
EnableDisableControls(True);
If the record is of type 2, for example, I call its recording procedure in ClientDataSet
:
procedure ThreadProcessarExtrato.LerRegistroDetalheCV;
begin
with FrmExtratoEletronicoCielo, Extrato, DSDetalheCV.DataSet do
begin
Insert;
FieldByName('TIPO_REGISTRO').AsString := Copy(Strings[CurrentLine], 001, 1);
FieldByName('ESTAB_SUBMISSOR').AsString := Copy(Strings[CurrentLine], 002, 10);
FieldByName('NUMERO_RO').AsString := Copy(Strings[CurrentLine], 012, 7);
FieldByName('NUMERO_CARTAO').AsString := Copy(Strings[CurrentLine], 019, 19);
...
...
...
//Aqui existem muitos outros campos que são atribuídos, retirei para ficar menor...
...
...
...
Post;
Inc(TotalRegistrosCV);
end;
end;
So, any idea how to streamline this process? Or a better way to accomplish this?