VFP y sus Cursores de Datos utilizarlos como un objeto

Hola a todos!!

Desde que empece a programar en VFP y deje aun lado las tablas DBF y los cambie por un servidor de base de datos, me di a la tarea de aprender buenas practicas para iniciar de la mejor manera mis desarrollos, ya que siempre había programado usando todo el código en los formularios como la mayoría lo hace, y siempre tontamente decía si así funciona para que complicarme, eso de las buenas practicas es pura jalada jajaj pero la verdad es que no es cierto, sino todo lo contrario, es lo mejor de lo mejor para desarrollar en cualquier lenguaje, entenderlo no es fácil y aplicarlo tampoco, solo es cuestión de no querer ser del montón (en el buen plan), es decir superarse a si mismo.

Cuando tienes un sistema enorme como un ERP las cosas se complican mucho, exageradamente!!! porque tienes el clásico código espagueti por todos lados, un calculo en varios formularios y encuentras un error lo corriges en uno pero se te olvido el otro y el otro y el otro y un cuento de nunca acabar, a quien no le ha pasado esto?, por la simple razón de no aplicar buenas practicas.

Y que tiene que ver esto con los cursores? pues resulta que siempre he tenido la inquietud de que VFP a diferencia de otros lenguajes digamoslo así: «tiene un gran poder en el manejo de datos por medio de sus cursores», y no aprovechar esa característica única de VFP (entiéndase única en el sentido que los cursores de VFP son mas rápidos que los usados en lenguajes dbase) se me hace muy ilógico, pero entra en conflicto con el uso de las buenas practicas ya que en la capa de datos no se contemplan los cursores si no los objetos, arrays, etc., y sin embargo mis desarrollos y mi experiencia me dicen lo contrario.

Por lo tanto de manera personal recomiendo el uso de cursores entre capas solo si desarrollas con VFP, esto es muy importante!!, solo para VFP y nada mas, que usar Objetos, Array, Variables, Propiedades, Gather, etc, para manipular los datos, ojos!!! los datos.

Realmente desconozco como esta constituido a nivel programación un cursor, solo se que es un archivo temporal donde se tiene la información que es igual a una tabla DBF con la diferencia que la tabla DBF no es temporal, pero comparte la estructura y manejo de datos y puedes manejar cientos de miles de registros con mayor velocidad que un array, por dar un ejemplo, a demás que existen infinidad de funciones para el manejo de Cursores algo que con Objetos o Array no es igual o tan sencillo.

Por ejemplo en un cursor con 50 campos o mas o menos, puedes saber el estado de uno o varios registros, incluso el campo de un registro, es decir si el registro es nuevo, fue eliminado, fue modificado y que campo o que campos fueron modificados, tener esa información en un Objeto o un Array no es posible de forma nativa, se tendría que desarrollar algo para saberlo, esta es sin duda la parte mas fuerte por la que usar Cursores es mejor!!

Imaginen que tienes un cursor con 50 campos y 100 registros, y solo modifican el registro 20 cambiando el valor del campo 5, usando cursores es fácil de saber cual registro y que campo fue modificado para solo enviar un simple UPDATE para actualizar el registro y su campo al servidor o tabla dbf, pero usando Objetos o Array esto se complica, y lo normal es enviar al servidor los 50 campos y 100 registros a actualizar.

Cuando se desarrolla en CAPAS se tiene separado todo y es una buena practica que les recomiendo mucho, lo normal es crear Objetos con propiedades para obtener la información de un registro o varios, incluso usar Array, lo irónico (así lo veo solo en VFP) es que para llenar las propiedades del objeto o el Array con los datos es necesario primero obtener por medio de un cursor la información o abrir una tabla dbf, por lo que ya tenemos 2 pasos, uno obtener los datos y dos llenar el array o propiedades del objeto con los datos del cursor. Ojo!! estamos hablando que el origen de datos es una tabla DBF o un servidor de base de datos, porque no faltara por ahí quien diga que pasa si el origen es un archivo XLS, o XML o TXT, para esos casos las cosas cambian un poco, pero no es el tema, continuamos con el ejemplo no es completo solo la parte que nos interesa analizar de la capa de datos.:

* Capa de Datos
  Define Class oDatos_Clientes as Custom
     Procedure Obtener_Datos
        * Abrimos la tabla
           Use clientes.dbf
        * Asignamos las propiedades de Datos
           this.id = clientes.id
           this.cliente = clientes.cliente
        * Cerramos la tabla
           Use in clientes
     EndProc
EndDefine

Mi recomendación es obtener un cursor ya sea a partir de una tabla DBF o de un servidor de base de datos y utilizarlo como si este fuera un objeto, nos evitamos en primera instancia tener que asignar el valor de los datos en las propiedades de los objectos y sobre todo nos evitamos declarar las propiedades al propio objeto es decir:

Define Class oDatos_Clientes as Custom
    * Propiedades de Datos
       id = 0
       cliente = ""
EndDefine
Si usamos el Cursor devuelto por el origen de datos como si fuera un Objeto, entonces el nombre del cursor pasaría a ser el nombre del objeto y los campos del cursor serian las propiedades del Objeto, por lo tanto nuestra clase oDatos_Clientes quedaría así de simple.
Define Class oDatos_clientes as Custom
     * Propiedades de Datos
          * Usar el cursor CLIENTES
     Procedure Obtener_Datos
        * Abrimos la tabla
           Select id, cliente from midatabase!clientes into cursor clientes readwrite
        * Asignamos las propiedades de Datos
           * Usar el cursor Clientes
        * Cerramos la tabla
           * No cerrar el cursor creado
     EndProc
