12 de enero de 2016

Crear PDF con Visual FoxPro

A través de este medio remito el material (código y librería) para la creación de archivos PDFs desde Visual FoxPro con PDF_In_The_Box.dll y que sirva a toda la comunidad.

Saludos cordiales,

Valdemar Ramírez Moncada
Lima-Perú.

Descarga:

El código de ejemplo y librería se puede descargar libremente de: VFP_Crea_PDF.rar

Muestra:

PDF In-The-Box: Una fácil y poderosa herramienta de desarrollo para crear archivos PDF mediante programación. Mas info en: http://www.synactis.com/pdf-in-the-box.htm

6 de enero de 2016

Copias de seguridad de bases de datos de VFP de manera sencilla

Artículo original: VFP Database Backup Made Simple
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,44d8bab2-fe4b-4c97-982e-09c10480a962.aspx
Autor: Craig Boyd
Traducido por: Luis María Guayán


Hacer una copia de seguridad de datos

Una de las cosas más importantes y más simples que un usuario de una aplicación de base de datos de escritorio puede hacer, es mantener una copia de seguridad actualizada de la base de datos de la aplicación. Sin embargo, si el usuario no cuenta con algún tipo de software o hardware que haga una copia de seguridad automática programada, generalmente es el desarrollador de la aplicación que implementa una función de copia de seguridad para la aplicación.

Implementando una copia de seguridad de datos

Hay una serie de cosas a considerar cuando implementamos una copia de seguridad para una aplicación con bases de datos, pero suele ser el desarrollador de VFP que simplemente busque la capacidad de comprimir los archivos de datos de VFP de un directorio en un horario programado (como por ejemplo todas las noches a las 3:00 AM) en un Archivo zip que es nombrado con la fecha y hora. En aras de cumplir con estos modestos requisitos, presento una aplicación que he llamado DataBackup.exe.

DataBackup.exe utiliza vfpcompression.fll para generar un archivo zip con los archivos de datos de Visual FoxPro contenidos en un directorio. El directorio de la copia de seguridad se especifica simplemente modificando la ruta en el archivo DataBackup.ini. Y, con la ayuda del Programador de Tareas de Windows (sí, esto esta disponible en versiones anteriores de Windows), DataBackup.exe puede correr fácilmente en un horario determinado. De hecho, en el interés de esto último, DataBackup.exe fue diseñado sin ningún tipo de elemento GUI, aunque existe una función Progress que puede invocar si desea implementar algún indicador de progreso cuando se está procesando la copia de seguridad. En cualquier caso, DataBackup.exe está diseñado para ser fácilmente implementado por cualquier aplicación VFP que utilice un directorio que contenga todos los archivos de datos.

Así que, simplemente agregue DataBackup.exe en el instalador de su aplicación VFP. Después haga que su aplicación VFP escriba la ruta de acceso al directorio de datos en el archivo DataBackup.ini, donde reside DataBackup.exe. Configure una Tarea Programada para que se ejecute automáticamente o por petición del usuario, a través de la creación de una Tarea que ejecute DataBackup.exe en un horario determinado.

Nota: Las copias de seguridad (archivos zip con nombrados con la fecha/hora) se generan en el mismo directorio donde reside DataBackup.exe. Asimismo, en caso de que no se ejecute DataBackup debido a algun problema, DataBackup guardará la información del mensaje de error en un archivo de nombre DataBackup.err. Este archivo puede resultar útil cuando trate de diagnosticar los problemas cuando DataBackup.exe no genere las copias de seguridad en la computadora del usuario como se pretende

Posibles mejoras

Hay una serie de cosas que se puede hacer para mejorar DataBackup.exe, como añadir la característica de restauración, permitir varios directorios que se especifiquen en DataBackup.ini, permitir subcarpetas, permitir una máscara para los nombres de archivo a través del archivo DataBackup. Ini, para hacer copias de seguridad de otros tipos de archivos, permitir al usuario especificar cuando las copias de seguridad se crean ... Alguna otra idea?

Descargue la Aplicación DataBackup (aprox. 68 KB)

Hasta la próxima ... VFP Rocks!

2 de enero de 2016

Una biblioteca de expresiones regulares para Visual FoxPro

Artículo original: A Regular Expressions library for Visual FoxPro
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,91241006-595a-487d-ac06-d0fc1fc71632.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé


¿Qué es una expresión regular?

Antes de gastar miles de líneas explicando que son expresiones regulares, he aquí lo que aparece en la Wikipedia http://en.wikipedia.org/wiki/Regular_expression

