Fórum Importar arquivo txt com Delimitador | com campos vazios #572764

15/12/2016

0

Boa tarde pessoal,

Hoje estava fazendo uma integração com o meu sistema e preciso ler alguns arquivos de texto dentro de uma pasta e importar para meu sistema, as linhas são delimitadas separando assim seus campos, segue abaixo exemplo;

18|4|08.370.499/0001-30||||||3501608|1|A S MANTOVANI SUPERMERCADO - ME|SUPERMERCADO PEROLA|J||| ||||||R URUGUAI|JARDIM GIRASSOL|

Porem quando eu vou ler um campo que está vazio " Em branco " ele pula para o próximo campo, exemplo indice[0] = 18, indice[1] = 4, indice[2] = 08.370.499/0001-30, indice[3] ele já pula os campos |||||| e vai direto para o 3501608, e a importação acaba não dando certo.

Se alguém puder me ajudar eu agradeço!

Segue abaixo código que estou usando;

procedure Tfrmcarga.ImportarDados;
var
e:TextFile;
linha, dir:String;
Arquivos :TStringList;
j:Integer;
begin
Arquivos:= TStringList.Create;
dir := Caminhoimportacao;
FileListBox1.Directory := dir;
FileListBox1.Mask := '*.txt';

for J := 0 to FileListBox1.Count - 1 do
Begin
AssignFile(e, dir+'\\'+FileListBox1.Items.Strings[J]);
Reset(e); //abre o arquivo para leitura;

While not eof(e) do begin
Arquivos.Clear;
Readln(e,linha);
ExtractStrings(['|'], [], PChar(Linha),Arquivos);

if Arquivos[0] = '18' then
begin
with QinsCapa do
begin
Close;
SQL.Clear;
SQL.Add('insert into pedidos(COD_EMP, DATA, COD_VENDEDOR, COD_FORNECEDOR, ' +
'VENDA, DESCONTO, TOTAL, FORMAPG, COD_PEDIDO, CANCELADO, MOTIVO, ROMANEIO, ' +
'CNPJ, OBS, OBS2, COD_CLI, FRETE_CONTA, END_ENTREGA, COD_TPV, COD_TRA, ' +
'VALOR_FRETE, VR_FRETE_NA_FATURA, DATA_ENTREGA)values' +
'(:COD_EMP, :DATA, :COD_VENDEDOR, null, null, :DESCONTO, :TOTAL, :FORMAPG, ' +
':COD_PEDIDO, null, null, null, :CNPJ, :OBS, null, :COD_CLI, :FRETE_CONTA, ' +
':END_ENTREGA, :COD_TPV, null, null, null, null)');
ParamByName('COD_EMP').AsInteger := 1;
ParamByName('DATA').AsDate := StrToDate(FormatDateTime('dd/mm/yyyy',StrToDate(Arquivos[14])));
ParamByName('COD_VENDEDOR').AsInteger := StrToInt(Arquivos[10]);
ParamByName('DESCONTO').AsFloat := StrToFloat(Arquivos[40]);
ParamByName('TOTAL').AsFloat := StrToFloat(Arquivos[32]);

Qaux.Close;
Qaux.SQL.Clear;
Qaux.SQL.Add('select f.descricao from formas_pagamento f where f.codigo =:codigo');
Qaux.ParamByName('codigo').AsInteger := StrToInt(Arquivos[3]);
Qaux.Open;

ParamByName('FORMAPG').AsString := Qaux.FieldByName('descricao').AsString;
ParamByName('COD_PEDIDO').AsInteger := StrToInt(Arquivos[2]);
ParamByName('CNPJ').AsString := Arquivos[8];
ParamByName('OBS').AsString := Arquivos[37];

Qaux.Close;
Qaux.SQL.Clear;
Qaux.SQL.Add('select cod_cli from cliente where cnpj_cli =:cnpj');
Qaux.ParamByName('cnpj').AsString := Arquivos[8];
Qaux.Open;

ParamByName('COD_CLI').AsInteger := Qaux.FieldByName('cod_cli').AsInteger;
ParamByName('FRETE_CONTA').AsInteger := 0;
ParamByName('END_ENTREGA').AsString := 'P';
ParamByName('COD_TPV').AsInteger := StrToInt(Arquivos[4]);
ExecSQL;

IBTR.CommitRetaining;
end;
end;
End;
End;

ShowMessage('Ok');

Closefile(e);
End;
Softsan Software

Softsan Software

Responder

Posts

19/12/2016

Marco Antônio

Bom dia.
Não usei ''ExtractStrings'' e sim defini um delimitador, utilizando o seu exemplo deu certo.
Segue como fiz:

....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
....

Ao acessar cada indice verá que não vai pular nenhum campo e mostrará apenas valores vazios qdo não houver nada.

Para os campos que poderão vir vazios e no teu banco está definido como inteiro sugiro a usar da seguinte forma:
ParamByName(''COD_TPV'').AsInteger := StrToIntDef( Arquivos[4] , 0 ); // colocando valor defaul ''0'' qdo ñ puder converter em ''Inteiro''.


Abcs.
Responder

Gostei + 0

19/12/2016

Marco Antônio

Opa:
....
Readln(e,linha);
Arquivos.Clear;
Arquivos.LineBreak := ''|'';
Arquivos.Text := linha; // faltou mencionar essa parte.
....

abcs
Responder

Gostei + 0

20/12/2016

Roberto Wutke

Falaaaa jovem, td bom???

Então, existe uma propriedade do Delphi que é o SplitString, basicamente o que ele faz... ele pega a sua string e joga para uma variável que será do tipo arrayString... ai vc pode usar os índices dela para acessar os valores. Ai quando for vazio, aquele indice recebe vazio, ou seja, vc não vai mais ter esses problemas.

http://www.clipatecinformatica.com.br/2014/09/usando-funcao-splitstring-do-delphi.html

esse link tem um tutorial muito bacana de como utilizar e o que deve ser declarado para funcionar....

Espero ter ajudado.
Responder

Gostei + 0

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

Aceitar