FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Mon Aug 20, 2007 03:34 PM
Hola:
Tengo el siguiente c贸digo:
FUNCTION BuscarClientes( oParent)
   LOCAL oDlg, oBrw, oBusqueda, cBusqueda, aResultado
   aResultado:=Sql("SELECT rut,nombre,ciudad,email FROM BASEDEDATOS.CLIENTES ORDER BY nombre")
   IF aResultado[1]
      IF aResultado[3]:RecordCount>0
         aResultado[3]:MoveFirst()
         DEFINE DIALOG oDlg RESOURCE "BUSCARCLIENTES"
         REDEFINE LISTBOX oBrw ;
            FIELDS Str(aResultado[3]:Fields(0):value,0), ;
                   aResultado[3]:Fields(1):value, ;
                   aResultado[3]:Fields(2):value, ;
                   aResultado[3]:Fields(3):value ;
            ID 102;
            FIELDSIZES 80, 250, 100, 250 ;
            HEADERS "R.U.T.","Raz贸n Social","Ciudad","email" OF oDlg
         oBrw:bLogicLen := { || aResultado[3]:RecordCount }
         oBrw:bGoTop    := { || aResultado[3]:MoveFirst() }
         oBrw:bGoBottom := { || aResultado[3]:MoveLast() }
         oBrw:bSkip     := { | nSkip | Salto( aResultado[3], nSkip ) }
         oBrw:cAlias    := "ARRAY"

         REDEFINE BUTTON ID 301 OF oDlg ACTION ( oDlg:bValid:={ || .T.}, oDlg:End()) ;
            CANCEL
         ACTIVATE DIALOG oDlg CENTER VALID .F.
      ELSE
         MsgStop( "No existen Clientes en el Maestro", "Error")
      ENDIF
      aResultado[3]:Close()
      aResultado[2]:Close()
   ENDIF
RETURN NIL

Mi consulta es la siguiente:
C贸mo puedo hacer para realizar una b煤squeda incremental sobre el browse ya que este es un array obtenido de un objeto adodb.recordset?.
La idea es que yo escriba en el get y al presionar enter o cuando pierda el foco si detecta que hay datos en el get busque por aproximaci贸n en el browse y me posicione sobre el primer registro que coincida con la palabra encontrada. La idea es que si coloco AB se posicione sobre el primer registro que comienza con AB.
Esto lo hago sin problemas al realizar un browse directamente a un .DBF. Nunca lo he realizado en un array.

He intentado esto para poder obtener los datos seleccionados en el browse al presionar un bot贸n o hacer doble click sobre el registro:


