Consulta que cuenta registros, mostrar valores 0 en access

Tengo consulta que cuenta turnos por trabajador pero no me muestra los turnos a cero. ¿Cómo hacerlo?

Ahora:

DNI - TURNO - NUM_VECES
111 - Mañana - 173

Deseado:

DNI - TURNO - NUM_VECES
111 - Tardes - 0
111 - Noches - 0
111 - Mañana - 173

Los tipos de turnos en tablas tipos_turno y los turnos guardados en tabla trabajadores_turno, ambas relacionadas mediante campo id_turno.

2 Respuestas

Respuesta
1

De consultas no te hablo, porque, personalmente, no me gustan. Prefiero hacerlo con código VB. De todas formas, no entiendo la pregunta pero... Si tengo la tabla TipoTurno como

No le veo ninguna necesidad de un Id, ya que como su nombre indica es un índice útil cuando son muchos registros y si aún encima es Autonumérico para saber que un registro se introdujo antes de otro. Pero siendo sólo tres, es preferible declarar el campo Turno como clave.

También tengo la tabla Turnos como

Aquí si quieres puedes ponerle un Id. Y tengo una tabla Aux exactamente igual. Con la tabla Turnos construyo un formulario

Puedes ver que el cursor aún está en Numveces. Cuando pulso Enter

Y a medida que voy poniendo valores en el formulario( en este caso al dni 111 le anoto algo por la tarde)

Con lo que la tabla Aux me la deja como

Es decir, en caso de que ese DNI ya esté en la tabla me actualiza los valores.

Pero ya te digo que no consigo adivinar que es lo que quieres.

En este caso, el código se lo he puesto en el evento Después de actualizar del control NumVeces

Private Sub NumVeces_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
Dim b As Integer, c As Integer, d As Integer
b = Nz(DSum("numveces", "turnos", "turno=""Mañana"" and dni='" & Me.DNI & "'"))
c = Nz(DSum("numveces", "turnos", "turno=""Tarde"" and dni='" & Me.DNI & "'"))
d = Nz(DSum("numveces", "turnos", "turno=""Noche"" and dni='" & Me.DNI & "'"))
If Nz(DCount("*", "aux", "dni='" & Me.DNI & "'")) = 0 Then
DoCmd.RunSQL "insert into aux(dni,turno,numveces)values('" & Me.DNI & "',""Mañana"",=" & b & ")"
DoCmd.RunSQL "insert into aux(dni,turno,numveces)values('" & Me.DNI & "',""Tarde"",=" & c & ")"
DoCmd.RunSQL "insert into aux(dni,turno,numveces)values('" & Me.DNI & "',""Noche"",=" & d & ")"
Else
DoCmd.RunSQL "update aux set numveces=" & b & " where dni='" & Me.DNI & "' and turno=""Mañana"""
DoCmd.RunSQL "update aux set numveces=" & c & " where dni='" & Me.DNI & "' and turno=""Tarde"""
DoCmd.RunSQL "update aux set numveces=" & d & " where dni='" & Me.DNI & "' and turno=""Noche"""
End If
End Sub

En esencia, que si ese dni no está en la tabla auxiliar que cree los tres registros y que si ya está que los actualice.

Respuesta
1

Yo lo veo desde otro punto de vista no se puede partir de los datos ya agrupados, es decir, 111 Mañana 23, sino que supongo se toman de la agrupación que se haga en la tabla trabajadores_turno.

TABLAS

Si es importante el idturno, toda vez que es mejor trabajar con campos numéricos y además se van a relacionar con la tabla trabajadores_turno.

TABLA CONSOLIDADO 

CONSULTA CONSOLIDADO

CÓDIGO DE LA FUNCIÓN

Public Function full_outer_join()
 'Procesa un Full Outer Join ya que no existe en Access
 Dim rs1 As DAO.Recordset
 Dim cta1 As Integer
 Dim cta2 As Integer
 Dim cta3 As Integer
 Dim strSQl As String
 CurrentDb.Execute "DELETE FROM tem_turnos"
  strSQl = "SELECT trabajadores_turno.dni" & vbCrLf
  strSQl = strSQl & "        FROM trabajadores_turno" & vbCrLf
  strSQl = strSQl & "    GROUP BY trabajadores_turno.dni" & vbCrLf
  strSQl = strSQl & "    ORDER BY trabajadores_turno.dni;"
   Set rs1 = CurrentDb.OpenRecordset(strSQl)
    Do Until rs1.EOF
       cta1 = Nz(DCount("[dni]", "trabajadores_turno", "idturno=1" & " AND dni='" & rs1!DNI & "'"))  'Mañana
       CurrentDb.Execute "INSERT INTO tem_turnos(dni,idturno,cantidad) VALUES('" & rs1!DNI & "'" & ",1," & cta1 & ")"
       cta2 = Nz(DCount("[dni]", "trabajadores_turno", "idturno=2" & " AND dni='" & rs1!DNI & "'")) 'Tarde
       CurrentDb.Execute "INSERT INTO tem_turnos(dni,idturno,cantidad) VALUES('" & rs1!DNI & "'" & ",2," & cta2 & ")"
       cta3 = Nz(DCount("[dni]", "trabajadores_turno", "idturno=3" & " AND dni='" & rs1!DNI & "'")) 'Noche
       CurrentDb.Execute "INSERT INTO tem_turnos(dni,idturno,cantidad) VALUES('" & rs1!DNI & "'" & ",3," & cta3 & ")"
       cta1 = 0: cta2 = 0: cta3 = 0
      rs1.MoveNext
    Loop
    rs1.Close
    Set rs1 = Nothing
End Function

Puede sustituir la función por un procedimiento y llamarlo desde un botón de comando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas