viernes, 25 de abril de 2008

Usando origenes de datos ADO y 2

Desde febreo no públicaba nada en el blog, y es que el trabajo estos últimos meses ha sido más intenso.
Para esta segunda entrega tenia pensado implemenar al ejemplo que hizcimos en la entrada anterior, autosort por columnas, y busqueda incremental para la descripción.

El tema del autosort, en la versión actual de FiveWin, xBrowse ya lo incluye nativamente, ademas de DATAS para el manejo del orden, con lo que en realidad no nos sera muy util si estamos usando FiveWin actualizado, y será meramente educativo, aunque si estais en versiones antiguas de FiveWin os permitira implementar esa funcionalidad.

Para hacer las ordenacines de campos y las busquedas, utilizaremos el Data Sort y el metodo Find del obbjeto RecordSet. El ámbito, serán los registro que formen parte de nuestra consulta SQL, y tiene como ventaja que no genera trafico con el servidor(con una sentenica SQL podriamos conseguir el mimsmo resultado, pero cargariamos proceso al servidor y generariamos tráfico en la red).

El data Sort ordena uno o varios campos del Recordset de forma ascendente o descendente. Para ello debemos asignar una cadena a esta propiedad con el nombre o nombres de los campos a ordenar, separados por comas e indicar el modo de ordenación mediante las palabras claves ASC o DESC.
oRs:Sort:="CliDes ASC"
Ordenado por el campo CliDes de forma ascendente.
El metodo Find busca un registro en función de un criterio. Si el criterio se cumple, el registro localilzado pasa a ser el actual, en caso contrario el Recordset se sitúa al final.
Su sintaxys:
oRs:Find( cCriterio, SkipRecords, DireccionBusqueda, Start )
En el criterio no puede usarse OR ni AND, y solo puede aparecer uno de los siguientes operardores = > >= < <= <> LIKE .

Pasemos a la acción, vamos a usar practicamente el mismo código que en la entrada anterior, con algunos añadidos.
En la parte donde creamos el fichero MDB, y lo rellenamos con datos de prueba, el campo descripción lo rellenaremos con valores alfabéticos aleatorios para poder probar las busquedas incrementales.
FOR x:=1 TO 20
cCliDes+=Chr(HB_RandomInt(65,70))
NEXT
oRs:Fields("CliDes"):Value:=cCliDes


Para poder realizar la busqueda incremental, necesitamos un objeto SAY, y una funcion que realice la busqueda y nos devuelva verdadero o falso según el resultado de la busqueda.

oBar := TBar():New(oWndVerMdb,50,45,.T.)
@ 01,10 SAY oSay PROMPT '' SIZE 90,20 OF oBar

Creamos una barra, y dentro de la barra colocamos el SAY que visualizara la cadena que estamos buscando.

Y ahora le indicamos al browse el objeto SAY y la funcion que procesara la busqueda.

oBrw:bSeek := { | c | Busca(c,oRs) }
oBrw:oSeek := oSay


Y la función encargada de realizar la busqueda es la siguiente.
Funcion para busqueda
La función recibe dos parámetros, la cadeana a buscar, y el objeto recordset(podriamos mejorar la función y pasarle como parametro el campo sobre el que queremos hacer la busqueda). Montamos la cadena de busqueda dependiendo de si es el primer caracter tecleado o no, y se lo pasamos al recordset. Buscamos en el campo CliDes que empiece por la cadena que recibimos como parametro mas cualquier otra cosa( LIKE "cadean busqueda"+"*").
Si no es inicio o final de fichero significa que hemos encontrado un regitro, y devolvemos verdadero.

Con esto ya tenemos implementada la busqueda incremental en el browse.

Pasemos ahora a añadire la opcion de ordenar los registros cuando pulsamos sobre la cabecera de la columna.

Despuese de la instruccion SetAdo(), añadimos la siguiente linea, donde le indicamos un codeblock a ejecutar cuando se pulsa con el raton en la cabecera.
AEval(oBrw:aCols,{|oCol|oCol:bLClickHeader:={|f,c,h,oCol|Ordena(oBrw,oRs,oCol)}})
Y la fucion encargada de controlar el orden es la siguiente
Funcion para sort
En esta función casi nos lleva mas trabajo el ir colocando el BMP de la flecha arriba abajo, que realizar la ordenación. Si no visualizamos el BMP Ordena quedaria reducido de la siguiente manera:
STATIC FUNCTION Ordena(oBrw,oRs,oCol,cFld)
LOCAL cSort:=oRs:Sort,nLen,nFor
oRs:Sort:=cFld+IF(At(cFld,cSort)>0,IF(At('ASC',cSort)>0,' DESC',' ASC'),' ASC')
oRs:Sort:=cFld+Space(1)+oCol:cOrder
oBrw:GoTop()
RETURN NIL


La funcion VerMdb, con las lineas que hemos añadido para la busqueda y la ordenación de columnas, queda de la siguiente manera:
VerMdb
Desde aqui podeis descargar el código fuente, y el ejecutable.
Descargar ejecutable
Descargar código fuente
Como siempre, espero que os haya resultado amena la lectura, y ademas os pueda ser de utilidad.
Saludos desde Mallorca.
(ADO RecordSet Harbour xHarbour FiveWin oRs.Find oRs.Sort)