Tirando a idéia do RDD SIX3, na função Sx_WildMatch(), desenvolvi uma rotina para FILTRAR dados de um DBF.
A rotina é meio longa para o meu gosto, e tenho certeza que pode ser melhorada, por este motivo estou colocando-a no Fórum, e quem sabe algum colega queira colocar a sua pitada de sal no tempero...
Funciona da seguinte forma:
Entrada -->> Maria*Aparecida*Silva
Busca pelo primeiro nome na sua posição correta e os seguintes
em qualquer posição, como abaixo:
Maria Aparecida Silva
Maria Silva Aparecida
Maria Julia Aparecida Martins da Silva
Maria Silva Martins
Entrada -->> *Maria*Martins*Silva
Busca por qualquer nome em qualquer posição, como abaixo:
Maria Martins da Silva
Aparecida Maria Silva
Maria Silva Martins
Silvana Maria Silva
Antônio Silvano Silva Martins
Entrada -->> #*Maria*Martins*Silva
Busca por maiúsculas e minúsculas ao mesmo tempo, como abaixo:
MARIA aparecida sILVA Martins
Aparecida Maria SILVA MARTINS
Ver código abaixo:
Código: Selecionar todos
FUNCTION SETFILTRO()
*
c_filtro := "" && Variável com o conteúdo da string de busca
&& a ser definida na FUNCTION FILTRAR()
&& que cada qual pode criar a seu gosto.
c_campo := oFieldName[OTB:colPos]
&& Nome do campo atual (posição da janela)
*
IF FILTRAR()
m := c_dois := c_tres := ""
*------------------------------------------------------------------------------
* Início da busca por Maiúsculas e Minúsculas.
*------------------------------------------------------------------------------
IF LEFT(c_filtro,01)=="#"
c_filtro := UPPER(c_filtro)
c_filtro1 := SUBS(c_filtro,02)
n_pos := AT("*",c_filtro1)
IF LEFT(c_filtro1,01) == "*"
c_filtro1 := SUBS(c_filtro1,02)
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_um := c_filtro1
c_filtro1 := ""
ELSE
c_um := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_um
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := "AT(c_um,UPPER(&c_campo)) > 0"
ELSEIF n_pos == 0
c_um := c_filtro1
c_fil1 := c_um
bBlock := "UPPER(&c_campo) = c_um"
c_filtro1 := ""
ELSE
c_um := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_um
c_filtro1 := SUBS(c_filtro1,n_pos+1)
bBlock := "AT(c_um,UPPER(&c_campo)) > 0"
ENDIF
*
IF LEN(c_filtro1) > 0
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_dois := c_filtro1
c_filtro1 := ""
ELSE
c_dois := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_fil1 + c_dois
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := bBlock + " .AND. AT(c_dois,UPPER(&c_campo)) > 0"
ENDIF
*
IF LEN(c_filtro1) > 0
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_tres := c_filtro1
c_fil1 := c_fil1 + c_tres
ELSE
c_tres := c_filtro1
c_fil1 := c_fil1 + c_tres
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := bBlock + " .AND. AT(c_tres,UPPER(&c_campo)) > 0"
ENDIF
*------------------------------------------------------------------------------
* Início da busca pela grafia exata
*------------------------------------------------------------------------------
ELSE
c_filtro1 := c_filtro
n_pos := AT("*",c_filtro1)
IF LEFT(c_filtro1,01) == "*"
c_filtro1 := SUBS(c_filtro1,02)
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_um := c_filtro1
c_filtro1 := ""
ELSE
c_um := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_um
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := "AT(c_um,&c_campo) > 0"
ELSEIF n_pos == 0
c_um := c_filtro1
c_fil1 := c_um
bBlock := "&c_campo = c_um"
c_filtro1 := ""
ELSE
c_um := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_um
c_filtro1 := SUBS(c_filtro1,n_pos+1)
bBlock := "AT(c_um,&c_campo) > 0"
ENDIF
*
IF LEN(c_filtro1) > 0
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_dois := c_filtro1
c_filtro1 := ""
ELSE
c_dois := SUBS(c_filtro1,01,n_pos-1)
c_fil1 := c_fil1 + c_dois
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := bBlock + " .AND. AT(c_dois,&c_campo) > 0"
ENDIF
*
IF LEN(c_filtro1) > 0
n_pos := AT("*",c_filtro1)
IF n_pos = 0
c_tres := c_filtro1
c_fil1 := c_fil1 + c_tres
ELSE
c_tres := c_filtro1
c_fil1 := c_fil1 + c_tres
c_filtro1 := SUBS(c_filtro1,n_pos+1)
ENDIF
bBlock := bBlock + " .AND. AT(c_tres,&c_campo) > 0"
ENDIF
*
ENDIF
*
DBSETFILTER({||&bBlock},"&bBlock") && Ativa o Filtro.
*
OTB:goTop() && Esta função é importante para eliminar
* && da tela qualquer dado estranho ao filtro atual.
ENDIF
*
RETURN(.T.)
Hasse
[/b]
