Página 1 de 1
pesquisa com locate ou outro
Enviado: 11 Abr 2011 00:35
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.
Re: pesquisa com locate ou outro
Enviado: 11 Abr 2011 01:55
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,
Re: pesquisa com locate ou outro
Enviado: 11 Abr 2011 09:17
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
Pesquisa com locate ou outro
Enviado: 11 Abr 2011 11:28
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
Re: pesquisa com locate ou outro
Enviado: 11 Abr 2011 11:32
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.
Pesquisa com locate ou outro
Enviado: 11 Abr 2011 11:40
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)
Re: pesquisa com locate ou outro
Enviado: 11 Abr 2011 13:04
por rbonotto
Este LOCATE FOR ALLTRIM(MNOME)$NOME poderia ser usado com o comando seek ?
abs !
Pesquisa com locate ou outro
Enviado: 11 Abr 2011 13:10
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.
Re: pesquisa com locate ou outro
Enviado: 11 Abr 2011 13:10
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