Página 2 de 3

PESQUISAR EM UM DBF INDICE CDX

Enviado: 13 Jul 2022 20:29
por deividdjs
sim.. ele esta atualizando ...

até porque quando eu coloco somente uma parte ele filtra ... se é com duas partes ele não filtra ...

Código: Selecionar todos

c_descr := space(20)
cParte  := ""
@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 
  	  
	 IF Empty(cParte)
	    EXIT
	 ENDIF   

   cFiltro +=[ .AND. "] + cParte + [" $ cc_descr]

NEXT

SET FILTER TO &cFiltro
DBGOTOP()

@01,01 say cFiltro
wait

/*
SET FILTER TO .T. .AND. "240" $ cc_descr //.AND. "" $ cc_descr
*/
DBGOTOP()

PESQUISAR EM UM DBF INDICE CDX

Enviado: 13 Jul 2022 23:37
por JoséQuintas
maiúsculas/minúsculas?
Não vejo porque não funcionar.
filtro.png

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 00:35
por deividdjs
José você está certo ...

funciona .. eu fiz um cadastro novo de um item e funcinou somente com ele ... eu migrei o banco de dados de um cliente que era em FOXPRO... todas as outras pesquisas funcionam normalmente somente esse filtro que não funciona com os dados migrados ... sabe o que pode ser ?? e qual a solução ?? veio de uma base de dados com um computador em espanhol ... inclusive na migração alguns caracteres ficaram estranhos ...

Obrigado amigo e desculpa minha ignorancia ...

Forte Abraço!

Deivid

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 08:21
por Itamar M. Lins Jr.
Olá!
Eu já vi em outros programas usarem o curinga! "lamp%50hz" conforme for SQL
exemplos de busca do usuário: lamp 24 50hz ou lam led 24 ou 24w 4000k
SET FILTER TO "24w" $ descricao .and. "4000k" $ descricao .and. "50hz" $ descricao

Uma coisa vai anular a outra. Tem que ser .or.

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 08:27
por Itamar M. Lins Jr.
Olá!
Outra coisa, não use "SET FILTER" vai matar sua aplicação. Vai ficar muito lento.

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 08:41
por Itamar M. Lins Jr.
Olá!
Resposta para ultima pergunta.
Vai precisar usar 850 para PTISO,
Espanha usa acentos no Ñ por exemplo e £ também.
Precisa saber a pagina de código origem e saber a sua. Se não usa acentos 437(USA) vai precisar mudar a sua pagina de códigos para PTISO
E usar UPPER() no replace para deixar tudo maiúsculo.

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 09:13
por deividdjs
sim Itamar .. eu sei q o set filter to é lento .. porem não encontrei outra alternativa a não ser essa que o José me passou ... até consegui filtrar com indices temporarios porém não consigo fazer funcionar com duas ou mais palavras chaves ....

Código: Selecionar todos

c_descr := space(50)

@23,01 say "Busca por..:" color "N/W*"         
@23,14 get c_descr picture "@!" color "R/W*"   
read                                           

IF !Empty(c_descr)
	 
	   IF PRO->(ordNumber("TMPFILTRO")) > 0
	      PRO->(ordDestroy("TMPFILTRO"))
	   EndIf
	   cCriterio  := "Filtrado por descri‡Æo"
	   c_descr    :=  AllTrim(Upper(c_descr))
	   nFiltroLen :=  Len(c_descr)
    IF lFiltraIncide
       cQuery := '"' + c_descr + '"' + "$ cc_descr"
    ELSE
        cQuery := '"' + c_descr + '" == substr(upper(cc_descr),1,' + str(nFiltroLen) +  ')'
    ENDIF

	   dbSelectArea('PRO')
	   Index on cc_descr TAG TMPFILTRO FOR &cQuery temporary
	   PRO->(dbGoTop())
	   
	   @01,01 say cQuery
	   
ENDIF
oTab:Refreshall()

alguem sabe se consigo fazer essa condição no FOR do comando INDEX ON ??

