Barra Progressiva

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Barra Progressiva

Mensagem 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
SandroBelarmino
Usuário Nível 3
Usuário Nível 3
Mensagens: 464
Registrado em: 04 Set 2007 16:11
Localização: Pedreira-SP

Barra Progressiva

Mensagem 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.
Alessandro R Belarmino
Clipper 5.2e - Blinker 7 - DBFNTX / DBFCDX
"Quem trabalha muito erra muito, quem trabalha pouco erra pouco, quem não trabalha não erra e quem não erra é promovido !!!!"
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Barra Progressiva

Mensagem por braz »

Valeu Sandro, deu certo, so vou dar uma PINTADA nele.[

Abraços :)) :))
SandroBelarmino
Usuário Nível 3
Usuário Nível 3
Mensagens: 464
Registrado em: 04 Set 2007 16:11
Localização: Pedreira-SP

Barra Progressiva

Mensagem por SandroBelarmino »

Ah sim, como eu disse, agora é só dar uma ajeitada na tela.
Alessandro R Belarmino
Clipper 5.2e - Blinker 7 - DBFNTX / DBFCDX
"Quem trabalha muito erra muito, quem trabalha pouco erra pouco, quem não trabalha não erra e quem não erra é promovido !!!!"
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Barra Progressiva

Mensagem 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
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Barra Progressiva

Mensagem 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 :{
SandroBelarmino
Usuário Nível 3
Usuário Nível 3
Mensagens: 464
Registrado em: 04 Set 2007 16:11
Localização: Pedreira-SP

Barra Progressiva

Mensagem 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.
Alessandro R Belarmino
Clipper 5.2e - Blinker 7 - DBFNTX / DBFCDX
"Quem trabalha muito erra muito, quem trabalha pouco erra pouco, quem não trabalha não erra e quem não erra é promovido !!!!"
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Barra Progressiva

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Barra Progressiva

Mensagem 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.)
[]´s
Alexandre Santos (AlxSts)
SandroBelarmino
Usuário Nível 3
Usuário Nível 3
Mensagens: 464
Registrado em: 04 Set 2007 16:11
Localização: Pedreira-SP

Barra Progressiva

Mensagem 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 %.
Alessandro R Belarmino
Clipper 5.2e - Blinker 7 - DBFNTX / DBFCDX
"Quem trabalha muito erra muito, quem trabalha pouco erra pouco, quem não trabalha não erra e quem não erra é promovido !!!!"
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Barra Progressiva

Mensagem 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  
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Barra Progressiva

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Barra Progressiva

Mensagem por lugab »

Ola amigos,

Qual dessas contribuições funcionam com .CDX e no harbour ?
lugab
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Barra Progressiva

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Barra Progressiva

Mensagem 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())
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder