27 de febrero de 2004

Soluciones para Comprimir Archivos (.ZIP) con Visual FoxPro

Una actividad casi fundamental de las aplicaciones de Base de Datos es hacer respaldos de la información, una de las opciones más viables es dejarlos en formato .ZIP, hay varias maneras de poder hacerlo, aquí te presentamos como...

Para poder crear archivos .ZIP, lo que te recomendaría es utilizar una DLL o ActiveX, aquí te comento sobre varias gratuitas, cada una de ellas tiene su propia documentación.

--- EEVA ZIPMASTER---
http://www.eetasoft.ee/zipmaster.htm

--- SAWZipNG ---
http://users.skynet.be/saw/

Si no te hace falta comprimir con contraseñas, este te puede valer
http://www.xstandard.com/download/x-zip.zip

La documentación:
http://www.xstandard.com/page.asp?p=C9891D8A-5390-44ED-BC60-2267ED6763A7

--- Zip it ---
http://www.ketoan-fas.com/download/zipit.zip

--- Artículo "Comprime/Descomprime ZIPs" de FoxPress ---
http://www.fpress.com/revista/Num1103/Truco.htm


--- ZBit zip-unzip component lite --- [Agregado 29/Marzo/2004]
http://www.zbitinc.com/product.asp?prodid=2

Pero si quieres algo mas profesional puedes optar por las opciones de pago, con esto, se incluyen más métodos, mejores interfaces y claro, el soporte del fabricante:

--- Xceed ZipLibray ---
http://www.xceedsoft.com/products/ZipCompL/

o

--- DynaZip ---
http://www.dynazip.com

Tambien existe uno mas, el compañero E. Paredes lo recomienda:

--- Abale ZIP component ---
http://www.abale.com

Todas las anteriores opciones han sido probadas por la comunidad de Visual FoxPro, es decir, si funcionan con la herramienta, y han sido recopiladas de los mensajes que se mandan al newsgroup de microsoft: microsoft.public.es.vfoxpro.* , así como también un servidor las ha comprobado.

Espero te sirva.

------------------------------------
Espartaco Palma Martínez

23 de febrero de 2004

Días hábiles entre 2 fechas

Función para determinar días hábiles en un periodo de fechas, no cuenta los sábados ni domingos ni días festivos entre semana.

Tiene una tabla para capturar los días festivos, si no captura información en esta tabla la función tendrá un error de calculo por tal razón hay que tener esta tabla con datos correctos y actuales y tener un campo índice principal de fecha.
FUNCTION diashab(fecha1,fecha2)
  LOCAL num AS INTEGER
  * validando entrada de fechas
  IF (!EMPTY(EVALUATE('fecha1'))) AND (!EMPTY(EVALUATE('fecha2')))
    * validando fechas
    IF fecha1 < fecha2
      * numero de dias habilies
      num=0
      * dias entre 2 fechas
      dias=(fecha2-fecha1)+1
      * para sumar un dia a la fecha inicial
      feccom=fecha1
      * habre la tabla con las fechas de dias festivos (libres)
      IF !USED('diainabil')
        rut_nom=LOCFILE('diainabil','dbf')
        USE &rut_nom ALIAS diainabil IN 0 ORDER fechaini
      ENDIF
      SELECT diainabil
      * contando los dias habiles
      FOR i=1 TO dias
        * contando sin incluir a sabados y domingos
        IF !INLIST(DOW(feccom),1,7)
          num=num+1
        ENDIF
        * restando las fechas de dias libres entre semana.
        IF SEEK(feccom) AND INLIST(DOW(feccom),2,3,4,5,6)
          num=num-1
        ENDIF
        *incrementa la fecha
        feccom=feccom+1
      ENDFOR
      * retorna el numero de dias habiles entre esas fechas
      USE IN diainabil
      RETURN num
    ELSE
      * eror en fecha
      RETURN .F.
    ENDIF
  ELSE
    * error en tipo de datos
    RETURN .F.
  ENDIF
ENDFUNC

Emmanuel Nuñez Sanchez

6 de febrero de 2004

Ejecuto un EXE de VFP y finaliza instantáneamente

¿Quién no ha leído preguntas de este tipo alguna vez en el grupo de noticias?: "...cuando lo ejecuto se abre y cierra el programa y no da ningún tipo de error..." o "...funciona bien en el entorno de programación, pero al hacerlo ejecutable abre y cierra..." o "...al hacer doble clic sobre el ejecutable se cierra el programa automaticamente..." son frecuentes en distintos foros de Visual FoxPro.

