Como pesquisar por uma palavra no campo

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Como pesquisar por uma palavra no campo

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

Re: Como pesquisar por uma palavra no campo

Mensagem 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
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.
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Re: Como pesquisar por uma palavra no campo

Mensagem 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
Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

Como pesquisar por uma palavra no campo

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Como pesquisar por uma palavra no campo

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como pesquisar por uma palavra no campo

Mensagem 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
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)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Como pesquisar por uma palavra no campo

Mensagem 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.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como pesquisar por uma palavra no campo

Mensagem 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.
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)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Como pesquisar por uma palavra no campo

Mensagem 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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Como pesquisar por uma palavra no campo

Mensagem 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...
:-)
Avatar do usuário
Vander
Usuário Nível 3
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

Mensagem por Vander »

HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Como pesquisar por uma palavra no campo

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