Les incluyo un ejemplo sencillo de como configurar el xBrowse de fivewin, podran decsargarlo del SVN testfw2.prg, el ejemplo incluye, configuracion de xbrowse, ordenamiento de columnas y busqueda incremental por la columna ordenada
It's a simple test to build fivewin xbrowse, the sample include: xbrowse setup, columns sort, incremental seek by order column.
Configuracion / setup
@ 0, 0 XBROWSE oBrw
SetDolphin( oBrw, oQry )
oBrw:CreateFromCode()
.....
PROCEDURE SetDolphin( oBrw, oQry, lAddCols )
LOCAL xField := NIL
LOCAL cHeader := ""
LOCAL cCol := ""
LOCAL aFldNames, oCol
DEFAULT lAddCols := .T.
WITH OBJECT oBrw
:bGoTop := {|| If( oQry:LastRec() > 0, oQry:GoTop(), NIL ) }
:bGoBottom := {|| If( oQry:LastRec() > 0, oQry:GoBottom(), nil ) }
:bSkip := {| n | oQry:Skip( n ) }
:bBof := {|| oQry:Bof() }
:bEof := {|| oQry:Eof() }
:bBookMark := {| n | If( n == nil,;
If( oQry:LastRec() > 0, oQry:RecNo(), 0 ), ;
If( oQry:LastRec() > 0, oQry:goto( n ), 0 ) ) }
:bKeyNo := {| n | If( n == nil, ;
If( oQry:LastRec() > 0, oQry:RecNo(), 0 ), ;
If( oQry:LastRec() > 0, oQry:Goto( n ), 0 ) ) }
:bKeyCount := {|| oQry:LastRec() }
END
oBrw:nDataType := DATATYPE_USER
oQry:Cargo = oQry:aStructure[ 1 ][ MYSQL_FS_NAME ]
IF lAddCols
aFldNames := oQry:aStructure
FOR EACH xField IN aFldNames
cCol := xField[ MYSQL_FS_NAME ]
cHeader := xField[ MYSQL_FS_NAME ]
oCol = SetColFromMySQL( cCol, cHeader, oQry, oBrw )
//set order
oCol:bLClickHeader = Build_CodeBlock_Order( oQry )
NEXT
oBrw:bSeek := { | c | DolphinSeek( c, oQry ) }
ENDIF
RETURN
Orden / Order
//--------------------------------------//
FUNCTION Build_CodeBlock_Order( oQry )
RETURN {| nMRow, nMCol, nFlags, oCol | SetOrderDolphin( oCol, oQry ) }
....
PROCEDURE SetOrderDolphin( oCol, oQry )
LOCAL aToken
LOCAL cType, cOrder
aToken := HB_ATokens( oQry:cOrder, " " )
IF Len( aToken ) == 1
AAdd( aToken, "ASC" )
ENDIF
cOrder = AllTrim( Lower( aToken[ 1 ] ) )
cType = aToken[ 2 ]
AEval( oCol:oBrw:aCols, {| o | o:cOrder := " " } )
IF oQry:aStructure[ oCol:nCreationOrder ][ MYSQL_FS_NAME ] == cOrder
IF Upper( cType ) == "ASC"
cType = "DESC"
oCol:cOrder = "D"
ELSE
cType = "ASC"
oCol:cOrder = "A"
ENDIF
ELSE
cOrder = oQry:aStructure[ oCol:nCreationOrder ][ MYSQL_FS_NAME ]
cType = "ASC"
oCol:cOrder = "A"
ENDIF
oQry:SetOrder( cOrder + " " + cType )
oCol:oBrw:Refresh()
RETURN
Busqueda Incremental / Incremental seek
FUNCTION DolphinSeek( c, oQry )
LOCAL nStart
LOCAL uData, nNum
LOCAL aToken
STATIC aLastRec := {}
aToken := HB_ATokens( oQry:cOrder, " " )
IF Len( aLastRec ) < Len( c )
IF Len( aLastRec ) == 0
nStart = 1
ELSE
nStart = oQry:RecNo()
ENDIF
AAdd( aLastRec, nStart )
ELSE
ADel( aLastRec, Len( aLastRec ) )
ASize( aLastRec, Len( aLastRec ) - 1 )
IF Len( aLastRec ) == 0
nStart = 1
ELSE
nStart = ATail( aLastRec )
ENDIF
ENDIF
oQry:Seek( c, aToken[ 1 ], nStart, oQry:LastRec(), .T., .T. )
RETURN .T.
Daniel,
ResponderEliminarMe parece una clase linda, pero me puedes aclarar un par de puntos ?
- Necesito algun driver especial para realizar la conexión ?
- Existe diferencia en cuanto a rendimiento del uso de esta lib con la de ADO ? En principio, con ADO tienes un manejo similar no ?
Gracias por la aclaracion
Suerte y adelante con esta contribucion
Charly
- Necesito algun driver especial para realizar la conexión ?
ResponderEliminarNo necesitas ningun driver, tampoco necesitas instalar cliente ODBC, solo necesitas la dll (libmysql.dll)
- Existe diferencia en cuanto a rendimiento del uso de esta lib con la de ADO ? En principio, con ADO tienes un manejo similar no ?
NO he querido publicar las pruebas Dolphin-ADO, por los momentos, en el blog, pero en el svn hay un ejemplo donde mis resultados y el de otros han sido muy similares, insertando 10000 registros de forma individual a una tabla y el tiempo de DOLPHIN fue la mitad del tiempo de ADO, creo que con eso adelanto el tema del rendimiento.
Se maneja bastante similar a ADO pero enfocado mas hacia lo que conocemos en las clases que manejan DBFs, pero la diferencia es que con ADO y otras clases, no sabes como ocurren las cosas internamente, el codigo esta 100% disponible.
Pense una clase que les sea util tanto a usuarios de nivel basico hasta los avanzados, no quiero perder la fortaleza de MySql con cosas simples y similar un manejo de DBFs, pero un usuario de nivel basico, le sera facil adaptarse y al darse cuenta de lo facil y util que es.
Daniel,
ResponderEliminarGracias por la aclaracion
- La libmysql.dll es libre, freeware, ... ?
- El hecho de no necesitar driver es un punto muy importante, ya q te evitas instalaciones
- En cuanto al rendimiento sobre la mitad de tiempo q ADO me parece simplemente espectacular, pero necesito hacer mis tests para 'creerlo' ;-).
Teneis alguna tabla de acceso para pruebas ?
Saludos y gracias.
Charly
Charly, la dll es libre, la puedes descargar desde la pagina oficial de MySql, yo deje in link de descarga
ResponderEliminarDesde el SVN puedes descargar todo el codigo, hay un archivo llamado connect.ini que uso para conectar al servidor de pruebas, esta totalmente accesible para hacer pruebas sobre el
Los ejemplos de ADO y Dolphin compatibles son TestAdo y Testman ubicados en la carpeta samples, testado deberias compilarlo con xHarbor pq con Harbour me da problemas, Mia resultados fueron 4 min ADO 2 min Dolphin, es dd mucha utilidad si se hacen mas pruebas
gracias