Busqueda por aproximación en una dbf

Busqueda por aproximación en una dbf

Postby Elias Torres » Wed Aug 09, 2006 6:05 pm

Hola a todos.

Este es mi primer post... asi que en próximos espero ser de más ayuda. Explico un poco lo que estoy haciendo.. Me he creado un browse (o grid) en donde muestro todos los registros de una tabla. Lo que pretendo es posicionarme en un registro en concreto para mostrar todos sus campos dependiendo de un valor que se introduzca, puede ser una letra,una palabra o parte de ella, es decir, una busqueda por medio de una cadena de caracteres. En VFP existe seek() pero aqui no se como hacerlo. Si alguien puede indicarme como....


Un saludo a todos y gracias.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Antonio Linares » Thu Aug 10, 2006 6:09 pm

Elias,

Con el lenguaje Clipper se hace de forma similar:

1. Lo idóneo sería poner un GET junto al browse, para que se vaya escribiendo en el GET y el browse vaya buscando.

2. La búsqueda se hace con DbSeek( <cExpresion> ) que busca en el índice activo que esté usando la DBF.

3. El browse se refresca, haciendo un oBrowse:Refresh()

Vamos a construir un ejemplo completo que te sirva de modelo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby R.F. » Thu Aug 10, 2006 8:21 pm

Aqui esta lo que necesitas:

Se hace excatamente igual que con FiveWin normal
Code: Select all  Expand view
...
...
...

USE AGENTS
OrdSetFocus("nomAgent)

@ 31,0 LISTBOX oBrw FIELDS agents->iatacode,;
                                            agents->agentname,;
                                            agents->agentype;
             HEADERS "Codigo",;
                           "Nombre",;
                           "Tipo";
             PIXEL SIZE oWnd:nWidth,135;
             ON DBLCLICK (Movs(.F.),;
                                  oBrw:Refresh())

oBrw:nClrPane := {|| IIF(agents->(ordkeyno()) % 2 == 0 ,RGB(193,221,255),RGB(221,245,255) )}
oBrw:Bkeychar := {|nkey, nFlag| Busca(nKey), oBrw:Refresh()}

@ 165,0 SAY "Buscando:" SIZE 60,40 PIXEL
@ 165,60 SAY oBusca PROMPT cBusca PIXEL SIZE 150,20
...
...
...

FUNCTION Busca(nKey)
   IF nKey = 8
      cBusca := SUBSTR(cBusca,1,LEN(cBusca)-1)
   ELSE
      cBusca += CHR(nKey)
   ENDIF
   SET SOFTSEEK ON
   SEEK(cBusca)
   SET SOFTSEEK OFF
   oBusca:Refresh()
RETURN (.T.)

Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby Antonio Linares » Thu Aug 10, 2006 8:22 pm

René,

Gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Fri Aug 11, 2006 8:48 am

Hola Rene,
gracias por la ayuda....
He probado el codigo que pero al ejecutarlo e intentar realizar una busqueda me da el siguiente error...


....
Argument error
+
stack calls:
BUSCA(39)
(b)MAIN(24)
TWINDOW:HANDLEEVENT(0)
TWINDOW:HANDLEEVENT(0)
TWINDOW:HANDLEEVENT(0)
WINRUN(0)
TWINDOW:ACTIVATE(0)
MAIN(29)
.....

A lo mejor es una chorrada pero no lo entiendo...
Una última cosa, hay alguna forma de realizar una "traza" del programa para poder hacer un seguimiento más profundo de variables, etc....


Un saludo y gracias por la ayuda.

Elias Torres.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Antonio Linares » Fri Aug 11, 2006 2:48 pm

Elias,

Aqui tienes el ejemplo completo:
Code: Select all  Expand view
// FiveWin for Pocket PC - Testing browses with incremental search

#include "FWCE.ch"

REQUEST DBFCDX

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oBrw, hBmp := ReadBitmap( CurDir() + "\go.bmp" )
   local oSay, cSearch := ""

   USE ( CurDir() + "\Customer" ) VIA "DBFCDX"
   Customer->( OrdSetFocus( "LAST" ) )
   Customer->( DbGoTop() )

   DEFINE WINDOW oWnd TITLE "IncSearch"
   
   @ 1, 1 LISTBOX oBrw ;
      FIELDS hBmp, Customer->Last, Customer->First ;
      HEADERS "", "Last", "First" ;
      SIZE 220, 167
   
   oBrw:bKeyChar = { | nKey, nFlags | Search( nKey, @cSearch ), oBrw:Refresh(),;
                                      oSay:Refresh() }
   
   @ 14,  2 SAY "Searching:" SIZE 60, 30
   @ 14, 12 SAY oSay PROMPT cSearch SIZE 80, 30
   
   ACTIVATE WINDOW oWnd ;
      ON CLICK MsgInfo( "Click!" )
   
return nil

//----------------------------------------------------------------------------//

function Search( nKey, cSearch )

   if nKey = 8
      cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
   else
      cSearch += Upper( Chr( nKey ) )
   endif
   
   Customer->( DbSeek( cSearch, .t. ) )

return nil

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Fri Aug 11, 2006 3:29 pm

Gracias Antonio, lo he probado y todo ok. Aún me quedan muchas cosas que aprender de esto...

Una curiosidad....para que son las || ?
Saludos.

Elias Torres.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby R.F. » Fri Aug 11, 2006 4:22 pm

lo que mencionas se llaman bloques de codigo y son las estructuras mas poderosas de clipper.

un bloque de codigo o code block te permite meter codigo dentro de una variable y luego evaluarlo, es decir ejecutar dicho codigo. piensa que un code block es una funcion "lineal"

bkeychar es un bloque de codigo que recibe 2 parametros, que estan metidos entre || nkey es la tecla presionada y nFlag indica si la tecla va acompañada de alguna tecla de control como alt, ctrl o shift, a continuacion el bloque de codigo ejecuta todas las instrucciones metidas entre los {} que deben ir separados por ,
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm


Return to FiveWin para Pocket PC

Who is online

Users browsing this forum: No registered users and 21 guests