Cálculo del último día de mes
Gestiones como imprimir fechas de pago en sistemas de nóminas y determinar la fecha de vencimiento de una factura requiere calcular el último día de mes, respecto a una fecha cualquiera (fecha de facturación, fecha actual…).
Esto no es demasiado complicado porque se puede calcular esa fecha de varias formas. Sin embargo, provoca mucha más satisfacción intelectual si lo haces con una sola línea de código!
También es adecuado realizar una función genérica que nos sirva en cualquier circunstancia.
Nuestro método genérico titulado UltimoDiaDelMes acepta una fecha como parámetro y retorna la fecha del último día del mismo mes.
El código fuente es el siguiente:
$0:=Add to date(Date(”01/”+String(Month of($1))+”/”+String(Year of($1)));0;1;-1)

La lógica es la siguiente:
-
Calcular primero el primer día del mes de la fecha introducida. Esto es muy sencillo ya que siempre empieza por 1! Se puede construir fácilmente la fecha concatenando una cadena “1/” con el mes y el año de la fecha de referencia.
-
Convertir la cadena del primer día de mes en tipo fecha.
-
Añadir 1 mes a esta fecha y a la vez restarle un día. Esta operación “mágica” la permite el comando Add to date. Es posible de esta forma, sumar “1 mes menos un día”, o sea entre 27 y 30 días según los meses, al primer día del mes.
“01/”+String(Month of($1))+”/”+String(Year of($1))
Date (cadena fecha)
Add to date (primer día del mes;0;1;-1) `0 año, 1 mes, -1 día
Por supuesto, no hace falta que nos preocupemos por el cambio de año incluso en el mes de diciembre, y dejamos el parámetro Año en 0 ya que 4D lo gestiona automáticamente.
Finalmente nos queda llamar la función en cualquier situación:
-
Para determinar la última fecha del mes actual
-
Funcionará para saber en qué día cae Noche Vieja este año…
-
Y en años bisiestos, sin riesgo de error
ALERT(String(UltimoDiaDelMes (Current date)))

ALERT(String(UltimoDiaDelMes (!15/12/07!)))

ALERT(String(UltimoDiaDelMes (!02/02/08!)))
20 Julio, 2007 a las 6:26 pm
Lo interesante seria conocer que día de la semana cae fin de mes, es decir
si es Lunes o Martes o Miercoles o …………..
20 Julio, 2007 a las 7:35 pm
Nada más fácil:
ARRAY TEXT($aDias;7)
$aDias{1}:=”Domingo”
$aDias{2}:=”Lunes”
$aDias{3}:=”Martes”
$aDias{4}:=”Miércoles”
$aDias{5}:=”Jueves”
$aDias{6}:=”Viernes”
$aDias{7}:=”Sábado”
vNombreDia:=$aDias{Day number(UltimoDiaDelMes (Current date))}
21 Julio, 2007 a las 9:03 am
Bueno pero el fallo del código es que sólo funciona cuando el formato de fecha de la configuración regional está en Dia Mes Año (DD/MM/AA), si se cambia a otro formato, el método falla.
Un saludo
21 Julio, 2007 a las 12:07 pm
¡Es cierto!
Pero simplemente hay que cambiar el paso 1:
String(Month of($1))+”/01/”+String(Year of($1))
24 Julio, 2007 a las 7:06 am
Pues la verdad no termina de convercerme eso de cambiar el código para
cada formato de fecha, por ejemplo en un sistema cliente / Servidor,
diferentes máquinas pueden tener diferentes formatos. Es mejor
tener un código universal y es muy sencillo, también en una sola línea:
$0:=Add to date(!00/00/00!;Year of($1);Month of($1)+1;-1)+1
24 Julio, 2007 a las 7:07 am
post data: olvide mencionar que funciona para cualquier formato: DD/MM/AA, MM/DD/AA, AA/MM/DD, etc.
25 Julio, 2007 a las 8:28 pm
¡Excelente! Gracias por tu contribución