Como pesquisar por uma palavra no campo
Moderador: Moderadores
Como pesquisar por uma palavra no campo
Boa tarde meus amigos, necessito fazer uma pesquisa no cadastro de clientes por parte do nome do cliente, nao necessariamente pelo primeiro nome, exemplo : Paulo Cesar da Silva, gostaria que ele encontrasse o cliente se eu digitasse Cesar, existe algo que encontre o cliente desta forma?
Utilizo clipper 5.2e e blinker
Obrigado a todos.
Utilizo clipper 5.2e e blinker
Obrigado a todos.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Re: Como pesquisar por uma palavra no campo
Você deverá criar uma função e utilizar o comando LOCATE mas é muito lento, o processo. Também pode utilizar um RDD da SIX ou (possivel CDX) OU outro que aceite o sx_WildSeek que é bem pra isso que você está precisando. Procure aqui no forum, tem bastante sobre isso lá no fórum de BD.
Veja por exemplo este tópico: https://pctoledo.org/forum/viewto ... 244#p18244
Veja por exemplo este tópico: https://pctoledo.org/forum/viewto ... 244#p18244
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.
Re: Como pesquisar por uma palavra no campo
Resolvi o problema de uma forma muito fácil usando o comado locate, mas como ele e lento continuei usando o seek, caso nao encontre pelo seek ai o locate entra em cena, e ficou como eu esperava, usando a rotina do locate dentro de um tbrowse com busca por qualquer coluna ele funcionou muito bem, segue abaixo a rotina que utilizei .
Código: Selecionar todos
@ 20,09 SAY "Procura: " color "n+/w"
@20,18 say spac(22)
nCursor := SETCURSOR(SC_NORMAL)
@ 20,09 SAY " Procura: " color "n/w"
@20,19 GET cSearch ;
PICTURE "@!S20" COLOR "W/r" //valid complser(cSearch)
READ
SETCURSOR(SC_NONE)
cSearch := TRIM(cSearch)
SeekIt( cSearch ,, b )
if (!found())
locate for cSearch$(&(indexkey()))
if(!eof())
b:refreshAll()
else
msg("Registro nÆo encontrado")
endi
endiComo pesquisar por uma palavra no campo
Eu utilizo o CDX para os índices e crio arquivos temporários por terminal, assim:
Código: Selecionar todos
INDEX on NOME to &tLocal\IDCLISEP for alltrim(Right(cVar_Pro,33))$NOME- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Como pesquisar por uma palavra no campo
Paulo,
O Locate funciona bem, mas cuida que em tabelas com muitos registros isso pode ser um tiro no pé. As dica do Pablo são o melhor caminho, e se for NTX de uma procurada em umas dica do Rochinha sobre SUBNTX
O Locate funciona bem, mas cuida que em tabelas com muitos registros isso pode ser um tiro no pé. As dica do Pablo são o melhor caminho, e se for NTX de uma procurada em umas dica do Rochinha sobre SUBNTX
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Como pesquisar por uma palavra no campo
Olá Pessoal,
Apenas para registro:
O Locate como foi dito é uma excelente ferramenta para alguns casos, mas ela funcionará muito rápido se for usado em conjunto com o comando Set Filter To <lExpressao>, deixando visiveis somente os registros que atendem as condições do Filtro.
Por exemplo:
Apenas para registro:
O Locate como foi dito é uma excelente ferramenta para alguns casos, mas ela funcionará muito rápido se for usado em conjunto com o comando Set Filter To <lExpressao>, deixando visiveis somente os registros que atendem as condições do Filtro.
Por exemplo:
Código: Selecionar todos
Set Filter To cNomeCli > "J"
Go Top
? cNomeCli // retorna o primeiro registro que inicai com a letra acima do J
Set Filter To // desfaz a condiçãoAbraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Como pesquisar por uma palavra no campo
Jairo, eu tentei usar algumas vezes o SET FILTER e, em qualquer situação, sempre ficou tudo muito lento. Não sei explicar o por que, mas troquei o FILTER pela cláusula FOR do INDEX, resolveu em muito o meu problema de "performance". Algo do tipo INDEX ON NOME FOR "SILVA"$NOME, num exemplo bem simples. Funcionou legal, mas tem que criar índice temporário (pra entrar o "SILVA") e, numa tabela muito grande, pode ser um impecilho no run time.
No xHarbour tem a OrdWildSeek(), fantástico, dica do Leonardo: uma tabela gigante, vc manda procurar qq coisa e joga numa matriz, é instantâneo. No Clipper, acho que a SIX faz algo semelhante, mas nunca usei.
Enfim, o SET FILTER, pra mim, foi tiro no pé, como o Leonardo já mencionou antes.
No xHarbour tem a OrdWildSeek(), fantástico, dica do Leonardo: uma tabela gigante, vc manda procurar qq coisa e joga numa matriz, é instantâneo. No Clipper, acho que a SIX faz algo semelhante, mas nunca usei.
Enfim, o SET FILTER, pra mim, foi tiro no pé, como o Leonardo já mencionou antes.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Como pesquisar por uma palavra no campo
Olá Eolo,
Ter que usar o LOCATE realmente é sempre um tiro no pé. Por isso este recurso deve ser usado em casos esporádicos, enquanto casos frequntes devemos usar o SEEK.
Quanto a OrdWildSeek(), o Harbour também tem. Esta função permite a busca de uma cadeia de string, mas a área necessariamente precisa estar indexada com o campo desejado.
Penso que uma pesquisa usando o LOCATE é útil disponibilizar, apenas para atender uma situação atípica. Fora isso, não é conveniente mesmo. Concordo também.
Ter que usar o LOCATE realmente é sempre um tiro no pé. Por isso este recurso deve ser usado em casos esporádicos, enquanto casos frequntes devemos usar o SEEK.
Quanto a OrdWildSeek(), o Harbour também tem. Esta função permite a busca de uma cadeia de string, mas a área necessariamente precisa estar indexada com o campo desejado.
Penso que uma pesquisa usando o LOCATE é útil disponibilizar, apenas para atender uma situação atípica. Fora isso, não é conveniente mesmo. Concordo também.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Como pesquisar por uma palavra no campo
Paulao, vou postar uma ideia simples, que pode ser um workaround fácil de implementar, sem muita complicação e sem usar o LOCATE ou o SET FILTER.
Mantenha o campo NOME, que vai continuar a ser usado como hoje. Crie mais “n” campos, NOME1, NOME2 etc., que vão conter pedaços do NOME:
NOME = JOSÉ SOUZA FERNANDES
NOME1 -> JOSÉ
NOME2 -> SOUZA
NOME3 -> FERNANDES
NOME4 -> (vazio)
NOME5 -> (vazio)
Agora é só criar os índices (pode ser até o NTX) pra cada um desses campos extras e usar o SEEK. Como o SEEK responde instantaneamente, a procura (mesmo multiplicada pelos 5 campos extras) não vai gastar muito tempo adicional...
No GET, vc só usa o campo NOME. Na hora de gravar, salva o nome completo em NOME e cada pedaço nos campos extras (considernado o "espaço" como separador. Isso vai ficar transparente para o usuário.
Mantenha o campo NOME, que vai continuar a ser usado como hoje. Crie mais “n” campos, NOME1, NOME2 etc., que vão conter pedaços do NOME:
NOME = JOSÉ SOUZA FERNANDES
NOME1 -> JOSÉ
NOME2 -> SOUZA
NOME3 -> FERNANDES
NOME4 -> (vazio)
NOME5 -> (vazio)
Agora é só criar os índices (pode ser até o NTX) pra cada um desses campos extras e usar o SEEK. Como o SEEK responde instantaneamente, a procura (mesmo multiplicada pelos 5 campos extras) não vai gastar muito tempo adicional...
No GET, vc só usa o campo NOME. Na hora de gravar, salva o nome completo em NOME e cada pedaço nos campos extras (considernado o "espaço" como separador. Isso vai ficar transparente para o usuário.
Código: Selecionar todos
* Um exemplo, só só pra mostrar o funcionamento do AT(). Não testei. Faça as correções e adaptações que achar necessárias.
vNOME:=NOME
For x=1 to 5
posicao= at(“ “,vNOME)
vPARTE:=substr(vNOME,1,posicao-1)
campo=”NOME”+str(x,1,0)
Repl (&campo) with vPARTE
vNOME:=substr(posição+1,len(vNOME))
next
Como pesquisar por uma palavra no campo
Vi um treco parecido há muito tempo atrás, ainda no tempo do Clipper Summer: um colega fez um sistema para uma empresa de Marcas e Patentes, que tinha muita legislação cadastrada (quase tudo em campos MEMO!) e, como os DBFs eram grandes e a procura dentro dos MEMOs impraticável (o PC campeão daquela época era o 286...), ele criou alguns campos CARACTER onde o usuário cadastrava “palavras-chave” para cada registro.
Quando o usuário pesquisava uma palavra-chave, o programa fazia um SEEK nesses campos e a resposta era “imediata”. Era só usar os registros selecionados. Com o LOCATE, o cliente final perdia o prazo pra atualizar o registro da marca...

Quando o usuário pesquisava uma palavra-chave, o programa fazia um SEEK nesses campos e a resposta era “imediata”. Era só usar os registros selecionados. Com o LOCATE, o cliente final perdia o prazo pra atualizar o registro da marca...
- Vander
- Usuário Nível 3

- Mensagens: 214
- Registrado em: 23 Jul 2004 01:43
- Localização: João Monlevade - MG
Como pesquisar por uma palavra no campo
HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
Como pesquisar por uma palavra no campo
Vander, o Paulao quer pesquisar uma palavra localizada em QUALQUER POSIÇÃO dentro do campo, não só no começo dele. O exemplo que vc postou faz a procura letra a letra, mas sempre no começo do campo...Boa tarde meus amigos, necessito fazer uma pesquisa no cadastro de clientes por parte do nome do cliente, nao necessariamente pelo primeiro nome, exemplo : Paulo Cesar da Silva, gostaria que ele encontrasse o cliente se eu digitasse Cesar

