FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Cómo usar mysql embebido?
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM

Cómo usar mysql embebido?

Posted: Mon Mar 30, 2015 04:03 PM

Amigos:

Necesito de su ayuda para desarrollar una pequeña aplicación usando mysql embebido con objeto
de poder usar la aplicación desde una USB y transportarla por diferentes PCs, nunca acceso remoto.

He buscado en el foro y lo que encontré fue incluir en mi script de compilación la lib libmysqld.lib y
poner la dll libmysqld.dll pero al compilar la aplicación me tira un error.

invalid OMF possibly COFF.

Alguien que me tienda una mano?

Saludos

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: 845
Joined: Sun Oct 09, 2005 05:36 PM

Re: Cómo usar mysql embebido?

Posted: Mon Mar 30, 2015 06:22 PM

Armando,

pegame un grito por skype a ver si te puedo echar la mano..

saludos

____________________

Paco
Posts: 99
Joined: Thu Aug 02, 2012 03:21 PM

Re: Cómo usar mysql embebido?

Posted: Tue Mar 31, 2015 03:36 PM

Amigos, yo tambien estoy interesado en saber como utilizar este metodo de MySQL, podrian compartirlo por este medio.

Saludos.

Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)

FiveWin Version: FWHX 15.01

BCC 5.8.2
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM

Re: Cómo usar mysql embebido?

Posted: Tue Mar 31, 2015 03:50 PM
hebert_j_vargas wrote:Amigos, yo tambien estoy interesado en saber como utilizar este metodo de MySQL, podrian compartirlo por este medio.


Saludos.

+1
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM

Re: Cómo usar mysql embebido?

Posted: Tue Mar 31, 2015 07:04 PM

Yo tambien estoy interesado
Puede servir esto?

http://www.forosdelweb.com/f96/compilan ... ql-543492/

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM

Re: Cómo usar mysql embebido?

Posted: Tue Mar 31, 2015 07:20 PM

Cristóbal:

Leyendo en el foro veo que hay muchos que mencionan estar usando MySql embebido
pero no sueltan prenda.

Tal vez es como el chiste aquel.

"Va un hombre maduro a consultar al médico y le pide un consejo,
Doctor, que me aconseja?, mis amigos me presumen tener relaciones
5, 6, 7 y hasta 8 veces en una noche, yo que puedo hacer?,
El médico muy tranquilo le dice, pues miéntales usted también!"

Que nadie se ofenda, es solo para relajar la presión del trabajo.

Saludos

PD. Antonio, si crees que me excedí, por favor elimina este post.

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: 1088
Joined: Fri Oct 07, 2005 03:33 PM

Re: Cómo usar mysql embebido?

Posted: Tue Mar 31, 2015 09:29 PM

Holas,

tDolphin lo permite utilizar

saludos

Marcelo

Posts: 226
Joined: Sun May 13, 2012 07:52 AM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 09:50 AM

yo nunca necesitado instalar mysql en pendrive, mas
ver si ayuda

MYSQL or MariaDB Embedded => http://fivewin.com.br/index.php?/topic/ ... om-o-mysql //copiar la carpeta mysql también funciona bien. No es necesario crear SETUP.exe

instalar Service mysql
e:\PastaAPP\mysql\bin\mysqld --install NameYourService --defaults-file=e:\PastaAPP\mysql\my.ini

inicia Service
net start NameYourService
...
..
.
net stop NameYourService
and Remover Service mysql
e:\PastaAPP\mysql\bin\mysqld --remove NameYourService

FWH2008 | xHarbour | BCC74 | SQLRDD
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 02:25 PM
Si hay pocas respuestas es porque alo mejor se usa poco, de cualquier modo en Eagle1 es muy fácil.
Fijense el trozo de código que hay entre estas dos líneas que siguen;
#ifdef E1_EMBEDDED
#else

el resto es igual para MySQL normal o embebido

Code (fw): Select all Collapse
//  PROPOSITO.: Ejemplo de mantenimiento simple de una tabla                  //
//----------------------------------------------------------------------------//

//-- Definiciones ------------------------------------------------------------//

#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
                CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )

#define ID_CONSUTA  0
#define ID_MODIFICA 1
#define ID_ALTA     2
#define ID_BORRA    3

//-- Includes ----------------------------------------------------------------//

#include "InKey.ch"
#include "Eagle1.ch"

//-- Fuerza el enlazado -----------------------------------------------------//

