Barra Progressiva
Moderador: Moderadores
Barra Progressiva
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
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

- Mensagens: 464
- Registrado em: 04 Set 2007 16:11
- Localização: Pedreira-SP
Barra Progressiva
Tente isso:
Na linha do comando Index:
A Funcao Pinta() é onde será pintada a barra de progresso:
Você só precisa desenhar a tela de acordo.
Abraço.
Na linha do comando Index:
Código: Selecionar todos
index on codigo to arqui.ntx EVAL pinta()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.
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 !!!!"
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 !!!!"
-
SandroBelarmino
- Usuário Nível 3

- Mensagens: 464
- Registrado em: 04 Set 2007 16:11
- Localização: Pedreira-SP
Barra Progressiva
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 !!!!"
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 !!!!"
Barra Progressiva
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
Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Barra Progressiva
É verdade Andril, ficou BEMMM mais demorada a indexação.
Eu retirei a primeira linha da funct pinta, deu uma melhorada ja.
Abraços :{
Eu retirei a primeira linha da funct pinta, deu uma melhorada ja.
Abraços :{
-
SandroBelarmino
- Usuário Nível 3

- Mensagens: 464
- Registrado em: 04 Set 2007 16:11
- Localização: Pedreira-SP
Barra Progressiva
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.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
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 !!!!"
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 !!!!"
Barra Progressiva
Eu melhorei este problema de velocidade fazendo o seguinte:
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.
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
endiAgora, vc pode alterar esses 0.03 do 'lote', tendo um valor para cada tamanho de DBF.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Barra Progressiva
Olá!
Não se esqueçam da cláusula EVERY do comando INDEX ON. Exemplo:
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)
Alexandre Santos (AlxSts)
-
SandroBelarmino
- Usuário Nível 3

- Mensagens: 464
- Registrado em: 04 Set 2007 16:11
- Localização: Pedreira-SP
Barra Progressiva
Seguindo o exemplo do Alexandre, tenho em alguns programas da seguinte maneira:
dessa forma somente vai mostrar o progresso a cada 10 %.
Código: Selecionar todos
index on codigo to arqntx EVAL pinta() EVERY LASTREC()/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 !!!!"
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Barra Progressiva
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.
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)
Alexandre Santos (AlxSts)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Barra Progressiva
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:
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/
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/
Barra Progressiva
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.
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.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Barra Progressiva
Com a Six eu usava assim:
Com variáveis, porque o gráfico é total, e não individual por arquivo.
Mas usando RecNo().
No modo simples: GrafInd(RecNo(),LastRec())
Código: Selecionar todos
index on &(cKey) tag (cTag) for &(cFor) option GrafInd(m_RecOk,m_RecTotal)
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/
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/

