30 de septiembre de 2004

WAIT WINDOWS CENTRADO CONTROLADO POR ARGUMENTOS

Un WAIT WINDOW centrado.
? WaitWindowCentrado("Microsoft Visual FoxPro...",0)

FUNCTION WaitWindowCentrado
  LPARAMETERS pcmensaje, pnmodo, pnsegundos, lcarea
  IF pcount()  = 0 OR TYPE("pcmensaje") # "C"
    RETURN("")
  ENDIF
  IF TYPE("pnmodo") # "N"
    pnmodo = 0
  ENDIF
  IF TYPE("pnsegundos") # "N"
    pnsegundos = 1
  ENDIF
  IF TYPE("lcarea") # "C"
    lcarea = "_SCREEN"
  ENDIF
  LOCAL lnfila AS INTEGER, lncolumna AS INTEGER
  LOCAL lnold_scale, lcmodo AS CHARACTER, lcresp AS CHARACTER

  DO CASE
    CASE pnmodo = 0
      lcmodo = ""
    CASE pnmodo = 1
      lcmodo = "NOWAIT"
    CASE pnmodo = 2
      lcmodo = "TIMEOUT pnsegundos"
    OTHERWISE
      lcmodo = ""
  ENDCASE
  lnold_scale = &lcarea..SCALEMODE
  &lcarea..SCALEMODE = 0
  lnfila = &lcarea..HEIGHT / 2
  lncolumna = ( &lcarea..WIDTH / 2 ) - LEN(pcmensaje) / 2
  WAIT WINDOW pcmensaje TO lcresp AT lnfila, lncolumna &lcmodo
  &lcarea..SCALEMODE = lnold_scale
  RETURN(lcresp)
ENDFUNC
NOTA: El 1er parametro es el mensaje, el segundo fijese en el DO CASE, el tercero va junto cuando 'pnmodo' es igual a 2, y el ultimo parametro puede ser _SCREEN o THISFORM por ejemplo.

Jose Matute

14 de septiembre de 2004

Trabajar con fechas y horas en Visual FoxPro


Autor: Luis María Guayán

Este artículo describe las funciones nativas de Visual FoxPro y diversas funciones definidas por el usuario para el tratamiento de expresiones de tipo Date y DateTime.

Introducción

Visual FoxPro posee muchas funciones nativas que generan y manipulan expresiones de tipo Date y DateTime. En este artículo veremos las características de algunas de estas funciones y una recopilación de funciones definidas por el usuario publicadas en PortalFox que nos permitirán obtener diversos resultados a partir de este tipo de expresiones.

Funciones DATE() y DATETIME()

La función DATE() nos retorna la fecha actual del sistema si se ejecuta sin argumentos. Para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la función DATE(nAnio,nMes,nDia) con sus argumentos para crear expresiones de tipo Date.
dFecha = DATE()            && Fecha actual del sistema
dFecha = DATE(2000,03,01)  && 1 de Marzo de 2000 
La diferencia entre dos expresiones de tipo Date nos retorna el número de días transcurridos entre ambas fechas.
? DATE(2004,12,31) - DATE(2004,1,1) 
Si se suman o restan cantidades numéricas de días a una expresión de tipo Date, el resultado es otra expresión de tipo Date.
? DATE() + 7   && La fecha actual mas 7 días
? DATE() - 15  && La fecha actual menos 15 días 
La función DATETIME() nos retorna la fecha y hora actual del sistema si se ejecuta sin argumentos. Al igual que la función DATE() y para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la función DATETIME(nAnio,nMes,nDia,nHoras,nMinutos,nSegundo) con todos sus argumentos para crear expresiones de tipo DateTime.
tFHora = DATETIME()                     

&& Fecha y hora actual del sistema
tFHora = DATETIME(2000,03,01,16,15,30)  && 1 de Marzo de 2000, 16:15:30 horas 
La diferencia entre dos expresiones de tipo DateTime nos retorna el número de segundos transcurridos entre ambas fechas y horas.
? DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0)
NOTA: Debido a un bug con el redondeo en las fracciones de segundos en variables del tipo DateTime es conveniente redondear las diferencias de estas variables con ROUND(lnSeg,0)
? ROUND(DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0), 0)
Si se suman o restan cantidades de segundos a una expresión de tipo DateTime, el resultado es una expresión de tipo DateTime.
? DATETIME() + 60    && Fecha y hora actual mas 60 segundos
? DATETIME() - 3600  && Fecha y hora actual menos 3600 segundos
Si deseamos generar expresiones Date y DateTime "vacías" lo hacemos de la siguiente manera:
dFecha = {}      && Expresion Date 