REQUEST HB_GT_WIN

//-- Modulo principal --------------------------------------------------------//

procedure main()

    local cDb := "E1Prueba"
    local cTable := "Test"
    local oCon, oTb, n

//----------------------------------------------------------------------------
// Desde aquÝ se decide si el sistema usado es el C/S o el embebido

#ifdef E1_EMBEDDED
    // Sistema embebido.
    // El primer elemento del array de opciones deberÝa ser el nombre
    // del programa, actualmente E1 hace lo mismo que MySQL y lo ignora.
    // Ojo!!! s¾lo se procesa a partir del segundo.
    local aOptions := { "PT05.PRG", "--defaults-file=./test.cnf" }
    // El array de grupos contiene los nombres de los grupos que queramos
    // procesar dentro del fichero ini declarado
    local aGroup := { "op_servidor", "op_cliente" }

    //-----------------------------------------------------
    // Creamos el objeto Connect e intentamos la conexi¾n:

    oCon := TMSEConnect():New( )
    oCon:Connect(  aOptions, aGroup, cDb )
#else
    // Sistema Cliente/Servidor
    local cHost := "127.0.0.1"
    local cUser := "root"
    local cPwd := "root"

    //-----------------------------------------------------
    // Creamos el objeto Connect e intentamos la conexi¾n:
    oCon := TMSConnect():New()
    oCon:Connect( cHost, cUser, cPwd, cDb,,, CLIENT_MULTI_STATEMENTS )
#endif

// Hasta aquÝ. A paritir de aquÝ no se cambia ni una lÝnea de c¾digo
//----------------------------------------------------------------------------

    SET DATE FORMAT TO "DD/MM/YYYY"

    cls

    if oCon:lConnected
        // Control de errores automßtico
        oCon:SetAutoError( .t. )
        // Creo el objeto Tabla con DataField
        oTb := TMyTable( cTable ):New( oCon, cTable )
        // Establezco el relleno de espacios (menos optimo)
        oTb:SetReadPADAll( .t. )
        // Prueba de tiny como logicos:
        oTb:SetTinyAsLogical( .t. )
        // Abro la tabla
        if oTb:Open()
            MyMsgInfo( oCon:oDataBase:ShowCreate(), "Creaci¾n de " + oCon:oDataBase:cName )
            MyMsgInfo( oTb:ShowCreate(), "Estructura de " + oTb:cName )
            // Si no hay registros insertamos uno para que funcione el Browse
            Alert( "Estado actual de la conexion...;-------------------------------;;";
                   + oCon:GetStat() )
            // Abrimos el Browse
            GestBrw( oTb )
        else
            // Esta es la manera de poner un mensaje de error propio y
            // del generado por Eagle1 cuando ponemos SetAutoError( .f. )
            Alert( ";Mi mensaje de error:;No se pudo abrir la tabla " + oTb:cName + ;
                   ";;Y el devuelto por Eagle1:;" + oTb:oError:GetError() )
        endif
        // Prueba de FieldName y FieldPos
        n := 6
        Alert( "Nombre de la columna " + StrNum( n ) + ": " +;
               oTb:FieldName( n ) + ;
               ";Orden de la columna ZIP: " + ;
               StrNum( oTb:FieldPos( "zip" ) ) + " Valor " + ;
               oTb:FieldGetByName( "zip" ) + " - " + ;
               oTb:FieldGet( oTb:FieldPos( "zip" ) ) )
        // Prueba de setWhere
        oTb:SetWhere( "first = 'Homer'", .t. ) // Asigna la condici¾n y refresca el reultado
        Alert( oTb:cStatement )
        // Abrimos el Browse
        GestBrw( oTb )

        //------------------------------
        // Ejemplo SELECT escalar o sea que retorna un valor unico que puede ser
        // numerico o alfanumerico
        cls
        Alert( "Numero de registros hallados con la funcion COUNT( * ): " + ;
               StrNum( oCon:GetScalarQuery( "SELECT count( * ) FROM test" ) ) )

        Alert( "Ahora la columna NOTES de la primera fila : " + ;
               oCon:GetScalarQuery( "SELECT notes FROM test" ) )

        // Liberamos la memoria ocupada por el objeto tabla
        oTb:Free()

//------------------------------
// METHOD Export( cBakFileName, lCreate, aTables, lDropTable )
// Prueba de backup:
        n := Seconds()
        oCon:oDataBase:Export() // "MiCopia.sql", .t. )

        Alert( "La copia se ha realizado con el nombre: " + ;
               oCon:oDataBase:cBakFileName + ";;en " + ;
               StrNum( Seconds() - n ) + " segundos" )

//------------------------------
// Este es el restore
//
/*
        if oCon:oDataBase:Import( oCon:oDataBase:cBakFileName )
            Alert( "La restauracion de la copia se ejecuto ok" )
        else
            Alert( "Error en la restauracion de la copia..." )
        endif
*/
//------------------------------
    else
        Alert( "No se pudo conectar..." )
    endif

    // Liberamos la memoria de la conexion
    oCon:Free()

return

//-- Modulos auxiliares ------------------------------------------------------//

//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL

static procedure GestBrw( oTb )

    local oBrw, oCol
    local lEnd := .f.
    local nKey, n, nFld

    oBrw := TBrowseNew( 1, 0, MaxRow() - 1, MaxCol() )

    oBrw:colorSpec := "W+/B, N/BG"
    oBrw:ColSep    := " │ "
    oBrw:HeadSep   := "─┼─"
    oBrw:FootSep   := "─┴─"
    // Asignamos los bloques de codigo de movimientos del cursor
    // de datos
    MySetBrowse( oBrw, oTb )

    nFld := oTb:FieldCount()

    FOR n := 1 TO nFld
        oBrw:AddColumn( TBColumnNew( PADL( n, 2, "0" ) + "-" + ;
                        oTb:FieldType( n ) + "-" + oTb:FieldName( n ), ;
                        GenCB( oTb, n ) ) )
    NEXT

    cls

    @ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
                        upper( oTb:cName ), MaxCol() + 1, " " ) COLOR "W+/G+"

    @ MaxRow(),         0 SAY "INS"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Altas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ENTER"               COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Mod."                COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "SUPR"                COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Bajas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F1"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Ayuda"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F4"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Orden"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F5"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F6"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca ->"            COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ESC"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Salir"               COLOR "W+/R+"

    while !lEnd

      oBrw:ForceStable()

      nKey = InKey( 0 )

      do case
         case nKey == K_ESC             // Salir
              SetPos( MaxRow(), 0 )
              lEnd = .t.

         case nKey == K_DOWN            // Fila siguiente
              oBrw:Down()

         case nKey == K_F3
              oTb:SetReadPADAll( !oTb:SetReadPADAll() )
              oBrw:Configure()

         case nKey == K_F4              // Establece el orden
                if ElOrden( oTb )
                    oBrw:goTop()
                endif

         case nKey == K_F5              // Busca valor en columna
            if !BuscaValor( oTb )
                Alert( "Valor no encontrado..." )
            endif
            oBrw:RefreshAll()

         case nKey == K_F6              // Busca siguiente columna
            if !oTb:FindLikeNext()
                Alert( "Valor no encontrado..." )
            endif
            oBrw:RefreshAll()

         case nKey == K_UP              // Fila anterior
              oBrw:Up()

         case nKey == K_LEFT            // Va a la columna antrior
              oBrw:Left()

         case nKey == K_RIGHT           // Va a la columna siguiente
              oBrw:Right()

         case nKey = K_PGDN             // Va a la pagina siguiente
              oBrw:pageDown()

         case nKey = K_PGUP             // Va a la pagina antrior
              oBrw:pageUp()

         case nKey = K_CTRL_PGUP        // Va al principio
              oBrw:goTop()

         case nKey = K_CTRL_PGDN        // Va al final
              oBrw:goBottom()

         case nKey = K_HOME             // Va a la primera columna visible
              oBrw:home()

         case nKey = K_END              // Va a la ultima columna visible
              oBrw:end()

         case nKey = K_CTRL_LEFT        // Va a la primera columna
              oBrw:panLeft()

         case nKey = K_CTRL_RIGHT       // Va a la ultima columna
              oBrw:panRight()

         case nKey = K_CTRL_HOME        // Va a la primera pßgina
              oBrw:panHome()

         case nKey = K_CTRL_END         // Va a la ·ltima pßgina
              oBrw:panEnd()

         case nKey = K_DEL              // Borra fila
            Borrar( oTb, oBrw )

         case nKey = K_INS              // Inserta columna
            Insertar( oTb, oBrw )

         case nKey = K_ENTER            // Modifica columna
            Modificar( oTb, oBrw )

         case nKey == K_F1              // Algunos datos
            Alert( "Datos de la tabla " + oTb:cName + ";" + ;
                   ";Registro actual......: " + Str( oTb:RecNo() ) + ;
                   ";Total de registros...: " + Str( oTb:RecCount() ) + ;
                   ";Total de columnas....: " + Str( oTb:FieldCount() ) )
            Muestra( oTb:GetRowAsString() )

      endcase

   end

