pesquisa com locate ou outro

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

pesquisa com locate ou outro

Mensagem por Glauco Cruz Costa »

num determinado dbf tenho um registro de titulo "nome", onde os campos sao preenchidos com nomes de pessoas. assim, por exemplo, num cadastro eu coloco no campo nome o meu nome: glauco cruz costa. ok
só que eu gostaria de poder pesquisar os esse nome, por exemplo, eu só sabendo que tem um glauco no meu dbf, mas sem saber onde, e qerer ver os dados dele.
assim, por exemplo, colocando o comando locate for nome = non, sendo nom a variavel em q eu atribuo o nome glauco para pesquisar.
só que assim ele nao acha meu nome no dbf. ele só acha se eu digitar na variavel o nome inteiro.
há alguma forma simples de eu pesquisar somente uma parte da expressao e achar?
obrigado.
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Re: pesquisa com locate ou outro

Mensagem por rbonotto »

Não sei se entendi direito, mas a sugestão seria:

Primeiro crie um indice para o campo NOME

vArNome := SPACE(50)
@ 01,01 GET vArNome
READ

SEEK RTRIM(vArNome )

Se vc digitou ´GLAU´ele ira achar.

Abs,
mixsistemas@gmail.com
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Re: pesquisa com locate ou outro

Mensagem por Clipper »

Prezado Glauco

O exemplo do Rbonotto está perfeito !

Outra forma que talvez você possa precisar no futuro é a pesquisa de parte de um nome, sem saber em que posição ele está.

Lá vai um exemplo :

Código: Selecionar todos

MNOME=SPACE(30)
@ 01,00 say "Pesquisar -> " GET MNOME PICT "@!"
READ

DBGOTOP()
LOCATE FOR ALLTRIM(MNOME)$NOME
IF EOF()
    @ 24,00 SAY "Nao encontrado..."
    INKEY(3)
    RETURN(.F.)
ENDIF
CONTA=0
DO WHIL .T.
   CONTA++ 
   @ 03,00 CLEAR TO 04,79
   @ 03,00 SAY CODIGO  
   @ 04,10 SAY NOME
   @ 24,00 SAY "Pressione uma tecla para procurar o próximo !"
   INKEY(0)
   IF EOF()
      @ 24,00 SAY "Fim da procura ! Encontrados "+STR(CONTA,3)+" registros."
      EXIT
   ENDIF
   CONTINUE
ENDDO
Nesse pequeno exemplo a busca será pelo nome onde quer que ele esteja no registro (inicio, meio ou fim)

No exemplo o sistema acharia qualquer uma das pesquisas abaixo :

GLAUCO
CRUZ
CRUZ COSTA
GLAUCO CRUZ
COSTA
CO CRUZ CO

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
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á

Pesquisa com locate ou outro

Mensagem por Pablo César »

Espero não complicar muito... mas a fim de insentivar a melhoras com outros recursos, gostaria de mostrar um ótimo
exemplo aqui na seção de Downloads que te ajudará a ampliar com novas idéias: https://pctoledo.org/download/cop ... ualiza.txt
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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: pesquisa com locate ou outro

Mensagem por sygecom »

Outra coisa. Glauco, o uso do LOCATE em base de dados com muitos registro e em rede pode prejudicar o desempenho do sistema, sempre que poder evite o uso de LOCATE, porem em DBF que você sabe que nunca vai crescer muito a quantidade de registro o uso dele pode ser aplicado sem dor de cabeça.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
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á

Pesquisa com locate ou outro

Mensagem por Pablo César »

o uso do LOCATE em base de dados com muitos registro e em rede pode prejudicar o desempenho do sistema
É isso mesmo, muito importante mencionar !. Mas também pode fazer uma opção de busca parcial e outra com o comando seek a medida que digita vai localizando o registro... Terem opções a mais para casos eventuais, até são válidos também. Mas é como o colega falou, tente evitar o comando LOCATE e sim o SEEK. A não ser que utilize outro RDD que faz uso do WILDSEEK (complicando mais um pouquinho... e quiser ver sobre isso: https://pctoledo.org/forum/search ... bmit=Busca)
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.
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Re: pesquisa com locate ou outro

Mensagem por rbonotto »

Este LOCATE FOR ALLTRIM(MNOME)$NOME poderia ser usado com o comando seek ?

abs !
mixsistemas@gmail.com
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á

Pesquisa com locate ou outro

Mensagem por Pablo César »

Apenas usando o SEEK nativo do Clipper, irá procurar na chave todo nome que começa com: MNOME Alias NÃO pode utilizar o operador de referência $. Mas ao invés de utilizar o SEEK você pode utilizar o WildSeek, mas aí teria que utilizar outra RDD (seu arquivos de índices deixariam de ser NTX). Ia ter que utilizar outro tipo de índices.
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.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Re: pesquisa com locate ou outro

Mensagem por Clipper »

Prezados Colegas

Eu sei que o uso do LOCATE é mais lento, porém isso só vale para máquinas muito lentas. Com os atuais equipamentos é praticamente imperceptivel essa "lentidão".

Óbviamente que o uso do SEEK é mais conveniente, mas em certos casos o LOCATE torna-se mais interessante e até única solução nativa.

Fiz um teste de pesquisa com LOCATE em uma base de dados com 560.000 Registros, o tempo de pesquisa foi de menos de 3 segundos, pode ser muito se comparado a uma busca indexada, porém eu não preciso ter mais um indice, posso fazer a pesquisa de forma mais minuciosa, entre outras opções.

Então cada caso é um caso, vai depender do objetivo e saída desejada.

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Responder