procura lenta demais com LOCATE
Moderador: Moderadores
procura lenta demais com LOCATE
boa noite pessoal.
estou fazendo uma pesquisa no banco de dados, e necessito que a palavra digitada seja localizada em qualquer parte da descricao do campo, ou seja tanto no comeco da descricao como no meio e fim, e estou usando o comando LOCATE, pois a pesquisa quando feita no servidor, a localizacao e' rapida, mas quanto faço essa mesma
localizacao no terminal, ai fica muito demorado, sera que tem alguma outra forma de
fazer essa pesquisa, usar outro comando por exemplo, estou usando windows xp e o
clipper 5.2. Se alguem puder me ajudar desde ja agradeco.
Obrigado.
estou fazendo uma pesquisa no banco de dados, e necessito que a palavra digitada seja localizada em qualquer parte da descricao do campo, ou seja tanto no comeco da descricao como no meio e fim, e estou usando o comando LOCATE, pois a pesquisa quando feita no servidor, a localizacao e' rapida, mas quanto faço essa mesma
localizacao no terminal, ai fica muito demorado, sera que tem alguma outra forma de
fazer essa pesquisa, usar outro comando por exemplo, estou usando windows xp e o
clipper 5.2. Se alguem puder me ajudar desde ja agradeco.
Obrigado.
Re: procura lenta demais com LOCATE
O comando LOCATE é o recurso mais lento de pesquisa, uma vez que cada registro terá de ser lido. No servidor é sempre mais rápido porque os dados são locais. Numa estação os dados todos deverão trafegar pela rede. Ai já tem concorrência com outros terminais, a distância, etc. Fica mais lento mesmo.
Uma alternativa é você usar a função sx_WildSeek(), que faz exatamente o que você quer. Esta função é da biblioteca SIX, que utiliza índices compactados; um novo RDD, alternativo ao NTX. O campo em questão, claro, deverá ter uma chave no índice. Se já utiliza a SIX, será fácil você mudar isso. Se não usa ainda, dará algum trabalho, mas o ganho de velocidade é espantoso em comparação com o antigo NTX.
Se precisar, há inúmeros tópicos no fórum que tratam da SIX. Dê uma pesquisada. Passo apenas o link para download, caso preciso. Clique aqui.
Uma alternativa é você usar a função sx_WildSeek(), que faz exatamente o que você quer. Esta função é da biblioteca SIX, que utiliza índices compactados; um novo RDD, alternativo ao NTX. O campo em questão, claro, deverá ter uma chave no índice. Se já utiliza a SIX, será fácil você mudar isso. Se não usa ainda, dará algum trabalho, mas o ganho de velocidade é espantoso em comparação com o antigo NTX.
Se precisar, há inúmeros tópicos no fórum que tratam da SIX. Dê uma pesquisada. Passo apenas o link para download, caso preciso. Clique aqui.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: procura lenta demais com LOCATE
Eis a função que eu usava em um programa em Clipper 5.3b com índices CDX.
Eu abria um get para entrar com a expressão, e em seguida chamava esta função com a expressão como parâmetro.
Em seguida ela monta um banco temporário, onde vão ser jogadas as ocorrencias encontradas. Depois visualizava elas num tbrowse para escolher qual cliente e teclando ENTER, me mandava para o tbrowse principal, já em cima do escolhido.
Neste caso eu usava para encontrar clientes. A sua velocidade está relacionada com o número de registros, mas posso dizer que num banco com uns 15000 reg´s, era rapidinha.
Mas como eu disse, preferí fazer desta maneira porquê já utilizava RDDCDX. Se o colega usa ainda RDDNTX, vale mesmo a pena, estudar a respeito da SIX, que inclusive tem outros recursos interessantes, ou então implementar esta função do jeito que está, com NTX mesmo.
Eu abria um get para entrar com a expressão, e em seguida chamava esta função com a expressão como parâmetro.
Em seguida ela monta um banco temporário, onde vão ser jogadas as ocorrencias encontradas. Depois visualizava elas num tbrowse para escolher qual cliente e teclando ENTER, me mandava para o tbrowse principal, já em cima do escolhido.
Neste caso eu usava para encontrar clientes. A sua velocidade está relacionada com o número de registros, mas posso dizer que num banco com uns 15000 reg´s, era rapidinha.
Código: Selecionar todos
Function Busca(arg)
local dtmp:= {}, bnom:= subs(netname(),1,8), lugar:= recno()
aadd(dtmp,{"tmpcod","N",7,0})
aadd(dtmp,{"tmpnom","C",50,0})
aadd(dtmp,{"tmpcid","C",25,0})
dbcreate(bnom,dtmp)
use &bnom excl new
sele cdcli000
dbgotop()
do while !eof()
if at(alltrim(arg),clinom) > 0
@ 08,65 say clicod pict "99999-9" colo "n/g"
&bnom->(dbappend())
repl &bnom->tmpcod with clicod
repl &bnom->tmpnom with clinom
repl &bnom->tmpcid with clicid
skip
else
skip
endif
enddo
goto lugar
return &bnom->(reccount())
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
- filizola
- Usuário Nível 3

