martes, 26 de mayo de 2009

Acceder a MySQL con una Aplicacion simple:

Hola amigos,,,
Aqui os dejo un ejemplo simple de como acceder a una base de datos de MySQL y hacer un Browse,,, con TWBrowse.... luego veremos como hacer la Altas, Bajas y Reportes, pero eso si, utilizando pura sentencia SQL,,,

# include "fivewin.ch"
Static oWnd, oMySQl, oDBase, lConecta, lOkDb
//----------------------------------------------------------------------------------------Function Main()
local cHost, cUser, cPass, lOk, nPortlocal cDbName
lOk := .f.
lConecta := lOkDb := .f.
//-------parametros de entrada-------------------------------------//
cHost := "localhost" // en modo local
cUser := "pruebas" // usuario
cPass := "pruebas" // password
cDbName := "pruebas" // nombre de la base de datos
nPort := "3306"
//--------aqui nos conectamos al servidor--------------------------
ConectaMySQL(cHost, cUser, cPass, nPort)
If !lConecta
MsgInfo( "No Hay Conexión Con El Servidor " + cHost "" )
Return(.f.)
EndIf

oDBase := AbreDbMySQL(oMySQL, oDBase, cDbName)
If !lOkDb
MsgInfo( "No Se Puede Crear la Base De Datos " + cDbName + CHR(34), "" )
Return(.f.)
EndIF

DEFINE WINDOW oWnd
ACTIVATE WINDOW oWnd MAXIMIZED ;
ON INIT AMB(oWnd, oMySQL, oDBase) // siempre envio los handles,,,,,
Return(nil)
//--------------------------------------------------------------------
Function ConectaMySQL(cHost, cUser, cPass, nPuerto )
oMySQL := TMySQLServer():New(cHost, cUser, cPass, nPuerto)
IF oMySQL:NetErr()
lConecta := .f.
ELse
lConecta := .t.
EndIF
Return(lConecta)
//---------------------------------------------------------------------
Function AbreDbMySQL(oMySQL, oDBase, cDbName)
cDBName := AllTrim(cDbName)
oMySQL:Query( "CREATE DATABASE IF NOT EXISTS " + cDBName )
oDBase := oMySQL:SelectDB( cDBName )
IF oMySQL:NetErr()
lOkDb := .f.
Else
lOkDb := .t.
EndIF
Return(oDBase)

//-------esta funcion puede estar en otro prg---------------------
Function AMB(oWnd, oMySQL, oDBase)
local oSalir, oNuevo, oModif, oImpri, oElimi, tCargalocal oDlg, oLbx, oDatos, eDatos, oOrden
local nOrden, oAlgo, lAlgolocal aCol, oBrw, cQuery, nCont, nLen, aListaaCol := ARRAY(2)

cQuery := "SELECT * FROM kardex WHERE cod_producto = '20071121223230' ORDER BY num_movimiento LIMIT 500"
oDatos := oMySQL:Query(cQuery , .t. )
If oDatos:RecCount() == 0 && si no tiene datos...
oDatos:End()
MsgInfo("No hay registros")
Return(Nil)
EndIf

DEFINE DIALOG oDlg ; RESOURCE "PRODUCTOSTW" ; TITLE "FWH + HARBOUR + TMySQL + MySQL"

REDEFINE LISTBOX oLbx ;
FIELDS STR(MyCampo(oDatos, "ingreso"),12,2), ;
STR(MyCampo(oDatos, "egreso"),12,2), ;
STR(MyCampo(oDatos, "saldo"),12,2) ;
HEADERS "Campo1", ;
"Campo2", ;
"Campo3" ;
SIZES 150, 150, 150 ;
ID 200 OF oDlg
MySetbrowse(oLbx, oDatos ) // importante para la navegacion

ACTIVATE DIALOG oDlg CENTER //ON INIT createxb( oDatos, oDlg )
Return(nil)
*/
//----esta funcion permite manejar las tablas aun sin datos---------------
Function MyCampo(oBjeto, nCampo, nEnt, nDec)
local cCampo, cRet, nCol, nCont, cField, nPos
If VALTYPE(nCampo) = "C" // vino el nombre de un campo
nCampo := ALLTRIM(nCampo)
nPos := oBjeto:FieldPos(nCampo)
If nPos = 0 // no existe en campo en mencion
Msginfo("No Existe el Campo Indicado <" + nCampo + ">", "Error")
Return("")
EndIf
Else
nPos := nCampo
EndIf

DO CASE
CASE oBjeto:FieldType(nPos) = "N"
cCampo := 0
CASE oBjeto:FieldType(nPos) = "C"
cCampo := ""
CASE oBjeto:FieldType(nPos) = "L"
cCampo := ".f."
CASE oBjeto:FieldType(nPos) = "D"
cCampo := CTOD(" / / /")
OTHER cCampo := ""
ENDCASE

If oBjeto:RecCount() = 0
Return(cCampo)
EndIF
IF oBjeto:FieldType(nPos) = "U"
Return(cCampo)
EndIf
cCampo := oBjeto:FieldGet(nPos)
Return(cCampo)

3 comentarios:

  1. Actualmente estoy atacando MySql mediante Ado pero me gustaría probar esta librería. Compilo con xHarbour 1.1.0. ¿ Donde podría conseguila ?

    ResponderEliminar
  2. TMySQL viene en las contribuciones de xharbour en www.xharbour.org

    ResponderEliminar
  3. Asi es,

    Las contribuciones están en www.xharbour.org, sección contribuciones

    saludos

    ResponderEliminar