FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Mysql & Busqueda Incremental xBrowse
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Mysql & Busqueda Incremental xBrowse
Posted: Sat Dec 05, 2009 02:28 AM
:-)
Hola

estoy intentando hacerme una busqueda incremental con TMySql y xBrowse, capturo la tecla con bKeydown, pero no encuentro como refrescar el browse que origino la busqueda, despues de hacerle un filtro a la tabla con los datos que estaba buscando.

Code (fw): Select all Collapse
#include "fiveWin.ch"
#include "xbrowse.ch"

static oBrw, cBuscador
/*******************************************************************/
function Departamentos()
聽 聽local oCol, cQuery, oDatos, oDlg
聽 聽LOCAL aBtn := array( 8 )
聽 聽local oBoton1, oBoton2
聽 聽 local oDeptos, oFont1
聽 聽 local oEsperar := Esperar("Cargando departamentos ..... espere por favor ...")

聽 聽cBuscador := ''

聽 聽IF oMysql:netErr()
聽 聽 聽 MSGINFO( cMensajeSql, cProgram )
聽 聽 聽 RETURN NIL
聽 聽ENDIF


聽 聽DEFINE FONT oFont1 NAME 'MS Sans Serif' 聽 SIZE 0,-10 BOLD

聽 聽oDeptos := oMysql:Query( "SELECT * FROM departamentos ORDER BY nombre ")

聽 聽IF oDeptos:netErr()
聽 聽 聽 MSGINFO( cMensajeSql + ' [departamentos]', cProgram )
聽 聽 聽 RETURN NIL
聽 聽ENDIF


聽 聽 oEsperar:end()
聽 聽DEFINE DIALOG oDlg RESOURCE "DEPTO0" TITLE "Catalogo de Departamentos"
聽 聽oDlg:lHelpIcon := (.f.)


聽 聽oBrw := TxBrowse():New(oDlg)
聽 聽SetMyBrwSql( oBrw, oDeptos )



聽 聽oCol := oBrw:AddCol()
聽 聽oCol:bStrData 聽 聽 聽:= { || strzero(MyCampo(oDeptos,"codigo"),3) }
聽 聽oCol:cHeader 聽 聽 聽 := "C贸digo"


聽 聽oCol := oBrw:AddCol()
聽 聽oCol:bStrData 聽 聽 聽:= { || MyCampo(oDeptos,"nombre") }
聽 聽oCol:cHeader 聽 聽 聽 := "Descripci贸n"


聽 聽oCol := oBrw:AddCol()
聽 聽oCol:bStrData 聽 聽 聽:= { || transform(MyCampo(oDeptos,"descuento"),'999%') }
聽 聽oCol:cHeader 聽 聽 聽 := "% descuento"
聽 聽 oCol:nDataStrAlign := AL_RIGHT
聽 聽oCol:oDataFont 聽 聽 := oFont1



聽 聽oBrw:CreateFromResource(101)


聽 聽oBrw:bKeyDown 聽 聽 := { | nKey | MisTeclas( nKey, oBrw, oDeptos ) }

聽 聽oBrw:aCols[ 03 ]:bClrStd := {|| { iif( oDeptos:fieldGet('descuento') > 0, CLR_RED, 聽CLR_WHITE), CLR_WHITE } } 聽// nombre


聽 聽oBrw:bClrHeader := { || {CLR_MAGENTA,CLR_WHITE }}
聽 聽oBrw:bClrFooter := { || {CLR_GREEN,CLR_WHITE } }
聽 聽oBrw:bClrSel 聽 聽:= { || {CLR_CYAN,CLR_WHITE } }


聽 聽 ACTIVATE DIALOG oDlg CENTER ON INIT CreaBarra(oDlg, oDeptos)
聽 聽 oDeptos:end()
聽 聽 oDeptos := NIL
聽 聽oFont1:end()
聽 RETURN NIL

static function CreaBarra(oDlg, oDeptos)
聽return nil



/*******************************************************************/


static function MisTeclas( cSeek, oBrw, oDeptos )
聽 聽 local cTecla := chr(cSeek)
聽 聽 local cChar := upper(cTecla)
聽 聽 local oDlg, oFont, oGet1

