ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

EStringListError

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
leo092004
Novato
Novato


Registrado: Sábado, 24 de Outubro de 2020
Mensagens: 3

MensagemEnviada: Sáb Out 24, 2020 4:57 pm    Assunto: EStringListError Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Out 26, 2020 9:29 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo092004
Novato
Novato


Registrado: Sábado, 24 de Outubro de 2020
Mensagens: 3

MensagemEnviada: Qua Out 28, 2020 2:24 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Out 28, 2020 4:11 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
leo092004
Novato
Novato


Registrado: Sábado, 24 de Outubro de 2020
Mensagens: 3

MensagemEnviada: Qui Out 29, 2020 9:02 pm    Assunto: Responder com Citação

Amigo, muito obrigado!!

Ficou perfeito..

Sou novo ainda na programação espero um dia retribuir a mesma ajuda que recebi..

Obrigado!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB