Página 1 de 1

procura lenta demais com LOCATE

Enviado: 27 Mar 2009 19:09
por CDV
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.

Re: procura lenta demais com LOCATE

Enviado: 27 Mar 2009 20:17
por Maligno
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.

Re: procura lenta demais com LOCATE

Enviado: 27 Mar 2009 23:10
por alaminojunior
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.

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())
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.

Re: procura lenta demais com LOCATE

Enviado: 28 Mar 2009 08:09
por filizola
uma alternativa com indices ntx seria a utilização de indices temporários.

index on nomecampo to temp for variavel$campo

Re: procura lenta demais com LOCATE

Enviado: 28 Mar 2009 09:18
por CDV
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.

procura lenta demais com LOCATE

Enviado: 28 Mar 2009 09:27
por Pablo César
Filizola escreveu:index on nomecampo to temp for variavel$campo
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.
CDV escreveu:puder me mandar um exemplo de compilacao ficarei muito agradecido.
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#p26262

procura lenta demais com LOCATE

Enviado: 31 Mar 2009 22:52
por querentino
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.

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)

Procura lenta demais com LOCATE

Enviado: 01 Abr 2009 09:30
por Pablo César
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 "

Código: Selecionar todos

 e [\code]" para postar seu código fonte e o "Busca" antes de postar