聽 聽 cBuscador := cBuscador + cChar

聽 聽 local oBuscar := 聽 oMysql:Query( "SELECT * FROM departamentos ORDER BY nombre WHERE nombre LIKE '" + cBuscador + "'%'")

聽 聽 oBrw:Refresh()
聽 聽 oDeptos:refresh()

聽 聽 聽 聽 // en esta parte de aqui, es donde deberia asignarle la nueva data al browse, pero no doy con bola

return nil


Saludos,
Mauricio :-)
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Mysql & Busqueda Incremental xBrowse
Posted: Sat Dec 05, 2009 03:15 AM

Mau,

contestado desde el messenger...

William, Morales

Saludos



m茅xico.sureste
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Mysql & Busqueda Incremental xBrowse
Posted: Sat Dec 05, 2009 06:52 AM
Don Willians gracias.

lo anoto para que los demas vean la solucion, si pasan por lo mismo.

Code (fw): Select all Collapse
static function MisTeclas( cSeek, oBrw, oTabla, oSay )
聽 聽 local cTecla := chr(cSeek)
聽 聽 local cChar := upper(cTecla)

聽 聽 IF cSeek == VK_BACK .OR. cSeek == VK_ESCAPE
聽 聽 聽 聽 cBuscador := ''
聽 聽 聽 聽 聽 聽oSay:setText(cBuscador)
聽 聽 聽 聽 聽 oTabla:cQuery := "SELECT * FROM vendedores ORDER BY nombre"
聽 聽 聽 聽 聽 聽 聽 聽oTabla:refresh()
聽 聽 聽 聽 聽 聽 聽oBrw:refresh(.t.)
聽 聽 聽 聽 return nil
聽 聽 ENDIF

聽 聽 IF cSeek == VK_RETURN 聽// Edicion del vendedor
聽 聽 聽 聽 cBuscador := ''
聽 聽 聽 聽 聽 聽oSay:setText(cBuscador)
聽 聽 聽 聽 AddDeptos(.f., oTabla)
聽 聽 聽 聽 oTabla:refresh()
聽 聽 聽 聽 oBrw:refresh()
聽 聽 ENDIF
聽 聽 IF cSeek == VK_INSERT 聽 聽 聽 聽 // agregar vendedor
聽 聽 聽 聽 cBuscador := ''
聽 聽 聽 聽 聽 聽 oSay:setText(cBuscador)
聽 聽 聽 聽 AddDeptos(.t., oTabla)
聽 聽 ENDIF
聽 聽 IF cSeek == VK_DELETE 聽 聽 聽 聽 聽 聽// borrar vendedor
聽 聽 聽 聽 cBuscador := ''
聽 聽 聽 聽 聽 聽 oSay:setText(cBuscador)
聽 聽 聽 聽 deleteVendedor(oTabla)
聽 聽 ENDIF


聽 聽 if cSeek >= 30 .AND. cSeek <= 132
聽 聽 聽 聽 聽cBuscador := cBuscador + cChar
聽 聽 else
聽 聽 聽 聽 聽return nil
聽 聽 聽 聽 endif
聽 聽 
聽 聽 聽 聽 oSay:setText(cBuscador)

聽 聽 聽 聽// aqui esta el truco =====, pueden usar LIKE 聽 con % al inicio y final, 聽 聽 si lo ponemos al inicio y final es como
聽 聽 聽 聽// contenido en $ de Clipper, si lo ponemos solo al inicio ira tomando los caracteres al inicio
聽 聽 聽 聽// tambien se puede usar LEFT( nChar)
聽 聽 oTabla:cQuery := "SELECT * FROM vendedores WHERE nombre LIKE '%" + cBuscador + "%'"

聽 聽 oTabla:gotop()
聽 聽oTabla:refresh()
聽 聽oBrw:refresh(.t.)

return nil


Saludos
Mauricio :-)
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 10:08 AM
Hola Mauricio, un poco tarde llega mi respuesta porque veo que ya lo tienes solucionado. De todas formas si quieres darle un vistazo, aqui tienes una alternativa, usando el metodo Find del recordset (evita el trafico al servidor que genera las sentencias Select), y usando los metodos pr贸pios de la clase xBrowse para busquedas incrmentales.

