Página 1 de 1
CRIAR INDICES SE TORNOU LENTO COM XHARBOUR ..
Enviado: 16 Out 2006 09:07
por deividdjs
Ola amigos !
estou com o seguinte problema .. converti meu sistema de clipper+VL2 para xHarbor+VL22+GTWVT .. até ai tudo bem .. ele está funcionando bem .. só q nao hora de criar os indices é um "PARTO" ele está muito lento .., só q existe um detalhe .. se eu minimizo o tela .. ele cria muito rapido .. se eu fico com a tela maximizada acompanhando a criação do mesmo fica lento .. eu uso progressão na criação do indexe, só q ja testei tirando-o tbm, mais mesmo assim ficou lento .. alguem já passou por isso ??
eu estou usando assim ..
Código: Selecionar todos
*---------------*
function INDEX // barra de progressão
*---------------*
local TELA_IND := savenv(19,14,14,79)
local a_DBF, IND_
a_DBF := dbf() + ".DBF "
set color to "B/W*"
IND_ := ((recno()*100)/reccount())
@17,62 say transform(IND_,"999") + "%" color "B/W"
@19,14 say "²" + replicate("²",(recno())/reccount()*50) color "b+/w"
set color to "N/W"
@15,13 say "Base de Dados:"
@15,28 say a_DBF color "r/w"
@15,50 say "Indice:"
@15,58 say transform(ind,"99") color "r/w"
@15,61 say "de"
@15,64 say transform(tags,"99") color "r/w"
@16,13 say replicate("Ä",53)
@17,13 say "Indexados:"
@17,23 say str(recno()) color "r/w"
@17,34 say "de"
@17,37 say alltrim(str(reccount())) color "r/w"
set color to "R+/W*"
if IND_ >= 99.99
rstenv(TELA_IND)
@19,14 say replicate(" ",50) color "w/w"
endif
return (.t.)
***********************************
if .not. file("BAN"+INDEXEXT())
@10,44 say "BAN.CDX "
inkey(0.1)
if Abre_Index("BAN.DBF",.t.,"BAN","BAN.CDX") = .f.
close databases
return
endif
private ind:=0, tags:=2
ind++
index on CC_CODBAN tag BANCX_01 eval(INDEX())
ind++
index on CC_NOME tag BANCX_02 eval(INDEX())
close database
endif
Enviado: 16 Out 2006 21:26
por Luiz
Ja aconteceu aqui, é que a GT fica remontando toda a area da tela durante o processo.
Eu resolvi isso usando a gtwvw e criando uma janela pequena onde eu coloco a barra de progresso, mas não sei como proceder na gtwvt.
Resolveu a lentidão não só no indice mas em relatórios tambem.
Enviado: 17 Out 2006 07:25
por deividdjs
Só q tem um detalhe Luiz .. eu uso VISUAL LIB tbm .. nao sei se a GTWVW fica legal com a VISUAL ..
Enviado: 18 Out 2006 08:46
por vagucs
Tire o seu EVAL do comando que cria os indices, ele que tá fazendo ficar lento, ou coloque a clausula EVERY para ele ser avaliado de tempo em tempo, o problema ai é que toda vez que chama a rotina INDEX na hora de cirar o indice ele tá redesenhando a tela e por isso a lentidão e nisto quando vc minimiza a tela fica mais rapido, faça o que falei acima que o problema estará resolvido.
Enviado: 18 Out 2006 13:13
por momente
Amigo deividdjs,
Quando vc usa so o comando abaixo, fica lento também?
index on CC_CODBAN tag BANCX_01
Valeu!
Enviado: 18 Out 2006 18:25
por ReinaldoFreitas
ola, tbm tenho esse problema, como usar o EVERY ??
Enviado: 22 Out 2006 21:41
por Stanis Luksys
INDEX ON campo TO arquivo WHILE condição1 FOR condição2 EVAL funcao() EVERY inteiro
onde:
condição1 : o indice sera criado enqto os registros atenderem a condição
condição2 : só entrarão no indice registros que atendam
função(): função executada a cada registro (e menos q especifique every)
EVERY inteiro: determina a cada quantos registros será axecutada a função de EVAL, conforme for 50 ou até 100 seria um numero razoável
Boa sorte...
Enviado: 03 Nov 2006 11:38
por deividdjs
eu testei com o comando every tbm e nao tive exito .. tive q tirar a barra de progressao ae ficou uma maquina pra criar indices ..
Enviado: 03 Nov 2006 14:30
por vagucs
Como vc geralmente vai ter uma barra de progração, vc nao precisa mostrar valores fora dos 100% ou seja de 1 a 100%, então supondo que numa base de 500.000 registro cada 1% representaria 5.000 registros, assim vc teria que usa ro EVERY 5000 ou seja, executar o EVAL a cada 5 mil registros, como nunca vai saber quantos registro tem na base teria que fazer algo assim
Código: Selecionar todos
INDEX ON CAMPO TO ARQUIVO.NTX EVAL {||PROGRESS()} EVERY LASTREC()/100
Assim, ele sempre pega o lastrec e faz durante a indexação somente 100 chamadas a rotina EVAL, justamente quando o percentual muda, considerando o percentual de 1 a 1 porcento, fica perfeito, só colocar e testar.
Enviado: 04 Nov 2006 08:22
por deividdjs
NAO FUNCIONOU .. ELE VAI RAPIDO ... SÓ Q NAO MOSTRA A BARRA DE PROGRESSAO ...
Código: Selecionar todos
DESKTOP()
RddSetDefault("DBFCDX")
DbSetDrive("DBFCDX")
private l, r, i:=0
Clear
dbcloseall()
use RECEBER exclusive new
r:=reccount()*3
// |
// +----> quantidade de TAGs
l:=0
i++
index on cc_codigo TAG iCodigo EVAL{||CDXPROGRESS()} EVERY LASTREC()/100
i++
index on cc_nome TAG inome EVAL{||CDXPROGRESS()} EVERY LASTREC()/100
i++
index on cc_codcli TAG icodcli EVAL{||CDXPROGRESS()} EVERY LASTREC()/100
dbcloseall()
return nil
//////////////////////
function cdxprogress()
//////////////////////
l++
if l=1
dispbox(10,14,14,65,,'w/b')
@ 09,14 say padc('Evolu‡Æo da indexa‡Æo',52) color 'w+/b'
@ 11,15 say Replicate(" ", 50) color 'w+/b'
endi
cx:=int(l*100/r/2)
@ 11,15 say Replicate("Û", cx) color 'gr+/b'
ii := str(cx*2,3)+'%'
@ 12,15 say padc(ii,50,'Ä') color 'w/b'
@ 13,15 say padc( 'Processando index '+alltrim( str( i ) ), 50 ) color 'w+/b'
return .t.
Obrigado ..
Deivid
Enviado: 23 Nov 2006 05:27
por Stanis Luksys
Olá,
Você nem precisa colocar a função dentro do bloco {|| }, já que é só uma instrução mesmo ...
Sua função lá embaixo também ta um pouco confusa...
Tirando os detalhes de tela, eu costumo fazer assim:
Código: Selecionar todos
use vendas exclusive new
index on codven tag codven to vendas eval Progresso_Idexacao() every 100
Function Progresso_Idexacao()
@ 21, 15 say Replicate( Chr(219), RecNo() / LastRec() * 50 )
Return ( .t. )
Multiplico por 50 alí por que quando da 100% ocupa 50 colunas, da 15 até até a 65... (uma centralização na base da gambi)
Indexaçao lenta
Enviado: 09 Dez 2006 02:16
por heveraldo
Usava barra de progressao na indexao, e cheguei a seguinte conclusao:
Ficava uma barra de progressao indo de 0 a 100 para todo indice que criava, alem de nao informa nada, so deixava a indexacao lenta.
Solução:
Criei um contador manual e a cada indice organizado e incrementava + 1
até 100%
e quando chegava a 100 a indexacao de todos os indice estava concluida,
deixando uma informação real ao usuario, apesar que, qm alguns momento evoluir muito rapido.
Enviado: 09 Dez 2006 14:23
por Stanis Luksys
Olá,
Para mostrar a indexação de todos os arquivos em uma barra só você precisaria abrir todos os DBFs, somar todos os registros.
Algo assim:
Código: Selecionar todos
Use Arq1 new
SomaDeTodos := LastRec()
Use Arq2 new
SomaDeTodos := SomaDeTodos + LastRec()
Use Arq3 new
SomaDeTodos := SomaDeTodos + LastRec()
***********
//E depois lá na função do EVAL:
RegAtual := RegAtual + 1
@ 21, 15 say Replicate( Chr(219), RegAtual/ SomaDeTodos * 50 )
Eu pelo menos faço assim...
Valeu!
Enviado: 18 Dez 2006 12:24
por deividdjs
eu desisti da barra de progressão fica muito lenta com o Xhb + Visual lib .. nao sei pq !!
Enviado: 20 Dez 2006 17:46
por Clipper
Prezado Deivid.
Você poderia me mandar uns ScreenShots do seu sistema, é que estou querendo migrar o meu CLIPPER+VL para xHarbou+Vl.
Obrigado
mmendeso@gmail.com mmendeso@ig.com.br
Marcelo