sábado, 12 de febrero de 2011

Framework Multi-Conexion v6.0

Descarge el Manual y el ejemplo: Framework Multi-Conexion v6.0 para VFP

Hola a todos siempre nos hemos hecho esta pregunta, ¿podra VFP trabajar con otro motor de base de datos? y la gran interrogante a todo esto es. Si migro mi base de datos de VFP a otro motor de base de datos como (SQLServer, MySQL, Firebird, MariaDB, PostgreSQL, Oracle y etc.), tendré que cambiar la forma de programar, déjame decirte que no lo harás. Porque he desarrollado un Framework que permite trabajar con cualquier base de datos, lo más importante es que no vas a tener que modificar ni una línea de tu código.

La nueva versión no ha cambio a simple vista. El Framework trae muchas mejoras, entre una de ellas y la que más interesa a todos los desarrolladores es el control de la desconexión a la base de datos, el motivo  puede ser como la falla de la red interna o si se está trabajando remotamente la caída del internet. El Framework intentara conectarse en hasta en 10 intentos, de esta manera impediremos que el usuario no pierda la información y/o el proceso que esta realizando.


- OTHERCN

       Esta propiedad nos ayudara a trabajar con diferentes conexiones simultáneamente en un formulario o ambiente de trabajo, si la propiedad OTHERCN está vacía, el framework  trabajara con la conexión por defecto que es la varia CN.
MÉTODO:

- SQLCOMANDO
Sus parámetros (cAccion, cTablaSqlCur, cTablaSql, CondUpdate)  cAccion = “N” nuevo; “A” Actualiza; “E” Eliminar.

Thisform.sqlconector1.Execute(”Select * from Tabla ”,”TablaCursor”).

El segundo parámetro es el nombre del cursor y se le puede dar el nombre que mejor haga referencia a nuestra tabla SQL.

Ahora veremos como funciona el Framework. Tratare de ser lo mas explicito posible, para que ustedes lo puedan aplicar en su sistema de la manera sencilla y fácil. Quiero remarcar que la idea de todo esto es no modificar el código de nuestros Sistemas.
Las tablas que utilizaremos para nuestro ejemplo son las siguientes
-          CabeceraDoc
-          DetalleDoc
-          Productos
Antes de comenzar quiero recordarles que cuando utilizamos nuestros controles (TextBox, ComboBox, ListBox, Etc).  En la propiedad ControlSource va enlazado la tabla y el campo. 


CabeceraDoc
NumeroDoc
Fecha
CodCli
CodVen
FPago
Total







En el Load de formulario cargamos nuestro cursor, que vamos a trabajar.
Thisform.sqlconector1.Execute(“Select * From CabeceraDoc”,”TmpCabecerado”).

Si lo quieren hacer más interesante podemos manejar los buffer de almacenamiento de la siguiente manera.

CURSORSETPROP("Buffering",5," TmpCabecerado")

Agregar un nuevo Registro.

Botón Nuevo.
Select TmpCabecerado
APPEND BLANK
Después que hacer todo nuestro proceso y  de escribir los valores correspondientes en nuestros controles. Pasamos a guardarlo

Botón Grabar.
Select TmpCabecerado
=TABLEUPDATE(.T.)
Thisform.sqlconector1.Validarfecha = .T.  &&Valido la fecha si no se escribo nada
Thisform.sqlconector1.sqlcomando(“N”,”TmpCabecerado”,”CabeceraDoc”)

Botón Eliminar.
Primer paso cuando uno quiere eliminar un registro es ubicarse en la posición del registro que se desea eliminar.
Select TmpCabecerado
Delete
Thisform.sqlconector1.cLlavePrimaria=“NumeroDoc
Thisform.sqlconector1.sqlcomando(“E”,”TmpCabecerado”,”CabeceraDoc”).
Como pueden observar todo el código es de VFP no hay nada nuevo y de seguro mucho de ustedes lo tienen así.
En este ejemplo veremos como se utiliza la propiedad validacampotablasql, y como guardamos nuestro detalle.


DetalleDoc
NumeroDoc
CodProd
Cantidad
Precio
Importe








Producto
CodProd
Descripcion
Unidad
Stock
PCosto
StockMin