http://bielsys.blogspot.com/2008/04/usando-origenes-de-datos-ado-y-2.html
Code (fw): Select all Collapse
...
   oBrw:bSeek        := { | c | Busca(c,oRs) }
   oBrw:oSeek        := oSay
   oBrw:SetAdo(oRs)
   ...
//---------------------------------
STATIC FUNCTION Busca(cBuscar,oRs)
   LOCAL nLen:=Len(cBuscar)
   STATIC nLenAnt
   DEFAULT nLenAnt:=0
   IF Len(cBuscar)>1
      IF(nLenAnt>nLen,oRs:MoveFirst(),)
      oRs:Find( "CliDes LIKE '"+cBuscar+"*'",,1)
   ELSE
      oRs:MoveFirst()
      IF !Empty(cBuscar)
         oRs:Find( "CliDes LIKE '"+cBuscar+"*'",,1)
      ENDIF
   ENDIF
   nLenAnt:=nLen
RETURN !(oRs:Eof.OR.oRs:Bof)
Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 02:32 PM

Biel:

Excelente soluci贸n !, solo hay que tomar en cuenta un detalle, la busqueda que se hace con la soluci贸n de Mauricio se hace a la Tabla que hay en el servidor, de ah铆 tu acertado comentario sobre la sobre carga al servidor, mientras que la busqueda que se hace con tu soluci贸n se hace sobre el objeto RecordSet que es una copia de la tabla del lado del cliente.

Sentado lo anterior es bueno aclarar que si por alguna raz贸n la tabla en el servidor fue actualizada con nuevos registros estos no van a estar en el RecordSet a menos de que se haga un Refresh, lo que podr铆a provocar algunos errores.

Supongamos que estamos dando Altas de nuevos clientes pero no somos los unicos que podemos hacerlo algunas otras terminales tambien tiene esa autorizaci贸n, lo l贸gico es que antes de realizar el alta del nuevo cliente primero revisemos que no este registrado, esta revisi贸n debe ser a trav茅s de una busqueda que en el caso de la soluci贸n de Mauricio, aunque m谩s lenta, ser铆a m谩s eficiente en cuento a resultado, mientras que la soluci贸n que ofrece Biel, aunque remota, podr铆a caber la posibilidad de duplicar algunos clientes.

Solo mis dos centavos.

Saludos al foro

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 06:10 PM

Biel,

gracias por tu sugererencia.

el problema para mi es este.

tengo un catalogo de productos de cerca de 38mil, el cual se comparte con 8 tiendas remotas,

si cargo la tabla completa al inicio se hace una pesadilla cargar los 38mil registros, con los cuales ya podria hacer la busqueda como sugieres.

lo que hago es cargar solo 250 registros al inicio o 100, de ahi el usuario ya puede empezar a teclear lo que busca y le va apareciendo, lo que me importa del catalogo es ver en caso de que uno de los almacenes no tenga el producto, saber en ese momento quien lo tiene.

por eso debo estar revisandolo en cada momento, porque todos estan vendiendo al mismo tiempo, es un punto de venta que a lo mejor en 2 minutos ya me vendio los productos y yo sigo pensando que los tiene porque la tabla la cargue al inicio.

es como lo comenta perfecto don Armando, la informacion debe estar actualizada en ese instante no me sirve de hace 3 o 5 minutos.

con la solucion que se esta haciendo es bastante rapido, solo le puse que empezara a buscar cuando el usuario escribiera mas de 2 letras.

saludos cordiales,
Mauricio :mrgreen:

:D

Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 09:31 PM

Mauricio....

La solucion es tener una funcion que se gatille con el OnChange del Browse, que pregunte en el momento por el stock y lo muestre donde tu quieras dentro del dialogo.

Esa funcion seria sencilla...

.....
oBrw:bChange:={ || RefrescaStock(oDbProd:CODIGO) }
.....

Function RefrescaStock(codigobusca)
Local nStock:=0
Local oCmd
Local oRsCmd

oCmd:=TOleAuto():New("ADODB.Command")
oCmd:CommandText := "select STOCK from productos where CODIGO ='" + codigoBusca + "' limit 1"
oCmd:CommandType := adCmdText
oCmd:ActiveConnection:=oCn

