PESQUISAR EM UM DBF INDICE CDX

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

Moderador: Moderadores

Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem 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
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

PESQUISAR EM UM DBF INDICE CDX

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PESQUISAR EM UM DBF INDICE CDX

Mensagem 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
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PESQUISAR EM UM DBF INDICE CDX

Mensagem 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.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

PESQUISAR EM UM DBF INDICE CDX

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem 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
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

PESQUISAR EM UM DBF INDICE CDX

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem 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 ...???
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PESQUISAR EM UM DBF INDICE CDX

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

Código: Selecionar todos

cFiltro +=[ .AND. "] + cParte + [" $ c_descr]
Um jeito relativamente fácil de conferir é mostrar o conteúdo de cFiltro pra conferir visualmente.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PESQUISAR EM UM DBF INDICE CDX

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

Mensagem 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 ?
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem 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()                                          
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem 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 ...
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
deividdjs
Usuário Nível 3
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

Mensagem por deividdjs »

José fiz do teste filtrando direto .. não funciona mesmo com 2 ou mais partes ... ele não retorna ...

Código: Selecionar todos

SET FILTER TO .T. .AND. "240" $ cc_descr
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 !!
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

PESQUISAR EM UM DBF INDICE CDX

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