17 de abril de 2003

What's New in Visual FoxPro 8.0



Title: What's New in Visual FoxPro 8.0
Author: Tamar E. Granor and Doug Hennig
Edited by: Jim Slater
ISBN: 1-930919-40-9
Length: 255 pages
Printed book format: Paperback, 7"x9"
Ebook format: PDF
Price (U$S): $49.95
Weight: 2.0 lbs.
Press date: March, 2003


Tabla de contenidos

15 de abril de 2003

Como modificar el código de un informe en tiempo de ejecución

Cuantas veces usted a necesitado cambiar el código escrito en los métodos del dataenviroment de un informe en tiempo de ejecución y el comando MODIFY REPORT no se lo permite.

Este es un pequeño ejemplo de cómo hacerlo en tiempo de Ejecución.

**JGS:21/03/2003
**Programa que permite la modificación del código interno de un reporte
**en tiempo de ejecución
Local ltemp_rep As String
ltemp_rep=Getfile('frx')
Use (ltemp_rep) Alias rep_temp In 0 Exclusive
Select rep_temp
Goto Top In rep_temp
Locate For objtype=25
If Found('rep_temp')
 Modify Memo rep_temp.Tag
 Use In rep_temp
 Compile Report &ltemp_rep
Endif
If Used('rep_temp')
 Use In rep_temp
Endif
José G. Samper

12 de abril de 2003

Manejo de datos con Microsoft Visual FoxPro y MSDE

Por Por José G. Samper C.

download Descargue el código fuente (142 Kb).
Cuando se esta pensando en desarrollar una aplicación, uno de los puntos importantes a tomar en cuenta es. ¿Cuál va a ser nuestro motor de base de datos?.

En este punto es importante destacar que Microsoft Data Engine (MSDE), puede ser una buena opción a tomar en cuenta.
Ustedes se preguntaran. ¿Qué es Microsoft Data Engine (MSDE)?.

Microsoft Data Engine (MSDE) es un motor de base de datos basado en Microsoft SQL Server, el cual posee las siguientes características:
  • El licenciamiento es gratuito.
  • No tiene aplicación de administración.
  • Soporta hasta 2 GB de datos.
  • Se accede igual que SQL Server.
Al momento de decidir que motor de base de datos vamos a usar en nuestra aplicación es importante tomar en cuenta las siguientes consideraciones:
Cuándo usar Microsoft Visual FoxPro:
  • Cundo seguridad no es una prioridad.
Cuándo usar MSDE:
  • Se quiere un motor más confiable que Microsoft Visual FoxPro sin pagar licenciamiento adicional.
  • Se estudie la posibilidad de construir aplicaciones escalables.
  • Cuando se desarrolle una aplicación que necesite replicación.
  • Para desarrollar aplicaciones localmente sin necesidad de instalar SQL Server durante el desarrollo.
Cuándo usar Microsoft SQL Server:
  • Aplicaciones de misión crítica.
  • Seguridad es un aspecto clave.
  • Manejo de grandes volúmenes de datos.
Los requerimientos necesarios para la instalación de Microsoft Data Engine (MSDE) son:
  • Sistema Operativo Windows 98 o superior.
  • Explorer 5.00 o superior
  • 64 Mb de Memoria Ram mínimo (Recomendable 128 Mb o Superior).
  • 44 Mb en Disco Duro.
Migración de datos

Empezaremos por explicar el Asistente de Microsoft Visual FoxPro, el Asistente de migración Microsoft® Visual FoxPro® es un aplicativo que ejecuta la migración de objetos de una base de datos Fox a una base de datos MSDE o SQL Server. Este asistente migra las tablas, relaciones, reglas, validaciones y si lo desea también se pueden migrar los datos.

Los pasos a seguir para realizar la migración son los siguientes:

Paso 1 - Seleccionar la base de datos local.

En este paso se selecciona la base de datos Fox a ser migrada.



Paso 2 - Seleccionar el origen de datos.

En este paso seleccionas el ODBC o conexión con la cual se va a realizar la migración.



Paso 3 - Elegir las tablas.

En este paso se seleccionan todas las tablas que se van a migrar.



Paso 4 - Asignar los tipos de datos de campos.

En este paso se define la estructura de la tabla en el Servidor MSDE, en este paso es importante destacar lo siguiente:
  • Para aquellas aplicaciones que necesitan replicación se debe marcar la casilla de Identity Column para todas las tablas, esto crea un campo de identificación única de registro necesaria para la replicación.
  • Si se desea mantener un control de cuando fue modificado un registro, se debe marcar la casilla de timestamp column para aquellas tablas en las que se desee llevar dicho control.
  • También es importante el controlar los tipos de datos, se debe realizar un análisis previo de cual es el mejor tipo de datos a utilizar en MSDE. Ej: Analizar que es mejor usar para un campo tipo fecha si datetime o smalldatetime.


Paso 5 - Seleccionar la base de datos de destino.

En este paso se define cual va a ser la base de datos destino en MSDE, se puede elegir entre crear una nueva base de datos o actualizar una ya existente.



Paso 8 - Definir las opciones de upsizing.

En este paso se define que se desea migrar, cambiar y crear. Se pueden migrar los índices, valores por defecto, relaciones, solo la estructura y los procedimientos almacenados. Se pueden cambiar las vistas locales a remotas o se pueden crear nuevas vistas remotas a partir de las tablas migradas. En este paso es importante destacar lo siguiente:
  • Si se van a migrar las reglas de validación, es importante tomar en cuenta que algunos comandos de fox no son compatibles con MSDE, por consiguiente es recomendable corregir estos detalles en la tabla fox antes de realizar la migración. Ej: En MSDE no existe la instrucción EMPTY(), esta validación debe ser corregida.
  • Si se van a migrar los datos, se debe tomar en cuenta que de existir algún comando no reconocido en las reglas de validación la data no será migrada satisfactoriamente.


Paso 9 - Finalizar.

Ejecuta la upsizing a MSDE.

También puede usar para migrar sus datos el aplicativo Data Transformation Services (DTS), el cual te permite la migración desde Microsoft Visual FoxPro a Microsoft SQL Server, para poder ejecutar esta aplicación debe tener instalado Microsoft SQL Server. Con esta aplicación se puede migrar la data y la estructura, no se migran las reglas, validaciones y store procedures.

Por ultimo puedes crear programas de migración propios. Por experiencias previas le recomendamos que migre la estructura de la base de datos con todos sus índices, validaciones, valores por defecto y procedimientos almacenados, mediante el asistente de migración y luego se migran los datos mediante el DTS.

Acceso de datos

Podemos acceder a ellos mediante vistas remotas, instrucciones de paso SQL (SQL Pass Through) o ADO.

Empezaremos por las vistas remotas, las vistas remotas son querys actualizables ejecutados sobre una fuente ODBC, los cuales son almacenados en la base de datos. Sus características son:
  • Se utilizan de igual manera que una tabla.
  • El buffering es Optimista.
  • Pueden ser Parametrizables
    • Estáticas
    • Dinámicas; Si no se dan los parámetros a tiempo de ejecución son solicitados por Microsoft Visual FoxPro. Ejemplo:
lcCodigo = "1"
USE VistaClientes
(SELECT * FROM Clientes WHERE cl_Codigo = ?lcCodigo)
  • Se pueden configurar propiedades de los campos.
