Página 1 de 3
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 09:58
por deividdjs
boa tarde amigo ...
alguem tem um exemplo pratico de como eu consigo buscar em um DBF com indice CDX .. varios trechos de uma descrição de um produto ??
por exemplo:
descrição : lampada de led 24w bivolt 4000k 50hz
exemplos de busca do usuário: lamp 24 50hz ou lam led 24 ou 24w 4000k
e o sistema filtrar e me trazer tudo q contem esses trechos no cadastro ?? eu tenho no meu sistema q busca ... porem consegui fazer somente com uma palavra ...
Obrigado
Abs
Djs
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 11:14
por Itamar M. Lins Jr.
Olá!
Use índices na memória temporários. Sintaxe Hwgui na tela. Para DBF sintaxe padrão clipper.
Código: Selecionar todos
@ 010,160 get CheckBox lFiltraIncide Caption 'Filtrar por incidência' size 200,25
...
IF !Empty(cFiltro)
IF eq->(ordNumber("TMPFILTRO")) > 0
eq->(ordDestroy("TMPFILTRO"))
EndIf
cCriterio := "Filtrado por descrição"
cFiltro := AllTrim(Upper(cFiltro))
nFiltroLen := Len(cFiltro)
IF lFiltraIncide
cQuery := '"' + cFiltro + '"' + "$ mercadoria"
ELSE
cQuery := '"' + cFiltro + '" == substr(upper(mercadoria),1,' + str(nFiltroLen) + ')'
ENDIF
dbSelectArea('eq')
Index on mercadoria TAG TMPFILTRO FOR &cQuery temporary
eq->(dbGoTop())
ELSE
...
Caso seja para pegar no DBF e JOGAR no browse e passar p/um get qualquer (MAIS LENTO)
Vai depender muito da REDE a velocidade.
Código: Selecionar todos
*******************************
FUNCTION FiltraPalavra(cStrPes)
*******************************
*
*
IF Len(cStrPes) > 0
eq->(ordSetFocus(3)) //mercadoria
Index on &(IndexKey()) TAG _TEMP_ CUSTOM ADDITIVE MEMORY
eq->(ordSetFocus(3)) //mercadoria
eq->(dbGoTop())
WHILE OrdWildSeek( '*' + cStrPes + '*', .T.)
OrdKeyAdd('_TEMP_')
END
eq->(OrdSetFocus('_TEMP_'))
ENDIF
RETURN .T.
Não uso essa segunda opção por padrão pq mostra muitos produtos que não interessa ao vendedor.
Saudações,
Itamar M. Lins Jr.
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 11:58
por JoséQuintas
Dependendo do tamanho do cadastro, pode usar SET FILTER
Código: Selecionar todos
SET FILTER TO parte1 $ nome .AND. parte2 $ nome .AND. parte3 $ nome
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 12:02
por JoséQuintas
Aproximado, não lembro no hb_RegExSplit qual vém primeiro.
Código: Selecionar todos
cTexto := "lamp led 24"
aList := hb_RegExSplit( " ", cTexto )
cFiltro := ".T."
FOR EACH cParte IN aList
cFiltro +=[ .AND. "] + cParte + [ $ nome]
NEXT
SET FILTER TO &cFiltro
Importante:
Note que o filtro é criado com o conteúdo das variáveis, e não fica nenhuma variável nele, evitando problemas.
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 12:29
por alxsts
Olá!
Para o teu caso, o mais indicado é a função OrdWildSeek()
OrdWildSeek()
Searches a value in the controlling index using wild card characters.
Syntax
OrdWildSeek( <cWildCardString>, ;
[<lCurrentRec>] , ;
[<lBackwards>] ) --> lFound
Arguments
<cWildCardString>
This is a character string to search in the controlling index. It may include the wild card characters "?" and "*". The question mark matches a single character, while the asterisk matches one or more characters.
<lCurrentRec>
This parameter defaults to .F. (false) causing OrdWildSeek() to begin the search with the first record included in the controlling index. When .T. (true) is passed, the function begins the search with the current record.
<lBackwards>
If .T. (true) is passed, OrdWildSeek() searches <cWildCardString> towards the begin of file. The default value is .F. (false), i.e. the function searches towards the end of file. Return
The function returns .T. (true) if a record matching <cWildCardString> is found in the controlling index, otherwise .F. (false) is returned.
Description
OrdWildSeek() searches a character string that may include wild card characters in the controlling index. This allows for collecting subsets of records based on an approximate search string. Records matching the search string are found in the controlling index, and the record pointer is positioned on the found record.
When a matching record is found, the function Found() returns .T. (true) until the record pointer is moved again. In addition, both functions, BoF() and EoF() return .F. (false).
If the searched value is not found, OrdWildSeek() positions the record pointer on the "ghost record" (Lastrec()+1), and the function Found() returns .F. (false), while Eof() returns .T. (true). The SET SOFTSEEK setting is ignored by OrdWildSeek().
Example
Código: Selecionar todos
// The example uses two wildcard search strings to show
// possible search results of OrdWildSeek()
PROCEDURE Main
LOCAL aCust := {}
USE Customer
INDEX ON Upper(LastName) TO Cust01
DO WHILE OrdWildSeek( "*MAN?", .T. )
AAdd( aCust, FIELD->Lastname )
ENDDO
AEval( aCust, {|c| QOut(c) } )
// Found records:
// Dormann
// Feldman
GO TOP
aCust := {}
DO WHILE OrdWildSeek( "*EL*", .T. )
AAdd( aCust, FIELD->Lastname )
ENDDO
AEval( aCust, {|c| QOut(c) } )
// Found records:
// Feldman
// Hellstrom
// Keller
// Reichel
USE
RETURN
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 16:52
por deividdjs
c_descr := space(20)
cParte := space(10)
@23,01 say "Busca por..:" color "N/W*"
@23,14 get c_descr picture "@!" color "R/W*"
read
aList := hb_RegExSplit(" ",c_descr)
cFiltro := ".T."
FOR EACH cParte IN aList
cFiltro +=[ .AND. "] + cParte + [ $ c_descr]
NEXT
SET FILTER TO &cFiltro
Boa Tarde amigos .. obrigado pelas dicas ... tentei o que o José me enviou porem sem sucesso .. onde eu errei ?? SIMPLISMENTE NÃO FILTRA NADA !!
Att,
Deivid
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 18:15
por Itamar M. Lins Jr.
Olá!
exemplos de busca do usuário: lamp 24 50hz ou lam led 24 ou 24w 4000k
Não vai funcionar.
Precisa ser apenas lamp ou apenas 24 50hz ou apenas led 24...
Saudações,
Itamar M. Lins Jr.
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:01
por deividdjs
e como eu poderia criar um filtro para obter desta forma que eu preciso ... com partes da descrição do produto eles trazer todos que apresentam esses pedaços selecionados ...

PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:12
por JoséQuintas
deividdjs escreveu:tentei o que o José me enviou porem sem sucesso .. onde eu errei ?? SIMPLISMENTE NÃO FILTRA NADA !!
Desculpe, coloquei com erro.
faltou aspas na segunda parte.
Um jeito relativamente fácil de conferir é mostrar o conteúdo de cFiltro pra conferir visualmente.
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:16
por JoséQuintas
Supondo que digitem AA BB CC, o filtro deverá ser:
Código: Selecionar todos
.T. .AND. "AA" $ c_Descr .AND. "BB" $ c_Descr .AND. "CC" $ c_Descr
o primeiro .T. não faz nada. É só pra facilitar usar .AND. em tudo, sem ter que ficar testando se precisa.
E como dá pra ver, não depende de variável ao ser aplicado, o que evita problemas ao mudar de rotina.
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:40
por deividdjs
coloquei as " (aspas) não retorna nada no filtro .. estou testando no TBROWER direto quando digito uma unica parte ele limpa a base ....
Código: Selecionar todos
c_descr := space(20)
cParte := space(10)
@23,01 say "Busca por..:" color "N/W*"
@23,14 get c_descr picture "@!" color "R/W*"
read
aList := hb_RegExSplit(" ",c_descr)
cFiltro := ".T."
FOR EACH cParte IN aList
cFiltro +=[ .AND. "] + cParte + ["$ c_descr]
NEXT
SET FILTER TO &cFiltro
DBGOTOP()
teria que retornar o filtro certo ?
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:49
por deividdjs
&cFiltro retorna .F.
Código: Selecionar todos
c_descr := space(20)
cParte := 1
@23,01 say "Busca por..:" color "N/W*"
@23,14 get c_descr picture "@!" color "R/W*"
read
aList := hb_RegExSplit(" ",c_descr)
cFiltro := ".T."
FOR EACH cParte IN aList
cFiltro +=[ .AND. "] + cParte + ["$ cc_descr]
NEXT
SET FILTER TO &cFiltro
@01,10 say &cFiltro
wait
DBGOTOP()
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 19:55
por deividdjs
sim .. testei agora correto tirando o & retornou conforme vc mencionou ..
.T. .AND. "AA" $ c_Descr .AND. "BB" $ c_Descr .AND. "CC" $ c_Descr
porem no tbrowser limpa os registros ...
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 20:09
por deividdjs
José fiz do teste filtrando direto .. não funciona mesmo com 2 ou mais partes ... ele não retorna ...
desta forma ele filtrou todos os cadastros que contem 240 ...
porem quando fiz assim ...
Código: Selecionar todos
SET FILTER TO .T. .AND. "CABLE" $ cc_descr .AND. "240" $ cc_descr
DEVERIA RETORNAR
CABLE 1X240MM 1KV
e não retornou nada !!
PESQUISAR EM UM DBF INDICE CDX
Enviado: 13 Jul 2022 20:16
por JoséQuintas
Se o filtro está como colocou, está correto, deveria mostrar.
Verifique se não falta atualizar o tbrowse.
Talvez um GOTO TOP depois de aplicar o filtro ajude, ou um SKIP -1.
Ou no browse digite ctrl-page up, só pra confirmar se é atualização.