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