vacia
dFecha = {//}    && Expresion Date vacia
tFHora = {/:}    && Expresión DateTime vacia
tFHora = {//::}  && Expresión DateTime vacia 
En estos últimos ejemplos, se debe tener en cuenta que la mayoría de los servidores de bases de datos no trabaja con el concepto de fechas "vacías" como lo hace Visual FoxPro. En estos casos se debe utilizar fechas nulas debido a que se tendrán fechas incoherentes y/o no esperadas.
dFecha = .null.
tFHora = .null.

Funciones con expresiones Date y DateTime

Se pueden convertir expresiones de tipo Date a DateTime y viceversa con las funciones DTOT() y TTOD() respectivamente. En el caso de la función DTOT() (al igual que si omitimos los argumentos de horas en la función DATETIME(nAnio,nMes,nDia)) la hora se sustituye por 00:00:00 (12:00:00AM).
dFecha = DATE(2004,06,03)
tFHora = DATETIME(2004,05,18,11,30,45)
? DTOT(dFecha)
? TTOD(tFHora) 
Las siguientes funciones de Visual FoxPro sirven para poder extraer algunos valores de las expresiones Date y DateTime, como el año, el mes, el día, la semana, etc.
dFecha = DATE(2004,06,03)
tFHora = DATETIME(2004,05,18,11,30,45)
? YEAR(dFecha)     && Año de una expresión Date o DateTime
? MONTH(tFHora)    && Mes de una expresión Date o DateTime
? DAY(dFecha)      && Día de una expresión Date o DateTime
? HOUR(tFHora)     && Horas de una expresión DateTime
? MINUTE(tFHora)   && Minutos de una expresión DateTime
? SEC(tFHora)      && Segundos de una expresión DateTime
? DOW(dFecha)      && Número del día de la semana de una expresión Date o DateTime
? WEEK(dFecha)     && Número de semana del año de una expresión Date o DateTime
? QUARTER(tFHora)  && Trimestre del año de una expresión Date o DateTime 
Todas las funciones anteriores retornan valores numéricos.
Otras funciones de Visual FoxPro retornan cadenas de caracteres a partir de expresiones Date o DateTime, como por ejemplo:
dFecha = DATE(2004,06,03)
tFHora = DATETIME(2004,05,18,11,30,45)
? CMONTH(dFecha)  && Nombre del mes de una expresión Date o DateTime
? CDOW(tFHora)    && Nombre del día de la semana de una expresión Date o DateTime
? DMY(tFHora)     && Cadena con el formato día-mes-año de una expresión Date o DateTime
? MDY(tFHora)     && Cadena con el formato mes-día-año de una expresión Date o DateTime
? TTOC(tFHora)    && Convierte una expresión DateTime a caracter 
? DTOC(dFecha)    && Convierte una expresión Date a caracter 
Para retornar una cadena de caracteres solo con la hora de una variable DateTime se utiliza la función TTOC() con el segundo parámetro igual a 2.
? TTOC(DATETIME(),2) 
En Visual FoxPro se puede retornar una fecha con "n" meses anteriores o posteriores de una expresión Date o DateTime con la función GOMONTH().
? GOMONTH(DATE(),3)        

&& Tres meses después a partir de la fecha actual
? GOMONTH(DATETIME(),-12)  && Doce meses anteriores a partir de la fecha y hora actual 

Otras funciones con argumentos de expresiones Date y DateTime


10 de septiembre de 2004

Meses entre 2 fechas

Con esta simple rutina puedes determinar cuantos meses hay entre 2 fechas.
FUNCTION MesesEntreFechas(pdFecha2, pdFecha1)
  LOCAL lnAnio AS INTEGER, lnMes AS INTEGER
  lnAnio = YEAR(pdFecha2) - YEAR(pdFecha1)
  lnMes = MONTH(pdFecha2) - MONTH(pdFecha1)
  RETURN ((lnAnio * 12) + lnMes)
ENDFUNC
Jose Matute