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