nPos:=oBrw:nAt //==>retorna NIL
nPos:=oBrw:nRowPos //==> retorna el registro donde estoy
MsgInfo( oBrw:aArray[1,1] //hace que mi aplicaci贸n se cuelgue. No muestra ning煤n error. Simplemente se cuelga.


Saludos y mil gracias
David Lagos S.
Coquimbo-Chile

P.D:Ren茅, tu blog est谩 excelente. Felicitaciones.
Adjunto una imagen
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Mon Aug 20, 2007 09:57 PM

David,

Tendr谩s que buscar en los elementos del array, bien usando Left() 贸 At()

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Mon Aug 20, 2007 10:12 PM
Antonio Linares wrote:David,

Tendr谩s que buscar en los elementos del array, bien usando Left() 贸 At()


Antonio, gracias por la respuesta. Con relaci贸n a c贸mo obtener los datos cuando presiono un bot贸n, ya est谩 resuelto.
Lo que tengo que hacer ahora es poder reasignar los campos al browse en tiempo de ejecuci贸n y refrescar el browse.

Si no me equivoco debo modifica el oBrw:bLine, correcto?
Y si es as铆 como recargo :bLine nuevamente?, me refiero a la forma de pasar los datos.
Me explico. Estoy realizando nuevamente una consulta SQL del tipo where nombre like 'hdhdhd%'. El nuevo resultado de la consulta con adodb.recordset la debo cargar al browse como cuando utilizo el REDEFINE LISTBOX.
Saludos
David Lagos S.
Coquimb-Chile
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Mon Aug 20, 2007 10:19 PM
David,

bLine es un codeblock que tiene que devolver un array, con un valor por cada columna. Lo interesante es que puede llamar a una funci贸n que realice los calculos que sean necesarios y devuelva el array:

oBrw:bLine = { || { <col1>, ..., <colN> } }

贸 llamar a una funci贸n:
oBrw:bLine = { || CalculaValores() }

function Calculavalores()

   ... calcula col1, ... colN

return { <col1>, ..., <colN> }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Tue Aug 21, 2007 04:37 PM
Antonio Linares wrote:David,

bLine es un codeblock que tiene que devolver un array, con un valor por cada columna. Lo interesante es que puede llamar a una funci贸n que realice los calculos que sean necesarios y devuelva el array:

oBrw:bLine = { || { <col1>, ..., <colN> } }

贸 llamar a una funci贸n:
oBrw:bLine = { || CalculaValores() }

function Calculavalores()

   ... calcula col1, ... colN

return { <col1>, ..., <colN> }


Antonio:
el bline lo estoy usando para obtener los datos a trav茅s de un eval() que funcional a las mil maravillas.
A煤n sigo entrampado con el tema de la b煤squeda incremental.
He intentado a realizar un oRS:="nueva consulta SQL" y luego un oRS:Requery() y se cuelga mi aplicaci贸n al momento de oRS:Source.
Pensando que pod铆a ser por tener el oBrw activo realic茅 oBrw:Disable() y/o oBrw:Hide() y nada.
Es lo 煤nico que me falta realizar para tener la rutina lista de b煤squeda de clientes que me va a servir para cualquier b煤squeda.
No puedo utilizar el nAt, aArray o AScan() ya que nAt retorna nil debido a que nunca utilizo el setarray() ya que los que paso son los datos de un objeto obtenido desde un adodb.recordset.
Alguien m谩s que me pueda ayudar. Quiz谩s Ren茅, ya que tu trabajas todo ADO duro y puro seg煤n contaste en un post pasado.
Gracias nuevamente.
Saludos
David Lagos S.
Coquimbo-Chile
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl
Posts: 113
Joined: Wed Jan 10, 2007 08:43 PM

B煤squeda incremental en wbrowse - SOLUCIONADO vean soluci贸n

Posted: Tue Aug 21, 2007 07:35 PM
A ver compa帽eros:
Primero que todo mil gracias a Vikthor por darme la pauta inicial por donde resolver el problema.

Cuando trabajamos con Ado debemos cargar los datos obtenidos del objeto adobdb.recorset al browse utilizando el m茅todo Fields(n潞 de campo):value en la clausula FIELDS. adem谩s debemos definir oBrw:="ARRAY". Si el campo retorna un n煤mero debemos pasarlo a cadena. MUY Importante esto.

Como lo que necesitaba era hacer una b煤squeda incremental el paso es el siguiente:

Definimos o Redefinimos un campo GET y le agregamos lo siguiente:
/*cBusqueda es la variable definida en el GET, puede ser cualquiera*/
/*oRs es el objeto RecordSet que creamos anteriomente para obtener los datos desde nuestro servidor de base de datos*/
oGet:bLostFocus:={|| Iif( Funcion_de_Busqueda( cBusqueda, oRs), oBrw:Refresh(), NIL)}

NUNCA UTILIZAR oBrw:UpStable() ==> la aplicaci贸n se cuelga.

STATIC FUNCTION Funcion_de_Busqueda( cBusqueda, oRs)
   LOCAL lBusqueda:=.F., nBookMark:=oRs:BookMark
   IF !Empty( cBusqueda)
      oRs:MoveFirst()
      oRs:Find( "nombre LIKE '"+Alltrim(cBusqueda)+"%'",,1)
      IF oRs:Eof()==.F. .AND. oRs:Bof()==.F.
         lBusqueda:=.T.
      ELSE
         oRs:BookMark:=nBookMark
         MsgStop( "No encotramos nada")
      ENDIF
   ENDIF
RETURN lBusqueda


Adjunto im谩genes
1.- Mostrando el browse

2.- Si se fijan colocamos el texto: LA y nos muestra la primera coincidencia.

3.- Informamos al usuario que su b煤squeda fall贸:
David Lagos S.
Coquimbo-Chile
www.wificafe.cl
webmaster@wificafe.cl

Continue the discussion