¿Como obtener la cantidad de días de un mes determinado en Access?

Mi nombre es Agustin soy Contador Público de Argentina. Tengo una duda para aquellos que conocen de cerca las funciones de Access.

Necesito que access me devuelva la cantidad de días de un determinado mes o bien que me devuelva el último día del mes en cuestión que para la finalidad es lo mismo. Soy liquidador de sueldos de empresas, hago derecho laboral. Entonces a mi sistema le tengo que indicar cuantos días tiene el mes que estoy "liquidando" para que me divida el sueldo por la cantidad de días del mes.

Al momento de trabajar, yo tengo en mi sistema una función que es "mliq()" la cual me devuelve el número del mes que yo estoy liquidando, por ejemplo, si la fecha de liquidación es 15/04/2020 el sistema de devuelve con esa formula 4, por más que en mi sistema/computadora la fecha en la que lo hago sea 20/05/2020.

Entonces la pregunta en cuestión es, ¿de qué manera puedo hacer para indicarle a Access que si es 04 es decir (Abril) me de 30 días, y si es 05 (Mayo) me de 31?

2 Respuestas

Respuesta
1

Vamos a suponer que en un formulario tienes un campo FechaVenta donde está registrada una fecha. En otro cuadro de texto, al que para el ejemplo llamaremos PrimerDia para saber el primer día del mes de fechaVenta, en las propiedades del PrimerDia-Datos-Origen del control pon

=SerieFecha(Año([fechaventa]);Mes([fechaventa]);1)

Para saber el último dia de ese mes, en el cuadro de texto, lo mismo que el anterior, pero pones

=SerieFecha(Año([fechaventa]);Mes([fechafechaventa])+1;0)

Por último vamos a suponer que tienes un cuadro de texto llamado DuracionMes, lo mismo que antes pero en su origen de control lo pones como

=1+SerieFecha(Año([fechaventa]);Mes([fechafechaventa])+1;0)-SerieFecha(Año([fechaventa]);Mes([fechaventa]);1)

Va todo seguido pero la línea no dá para más.

Pero si me permites un consejo, yo lo haría en código VB y dejaría libre el origen del control de cada cuadro de texto.

Respuesta
2

Tienes muchas formas de hacerlo:

Por ejemplo, en la web de Emilio Sancha tienes ejemplos de ello usando la función DateSerial: http://www.mvp-access.es/emilio/Access/Fechas.asp

'*******************************************************************************
'* DiasEnMes
'* función que calcula el número de días del mes de la fecha pasada como
parámetro
'* o en su defecto la actual
'* Argumentos: opcional datFecha => cualquier dato considerable como fecha
'* uso: DiasEnMes("01/02/2000")  /  DiasEnMes(Date)  /  DiasEnMes(37933)
'* ESH 08/11/03 19:06
'*******************************************************************************
Function DiasEnMes(Optional datFecha As Date) As Integer
If datFecha = "0:00:00" Then datFecha = Date
DiasEnMes = Day(DateSerial(Year(datFecha), Month(datFecha) + 1, 0))
End Function      ' DiasEnMes

También podrías hacer una función que te devuelva el número de días"a saco", ya que salvo febrero (y hay fórmulas para saber si es bisiesto o no), los días el mes son fijos, por ejemplo ésta, sacada de aquí https://groups.google.com/forum/#!topic/microsoft.public.es.excel/MiITBWOeiE8:

Function ULTIMODIA(mes, year)
If year >= 0 Then
    'verificando que el año sea bisiesto
    If year Mod 4 = 0 And (year Mod 100 <> 0 Or year Mod 400 = 0) Then
        bisiesto = 1
    Else
        bisiesto = 0
    End If
    'verificando que el mes se encuentre entre 1 y 12
    If mes <= 12 Or mes >= 1 Then
        If mes = 1 Or mes = 3 Or mes = 5 Or mes = 7 Or mes = 8 Or mes = 10 Or mes = 12 Then
            ULTIMODIA = 31
        End If
        If mes = 4 Or mes = 6 Or mes = 9 Or mes = 11 Then
            ULTIMODIA = 30
        End If
        If bisiesto = 1 And mes = 2 Then
            ULTIMODIA = 29
        End If
        If bisiesto = 0 And mes = 2 Then
            ULTIMODIA = 28
        End If
    End If
    If mes > 12 Or mes < 1 Then
        MsgBox "Corrige el número del mes"
    End If
