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

 


Responder a