Nossa! Para cada linha do arquivo você: 1) Abre um dataset para pegar o maior valor de um campo; 2) Executa uma inclusão (INSERT); 3) Executa uma alteração (UPDATE);
Além do seu código não ser seguro do ponto de vista da integridade dos dados (porque você está gerando o código do novo registro no lado do cliente), é extremamente lento. Observações: 1) Todo loop intensivo em dados ou processamento deve chamar o Application.ProcessMessages ao final de cada interação para que o aplicativo continue "respondendo" e os demais aplicativos no SO tenham chance de reagir. Windows preemptivo é lenda urbana! ;) 2) Você pode encapsular todo seu código diretamente no banco, o que faria isso tudo mais seguro, rápido e, provalvemente, íntegro. Basta criar uma STORED PROCEDURE que receba todos os parâmetros necessários e transferir sua lógica de dados para o banco. 3) Outra alternativa que eu gosto bastante é quebrar a operação logicamente entre leitura do arquivo e operação com os dados. Na leitura do arquivo, você pode montar todos os SQLs necessários, colocando-os em listas de strings separadas (para cada uma de suas três operações de dados). Depois de processado e fechado o arquivo texto, você varre as listas geradas para alterar o banco. Você terá seu processo otimizado ao máximo se combinar as opções 1, 2 e 3. Ficaria algo como: a) crie a STORED PROCEDURE sugerida; b) altere a lógica de seu código: b.1) abra o arquivo; b.2) para cada linha do arquivo, monte o SQL de chamada da STORED PROCEDURE, acrescente-o a uma lista de strings e chame a rotina Application.ProcessMessages; b.3) feche o arquivo; b.4) para cada linha da lista com os SQLs, atribua o comando a uma consulta, execute-a e chame a rotina Application.ProcessMessages; Assim, você otimiza a leitura do arquivo, que fica aberto bem menos tempo já que todo o processamento desse loop é realizado em memória e consiste exclusivamente em montar strings de comando SQL. Em seguida, você faz apenas acesso a dados. Como estará usando STORED PROCEDURE, o banco otimizará cada chamada e você ficará com um tempo de resposta final bem melhor do que tem atualmente. E tudo isso com seu aplicativo sem parecer que está travando a máquina. Você pode criar suas próprias variações desses mecanismos- seja criativo e experimente, se tiver tempo. Na minha experiência, já tendo migrado para banco arquivos texto com mais de 50MB onde as linhas representavam dados de tabelas distintas, dependentes dos dados anteriores (relação mestre-detalhe em 3 níveis), cheguei à conclusão de que essa é a forma mais eficiente de fazer. Cordialmente, Demian Lessa Salvador - Brasil aldinei simoes wrote: > Minha rotina é esta abaixo , exitem algumas variaveis > que não são mais usadas > > var f : textfile; > > S,ser,dt,vend,tipo_erro,campos,valores,par,vr,vrpar,cps: > string; > > total,cont,it,contr,dig,fi,cli,cli1,log,i,contem,tel1 > : integer; > erro_lista, erro_log : integer; > erro : boolean; > erros : Tstringlist; > begin > erros := TStringList.Create; > erro_lista := 0; > erro_log := 0; > assignfile(f,edit1.Text); > reset(f); > readln(f); > while not eof(f) do > begin > inc(total); > readln(f); > end; > cps := > '(COD_CLIENTE,DIAS_PROX_AGEND,DD_IND,ORIGEM_CAD'; > sgsel.RowCount := sgsel.RowCount-1; > fi := 0; > for it := 1 to sgsel.RowCount-1 do begin > cps := cps+','+trim(sgsel.Cells[0,it]); > end; > if rbnova.Checked then begin > dm.sqlGeral.Close; > dm.sqlGeral.sql.Clear; > dm.sqlGeral.SQL.Add('select max(CODIGO) as COD > from TLISTA'); > dm.sqlGeral.Prepared := true; > dm.sqlGeral.Open; > lista := 1; > if dm.sqlGeral.FieldValues['COD'] > 0 then > lista := dm.sqlGeral.FieldValues['COD']+1; > dt := > copy(datetostr(date),1,2)+'.'+copy(datetostr(date),4,2)+'.'+ > copy(datetostr(date),7,4); > dm.sqlGeral.Close; > dm.sqlGeral.sql.Clear; > dm.sqlGeral.SQL.Add('INSERT INTO TLISTA > (CODIGO,DESCRICAO,DATA_INICIO,'+ > > 'REGISTROS,POSICAO,CAMPANHA)'); > dm.sqlGeral.SQL.Add('VALUES > ('+QuotedStr(inttostr(lista))+','); > > dm.sqlGeral.SQL.Add(QuotedStr(elista.text)+','+QuotedStr(dt)+','); > > dm.sqlGeral.SQL.Add(QuotedStr(inttostr(total))+','); > dm.sqlGeral.SQL.Add(QuotedStr('A')+','); > > dm.sqlGeral.SQL.Add(QuotedStr(lcbcampanha.KeyValue)+')'); > dm.sqlGeral.ExecSQL; > end else begin > lista := dm.tblistaCODIGO.Value; > dm.sqlGeral.Close; > dm.sqlGeral.sql.Clear; > dm.sqlGeral.SQL.Add('UPDATE TLISTA SET > REGISTROS='); > dm.sqlGeral.SQL.Add(QuotedStr(inttostr(total))); > dm.sqlGeral.SQL.Add('where > CODIGO='+QuotedStr(inttostr(lista))); > dm.sqlGeral.ExecSQL; > end; > closefile(f); > gauge1.Progress := 0; > reset(f); > readln(f,s); > contr := 0; > while not eof(f) do begin > inc(contr); > campos := cps; > valores := ''; > inc(log); > readln(f,s); > inc(cont); > label3.Repaint; > Gauge1.Progress := round(cont/total*100); > Gauge1.Repaint; > it := length(s); > ser := ''; > fi := 1; > for dig := 1 to it do begin > if copy(s,dig,1) = ';' then begin > contem := strtoint(sgsel.Cells[1,fi]); > if contem > 0 then begin > ser := copy(ser,1,contem); > end; > if copy(s,dig-1,1) = ';' then > valores := valores+','+QuotedStr('0') > else > valores := valores+','+QuotedStr(ser); > ser := ''; > inc(fi); > end else > ser := ser + copy(s,dig,1); > end; > if copy(s,dig-1,1) = ';' then begin > valores := valores+','+QuotedStr('0'); > end else begin > valores := valores+','+QuotedStr(ser); > end; > try > campos := campos+',SITUACAO)'; > valores := > '('+QuotedStr('0')+','+QuotedStr(inttostr(lista))+','+ > > QuotedStr(lcbcampanha.KeyValue)+','+QuotedStr(edit3.Text)+ > valores+','+QuotedStr('A')+')'; > dm.sqlGeral.Close; > dm.sqlGeral.sql.Clear; > dm.sqlGeral.SQL.Add('INSERT INTO TLOG_IMPORT > '+campos+' VALUES '+valores); > dm.sqlGeral.ExecSQL; > except > On E: Exception do Begin > erros.Add(Pchar(Format('Erro log : ' + #13+ > 'Msg: %s' + #13 + > 'Classe: %s',[E.Message, > E.ClassName]))); > erros.Add(campos); > erros.Add(valores); > inc(erro_log); > end; > end; > if contr = 250 then begin > F_import.Repaint; > sleep(5000); > contr := 0; > end; > end; > closefile(f); > erros.Add('Erros no log '+inttostr(erro_log)); > erros.SaveToFile('erros.txt'); > erros.Free; > dm.SP_IMPORTA.ExecProc; > > --- Demian Lessa <[EMAIL PROTECTED]> escreveu: > >>Sim, mostre pra gente sua rotina de leitura e >>processamento do arquivo. >> >>Cordialmente, >> >>Demian Lessa >>Salvador - Brasil >> >>Aldinei Simoes wrote: >> >>>Percebi que o problema esta na leitura do arquivo >> >>texto e não na base, >> >>>tem algo que eu possa fazer? >>> >>>Aldinei -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html