30 de diciembre de 2003

Validar RUC (Registro Único de Contribuyentes de Perú)

Con esta rutina podemos validar el RUC (Registro Único de Contribuyentes) emitido por la SUNAT (Superintendencia Nacional de Administración Tributaria).

Solo para Perú.
? ValidRucSunat("20372706288")

FUNCTION ValidRucSunat(lcNroRuc)
  IF LEN(ALLTRIM(lcNroRuc)) <> 11 THEN
    RETURN .F.
  ENDIF
  LOCAL aArrayRuc
  DIMENSION aArrayRuc(3,11)
  FOR i = 1 TO 11
    aArrayRuc(1,i)=VAL(SUBS(lcNroRuc,i,1))
  ENDFOR
  aArrayRuc(2,1)=5
  aArrayRuc(2,2)=4
  aArrayRuc(2,3)=3
  aArrayRuc(2,4)=2
  aArrayRuc(2,5)=7
  aArrayRuc(2,6)=6
  aArrayRuc(2,7)=5
  aArrayRuc(2,8)=4
  aArrayRuc(2,9)=3
  aArrayRuc(2,10)=2
  aArrayRuc(3,11)=0
  FOR i=1 TO 10
    aArrayRuc(3,i)  = aArrayRuc(1,i)  * aArrayRuc(2,i)
    aArrayRuc(3,11) = aArrayRuc(3,11) + aArrayRuc(3,i)
  ENDFOR
  lnResiduo   = MOD(aArrayRuc(3,11),11)
  lnUltDigito = 11 - lnResiduo
  DO CASE
    CASE lnUltDigito = 11 OR lnUltDigito=1
      lnUltDigito = 1
    CASE lnUltDigito = 10 OR lnUltDigito=0
      lnUltDigito = 0
  ENDCASE
  IF lnUltDigito = aArrayRuc(1,11) THEN
    RETURN .T.
  ELSE
    RETURN .F.
  ENDIF
ENDFUNC
Saludos.....

NavaSoft S.A.C.

7 de diciembre de 2003

La importancia de las rutas en VFP

Artículo original: The importance of Paths in VFP
http://weblogs.foxite.com/andykramek/archive/2005/03/21/197.aspx
Autor:Andy Kramek
Traducido por: Ana María Bisbé York


Uno de los problemas que he visto con mayor frecuencia en los foros es cómo trabaja VFP con los archivos. Sobre este punto el Administrador de proyectos es una bendición y una maldición, ambas cosas. Una bendición porque, una vez que trabajamos desde el Administrador de proyecto, el controla por nosotros los aspectos relacionados con encontrar y abrir archivos . Una maldición, porque somos de la tendencia a olvidar que VFP requiere internamente de rutas. Una pregunta frecuente es algo así:

Cuando llamo desde el Administrador de programas mi formulario abre sus tablas; pero si lo hago por programa, me abre el cuadro de diálogo Buscar. ¿Qué está mal?

La respuesta es, por supuesto, que VFP no ha recibo la ruta de búsqueda. Aunque nunca lo he visto formalmente documentado, parece ser que VFP tiene un método muy estricto cuando se le pide encontrar algo. Por ejemplo al llamar a una función VFP verifica primero el programa que se está ejecutando actualmente, luego otros programas en memoria, luego el directorio actual, luego los directorios que están en su propia ruta de búsqueda y finalmente la ruta de búsqueda de Windows. De forma similar, cuando buscamos por un nombre de tabla con referencia incompleta (por ejemplo: USE account, a diferencia de USE C:\Myfiles\account.dbf), busca primero en la carpeta seleccionada actualmente, luego entre su propia ruta y finalmente en la ruta de búsqueda de Windows.

Vea que las carpetas de su propia ruta se verifican siempre antes que el nivel del sistema operativo. La importancia de esto es que cuando le asigna a VFP su propia ruta de búsqueda, buscará los archivos sin tener que ir a través del sistema operativo - claramente será mucho más eficiente ya que la ruta necesita incluir solamente aquellos lugares que son estrictamente relevantes para VFP.

El directorio predeterminado

En ausencia de cualquier otra información Visual FoxPro utiliza la unidad y el directorio actualmente seleccionados como su "ruta" y podrá restablecer esta configuración utilizando simplemente:

SET PATH TO

Sin embargo, para aplicaciones más sofisticadas, y ciertamente para el desarrollo, tendrá una estructura de directorios y debe establecer siempre la ruta de búsqueda adecuada que incluya todos los directorios requeridos. Lo primero que debe hacer es establecer el directorio predeterminado y existen varias formas (como siempre) para hacerlo:

  • Especificar Default en al Archivo de configuración (CONFIG) utilizando DEFAULT = <ruta al directorio>
  • Establecer la ruta predeterminada directamente en el código utilizando SET DEFAULT TO <ruta al directorio>
  • Cambiar de directorio interactivamente utilizando SET DEFAULT TO (GetDir()). (Los comandos 'CD' (o 'CHDIR') se pueden utilizar para cambiar tanto la unidad como el directorio a una localización especificada).

¡Ajá! LOCFILE() cambia la ruta.

Observe que utilizando las funciones "Get" o "Put" (ejemplo GetDir()) generalmente no cambia ni el directorio predeterminado ni la ruta. La excepción a esta regla es una característica aparentemente no documentada (en VFP) de la función LOCFILE() la que agrega la carpeta seleccionada a la ruta de búsqueda de VFP como muestra el siguiente código:

*** Limpia la ruta
SET PATH TO
? SET( 'path' ) && Devuelve nada
USE LOCFILE( 'account' )  && Localiza un archivo
? SET( 'path' ) && Devuelve C:\Projects\Data

