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