Esto ocurre porque en nuestro programa principal debemos añadir un bucle de eventos para esperar los eventos del usuario, tales como un click de ratón o la pulsación de una tecla.

Un bucle de eventos comienza con un comando READ EVENTS y finaliza con un comando CLEAR EVENTS que retorna el control al programa que inició el bucle de eventos.

Si no incluimos en nuestro programa principal un comando READ EVENTS, el programa se ejecutará correctamente desde la ventana comandos de Visual FoxPro, pero cuando ejecutamos la aplicación desde el archivo EXE generado, esta aparecerá durante unos instantes y finalizará.

Una estructura de un programa principal deberia disponer los siguientes puntos:

  1. Establecer las configuraciones iniciales, inicializar variables, abrir bases de datos, etc.
  2. Establecer la interface inicial ejecutando un menú o un formulario.
  3. Establecer un bucle de eventos ejecutando el comando READ EVENTS.
  4. Establecer la finalización del bucle de eventos desde la opción Salir del menú o el botón Salir del formulario con el comando CLEAR EVENTS.
  5. Terminar el programa cerrando las bases de datos, liberando variables, etc.

El código de un programa principal siguiendo los pasos anteriores seria:
*-----------------
*-- Principal.prg
*-----------------
*-- Configuraciones iniciales
DO Inicio.prg
*-- Mostrar la interface inicial
DO MenuPrincipal.MPR  &&  Menú principal
*- ó 
DO FORM FormPrincipal  && Formulario principal
*-- Iniciar el bucle de eventos
READ EVENTS
*-- Terminar el programa
DO Termina.prg

Recordar que el menú (en su opción Salir) o el formulario principal (en el botón Salir o en el método Destroy) deben incluir el comando CLEAR EVENTS para finalizar el bucle de eventos. Al ejecutar CLEAR EVENTS la ejecución del programa continúa en la línea siguiente al comando READ EVENTS.

Un breve ejemplo

El siguiente ejemplo es un programa que:
  1. Genera el archivo EJEMPLO.PRG que muestra un formulario principal como formulario de nivel superior e inicia un bucle de eventos. La finalización del bucle de eventos está alojada en el método Destroy del formulario.
  2. Crea y construye el proyecto EJEMPLO.PJX estableciendo como principal a EJEMPLO.PRG.
  3. Crea y genera el archivo ejecutable EJEMPLO.EXE a partir del proyecto EJEMPLO.PJX.

LOCAL lc
SET SAFETY OFF
TEXT TO lc NOSHOW 
*-- Inicio del programa Ejemplo.prg
LOCAL loForm AS FORM
_SCREEN.VISIBLE = .F.
loForm = CREATEOBJECT('FormPrincipal')
loForm.SHOW
MESSAGEBOX("Se iniciará el bucle de eventos",64, "READ EVENTS")
READ EVENTS
MESSAGEBOX("Terminó el bucle de eventos",64, "CLEAR EVENTS")
_SCREEN.VISIBLE = .T.
RETURN

DEFINE CLASS FormPrincipal AS FORM
  CAPTION = "Ejemplo de un bucle de eventos"
  SHOWWINDOW = 2
  AUTOCENTER = .T.
  HEIGHT = 480
  WIDTH = 640
  ADD OBJECT cmdSalir AS COMMANDBUTTON WITH ;
    CAPTION = "Salir", ;
    HEIGHT = 40, WIDTH = 100, ;
    TOP = 400, LEFT = 500

  PROCEDURE cmdSalir.CLICK
    RELEASE THISFORM
  ENDPROC

  PROCEDURE DESTROY
    CLEAR EVENTS
  ENDPROC

  PROCEDURE CLICK
    WAIT WINDOWS "Evento click en el formulario" NOWAIT
  ENDPROC
ENDDEFINE

*-- Fin de Ejemplo.prg
ENDTEXT

*-- Genero el PRG, PJX y EXE
STRTOFILE(lc,"Ejemplo.prg")
BUILD PROJECT Ejemplo.pjx FROM Ejemplo.prg
BUILD EXE Ejemplo.EXE FROM Ejemplo.pjx
MESSAGEBOX("Ahora ejecute el archivo EJEMPLO.EXE generado.",64,"Aviso")

Ejecutamos el archivo EJEMPLO.EXE que generamos con el código arriba descrito y comprobamos que el bucle de eventos queda esperando los eventos del usuario (en este caso el evento "Click" en el formulario).

