Mais uma dúvida com OrdWildSeek

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Mais uma dúvida com OrdWildSeek

Mensagem por porter »

Olá pessoal, tenho uma rotina com índice CDX e quero localizar pelo numero do PEDIDO, na rotina abaixo, se existir algum campo com PEDIDO = "146209",
por exemplo, está considerando como encontrado, como faço para fazer essa localização exatamente como desejado ou seja somente "46209", com SEEK
da forma como está sei que não tem como, então quero localizar pelo OrdWildSeek, já tentei com "*" e com "?"

Código: Selecionar todos

INDEX ON STR(CODCLI,6)+STR(PEDIDO,6)
variavel := "46209"
cBusca:="*"+variavel+"*"
OrdWildSeek( cBusca, .T. )
Harbour 3.2.0(dev), RDD CDX
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Mais uma dúvida com OrdWildSeek

Mensagem por rubens »

Boa tarde...

Porter... não entendi bem isso aí...
CODCLI E PEDIDO são campos da tabela? Se sim não precisa de ordwildseek é só criar a chave para pesquisa com dbseek tb.

Código: Selecionar todos

cChave := CodCli + Pedido 
Dbseek( cChave )
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Mais uma dúvida com OrdWildSeek

Mensagem por porter »

Olá Rubens, boa tarde,
Sim, são campos da tabela DBF, se eu criar o índice INDEX ON STR(PEDIDO,6), eu resolveria o problema com SEEK, mas estou querendo fazer a pesquisa,
usando esse índice INDEX ON STR(CODCLI,6)+STR(PEDIDO,6) e com SEEK ou DBSeek, não consegueria fazer essa pesquisa por isso que estou fazendo
com OrdWildSeek, no momento que eu for fazer a pesquisa, informarei apenas o número do PEDIDO, o código do cliente, não, espero ter conseguido explicar, Obrigado.

Código: Selecionar todos

INDEX ON STR(CODCLI,6)+STR(PEDIDO,6)
variavel := "46209"
cBusca:="*"+variavel+"*"
OrdWildSeek( cBusca, .T. )
Harbour 3.2.0(dev), RDD CDX
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Mais uma dúvida com OrdWildSeek

Mensagem por rubens »

Poter pelo que sei o OrdWildSeek vai pesquisar somente em um campo da tabela ..
Tipo você quer saber todos os clientes que tem no nome a palavra Santos... aí sim funcionaria...
Mas pesquisar em dois campos, acho que só se fizer a busca em cada campo..
Acho que do jeito que você tá querendo não funciona...
Talvez algum outro colega possa ter a solução mas acho que é do jeito que te falei mesmo...
Do jeito que você colocou aí só se salvar esses dados em um mesmo campo aí tudo bem onde houver uma ocorrencia "numero do pedido" vai ser encontrado..

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Mais uma dúvida com OrdWildSeek

Mensagem por porter »

Rubens, obrigado por responder,
Estou fazendo a pesquisa por apenas um campo usando OrdWildSeek, e está funcionando, mas o problema que estou encontrando é se por exemplo
fizer uma pesquisa para localizar o PEDIDO "46209", ele está considerando também o PEDIDO "146209", entendeu, tem que considerar exatamente
o que informei.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mais uma dúvida com OrdWildSeek

Mensagem por Eolo »

Porter, você está mandando o OrdWildseek procurar por "46209" e ele obviamente vai considerar todas as ocorrências da string "46209"... Vai entrar, por exemplo, "462091", "146209" etc.

Mande procurar por str(46209,6), ou seja, " 46209" (espaço, 4, 6...), que é como está na indexação, com isso o "146209" (e outros) não vai mais ser considerado.

Ah, e pode incluir quantos campos quiser. Só precisa, na hora da pesquisa, procurar no formato que a indexação foi criada.
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Mais uma dúvida com OrdWildSeek

Mensagem por porter »

Mande procurar por str(46209,6), ou seja, " 46209" (espaço, 4, 6...), que é como está na indexação, com isso o "146209" (e outros) não vai mais ser considerado.
Agora deu certo, muito obrigado Rubens e Eolo pela atenção.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mais uma dúvida com OrdWildSeek

Mensagem por Eolo »

Complementando, com um alerta.

Com a indexação
INDEX ON STR(CODCLI,6)+STR(PEDIDO,6)
digamos - só pra exemplificar - que você tem algo assim:

