procura lenta demais com LOCATE

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

CDV
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 30 Ago 2004 10:27

procura lenta demais com LOCATE

Mensagem 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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: procura lenta demais com LOCATE

Mensagem 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.
[]'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!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Re: procura lenta demais com LOCATE

Mensagem 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.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
filizola
Usuário Nível 3
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

Mensagem por filizola »

uma alternativa com indices ntx seria a utilização de indices temporários.

index on nomecampo to temp for variavel$campo
"Um passo a frente, e já não estará mais no mesmo lugar..."
CDV
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 30 Ago 2004 10:27

Re: procura lenta demais com LOCATE

Mensagem 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.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

procura lenta demais com LOCATE

Mensagem 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
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.
querentino
Usuário Nível 1
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

Mensagem 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)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Procura lenta demais com LOCATE

Mensagem 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
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.
Responder