
Conferencias 12 de Octubre
- Creando y usando Generadores en el mundo real (Builders)
- Implementando una Fabrica de Archivos (File Factory)
Creando y Usando Generadores en el mundo real (Builders)
Presentado por: Rick Schummer
Geeks and Gurus,Inc.
Microsft MVP,Certificado Microsoft CPAMuchos de nosotros conocemos y hemos
usado los Builder o generadores de Visual FoxPro, entre los que se puede contar
los generadores de OptionsGroups, Grids, ListBoxes, etc., dichos generadores
vienen instalados por defecto en el VFP, en esta sesión Rick demostró como se
pueden usar los generadores una herramienta que aumenta la productividad.
Como introducción se dieron los siguientes puntos de sobre lo que es un
Builder:
- No es un wizard, ya que a diferencia de estos, los generadores son
re-entrantes, ya que desde un generador puedes ejecutar otro generador y este
a su vez llamar a su propio generador y así hasta donde se tenga pensado.
- Los generadores son herramientas que nos ayudan a crear aplicaciones.
- Pueden usarse para reducir la exposición de propiedades especificas, así
como proveer un conjunto de valores validos para los mismos.
Shummer demostró las capacidades de los generadores las que en lo particular
desconocía, lo son: agregar y remover propiedades y métodos, agregar y remover
objetos, cambiar los valores de las propiedades y código dentro de los métodos
de los objetos seleccionados.
Se demostraron las distintas formas de implementar los builders, desde la
forma mas sencilla (por ejemplo, para establecer propiedades estándares de los
controles) hasta las mas complicadas que pudiera uno imaginarse (como juntar
distintos objetos para alinearlos, cambiarles el nombre, y poner DataSources).
De la misma manera se presentaron las funciones básicas para implementar un
generador, entre las que se encuentra:
- AselObject()
- SYS(1270)
- AMouseObj()
- WriteMethod
- ReadMethod
- WriteExpresion
- ReadExpresion
- ResetToDefault
- y un largo etcétera.
Se demostraron las opciones para hacer generadores entre las que se encuentran
su generación desde cero, teniendo con ello algunas ventajas y desventajas:
| A favor
| En contra
|
- Se tiene mayor “control” de lo que se puede hacer.
- Son fáciles de integrar dentro de los generadores existentes.
- Pueden ser basados en PRGs, VCXs, SCXs, APP.
- Pueden ser personalizados sin necesidad de ajustarlos en una
arquitectura predefinida
- Son educacionales, es decir se aprende mucha programación a la hora
de intentar crearlos.
|
- Es mucho trabajo a realizar
- Se deben crear generadores individuales para cada tipo de clase a
implementar.
|
La segunda opción mostrada fue del uso del BuilderB también llamado Generador de
Generadores (buena idea, no?), con este generador se pueden crear generadores
para clases propias, muy útiles para cuando se prepararan estas funciones.
Mostró las cuestiones a favor y en contra del BuilderB:
| A favor
| En contra
|
- El uso de su framework reduce mucho el trabajo
- Interfase de usuario consistente
- Extensible
- Fácil de aprender
- Integrado dentro de Visual FoxPro
|
- Es necesario crear un builder para cada una de las clases o conjunto
de clase
- Es necesario aprender el framework
|
Otro generador mostrado fue el BuilderD, el cual, en lo general tiene las mismas
funciones que el anterior solo que con alguna complicación extra ya que esta
basado en su propio Framework y esta orientado a Metadatos, es decir, todo esta
basado en tablas base, que a su vez generan registros maestros que son
utilizados para generar los generadores. Se expusieron sus ventajas y
desventajas:
| A favor
| En contra
|
- El framework utilizado reduce el trabajo a realizar
- Interfase de usuario consistente
- Menor código expuesto debido a que esta orientado a datos.
- También es extensible.
- Incluido en VFP
|
- Es necesario aprender del Framework
- Es menos flexible
- Dolores de cabeza adicionales (distribución de metadatos).
|
En conclusión, esta fue una buena sesión para saber como aprovechar una de las
herramientas que provee Visual FoxPro para aumentar la productividad. Me ha
gustado tanto el tema, que me ha inspirado para escribir un articulo para que
sea expuesto a la comunidad. Ya que como se podrán imaginar, con el poco tiempo
que se da por sesión, apenas y da tiempo de ver las pantallas mostradas. Solo se
nos mostró que pueden utilizarse la clase _Builder y la aplicación Builder.APP,
suficiente explicación?, no lo creo, asi que a esperar el articulo o revisar lo
anterior
Implementado la Fabrica de Archivos (File Factory)
Presentado por: Cathy Pountney
Optimal Solutions.
Microsft MVPQuizás el nombre no sea muy representativo, pero, que es
exactamente una fabrica de archivos? Muchas veces se tienen que administrar
muchos archivos dentro de las estaciones de los clientes, que pasa si algún
archivo básico falta?, se lo volvemos a suministrar, no es así?, que pasa cuando
el numero de estaciones se multiplica?, que pasa si le agregamos a esto la
administración de versiones?, que pasa si debemos certificar que el archivo dado
es exactamente el ultimo que debe ser?. A todas estas preguntas se le tiene una
respuesta, administración de archivos, o bien, una Fabrica de Archivos como le
llama este MVP Internacional.
La idea de la fabrica de archivos quizás se nos ha ocurrido antes, pero su
implementación debe ser bien planeada, Cathy mostró las cualidades de su
proyecto:
- Solo extraer archivos cuando sea necesario.
- Siempre revisar y buscar las ultimas versiones.
- Protegerá los usuarios de ellos mismos.
Pountney expuso los métodos básicos de su clase, entre los que se encuentran:
GetFile() Esta es una de las fundamentales dentro de su clase principal,
como su nombre lo indica, obtiene el archivo que sea necesario desde el
contenedor de archivos, para lograrlo utiliza las siguientes propiedades.
- tcFileName, nombre del archivo
- tcFactory, nombre del contenedor
- tcMandatoryExts, extensión obligatoria
- tcOptionalExts, extensiones adicionales (ejemplo: FPT, CDX para una
extensión obligatoria DBF)
- tlCloseFactory, cerrar el contenedor después de obtener el archivo
- tlForceUpdate, obligar a actualizar el archivo.
Lo que en realidad hace esta librería es ayudarse de los parámetros antes
mencionados para cumplir su función, entre las que se encuentra:
- Buscar el archive en la estación de trabajo
- Si no existe, crearlo
- Si existe, pero no es la versión actual o tiene algo que no coincide con
la versión del contenedor, recrearlo
- Si existe y todo esta bien, usarlo
- Regresa la ruta completa del nombre de archivo en la estación de trabajo.
Además de el método GetFile() se tienen otros métodos adicionales:
- oFileFactory.Update(), actualizar el archivo
- oFileFactory.Delete(), borrar el archive
- oFileFactory.CheckUserTable(), actualizar la tabla de usuarios.
Se nos demostró la idea básica del proyecto, entre lo que se encuentra el
separar los archivos en secciones lógicas: Contenedor principal, Tablas Modelos,
Tablas Principales, y tabla de usuario.
El contenedor tiene las siguientes características:
- Reside en la red, junto con los datos de la aplicación
- Cada registro representa una Fabrica de archivos (Tabla Principal)
- Es actualizada por los desarrolladores y distribuida con la aplicación
Esta tabla registra los siguientes campos:
| Nombre del Campo
| Función
|
| FFC_Name | El nombre de la fabrica de archivos a la cual pertenece el
registro
|
| FFC_GenPK
| La ultima llave primaria (Primary Key) usada por la fabrica de archivos
|
| FFC_Comm
| Comentarios y/o descripción de esta fabrica de archivos
|
Se comprende entonces que dicha tabla es la tabla principal de la fabrica de
archivos, con ella además se pueden tener múltiples fabricas, de manera que
pueden manejarse un numero bastante grande de contenedores, los cuales podrían
ser utilizados por múltiples aplicaciones, haciéndolo bastante flexible para los
administradores finales de la aplicación (no es para el manejo de parte de los
usuarios) o serie de aplicaciones.
Tablas Maestro
Estas tablas también forman parte del lado servidor, sus características son las
siguientes:
- Reside en la red, junto con los datos del servidor
- Contiene múltiples registro de detalle, cada uno representando un archive
a ser extraído en la estación de trabajo
- Es actualizado por el desarrollo y distribuido con la aplicación.
Para realizar su labor en la clase, esta entidad contiene la siguiente
estructura:
| Nombre del Campo
| Función
|
| FFM_PK
| La llave primaria
|
| FFM_HDDT
| Contiene la información sobre si es un registro detalle o encabezado,
H=Header, D=Detail |
| FFM_Name | Nombre usado para acceder a este archivo en la Fabrica de
Archivos
|
| FFM_File
| Incluye el archive actual almacenado código binario
|
| FFM_Group | Grupo lógico al cual pertenece el archive
|
| FFM_Subdir | Almacena el subdirectorio en el cual será extraído el
archivo dentro de la estación de trabajo
|
| FFM_SFile | Ruta completa y nombre de archivo que fue guardado al
ultimo |
| FFM_SData | Si es encabezado, la ultima fecha que este archivo fue
actualizado
Si es un detalle, el Date Stamp asociado con el archive guardado en el
registro
|
| FFM_Versn | Es el numero de versión
|
| FFM_Obs | Indica si el archivo ya es obsoleto
|
| FFM_Comm | Descripción y comentario de el archivo. |
Tablas de UsuarioDel lado del cliente, se tiene la tabla de usuario,
sus características y funciones son las siguientes:
- Reside del lado cliente
- Contiene un registro de encabezado
- Contiene múltiples registros de detalle, cada uno representando un archive
extraído en la estación
- Actualizado por la aplicación cuando el usuario la acceda en un momento
determinado
A continuación describo los campos y su función dentro del proyecto:
| Nombre del Campo
| Función
|
| FFU_PK
| Llave Primaria
|
| FFU_HDDT
| Si es encabezado (H) si es detalle (D) |
| FFU_FName
| (D) El nombre de archive de la Fabrica de archivos del cual fue extraído
|
| FFU_Name
| (D) El nombre del archivo que fue extraído en la estación
|
| FFU_Group | (D) Grupo lógico al cual pertenece el archivo |
| FFU_Subdir
| (D) El subdirectorio en el cual fue extraído el archivo. |
| FFU_Versn
| El numero de versión
(H) La versión de la tabla modelo al momento de que la tabla de usuario fue
creada (o actualizada)
(D) El numero de versión de la tabla maestro al momento de que el archivo
fue extraído
|
| FFU_Comm | La descripción traída desde la tabla Maestro de la Fabrica
de Archivos
|
| FFU_UsrDt | (H) La fecha y hora en que esta entidad fue creada o
actualizada
(D) La fecha y hora en que el archivo fue extraído en la estación.
|
Las tablas modelo Maestro y de Usuario es básicamente una copia de la ultima que
se encuentra en el servidor y en la estación respectivamente, sirven para
recrear la tablas principales en caso de que algo fallara.Con esta
información, se tienen los suficientes elementos para implementar un File
Factory, la idea es generar los registros necesario en las tablas maestro,
guardar en cada uno de ellos el archivo en cuestión, cuando se le solicite,
extraerlo y mandarlo a la estación cliente, al estar todo almacenado en
registros se puede muy fácilmente realizar la búsqueda de lo que fuera
necesario, revisar la tabla de usuario, ver si hay algún cambio con respecto a
la tabla maestro, si es necesario, actualizar, borrar, crear los archivos que
fueran, todo esto controlado por cada una de las estaciones, de esta manera se
puede tener la seguridad de que todos los archivos pedidos se podrán recuperar.
Haciendo el trabajo de administración de archivos relativamente fácil.
Obviamente el trabajo arduo recae en como se programen las clases, pero una
vez que se tenga listo, no habrá mucho de que preocuparse.
|