Consideraciones a tomar en cuenta cuando se utiliza una vista:
  • Compartir Conexión, unos de los aspectos más críticos cuando se trabaja con MSDE son las conexiones por consiguiente al diseñar la aplicación le sugerimos los siguiente:
    • Establecer una sola conexión a la BD.
    • No hacer querys en paralelo sobre la misma conexión.
    • Configurar que se traiga todos los datos necesarios.
    • Cuidar la cantidad registros a traer.
    • Utilizar Propiedad NoDataOnLoad = .T. en el DataEnvironment.
    • Hacer REQUERY de la vista en el momento de necesitar la data.
  • Los índices sólo deben ser creados por razones de ordenamiento y búsqueda local, como las vistas son manejadas como una tabla permite la creación de índices sobre dichas vistas, al trabajar con índices sobre vistas le sugerimos lo siguiente:
    • Cada vez que se haga REQUERY() el índice debe ser eliminado y recreado.
    • Se debe ser muy cuidadoso con el uso de índices.
  • Manejo de transacciones en el Servidor, cuando se trabaja con transacciones, se debe tener en cuenta que se esta trabajando en cliente/servidor por consiguiente si abrimos transacciones en Microsoft Visual FoxPro estas no aplican al servidor MSDE, por lo cual le sugerimos los siguiente:
    • No usar BEGIN TRANSACTION (Manejo Fox).
    • Pasar a control manual de transacciones en el servidor.
    • Si se van a utilizar varias vistas, utilizar una sola conexión.
    • La transacción se abre con el primer TABLEUPDATE().
    • SQLCOMMIT() y SQLROLLBACK() para cerrar.
  • Evitar traer campos memo, es importante por razones de rendimiento el evitar traer en la vista los campos Memo, con esto no queremos decir que no se incluyen en la vista, si no, que se configure la vista para que traiga el contenido del campo memo cuando se solicite la información de dicho campo.
Para crear una vista remota puede usar el asistente de vistas remotas de Microsoft Visual FoxPro o mediante código.

Las instrucciones de paso SQL (SQL Pass Through), son funciones que permiten la ejecución de instrucciones SQL directamente en el servidor, las instrucciones de paso SQL son ideales para la ejecución de procesos del lado del servidor. Sus características son:
  • Se utiliza sintaxis propia del servidor.
  • Ejecutar consultas solo lectura.
  • Ejecutar procedimientos almacenados.
  • Ejecutar rutinas de mantenimiento.
  • Ejecutar Queries complejos con o sin actualización.
  • Se pueden ejecutar varios comandos sobre el servidor simultáneamente.
Consideraciones a tomar en cuenta cuando se utilizan las instrucciones de paso SQL (SQL Pass Through):
  • Compartir Conexión, igual que en las vistas se recomienda el uso de las conexiones compartidas, podemos reutilizar la conexión de las vistas abiertas con la función CURSORGETPROP( "ConnectHandle").
  • Al compartir conexiones con las vistas remotas, se debe tener cuidado al ejecutar la instrucción SQLDISCONNECT(), ya que involuntariamente podemos cerrar la conexión existente entra la base de datos y las vistas remotas.
