Página 1 de 2

Barra Progressiva

Enviado: 04 Out 2011 10:00
por braz
Ola Pessoal, alguem teria o fonte de BARRA PROGRESSIVA para indexação de arquivos para me dar?

Procurei no forum e nao encontrei, no site do sr.Toledo tem na seção DOWNLOADS, mas está com problemas e não faz download.

obrigado

Barra Progressiva

Enviado: 04 Out 2011 11:54
por SandroBelarmino
Tente isso:
Na linha do comando Index:

Código: Selecionar todos

index on codigo to arqui.ntx EVAL pinta()
A Funcao Pinta() é onde será pintada a barra de progresso:

Código: Selecionar todos

function pinta
LOCAL cCompleto:=ltrim(str((recno()/lastrec())*100))
@ 13,53 SAY recno() PICT '999999'  && aqui vai mostrar o registro atual que está sendo indexado
WC:=INT(((40*recno())/lastrec()))
@ 11,20 say repli(' ',wc)  && Aqui vai pintando a barra na tela.
return .t.
Você só precisa desenhar a tela de acordo.

Abraço.

Barra Progressiva

Enviado: 04 Out 2011 15:41
por braz
Valeu Sandro, deu certo, so vou dar uma PINTADA nele.[

Abraços :)) :))

Barra Progressiva

Enviado: 04 Out 2011 17:08
por SandroBelarmino
Ah sim, como eu disse, agora é só dar uma ajeitada na tela.

Barra Progressiva

Enviado: 04 Out 2011 21:52
por ANDRIL
Só lembrando que se usar funcoes de barra de progressao na criacao de indice, fara que haja mais demora, justamente por ter que manipular dados na tela durante sua criação. Se for em tabelas grandes, veja se compensa, não se esqueça que neste caso, a prioridade é sempre do desempenho.

Abraços

Barra Progressiva

Enviado: 05 Out 2011 09:42
por braz
É verdade Andril, ficou BEMMM mais demorada a indexação.

Eu retirei a primeira linha da funct pinta, deu uma melhorada ja.

Abraços :{

Barra Progressiva

Enviado: 05 Out 2011 10:33
por SandroBelarmino
ANDRIL escreveu:Só lembrando que se usar funcoes de barra de progressao na criacao de indice, fara que haja mais demora, justamente por ter que manipular dados na tela durante sua criação. Se for em tabelas grandes, veja se compensa, não se esqueça que neste caso, a prioridade é sempre do desempenho.

Abraços
Nos clientes onde o sistema tem a base de dados com um numero muito grande de registros, eu não uso a barra progressiva na indexação.

Barra Progressiva

Enviado: 05 Out 2011 18:25
por Eolo
Eu melhorei este problema de velocidade fazendo o seguinte:

Código: Selecionar todos

priv totalrec:=lastrec() // só roda uma vez
priv conta:=0
priv lote:=int(totalrec*0.03)
index on codigo to arqui.ntx EVAL pinta()

Código: Selecionar todos

function pinta
conta++
if conta=1 .or. conta=totalrec .or. (conta%lote)=0
  * só faz o SAY quando completar um LOTE, ou quando for o primeiro/último registros 
  @say // constrói a barra
  @say // tran(conta/totalrec*100,"@E 999.9%") // mostra o percentual
endi
Em um DBF com 1.000 registros, o SAY só vai rodar a cada 30 registros; se forem 100.000 registros, a cada 3.000 etc. Isto torna tudo bem mais rápido e não prejudica a barra. E, se o arquivo for muito grande e a barra demorar a se mover, o percentual (com 1 decimal) ajuda a mostrar que a coisa está caminhando.

Agora, vc pode alterar esses 0.03 do 'lote', tendo um valor para cada tamanho de DBF.

Barra Progressiva

Enviado: 05 Out 2011 18:39
por alxsts
Olá!

Não se esqueçam da cláusula EVERY do comando INDEX ON. Exemplo:

Código: Selecionar todos

        #define MTR_INCREMENT   10

        USE Customer NEW
        INDEX ON Customer->Acct TO CuAcct EVAL ;
              {|| MYMETER() } EVERY MTR_INCREMENT

        FUNCTION MYMETER()

           STATIC nRecsDone := 0

           nRecsDone := += MTR_INCREMENT
           ? ( nRecsDone/LASTREC() ) * 100

           RETURN (.T.)

Barra Progressiva

Enviado: 06 Out 2011 08:34
por SandroBelarmino
Seguindo o exemplo do Alexandre, tenho em alguns programas da seguinte maneira:

Código: Selecionar todos

index on codigo to arqntx EVAL pinta() EVERY LASTREC()/10  
dessa forma somente vai mostrar o progresso a cada 10 %.

Barra Progressiva

Enviado: 06 Out 2011 13:38
por alxsts
Olá!

Esse exemplo do Sandro funciona legal. Eu só alteraria uma coisa para melhorar a performance. No exemplo, a função LastRec() é chamada a cada registro. O ideal é executá-la apenas uma vez.

Código: Selecionar todos

LOCAL nTotalRecords := LastRec()

index on codigo to arqntx EVAL ( { || pinta() } ) EVERY nTotalRecords/10  

Barra Progressiva

Enviado: 10 Out 2011 17:13
por JoséQuintas
Eu coloquei pra atualizar o gráfico somente a cada 1 segundo, assim o gráfico não interfere no processamento.
Algo mais ou menos assim:

Código: Selecionar todos

Function Grafico()
Static mTime := "X"

If mTime != Time()
   mTime := Time()
  // Atualiza gráfico
Endif
Return .t.

Barra Progressiva

Enviado: 10 Out 2011 21:39
por lugab
Ola amigos,

Qual dessas contribuições funcionam com .CDX e no harbour ?

Barra Progressiva

Enviado: 11 Out 2011 10:07
por Eolo
Um detalhe que faltou: a função LASTREC() retorna o número total de registros do DBF, não importa se há algum registro deletado. Então, se o DBF tem 100 registros e 2 deletados, LASTREC() retorna 100 e, com isso, a barra vai parar nos 98% nos exemplos acima...

Uma saída é usar o COUNT, para descobrir quantos são os registros ativos, mas demora muito.

O que acabei fazendo foi colocar um "say 100,0%" após o término da indexação, além de completar a barra. Resolve e fica transparente para o usuário.

Barra Progressiva

Enviado: 11 Out 2011 10:30
por JoséQuintas
Com a Six eu usava assim:

Código: Selecionar todos

index on &(cKey) tag (cTag) for &(cFor) option GrafInd(m_RecOk,m_RecTotal)
Com variáveis, porque o gráfico é total, e não individual por arquivo.
Mas usando RecNo().
No modo simples: GrafInd(RecNo(),LastRec())