Jump to content
Fivewin Brasil

Pesquisa Filtrada


macs

Recommended Posts

Olá pessoal, gostaria de saber se existe algum tipo de pesquisa filtrada. Não gostaria de usar o DbSetFilter por conta que é uma filtragem muito lenta, só serve para tabelas com poucos registros. 

Ex: Na hora que eu digitar uma palavra, por exemplo, PRETO, só aparecer os registros da tabela que possuir em seu conteúdo o campo com a palavra PRETO.

Obs: DBF com SIXCDX

 

 

 

Link to comment
Share on other sites

Boa tarde. 

Eu fiz algo mais ou menos assim:

Criei uma tabela para armazenar palavras (TBPESQCL.DBF) que é alimentada após a gravação do registro na tabela de clientes/Fornecedores, onde nessa tabela além  dessas palavra chave eu armazeno também o código do cliente, de modo que ao pesquisar nessa tabela e selecionar uma certa palavra chave o sistema mostra em quais clientes contém a mesma.

Seque a rotina:

STATIC FUNCTION CadSearch()
LOCAL cNOME,cDESPREZ,nMINLEN
DbSelectArea("TBPESQCL")
FOR i = 1 TO 3
    n := 0
    cDESPREZ  := ' .()"+/&,-'
    nMINLEN := 3
    IF i = 1
       cNOME := TRIM(TMPCAD->CLIRAZAO) // Monta palavra chave da razão social
    ELSEIF i = 2
       cNOME := TRIM(TMPCAD->CLINOME)  // Monta palavra chave do nome de fantasia
    ELSE
       cNOME := TRIM(TMPCAD->CLITEL1)  // Monta palavra chave do telefone
       nMINLEN := 7
       cDESPREZ  := ' ()"+/&,'
       DO CASE
       CASE !SUBSTR(ARQCLI->CLITEL1,3,1) $ "0123456789"
          n := 3
       CASE !SUBSTR(ARQCLI->CLITEL1,4,1) $ "0123456789"
          n := 4
       CASE !SUBSTR(ARQCLI->CLITEL1,6,1) $ "0123456789"
          n := 6
       ENDCASE
    ENDIF
    cWORD := " "
    WHILE .T.
       ++ n
       cCHR := SUBSTR(cNOME,n,1)
       IF !cCHR $ cDESPREZ
          cWORD += cCHR
       ENDIF
       IF cCHR $ cDESPREZ  .OR. n = LEN(cNOME)
          // ? cWORD
          cWORD := ALLTRIM(cWORD)
          IF LEFT( cWORD,1 ) == "-"
             cWORD := LTRIM( SUBSTR(cWORD,2) )
          ENDIF
          IF LEN( cWORD ) > nMINLEN .AND. !"LTDA" $ cWORD
             DbSelectArea("TBPESQCL")
             SEEK PADR(cWORD,15)+STR(ARQCLI->CLICOD,6)
             IF EOF()
                DbAppend()
                REPLACE CODIGO WITH ARQCLI->CLICOD
                REPLACE NOME WITH cWORD
             ENDIF
             DbSelectArea("ARQCLI")
          ENDIF
          cWORD := " "
       ENDIF
       IF n = LEN(cNOME) .OR. EMPTY( SUBSTR(cNOME,n) )
          EXIT
       ENDIF
    ENDDO
NEXT
DbSelectArea("ARQCLI")
RETURN nil

Link to comment
Share on other sites

Para quem possa interessar achei esta solução... não é exatamente o que eu queria mas resolve.

     cPesqWildSeek := "*PRETO*"

     ITE->( DbGoTop() )

       && -- Processando pesquisa filtrada
       WHILE ITE->( OrdWildSeek( cPesqWildSeek, .T. ) )

          FstatProc(12, GetColSpinBar(33),"Gr+/B")

          && -- Checando se houve cancelamento do processamento
          IF cancelProc()
              EXIT
          ENDIF

          IF ITE->ATIVO <> "N"
             aAdd( aDados, { ITE->CODIGO_EMP, ITE->DESCRICAO, ITE->PRVDATU, ITE->SLDATU, ITE->REF_FABR, ITE->REF_ORIG, ITE->APELIDO, ITE->( Recno() ) } )
          ENDIF

       ENDDO
 

Por fim só é exibir uma lista com os dados filtrados.

 

 

Link to comment
Share on other sites

 

O ADS tem um filtro otimizado, aqui utilizamos sem problemas

(cTabela)->(ADSSETAOF(cFiltro))

 

 

a velocidade deste filtro é a mesma coisa que usar banco de dados relacional, nunca entendi o motivo do pessoal do forum não usar ADS, digo para aqueles que ainda estão no DBF.

 

Abs 

Luiz Fernando

FWH1104,xharbour1104,bcc55,mysql

Link to comment
Share on other sites

 

É vdd que com ads dá para trabalhar com o banco de dados em Nuvens? Tipo SQL faz... colocar na NET

Ola Rone se vc querer apenas resolver problema de lentidão com filtro, com poucas linhas no inicio do sistema vc já estara usando a rddcdx, agora para ter acesso externo via IP na minha opinião não compensa o trabalho, dedica este tempo já para mudar para um banco de dados tipo mysql, mssql ou postgree.

 

Abs

Luiz Fernando

Link to comment
Share on other sites

Bom dia,

eu uso desta forma:


dbSelectArea( "Desp_pag" )
   //--------------------------------------------------------------------
   cPro := ( oPesq:oGet:Buffer )

      lAchou := .f.
      //--------------------------------------------------------------------
      // Busca pelo CAMPO NUM DOC a primeira Ocorrencia do Código Digitado
      //--------------------------------------------------------------------
      IF Desp_pag->( dbSeek( Left( cPro, oPesq:nPos - 1 ), .t. ) )
   
         lAchou := .t.
   
      EndIF

   // Filtra todos os Itens que satisfaçam a letra digitada
   cPro := IF( Valtype( tPesq ) = 'D', Dtos( tPesq ), Alltrim( tPesq ) )

   ordScope( 0, Rtrim( cPro ) )
   ordScope( 1, Rtrim( cPro ) )
   dbGotop()

   oLbx:Refresh()  // listbox
   xSetFocus( oLbx )

o filtro só mostra no browse o que esta no OrdScope

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...