20 de octubre de 2011

Funciones de fechas definidas por el usuario

Un resumen de diversas funciones de fecha definidas por el usuario que complementan las funciones de Fecha que provee Visual FoxPro.

A lo largo de mi vida como desarrollador, fui acumulando diversas funciones definidas por el usuario, para distintos tipos de necesidades. En el caso de Fechas he recopilado varias funciones, (algunas fueron ya publicadas en el artículo Trabajar con fechas y horas en Visual FoxPro) que se fueron mejorando por distintos participantes de los foros que yo participo.

Aquí un resumen de funciones referidas a Meses:

* Números de días del mes (Number Days Of Month)
? nDoM(DATE(2012,2,1))

FUNCTION nDoM(tdFecha)
  RETURN DAY(GOMONTH(DATE(YEAR(tdFecha),MONTH(tdFecha),1),1)-1)
ENDFUNC 
* Principio del mes (Begin Of Month)
? BoM(DATE())

FUNCTION BoM(tdFecha)
  RETURN DATE(YEAR(tdFecha),MONTH(tdFecha),1)
ENDFUNC 
* Fin de mes (End Of Month)
? EoM(DATE())

FUNCTION EoM(tdFecha)
  RETURN GOMONTH(DATE(YEAR(tdFecha),MONTH(tdFecha),1),1)-1
ENDFUNC 
*- Fin del trimestre (End Of Quarter)
? EOQ(DATE())

FUNCTION EOQ(tdFecha)
  RETURN GOMONTH(DATE(YEAR(tdFecha),CEILING(MONTH(tdFecha)/3)*3,1),1)-1
ENDFUNC
Las siguientes funciones retornan la fecha de un día específico, como por ejemplo el primer lunes de enero, o el último domingo de febrero

*-- Tercer Domingo de Octubre de 2011
? OrdDOW(3,1,10,2011)

FUNCTION OrdDOW(tnOrd,tnDow,tnMonth,tnYear)
  * tnOrd:   1=Primero, 2=Segundo, 3=Tercero, ...
  * tnDow:   1=Domingo ... 7=Sabado
  * tnMonth: 1=Enero ... 12=Diciembre
  * tnYear:  1900 ... 9999
   RETURN DATE(tnYear,tnMonth,1)+tnOrd*7- ;
      DOW(DATE(tnYear,tnMonth,1)+tnOrd*7-1,tnDow)
ENDFUNC
* Último Miercoles de Octubre de 2011
? LastDOW(4,9,2011)

FUNCTION LastDOW(tnDow,tnMonth,tnYear)
  * tnDow:   1=Domingo ... 7=Sabado
  * tnMonth: 1=Enero ... 12=Diciembre
  * tnYear:  1900 ... 9999
  LOCAL ld
  ld = GOMONTH(DATE(tnYear,tnMonth,1),1)-1
  RETURN ld - (DOW(ld) - tnDow) % 7
ENDFUNC
Luis María Guayán