return

//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse

static function GenCB( oTb, n )
return( { || oTb:FieldGet( n ) } )

//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla

static function PantMuestra( oTb, nTipo )

    local GetList := {}
    local cTipo, cId

    do case
        case nTipo == ID_ALTA
            cTipo := "Insertando"
            cId := "nuevo"
        case nTipo == ID_BORRA
        case nTipo == ID_CONSUTA
        case nTipo == ID_MODIFICA
            cTipo := "Modificando"
            cId := StrNum( oTb:Id )
    end

    SET CURSOR ON

    DispBox( 3, 2, 18, 74, B_BOX )

    @ 04, 03 SAY cTipo + " registro en tabla " + oTb:cName + " - Numero: " + cId

    @ 06, 03 SAY "First....:" GET oTb:First     PICTURE "@K"
    @ 07, 03 SAY "Last.....:" GET oTb:Last      PICTURE "@K"
    @ 08, 03 SAY "Street...:" GET oTb:Street    PICTURE "@K"
    @ 09, 03 SAY "City.....:" GET oTb:City      PICTURE "@K"
    @ 10, 03 SAY "State....:" GET oTb:State     PICTURE "@K"
    @ 11, 03 SAY "Zip......:" GET oTb:Zip       PICTURE "@K"
    @ 12, 03 SAY "Hiredate.:" GET oTb:Hiredate  PICTURE "@K"
    @ 13, 03 SAY "Married..:" GET oTb:Married   PICTURE "@K"
    @ 14, 03 SAY "Age......:" GET oTb:Age       PICTURE "@K"
    @ 15, 03 SAY "Salary...:" GET oTb:Salary    PICTURE "@K"
    @ 16, 03 SAY "Notes:"
    @ 17, 03                  GET oTb:Notes     PICTURE "@K"

return( GetList )

//----------------------------------------------------------------------------//
// Inserta una fila

static procedure Insertar( oTb, oBrw )

    local GetList := {}
    local cPant := SaveScreen( 3, 2, 18, 74 )

    oTb:Blank()

    GetList := PantMuestra( oTb, ID_ALTA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        if oTb:Insert()
            Alert( "Tupla insertada" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oBrw:goBottom()
                oBrw:RefreshAll()
            endif
        endif
    endif

return

//----------------------------------------------------------------------------//
// Modifica la fila actual

static procedure Modificar(oTb,oBrw )

    local GetList := {}
    local nRecNo := oTb:RecNo()
    local cPant := SaveScreen( 3, 2, 18, 74 )

    oTb:Load()

    GetList := PantMuestra( oTb, ID_MODIFICA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        if oTb:Update()
            Alert( StrNum( oTb:AffectedRows() ) + " - tuplas modificadas" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oTb:GoTo( nRecNo )
                oBrw:RefreshAll()
            endif
        endif
    endif

return

//----------------------------------------------------------------------------//
// Borra la fila actual

static procedure Borrar( oTb, oBrw )

    local nRecNo := oTb:RecNo()

    if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
        if oTb:Delete( , 1 )
            Alert( "Borrado en el servidor" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oTb:GoTo( nRecNo )
                oBrw:RefreshAll()
            endif
        endif
    else
        Alert( "No se ha borrado..." )
    endif

return

//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion

static function ElOrden( oTb )

    local i := oTb:FieldCount()
    local aFld := Array( i )
    local n, lRet

    FOR n := 1 TO i
        aFld[ n ] := oTb:FieldName( n )
    NEXT

    DispBox( 5, 9, 10, 25, B_BOX )

    i := 0
    i := AChoice( 6, 10, 9, 24, aFld )

    if lRet := ( i > 0 )
        Alert( "Ordenado por la columna: " + StrNum( i ) + " " + oTb:FieldName( i ) )
        oTb:SetOrderBy( i,, .t. )
    endif

return( lRet )

//----------------------------------------------------------------------------//
// Busca un valor de una columna

static function BuscaValor( oTb )

    local GetList := {}
    local nCol := 0
    local lRet, uVal

    DispBox( 5, 5, 8, 75, B_BOX )

    @ 6, 10 SAY "Entre numero de columna:" GET nCol PICTURE "@K"
    READ

    if nCol > 0 .and. nCol <= oTb:FieldCount()
        uVal := oTb:FieldGet( nCol )

        @ 7, 10 SAY "Entre valor buscado:" GET uVal PICTURE "@K"
        READ

        // Ojo cuando es tipo caracter (x)Harbour mete espacios hasta el final
        // del ancho del campo
        uVal := if( ValType( uVal ) == "C", AllTrim( uVal ), uVal )

        lRet := oTb:FindLike( nCol, uVal, .t. )
    else
        lRet := .f.
        Alert( "Emtre un n·mero de columna correcto" )
    endif

return( lRet )

//----------------------------------------------------------------------------//
______________________________________________________________________________

Sevilla - Andalucía
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 03:59 PM

Sistem, xManuel:

Muchas gracias por sus respuestas, vamos a intentarlo.

Saludos

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: 99
Joined: Thu Aug 02, 2012 03:21 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 06:08 PM
xmanuel wrote:Si hay pocas respuestas es porque alo mejor se usa poco, de cualquier modo en Eagle1 es muy fácil.
Fijense el trozo de código que hay entre estas dos líneas que siguen;
#ifdef E1_EMBEDDED
#else

el resto es igual para MySQL normal o embebido

Code (fw): Select all Collapse
//  PROPOSITO.: Ejemplo de mantenimiento simple de una tabla                  //
//----------------------------------------------------------------------------//

//-- Definiciones ------------------------------------------------------------//

#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
                CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )

#define ID_CONSUTA  0
#define ID_MODIFICA 1
#define ID_ALTA     2
#define ID_BORRA    3

//-- Includes ----------------------------------------------------------------//

#include "InKey.ch"
#include "Eagle1.ch"

//-- Fuerza el enlazado -----------------------------------------------------//

REQUEST HB_GT_WIN

//-- Modulo principal --------------------------------------------------------//

procedure main()

    local cDb := "E1Prueba"
    local cTable := "Test"
    local oCon, oTb, n

//----------------------------------------------------------------------------
// Desde aquÝ se decide si el sistema usado es el C/S o el embebido

#ifdef E1_EMBEDDED
    // Sistema embebido.
    // El primer elemento del array de opciones deberÝa ser el nombre
    // del programa, actualmente E1 hace lo mismo que MySQL y lo ignora.
    // Ojo!!! s¾lo se procesa a partir del segundo.
    local aOptions := { "PT05.PRG", "--defaults-file=./test.cnf" }
    // El array de grupos contiene los nombres de los grupos que queramos
    // procesar dentro del fichero ini declarado
    local aGroup := { "op_servidor", "op_cliente" }

    //-----------------------------------------------------
    // Creamos el objeto Connect e intentamos la conexi¾n:

    oCon := TMSEConnect():New( )
    oCon:Connect(  aOptions, aGroup, cDb )
#else
    // Sistema Cliente/Servidor
    local cHost := "127.0.0.1"
    local cUser := "root"
    local cPwd := "root"

    //-----------------------------------------------------
    // Creamos el objeto Connect e intentamos la conexi¾n:
    oCon := TMSConnect():New()
    oCon:Connect( cHost, cUser, cPwd, cDb,,, CLIENT_MULTI_STATEMENTS )
#endif

// Hasta aquÝ. A paritir de aquÝ no se cambia ni una lÝnea de c¾digo
//----------------------------------------------------------------------------

    SET DATE FORMAT TO "DD/MM/YYYY"

    cls

    if oCon:lConnected
        // Control de errores automßtico
        oCon:SetAutoError( .t. )
        // Creo el objeto Tabla con DataField
        oTb := TMyTable( cTable ):New( oCon, cTable )
        // Establezco el relleno de espacios (menos optimo)
        oTb:SetReadPADAll( .t. )
        // Prueba de tiny como logicos:
        oTb:SetTinyAsLogical( .t. )
        // Abro la tabla
        if oTb:Open()
            MyMsgInfo( oCon:oDataBase:ShowCreate(), "Creaci¾n de " + oCon:oDataBase:cName )
            MyMsgInfo( oTb:ShowCreate(), "Estructura de " + oTb:cName )
            // Si no hay registros insertamos uno para que funcione el Browse
            Alert( "Estado actual de la conexion...;-------------------------------;;";
                   + oCon:GetStat() )
            // Abrimos el Browse
            GestBrw( oTb )
        else
            // Esta es la manera de poner un mensaje de error propio y
            // del generado por Eagle1 cuando ponemos SetAutoError( .f. )
            Alert( ";Mi mensaje de error:;No se pudo abrir la tabla " + oTb:cName + ;
                   ";;Y el devuelto por Eagle1:;" + oTb:oError:GetError() )
        endif
        // Prueba de FieldName y FieldPos
        n := 6
        Alert( "Nombre de la columna " + StrNum( n ) + ": " +;
               oTb:FieldName( n ) + ;
               ";Orden de la columna ZIP: " + ;
               StrNum( oTb:FieldPos( "zip" ) ) + " Valor " + ;
               oTb:FieldGetByName( "zip" ) + " - " + ;
               oTb:FieldGet( oTb:FieldPos( "zip" ) ) )
        // Prueba de setWhere
        oTb:SetWhere( "first = 'Homer'", .t. ) // Asigna la condici¾n y refresca el reultado
        Alert( oTb:cStatement )
        // Abrimos el Browse
        GestBrw( oTb )

        //------------------------------
        // Ejemplo SELECT escalar o sea que retorna un valor unico que puede ser
        // numerico o alfanumerico
        cls
        Alert( "Numero de registros hallados con la funcion COUNT( * ): " + ;
               StrNum( oCon:GetScalarQuery( "SELECT count( * ) FROM test" ) ) )

        Alert( "Ahora la columna NOTES de la primera fila : " + ;
               oCon:GetScalarQuery( "SELECT notes FROM test" ) )

        // Liberamos la memoria ocupada por el objeto tabla
        oTb:Free()

//------------------------------
// METHOD Export( cBakFileName, lCreate, aTables, lDropTable )
// Prueba de backup:
        n := Seconds()
        oCon:oDataBase:Export() // "MiCopia.sql", .t. )

        Alert( "La copia se ha realizado con el nombre: " + ;
               oCon:oDataBase:cBakFileName + ";;en " + ;
               StrNum( Seconds() - n ) + " segundos" )

//------------------------------
// Este es el restore
//
/*
        if oCon:oDataBase:Import( oCon:oDataBase:cBakFileName )
            Alert( "La restauracion de la copia se ejecuto ok" )
        else
            Alert( "Error en la restauracion de la copia..." )
        endif
*/
//------------------------------
    else
        Alert( "No se pudo conectar..." )
    endif

    // Liberamos la memoria de la conexion
    oCon:Free()

return

//-- Modulos auxiliares ------------------------------------------------------//

//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL

static procedure GestBrw( oTb )

    local oBrw, oCol
    local lEnd := .f.
    local nKey, n, nFld

    oBrw := TBrowseNew( 1, 0, MaxRow() - 1, MaxCol() )

    oBrw:colorSpec := "W+/B, N/BG"
    oBrw:ColSep    := " │ "
    oBrw:HeadSep   := "─┼─"
    oBrw:FootSep   := "─┴─"
    // Asignamos los bloques de codigo de movimientos del cursor
    // de datos
    MySetBrowse( oBrw, oTb )

    nFld := oTb:FieldCount()

    FOR n := 1 TO nFld
        oBrw:AddColumn( TBColumnNew( PADL( n, 2, "0" ) + "-" + ;
                        oTb:FieldType( n ) + "-" + oTb:FieldName( n ), ;
                        GenCB( oTb, n ) ) )
    NEXT

    cls

    @ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
                        upper( oTb:cName ), MaxCol() + 1, " " ) COLOR "W+/G+"

    @ MaxRow(),         0 SAY "INS"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Altas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ENTER"               COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Mod."                COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "SUPR"                COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Bajas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F1"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Ayuda"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F4"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Orden"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F5"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F6"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca ->"            COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ESC"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Salir"               COLOR "W+/R+"

    while !lEnd

      oBrw:ForceStable()

      nKey = InKey( 0 )

      do case
         case nKey == K_ESC             // Salir
              SetPos( MaxRow(), 0 )
              lEnd = .t.

         case nKey == K_DOWN            // Fila siguiente
              oBrw:Down()

         case nKey == K_F3
              oTb:SetReadPADAll( !oTb:SetReadPADAll() )
              oBrw:Configure()

         case nKey == K_F4              // Establece el orden
                if ElOrden( oTb )
                    oBrw:goTop()
                endif

         case nKey == K_F5              // Busca valor en columna
            if !BuscaValor( oTb )
                Alert( "Valor no encontrado..." )
            endif
            oBrw:RefreshAll()

         case nKey == K_F6              // Busca siguiente columna
            if !oTb:FindLikeNext()
                Alert( "Valor no encontrado..." )
            endif
            oBrw:RefreshAll()

         case nKey == K_UP              // Fila anterior
              oBrw:Up()

         case nKey == K_LEFT            // Va a la columna antrior
              oBrw:Left()

         case nKey == K_RIGHT           // Va a la columna siguiente
              oBrw:Right()

         case nKey = K_PGDN             // Va a la pagina siguiente
              oBrw:pageDown()

         case nKey = K_PGUP             // Va a la pagina antrior
              oBrw:pageUp()

         case nKey = K_CTRL_PGUP        // Va al principio
              oBrw:goTop()

         case nKey = K_CTRL_PGDN        // Va al final
              oBrw:goBottom()

         case nKey = K_HOME             // Va a la primera columna visible
              oBrw:home()

         case nKey = K_END              // Va a la ultima columna visible
              oBrw:end()

         case nKey = K_CTRL_LEFT        // Va a la primera columna
              oBrw:panLeft()

         case nKey = K_CTRL_RIGHT       // Va a la ultima columna
              oBrw:panRight()

         case nKey = K_CTRL_HOME        // Va a la primera pßgina
              oBrw:panHome()

         case nKey = K_CTRL_END         // Va a la ·ltima pßgina
              oBrw:panEnd()

         case nKey = K_DEL              // Borra fila
            Borrar( oTb, oBrw )

         case nKey = K_INS              // Inserta columna
            Insertar( oTb, oBrw )

         case nKey = K_ENTER            // Modifica columna
            Modificar( oTb, oBrw )

         case nKey == K_F1              // Algunos datos
            Alert( "Datos de la tabla " + oTb:cName + ";" + ;
                   ";Registro actual......: " + Str( oTb:RecNo() ) + ;
                   ";Total de registros...: " + Str( oTb:RecCount() ) + ;
                   ";Total de columnas....: " + Str( oTb:FieldCount() ) )
            Muestra( oTb:GetRowAsString() )

      endcase

   end

return

//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse

static function GenCB( oTb, n )
return( { || oTb:FieldGet( n ) } )

//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla

static function PantMuestra( oTb, nTipo )

    local GetList := {}
    local cTipo, cId

    do case
        case nTipo == ID_ALTA
            cTipo := "Insertando"
            cId := "nuevo"
        case nTipo == ID_BORRA
        case nTipo == ID_CONSUTA
        case nTipo == ID_MODIFICA
            cTipo := "Modificando"
            cId := StrNum( oTb:Id )
    end

    SET CURSOR ON

    DispBox( 3, 2, 18, 74, B_BOX )

    @ 04, 03 SAY cTipo + " registro en tabla " + oTb:cName + " - Numero: " + cId

    @ 06, 03 SAY "First....:" GET oTb:First     PICTURE "@K"
    @ 07, 03 SAY "Last.....:" GET oTb:Last      PICTURE "@K"
    @ 08, 03 SAY "Street...:" GET oTb:Street    PICTURE "@K"
    @ 09, 03 SAY "City.....:" GET oTb:City      PICTURE "@K"
    @ 10, 03 SAY "State....:" GET oTb:State     PICTURE "@K"
    @ 11, 03 SAY "Zip......:" GET oTb:Zip       PICTURE "@K"
    @ 12, 03 SAY "Hiredate.:" GET oTb:Hiredate  PICTURE "@K"
    @ 13, 03 SAY "Married..:" GET oTb:Married   PICTURE "@K"
    @ 14, 03 SAY "Age......:" GET oTb:Age       PICTURE "@K"
    @ 15, 03 SAY "Salary...:" GET oTb:Salary    PICTURE "@K"
    @ 16, 03 SAY "Notes:"
    @ 17, 03                  GET oTb:Notes     PICTURE "@K"

return( GetList )

//----------------------------------------------------------------------------//
// Inserta una fila

static procedure Insertar( oTb, oBrw )

    local GetList := {}
    local cPant := SaveScreen( 3, 2, 18, 74 )

    oTb:Blank()

    GetList := PantMuestra( oTb, ID_ALTA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        if oTb:Insert()
            Alert( "Tupla insertada" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oBrw:goBottom()
                oBrw:RefreshAll()
            endif
        endif
    endif

return

//----------------------------------------------------------------------------//
// Modifica la fila actual

static procedure Modificar(oTb,oBrw )

    local GetList := {}
    local nRecNo := oTb:RecNo()
    local cPant := SaveScreen( 3, 2, 18, 74 )

    oTb:Load()

    GetList := PantMuestra( oTb, ID_MODIFICA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        if oTb:Update()
            Alert( StrNum( oTb:AffectedRows() ) + " - tuplas modificadas" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oTb:GoTo( nRecNo )
                oBrw:RefreshAll()
            endif
        endif
    endif

return

//----------------------------------------------------------------------------//
// Borra la fila actual

static procedure Borrar( oTb, oBrw )

    local nRecNo := oTb:RecNo()

    if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
        if oTb:Delete( , 1 )
            Alert( "Borrado en el servidor" )
            if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
                oTb:Refresh()
                oTb:GoTo( nRecNo )
                oBrw:RefreshAll()
            endif
        endif
    else
        Alert( "No se ha borrado..." )
    endif

return

//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion

static function ElOrden( oTb )

    local i := oTb:FieldCount()
    local aFld := Array( i )
    local n, lRet

    FOR n := 1 TO i
        aFld[ n ] := oTb:FieldName( n )
    NEXT

    DispBox( 5, 9, 10, 25, B_BOX )

    i := 0
    i := AChoice( 6, 10, 9, 24, aFld )

    if lRet := ( i > 0 )
        Alert( "Ordenado por la columna: " + StrNum( i ) + " " + oTb:FieldName( i ) )
        oTb:SetOrderBy( i,, .t. )
    endif

return( lRet )

//----------------------------------------------------------------------------//
// Busca un valor de una columna

static function BuscaValor( oTb )

    local GetList := {}
    local nCol := 0
    local lRet, uVal

    DispBox( 5, 5, 8, 75, B_BOX )

    @ 6, 10 SAY "Entre numero de columna:" GET nCol PICTURE "@K"
    READ

    if nCol > 0 .and. nCol <= oTb:FieldCount()
        uVal := oTb:FieldGet( nCol )

        @ 7, 10 SAY "Entre valor buscado:" GET uVal PICTURE "@K"
        READ

        // Ojo cuando es tipo caracter (x)Harbour mete espacios hasta el final
        // del ancho del campo
        uVal := if( ValType( uVal ) == "C", AllTrim( uVal ), uVal )

        lRet := oTb:FindLike( nCol, uVal, .t. )
    else
        lRet := .f.
        Alert( "Emtre un n·mero de columna correcto" )
    endif

return( lRet )

//----------------------------------------------------------------------------//

xManuel, ¿Quieres decir que con este código solo debo incluir el DLL Libmysqld y mi aplicación no necesitará de un servidor Mysql?,
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)

FiveWin Version: FWHX 15.01

BCC 5.8.2
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 06:28 PM

Por si ayuda

Existe el Enigma Virtual Box el cual nos permite adjuntar archivos a nuestro EXE como DLL, OCX y otros.

Saludos,

Adhemar

Saludos,



Adhemar C.
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 08:21 PM

Así es hebert_j_vargas :D
Con un exe y la DLL te puedes permitir el lujo de hacer una instalación completa sin tener que ir tú personalmente a instalar tu programa...

Todo está autocontenido :shock: :mrgreen:

______________________________________________________________________________

Sevilla - Andalucía
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM

Re: Cómo usar mysql embebido?

Posted: Wed Apr 01, 2015 08:33 PM
Por cierto allá en el 2008 publiqué una entrada en mi viejo blog que versaba sobre este tema... ahora Eagle1 es más fácil y potente jeje
https://lacolinadelloco.blogia.com/
______________________________________________________________________________

Sevilla - Andalucía
Posts: 99
Joined: Thu Aug 02, 2012 03:21 PM

Re: Cómo usar mysql embebido?

Posted: Thu Apr 02, 2015 11:59 PM

Excelente xmanuel, voy a probarlo!!!

Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)

FiveWin Version: FWHX 15.01

BCC 5.8.2