Este comportamiento ha formado parte del lenguaje al menos desde FoxPro 2.6W y es interesante, está documentada en la Ayuda de FoxPro 2.6W de esta forma:

El diálogo Open (Abrir) puede ser utilizado para localizar un archivo. Al escoger un archivo del diálogo, se devuelve el nombre del archivo con la ruta, la cual es agregada a la ruta de FoxPro.

Sin embargo, parece que en la creación del fichero de ayuda de VFP la última frase se perdió y continúa perdida en el fichero de ayuda de VFP 9.0 (vea abajo), incluso, como podemos ver, este comportamiento aun se aplica.

El diálogo Open (Abrir) puede ser utilizado para localizar un archivo. Al escoger un archivo del diálogo, se devuelve el nombre del archivo con la ruta.

Utilizar el comando SET PATH

Establecer la ruta es de por sí, simple. Es necesario solamente utilizar el comando SET PATH seguido por la lista de directorios que desea incluir. No es necesario indicar las rutas enteras para los subdirectorios, es suficiente con separarlos por comas o puntos y comas. El ejemplo muestra una ruta de búsqueda típica en la ruta de Visual FoxPro.

SET PATH TO G:\VFP90;C:\VFP90\PROJECTS\;DATA;FORMS;LIBS;PROGS;UTILS

Para recuperar la configuración de la ruta actual, puede utilizar la función SET (que trabajará con la mayoría de los comandos SET de Visual FoxPro) como se muestra debajo. Puede asignar el resultado directamente a una variable o, como se muestra debajo, directamente al portapapeles para que pueda pegar la ruta actual en un programa o archivo de documentación:

_ClipText = SET('PATH')

Visual FoxPro permite el uso de ambas configuraciones UNC para nombrar rutas, como:

\\SERVERNAME\DIRECTORYNAME\

y permite el uso de espacios embebidos (cuando se encierran entre comillas)  en nombres de directorio como:

"..\COMMON DIRECTORY\"

Aunque, se permite el último caso, yo suscribo el principio de que "aunque puede utilizar espacios embebidos, el arsénico es más rápido" (a propósito, se aplica lo mismo para nombres de ficheros) Aunque mejoran lalegibilidad, los espacios pueden causar además problemas al tratar de controlar los nombres de archivos y los directorios por programa y pienso aun que el mejor consejo es evitar tanto como sea posible en las aplicaciones. Por ejemplo, el siguiente código trabaja perfectamente para nombres convencionales de directorios; pero falla si el directorio tiene espacios embebidos:

LOCAL lcDir
lcDir = GETDIR()
IF ! EMPTY(lcDir)
  SET DEFAULT TO &lcDir
ENDIF

VFP 9.0 introdujo la cláusula ADDITIVE al comando SET PATH para permitir que fragmentos de ruta sean agregados dinámicamente (interesantemente, es lo que  el LOCFILE() ya venía haciendo desde siempre)

Determinar la configuración actual

Afortunadamente, Visual FoxPro, nos brinda varias funciones que nos ayudan a localizar dónde nos encontramos en cada momento:

  • SYS(2004) devuelve el directorio desde el que se ha iniciado Visual FoxPro; pero en tiempo de ejecución en una aplicación distribuida., será siempre la localización de la DLL runtime (que es normalmente la versión adecuada del directorio 'System' de Window.
  • HOME() devuelve el directorio por defecto desde el que se ha iniciado Visual FoxPro; pero tiene varias opciones útiles adicionales.
  • _VFP.FULLNAME accede a la propiedad del objeto aplicación de Visual FoxPro que contiene la ruta entera y el nombre de fichero que fue utilizado para iniciar VFP.
  • FULLPATH('') o FULLPATH(CURDIR()) devuelve toda la unidad y la ruta del directorio actual (incluyendo la barra final "\")
  • SYS(5) devuelve la unidad predeterminada (incluyendo los dos puntos ":")
  • CD (trabaja solamente de forma interactiva en la ventana de comandos) muestra la unidad y carpeta actual en la ventana de salida actual - pero también cambia la unidad y el directorio, todo en un único comando.
  • CHDIR cambia la unidad o directorio especificado (igual que CD); pero no informa del estado actual (y no provoca desorden en sus formularios).
  • CURDIR() devuelve el directorio actual (con la barra final "\"); pero no la unidad.
  • SYS(2450) introducido en VFP 8.0 controla si una aplicación busca internamente antes de acceder a la ruta de búsqueda externa.

Establecer la ruta

Generalmente, yo utilizo el siguiente tipo de código en mis programas de inicio para asegurarme de que siempre tengo el conjunto de rutas apropiadas - tanto en tiempo de desarrollo como en la aplicación EXE compilada.

IF VERSION(2) = 0
  *** Inicio en tiempo de ejecución, solamente: Inicio de VFP  + Directorio actual + "\DATA" 
  lcPath = HOME() + ";" + ADDBS( FULLPATH( CURDIR() )) + "DATA"
ELSE
  *** Inicio en tiempo de diseño - toda la ruta del entorno de desarrollo
  lcPath = HOME() + ";" + ADDBS( FULLPATH( CURDIR() )) + ";FORMS;LIBS;DATA;PROGS;UTILS"
  *** Deseamos configurar asserts ON en modo de desarrollo
  SET ASSERTS ON
ENDIF
SET PATH TO (lcPath)

Vea que diferencia entre las rutas necesarias para el desarrollo y las rutas más simplificadas para la implementación en tiempo de ejecución.