Ok, gostei de sua proposta.
Mas eu pego o maior valor somente no inicioe n�o para
cada linha de arquivo, isso para gerarum registro de
controle que � uma lista ai eu realizou um insert ou
update dependendo da sele��o da importa��o , se � uma
lista nova ou acrescentando em ja existente.
Depois sim eu fa�o um insert para cada linha do
arquivo lido , mas gostei de sua proposta e vou
implementa-la

obrigado 
Aldinei
--- Demian Lessa <[EMAIL PROTECTED]> escreveu:

> 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
> 
=== message truncated ===



        
        
                
____________________________________________________
Yahoo! Mail, cada vez melhor: agora com 1GB de espa�o gr�tis! 
http://mail.yahoo.com.br


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