Página 1 de 1

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 15:24
por bencz
Olá, gostaria de saber, como posso fazer uma função, ou metodo, para procurar por uma palavra/nome em um dbf, e me levar até a posição q tal nome/palavra esta no browse ( no caso, utilizo o hwgui ), consegui fazer a função para fazer isso, utilizando numeros, mas com palavras, nao estou conseguindo... :X

por exemplo, tenho um DBF com:
  • nome
    cidade
    estado
    telefone
    celular
E tenho neste form, um text box, onde vou escrever oq quero procurar, no caso, esse text box, vai ser p/ procurar por Nome....
como posso fazer isso ???

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 15:52
por alxsts
Olá!

Veja o item Pesquisa letra a letra na Seção Downloads.

Veja o tópico.

Use o recurso de busca do fórum.

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 16:10
por sygecom
Você pode usar ORDWILDSEEK(), veja abaixo um tópico do colega Eolo ensinando:
viewtopic.php?t=7266

Exemplo de como uso com SQL:

Código: Selecionar todos

INICIA A DIOALOG ...ETC...
BROWSE...ETC..

   @ 10,10 Get oBUSCA VAR cBUSCA SIZE 300,24;
   STYLE ES_AUTOHSCROLL  PICTURE '@!' MAXLENGTH 40;
   ON Change {|| FOCALIZA_BRW(oBUSCA:GETTEXT()) };
   TOOLTIP "Clique Aqui Para buscar uma descrição"

Código: Selecionar todos

*************************************
STATIC FUNCTION FOCALIZA_BRW(cBUSCA)
*************************************

PRIVATE oDlgHabla:=NIL
MsgRun("Aguarde,Sistema Separando Informações...")

SELE TABELA
DBSETORDER(2)
IF lOpcaoRadio=1
   TABELA->( DBSEEK( ALLTRIM( cBUSCA ) ) )
   IF EOF()
      ShowMsg( "Fim do Arquivo dos Registros", "Aviso" )
      DBGOTOP()
   ENDIF
ELSE
   IF RIGHT(ALLTRIM(cBUSCA),1)="'" .OR. RIGHT(ALLTRIM(cBUSCA),1)='"'
      FIM_RUN()
      RETURN .T.
   ENDIF

   Sr_Setfilter("NOME LIKE '%"+ALLTRIM(cBUSCA)+"%'" )
   DBGOTOP()
ENDIF
oBrw:Refresh()
FIM_RUN()
RETURN( .T. )

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 17:27
por bencz
preciso de um apoio maior... :/
Eu nao sabia nem q tinha q criar o arquivo .NTX

Bom, ainda nao consegui entender, assim, com exatidão, como posso realizar essa pesquisa... onde eu entro com uma string em um textbox, e eu teria q converter ela para um ArrayOfChars, p/ poder verificar caractere por caractere ?

Bom, o código q estou usando p/ criar o DBF eh esse:

Código: Selecionar todos

function main()
   local aArray, nInd, nLen
   
   aArray := {{ "Nome", "C", 50, 0}, {"Telefone", "C", 14, 0}, {"Celular", "C", 14, 0}, {"Tipo", "C", 12, 0}}
   DbCreate("clientes", aArray)
   
   ? "Tabela 'clientes' criada"
   
   aArray := { }

   AAdd(aArray, {"Bruno", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Carlos", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Rodrigo", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Pedro", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Mateus", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Julio", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Bino", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Bartolomeu", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Celso", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Edson", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Marcio", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Daniel", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Leonardo", "4412344321", "4499887755", "Nokia"})
   AAdd(aArray, {"Guilherme", "4412344321", "4499887755", "Nokia"})

   USE clientes EXCLUSIVE NEW
   
   nLen := Len(aArray)
   
   for nInd := 1 TO nLen
      clientes->(DbAppend())
      clientes->nome := aArray[nInd, 1]
      clientes->telefone := aArray[nInd, 2]
      clientes->celular := aArray[nInd, 3]
      clientes->tipo := aArray[nInd, 4]
   next
   
   clientes->(DbCloseArea())
return nil

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 17:39
por alxsts
Olá!
bencz escreveu:teria q converter ela para um ArrayOfChars
Por padrão, em xHarbour, toda string é um ArrayOfChar.

Código: Selecionar todos

LOCAL cString := "xHarbour", cChar

FOR EACH cChar IN cString
   QOut( cChar )
NEXT

procurando por uma palavra em um DBF