Att,

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 10:40
por Itamar M. Lins Jr.
Olá!
alguem sabe se consigo fazer essa condição no FOR do comando INDEX ON ??
Se funciona com FILTER funciona com INDEX.
Use .OR. para indexar. Porquê .and. MATA as outras alternativas se não CONTER (não satisfazer) o critério.
index on ... FOR "led" $ descricao .or. "50hz" $ descricao.
cQuery := "led" $ descricao .or. "50hz" $ descricao.
index on ... FOR &cQuery

Está lá no primeiro exemplo que postei FUNCIONA INCLUSIVE com LETODBf.

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 10:53
por Itamar M. Lins Jr.
Olá!
Aqui nesta parte:

Código: Selecionar todos

       cQuery := '"' + c_descr + '"' + "$ cc_descr"
Vc usa o exemplo do José Quintas, que ficou muito bom a parte de JUNÇÃO. Use .OR. no lugar de .AND.

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 11:51
por Itamar M. Lins Jr.
Olá!
Fiz aqui e ficou bom. Até deixei o meu dessa forma.

Código: Selecionar todos

LOCAL cQuery := "", cParte := "", nParte := 0, aList
...
IF !Empty(cFiltro)
   aList := hb_RegExSplit(" ",cFiltro)
   FOR EACH cParte IN aList   
      IF Empty(cParte)
         Exit
      ENDIF

      IF ++nParte > 1
         cQuery += ' .OR. '
      ENDIF
      
      cQuery += "'" + cParte + "'" +  ' $ mercadoria'
            
   NEXT

   IF eq->(ordNumber("TMPFILTRO")) > 0
      eq->(ordDestroy("TMPFILTRO"))
   EndIf

   Index on mercadoria tag TMPFILTRO FOR &cQuery temporary
   oBrw:Refresh()

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 14:07
por deividdjs
Obrigado aos amigos pela ajuda ... deu certinho o filtro ITAMAR com o INDEX ... porem no meu caso eu achei mais interessante deixar com o .AND. que ele me traz certinho as combinações que eu solicito .. ficou showw de bola ...

Código: Selecionar todos

*----------------------------*
 procedure PESQ_PROD_CONTEM
*---------------------------*
	LOCAL cQuery := "", cParte := "", nParte := 0, aList, cFiltro := space(30)
	    
	@23,01 say "Busca por..:" color "N/W*"         
   @23,14 get cFiltro picture "@!" color "R/W*"   
   read                                           
	    
	IF !Empty(cFiltro)
	   
		aList := hb_RegExSplit(" ",cFiltro)
	   FOR EACH cParte IN aList   
	      IF Empty(cParte)
	         Exit
	      ENDIF
	 
	      IF ++nParte > 1
	         cQuery += ' .AND. '
	      ENDIF
	       
	      cQuery += "'" + cParte + "'" +  ' $ cc_descr'
	             
	   NEXT
	 
	   IF PRO->(ordNumber("TMPFILTRO")) > 0
	      PRO->(ordDestroy("TMPFILTRO"))
	   EndIf
	 
	   Index on cc_descr tag TMPFILTRO FOR &cQuery temporary
 
	   PRO->(dbGoTop())

	ENDIF

	RETURN

Forte abraço amigos!!

Djs

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 14:47
por carlaoonline
Boa tarde!

..aproveitando o barco andando..
deividdjs escreveu:eu achei mais interessante deixar com o .AND. que ele me traz certinho as combinações que eu solicito
No caso o .OR. sugerido pelo Itamar ou o .AND. que decidiu usar, ambos estão corretos, eles farão 'literalmente' o que se propõe:

Se usar o .OR. ele trará os registros que possuem -> 'led' ou '50hz' ou '127v'

Se usar o .AND ele trará apenas os registros em que todas as expressões estejam no mesmo registro.


Minha sugestão então é colocar um Botão ou um CheckBox para o usuário decidir, e na programação ficaria mais ou menos assim:

Código: Selecionar todos

lBuscaExata= form_maim.chkbox_busca_exata.value

If   lBuscaExata
  
  // aqui cria a cQuery com os comandos com .AND.
   
 Else

  // aqui cria a cQuery com os comandos com .OR.
 
