27 de diciembre de 2001

Conversion de numeros a letras (pesetas y euros)

A lo peor un poco tarde ... pero aqui está ...

Es una modificación a la función enviada por Luis Maria Guayan, pero esta acepta Euros y Pesetas, distingue el genero (masculino o femenino) de la moneda y tiene alguna pequeña corrección.
**********************************************************************
*
* Funcion: Num2Let
*
* Convierte un numero a letras. Valido para Euros y Pesetas
*
* Sintaxis:
*
*        =Num2Let(tnNumero, tlEuro, tnDecimales)
*
* Parametros:
*
*        tnNumero = Número a convertir
*        tlEuro (si se devuelve en Euros .T. o Pesetas .F.)
*        tnDecimales (numero de decimales, por defecto 2)
*
* Ejemplos:
*
*       = Num2Let(125.21, .T.)
*       = Num2Let(63241, .F.)
*
* Retorno:
*
*        El numero en caracter
*
* Nota:
*
* Creación           : Luis Maria Guayan
* Ultima Modificacion: 27/12/2001 Juan Encinar, Oscar Fariña, Pablo Roca
**********************************************************************
FUNCTION Num2Let(tnNumero,tlEuro,tnDecimales)
  LOCAL lnEntero, lnFraccion,lcRet
  lcret = ''
  IF PCOUNT()<2
     tlEuro = .T.
  ENDIF
  IF tnNumero<0
     lcret = 'MENOS '
     tnNumero=ABS(tnNumero)
  ENDIF
  
  IF type("tnDecimales") = "L"
     tnDecimales = 2
  ENDIF
  
  lnEntero   = INT(tnNumero)
  lnFraccion = INT((tnNumero - lnEntero) * 10^tndecimales)
  
  lcret = lcret+N2L(lnEntero, .T., tlEuro) + IIF(MOD(lnEntero,1000000)=0 AND lnEntero > 0,' DE ','')+;
  IIF(tlEuro,IIF(lnEntero=1,'UN EURO','EUROS'),IIF(lnEntero=1,'UNA PESETA','PESETAS'))+;
  IIF(lnFraccion > 0,' CON '+ ;
  N2L(lnFraccion, .T., .T.) + IIF(lnFraccion=1,'UN CENTIMO','CENTIMOS'),'')
  RETURN lcret
ENDFUNC

