11 de junio de 2008

Interfaz Visual FoxPro con (SQLServer, MySQL, PostgreSQL y Oracle)

Lanzo al mercado Clase para poder trabar con cualquier motor de Base de Datos, sin tener que cambiar el código nativo de Visual FoxPro a MySQL, SQLServer, PostgreSQL o Oracle.

Antes de comenzar a explicar de cómo funciona la clase quiero darles algunos alcances y no se dejen sorprender por otras personas por que lo único que quieren es lucrar con personas que no conocen mucho de este tema.

Somos muchos los programadores que hemos venido desarrollando aplicación con la base nativa de Visual FoxPro; particularmente nunca me gusto Visual FoxPro como motor de base de datos ya que es limitado, si uno quiere orientarse a realizar aplicación remotas o de entorno web es allí donde surgen los inconvenientes de limitación, no se si este equivocado pero eso es mi punto de vista.

La gran interrogante a todo esto es, si migro a un motor de gestor de base de datos, tendré que cambiar la forma de programar, bueno en teoría si. Aquí unos pequeños comandos y la forma como seria para programar si se cambia la base de datos, pero con la clase que desarrolle no se tiene que cambiar casi nada en absoluto.

Ahora déjenme explicarles como funciona

Se ha desarrollado dos clases, que es para mantenimientos y otra que es para transacciones.

Primero todos los programadores en Visual FoxPro, sabemos que nuestros formularios utilizamos diferentes herramientas como TextBox, LisTbox, Combobox, etc... y en su propiedad controlsource hacemos referencia a la tabla y el campo que esta enlazado a este objeto. Bien si tenemos un formulario ya desarrollado lo único que vamos a tener que hacer es copiar todos los objetos utilizados en nuestro mantenimiento a nuestro nuevo formulario que hereda de la clase (mantenimiento) y configurar las siguientes propiedades. Primero comenzamos viendo las propiedades que utilizamos para un Textbox se fijan en el controlsource, bueno esa es la tabla que esta en el motor de MySQL, SQLServer o PostgreSQL



Bueno como eso va ser copiado del formulario anterior no hay problema, ahora veremos las propiedades del formulario.



La propiedades ha utilizar son:
  • SQLTabla = la tabla con lo que queremos trabajar
  • nCeros = cuando el código será autogenerador, (00001,00002, etc.)
Con solo estas dos propiedades, tienen un mantenimiento de tablas, ahora pasemos a la pestaña Listado General.



Bien aquí utilizamos las propiedades del grilla, muchas veces queremos una búsqueda interactiva, ejemplo tengo 1000 clientes no voy a bajar uno por uno, aquí explico como crear la búsqueda.
  • GenBusqueda = “S” genera un buscador, “N” sin buscador
  • cBusCampo1 = aquí va el primer campo para la búsqueda
  • cBusCampo2 = aquí va el segundo campo para la búsqueda
  • cBusCampo3 = aquí va el tercer campo para la búsqueda
  • cTituloBus = es la presentación que aparecerá en el combobox.
Ya todo esto definido tendremos un mantenimiento diferente a lo acostumbrado.



Bueno yo lo tengo ya acoplado a mis sistemas.



La ventana de búsqueda que configuramos.



Sin programar ninguna línea de código solo haciendo la copia del formulario que ya teníamos desarrollado y configurando algunas propiedades.

Ahora vayamos a lo supuestamente más difícil, como trabajar con las transacciones que tenemos. Las conocidas tablas (cabeceas de documento y detalle de documento). Bueno se ha creado 4 propiedades fundamentales y un método que hay que tener en cuenta

Propiedades:

  • Clave primaria = llave primara para la actualización de registros
  • Validacampotablasql = Valor de .T. o .F. Compara la tabla del SQL con el cursor que se ha utilizado.
  • Validaimg = Valor de .T. o .F. Si la tabla tiene imágenes
  • Validar fecha = Valor de .T. o .F. Cuando queremos guardar fechas vacía en mysql no permite enviar error como si estuviéramos mandando valores .null. a un campo de tipo fecha, en SQLServer no hay problema.
  • sqlupdateinsert = Sus parámetros (cAccion, cTablaSqlCur, cTablaSql, CondUpdate)
  • cAccion = “N” nuevo; “A” Actualiza.
