busca por palavra

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

É isso que muitas vezes desencoraja a migração Clipper x xHarbour, pois nem todas as LIBs que eu utilizava podem ser usadas no xHarbour. Mas isso é também outra questão, que inclusive ocorre com outras ferramentas. Vale de referência a sua menção do xHarbour, mas por enquanto estou me "limitando" a Clipper.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Eis aí a função que uso num sistema Clipper 5.2 e funciona legalzinha.
Como os colegas poderão ver, ela não depende de indice.
Se satisfizer a condição, ela vai passando por entre os registros.
Seria muito mais interessante, claro, se o resultado dela fosse jogado num outro banco temporario, para ser mostrado num tbrowse, ( exatamente o que estou tentando, imagine ter de ir passando por n registros ) mas por enquanto é isso.

Código: Selecionar todos

case tempo = K_F6
       dbgotop()
       incr:= space(20)
       h1:=SaveScreen(00,00,24,79)
       DbgShadow(05,42,09,76)
       @ 05,42,09,76 box B_SINGLE + space(1) colo "g+/g"
       @ 06,43 say padc("ExpressÆo p/ pesquisar",32) colo "w+/g"
       @ 08,49 get incr colo "gr+/n*" pict "@!" 
       set curs on
       read
       set curs off
       do while !eof()
            if busca(@incr)
               @ 05,42,09,76 box B_SINGLE + space(1) colo "r+/r"
               @ 07,43 say padc(chr(25)+ " p/ avan‡ar    ESC - Sa¡da",32)
                tone(333,.1)
                inkey(0)
                if lastkey() = 24
                   skip
                elseif lastkey() = 27
                   exit
                endif
             else
                skip
             endif
       enddo
       @ 05,42,09,76 box B_SINGLE + space(1) colo "b+/b"
       @ 07,43 say padc("Final da Pesquisa",32) colo "w+/b"
        tone(44,6)
        RestScreen(00,00,24,79,h1)
        cTb3:RefreshAll()
        loop

Código: Selecionar todos

Function Busca(arg)
if at(alltrim(arg),clinom) > 0
   Destaca(cTb3)
   cTb3:stabilize()
   MostraC()
   return .t.
else
   return .f.
endif
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

Eu faço assim, porem jogando para um vetor e depois mostrando ele numa funçaö que fiz que dá um TBROWSE num vetor

Código: Selecionar todos



mtamanho=25
hfil_ope1 = '='
hfil_cod1 = space(mtamanho)
hcolor = SETCOLOR(cor[5])
@ mlin_sup-1,mcol_sup+01 SAY '['+SPACE(30)+']'
@ mlin_sup-1,mcol_sup+02 get hfil_ope1 pict '!' valid critletra(hfil_ope1,'=#',['=' - Igual  ou  '#' - Diferente])
@ mlin_sup-1,mcol_sup+04 get hfil_cod1 pict '@!'
SETCOLOR(hcolor)
ex_read()
set key K_TAB to udf_tab
if lastkey()=K_ESC
   RESTSCREEN(mlin_sup-1,mcol_sup,mlin_sup-1,mcol_inf,buffer)
   return(1)
endif
private v_fil:={},v_fil1:={}
for x=1 to mtamanho
   xpedaco=substr(hfil_cod1,x,1)
   if !empty(xpedaco)
      aadd(v_fil1,{x,xpedaco})
   endif
next
aviso('Filtrando Registros...')
xreg_ant=recno()
select DOCUMENT
go top
do while !eof()
   if pode_filtro(substr(doc_origem,1,mtamanho),hfil_ope1,hfil_cod1,v_fil1)
      aadd(v_fil,{cod_doc,nr_rev,titulo,titulo2,titulo3,cod_end,cod_end3,cod_end2})
   endif
   skip
enddo