EndDefine
Ya no definimos las propiedades del Objeto que harán referencia a los datos del cursor, podemos crear todas las propiedades que necesitemos pero las que van hacer referencia a los datos no serian necesarias, por lo tanto esta ventaja que VFP nos permite en lo personal la aprovecho y en vez de ver los datos como un Cursor, realmente estoy viendo un Objeto con infinidad de propiedades y funciones ya preestablecidas que no tengo que programar si no reutilizar.

Si la programación orientada a objetos nos dice que debemos reutilizar el código y un Cursor por si solo me permite reutilizar infinidad de funciones, para que crear un objeto al cual le tengo que enseñar hacer lo que necesito cuando ya tengo algo mejor en un Cursor, entonces mejor creo el objeto y en vez de adicionar el control de datos manual me apoyo en todo lo que representa el Cursor de datos, es decir combinar ambos mundos, algo que solo VFP nos permite hacer y se me hace incluso absurdo no aprovechar, se que las buenas practicas dicen lo contrario, pero los otros lenguajes existen los cursores? cuando diseñaron las buenas practicas para la capa de datos tenían en mente los cursores y en especial como VFP es mas rápido? creo que la respuesta es «personalmente no se y no me interesa pues funciona de maravilla» jejej.

FoxyDb utiliza al 100% los cursores para facilitar todas las tareas entre la aplicación y el servidor de base de datos, es por ello que FoxyDb representa una capa de Acceso a datos, ojo!! no se debe considerar como una capa de datos pues la capa de datos el origen de los mismos puede provenir de varios lugares, como un XML, una tabla DBF, un servidor de base de datos, un archivo TXT, una hija de calculo de Excel, un archivo JSON, incluso teniendo identificado el origen de datos como un servidor de base de datos este permite infinidad de formas de conexión, como ADO, ODBC, Nativa, etc etc

Gráficamente seria así
* Capa de Negocios
   * Capa de Datos
       * Capa de Orígenes de Datos
          * XML
          * JSON
          * Servidor de Base de Datos Relacional
              * ADO
              * ODBC
                  * FoxyDB
          * TXT
          * XLS
          * etc.
* Capa de Presentación
   * Formulario
   * Pagina Web
   * Reporte
   * Pantalla
   * Impresión
   * Archivo
      * XML
      * JSON
      * PDF
      * etc
Un ultimo comentario adicional para reforzar la idea, por ejemplo cuantos lenguajes de programación conocen que les permiten crear clases visuales como lo permite VFP? de los que eh visto ninguno o no tan practico!!! entonces si VFP permite crear clases visuales y los demás no lo permite es una mala practica? solo por el hecho de ser diferente? ahí se los dejo de tarea.

Mi conclusión personal y recomendación es primero usar buenas practicas en todo y si desarrollan en VFP aprovechar los Cursores y no verlos como una simple tabla temporal si no como un Objeto para apoyar su múltiples capas en que desarrollen sus sistemas!!

P.D. Toda corrección, recomendación, aclaración, puntos de vista personales, profesionales sobre este tema son bien recibidos, todo con el fin de siempre mejorar.
saludos
Antonio Meza

Un pensamiento en “VFP y sus Cursores de Datos utilizarlos como un objeto

  1. * Algunas de las grandes cosas que se puede hacer en VFP

    CLEAR

    * construcción de órdenes, comandos o sentencias VFP de forma dinámica (tiempo de ejecución)! mediante la macro instruccion (&)
    * en C# se pueden generar líneas de comandos de forma dinámica (tiempo de ejecución) como en VFP?
    MIvar=’?DATETIME()’
    ?&MIvar
    ?
    *
    * generación de variables en VFP de forma dinámica (tiempo de ejecución)! mediante la macro instruccion (&)
    FOR ii=1 TO 9
    MIvar=’varDinamica’+ALLTRIM(STR(ii))+’=’+ALLTRIM(STR(INT((1000-100+1)*RAND()+100)))
    &MIvar
    MIvar=’?varDinamica’+ALLTRIM(STR(ii))
    &MIvar
    ENDFOR

    * adición de variables o propiedades a objetos como el screen, form, container, label, etc. de una forma sencilla
    * en C# se pueden agregar variables (propiedades) de forma dinámica (tiempo de ejecución) como en VFP?
    _screen.AddProperty(‘MIprop’)
    _screen.MIprop=.t.
    ?_screen.MIprop
    ?

    * adición de objetos a otros objetos contenedores!
    * en C# se pueden agregar objetos de forma dinámica (tiempo de ejecución) como en VFP?
    _screen.RemoveObject(‘MItexto’)
    _screen.AddObject(‘MItexto’,’Textbox’)
    _screen.MItexto.value=’cuadro de texto ejemplo’
    _screen.MItexto.fontsize=14
    ?_screen.MItexto.value

    * VFP es el lenguaje más dinámico que conozco
    * tuve que migrar a C#, PHP u otros por la desfachatez
    * de Microsoft de descontinuarlo y matarlo… y no liberarlo !
    * VFP le da una libertad TOTAL al programador !

    Me gusta

Deja un comentario