Else
    MsgBox "Ingrese un año válido"
End If
End Function

Otra opción sería calculando la diferencia de días entre el 1 del mes que quieres saber y el 1 del mes siguiente...

Sveinbjorn El Rojo, gracias por tu respuesta antes que nada.

Te comento que utilice la función que mencionas en un principio 

Day(DateSerial(Year(datFecha), Month(datFecha) + 1, 0))

Entiendo totalmente, pero el sistema no me devuelve lo que yo necesito. En el campo "datFecha" ingreso la función "mliq()" que me devuelve el mes en número y en cuestión. 
Yo necesito que Access vaya a mliq(), vea que es 4, Abril, y por ende me devuelva 30, 31 si es 5 igual a Mayo... me logro explicar? 

Veo que no has entendido mi respuesta...

A la función DiasEnMes (o solo en la expresión que usas, en "datFecha") le tienes que pasar una fecha entera (año mes y día), no el número de mes que te devuelve miliq(). Pero la puedes usar así tal cual si le pasas como fecha el día 1 del mes que te devuelve miliq(), así, porque supongo que querrás trabajar con el año en curso:

DiasEnMes(DateSerial(Year(Date), miliq(), 1))

O usando lo que pones:

Day(DateSerial(Year(Date), Month(miliq()) + 1, 0))

Sveinbjorn El Rojo, nuevamente gracias por tu tiempo.

He logrado comprender un poco de lo que intentas decirme, te adjunto una imagen para que observes. Mi sistema me da siempre el mismo resultado independientemente de lo que mliq() le diga, siempre el resultado es 31... sea mes 03 o 04 o 05. Siempre me larga 31.

Te adjunto una captura en donde podes ver, en "diseño de formula" yo necesito expresar una función que devuelva el número de días del mes en el que estoy liquidando y expreso en "mes de liquidación". La función mliq() me devuelve el mes que yo cargo en "mes de liquidación", pero no logro configurar una función en "diseño de formula" para que me de la cantidad de días de ese mes en cuestión.
Yo al liquidar sueldos, necesito que el sistema detecte de acuerdo a la fecha que yo escribo en "mes de liquidación" y sepa cuantos días tuvo ese mes.

Pero al probar lo que vos me dijiste, tal como se puede observar, me devuelve 31 siempre.

Paso a paso:

1º/ Crea un módulo nuevo y en él pega la función:

'*******************************************************************************
'* DiasEnMes
'* función que calcula el número de días del mes de la fecha pasada como
parámetro
'* o en su defecto la actual
'* Argumentos: opcional datFecha => cualquier dato considerable como fecha
'* uso: DiasEnMes("01/02/2000")  /  DiasEnMes(Date)  /  DiasEnMes(37933)
'* ESH 08/11/03 19:06
'*******************************************************************************
Function DiasEnMes(Optional datFecha As Date) As Integer
If datFecha = "0:00:00" Then datFecha = Date
DiasEnMes = Day(DateSerial(Year(datFecha), Month(datFecha) + 1, 0))
End Function      ' DiasEnMes

2º/ Suponiendo que el cuadro de texto con la etiqueta "Mes de liquidación" se llama txtMesLiquidación, y en el mismo formulario está donde quieres calcular el número de días, simplemente pon:

=DiasEnMes([txtMesLiquidacion])

Si donde quieres el número de días está en otro formulario:

=DiasEnMes(Formularios!NombreFormularioMenuLiquidacion![txtMesLiquidacion])

Si la fecha de liquidación al tienes en una tabla:

=DiasEnMes(DLookUp("NombreCampo";"NombreTabla")

Y no te hace falta usar mliq() para nada.

Y en la imagen no veo dónde te devuelve los 31 días...

Claro, no lo podes ver porque es el en recibo de sueldo final en donde figura la cantidad de días del mes y los días trabajados.

Te comento que finalmente pude solucionarlo de la siguiente manera:

Day(DateSerial(Year(date()),Month(fliq()) + 1, 0))

fliq() toma la fecha completa del campo "mes de liquidación". El sistema detecta si es bisiesto o no, en este caso cuando cargue en "mes de liquidación" 15/02/2020, me arrojo el valor de 29.

Desde ya, agradezco mucho tu atención y la ayuda brindada!

Gracias!!! Saludos.

Me alegra ver que lo has resuelto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas