Página 1 de 1

FILTRAR DADOS

Enviado: 15 Jul 2005 10:55
por Hasse
Bom dia amigos.

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.)
Abraços

Hasse
[/b]