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

Respuesta
1

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.

¡Gracias! esta perfecto!!

con razón no encontré nada, veo que es algo con bastante programación.

Ya lo probé y me funciona perfecto!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas