Page 1 of 1

Busqueda por aproximación en una dbf

PostPosted: Wed Aug 09, 2006 6:05 pm
by Elias Torres
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.

PostPosted: Thu Aug 10, 2006 6:09 pm
by Antonio Linares
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 :-)

PostPosted: Thu Aug 10, 2006 8:21 pm
by R.F.
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.)


PostPosted: Thu Aug 10, 2006 8:22 pm
by Antonio Linares
René,

Gracias :-)

PostPosted: Fri Aug 11, 2006 8:48 am
by Elias Torres
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.

PostPosted: Fri Aug 11, 2006 2:48 pm
by Antonio Linares
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

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

PostPosted: Fri Aug 11, 2006 3:29 pm
by Elias Torres
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.

PostPosted: Fri Aug 11, 2006 4:22 pm
by R.F.
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 ,