You are on page 1of 16

Ing. Russvell Jess Soto Gamarra Asesor de Computacin y Sistemas San Juan del Rio, Quertaro - Mxico Tel.

Oficina.: 1(427)2746184 Tel. Celular.: 1(427)109996 Email.: rycjesusrj@hotmail.com

Framework para Visual FoxPro, Utiliza SQLServer, MySQL, PostgreSQL y Oracle como su Motor de Base de Datos.
Por medio de la presente quiero hacerles llegar mis ms cordiales saludos y a la ves darles a conocer de mi nueva versin

Framework para Visual Fox Pro, Totalmente fcil y sencillo.


Somos muchos los programadores que hemos venido desarrollando aplicacin con la base nativa de Visual FoxPro; a mi particularmente nunca me gusto Visual FoxPro como motor de base de datos ya que es limitado pero como interfaz de usuario es excelente, si uno quiere orientarse a realizar aplicacin remotas o de entorno web es all donde surgen los inconvenientes de limitacin, no se si este equivocado pero eso es mi punto de vista. 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, PostgreSQL y Oracle), tendr que cambiar la forma de programar, djame decirte que no lo hars. Porque he desarrollado un Framework que permite trabajar con cualquier base de datos, lo ms importante es que no vas a tener que modificar ni una lnea de tu cdigo. La nueva versin no ha cambio a simple vista. El Framework trae muchas mejoras, entre una de ellas y la que ms interesa a todos

los desarrolladores es el control de la desconexin a la base de datos, el motivo puede ser como la falla de la red interna o si se est trabajando remotamente la cada del internet. El Framework intentara conectarse en hasta en 3 intentos, de esta manera impediremos que el usuario pierda la informacin y/o el proceso que esta realizando. Bueno se ha creado 8 propiedades fundamentales y un mtodo que hay que tener en cuenta PROPIEDADES: - UTILIZARTRANSA Valor ha utilizar .T. o .F.; Si el valor es .T., se abre la transaccin en Visual FoxPro y en el motor de la base de datos, cuando se utiliza el mtodo SQLCOMANDO. Inicialmente la propiedad esta en .F. - CLAVE PRIMARIA Aqu ponemos la llave primaria de nuestra tabla que queremos trabajar o el campo que har referencia para la actualizacin de los datos. - VALIDACAMPOTABLASQL Valor ha utilizar .T. o .F.; Compara la tabla del SQL con el cursor que se ha utilizado. Ejemplo si tengo un cursor con ms campos de la tabla principal solo toma los campos que corresponde a la tabla que se quiere actualizar.

- VALIDAIMG Valor ha utilizar .T. o .F.; Si la tabla tiene imgenes, esto es muy importante para MySQL y PostgreSQL. - VALIDARFECHA Valor a utilizar .T. o .F.; Cuando queremos guardar fechas vaca en MySQL no permite enviar error como si estuviramos mandando valores .null. a un campo de tipo fecha, pero para SQL Server no hay problema. - LGENERARCADENASQL Valor a utilizar .T. o .F. Esta propiedad ayudar a que el FW sea ms rpido o lento si la propiedad esta en .T., el FW armara la cadena SQL registro por registro; si esta en .F. el FW solo armara la cadena SQL una sola vez as existan 100 o ms registro en la tabla al momento que se desea guardar. - LVALNSTATUS Valor a utilizar .T. o .F. Esta propiedad esta propiedad nos ayudara a mejorar el armado de la cadena SQL ya que si nosotros queremos podemos mandar todas las columnas de la tabla que tenemos denominado cursor a la tabla SQL que deseamos actualizar si esta en .F. pero si esta en .T. solo enva los campos que se usan en el cursor. Esto sucede cuando se hace un insert o update.

- OTHERCN Esta propiedad nos ayudara a trabajar con diferentes conexiones simultneamente en un formulario o ambiente de trabajo, si la propiedad OTHERCN est vaca, el framework trabajara con la conexin por defecto que es la varia CN. Ejemplo: Para poder usar tenemos que crear conexiones a diferente base de datos como veremos en el siguiente cdigo MySQL
FUNCTION RECONECCION &&conexion predeterminada para el framework CN=SQLSTRINGCONNECT("DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;SERVER=localhost;UID=root;PWD=123456;DATABASE=malkaso ftadpi;PORT=3306;") RETURN CN ENDFUNC FUNCTION OTHERCN &&otra conexion que deseamos realizar OCN=SQLSTRINGCONNECT("DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;SERVER=localhost;UID=root;PWD=123456;DATABASE=digital ;PORT=3306;") RETURN OCN ENDFUNC

Es importante declarar las variables pblicas en nuestro sistema principal.


PUBLIC CN, OCN SET PROCEDURE TO funciones.prg CN = RECONECCION()&&Conexin predeterminada IF CN<1 MESSAGEBOX("Fallo de conexion con el servidor",16,"Error...") ENDIF OCN=OTHERCN()&&otra conexion IF OCN<1 MESSAGEBOX("Fallo de conexion con el servidor en la segunda base de datos",16,"Error...") ENDIF

