4D Knowledge Base 4D Stock Stalker

Cálculo del último día de mes

31_julio.jpgGestiones 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)

UltimoDiaDelMes.jpg

La lógica es la siguiente:

  1. 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.

  2. “01/”+String(Month of($1))+”/”+String(Year of($1))

  3. Convertir la cadena del primer día de mes en tipo fecha.

  4. Date (cadena fecha)

  5. 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.

  6. 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

  • ALERT(String(UltimoDiaDelMes (Current date)))

    31_07_07.jpg

  • Funcionará para saber en qué día cae Noche Vieja este año…

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

    31_12_07.jpg

  • Y en años bisiestos, sin riesgo de error

  • ALERT(String(UltimoDiaDelMes (!02/02/08!)))

29_02_08.jpg

Publicado el 12 Julio, 2007 por redaccion | | Imprime este artículo
4D Knowledge Base 4D Stock Stalker

7 Comentarios a “Cálculo del último día de mes”

  1. Franklin Avila dice:

    Lo interesante seria conocer que día de la semana cae fin de mes, es decir
    si es Lunes o Martes o Miercoles o …………..

  2. redaccion dice:

    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))}

  3. Gregorio dice:

    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

  4. redaccion dice:

    ¡Es cierto!

    Pero simplemente hay que cambiar el paso 1:

    String(Month of($1))+”/01/”+String(Year of($1))

  5. Gregorio dice:

    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

  6. Gregorio dice:

    post data: olvide mencionar que funciona para cualquier formato: DD/MM/AA, MM/DD/AA, AA/MM/DD, etc.

  7. redaccion dice:

    ¡Excelente! Gracias por tu contribución :-)

Deja una respuesta