Enviado: 25 Mai 2012 17:52
por bencz
bom.... isso jah facilita xD

mas como nao conheço bem os comandos do xHarbour e muito menos os comandos p/ trabalhar com dbf.... eu nao faço a menor idéia... de quais as formas q eu posso fazer, p/ conseguir fazer a pesquisa, p/ encontrar o nome do humano e mover a grid p/ o numero/nome do humano...

procurando por uma palavra em um DBF

Enviado: 26 Mai 2012 08:47
por bencz
Olá, bom dia...

escrevi esse código:

Código: Selecionar todos

function ola( oBrw, cString )
   SELE clientes
   SET ORDER TO 2
   seek cString
   set softseek off
   if found()
      ? "achou"
   else
      ? "nada :("
   endif
   oBrw:REFRESH()
return nil
mas, qnd eu executo ele, recebo o seguinte erro....
Error DBFNTX/1201 Workarea not indexed
Error at ...: DBSEEK(0) in Module:
Called from : OLA(198) in Module: browse.prg
Como posso corrigir esse erro ????

procurando por uma palavra em um DBF

Enviado: 26 Mai 2012 10:03
por ANDRIL
bencz escreveu:Error DBFNTX/1201 Workarea not indexed
Voce criou o indice? Pelo erro o sistema nao encontrou o indice necessario para fazer a pesquisa.
SELE clientes
INDEX ON NOME to indice1
SET ORDER TO 1
seek cString
set softseek off
if found()
? "achou"
else
? "nada"
endif
oBrw:REFRESH()
O ideal era antes de entrar no BROWSE voce ja ter criado os indices e nao dentro do browse. Ai voce apenas seta o indice que voce deseja usando SET ORDE TO 1, 2 etc conforme os indices ja criados.

Ate+

procurando por uma palavra em um DBF

Enviado: 26 Mai 2012 10:16
por bencz
Funcionou *-*
Muito obrigado *-*

procurando por uma palavra em um DBF

Enviado: 26 Mai 2012 10:20
por bencz
mas, ainda tenho a duvida, de como posso fazer a pesquisa, letra por letra ;x
tipo... vou digitando no text box, e ele jah vai filtrando, entende ???

procurando por uma palavra em um DBF

Enviado: 26 Mai 2012 11:00
por ANDRIL
Creio que a ajuda quanto a isso ja foi postada pelo colega, veja:

@ 10,10 Get oBUSCA VAR cBUSCA SIZE 300,24;
STYLE ES_AUTOHSCROLL PICTURE '@!' MAXLENGTH 40;
ON Change {|| FOCALIZA_BRW(oBUSCA:GETTEXT()) };
TOOLTIP "Clique Aqui Para buscar uma descrição"
Substitua oBUSCA pelo seu objeto, cBUSCA pela sua variavel, o segredo da pesquisa letra a letra esta no gatilho ON CHANGE, a cada letra digitada no textbox, sera executada a funcao especificada, neste caso a FOCALIZA_BRW, onde esta pegando o testo digitado atraves da leitura do objeto, oBUSCA:GETTEXT().

Simplifiquei a funcao para ver se voce consegue adapta-lo ao seu codigo.

Código: Selecionar todos

*************************************
STATIC FUNCTION FOCALIZA_BRW(cBUSCA)
*************************************
*PRIVATE oDlgHabla:=NIL
*MsgRun("Aguarde,Sistema Separando Informações...") 

SET ORDE TO 1
DBSEEK( ALLTRIM( cBUSCA ) )
IF EOF()
     *ShowMsg( "Fim do Arquivo dos Registros", "Aviso" )
     DBGOTOP()
ENDIF
oBrw:Refresh()
RETURN( .T. )
Tirei algumas funcoes pois como nao uso a HWGUI a muito tempo, nao sei elas sao da lib ou construidas pelo colega que postou o codigo. Em suma, a tese é a cada letra digitada no textbox a funcao sera executada e um novo SEEK sera dado no DBF, fazendo um novo posicionamento.

Lembre-se antes de entrar no Browse ja ter criado o indice que sera pelo NOME, caso voce precise ter outros
indices, voce devera setar o do campo NOME com SET ORDE TO 1 (1 se for esta a ordem que criou o indice) veja o exemplo abaixo:
USE MEUDBF
INDEX ON nome TO indice1
INDEX ON celular TO indice2
INDEX ON endereco TO indice3
Como vou usar o indice por NOME (indice1) vou setar como SET ORDER TO 1.

Boa sorte!