Forma de usarlo
&&POR DEFECTO Thisform.sqlconector1.execute("SELECT * FROM TbTabla","TmpTabla") &&OTRA CONEXION Thisform.sqlconector1.othercn = "OCN" Thisform.sqlconector1.execute("SELECT * FROM horarios","TmpOCNHorario") Thisform.sqlconector1.othercn = ""

Nota: Al usar otra conexin es preferible dejarla vaca la propiedad othercn para que el framewrok trabaja con la conexin por defecto, sin la necesidad de volver a nmbralo.

MTODO: - SQLCOMANDO Sus parmetros (cAccion, cTablaSqlCur, cTablaSql, CondUpdate) cAccion = N nuevo; A Actualiza; E Eliminar. Thisform.sqlconector1.Execute(Select * from Tabla

,TablaCursor); el segundo parmetro 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 fcil. Quiero remarcar que la idea de todo esto es no modificar el cdigo 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 el la propiedad ControlSource va en lazado 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 CabeceraDoc,TmpCabecerado) Si lo quieren hacer ms interesante podemos manejar los buffer de almacenamiento de la siguiente manera. CURSORSETPROP("Buffering",5," TmpCabecerado") Agregar un nuevo Registro. Botn Nuevo. Select TmpCabecerado APPEND BLANK Despus que hacer todo nuestro proceso y de escribir los valores correspondientes en nuestros controles. Pasamos a guardarlo Botn Grabar. Select TmpCabecerado =TABLEUPDATE(.T.) Thisform.sqlconector1.Validarfecha = .T. escribo nada Thisform.sqlconector1.sqlcomando(N,TmpCabecerado,Cabecer aDoc) Botn Eliminar. Primer paso cuando uno quiere eliminar un registro es ubicarse en la posicin del registro que se desea eliminar. Select TmpCabecerado Delete Thisform.sqlconector1.cLlavePrimaria = NumeroDoc
&&Valido

From

la fecha si no se

Thisform.sqlconector1.sqlcomando(E,TmpCabecerado,Cabecer aDoc) Como pueden observar todo el cdigo 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 ms 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 valido segn que sistema queramos desarrollar. Consultando nuestra tabla y poder mostrarlo en nuestra Grilla y darles una presentacin a nuestros usuarios. Thisform.Execute(Select ,TmpDetalle) d.*, p.Descripcion, p.Unidad From DetalleDoc d Inner Join Productos p On d.CodPro = p.CodPro

Nuestra nueva tabla quedara de la siguiente manera. TmpDetalle Numero Doc CodPr od Descripci Cantid on ad Preci Unid o ad Preci Impor o te

Aqu vemos que no todo los campos pertenecen a la tabla DetalleDoc, particularmente nunca la descripcin del producto o algunos campos en mi tabla detalle, ya que todo eso lo tengo en la tabla maestra Producto, por forma de normalizacin no puedo repetir datos en mi base de datos en mas de dos tablas. Botn Agregar Detalle Select TmpCabecerado APPEND BLANK Quiero aclara que hay varias cosas que hacer aqu, para obtener el producto con una busqueda 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 nmero del documento que hemos creado Replace NumDoc With Thisform.TxtNumeroDoc.Value As agregamos las lneas que necesitamos para nuestro detalle. Ahora nuestro Botn Guardar quedara de la siguiente manera.

Botn Grabar.
&&Guardando

la cabecera

Select TmpCabecerado =TABLEUPDATE(.T.) Thisform.sqlconector1.Validarfecha = .T. escribo nada Thisform.sqlconector1.sqlcomando(N,TmpCabecerado,Cabecer aDoc)


&&Guardando &&Valido

la fecha si no se

el Detalle
&&Verifico

Thisform. sqlconector1.Validacampotablasql = .T. campos son iguales Select TmpDetalle Scan TmpDetalle.cantidad >0 = Endscan DetalleDoc)
&&

si los

me aseguro que tenga cantidad TmpDetalle,

Thisform.sqlconector1.sqlcomando(N,

Para la actualizacin 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 limitacin 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,TablaSQL Almacenar) EndScan Nota: CondUpdate se utiliza si quiero seguir restringiendo la actualizacin. Tambin se tiene que tomar en cuenta, si se utiliza el Framework para la actualizacin 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 ) La verdad que no van a cambiar nada de sus cdigo 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

Migrar Datos a de la Base de Datos de Visual Fox Pro a MySQL Otro punto que quiero aclarar, he visto en las paginas web a terceros que ofrecen programas para migrar de VFP a SQLServer,

pero djeme decirle que eso no es necesario porque el mismo SQLServer te permite hacer la migracin y se que muchos de ustedes lo saben. Lo no pude migrar la data de VFP a Mysql es utilizando las propias herramientas de mysql. Para ello he desarrollado un software que permite migrar con mucha facilidad. Puedes obtener un demo de la siguiente direccin. Espero haber sido lo mas explicito posible. Crticas sugerencias sern bien recibidas y aquellos que quieran dar mayor nfasis al tema, podemos hacer algo diferente.

VEREMOS UN JEMPLO CLASICO DE MANTENIMIENTO Parte de Presentacin de Datos.

Entrada de Datos.

El Botn Nuevo

El Botn Cancelar

El Botn Grabar

El Botn Editar

El Botn Eliminar

You might also like