*--------------------------------
* FUNCTION N2L(tnNro, tlBandera, tlMasculino)
*--------------------------------
* Convierte un número entero en letras
* Usada por Let2Num (deben estar ambas)
* USO: ? N2L(1032) -> "MIL TREINTA Y DOS"
* PARAMETROS: lnNro = Número a convertir
*           : tlBandera (solo para diferenciar cuando retorna "UNO" o "UN")
*           : tlMasculino (para diferenciar si la moneda es genero masculino .T. / femenino .F.)
* RETORNA: Caracter
* AUTOR: LMG
* modificada por Juan Encinar, Oscar Fariña, Pablo Roca 27/12/2001
*--------------------------------
FUNCTION N2L(tnNro, tlBandera, tlMasculino)
  LOCAL lnEntero, lcRetorno, lnTerna, lcMiles, ;
    lcCadena, lnUnidades, lnDecenas, lnCentenas,lcCadena2
    
  lcCadena2 = ''
  lnEntero  = INT(tnNro)
  lcRetorno = ''
  lnTerna = 1
  DO WHILE lnEntero > 0
    lcCadena = ''
    lnUnidades = MOD(lnEntero, 10)
    lnEntero   = INT(lnEntero / 10)
    lnDecenas  = MOD(lnEntero, 10)
    lnEntero   = INT(lnEntero / 10)
    lnCentenas = MOD(lnEntero, 10)
    lnEntero   = INT(lnEntero / 10)

    *--- Analizo la terna
    DO CASE
      CASE lnTerna = 1
        lcMiles = ''
      CASE lnTerna = 2 AND (lnUnidades+lnDecenas+lnCentenas # 0)
        lcMiles = 'MIL '
      CASE lnTerna = 3 
        lcMiles = IIF(lnUnidades = 1 AND lnDecenas = 0 AND ;
          lnCentenas = 0, 'UN MILLON ', 'MILLONES ')
      CASE lnTerna = 4 AND (lnUnidades+lnDecenas+lnCentenas # 0)
        lcMiles = 'MIL '
      CASE lnTerna = 5 AND (lnUnidades+lnDecenas+lnCentenas # 0)
        lcMiles = IIF(lnUnidades = 1 AND lnDecenas = 0 AND ;
          lnCentenas = 0, 'BILLON ', 'BILLONES ')
      CASE lnTerna > 5
        lcRetorno = ' ERROR: NUMERO DEMASIADO GRANDE '
        EXIT
    ENDCASE

    *--- Analizo las unidades
    DO CASE
      CASE lnUnidades = 1
      IF !(allt(str(tnNro)) $ "100,1000,1000000,1000000000")
         IF tlMasculino
            lcCadena = IIF(lnTerna = 1 AND NOT tlBandera, 'UNO ', IIF(lnCentenas#0 or lnDecenas#0,'UN ',' '))
         ELSE
            if lnterna = 1
               lcCadena = 'UNA '
            else
               lcCadena = IIF(lnCentenas#0 or lnDecenas#0,'UN'+IIF(lnTerna < 3,'A ',' '),'')
            endif
            
         ENDIF
      ENDIF
      
      CASE lnUnidades = 2
        lcCadena = 'DOS '
      CASE lnUnidades = 3
        lcCadena = 'TRES '
      CASE lnUnidades = 4
        lcCadena = 'CUATRO '
      CASE lnUnidades = 5
        lcCadena = 'CINCO '
      CASE lnUnidades = 6
        lcCadena = 'SEIS '
      CASE lnUnidades = 7
        lcCadena = 'SIETE '
      CASE lnUnidades = 8
        lcCadena = 'OCHO '
      CASE lnUnidades = 9
        lcCadena = 'NUEVE '
    ENDCASE

    *--- Analizo las decenas
    DO CASE
      CASE lnDecenas = 1
        DO CASE
          CASE lnUnidades = 0
            lcCadena = 'DIEZ '
          CASE lnUnidades = 1
            lcCadena = 'ONCE '
          CASE lnUnidades = 2
            lcCadena = 'DOCE '
          CASE lnUnidades = 3
            lcCadena = 'TRECE '
          CASE lnUnidades = 4
            lcCadena = 'CATORCE '
          CASE lnUnidades = 5
            lcCadena = 'QUINCE '
          OTHER
            lcCadena = 'DIECI' + lcCadena
        ENDCASE
      CASE lnDecenas = 2
        lcCadena = IIF(lnUnidades = 0, 'VEINTE ', 'VEINTI') + lcCadena
      CASE lnDecenas = 3
        lcCadena = 'TREINTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 4
        lcCadena = 'CUARENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 5
        lcCadena = 'CINCUENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 6
        lcCadena = 'SESENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 7
        lcCadena = 'SETENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 8
        lcCadena = 'OCHENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      CASE lnDecenas = 9
        lcCadena = 'NOVENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
    ENDCASE

    *--- Analizo las centenas
    
    lcCadena2 = ''
    DO CASE
      CASE lnCentenas = 1
        lcCadena2 = IIF(lnUnidades = 0 AND lnDecenas = 0, ;
          'CIEN ', 'CIENTO ') 
      CASE lnCentenas = 2
        lcCadena2 = 'DOSCIENTOS ' 
      CASE lnCentenas = 3
        lcCadena2 = 'TRESCIENTOS ' 
      CASE lnCentenas = 4
        lcCadena2 = 'CUATROCIENTOS ' 
      CASE lnCentenas = 5
        lcCadena2 = 'QUINIENTOS ' 
      CASE lnCentenas = 6
        lcCadena2 = 'SEISCIENTOS ' 
      CASE lnCentenas = 7
        lcCadena2 = 'SETECIENTOS ' 
      CASE lnCentenas = 8
        lcCadena2 = 'OCHOCIENTOS ' 
      CASE lnCentenas = 9
        lcCadena2 = 'NOVECIENTOS ' 
    ENDCASE
   IF lnTerna < 3 
      lcCadena2 = IIF(tlMasculino,lcCadena2,STRTRAN(lcCadena2,'TOS','TAS'))
   ENDIF
   lcCadena  = lcCadena2+lcCadena

    *--- Armo el retorno terna a terna
    lcRetorno = lcCadena+lcMiles+lcRetorno
    lnTerna = lnTerna + 1
  ENDDO
  IF lnTerna = 1
    lcRetorno = 'CERO '
  ENDIF
  RETURN lcRetorno
ENDFUNC

*--------------------------------
Pablo Roca

20 de diciembre de 2001

Creando un programa Instalador de una aplicación de Visual FoxPro usando InstallShield Express

Autor: Mike Stewart
Traducido por: Raul Licona


Sumario
InstallShield Express - Visual FoxPro Limited Edition provee una manera fácil e intuitiva para empaquetar y distribuir tus aplicaciones de Visual FoxPro. Usando la tecnología compresiva y flexible para instalaciones de InstallShield Express para Windows Installer, puedes crear un proyecto Instalador o paquete, incluyendo archivos específicos con sus propiedades, y entonces distribuir los archivos de la aplicación desde el Instalador.

Contenido
  • Introducción
  • Preparando tu aplicación para la distribución
  • Creando el programa Instalador usando InstallShield Express
  • Distribuyendo tu aplicación
  • Escenarios de distribución de Visual FoxPro
  • Información adicional
Introducción
InstallShield Express usa Microsoft Windows Installer, el cual hace posible a los usuarios el instalar y configurar sus productos y aplicaciones eficientemente. Windows Installer es parte de Windows 2000 y Windows Cero Administración que ofrecen para reducir todos los costos de desarrollo, uso y manejo de computadoras de escritorio.

Este documento no significa que sea un reemplazo de la documentación de InstallShield Express, la cual debes leer primero. Es meramente un suplemento para asistir a los desarrolladores de Visual FoxPro en el uso de InstallShield Express para empaquetar y distribuir las aplicaciones. Para más información de las opciones de InstallShield, observa la documentación de InstallShield Express.

Nota: Puedes usar cualquier programa de creación de Instaladores que use la tecnología Windows Installer para crear paquetes Instaladores .msi o .msm.

Hay varios elementos que debes considerar antes de preparar la distribución de tu aplicación. Debes identificar la estructura de tu aplicación, decidir como será enviada a los usuarios, y decidir cual será la mejor organización de tu programa Instalador. Cuando todos los elementos hayan sido identificados estarás listo para distribuir tus aplicaciones de Visual FoxPro.

Para distribuir las aplicaciones de Visual FoxPro 
  1. Genera un archivo de aplicación o ejecutable. Para más información sobre el tema de generar una aplicación, vea "Compilando una Aplicación" en la Ayuda en línea de Visual FoxPro.
  2. Crea un directorio de distribución que contenga todos los archivos que un usuario debe tener para correr la aplicación.
  3. Crea un paquete Instalador usando un programa que utilice Windows Installer, como puede ser InstallShield Express - Visual FoxPro Limited Edition.
  4. Empaca y distribuye tus discos de aplicación y cualquier documentación impresa. Dependiendo del programa de creación Instalador que uses, el programa debe crear el disco imagen por ti, o tal vez tener una copia de los archivos para realizar una instalación manualmente.
Para usar InstallShield Express - Visual FoxPro Limited Edition, debes instalar los componentes desde la página de Instalación de Visual FoxPro 7.0 (VFPStart) localizada en el directorio raíz del CD de Visual FoxPro 7.0. Para información adicional sobre InstallShield Express observa la documentación en línea de InstallShield Express.

Preparando tu aplicación para la distribución
Antes de que puedas distribuir tus aplicaciones, debes generar un archivo de aplicación con una extensión .app, un archivo ejecutable con extensión .exe, o un componente COM con extensión .dll.
Previo a la generación de tu aplicación, asegúrate que tu proyecto incluya los archivos necesarios para tu aplicación, tanto como los archivos de recursos, como archivos de gráficas y plantillas. Para más información sobre los tipos de archivos que puedes incluir en tu aplicación, observa "Incluyendo Recursos en la Aplicación" en la Ayuda en línea de Visual FoxPro.

El ambiente de desarrollo de Visual FoxPro contiene muchas características y archivos que han sido licenciados solo para tu uso. Si tu aplicación contiene cualquiera de estas características o archivos, debes de eliminarlas de tu aplicación antes de la creación de tu programa Instalador. Para una lista de archivos redistribuible, observa Redist.txt, localizado en tu directorio de Visual FoxPro y en "Removiendo Características y Archivos Restringidos de Visual FoxPro" en la Ayuda en línea de Visual FoxPro.

Cuando escoja el tipo de construcción que quiere crear, considere el tamaño final del archivo de aplicación y cuales usuarios tienen instalado Visual FoxPro en sus computadoras.
  • Archivo de aplicación (.app) Este archivo requiere que el usuario tenga una copia instalada de Visual FoxPro. Un archivo .app comúnmente es más pequeño que un archivo .exe.
  • Archivo ejecutable (.exe) Este archivo incluye el cargador de Visual FoxPro, así el usuario no requiere que tenga instalado Visual FoxPro.
  • Archivo servidor COM (.dll) Usado para crear un archivo que puede ser llamado por otras aplicaciones.
Nota Un servidor COM también puede tener la extensión .exe.

Algunos escenarios de distribución tal vez requieran fusionar módulos aparte de los archivos de tiempo de ejecución de Visual FoxPro. Para más información, observa "Escenarios de distribución de Visual FoxPro" mas adelante en este documento.

Asegurando un correcto comportamiento en tiempo de ejecución
Un archivo de aplicación ejecutable siempre comprueba la presencia de la librería de tiempo de ejecución de Visual FoxPro, vfp7r.dll. Para ejecutar un archivo de aplicación .exe usando la versión de desarrollo de Visual FoxPro, debes forzar la aplicación a usar el archivo en lugar del archivo VFP7.exe de Visual FoxPro. Para más información, observa "Asegurando un correcto comportamiento en tiempo de ejecución" en la Ayuda en línea de Visual FoxPro.

Creando el programa Instalador usando InstallShield Express
El primer paso en la creación de tu programa Instalador es la creación del proyecto Instalador. La Instalación creada con InstallShield Express está basada en un archivo de proyecto (.ism). Este archivo almacena toda la lógica e información necesaria para construir tu archivo Instalador (.msi) compatible con Windows Installer.

Para crear un proyecto Instalador
  1. Abre InstallShield Express.
  2. En el menú File haz clic en New. La caja de dialogo New Project aparecerá.
  3. Escribe o examina la ruta y nombre del archivo de tu nuevo proyecto en el campo Project Name and Location.
  4. Haz clic en OK.

Tamaño completo de una carpeta

Una comoda manera de saber el tamaño completo de una carpeta
LOCAL loFSO, loFolder
loFSO = CREATEOBJECT("Scripting.FileSystemObject")
loFolder = loFSO.GetFolder("c:\Windows")
? loFolder.Size()