Nota: los nombres de las tablas pueden ser diferente y los campos pueden ser mucho más o diferentes solo lo utilice para el ejemplo. Hay muchas formas de determinar nuestras tablas y que campos deben llevar cada uno de ellos, a si que todo es válido según el sistema que deseamos desarrollar.
Consultando nuestra tabla y poder mostrarlo en nuestra Grilla y darles una presentación a nuestros usuarios.

Thisform.Execute(“Select d.*, p.Descripcion, p.Unidad From DetalleDoc d Inner Join Productos p On d.CodPro = p.CodPro ”,”TmpDetalle”)

Nuestra nueva tabla quedaría de la siguiente manera.

TmpDetalle
NumeroDoc
CodProd
Descripcion
Cantidad
Precio
Unidad
Precio
Importe









Aquí vemos que no todo los campos pertenecen a la tabla DetalleDoc, particularmente nunca la descripción del producto o algunos campos en mi tabla detalle, ya que todo eso lo tengo en la tabla maestra Producto, por forma de normalización no puedo repetir datos en mi base de datos en mas de dos tablas.

Botón Agregar Detalle
Select TmpCabecerado
APPEND BLANK
Quiero aclara que hay varias cosas que hacer aquí,  para obtener el producto con una búsqueda o ya sea la forma de llenado con un insert into o un appen blank la forma como se programa no me voy a centrar ahí. Continuando guardamos el número del documento que hemos creado

Replace NumDoc With Thisform.TxtNumeroDoc.Value

Así agregamos las líneas que necesitamos para nuestro detalle. Ahora nuestro Botón Guardar quedaría de la siguiente manera.

Botón Grabar.
&&Guardando la cabecera
Select TmpCabecerado
=TABLEUPDATE(.T.)
Thisform.sqlconector1.Validarfecha = .T.  &&Valido la fecha si no se escribo nada
Thisform.sqlconector1.sqlcomando(“N”,”TmpCabecerado”,”CabeceraDoc”)
&&Guardando el Detalle
Thisform. sqlconector1.Validacampotablasql = .T. &&Verifico si los campos son iguales
Select TmpDetalle
Scan TmpDetalle.cantidad >0 && me aseguro que tenga cantidad
=Thisform.sqlconector1.sqlcomando(“N”,”TmpDetalle”,” DetalleDoc”)       
Endscan

Para la actualización de los registro seria todo igual, con la única diferencia que esta vez debemos de determinar quien es la llave principal y poder hacer los cambios sobre ello.

Thisform.sqlconector1.cllaveprimaria = “NumeroDoc”
Thisform.sqlconector1.sqlcomando (“A”,”TmpCabecerado”,”CabeceraDoc”)

El Framework no tiene limitación cuando se quiere utilizar para inserte y/o actualizar registro de una tabla. Ejemplo para insertar campos a una tabla.
Select TablaVFP
Go Top
Scan
    Thisform.sqlconector1.sqlcomando(“N”,”TablaVFP”,”TablaSQLAlmacenar”)
EndScan



Nota: CondUpdate se utiliza si quiero seguir restringiendo la actualización.
También se tiene que tomar en cuenta, si se utiliza el Framework para la actualización de los datos forzosamente tiene que declarar un campo como llave primaria, teniendo en cuenta que este campo sea o no llave primaria en su tabla.

Ejemplo:
Thisform.sqlconector1.sqlcomando (“A”,”TmpCabecerado”,”CabeceraDoc”,” CodCli=’RUSS’ ”)

Sobre MariaDB: http://es.wikipedia.org/wiki/MariaDB
Sobre Firebird: http://es.wikipedia.org/wiki/Firebird

CONEXIÓN A  Firebird y MariaDB 
Nota usar el comando: SQLSTRINGCONNECT
Firebird 
DRIVER=Firebird/InterBase(r) driver;UID=ROOT;PWD=123456;DBNAME=D:\SISTEMAS\EjemploFW\Data\MALKASOFTADPI.FDB;

MariaDB 
DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;SERVER=localhost;UID=root;PWD=123456;
DATABASE=malkasoftadpi;PORT=3305;

La verdad que no van a cambiar nada de sus código todo será igual, espero estar en contacto con ustedes y poder ayudarles  a los interesados. Me pueden contactar en el siguiente correo rycjesusrj@hotmail.com