Forma de uso, no pongo la opción para eliminar porque es sumamente sencillo. El comando que se utiliza para recuperar una tabla de cualquier motor de base de datos es.

SQLExecute (Conexión,”Select * From Tabla ”,”TablaCursor”)
Yo tengo un método que es similar con la diferencia que sale el error específico si sale mal la consulta o hay algún campo mal escrito.

Thisform.Execute(”Select * from Tabla ”,”TablaCursor”)
Forma de uso: Si queremos utilizar un cursor que hemos agregado campos diferentes que no pertenecen a la tabla que vamos hacer referencia.

Thisform.Execute(“Select * From CabeceraDoc”,”TmpCabecerado”) 
El segundo parámetro le puede dar el nombre que desean.
Select TmpCabecerado
Replace numerodoc with thisform.txtnumerodoc.value
Replace fecha with thisform.txtfecha.value
=TABLEUPDATE(.T.)
Como pueden observar todo el código es de VFP no hay nada nuevo y seguro mucho de ustedes lo tienen así. Utilizando la clase reemplazas =TABLEUPDATE(.T.) Por
Thisform.Validarfecha = .T.
=Thisform.Sqlupdateinsert(“N”,”TmpCabecerado”,”CabeceraDoc”)
Aquí no valida los campos, la imagen…y todo tu código sigue igual, ahora veremos cuando utiliza validacampotablasql
Thisform.Execute(“Select d.*, p.Descripcion, p.Unidad From DetalleDoc d ;
    Inner Join Productos p On d.CodPro = p.CodPro ”,”TmpDetalle”) 
Aquí vemos que no todo los campos pertenecen a la tabla DetalleDoc, no guardo la descripción del producto en mi tabla detalle y lo mismo pasa con la cabecera si queremos recuperar un documento y aumentamos el nombre del cliente, lo traemos todo en un solo cursor pero si hacemos cambios ahí seria conveniente utilizar el método validacampotablasql.

Si es un detalle con varios ítems, seria de la siguiente manera:

Thisform.Validacampotablasql = .T.
Select TmpDetalle
Go top 
If !eof() && me aseguro que tenga datos
  Scan TmpDetalle.cantidad >0 && me aseguro que tenga cantidad
 =Thisform.Sqlupdateinsert(“N”,” TmpDetalle”,” DetalleDoc”) 
  Endscan 
Endif 
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.cllaveprimaria = “NumeroDoc”
Thisform.Sqlupdateinsert(“A”,”TmpCabecerado”,”CabeceraDoc”)
Nota: CondUpdate se utiliza si quiero seguir restringiendo la actualización.

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.; pueden bajarse el demo de la siguiente dirección.

http://www.4shared.com/file/48194381/12e9e0 ac/Mante_3capasDemo.html

Otro punto que quiero aclarar es, he visto en las paginas web a terceros que ofrecen programas para migrar de VFP a SQLServer, pero déjame decirle que eso no es necesario porque el mismo SQLServer te permite hacer la migración, se que muchos lo saben. Bueno lo que si no he podido hacer es utilizando las herramientas de mysql, migrar todo la data de VFP a Mysql. Para ello he desarrollado un software que permite migrar con mucha facilidad. Puedes obtener un demo de la siguiente dirección.

http://www.4shared.com/file/49343441/35ebef92/DBF ToMySQL.html

Espero haber sido lo mas explicito posible. Críticas sugerencias serán bien recibidas y aquellos que quieran dar mayor énfasis al tema, podemos hacer algo diferente.

Atentamente;

Russvell Jesus Soto Gamarra
Email.: rycjesusrj@hotmail.com

3 comentarios :

  1. Esto es lo que deseo hacer los link estan rotos, donde puedo conseguir información o donde bajar ese componente?

    ResponderEliminar
  2. Es un artículo del año 2008, se deberia contactar con el autor para solicitar que los suba nuevamente a la web.

    ResponderEliminar