Por ultimo explicaremos el método de acceso mediante Microsoft ActiveX Data Objects (ADO), Microsoft ActiveX Data Objects (ADO) es el método de acceso a datos adoptado por Microsoft desde 1.998, le permite acceso a un servidor de bases de datos y tratar los datos a través de un proveedor de OLE DB. Sus características son:
  • Se maneja mediante un modelo de objetos (Objeto Conecction, Objeto Command, Objeto Recorset, Objeto Record y Objeto Stream).
  • Ideal para la elaboración de componentes y aplicaciones Web.
  • Facilidad de uso.
  • Un bajo consumo de Memoria.
  • Soporta operaciones sincrónicas y operaciones asincrónicas (Operación sincrónica: Es aquella que al iniciarse tiene que finalizar, para poder continuar con la siguiente. Operación asincrónica: Es aquella que al iniciarse para el control al programa que la llame sin esperar a que finalice y continúa la ejecución del programa.
  • Soporta varios tipos de cursores (Cursor dinámico, Cursor de conjunto de claves, Cursor estático, Cursor de desplazamiento sólo hacia delante).
Consideraciones a tomar en cuenta cuando se utilizan Microsoft ActiveX Data Objects (ADO):
  • Al no ser un objeto natural de Microsoft Visual FoxPro, no se pueden utilizar las conexiones Fox.
  • El manejo de transacciones debe ser mediante el objeto ADO.
  • Para el manejo de datos en forma natural de Fox, puede usar la librería pública VFPCOM.dll, que permite la transformación de un cursor ADO a un cursor Fox.
  • Para ejecutar transacciones entre distintos de componentes se recomienda utilizar COM+.
Conclusión

Microsoft Data Engine (MSDE) es un excelente motor de base de datos, que le permite la elaboración de una aplicación Cliente/Servidor robusta y a bajo costo. Así mismo le permite una fácil escalabilidad a Microsoft SQL Server sin muchos cambios a su aplicación.


José G. Samper C., Caracas, Venezuela, es Analista Programador,Microsoft Most Valuable Profesional en Visual Fox Pro. Dedicado al desarrollo de sistemas desde el año 1991; siempre en Fox o en Visual Fox Pro. Actualmente especializándose en C# y Jefe de Proyectos Especiales en Softech Consultores, C.A.

9 de abril de 2003

Fechas con Visual FoxPro

Autor: Jim Booth
Traduccion: Ariel Gimenez

El año 2000 le da escalofrios a muchos desarrolladores de bases de datos. Los programadores Visual FoxPro no deben preocuparse sobre el seteo del century debido al soporte para la fecha del producto. Este mes examinaremos  los comandos que nos proveen de soporte para el próximo milenio y de paso echaremos una mirada sobre interesantes rutinas de manejo de fechas.
Dos son compañia, cuatro multitud

A menudo se escucha el lamento, “deseo usar SOLO dos digitos para el año en mis fechas.”   antes de la versión 5 de Visual FoxPro esto presentaba problemas cuando manejabamos el set century.  Han habido muchas soluciones sugeridas las cuales tenían una debildad, esta era el manejo de la fecha 29 de Febrero del 2000.  Tu verás, si ingresas un año de dos digitos entonces Fox interpretará la fecha como 02/29/1900 provocando un mensaje de error de fecha invalida antes de que el evento Valid pueda realizar los ajustes para el año 2000. No había 29 de febrero en 1900  pero habrá uno en el 2000.  Christof Lange ha desarrollado una soluciónque maneja este problema y funciona con versiones de FoxPro anteriores a la 5.0.  La solución há sido escrita en otra publicación y es de dominio publico.

Si estas usando Visual FoxPro 5.0 o posterior, entonces este problema no existe puesto que tenemos el comando SET CENTURY TO nsiglo ROLLOVER nAño .  El código siguiente demuestra su utilización
* Demostración de la sintaxis de SET CENTURY en VFP 5.0
* setearemos el CENTURY a 1900 con rollover para
* para cualquier año anterior a 70.

SET CENTURY TO 19 ROLLOVER 70 OFF

* hay que poner century on así podremos ver a que siglo pertenece 
  cada año

SET CENTURY ON
? {02/26/00}
? {02/26/92}

Así que ahora corriendo el programa veremos …, uh oh en el screen aparece 02/26/1900 y 02/26/1992.  Pero nosotros seteamos el century a 19 con rollover en 70, asi que ¿no deberiamos ver las fechas como 02/26/2000 y 02/26/1992?  Esta es una situación que ha puesto los pelos de punta a mas de un programador.  Tu ves la converción de esas fechas en tu código en datos del tipo fecha al momento que el programa es compilado. Los seteos al tiempo de compilación  afectan al siglo que las fechas toman. Así que cuando tu programa era compilado  la linea SET CENTURY TO todavía no había sido ejecutada.  Se usaron los seteos default para compilar el programa.  Aún si corremos el programa nuevamente veremos el siglo 19 como la usada para ambas fechas.  Esto es porque el programa ya se encuentra compilado y esas fechas quedaron hard-codeadas (literalmente) dentro del programa.   Para obtener lo que queremos necesitamos recompilar el programa luego de que el comando set century to ha sido ejecutado.   Tipeando el comando SET CENTURY en la ventana de comandos y luego recompilando el programa nos dará los resultados esperados.

Esta asignación de fechas en tiempo de compilación trae algunos interesantes problemas . Por ejemplo , El siguiente código mostrará una fecha en blanco si el seteo de SET DATE  es AMERICAN en tu entorno de desarrollo.
SET DATE BRITISH
? {25/11/1998}

La razón por la que obtienes una fecha vacía es porque el SET DATE de AMERICAN controlará la interpretación de la fecha literal {25/11/1998} y no hay mes 25.   la linea SET DATE no se ejecutará hasta que tu corras el código y para ese momento la fecha literal ya fué compilada.

Tén cuidado al utilizar fechas literales en tu codigo.

¿Asi que cuantos años tienes de todos modos?

Cúantas veces has necesitado calcular una edad entre dos fechas?  Probablemente bastante a menudo  si trabajas con personas en tus tablas.  A primera vista esto pareciera un proceso simple, solamente tomar la fecha mas antigua restarle esta a la mas nueva y dividirla por 365 (dias del año). Este algoritmo te dejará cerca pero no exactamente .   Entonces utiliza 365.25 como el divisor.  Aun mas cerca te deja esto pero no del todo para obtener la edad correcta con todas las posibles fechas.

Podríamos tratar de hacer un método distinto contando el tiempo entre las fechas.  De esta manera podríamos controlar cúan acertado es nuestro resultado por como escribimos el código que lo hace. El código mostrado abajo es un ejemplo de un programa que calcula el tiempo entre dos fechas.
* HowOld.prg
* Toma dos fechas o fecha-hora y devuelve la diferencia como un string 
  de *caracteres
* de nn años y nn Meses devuelve NULL para fechas invalidas

LPARAMETERS pdDate1, pdDate2

* Declaración de variables

LOCAL lnYears, lnMonths, ldDate1, ldDate2, lcType, lcReturn

* Set the data type of lcReturn to Character
lcReturn = ""

* ahora seteamos su valor a .NULL.
lcReturn = .NULL.

* chequeamos el tipo de datos para el primer parametro
lcType = TYPE("pdDate1")

IF NOT lcType $ "DT"
  * Illegal type for date
  RETURN lcReturn
ENDIF

* Chequeamos el segundo
lcType = TYPE("pdDate2")
IF NOT lcType $ "DT"
  * Illegal type for date
  RETURN lcReturn
ENDIF

* Toma la fecha mas alta
ldDate1 = MAX(pdDate1,pdDate2)

* Toma la fecha mas baja
ldDate2 = MIN(pdDate1,pdDate2)

* Ahora calculamos los años y los meses
* comienza con cero años y cero meses
lnYears = 0
lnMonths = 0

* se mueve para atrás ldDate2 por 1 mes
ldDate2 = GOMONTH(ldDate2,1)

* Loop as long as ldDate1 is later than ldDate2
DO WHILE ldDate2 < ldDate1

  * Agrega uno a lnMonths
  lnMonths = lnMonths + 1

  * Chequea por el paso de los años
  IF lnMonths = 12
       * incrementa los años
       lnYears = lnYears + 1
       * cero a los meses
       lnMonths = 0
  ENDIF

  * Incrementa la fecha primitiva
  ldDate2 = GOMONTH(ldDate2,1)
ENDDO

* Construye la cadena de retorno
IF lnYears > 0
  * pone el numero de años
  lcReturn = ALLTRIM(STR(lnYears)) + " Año"
  IF lnYears > 1
       * si hay mas de un año agrega la s
       lcReturn = lcReturn + "s"
  ENDIF
ENDIF

* agrega uno al numero de meses
lcReturn = lcReturn + " and " + ALLTRIM(STR(lnMonths)) + " Mes"

IF lnMonths <> 1
  * si meses no es uno agrega la es
  lcReturn = lcReturn + "es"
ENDIF

* devuelve la cadena
RETURN lcReturn
El codigo de arriba esta comentado para describir claramente lo que va sucediendo. la diferencia entre este método y el otro mas común es que aqui estamos contando los meses en vez de usar el numero de días.   Esto elimina el problema de el número de dias en el año evitando conflictos de redondeo.   Este método también elimina el problema de los valores fecha-hora, donde la sustracción devuelve el número de segundos y no el de días.   Intenta llamando a  HowOld y pasandole valores fecha-hora.

Jim Booth