Página 1 de 1

Como pesquisar por uma palavra no campo

Enviado: 17 Jan 2011 13:39
por Paulao
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.

Re: Como pesquisar por uma palavra no campo

Enviado: 17 Jan 2011 14:19
por Pablo César
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

Re: Como pesquisar por uma palavra no campo

Enviado: 18 Jan 2011 11:19
por Paulao
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
            endi

Como pesquisar por uma palavra no campo

Enviado: 31 Jul 2013 00:01
por Clash
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

Como pesquisar por uma palavra no campo

Enviado: 08 Ago 2013 20:49
por sygecom
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

Como pesquisar por uma palavra no campo

Enviado: 09 Ago 2013 18:33
por Jairo Maia
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:

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ção

Como pesquisar por uma palavra no campo

Enviado: 10 Ago 2013 20:42
por Eolo
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.

Como pesquisar por uma palavra no campo

Enviado: 11 Ago 2013 06:44
por Jairo Maia
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.

Como pesquisar por uma palavra no campo

Enviado: 13 Ago 2013 11:34
por Eolo
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.

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

Enviado: 13 Ago 2013 12:02
por Eolo
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...
:-)

Como pesquisar por uma palavra no campo

Enviado: 13 Ago 2013 14:25
por Vander

Como pesquisar por uma palavra no campo

Enviado: 13 Ago 2013 14:40
por Eolo
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
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...