Hasta la próxima,

Luis María

4 de febrero de 2004

Generar archivos .RAR desde linea de comandos con RAR32 para DOS

A veces no queremos que nuestros usuarios tengan instalado el WinRar o el WinZip y entonces decide escribir la presente rutina.

local qrar
qrar="rar32.exe a c:\midirectorioxls\miarchivo.rar *.xls"
set defa to c:\midirectorioxls
run/N7 &qrar
messagebox("Compactar el archivo  en formato rar",48)
wait windows "compactando datos  en archivo rar" nowait noclear
do while (FindWindow (0, "c:midirectorioxlsrar32.exe") > 0)
enddo
clear WINDOWS
set defa to c:\mydefault
Detalles:

Agregando /N7 permite poner inactiva y minimizada la ventana dos para saber cuando termina el proceso uso findwindow explicada en hilos anteriores y pregunto si existe el caption del form c:\midirectorioxls\rar32.exe que es el que vfp en este caso.

El rar32.exe, emx.exe y rsx.exe deben estar en la carpeta donde estan los datos, por eso ademas cambio en set dafault a dicha carpeta y luego recupero el que corresponde ya que sino no encuentra dichos archivos, otra opcion es ponerlos en el root o en windowssystem.

El rar32.exe lo pueden bajar desde www.rarlab.com

Espero le sirva.

Hernan Perez Tonini

2 de febrero de 2004

Comentarios en nuestros programas

Agregue comentarios en sus programas para aumentar la legibilidad del código.

Una buena práctica de programación es comentar el código de nuestros programas. Esto nos ayudará a una mejor comprensión de código escrito en el pasado y mas aun si el código es compartido por un equipo de desarrollo de varias personas.

En Visual FoxPro existen varias formas de comentar nuestro código.

Quizás la forma mas conocida es iniciar una línea con el caracter " * " (asterisco) que nos indica el comienzo de una línea de comentarios no ejecutable en nuestro archivo de programa.

Ejemplo:
* Esto es un comentario de nuestro código
Otra forma similar es utilizar el comando " NOTE ", que también nos indica el comienzo de una línea de comentarios no ejecutable en nuestro código.

Ejemplo:
NOTE Esto es una línea de comentario
Otro comando que podemos utilizar para nuestros comentarios es " && "que indica que a continuación aparece un comentario en línea.

Ejemplo:
lnMes = 1
DO WHILE lnMes <= 12 && Ciclo de 12 meses
  lnMes = lnMes + 1
ENDDO && WHILE lnMes <= 12
La inserción de comentarios en línea para indicar el final de los comandos de programación estructurados IF ... ENDIF, DO WHILE ... ENDDO, CASE ... ENDCASE y FOR ... ENDFOR mejora significativamente la legibilidad del código.

Todas estas formas admiten el " ; " (punto y coma) al final de la línea de comentarios, que indica que el comentario continua en la linea siguiente

Ejemplo:
* Esto es un comentario que abarca ;
  dos líneas

NOTE Esto es una línea de comentarios que ;
  continua en la siguiente línea

IF DAY(DATE()) = 1 && Si es el primer día del ;
  mes se ejecuta el siguiente código
  ? "Primer día del mes"
ENDIF && DAY(DATE()) = 1
Otra buena práctica de programación es colocar texto al inicio de nuestros programas o funciones con datos como: nombre, autor, fecha, descripción, etc.

A partir de VFP8 tenemos la Caja de Herramientas (Toolbox) que nos permite tener plantillas de fragmentos de textos (text scrap) para añadir a nuestros programas con solo arrastrar y soltar (drag & drop). Por ejemplo podemos tener el siguiente fragmento de texto en el Toolbox para comenzar nuestros procemientos o funciones:

*---------------------
* PROCEDURE / FUNCTION
*---------------------
* Autor......:
* Fecha......: <<DATE()>>
* Descripción:
* Uso........:
* Parámetros.:
* Retorno....:
*---------------------
Con solo arrastrar y soltar el fragmento de texto desde el Toolbox a nuestro archivo de programa, este aparecerá escrito. En el fragmento de texto podemos tener texto de funciones o expresiones rodeados por delimitadores de combinación de texto (Ej: <<DATE()>>) que se evaluarán si en las propiedades del fragmento de texto (text scrap) marcamos la casilla de verificación "Evaluar usando text merge".

Luis María Guayán