Endif


Outra coisa que eu uso para evitar problema com maiúsculas e minúscula é indexar todos os campos caracter com UPPER na frente e em todas as buscar eu coloco UPPER também na frente da expressão a ser buscada.

Código: Selecionar todos

INDEX ON Upper( OBS1 ) + Upper( OBS2 ) + Upper( OBS3 ) TAG OBS TO CLIMARK FOR !Deleted()
No exemplo acima eu indexo os 3 campos que contém observações em uma única TAG e tudo para maiúscula, então na hora de procurar poderá estar em qquer um dos campos tanto faz se maiúscula ou minúscula, e eu tenho que colocar o UPPER na frente da expressão a ser usada no SEEK, ou no SET FILTER ou no WordWildSeek ...

PESQUISAR EM UM DBF INDICE CDX

Enviado: 14 Jul 2022 23:38
por deividdjs
Boa noite Carlão .. no meu caso o .AND. resolveu certinho da forma que eu precisava ... ficou show e muito rapida a pesquisa ....

estou tentando criar uma rotina de troca de um certo trecho da descrição ... porem o comando só funciona diminuindo o texto aumentando não ... alguem consegue sanar essa minha duvida ??

um exemplo do que aconteceu ...

eu pedi pro sistema mudar o que continha na descrição com o nome "ABRAZADERA" para "ABRAZ" .. primeira execução funcionou perfeitamente ... quando eu pedí para ele trocar "ABRAZ" por "ABRAZADERA" novamente .. simplismente não ocorre nada ...

segue o codigo :

Código: Selecionar todos

*---------------------------------*
 PROCEDURE MUDA_DESCRIPCION_PROD     // BUSCA E MUDA PALAVRAS NAS DESCRIPCION
*---------------------------------*

 local c_textold, c_textnew
 local T_PRECO :=  WIN(07,06,13,73, "* * SUBSTITUIR DESCRIPCIàN PRODUCTOS * *", WT_AZUL1CINZA, WD_AZUL1CINZA)

 c_textold := space(40)
 c_textnew := space(40)

 SETCOLOR("N/W,RG+/B+,,,W+/W")
 SET COLOR TO "B/W"

 c_textold := cc_descr
 
 @09,07 say "Texto antiguo : " get c_textold picture "@!"
 @11,07 say "Nuevo texto..: " get c_textnew picture "@!"
 read
 
 if lastkey()=27 
    return(2)
 endif           
 
 vAtuReg := MsgBox2("Estas seguro para hacer estos cambios?",,13,,,2) 

 if vAtuReg == 1 

    MSGBOX("* * Ejecutando los cambios.....  * *","Aguarde!")
    inkey(1)

 	SELECT PRO
 	ORDSETFOCUS(2)
 	DBGOTOP()
  
 	DO WHILE !EOF()
		
		cFrase := strtran(cc_descr,c_textold,c_textnew)
		
		IF cc_descr # cFrase 
   		BLOQ_REG()
	   	replace cc_descr with cFrase
         DBCOMMIT()
		   DBUNLOCK()
		endif  
      
      DBSKIP()
 
  ENDDO
  
ENDIF

RETURN(2) 

Abraço a todos...

PESQUISAR EM UM DBF INDICE CDX

Enviado: 15 Jul 2022 09:18
por Itamar M. Lins Jr.
Olá!
Não pode usar o campo indexado.
Quando muda sai da posição.

Use -> REPLACE ... FOR cCondicao
ou OrdSetFocus(0) ; DO WHILE cCODICAO ; TRAVAR(); REPLACE ...; DESTRAVAR(); dbSkip(); ENDDO

Saudações,
Itamar M. Lins Jr.

PESQUISAR EM UM DBF INDICE CDX

Enviado: 15 Jul 2022 10:21
por deividdjs
Ola Itamar .. eu tirei ordsetfocus() e mesmo assim ... ele só funciona quando eu diminuo a palavra chave quando o valor novo é maior que o valor antigo ele não faz nada ... estranho!! deveria fazer certo ??