|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
leo092004 Novato
Registrado: Sábado, 24 de Outubro de 2020 Mensagens: 3
|
Enviada: Sáb Out 24, 2020 4:57 pm Assunto: EStringListError |
|
|
Estou com problema, estou importando um arquivo TXT separados por '|', na hora de gravar no banco ele da erro de classe exceção..
LIst index (32) out of bounds.
segue abaixo meu código:
desde já obrigado!
Código: | procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
end;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
txt: TextFile;
quebra: TStringList;
arq: string;
begin
quebra:=TStringList.Create;
AssignFile(txt,edit1.Text);
Reset(txt);
while not EOLn(txt) do
begin
quebra.Clear;
ReadLn(txt,arq);
ExtractStrings(['|'],[],PChar(arq), quebra);
with ZQuery1 do;
begin
zQuery1.SQL.Clear;
ZQuery1.SQL.Add('insert into c170(ZQuery1REG,ZQuery1NUM_ITEM,ZQuery1COD_ITEM,ZQuery1DECR_COMPL,ZQuery1QTD,ZQuery1UNID,ZQuery1VL_ITEM,ZQuery1VL_DESC,ZQuery1IND_MOV,ZQuery1CST_ICMS,ZQuery1CFOP,ZQuery1COD_NAT,ZQuery1VL_BC_ICMS,ZQuery1ALIQ_ICMS,ZQuery1VL_ICMS,ZQuery1VL_BC_ICMS_ST,ZQuery1ALIQ_ST,ZQuery1VL_ICMS_ST, ZQuery1IND_APUR, ZQuery1CST_IPI,ZQuery1COD_ENQ,ZQuery1VL_BC_IPI,ZQuery1ALIQ_IPI, ZQuery1VL_IPI, ZQuery1CST_PIS,ZQuery1VL_BC_PIS,ZQuery1ALIQ_PIS,ZQuery1QUANT_BC_PIS,ZQuery1ALIQ_PIS2, ZQuery1VL_PIS,ZQuery1CTS_COFINS,ZQuery1VL_BC_COFINS,ZQuery1ALIQ_COFINS,ZQuery1QUANT_BC_COFINS,ZQuery1ALIQ_COFINS2, ZQuery1VL_COFINS,ZQuery1COD_CTA) values ('+
quebra.Strings[1]+','+
quebra.Strings[2]+','+
quebra.Strings[3]+','+
quebra.Strings[4]+','+
quebra.Strings[5]+','+
quebra.Strings[6]+','+
quebra.Strings[7]+','+
quebra.Strings[8]+','+
quebra.Strings[9]+','+
quebra.Strings[10]+','+
quebra.Strings[11]+','+
quebra.Strings[12]+','+
quebra.Strings[13]+','+
quebra.Strings[14]+','+
quebra.Strings[15]+','+
quebra.Strings[16]+','+
quebra.Strings[17]+','+
quebra.Strings[18]+','+
quebra.Strings[19]+','+
quebra.Strings[20]+','+
quebra.Strings[21]+','+
quebra.Strings[22]+','+
quebra.Strings[23]+','+
quebra.Strings[24]+','+
quebra.Strings[25]+','+
quebra.Strings[26]+','+
quebra.Strings[27]+','+
quebra.Strings[28]+','+
quebra.Strings[29]+','+
quebra.Strings[30]+','+
quebra.Strings[31]+','+
quebra.Strings[32]+','+
quebra.Strings[33]+','+
quebra.Strings[34]+','+
quebra.Strings[35]+','+
quebra.Strings[36]+','+
quebra.Strings[37]+')');
ZQuery1.ExecSQL;
end;
CloseFile(txt);
quebra.Free;
ShowMessage('Arquivo importado!');
end;
end;
end. |
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Out 26, 2020 9:29 am Assunto: |
|
|
Bom dia,
Esse erro deve estar ocorrendo porque pelo menos uma das linhas do arquivo texto não possui 33 campos (como o primeiro índice da TStringList é zero, o índice 32 da mensagem de erro aponta para a lniha 33).
Não sei se é necessário no seu caso mas você pode utilizar a propriedade Count da TStringList para verificar a quantidade de valores que foram extraídos da linha do texto.
Espero que ajude
Editado pela última vez por imex em Dom Out 01, 2023 5:42 pm, num total de 2 vezes |
|
Voltar ao Topo |
|
|
leo092004 Novato
Registrado: Sábado, 24 de Outubro de 2020 Mensagens: 3
|
Enviada: Qua Out 28, 2020 2:24 pm Assunto: |
|
|
Obrigado pela resposta..
Consegui resolver..
Mas agora eu vi um problema que não havia previsto antes..
o arquivo que estou importando é com delimitador, ou seja no espaço de cada delimitador deve ser uma coluna no banco..
o problema é que quando o meu código lê "||" ele elimina essa coluna e acaba trazendo a próxima coluna para onde não deveria.
Ou seja preciso fazer q o codigo entenda que "||" é uma coluna..
segue conteúdo do txt
|C170|1|100015658|COISA|210|UN|314,7|||500|1102|1|314,7|18|56,64||||||||||50|315,51|1,65|0|0|5,21|50|315,51|7,6|0|0|23,98|1130101|0|
|C170|1|100015658|COISA|210|UN|314,7|||500|1102|1|314,7|18|56,64||||||||||50|315,51|1,65|0|0|5,21|50|315,51|7,6|0|0|23,98|1130101|0|
|C170|1|100015658|COISA|210|UN|314,7|||500|1102|1|314,7|18|56,64||||||||||50|315,51|1,65|0|0|5,21|50|315,51|7,6|0|0|23,98|1130101|0|
|C170|1|100015658|COISA|210|UN|314,7|||500|1102|1|314,7|18|56,64||||||||||50|315,51|1,65|0|0|5,21|50|315,51|7,6|0|0|23,98|1130101|0|
e codigo como ele esta..
procedure TForm1.Button1Click(Sender: TObject);
var
DataFile : TextFile;
lineFile : String;
fileStrings : TStringList;
begin
OpenDialog1.Execute;
if FileExists(OpenDialog1.FileName) then
begin
AssignFile(DataFile, OpenDialog1.Filename);
Reset(DataFile);
try
fileStrings := TStringList.Create;
try
while not EOF (DataFile) do
begin
Readln(DataFile, lineFile);
ExtractStrings(['|'],[],PChar(lineFile),fileStrings);
with Query do
Begin
Insert;
QueryREG.AsString :=fileStrings[0];
QueryNUM_ITEM.AsInteger :=StrToInt(fileStrings[1]);
QueryCOD_ITEM.AsString :=fileStrings[2];
QueryDECR_COMPL.AsString :=fileStrings[3];
QueryQTD.AsString :=fileStrings[4];
QueryUNID.AsString :=fileStrings[5];
QueryVL_ITEM.AsString :=fileStrings[6];
QueryVL_DESC.AsString :=fileStrings[7];
QueryIND_MOV.AsString :=fileStrings[8];
QueryCST_ICMS.AsString :=fileStrings[9];
QueryCFOP.AsString :=fileStrings[10];
QueryCOD_NAT.AsString :=fileStrings[11];
QueryVL_BC_ICMS.AsString :=fileStrings[12];
QueryALIQ_ICMS.AsString :=fileStrings[13];
QueryVL_ICMS.AsString :=fileStrings[14];
QueryVL_BC_ICMS_ST.AsString :=fileStrings[15];
QueryALIQ_ST.AsString :=fileStrings[16];
QueryVL_ICMS_ST.AsString :=fileStrings[17];
QueryIND_APUR.AsString :=fileStrings[18];
QueryCST_IPI.AsString :=fileStrings[19];
QueryCOD_ENQ.AsString :=fileStrings[20];
QueryVL_BC_IPI.AsString :=fileStrings[21];
QueryALIQ_IPI.AsString :=fileStrings[22];
QueryVL_IPI.AsString :=fileStrings[23];
QueryCST_PIS.AsString :=fileStrings[24];
QueryVL_BC_PIS.AsString :=fileStrings[25];
QueryALIQ_PIS.AsString :=fileStrings[26];
QueryQUANT_BC_PIS.AsString :=fileStrings[27];
QueryALIQ_PIS2.AsString :=fileStrings[28];
QueryVL_PIS.AsString :=fileStrings[29];
QueryCTS_COFINS.AsString :=fileStrings[30];
QueryVL_BC_COFINS.AsString :=fileStrings[31];
QueryALIQ_COFINS.AsString :=fileStrings[32];
QueryQUANT_BC_COFINS.AsString :=fileStrings[33];
QueryALIQ_COFINS2.AsString :=fileStrings[34];
QueryVL_COFINS.AsString :=fileStrings[35];
QueryCOD_CTA.AsString :=fileStrings[36];
Query.Post;
Query.ApplyUpdates;
end;
fileStrings.Clear;
end;
finally
fileStrings.Free;
end;
finally
CloseFile(DataFile);
end;
end;
ShowMessage('Importado!');
end; |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Out 28, 2020 4:11 pm Assunto: |
|
|
Pelo que vi a função ExtractStrings não adiciona strings em branco na lista.
Tente fazer um teste utilizando a TStringList para obter os valores separados sem a função ExtractStrings. Ex:
Código: | try
fileStrings := TStringList.Create;
fileStrings.Delimiter := '|';
fileStrings.StrictDelimiter := true;
try
while not EOF (DataFile) do
begin
Readln(DataFile, lineFile);
// ExtractStrings(['|'],[],PChar(lineFile),fileStrings);
fileStrings.DelimitedText := Copy(lineFile, 2, Length(lineFile) - 2);
|
A função Copy foi utilizada no código acima para obter a string do arquivo texto sem o primeiro e o último delimitador. É possível remover esse Copy do código, mas será adicionada uma linha em branco a mais no início e no fim da lista.
Espero que ajude |
|
Voltar ao Topo |
|
|
leo092004 Novato
Registrado: Sábado, 24 de Outubro de 2020 Mensagens: 3
|
Enviada: Qui Out 29, 2020 9:02 pm Assunto: |
|
|
Amigo, muito obrigado!!
Ficou perfeito..
Sou novo ainda na programação espero um dia retribuir a mesma ajuda que recebi..
Obrigado! |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|