Cómo filtrar fin de semana en Access ?
Estoy trabajando una consulta y necesito filtrar en mi consulta los registros del sábado y domingo de la semana actual, pero no lo he logrado.
le agregué un campo a la consulta DiaSemama: ConvCadena(Format([FechaNac];"dddd");3) y me muestra el día de la semana .
El problema que tengo es que si coloco en los filtros "Sábado" o "Domingo" me va a filtrar todos los registros con esos días y en mi caso solo necesito los de la semana actual y así con las siguientes semanas.
De antemano agradezco si me pueden ayudar, ya que hasta el momento no encuentro la forma de hacerlo
1 Respuesta
Le preparé este ejemplo, consta de:
1. Tabla
1. Formulario
2. Consultas
1 módulo de vba
TABLA
FORMULARIO
En el formulario al cambiar la "Fecha Inicial", mediante una función obtengo la fecha del domingo y sábado, se entiende que la semana va de Domingo a Sábado. Esta información sirve para construir una consulta.
Resultado consulta con base en el formulario
Observe que efectivamente solo obtengo las ventas del 1/08/2021 (domingo) hasta el 7/082021 (sábado), a pesar que tomé como fecha de la semana el día 3/08/2021 pero realmente sería fecha de la semana, toda vez, que la semana va desde el día 1 al 7.
Diseño de la consulta con base en el formulario.
Acá hago referencia al formulario que llamo frmDatos. Esto lo hice si quisiera tomar los datos de un formulario, pero se puede hacer directamente en la consulta, en este caso se debe llamar la función.
Diseño de la consulta sin formulario
Observe como llamo la función sab_dom(). Esta función retorna la fecha del Domingo o Sábado con base en una fecha.
Código del evento después de actualizar del control fecha semana
Private Sub ctlFecha_AfterUpdate() Me.ctlDesde = sab_dom(2, Me.ctlFecha) Me.ctlHasta = sab_dom(1, Me.ctlFecha) End Sub
Observe como hago la llamada de la función, le paso 2 para indicar que quiero obtener la fecha del domingo correspondiente a la fecha de la semana más el campo de la fecha, 1 es para obtener el sábado de la fecha.
CÓDIGO DEL BOTÓN VER RESULTADO DEL FORMULARIO
Private Sub btnVer_Click() DoCmd.OpenQuery "qryResultadoConFormulario" End Sub
CÓDIGO DE LA FUNCION SAB_DOM()
Public Function sab_dom(ByVal intDia As Byte, Optional ddate As Date) As Date 'Función para obtener la fecha del sábado o domingo de la semana actual con base 'en la fecha dada o fecha del sistema 'Elaborado por: Eduardo Pérez Fernández 'Fecha : 31/08/2021 'Parametros: ' intDia= 1, retorna la fecha del sabado fin de semana ' intDia= 2, retorna la fecha del domingo fin de semana ' ddagte= La fecha de la semana, si se omite asigna la del sistema 'NOTA: ' Se considera la semana de Domingo dia=1 hasta el sábado día=7 'Ejemplos: ' ' ?sab_dom(1,"30/08/2021") Sábado de la semana del 29/08/2021 (domingo) al 4/09/2021 (sábado) Retorna 4/09/2021 ' ' ?sab_dom(2,"30/08/2021")Domingo de la semana del 29/08/2021 (domingo) al 4/09/2021 (sábado) Retorna 29/08/2021 Dim dfecha As Date Dim ndia As Byte If CLng(ddate) = 0 Then dfecha = Date Else dfecha = ddate End If ndia = Weekday(dfecha) 'Numero dia fecha Select Case ndia Case 1 'Domingo If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 6 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha End If Case 2 'Lunes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 5 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 1 End If Case 3 'Martes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 4 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 2 End If Case 4 'Miércoles If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 3 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 3 End If Case 5 'Jueves If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 2 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 4 End If Case 6 ' Viernes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 1 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 5 End If Case 7 'sábado If intDia = 1 Then 'retorne el sábado sab_dom = dfecha ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 6 End If End Select End Function
Pueden existir otras soluciones, pero está me funcionó. Si quiere el ejemplo lo puede solicitar a [email protected], favor en el asunto anotar la consulta.
Modifiqué la función para poder elegir el primer día de la semana, en el código anterior solo consideraba el primer día de la semana como Domingo.
Código con un tercer parámetro para elegir primer día de la semana
Public Function sab_dom(ByVal intDia As Byte, Optional ddate As Date, Optional intPrimerDia As Byte) As Date 'Función para obtener la fecha del sábado o domingo de la semana actual con base 'en la fecha dada o fecha del sistema 'Elaborado por: Eduardo Pérez Fernández 'Fecha : 31/08/2021 'Edición : Se adicionó el parámetro IntPrimerDia para determinar el primer día de la semana 'Parametros: ' intDia= 1, retorna la fecha del sabado fin de semana ' intDia= 2, retorna la fecha del domingo fin de semana ' ddagte= La fecha de la semana, si se omite asigna la del sistema ' intPrimerDia= 1 para Domingo primer día de la semana y 2 para Lunes primer día de la semana, si se omite se toma 1 'Ejemplos: ' ' ?sab_dom(1,"30/08/2021") Sábado de la semana del 29/08/2021 (domingo) al 4/09/2021 (sábado) Retorna 4/09/2021 ' ' ?sab_dom(2,"30/08/2021")Domingo de la semana del 29/08/2021 (domingo) al 4/09/2021 (sábado) Retorna 29/08/2021 Dim dfecha As Date Dim ndia As Byte If CLng(ddate) = 0 Then dfecha = Date Else dfecha = ddate End If If intPrimerDia = 0 Then intPrimerDia = 1 End If If intPrimerDia = 1 Then ndia = Weekday(dfecha, vbSunday) 'Numero dia fecha y se considera el primer día de la semana Domingo Else ndia = Weekday(dfecha, vbMonday) 'Numero dia fecha y se considera el primer día de la semana Domingo End If If intPrimerDia = 1 Then 'Primer dia de la semana Domingo Select Case ndia Case 1 'Domingo If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 6 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha End If Case 2 'Lunes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 5 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 1 End If Case 3 'Martes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 4 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 2 End If Case 4 'Miércoles If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 3 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 3 End If Case 5 'Jueves If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 2 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 4 End If Case 6 ' Viernes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 1 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 5 End If Case 7 'sábado If intDia = 1 Then 'retorne el sábado sab_dom = dfecha ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha - 6 End If End Select Else 'Primer dia es Lunes Select Case ndia Case 1 'Domingo If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 5 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 6 End If Case 2 'Lunes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 4 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 5 End If Case 3 'Martes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 3 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 4 End If Case 4 'Miércoles If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 2 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 3 End If Case 5 'Jueves If intDia = 1 Then 'retorne el sábado sab_dom = dfecha + 1 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 2 End If Case 6 ' Viernes If intDia = 1 Then 'retorne el sábado sab_dom = dfecha ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha + 1 End If Case 7 'sábado If intDia = 1 Then 'retorne el sábado sab_dom = dfecha - 1 ElseIf intDia = 2 Then 'retorne domingo sab_dom = dfecha End If End Select End If End Function
Ejemplo de llamada en la ventana de inmediato:
?sab_dom(2,"06/09/2021",2)
12/09/2021
Le digo a la función que me retorne el Domingo de la semana para la fecha lunes 6 de septiembre de 2021 y me dice que el domingo se cumple el día 12 de septiembre de 2021.
Explicación:
1er parámetro 2, indica quiero el Domingo
2do parámetro fecha de la semana
3er parámetro 2. quiero como primer día de la semana el Lunes.
Es lógico que cambia la llamada en el formulario y en las consultas del ejemplo, basta con adicionar el tercer parámetro.
- Compartir respuesta