oRsCmd:=oCmd:Execute()
nStock:=oRsCmd:Fields( 0 ):value
oRsCmd:Close()

If nStock <> Nil
oSayStock:SetText(Str(nStock))
oSayStock:Refresh()
Endif

Return Nil

Esa funcion deberia demorarse milisegundos...y le puedes poenr lo parametros que quieras para controar cuando llamar al recordset o no...
Con eso liberas el trafico y obtienes VELOCIDAD....

Saludos
DEsde Chile
Adolfo

;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 09:56 PM

Adolfo,

estas usando ADO?

Saludos,
Mauricio

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Wed Dec 09, 2009 10:38 PM

Adolfo,

en ese supuesto se me complica un poco ir haciendo registro por registro

porque por ejemplo en este caso es una farmacia, le teclean AMOX , de deberia traer todo lo que contenga AMOXCILINA en todas las presentanciones, para saber cual tienes y cual le puedes ofrecer el cliente y si no la tienes en ese puesto, en cual la tienen para hacer la orden que te la traigan o se la reserven al cliente.

pueden ser que coincidan 10-20-60

y seria tardadon que el usuario vaya uno por uno,

Saludos,
Mauricio

Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Thu Dec 10, 2009 04:45 AM

Mauricio,

Creo lo que comenta Adolfo es bueno, solo que no en todas las necesidades se aplica.

Tambi茅n creo que es cuesti贸n de mentalidad, a veces tratamos de "estirar" mucho SQL para simular DBF.

Vuelvo a repetir es por necesidades.

William, Morales

Saludos



m茅xico.sureste
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Thu Dec 10, 2009 06:14 AM

Don William,

estoy totalmente de acuerdo con Don Adolfo, por eso le puse "en este supuesto", se me complicaria,

respecto a estirar SQL desgraciadamente los clientes vienen de sistemas hechos en Clipper/FWH y DBF que se acostumbraron tanto que no hacerles casi lo mismo que hacian los sistemas viejos, para ellos es ir para atras.

saludos,
Mauricio

:D:D

Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Thu Dec 10, 2009 01:45 PM

Mauricio...

Conversar con el cliente de las ventajas y desventajas de una tecnologia y la otra es el primer paso para no prometer cosas que no podras hacer.

Segundo, el cambio de la interfaz es necesario si quieres pasar a SQL, los Browses de DBF deben ser modificados y ajustados a la nueva realidad ( SQL, Recordset etc ) y vas a tener que programar updates o refresh mas seguido de lo que crees, esos botones van a estar presentes en la mayoria de los gestores de ABM. o en su defecto programar timers que te refresquen automaticamente los browses o pantallas.

Para tu problema.. un GEt donde tipees lo que buscas, aunque solo sea parte del nombre (amox... por ej ) y al presionar enter, mostrar en el browse lo pertinente. Es proceso debe ser acotado ( es decir ... rapido, sin muchas confirmaciones, 1 o 2 botones, que controle solo los errores, que valide salir con escape, que enter seleccione sin mas confirmaciones etc etc... lo que por el momento se me ocurre ) de tal forma que en unos pocos dias de uso ya sea algo mecanico para el usuario.
De la misma manera, debes tener ese MISMO y EXACTO procedimiento para todas las funciones donde el usuario deba buscar en alguna tabla. asi logras standarizacion dentro del sistema y todos saben que hacer independientemente del modulo donde se encuentren.

Saludos
Desde Chile
Adolfo

;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Mysql &amp; Busqueda Incremental xBrowse
Posted: Thu Dec 10, 2009 03:08 PM

Mauricio,

Muy de acuerdo contigo.

Adolfo,

Cuando la aplicaci贸n es para un solo cliente el proceso aplica en su totalidad, pero cuando son muchos clientes ahi es donde (como decimos por ac谩) la mula tuerce el rabo, jjejjejjejje

Lo que tenemos muy claro es que no siempre ponemos las reglas los desarrolladores, el usuario final (el que paga) es muy quisquilloso y hay cosas que no debemos hacer, pero las tenemos que hacer.

William, Morales

Saludos



m茅xico.sureste

Continue the discussion