Código: Selecionar todos

(codcli,pedido)
"  4567 12345"
" 15333 12346"
"  4567 12347"
" 15333  4567"
etc.
Nesse índice, se você procurar pelo cliente " 4567", vão vir todos (e somente) os pedidos do cliente 4567, certo?

Errado. O pedido " 4567" (que é de outro cliente) vai ser incluído, porque a string " 4567" faz parte da chave de pesquisa mas é outra coisa...

Moral da história: o OrdWildseek não se toca que código de cliente é uma coisa e número do pedido é outra. Pra ele, a coisa se resume a procurar uma string que faça parte de uma linguiça de caracteres concatenados. Então, se a procura vai ser só por pedido, crie uma indexação específica...
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mais uma dúvida com OrdWildSeek

Mensagem por asimoes »

Ao invés de str use hb_ntos, a função é um misto de str com alltrim, ou use:

INDEX ON AllTrim(STR(CODCLI,6)) + AllTrim(STR(PEDIDO,6))

OU

INDEX ON hb_NtoS(CODCLI) + hb_NtoS(PEDIDO)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mais uma dúvida com OrdWildSeek

Mensagem por asimoes »

Se código de ciente é um número de tamanho 6 e pedido idem, pra não ficar perdido na busca eu usaria strzero

INDEX ON STRZERO(CODCLI, 6) + STRZERO(PEDIDO, 6) TO .....

Na busca:

IF DbSeek( StrZero( nCodCli, 6 ) + StrZero( nPedido, 6 ) ) ...

O que eu entedi nesse indice é que você quer achar o pedido do cliente X
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Mais uma dúvida com OrdWildSeek

Mensagem por porter »

A pesquisa com OrdWildSeek é tão rápida como um SEEK ?
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mais uma dúvida com OrdWildSeek

Mensagem por Eolo »

A pesquisa com OrdWildSeek é tão rápida como um SEEK ?
Na minha experiência, sim.
INDEX ON AllTrim(STR(CODCLI,6)) + AllTrim(STR(PEDIDO,6))
NUNCA use ALLTRIM() em índices e pesquisas. Prefira sempre STRZERO().
Dê uma pesquisada no Forum, esse assunto já foi bastante debatido.

ALLTRIM() elimina os espaços em branco e o índice fica com registros de tamanhos diferentes. Bomba de efeito retardado.
Já o STRZERO() completa as strings com zeros à esquerda, todos os registros ficam com o mesmo tamanho. Sossego.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mais uma dúvida com OrdWildSeek

Mensagem por asimoes »

porter escreveu:A pesquisa com OrdWildSeek é tão rápida como um SEEK ?
OrdWildSeek usa uma sintaxe que o DbSeek não tem, seria um like equivalente a uma sentença sql

SELECT * FROM TABELA WHERE NOME LIKE "%LUZ%"

No DBF
TABELA->Nomes

ALEXANDRE LUZ
JOÃO LUZ
LUZ PEDRO
LUIS LUZ DA SILVA

Código: Selecionar todos

lPrimeira:=.T.
aNomes := {}
DO WHILE OrdWildSeek( "*LUZ*",IF(lPrimeira,.F.,.T.) )
   AADD( aNomes ,TABELA->Nomes )
   lPrimeira:=.F.
ENDDO
Não testei pra saber se OrdWildSeek é mais rápido, note que a palavra LUZ pode estar em qualquer ordem
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mais uma dúvida com OrdWildSeek

Mensagem por Eolo »

Porter, a diferença é:

- SEEK faz a procura no INICIO da chave.
Seek "VENTURA" não acha nada, porque meu nome é "EOLO VENTURA"

- OrdWildSeek procura em toda a chave.
OrdWildSeek "VENTURA" me acha,
a mim e a todos os registros que tenham "VENTURA" em qualquer posição (DA INDEXAÇÃO!).


Fiz um programa pra um mercado, um dia saiu um aumento de preço pra todas as cervejas de 600ml, o cliente me chamou pra resolver, rápido. Tipo dia seguinte.

OrdWildSeek "600ml", vieram todos os registros com 600ML (em qualquer parte do nome do produto), aí foi só dar um TAG no que interessava e fazer o aumento.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mais uma dúvida com OrdWildSeek

Mensagem por Eolo »

Ah, e era tudo DBF, sem SQL.

O OrdWildSeek é fantástico. Tão rápido quanto o Seek.
Responder