- Mensagens: 421
- Registrado em: 19 Ago 2003 20:10
- Localização: Belo Horizonte/MG
Re: procura lenta demais com LOCATE
uma alternativa com indices ntx seria a utilização de indices temporários.
index on nomecampo to temp for variavel$campo
index on nomecampo to temp for variavel$campo
"Um passo a frente, e já não estará mais no mesmo lugar..."
Re: procura lenta demais com LOCATE
eu fiz o download do SIX e ja instalei na minha maquina, e olhei alguns arquivos de
extensao LNK para ver como compila, mas e' muito diferente do que eu uso se voce
puder me mandar um exemplo de compilacao ficarei muito agradecido.
extensao LNK para ver como compila, mas e' muito diferente do que eu uso se voce
puder me mandar um exemplo de compilacao ficarei muito agradecido.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
procura lenta demais com LOCATE
Legal essa ! Não tinha ocorrido-me... claro que num arquivo muito extenso a criação do arquivo de indice pode vir a ser demorado. Mas valeu a dica.Filizola escreveu:index on nomecampo to temp for variavel$campo
Acho que isso o Maligno ja fez anteriormente para outros colegas... dê uma olhada no tópico: viewtopic.php?f=1&t=5998&p=26262#p26262CDV escreveu:puder me mandar um exemplo de compilacao ficarei muito agradecido.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
-
querentino
- Usuário Nível 1

- Mensagens: 25
- Registrado em: 28 Jan 2009 19:53
- Localização: Guarulhos - São Paulo
procura lenta demais com LOCATE
boa noite pessaol, estou com o mesmo problema do nosso colega. Só que sou leigo no assunto SIX.
Como faço para compilar e linkar o prg. para usar o comando wildSeek e como ele funciona?
uma parte da função que quando usada nos terminais demora muito, e eu preciso buscar partes de 2 variaveis no dbf.
Como faço para compilar e linkar o prg. para usar o comando wildSeek e como ele funciona?
uma parte da função que quando usada nos terminais demora muito, e eu preciso buscar partes de 2 variaveis no dbf.
Código: Selecionar todos
CLEAR GETS
SET CURSOR ON
SET INDEX TO NOMEPECA
SET SOFTSEEK ON
SETCOLOR("W+/BG,N/W")
V_APLIC:=SPACE(20)
V_DESCR:=SPACE(20)
@ 03,20 CLEAR TO 07,54
@ 03,20 TO 07,54 DOUBLE
@ 04,22 SAY "DESCRICAO:" GET V_DESCR PICT "@!"
@ 06,22 SAY "APLICACAO:" GET V_APLIC PICT "@!"
READ
IF EMPTY(V_DESCR) .AND. EMPTY(V_APLIC)
SET INDEX TO DESCNOME
ELSEIF EMPTY(V_DESCR)
INDEX ON NOMEPECA+DESCPECA TO APLIDESC FOR RTRIM(V_APLIC) $ NOMEPECA
ELSEIF EMPTY(V_APLIC)
INDEX ON DESCPECA+NOMEPECA TO APLIDESC FOR RTRIM(V_DESCR) $ DESCPECA
ELSE
INDEX ON NOMEPECA+DESCPECA TO APLIDESC FOR RTRIM(V_DESCR) $ DESCPECA .AND. RTRIM(V_APLIC) $ NOMEPECA
ENDIF
MNOMEPECA=NOMEPECA
IF EOF()
ALERT ('Consulta nao Encontrada....!!!')
SET INDEX TO DESCNOME
RETURN(2)
ENDIF
NTX=2
RETURN(2)
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Procura lenta demais com LOCATE
Querentino, você ja tentou usar o aqruivo .NG que acompanha o pacote ? Aqui tem mais uma dica: viewtopic.php?f=1&t=8500&p=47635#p47635 e ainda tem este outro exemplo (mesmo sendo para xHarbour) servirá para Clipper pois o código é o mesmo: viewtopic.php?t=7266 (leia atentamente).
Obs.: Utilize "
Obs.: Utilize "
Código: Selecionar todos
e [\code]" para postar seu código fonte e o "Busca" antes de postarUm clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.