private xhead[8],xwidt[8],xmypi[8],eyerow
xhead[1]='Codigo'
xwidt[1]=15
xmypi[1]=memvar->mask_doc
xhead[2]='Rev'
xwidt[2]=03
xmypi[2]='@!'
xhead[3]='Titulo'
xwidt[3]=50
xmypi[3]='@!'
xhead[4]='Titulo - Continuacao'
xwidt[4]=50
xmypi[4]='@X'
xhead[5]='Titulo - Continuacao'
xwidt[5]=50
xmypi[5]='@X'
xhead[6]='Original'
xwidt[6]=len(mask_ende)-3
xmypi[6]=mask_ende
xhead[7]='Copial'
xwidt[7]=len(mask_ende)-3
xmypi[7]=mask_ende
xhead[8]='Digital'
xwidt[8]=len(mask_ende)-3
xmypi[8]=mask_ende

mexc=abrowse(.t.,.f.,.t.,.f.,.f.,"",1,v_fil,mlin_sup,mcol_sup,22,78,xhead,xwidt,xmypi,{|t,l,c| gt_help(t,l,c)},,,.t.,,,{K_F6})
if mexc=K_ESC
   go xreg_ant
   RESTSCREEN(mlin_sup-1,mcol_sup,mlin_sup-1,mcol_inf,buffer)
   return(1)
else
   set order to 1
   seek v_fil[eyerow,1]
   set order to mind_old
   RESTSCREEN(mlin_sup-1,mcol_sup,mlin_sup-1,mcol_inf,buffer)
   return(1)
endif

               
function pode_filtro
para mcampo,moperador,mfiltro,v_fil
private mpode:=.t.,x
if !empty(mfiltro)
   mpode=iif(moperador='=',.t.,.f.)
   for x=1 to len(v_fil)
      if substr(mcampo,v_fil[x,1],1)#v_fil[x,2]
         mpode=iif(moperador='=',.f.,.t.)
         exit
      endif
   next
endif
return(mpode)






Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Luciano Bonfim escreveu:interessante essa funçäo, eu näo a conhecia.... funciona no xharbour?
No Harbour funciona !!!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

alaminojunior escreveu:Seria muito mais interessante, claro, se o resultado dela fosse jogado num outro banco temporario, para ser mostrado num tbrowse, ( exatamente o que estou tentando, imagine ter de ir passando por n registros )
Sim, isso mesmo assim como disse o colega Luciano Bonfim. Mas o exemplo que tem na seção downloads do fórum (a que mencionei) tem a pesquisa por TBROWSE.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: busca por palavra

Mensagem por asimoes »

Evaldo,

Você quer exibir o resultado num dbedit?
Se for eu tenho uma função pronta para isso.

[]´s

evaldo escreveu:Ola pessoal, estou precisando de um busca por palavra ex.: qdo digitar joao aparecer todos joao.

antonio joao
joao carlos

obrigado
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

alaminojunior escreveu:Eis aí a função que uso num sistema Clipper 5.2 e funciona legalzinha.
Como os colegas poderão ver, ela não depende de indice.
Mesmo esquema do SET FILTER e LOCATE: ir de registro a registro. Isso num arquivo grande fica uma lesma manca. Daí a grande vantagem de indexar e usar a função sx_WildSeek(). Mesmo que a chave de índice seja utilizada apenas e tão somente para uma busca num único ponto do programa. O índice é compactado mesmo. :)

Isso, claro, pra quem usa a SIX.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

E um detalhe importante: como eu já disse antes numa outra thread, até pode ser utilizado o SET FILTER ou LOCATE num DBF gigantesco, mas desde que se faça o DBF menor. Isso se faz com o uso de SCOPE. Aí sim, pode-se usar um filtro qualquer sem medo de perda de velocidade.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Claro que se for possível usar a Six, não pense duas vezes !
Agora no meu caso como estou preso a certos detalhes, foi a solução.
Como mencionei mais acima, implementei a função para jogar num banco temporário e mostrar num tbrowse, ficou muito boa.
Detalhe: No banco temporario, de um DbSeek() antes do Set Filter.

