Consulta con varios resultados Access

Tengo un tabla que guarda dni, la fecha y el turno de cada día del año. Quiero poder consultar una fecha con turno F (fiesta) y, al mismo tiempo un día anterior y día posterior con otros turnos especificados pero que se den las tres condiciones. ¿Cómo sería en access? Por ejemplo: quiero con fecha 27/06/2022 y dni 12345678A me de los tres registros: el 27 que tenga F (fiesta) y el dia anterior 26 T (Tarde) y el posterior 28 N (Noche) y que se den las tres condiciones (que no sea OR sino AND) o sino nada. ¿Me explico?

Respuesta
1

Lo puedes hacer de muchas formas. Lo que sería conveniente es que respondieras a

1º ¿Y si, por ejemplo, el DNI 22222222B el 27 no tiene Fiesta?

2º ¿Dónde y como quieres verlo?

Por ejemplo, tengo la tabla Turnos(por comodidad sólo le pongo un DNI)

En un formulario cualquiera le pongo un combinado donde sólo me muestra aquellas fechas en que el turno sea fiesta( lógicamente antes tendríamos que poner un combinado para elegir el DNI y que el combinado sólo mostrara aquellas fechas de ese DNI en que Turno sea F) y dos cuadros de texto Anterior y Posterior. Si selecciono el 17/06/2022

Me dice el día y el turno que le corresponde a ese día. En este caso, pero ya te dije que es importante que digas como lo quieres ver, el código del evento Después de actualizar del combinado ElegirFecha es

Private Sub ElegirFecha_AfterUpdate()
Anterior = DLookup("fechaturno", "turnos", "fechaturno=#" & Me.ElegirFecha & "#-1") & ", " & DLookup("turno", "turnos", "fechaturno=#" & Me.ElegirFecha & "#-1")
POSTERIOR = DLookup("fechaturno", "turnos", "fechaturno=#" & Me.ElegirFecha & "#+1") & ", " & DLookup("turno", "turnos", "fechaturno=#" & Me.ElegirFecha & "#+1")
End Sub

Muy buenas y gracias por la rápida respuesta.

1.- Si el 27 no tiene F ya no seguimos.

2.- Se podría hacer igual pero únicamente en una consulta o sentencia SQL de access ???

Gracias.

Como te decía, en el origen de la fila del combinado elegir, ya sólo me muestra aquellas fechas( te recuerdo lo del DNI) donde Turno=F, por tanto no aparecerían aquellas fechas que no tuvieran F

Para hacerlo con SQL ya te han puesto un ejemplo, pero si me permites, opinión mía, siempre que puedas haz las cosas en código VB, es infinitamente más versátil.

2 respuestas más de otros expertos

Respuesta
1

Se puede hacer de muchas formas, pero haciéndolo bien. Si tengo siguiente tabla

Diseño  la siguiente consulta utilizando la función validaturno()

Obtengo el siguiente resultado

Si el resultado es -1 (True) indica que el turno cumple las condiciones.

FUNCIÓN VALIDATURNO()

Public Function validaturno(mfecha As Date, sdni As String) As Boolean
  Dim intTarde As Integer
  Dim intNoche As Integer
  Dim intFiesta As Integer
  ' 1- Validar que exista el turno F
   intFiesta = DCount("*", "tblturnos", "dni='" & sdni & "'" & " AND fechaturno=" & "#" & Format(mfecha, "mm/dd/yyyy") & "#" & " AND turno='F'")
   If intFiesta = 0 Then
     validaturno = False
     Exit Function
   End If
  ' 2 - Validar que existan el turno día anterior y que sea T, día siguiente y que sea N
   intTarde = DCount("*", "tblturnos", "dni='" & sdni & "'" & " AND fechaturno=" & "#" & Format(mfecha - 1, "mm/dd/yyyy") & "#" & " AND turno='T'")
   intNoche = DCount("*", "tblturnos", "dni='" & sdni & "'" & " AND fechaturno=" & "#" & Format(mfecha + 1, "mm/dd/yyyy") & "#" & " AND turno='N'")
   If intFiesta = 1 And intTarde = 1 And intNoche = 1 Then
    validaturno = True
   Else
    validaturno = False
   End If
End Function

La función se debe guardar en un módulo. Si en lugar de -1 quiere la palabra "Verdadero"  y 0 por  "Falso" debe cambiar el retorno de la función Boolean  por String y True por "Verdadero" y False por "Falso".

Buenas noches, es perfecto. Con ésto ya saldría del paso aunque ¿existe la opción de hacerlo directamente mediante consulta SQL sin usar la función validaturno()? Gracias.

