Class to manager MYSQL for Harbour/xHarbour
Custom Search

miércoles, 14 de julio de 2010

xBrowse

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.

4 comentarios:

  1. Daniel,

    Me 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

    ResponderEliminar
  2. - Necesito algun driver especial para realizar la conexión ?

    No 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.

    ResponderEliminar
  3. Daniel,

    Gracias 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

    ResponderEliminar
  4. Charly, la dll es libre, la puedes descargar desde la pagina oficial de MySql, yo deje in link de descarga
    Desde 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

    ResponderEliminar