macs Posted September 21, 2017 Report Share Posted September 21, 2017 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 Quote Link to comment Share on other sites More sharing options...
Theotokos Posted September 21, 2017 Report Share Posted September 21, 2017 Creio que vc vai conseguir com Indices Temporário... (memória) Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted September 21, 2017 Report Share Posted September 21, 2017 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 Quote Link to comment Share on other sites More sharing options...
macs Posted September 25, 2017 Author Report Share Posted September 25, 2017 Obrigado Theotokos e jfaguia, mas esta solução não resolve meu problema. Quote Link to comment Share on other sites More sharing options...
macs Posted September 26, 2017 Author Report Share Posted September 26, 2017 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. Quote Link to comment Share on other sites More sharing options...
gilmer Posted September 26, 2017 Report Share Posted September 26, 2017 O ADS tem um filtro otimizado, aqui utilizamos sem problemas (cTabela)->(ADSSETAOF(cFiltro)) Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 26, 2017 Report Share Posted September 26, 2017 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 Quote Link to comment Share on other sites More sharing options...
macs Posted September 26, 2017 Author Report Share Posted September 26, 2017 O ADS tem um filtro otimizado, aqui utilizamos sem problemas (cTabela)->(ADSSETAOF(cFiltro)) Utilizo o SIXCDX, para realizar a mudança para ADS é complicado? Tem algum documento explicando como fazer? Quote Link to comment Share on other sites More sharing options...
gilmer Posted September 27, 2017 Report Share Posted September 27, 2017 Na teoria não é complicado, no xharbour tem exemplo ads.prg Quote Link to comment Share on other sites More sharing options...
Theotokos Posted September 27, 2017 Report Share Posted September 27, 2017 É vdd que com ads dá para trabalhar com o banco de dados em Nuvens? Tipo SQL faz... colocar na NET Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 27, 2017 Report Share Posted September 27, 2017 É 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 Theotokos 1 Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted September 30, 2017 Report Share Posted September 30, 2017 ADS é gratuito? Onde posso baixar? Quote Link to comment Share on other sites More sharing options...
gunafe Posted October 5, 2017 Report Share Posted October 5, 2017 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.