| 
			
				|  | 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.
 
 |  |