Código: Selecionar todos

Function Busca(arg)
dbgotop()
do while !eof() 
   if at(alltrim(arg),clinom) > 0
      cdtmp000->(dbappend())
      if neterr()
         loop
      else
         @ 08,65 say clicod pict "99999-9" colo "n/g"
         repl cdtmp000->tmpcod with clicod
         repl cdtmp000->tmpnom with clinom
         repl cdtmp000->tmpcid with clicid
         repl cdtmp000->tmpusu with netname()
         cdtmp000->(dbcommit())
         cdtmp000->(dbunlock())
         skip
      endif
   else
      skip
   endif
enddo
return cdtmp000->(reccount())

Código: Selecionar todos

Function Brow_Incr
Private local1:=select(),local2:=indexord(),local3:=savescreen(06,03,24,78)
select cdtmp000
set order to 1
dbseek(trim(netname()))
set filter to tmpusu = trim(netname())
set color to "n/w","gr+/b",,,"g/w"
Win(06,03,22,76,"Consulta por parte do nome","w+/bg","bg/w")
@ 21,04 say padc("[ ENTER ] - Visualiza os dados do cliente.",71) colo "r/w"
vCon_ = "Cliente                                            Cidade"
pTb4:= TbColumnne(Vcon_, { || tmpnom + " " + tmpcid })
pTb3:= TbrowseDB(07,04,20,75)
pTb3:HeadSep:= "Ä"
pTb3:ColorSpec:= "n/w,gr+/b,n+/w,n+/n,n/w"
pTb4:DefColor:= {5}
pTb3:AddColumn(pTb4)
Do While .t.
   Do While !pTb3:Stabilize()
   Enddo
   tempo:= Inkey(180)
   Do Case
      Case Tempo = 0
           Protect()
           pTb3:RefreshAll()
           loop
      Case Tempo = K_DOWN
           pTb3:Down()
           Loop
      Case Tempo = K_UP
           pTb3:Up()
           Loop
      Case Tempo = K_PGUP
           pTb3:PageUp()
           pTb3:RefreshAll()
           Loop
      Case Tempo = K_PGDN
           pTb3:PageDown()
           pTb3:RefreshAll()
           Loop
      Case Tempo = K_ESC
           _rest(06,03,24,78,local3,9)
           set filter to
           dbseek(trim(netname()))
           do while !eof() .and. trim(tmpusu) = trim(netname())
              bloq(1)
              dele
              unlock
              skip
           enddo
           commit
           select(local1)
           set order to local2
           return
      case lastkey() = 13
           kkey:= tmpcod
           set filter to
           dbseek(trim(netname()))
           do while !eof() .and. trim(tmpusu) = trim(netname())
              bloq(1)
              dele
              unlock
              skip
           enddo
           commit
           _rest(06,03,24,78,local3,9)
           select(local1)
           set order to 1
           return kkey
      endcase          
enddo
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Agora no meu caso como estou preso a certos detalhes, foi a solução.
Nenhuma chance de passar a usar a SIX. Pouco precisará ser alterado, já que os comandos são automaticamente convertidos por CH.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Luciano Bonfim escreveu:interessante essa funçäo, eu näo a conhecia.... funciona no xharbour?
Já tem no xharbour da CVS tmb. incluido no dia 31/10/2007 por Miguel Angel Marchuet
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

busca por palavra

Mensagem por JAIR RANGEL »

Olá, Pessoal !

Existe na HMG uma função semelhante a sx_wildseek() ?

Utilizo dbfcdx. O cadastro de Produtos é muito grande para utilizar SET FILTER ou LOCATE.
Ler todo o arquivo para selecionar string dentro do campo nome, também ficaria um processo lento.
Utilizo tabelas DBF.

Que a força esteja com todos voces !!
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Responder