Dudo se puede hacer con la cuadricula de Access. Le dejo esta función con SQL, en mi caso si la utilizo porque en PostgreSQL no puedo utilizar las funciones de Access como DCOUNT()

Public Function validaSQL(mfecha As Date, sdni As String) As Boolean
Dim strSQl As String
Dim strFecha As String
Dim strFecha2 As String
Dim strFecha3 As String
Dim rs As Recordset
strFecha = "#" & Format(mfecha, "mm/dd/yyyy") & "#"
strFecha2 = "#" & Format(mfecha - 1, "mm/dd/yyyy") & "#"
strFecha3 = "#" & Format(mfecha + 1, "mm/dd/yyyy") & "#"
  strSQl = "SELECT tblturnos.dni" & vbCrLf
  strSQl = strSQl & "           , tblturnos.fechaturno" & vbCrLf
  strSQl = strSQl & "           , tblturnos.turno" & vbCrLf
  strSQl = strSQl & "        FROM tblturnos" & vbCrLf
  strSQl = strSQl & "       WHERE tblturnos.dni='" & sdni & "'" & vbCrLf
  strSQl = strSQl & "         AND tblturnos.fechaturno=" & strFecha & vbCrLf
  strSQl = strSQl & "         AND tblturnos.turno='" & "F'" & " UNION" & vbCrLf
  strSQl = strSQl & "             SELECT tblturnos.dni" & vbCrLf
  strSQl = strSQl & "           , tblturnos.fechaturno" & vbCrLf
  strSQl = strSQl & "           , tblturnos.turno" & vbCrLf
  strSQl = strSQl & "        FROM tblturnos" & vbCrLf
  strSQl = strSQl & "       WHERE tblturnos.dni='" & sdni & "'" & vbCrLf
  strSQl = strSQl & "         AND tblturnos.fechaturno=" & strFecha2 & vbCrLf
  strSQl = strSQl & "         AND tblturnos.turno='" & "T'" & " UNION" & vbCrLf
  strSQl = strSQl & "             SELECT tblturnos.dni" & vbCrLf
  strSQl = strSQl & "           , tblturnos.fechaturno" & vbCrLf
  strSQl = strSQl & "           , tblturnos.turno" & vbCrLf
  strSQl = strSQl & "        FROM tblturnos" & vbCrLf
  strSQl = strSQl & "       WHERE tblturnos.dni='" & sdni & "'" & vbCrLf
  strSQl = strSQl & "         AND tblturnos.fechaturno=" & strFecha3 & vbCrLf
  strSQl = strSQl & "         AND tblturnos.turno='" & "N'" & ";"
  Set rs = CurrentDb.OpenRecordset(strSQl)
  If rs.RecordCount = 3 Then
    validaSQL = True
  Else
    validaSQL = False
  End If
  rs.Close
  Set rs = Nothing
End Function

Ejemplo de llamada:

¿

? ValidaSQL("13/06/2022","12245678A") . La función valida que la consulta haya devuelvo los 3 registros, en este caso, retorna True, sino retorna False.

De acuerdo con la tabla del ejemplo retorna Verdadero

Ahora, puede insertar los valores en una tabla o crear una consulta por código con algunos cambios. Por ejemplo

Respuesta
1

Las condiciones y la verificación en la ventana de inmediato:
La unidad para las fechas es el día, a una fecha se le pueden sumar días directamente

UnaFecha = Date el dia de referencia
Jornada_mañana="N"  este dato esta en la tabla (pero no tengo la tabla)
Jornada_Hoy = "F"    este dato esta en la tabla (pero no tengo la tabla)
Jornada_ayer = "T"    este dato esta en la tabla (pero no tengo la tabla)
Tbl_Dia = Date    este dato esta en la tabla (pero no tengo la tabla)

Las fechas:
?unafecha -1, unafecha, unafecha +1 ===> 26/06/2022      27/06/2022      28/06/2022

?tbl_dia -1 = Unafecha -1 And Jornada_ayer ="T" ==> Verdadero
?tbl_dia = Unafecha And Jornada_Hoy ="F" ==> Verdadero
?tbl_dia +1 = Unafecha +1 And Jornada_mañana ="N" ==> Verdadero

Todas a la vez:
?(tbl_dia -1 = Unafecha-1 And Jornada_ayer ="T") And (tbl_dia = Unafecha And Jornada_Hoy ="F") And (tbl_dia +1 = Unafecha+1 And Jornada_mañana ="N") ==> Verdadero

Como se apreciara, las condiciones se evalúan de forma independiente (se resuelven los paréntesis) y tras ello se evalúan las respuestas obtenidas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas