domingo, 27 de diciembre de 2009

FWH Generator 1.3

Amigos,

Aquí una actualización.

FWH Generator 1.3 DESCARGA

Adiciones:
- Poder seleccionar los fuentes en el listbox.
- Al EJECUTAR creación de la lib si hay items seleccionados en el listbox estos serán compilados, de lo contrario, si no hay ninguno, se compilará la lista completa.
- Al final de la compilación (EJECUTAR) se mostrarán errores si los hubiera.

Como siempre, espero sea de ayuda.

Saludos

Hoy 27 de diciembre

Amigos,

Comparto con ustedes la fortuna de cumplir un año mas de vida.

38 añitos y contando....

Se aceptan regalos, felicitaciones, críticas, etc, etc, etc.


jjejjejje

Saludos

miércoles, 23 de diciembre de 2009

Feliz Navidad

Amigos, Colegas,

Pues mis mejores deseos para esta navidad y que la dicha, paz, armonía y sobre todo salud este con cada uno de ustedes y desde luego la familia.

Dios los bendiga por ser amigos.

Saludos

Sinceramente: William Morales

Actualización de FWH Generator 1.2

Amigos,

El colega-amigo Mario me ha enviado unos íconos y bitmaps.

Aquí el como se ve.

FWG Gen 1.2

Cordialmente.

William Morales

jueves, 17 de diciembre de 2009

Link de descarga de aportaciones a la fecha

17 diciembre del 2009

Amigos,

Aquí los link de descarga de las aportaciones realizadas.

http://www.box.net/shared/72pr84gaei - FWH Generator
http://www.box.net/shared/9v3f807myg - mysql 20091117
http://www.box.net/shared/3vxlsehavu - mysql 20090111
http://www.box.net/shared/bgj7gy9vqc - mysql 20091021
http://www.box.net/shared/5m041l8ge1 - tmysql 20091015
http://www.box.net/shared/4yqfn6zkfi - mysql 20091012
http://www.box.net/shared/h5mf0n1pdk - mysql
http://www.box.net/shared/5pdbep4qs0 - calcFWH
http://www.box.net/shared/quisfjs0dl - comunity
http://www.box.net/shared/pfcu59kg8s - twmail
http://www.box.net/shared/hh14qn1r4o - tfirebird


Aquí los link y espero puedan ser de ayuda.

saludos

sábado, 21 de noviembre de 2009

FWH Generator

Amigos,

Siempre he necesitado recompilar FWH con la versión del CVS de xHarbour y últimamente me ha dado muchos problemas la HARB2LIB del amigo Jorge Masón y pues teniendo la necesidad y comprendiendo como se hace he realizado el siguiente proceso de compilación inclusión en la LIB respectiva de FWH.

Sin tanto preambulo aquí coloco el LINK DE DESCARGA de la herramienta generada.

Falta colocarle la piel, pero estoy detallando la funcinalidad, después el tema de la piel.

Saludos y esperemos puedan usarla.

Cordialmente. William Morales

martes, 17 de noviembre de 2009

Modificación del metodo Seek

A petición del amigo Cruz Alfredo,

He modificado el método seek para que haga las busquedas de la manera comentada anteriormente y ahora con la siguiente modalidad.

oQry:seek( "'juan' == nombre AND 20091117 >= fecha" )

Si se fijan ahí no es necesario colocar la columna de busqueda, pues es una busqueda multicolumna.

Saludos

AQUI EL LINK DE DESCARGA

domingo, 1 de noviembre de 2009

Adiciones a TMySQL

Aquí reportándome amigos.

En esta ocasión he adicionado unas cuantas cosillas a la tmysql.

adduser( cHost, cUser, cPassword, cContenedor, lCreatedDB )
Este método adiciona un usuario directamente a mysql, si se especifica el
contenedor (cContenedor) el usuario solo actúa para la base de datos seleccionada y
si es pasado lCreatedDB la base de datos es creada automáticamente.

dropuser( cUser )
Elimina un usuario de mysql, revocando sus privilegios de igual manera.

renameuser( cUser, cNewName )
Cambia el nombre al usuario, manteniendo sus privilegios intactos.

seek( xData, cCol )
Busca la información (xData) en la tabla de la consulta activa, desde luego,
se debe de especificar la columna de busqueda (cCol). Cabe mencionar que es
altamente recomendable que la columna de busqueda (cCol), sea una columna
indexada.

Ejemplos:

oServer:adduser( "localhost", "tmysql", "morales", "test" )
En este ejemplo, se crea el usuario 'tmysql' con contraseña 'morales' y el
usuario solo tendrá acceso al contenedor 'test' que debe de estar creado.

oServer:adduser( "localhost", "tmysql2", "morales", "tmysql", .t. )
En este ejemplo, se crea el usuario 'tmysql2' con contraseña 'morales' y el
usuario solo tendrá acceso al contenedor 'tmysql' que será creado.

oServer:dropuser( "tmysql2" )
En este ejemplo eliminamos el usuario 'tmysql2'.

oServer:renameuser( "tmysql", "tmysql2009" )
En este ejemplo cambiamos de nombre a 'tmysql" por 'tmysql2009', así de simple.

oQuery:seek( "102030", "cliente" )
El ejemplo anterior nos muestra la manera de localizar la clave '102030' en la
columna 'cliente' de la tabla clientes.

oQry:seek( "FN10300", "productos" )
El ejemplo anterior nos muestra la busqueda del producto 'FN10300' en la
columna 'producto' de la tabla tabla productos.

oQry es la consulta ya generada, ejemplo:
oQry := oServer:Query( "SELECT * FROM clientes" ) o,
oQry := oServer:Query( "SELECT * FROM productos" )


Bueno, sin tanto preámbulo aquí el link de descarga de la LIB TMYSQL

miércoles, 21 de octubre de 2009

Incrementando velocidad en el pintado de xbrowse

Bueno,

pues eso, mis pruebas con TMySql me han llevado a la modificación de la XBrowse, hasta ahora he mejorado el pintado de las líneas.

AQUI LA MODIFICACION

Espero sea de utilidad

Saludos

Optimización de tmysql

Amigos,

He optimizado el uso del skip() y el getrow() de la tmysql.

Aqui la DESCARGA de la lib actualizada.

Saludos

martes, 20 de octubre de 2009

Estadísticas de aportes

Amigos,

Pos eso, comunicarles las estadísticas que tenemos hasta hoy 20/10/2009 a las 15:30 horas.

Estadística de BOX.NET

Que sabroso se siente, jjejjejjejje

saludos

domingo, 18 de octubre de 2009

mysql.lib recompilada

Amigos,

Resulta que la mysql.lib que subí anteriormente usaba el xHarbour, pero consumía recursos indiscriminadamente, asi que bajé de nuevo el xHarbour del CVS y resulta que ahora el consumo de recursos es "normal".

Aquí el link de DESCARGA espero sigan descargandola y testeando.

saludos

jueves, 15 de octubre de 2009

TMySQL optimizada para xbrowse

Amigos,

Aquí un build optimizado para su uso con xbrowse, funciona con los otros browse, pero en este caso especifico funciona 100% con xbrowse de FWH.

AQUI el link de descargar

Saludos

Seguimos avanzando...

martes, 13 de octubre de 2009

Fe de erratas a la entrada - Actualización TMySql

A petición del amigo Cruz Alfredo hago esta nota.

La modificación o actualización a la TMySql realizada el 20091012 es la siguiente:

Antes se usaba de la siguiente manera el acceso a los datos de la consulta generada.

MSGINFO( oQry:fieldget( "codigo" ), "INCOS" )

oQry:fieldput( "codigo", "wmormar" )
oQry:append() o oQry:update()

Ahora puedes usar lo siguiente:

MSGINFO( oQry:codigo, "INCOS" )

oQry:codigo := "wmormar"
oQry:save()

oQry:save() se utiliza indistintamente si es para un registro nuevo o una modificación.

Bueno, a grandes rasgos así se usa la nueva modificación.

Nota. Cabe aclarar que si tenía esa particularidad pero no era funcional, así que se codificó completamente.

Saludos

Como generar LIBMYSQL.LIB

Pos eso.

Como generar libmysql.lib

Primero que nada debemos de tener instalado el SERVER mysql.

Supongamos que instalamos nuestro server mysql en:

C:\Archivos de programa

Y que dejamos la carpeta default de mysql al instalar, entonces sería algo como sigue.

C:\Archivos de programa\MySQL\MySQL Server 5.0\bin

Bueno, ya identificando la carpeta bin pasamos a lo siguiente.

Pensemos que tenemos instalado borland en la siguiente carpeta:

C:\BCC55\Bin

Entonces, haríamos lo siguiente para generar la LIB libmysql.lib

C:\BCC55\Bin\implib libmysql.lib C:\Archivos de programa\MySQL\MySQL Server 5.0\bin\libmysql.dll

Así de simple amigos.

Saludos

lunes, 12 de octubre de 2009

TMySql actualizada

Bueno,

El título no se me dió mucho, pero espero esta modificación realizada a la tmysql les sirva de mucho.

Ahora podrá usar TMySql de la siguiente manera.

Aquí el ejemplo:

#include 'fivewin.ch'

*-------------------*
STATIC oServer
STATIC oQry
STATIC oBrw
STATIC oWnd
STATIC oMenu

FUNCTION main()
LOCAL cHost := "localhost"
LOCAL cUser := "root"
LOCAL cPsw := "rooting"
LOCAL nPort := 3306
LOCAL cDb := "test"
LOCAL n := 1
LOCAL cQuery := ""

MENU oMenu 2007
MENUITEM "Pruebas"
MENU
MENUITEM "AddRecord 1" ACTION addrecord1() MESSAGE "Adiciona registros a la tabla 1"
MENUITEM "AddRecord 2" ACTION addrecord2() MESSAGE "Adiciona registros a la tabla 2"
MENUITEM "UpdateRecord" ACTION updaterecord2() MESSAGE "Modifica registros a la tabla 2"
ENDMENU
ENDMENU

oServer:= TMySQLServer():New( cHost, cUser, cPsw, nPort )
if oServer:NetErr()
MsgAlert (oServer:Error(),"MySQL Error")
quit
endif

IF oServer:lError
? "No connect"
RETURN NIL
ENDIF

oserver:Selectdb(cDb)

IF oServer:lError
? "No used database"
RETURN NIL
ENDIF

IF !oServer:tableexist( "prueba" )
cQuery := "CREATE TABLE prueba( "
cQuery += "clave varchar(3) NOT NULL default '0',"
cQuery += "nombre varchar(30) default 'x',"
cQuery += "fecha date default '20091012',"
cQuery += "saldo decimal(9,2) default 0.00,"
cQuery += "PRIMARY KEY (clave) "
cQuery += ") ENGINE=InnoDB DEFAULT CHARSET=latin1"
oServer:execute( cQuery )
ENDIF

oServer:execute( "TRUNCATE TABLE prueba" )
oQry := oServer:Query( "SELECT * FROM prueba" )

oQry:gotop()
wmbrowse()

return nil

/************************************************************/
STATIC FUNCTION wmbrowse()
DEFINE WINDOW oWnd TITLE "Mi browse" FROM 10, 10 TO 30, 60 MENU oMenu

wmbrw()
oWnd:oClient := oBrw

ACTIVATE WINDOW oWnd

RETURN NIL

STATIC FUNCTION wmbrw()
LOCAL oCol

oBrw := TXBrowse():new( oWnd )
SetxBrowse( oBrw, oQry )

oCol := oBrw:AddCol()
oCol:cHeader := "Clave"
oCol:bEditValue := {|| oQry:clave}
oCol:cEditPicture := "@x"
oCol:cDataType := "C"

oCol := oBrw:AddCol()
oCol:cHeader := "Nombre"
oCol:bEditValue := {|| oQry:nombre}
oCol:cEditPicture := "@x"
oCol:cDataType := "C"

oCol := oBrw:AddCol()
oCol:cHeader := "Fecha"
oCol:bEditValue := {|| oQry:fecha}
oCol:cEditPicture := "@d"
oCol:cDataType := "D"

oCol := oBrw:AddCol()
oCol:cHeader := "Saldo"
oCol:bEditValue := {|| oQry:saldo}
oCol:cEditPicture := "999,999,999.99"
oCol:cDataType := "N"

oBrw:createfromcode()

RETURN NIL

STATIC FUNCTION addrecord1()
LOCAL n, nClv

FOR n := 1 TO 15
nClv := alltrim(str( HB_RandomInt( 999 ) ))
oQry:fieldput( "clave" , nClv )
oQry:fieldput( "nombre", "prueba1 - " + nClv )
oQry:fieldput( "fecha" , date() )
oQry:fieldput( "saldo" , HB_RandomInt( 99999999.99 ) )
oQry:append()
NEXT

oBrw:refresh()

RETURN NIL

STATIC FUNCTION addrecord2()
LOCAL n, nClv

FOR n := 1 TO 15
nClv := alltrim(str( HB_RandomInt( 999 ) ))
oQry:blank()
oQry:clave := nClv
oQry:nombre := "prueba2 - " + nClv
oQry:fecha := date()
oQry:saldo := HB_RandomInt( 99999999.99 )
oQry:save()
NEXT

oBrw:refresh()

RETURN NIL

STATIC FUNCTION updaterecord2()
LOCAL n, nClv

oQry:gotop()
WHILE !oQry:eof()
nClv := alltrim(str( HB_RandomInt( 999 ) ))
oQry:nombre := "CAMBIADO - " + nClv
oQry:fecha := date()
oQry:saldo := HB_RandomInt( 99999999.99 )
oQry:save()
oQry:skip()
ENDDO

oBrw:refresh()

RETURN NIL

Espero sea de ayuda y cualquier duda, aquí en el blog hay un chat que leo periódicamente.

Saludos

Aqui el link de bajada de la LIB y un ejemplo.

TMYSQL comunity

lunes, 31 de agosto de 2009

TMySQL contrib

Amigos,

Muchos nos preguntamos de donde bajar los fuentes de esta fabulosa contribución de xHarbour.

Aquí el link de todas las contribuciones de xHarbour.

XHARBOUR CONTRIB

Saludos

jueves, 25 de junio de 2009

De vuelta VeRCE

Amigos,

Pues con la novedad que hemos decidido darle nueva sangre al VeRCE, recodificando todo para darle más velocidad a la hora de compilar.

Espero comentarios para incluir en VeRCE, he enterado a Juán Carlos Salínas Ojeda de este proyecto sobre el VeRCE para que esté al pendiente y pueda ayudarnos en la nueva era.

Se espera la participación de los colegas que usan VeRCE para hacer una herramienta más estable y mas amigable.

Saludos

Transacciones en MySql

Amigos,

A petición de un gran amigo de la comunidad César Cortez.

Como hacer transacciones con TMySql.

oMysql:begintransaction()
lError := .f.
oCliente:fieldput( "saldo", nSaldo )
lError := oCliente:update()
IF !lError
oVenta:fieldput( "venta", nVenta )
oVenta:fieldput( "cliente", cCliente )
lError := oVenta:append()
ENDIF

IF !lError
oMysql:Commit()
ELSE
oMysql:rollback()
ENDIF

Es un ejemplo sencillo, pero es para que tengan un idea de como aplicarlo.

Saludos

domingo, 7 de junio de 2009

Función para browsear TYMSQL

Aquí la función que se ha usado y se seguirá usando por lo menos eso espero.

FUNCTION MySetBrowse( oBrw, oDataSource )
local lRet := .t.
local bGoTop, bGoBottom, bSkipper
local cClsName

bGoTop := { || oDataSource:GoTop() }
bGoBottom := { || oDataSource:GoBottom() }
bSkipper := { | n | oDataSource:Skipper( n ) }

cClsName := upper( oBrw:ClassName() )

oBrw:bGoTop := bGoTop
oBrw:bGoBottom := bGoBottom

IF cClsName == "TWBROWSE"
oBrw:bSkip := { | n | oDataSource:Skip( n ) }
ELSE
oBrw:bSkip := bSkipper
ENDIF

if cClsName == "TXBROWSE"
oBrw:bBof := { || oDataSource:Bof() }
oBrw:bEof := { || oDataSource:Eof() }
oBrw:bBookMark :={ | n | if( n == nil, oDataSource:RecNo(), oDataSource:GoTo( n ) ) }
oBrw:bKeyNo := { || oDataSource:RecNo() }
oBrw:bKeyCount := { || oDataSource:RecCount() }
ELSE
oBrw:bLogicLen := { || oDataSource:RecCount() }
ENDIF
if oBrw:oVScroll() != nil
oBrw:oVscroll():SetRange( 1, oDataSource:RecCount() )
ENDIF
oBrw:Refresh()

return( lRet )

//**

Bueno, ahí está

Saludos

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)

Script de compilación de la LIB TMySQL

Bueno amigos,

Retomando la escritura.

Pues resulta que ayudando al amigo Dutch, hemos descubierto que las lib de TMySQL deben de estar en la posición siguiente para poder utilizar sin errores o GPF la lib mencionada.

SCRIPT Erróneo
ECHO %CC_LIB%\c0w32.obj + > b32.bc
ECHO %ARCHIVO%.obj, + >> b32.bc
ECHO xh%ARCHIVO%.exe, + >> b32.bc
ECHO %ARCHIVO%.map, + >> b32.bc
ECHO %FWH_LIB%\fivehc.lib + >> b32.bc
ECHO %FWH_LIB%\fivehx.lib + >> b32.bc
<< aquí el error >>
ECHO Y:\TSuperLib\TMySql\LIB\mysql.lib + >> b32.bc
ECHO Y:\TSuperLib\TMySql\LIB\libmysql.lib + >> b32.bc
<< termina error >>
ECHO %CC_LIB%\cw32.lib + >> b32.bc
ECHO %CC_LIB%\Import32.lib + >> b32.bc
ECHO %CC_LIB%\PSDK\msimg32.lib + >> b32.bc
ECHO %XC_LIB%\pcrepos.lib + >> b32.bc
rem La LIB FMSTAT.LIB es para sacar la estadistica de memoria
rem quitar si no se quiere
ECHO %XC_LIB%\ct.lib + >> b32.bc
ECHO %XC_LIB%\rtl.lib + >> b32.bc
ECHO %XC_LIB%\vm.lib + >> b32.bc
ECHO %XC_LIB%\gtgui.lib + >> b32.bc
ECHO %XC_LIB%\lang.lib + >> b32.bc
ECHO %XC_LIB%\macro.lib + >> b32.bc
ECHO %XC_LIB%\debug.lib + >> b32.bc
ECHO %XC_LIB%\common.lib + >> b32.bc
ECHO %XC_LIB%\pp.lib + >> b32.bc
ECHO %XC_LIB%\rdd.lib + >> b32.bc
ECHO %XC_LIB%\tip.lib + >> b32.bc
rem Poner el controlador o controladores que se vayan a usar
ECHO %XC_LIB%\dbfntx.lib + >> b32.bc
ECHO %XC_LIB%\dbfcdx.lib + >> b32.bc
ECHO %XC_LIB%\hsx.lib + >> b32.bc
ECHO %XC_LIB%\hbsix.lib + >> b32.bc
ECHO %XC_LIB%\dbffpt.lib >> b32.bc

SCRIPT Correcto
ECHO %CC_LIB%\c0w32.obj + > b32.bc
ECHO %ARCHIVO%.obj, + >> b32.bc
ECHO xh%ARCHIVO%.exe, + >> b32.bc
ECHO %ARCHIVO%.map, + >> b32.bc
<< aquí la corrección o lo correcto >>
ECHO Y:\TSuperLib\TMySql\LIB\mysql.lib + >> b32.bc
ECHO Y:\TSuperLib\TMySql\LIB\libmysql.lib + >> b32.bc
<< termina error >>
ECHO %FWH_LIB%\fivehc.lib + >> b32.bc
ECHO %FWH_LIB%\fivehx.lib + >> b32.bc
ECHO %CC_LIB%\cw32.lib + >> b32.bc
ECHO %CC_LIB%\Import32.lib + >> b32.bc
ECHO %CC_LIB%\PSDK\msimg32.lib + >> b32.bc
ECHO %XC_LIB%\pcrepos.lib + >> b32.bc
rem La LIB FMSTAT.LIB es para sacar la estadistica de memoria
rem quitar si no se quiere
ECHO %XC_LIB%\ct.lib + >> b32.bc
ECHO %XC_LIB%\rtl.lib + >> b32.bc
ECHO %XC_LIB%\vm.lib + >> b32.bc
ECHO %XC_LIB%\gtgui.lib + >> b32.bc
ECHO %XC_LIB%\lang.lib + >> b32.bc
ECHO %XC_LIB%\macro.lib + >> b32.bc
ECHO %XC_LIB%\debug.lib + >> b32.bc
ECHO %XC_LIB%\common.lib + >> b32.bc
ECHO %XC_LIB%\pp.lib + >> b32.bc
ECHO %XC_LIB%\rdd.lib + >> b32.bc
ECHO %XC_LIB%\tip.lib + >> b32.bc
rem Poner el controlador o controladores que se vayan a usar
ECHO %XC_LIB%\dbfntx.lib + >> b32.bc
ECHO %XC_LIB%\dbfcdx.lib + >> b32.bc
ECHO %XC_LIB%\hsx.lib + >> b32.bc
ECHO %XC_LIB%\hbsix.lib + >> b32.bc
ECHO %XC_LIB%\dbffpt.lib >> b32.bc

Entonces la nota sería, las lib de tmysql deben de ir exactamente al inicio donde se incluyen las LIB forzosamente. Si se hiciera de la manera incorrecta pues saldrían errores aleatorios y GPF.

Saludos

martes, 7 de abril de 2009

SQL como SQL

Hola amigos,Veamos, empezaremos por el principio:
Luego de batallar con las DBFs desde 1986 (full Clipper), en diciembre del 2006, por una cuestion de orgullo, decidi entrar de lleno al manejo de MySQL, vi un par de opciones, opte por una libreria que no usaba ODBC, la verdad es que tuve que batallar casi solo con el tema
del manejo de las tablas,,,,
20 años pensando en DBF, conociendolas al reves y al derecho, los tiempos cambian y las tecnologias tambien,,,
En el foro se dio mucha importancia en una momento a SQLWIN, pero el ultimo post es de feb2009, ADO la usa algunos seguidores, pero,,,, SQL se debe usar como SQL,,,
Utilizar MySQL como si tubieran tablas DBF, me parece usar un formula 1 con llantas de bicicleta, no desmerezco las DBFs, me dieron mucho, pero la potencia de SQL es otra cosa,,,
TMySQL me parece una muy buena libreria (fuentes abiertas) para acceder a MySQL, empeze con unas pruebas basicas, "INSERT, UPDATE, DELETE,SELECT,CREATE,DROP,ALTER" ups,,, ya estaba con todo el MySQL encima,,,
Pues es eso mismo, el poder de cada sentencia de MySQL o SQL en general es fabuloso, ademas la curva de aprendizaje en corta, basicamente con lo que tiene TMySQL se pueden hacer aplicaciones comerciales estupendas,,, ya mismo estoy desarrollando una app para Hoteles, y de momento todo funciona ok, incluso ya se resolvio el manejo de los "store procedure" (gracias William) entre otras cosillas, pero basicamente TMySQL debe ser potenciada, afinada y formar parte integral de la comunidad Fivewin.
Amigos lectores, animense a entra al mundo SQL, y TMySQL es la mejor opcion para MySQL, recuerden, las fuentes estan disponibles, y claro, estoy a vuestra disposicion para cualquier consulta a nivel de MySQL,,, si no tengo la respuesta, tendre el numero de telefono del que la sabe...
Salu2
Willi Quintana

martes, 24 de marzo de 2009

TMySql y la creación de Contenedores y Tablas

Quiubo espero estemos bien,

He notado que muchos compañeros que se han animado a probar esta fabulosa clase han tenido el problema o por lo menos la duda de como crear tablas y base de datos.

Muchos prefieren el modo xBase otros prefieren la manera SQL directa.

Veremos la manera xBase primero, Veremos como iniciar la conexión de igual manera..

#include "fivewin.ch"

STATIC oCon

FUNCTION main()
MSGRun( "Conectando a server-sql, espere...", "INCOS - wmormar", ;
{|| oCon := TMYsqlServer():new( "localhost", "root", "123", 3306)} )
IF oCon:lError
? "Se ha generado un error, no hay conexión, verifique..."
RETURN NIL
ENDIF

IF oCon:DBExist( "tutor" )
MSGRun( "Creando contenedor, espere...",, {|| oCon:DBCreate( "tutor")} )
ENDIF

oCon:SelectDB( "tutor" )
IF oCon:lError
? "No se pudo seleccionar el contenedor..."
RETURN NIL
ENDIF

// Aquí llamaremos a la creación de la tabla tipo xbase
createxbase()

// Aquí llamaremos a la creación de la tabla SQL directa
createsqldirecta()

oCon:end()

RETURN NIL

STATIC FUNCION createxbase()
LOCAL aTabla := {}

aadd( aTabla, { "clave" , "C", 10, 0} )
aadd( aTabla, { "nombre" , "C", 40, 0} )
aadd( aTabla, { "otro" , "N", 5, 0} )
aadd( aTabla, { "otromas" , "N", 6, 2} )

// Sintaxis de :createtable()
// CreateTable( cTable, aStruct, cPrimaryKey, cUniqueKey, cAuto)
IF !oCon:createtable( "modoxbase", aTabla, "clave" )
? "No pudo crear la tabla, verifique..."
ENDIF

RETURN NIL

STATIC FUNCION createsqldirecta()
LOCAL cQuery

cQuery := [CREATE IF EXISTS modosql( ]
cQuery += [clave varchar(10) DEFAULT "wmormar", ]
cQuery += [nombre varchar(40) DEFAULT "william morales", ]
cQuery += [otro int(5) DEFAULT 0, ]
cQuery += [otromas decimal(6,2) DEFAULT 0.00, ]
cQuery += [PRIMARY KEY ("clave") ]
oCon:Query( cQuery )

IF oCon:lError
? "No se pudo crear la tabla, verifique..."
ENDIF

RETURN NIL

Bueno, pasamos a explicarlo.

En la primera función (la principal) hacemos la respectiva conexión al serveidor mysql, el cual está alojado en la misma maquina donde estamos codificando (localhost).

Ahí lo que hacemos, es tener una variable Estática oCon, la cual será visible en todo el PRG, está contendrá la conexión al servidor.

Con la data lError (oCon:lError), verificamos que se esté aceptando nuestras operaciones en el servidor, es decir, que lo que estemos haciendo sean correctas.

También verificamos que el Contenedor (base de datos) exista, eso lo hacemos con: oCon:DBExist( "tutor" )

Si el contenedor no existe, pues lo creamos, esto lo hacemos con: oCon:DBCreate( "tutor" )

Después lo colocamos en uso o activo. Debemos recordar siempre que es necesario, de hecho es una regla, que para hacer cualquier tipo de consulta, debemos de colocar en uso o activo un Contenedor. Es una regla de oro.

Ya teniendo todo esto colocado, podremos hacer lo que queramos en el servidor. Por ejemplo: INSERT, UPDATE, DELETE, ETC.

Recordemos cerrar la conexión del server antes de cerrar nuestra aplicación: oCon:end()

Bueno, pasamos a la función que crea la tabla en "modoxbase". Creamos una variable tipo Array de igual manera que lo hacemos para crear una DBF. La llenamos con la estructura a crear.

Ya llenada la estructura usamos el método: CreateTable( cTable, aStruct, cPrimaryKey, cUniqueKey, cAuto) de la siguiente manera:
oCon:createtable( "modoxbase", aTabla, "clave" )

En este caso la tabla se llamará "modoxbase", conteniendo la estructura colocada en el Array e indicando que tendrá una Primary Key "clave". Si se dan cuenta es el mismo nombre que nuestra primera columna (antes le llamamos campo). Después vodificamos para que nos indique si se creó o no.

Bueno, en nuestra ultima funcion de esta entrada, estamos viendo como podemos de igual manera crear una tabla, desde sentencias SQL directas. Y vamos con lo que sigue.

En una variable local hemos incluido el código totalmente SQL, éste indica como se llamará nuestra tabla, y la misma sentencia tambien verifica si la tabla existe o no, asi que el SERVER mysql se encarga de verificar la existencia de la tabla y actua según la condición expresada, así mismo también verificamos que la sentencia se haya ejecutada con un condicional.

Espero sea de ayuda esta breve explicación, nos leemos en la próxima.

Saludos

sábado, 14 de marzo de 2009

Y proseguimos...

Como está dividida la tmysql.

Bueno, está dividida en 4 clases.
TMySqlServer()
Está es la clase principal y la que se encarga de hacer la conexión y
el respectivo query (consulta)

TMySqlQuery()
Aquí se procesa la consulta y se asignan los registros para manejo tipo xBase
Está clase es para su uso cuando mandamos un SELECT con una varias tabla.
Lo que llamamos un SET RELATION en SQL se llama INNER JOIN, INNER LEFT

TMySqlTable()
Hace exactamente lo mismo que el TMySqlQuery(), pero con la particularidad de
que solo maneja una tabla.

TMySqlRow()
Aquí hace el manejo de los registros (que en SQL están definidas como FILAS)
Graba en Hashes o Array la fila actual.

Hasta aquí debemos de tener un poco claro que hace cada clase.

Les comento que hago mi mejor esfuerzo para poder explicarlo, cuando charlo con algún amigo, comentamos sin problemas, pero cuando tengo que teclearlo, siempre me trabo.

Saludos

Continuamos...

Hasta ahora, debemos de crear nuestra LIB sin problema alguno.

Aunque las dudas que esperaba no se han hecho visibles, asumo que todo va en orden hasta ahora.

Ha sido poco, pero creo que sustancioso.

Uno de los problemas que en lo personal me encontré al iniciar fue y más que problema fue el hecho de pensar si mis aplicaciones terminadas iban a funcionar o no. Les comento que "casi" todas las herramientas que están circulando funcionan, unas mas otras menos, pero todas funcionan, o por lo menos la mayoría, decir todas representa una gran responsabilidad. Pero, les comento que hagan las pruebas necesarias con todas las herramientas que puedan, desde luego si todavía no han decidido cual usar. Aunque a lo largo del tiempo que he venido siguiendo varias herramientas me he convencido totalmente que no hay mejor herramienta que la que le podamos usar el provecho máximo, eso si, sin minimizar o criticar ninguna.

En el próximo artículo-comentario, veremos una descripción de las datas y métodos mas importantes de la TMySql.

Saludos

lunes, 23 de febrero de 2009

Comentarios ADO-TMYSQL

Conversación entre Armando y un servidor.

Armando dice:
Epa, paisano
Estas despierto ?
!! [INCOS] william morales dice:
quiubo mi estimado
Armando dice:
Saludando a las estrellas !
!! [INCOS] william morales dice:
gracias amigo
igualmente
wmormar.blogspot.com
ahi mi blog y estoy escribiendo sobre la tmysql
haz leido algo?
Armando dice:
Claro, no me lo pierdo
Quiero tener otra altenativa
!! [INCOS] william morales dice:
hoy me toco escribir
Armando dice:
Sip, ya lo vi
Perooooooo
Resulta que en la carpeta donde tengo instalado el servidor no hay carpeta de INCLUDES
O sera que no la veo ?
!! [INCOS] william morales dice:
eso depende de como hayas instalado el server
Armando dice:
Ok ok
Puede ser ahi el problema
!! [INCOS] william morales dice:
preo puedo colgar los includes
Armando dice:
Pero deben coincidir con la versión que tengo instalada de MySql, no ?
!! [INCOS] william morales dice:
no necesariamente
pero de preferencia, desde luego
Armando dice:
Ok
Si no recuerdo mal, instale MySql como SERVER y creo que debería ser como DEVELOPER
Sera cierto ?
!! [INCOS] william morales dice:
asi es
Armando dice:
Bueno, al menos ya se donde esta mi falla
ahora, sería mucha molestia si pasas los INLCUDE ?
!! [INCOS] william morales dice:
dja colgarlo al blog
para que los demás lo tengan
Armando dice:
Ok, gracias
!! [INCOS] william morales dice:
que te parece?
Armando dice:
Como te decia, a mi me parece excelente tener otra alternativa
No me cierro a que todo sea ADO
!! [INCOS] william morales dice:
yo he usado tmysql, ADO no le tomo cariño aun
pero no lo descarto
Armando dice:
Tengo otra pregun tonta
Usando la TMySql al hacer una SELECT que se crea ?
!! [INCOS] william morales dice:
algo como un recordset
Armando dice:
Me explico, con ADO se crea un record set (Tabla)
Pero si entiendo bien es un ARRAY, cierto ?
!! [INCOS] william morales dice:
solo el registro
lo demás no
es el recordset
Armando dice:
No me queda claro, disculpa master
!! [INCOS] william morales dice:
bueno, hay dois formas
puedes usar la forma de arreglo
y la forma del recordset
Armando dice:
Ok ok
Fijate que tambien en ADO tienes ambas posibilidades
Hasta ahi vamos bien
Volviendo al tema, por ejemplo, yo ya estoy acostumbrado al record set
usando la TMySql lo puedo seguir trabajando igual ?
!! [INCOS] william morales dice:
cambia un poco
como cargas los datos desde ADO?
Armando dice:
Como cargo los datos al Browse ?
O te refieres al SELECT ?
!! [INCOS] william morales dice:
por ejemplo yo hago lo sigguiente
oQry := oCon:Query( "SELEC * FROM CLIENTES" )
cClave := oQry:fieldget( "clave" )
cNombre := oQry:fieldget( "nombre" )
como lo haces tu en ADFO?
Armando dice:
Ahhh
Es parecido
oRsFol: Source := "SELECT " +;
"* " +;
"FROM " +;
"folfac"

Luego
oRsFol: Open()

Con esto ya tengo creado el Record set
!! [INCOS] william morales dice:
oQry := oCon:Query( "SELEC * FROM CLIENTES" )
aqui ya tengo creado el recordset
Armando dice:
Y luego para referirme a un campo en particular lo hago así
oRsHdr:Fields("CLI_NOM"):Value)
Y como defines una columna en un TXbrowse ?
!! [INCOS] william morales dice:
acá
cClave := oQry:fieldget( "clave" =
como ADO
asignas el nombre del campo
Armando dice:
Pues es muy parecido
Desde luego cambia pero no es cosa del otro mundo
!! [INCOS] william morales dice:
claro, claro
Armando dice:
Otras dudas, puedo ?
!! [INCOS] william morales dice:
claro
Armando dice:
Descargue la LIB de las contribuciones
Revisando un poco veo que esta muy abandonada
Creo que la ultima revisión es del 2006
No hay problema con eso ?
Sera que la abandonaron o tal vez ya esta en su punto ?
!! [INCOS] william morales dice:
nones
ha sido modificada por Walter
hay una version por ahi
Armando dice:
Okas
Bueno, mira
Yo te voy a seguir
Te repito siempre es bueno tener otra alternativa, no me cierro
!! [INCOS] william morales dice:
perfecto
autrizas colocar esta conversación en el blog?
Armando dice:
No te hago más preguntas para no adelantarnos al blog
por supuesto
!! [INCOS] william morales dice:
okas, okas
la proxima semana, haremos un miniproyecto
espero me de tiempo
porque esta semana, andaré un poco ocupado
Armando dice:
Ok, no hay urgencia, al menos por mi, jeje
!! [INCOS] william morales dice:
okas, okas
veré la audicnecia amigo
aunque dejame decirte que tengo casi 250 visits desde el inicio del blog
y dos seguidores logueados
Armando dice:
Mira, ya por ahi alguien lo dijo
La mayoria solo lee
Pocos son los que tienen iniciativa para interactuar
!! [INCOS] william morales dice:
asi es, lo tengo claro
solo que espero se anime mas gente
Armando dice:
Así que no te desanimes si no ves mucha respuesta
!! [INCOS] william morales dice:
faltaba info y me decidi a aportar una poca
Armando dice:
Cuando menos yo te voy a seguir
Y estaré molestando con pregun-tontas, jejeje
!! [INCOS] william morales dice:
eso me reconforta y anima amigo
aun asi fuese uno, espero seguir hasta donde la fuerza me acompañe
jjejjejjejjejje
Armando dice:
ok, éxito
!! [INCOS] william morales dice:
saludfos amigo, por aqui sigo aun
Armando dice:
=mente, bytes


Conversación autorizada por Armando.

Saludos
William Morales

Creación LIB TMySQL

Bueno, seguimos con el proceso.

Requerimientos:
Descargar MYSQL SERVER
Descargar constribución TMYSQL

Bueno, también el xHarbour y el Borland.

Ya descargadas las herramientas, pues pasamos al mero, mero, meoyo del asunto.

Ya instalado el server mysql, localizar la carpeta de los include's, donde se encuentran los headers necesarios para compilar la tmysql.

Supongamos que tenemos instalado las herramientas en:

Servidor mysql:
y:\mysql
xHarbour:
y:\xharbour
Borland C
y:\bcc55

ya localizada la carpeta, procederemos a modificar el bat de compilación. Antes listo el contenido de la carpeta mysql de las contribuciones.

Descargar imagen

El contenido del archivo BAT es el siguiente:

@echo off
rem
rem $Id: make_b32.bat,v 1.2 2006/09/30 17:47:20 areainformatica Exp $
rem

if "%1" == "clean" goto CLEAN
if "%1" == "CLEAN" goto CLEAN

:BUILD

make -fmakefile.bc %1 %2 %3 > make_b32.log
if errorlevel 1 goto BUILD_ERR

:BUILD_OK

copy ..\..\lib\b32\mysql.lib ..\..\lib\*.* > nul
goto EXIT

:BUILD_ERR

notepad make_b32.log
goto EXIT

:CLEAN

if exist ..\..\lib\b32\mysql.lib del ..\..\lib\b32\mysql.lib
if exist ..\..\lib\b32\mysql.bak del ..\..\lib\b32\mysql.bak
if exist ..\..\obj\b32\mysql.obj del ..\..\obj\b32\mysql.obj
if exist ..\..\obj\b32\tsqlbrw.c del ..\..\obj\b32\tsqlbrw.c
if exist ..\..\obj\b32\tmysql.c del ..\..\obj\b32\tmysql.c
if exist ..\..\obj\b32\tsqlbrw.obj del ..\..\obj\b32\tsqlbrw.obj
if exist ..\..\obj\b32\tmysql.obj del ..\..\obj\b32\tmysql.obj
if exist ..\..\obj\b32\mysqlrdd.obj del ..\..\obj\b32\mysqlrdd.obj
if exist ..\..\obj\b32\mysqlrdd.c del ..\..\obj\b32\mysqlrdd.c
goto EXIT

:EXIT


Y debe de quedar:

@echo off
rem
rem $Id: make_b32.bat,v 1.2 2006/09/30 17:47:20 areainformatica Exp $
rem

if "%1" == "clean" goto CLEAN
if "%1" == "CLEAN" goto CLEAN

:BUILD

y:\bcc55\bin\make -fmakefile.bc %1 %2 %3 > make_b32.log
if errorlevel 1 goto BUILD_ERR

:BUILD_OK

copy y:\xharbour\lib\mysql.lib y:\xharbour\lib > nul
goto EXIT

:BUILD_ERR

notepad make_b32.log
goto EXIT

:EXIT


El contenido del archivo makefile.bc

#
# $Id: makefile.bc,v 1.2 2006/09/30 17:47:20 areainformatica Exp $
#

# makefile for Borland C/C++ 32 bits
# Building of mysql.lib - Harbour API to mySQL

INCLUDE_DIR = ..\..\include

BIN_DIR = ..\..\bin\b32
OBJ_DIR = ..\..\obj\b32
LIB_DIR = ..\..\lib\b32

$(LIB_DIR)\mysql.lib : \
$(OBJ_DIR)\mysqlrdd.obj \
$(OBJ_DIR)\tmysql.obj \
$(OBJ_DIR)\tsqlbrw.obj \
$(OBJ_DIR)\mysql.obj

$(OBJ_DIR)\mysqlrdd.c : mysqlrdd.prg
$(OBJ_DIR)\mysqlrdd.obj : $(OBJ_DIR)\mysqlrdd.c
$(OBJ_DIR)\tmysql.c : tmysql.prg
$(OBJ_DIR)\tmysql.obj : $(OBJ_DIR)\tmysql.c
$(OBJ_DIR)\tsqlbrw.c : tsqlbrw.prg
$(OBJ_DIR)\tsqlbrw.obj : $(OBJ_DIR)\tsqlbrw.c
$(OBJ_DIR)\mysql.obj : mysql.c

.c.obj:
bcc32 $(CLIBFLAGS) -c -O2 -I$(INCLUDE_DIR) -DHB_OS_WIN_32_USED -o$@ $<
tlib $(LIB_DIR)\mysql.lib -+$@,,

.prg.c:
$(BIN_DIR)\harbour.exe $< -q0 -w -es2 -gc0 -n -i$(INCLUDE_DIR) -o$@

Y debe de quedar de la siguiente manera:

#
# $Id: makefile.bc,v 1.2 2006/09/30 17:47:20 areainformatica Exp $
#

# makefile for Borland C/C++ 32 bits
# Building of mysql.lib - Harbour API to mySQL

INCLUDE_DIR = y:\xharbour\include;y:\mysql\include

BIN_DIR = y:\xharbour\bin
OBJ_DIR = .\obj
LIB_DIR = y:\xharbour\lib


$(LIB_DIR)\mysql.lib : \
$(OBJ_DIR)\mysqlrdd.obj \
$(OBJ_DIR)\tmysql.obj \
$(OBJ_DIR)\tsqlbrw.obj \
$(OBJ_DIR)\mysql.obj

$(OBJ_DIR)\mysqlrdd.c : mysqlrdd.prg
$(OBJ_DIR)\mysqlrdd.obj : $(OBJ_DIR)\mysqlrdd.c
$(OBJ_DIR)\tmysql.c : tmysql.prg
$(OBJ_DIR)\tmysql.obj : $(OBJ_DIR)\tmysql.c
$(OBJ_DIR)\tsqlbrw.c : tsqlbrw.prg
$(OBJ_DIR)\tsqlbrw.obj : $(OBJ_DIR)\tsqlbrw.c
$(OBJ_DIR)\mysql.obj : mysql.c

.c.obj:
y:\bcc55\bin\bcc32 $(CLIBFLAGS) -c -O2 -I$(INCLUDE_DIR) -DHB_OS_WIN_32_USED -o$@ $<
y:\bcc55\bin\tlib $(LIB_DIR)\mysql.lib -+$@,,

.prg.c:
$(BIN_DIR)\harbour.exe $< -q0 -w -es2 -gc0 -n -i$(INCLUDE_DIR) -o$@


Después de esas modificaciones, debemos de darle dos click al BAT y listo, debe de crear la lib mysql.lib en la carpeta LIB donde instalamos xHarbour.

Hasta ahí podremos decir que tenemos creada la librería.

Proseguimos....

Para utilizar la LIB primero que nada debemos de hacer una importación de la lib libmysql.dll lo cual se hace con lo siguiente:

y:\bcc55\bin\implib libmysql.lib y:\mysql\bin\libmysql.dll

la libmysql.dll hay que localizar y ver que la ruta que he colocado sea la correcta según la instalación que hayan hecho.

la librería resultante, tendrá que adicionarse como librerías de tercero al proyecto que estén haciendo.

Eso quiere decir que son dos LIB que estaríamos adicionando a nuestro proyecto.
1.- mysql.lib
2.- libmysql.lib

y el archivo libmysql.dll, lo debemos de copiar a la carpeta donde tengamos nuestro exe ya generado, esto sería para que no tengamos un error en la ejecución, pues mandaría el error de DLL no existe.

Espero que con esta explicación puedan crear la LIB y hacer sus respectivas pruebas.

Como siempre, espero sus comentarios y/o dudas

Saludos
William Morales

sábado, 21 de febrero de 2009

Los pongo al tanto...

Amigos,

Les informo que estaré revisando sus comentarios diariamente en el transcurso de la noche (entre las 20 y 22 horas, méxico)y contestando, y los lunes estaré escribiendo más sobre el tema tmysql.

Cualquier duda con gusto estaré revisando y contestando.

Saludos
William Morales

jueves, 19 de febrero de 2009

Primeros ejemplos

Bueno, AAAArrrrancamos de lleno.

Podemos usar cualquier GUI compilada con xHarbour o xHarbour puro y duro:

HWGUI
OOHG
MINIGUI
FWH
Xailer


Ejemplo de conexión:

FUNCTION main()
WITH OBJECT TMySQLServer()
:new( "localhost", "usuario", "password", 3306 )
IF :lError
? "Error de conexión, verifique..."
ELSE
? "Conectado..."
ENDIF

:end()
ENDWITH

RETURN NIL


Ejemplo de conexión, creación y uso de una base de datos:

FUNCTION main()
WITH OBJECT TMySQLServer()
:new( "localhost", "usuario", "password", 3306 )
IF :lError
? "Error de conexión, verifique..."
ELSE
? "Conectado..."
IF !:DBExist( "tutores" )
:DBCreate( "tutores" )
ENDIF
IF :lError
? "La base de datos no se creó, verifique..."
ELSE
:SelectDB( "tutores" )
ENDIF
ENDIF

:end()
ENDWITH

RETURN NIL


Bueno, hasta ahí, creo que no debe de haber problemas.

Para las GUI que usen, coloquen lo respectivo para que funcione.

Saludos
William Morales

Versiones de TMySQL

Bueno,

Por sugerencia de un amigo-colega, he decidido colocar la LIB de la tmysql que uso. Así que les pido coloquen que versiones de xHarbour usan para intentar colocar una versión de TMySQL correspondiente.

Espero su colaboración.

Está es la primera aportación.

LIB TMYSQL xHarbour build 1.2.0 Intl. (SimpLex) (Rev. 6374)

Saludos
William Morales

miércoles, 18 de febrero de 2009

TMySQL mito o realidad

Bueno, un poco alocado el título, jjejjejje

Pero realmente creo que encaja muy bien.

Bueno, el primer tema será conocer que hace y de donde descargarla.

La Librería TMySQLServer es una contribución de xHarbour (dicen que está portada a Harbour, realmente no he tenido el gusto)la cual se usa para conectarse a mysql de forma nativa, es decir, sin ninguna ayuda, sino que su conexión es transparente. Bueno, en pocas palabras no necesita un cliente para poder conectarse.

Por otro lado, la pueden descargar desde Contribuciones xHarbour

Esperemos que se interesen y podamos ayudar a los que inician en este fascinante mundo SQL.

Saludos
William Morales

martes, 17 de febrero de 2009

Bienvenidos amigos...

Bueno,

Les doy la cordial bienvenida a este blog el cual estaré dando movimiento.

Espero poder contar con su asistencia y sobre todo su colaboración para ir aportando ideas.

Sinceramente

William Morales