¿Cómo pueden ser utilizadas en Visual FoxPro?

La vía fundamental en que los desarrolladores VFP han utilizado las expresiones regulares (si es que las han utilizado) en sus aplicaciones, es a través de Windows Scripting Host. Puede ver más información sobre expresiones regulares y cómo el objeto RegExp se utiliza en código VFP en el Wiki de Fox http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://wikis.com/wc.dll?Wiki~RegExp (Gracias a Alex Feldstein http://www.bloglines.com/blog/AlexFeldstein por la mayoría de los contenidos)

Mientras esta solución está bien, hay algunos problemas como puede ser la vía para establecer los parámetros de seguridad de la cuenta del usuario, o que WSH no esté disponible en el sistema. Sin embargo, es lo mejor que podemos hacer, si no queremos gastar en una biblioteca de terceros para brindar esta funcionalidad. Pero entonces, decidí intentar crear a mano otra solución de la cual nos podemos beneficiar todos.

Introducciendo regexp.fll

Decidí que llegó la hora en que los desarrolladores VFP tengan una biblioteca de enlace dinámico (FLL) gratis que ofrezca expresiones regulares en Visual FoxPro, por tanto, me senté con mi copia de Visual Estudio 8 y, escribí una con la ayuda de Boots http://www.boost.org. Desafortunadamente, el proceso no fue tan simple como ha sonado en la última frase.

Primeramente, jugué con la idea de escribirlo por mi mismo en código Visual Foxpro puro. Era una mala idea, por un lado, era atractiva la idea de reinventar la rueda; pero la descarté muy pronto, porque hubiera representado mucho esfuerzo y el resultado final no hubiera sido capaz de realizar todo lo que he alcanzado haciéndola en C++. Lo próximo fue investigar todas las bibliotecas C++ disponibles y por un tiempo estuve utilizando GRETA http://research.microsoft.com/projects/greta/; pero entre los errores que había en el código, la sensación de que no va a recibir más soporte una vez que se fue Eric Niebler y algunas cosas preocupantes que leí sobre la licencia, pensando en aplicaciones comerciales, pronto la desestimé también. Luego de jugar con cerca de media docena de otras bibliotecas y comparando la forma, función y rendimiento de cada una, me decidí por el proyecto regexp.fll de Boost RegExp http://www.boost.org/libs/regex/doc/introduction.html, entonces mi proyecto tomó forma y se finalizó en breve. Probablemente me llevó más tiempo compilar las bibliotecas BoostRegExp que para escribir el código real para esta FLL.

Un comienzo

Esta biblioteca lo que hace es la coincidencia. Mientras la coincidencia es dudosamente aquello para lo que se utilizan las expresiones regulares, existen otras cosas que yo agregaré a esta biblioteca que nos permitirán hacer todo un grupo de cosas en Visual FoxPro utilizando expresiones regulares, tales como devolver conjuntos coincidentes, realizar búsquedas posicionales y realizar las sustituciones. Incluso pensé que la biblioteca no está hecha para otra funcionalidad, pienso que encontrará muy útil su capacidad para la concordancia.

Nota importante sobre las librerías de C++ necesarias en tiempo de ejecución

Para utilizar esta FLL (que fue compilada con Visual Studio 8), necesitará la biblioteca runtime necesaria y debe estar en el sistema en una vía muy específica. No le puedo decir la cantidad de mensajes que he recibido sobre vfpencryption.fll que escribí en http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5d4a0cf0-7d1d-4353-a49b-667946ff1c81.aspx en los que los desarrolladores han tenido problemas para hacerla funcionar debido a que no tienen los runtimes o los runtimes no fueron instalados correctamente en el sistema. No estoy diciendo que me molesten esos correos (siempre es bueno saber de miembros de la comunidad Visual FoxPro), o que yo no haya entendido la confusión ... Estoy diciendo que con Visual C++ 8.0 algunas de las reglas han cambiado y todos tenemos que aprender la vía correcta al hacer algo en la era del .NET 2.0.

La vía más más sencilla para instalar correctamente los runtimes en su sistema (o el sistema del usuario) es descargar el archivo instalador que ofrece Microsoft (su tamaño es 2.48 MB) desde http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.sweetpotatosoftware.com/files/vcredist_x86.zip. Es un poco pesado; pero la cuestión es simplemente hacer clic y todas las bibliotecas quedan instaladas, sin molestias ni alborotos.

