Página 1 de 2
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 14:44
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
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 16:14
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.
Rubens
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 16:46
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
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 16:59
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
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 17:12
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.
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 17:24
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.
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 18:08
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.
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 18:29
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...
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 18:32
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)
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 18:37
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
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 18:40
por porter
A pesquisa com OrdWildSeek é tão rápida como um SEEK ?
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 19:04
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.
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 19:13
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
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 19:24
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.
Mais uma dúvida com OrdWildSeek
Enviado: 08 Fev 2018 19:28
por Eolo
Ah, e era tudo DBF, sem SQL.
O OrdWildSeek é fantástico. Tão rápido quanto o Seek.