PESQUISAR EM UM DBF INDICE CDX
Moderador: Moderadores
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
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
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
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
PESQUISAR EM UM DBF INDICE CDX
Olá!
Use índices na memória temporários. Sintaxe Hwgui na tela. Para DBF sintaxe padrão clipper.
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.
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.
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
...
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.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
PESQUISAR EM UM DBF INDICE CDX
Dependendo do tamanho do cadastro, pode usar SET FILTER
Código: Selecionar todos
SET FILTER TO parte1 $ nome .AND. parte2 $ nome .AND. parte3 $ nome
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
PESQUISAR EM UM DBF INDICE CDX
Aproximado, não lembro no hb_RegExSplit qual vém primeiro.
Importante:
Note que o filtro é criado com o conteúdo das variáveis, e não fica nenhuma variável nele, evitando problemas.
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
Note que o filtro é criado com o conteúdo das variáveis, e não fica nenhuma variável nele, evitando problemas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
PESQUISAR EM UM DBF INDICE CDX
Olá!
Para o teu caso, o mais indicado é a função OrdWildSeek()
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().
ExampleCó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
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
Boa Tarde amigos .. obrigado pelas dicas ... tentei o que o José me enviou porem sem sucesso .. onde eu errei ?? SIMPLISMENTE NÃO FILTRA NADA !!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
Att,
Deivid
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
PESQUISAR EM UM DBF INDICE CDX
Olá!
Precisa ser apenas lamp ou apenas 24 50hz ou apenas led 24...
Saudações,
Itamar M. Lins Jr.
Não vai funcionar.exemplos de busca do usuário: lamp 24 50hz ou lam led 24 ou 24w 4000k
Precisa ser apenas lamp ou apenas 24 50hz ou apenas led 24...
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
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 ...
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
PESQUISAR EM UM DBF INDICE CDX
Desculpe, coloquei com erro.deividdjs escreveu:tentei o que o José me enviou porem sem sucesso .. onde eu errei ?? SIMPLISMENTE NÃO FILTRA NADA !!
faltou aspas na segunda parte.
Código: Selecionar todos
cFiltro +=[ .AND. "] + cParte + [" $ c_descr]
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
PESQUISAR EM UM DBF INDICE CDX
Supondo que digitem AA BB CC, o filtro deverá ser:
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.
Código: Selecionar todos
.T. .AND. "AA" $ c_Descr .AND. "BB" $ c_Descr .AND. "CC" $ c_Descr
E como dá pra ver, não depende de variável ao ser aplicado, o que evita problemas ao mudar de rotina.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
coloquei as " (aspas) não retorna nada no filtro .. estou testando no TBROWER direto quando digito uma unica parte ele limpa a base ....
teria que retornar o filtro certo ?
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()
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
&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() Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
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 ...
.T. .AND. "AA" $ c_Descr .AND. "BB" $ c_Descr .AND. "CC" $ c_Descr
porem no tbrowser limpa os registros ...
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- deividdjs
- Usuário Nível 3

- Mensagens: 377
- Registrado em: 19 Set 2006 09:39
- Localização: Foz do Iguaçu / Pr
PESQUISAR EM UM DBF INDICE CDX
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 ...
DEVERIA RETORNAR
CABLE 1X240MM 1KV
e não retornou nada !!
Código: Selecionar todos
SET FILTER TO .T. .AND. "240" $ cc_descr
porem quando fiz assim ...
Código: Selecionar todos
SET FILTER TO .T. .AND. "CABLE" $ cc_descr .AND. "240" $ cc_descr
CABLE 1X240MM 1KV
e não retornou nada !!
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
PESQUISAR EM UM DBF INDICE CDX
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.
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/