Ahora, para aquellos que desean crear un instalador o simplemente desean tener el mínimo requerido pudieran crear una subcarpeta llamada "Microsoft.VC80.CRT" en la misma carpeta en que está el regexp.fll. La subcarpeta Microsoft.VC80.CRT necesita tener cuatro archivos: Microsoft.VC80.CRT.manifest, msvcm80.dll, msvcp80.dll, y msvcr80.dll. Para ayudarlo a crear esta configuración he creado un archivo zip que puede descargar desde http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.sweetpotatosoftware.com/files/microsoft.vc80.crt.zip (tamaño 577 KB). No necesita registrar ninguno de archivos o hacer nada adicional que colocarlos justo en ese sitio. La estructura de carpetas es la siguiente:

Como puede ver, tanto Microsoft.VC80.CRT como regexp.fll están en la misma carpeta (My Application). Y, dentro de Microsoft.VC80.CRT están los cuatro archivos que he mencionado antes. Esta es la vía para hacerlo en cada FLL que yo libere. (lo cierto es que hay otras formas de hacerlo; pero entonces, tengo que entrar en el tema sobre la carpeta WinSxS y que hacer en las versiones anteriores a Windows XP... la vida es corta)

Utilizar regexp.fll en Visual FoxPro

Lo primero es descargar la FLL en el enlace que aparece al final de este blog y asegurarse de que tiene instaladas las librerías C++ de alguna de las dos formas que describí antes. Entonces, puede empezar a emplearla dentro de Visual FoxPro en sus aplicaciones VFP. La sintaxis es muy sencilla y hay que recordar solamente una función: RegExp(cString, cRegExpression). El parámetro cString es la cadena que desea buscar para la coincidencia y cRegExpression es la expresión regular que desea utilizar al coincidir. RegExp() devolverá .T. para las coincidencias y .F. para las no coincidencias. Puede ayudarle ver el código de ejemplos que muestro a continuación (basta con copiar y pegar en un prg y ejecutarlo)...

CLEAR
*!* Haga que Visual FoxPro sepa de la nueva función
*!* estableciendo la biblioteca regexp.fll
SET LIBRARY TO LOCFILE("regexp.fll","FLL","Locate regexp.fll")
LOCAL lcExpression
*!* Valida direcciones de correo electrónico
lcExpression = "^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$"
? RegExp("john@isp.com",lcExpression)
? RegExp("john@.isp.com",lcExpression)
*!* Valida valores tipo moneda (currency)
lcExpression = "^(\$)?(([1-9]\d{0,2}(\,\d{3})*)|([1-9]\d*)|(0))(\.\d{2})?$"
? RegExp("$1,244,311.81",lcExpression) && Match
? RegExp("$1,24,4311.81",lcExpression) && No Match
*!* Valida días de la semana
lcExpression = "^(Sun|Mon|(T(ues|hurs))|Fri)(day|\.)?$|Wed(\.|nesday)?$|Sat(\.|urday)?$|T((ue?)|(hu?r?))\.?$"
? RegExp("Sunday",lcExpression) && Match
? RegExp("sundae",lcExpression) && No Match
*!* Valida números de teléfono
lcExpression = "^[2-9]\d{2}-\d{3}-\d{4}$"
? RegExp("507-562-0020",lcExpression) && Match
? RegExp("507-56-0020",lcExpression) && No Match
*!* libera la referencia a la biblioteca
SET LIBRARY TO

Documentación sobre RegExp en Boost

Puede encontrar la documentación sobre la sintaxos de RegExp en el sitio web de Boost http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.boost.org/libs/regex/doc/syntax_perl.html (vea que se basa en la sintaxis Perl para expresiones regulares). Puede encontrar además un gran conjunto de ejemplos, información y guías para emplear expresiones regulares en este enlace: http://www.sweetpotatosoftware.com/SPSBlog/ct.ashx?id=91241006-595a-487d-ac06-d0fc1fc71632&url=http://www.google.com/search?hl=en&q=regular+expressions

He aquí el enlace para descargar regexp.fll

He incluido la licencia de Boost y un Readme.txt con esta FLL. No es necesario para distribuirlos con la FLL como biblioteca compilada, sin embargo, yo lo estoy incluyendo para que pueda ver que lo que dice la licencia - el punto básico es, que nosotros lo podemos utilizar libremente con fines comerciales. Si desea más información sobre esta licencia vea: http://www.boost.org/more/license_info.html#requirements

Descarga de regexp.fll (aproximadamente 47 KB) haciendo clic aquí