Selección de horas disponibles para cierto día en un cuadro de lista y que no se repitan

nuevamente Sveinb...

Acudo nuevamente a ti para lo siguiente:

Hace unos días te hice una consulta sobre programación de teclas en un campo Memo lo cual quedo solucionado. Gracias de antemano.

Hoy tengo otra petición.

Habrá alguna manera de que en un cuadro de lista, solo me de la hora disponible de acuerdo a ese día.

Ejemplo:

Fecha: [xx/xx/xx] Hora: ________ <- Aquí mediante un cuadro de lista seleccione solo la hora que este disponible para ese día, esto indica que, las horas que vayan siendo ocupadas no estarán disponibles (para ese día) así evito duplicidad (por lo regular uso intervalos de 30mins) o alguna otra sugerencia.

1 respuesta

Respuesta
1

Prueba con este código, aunque yo lo hice para un cuadro combinado, que así queda en el formulario el valor guardado en la tabla, cosa que con el cuadro de lista no conseguí:

Private Sub Hora_Enter()
'Declaramos las variables
Dim db As Database
Dim rst As Recordset
Dim miSQL As String
Dim miFecha As Date
Dim i As Integer, j As Integer, que As Integer
Dim miHora As String
Dim horaLibre As Boolean
'Borramos las horas que pudiera haber en el origen para evitar duplicados
Me.Hora.RowSource = ""
Me.Refresh
'Cogemos la fecha del formulario
miFecha = Me.Fecha.Value
'Creamos la consulta que nos dará las horas ocupadas de esa fecha
miSQL = "SELECT TPacientes.Hora FROM TPacientes WHERE (((TPacientes.Fecha)=#" & miFecha & "#))"
Set db = CurrentDb
Set rst = db.OpenRecordset(miSQL, dbOpenDynaset)
If rst.RecordCount = 0 Then 'Si no hay registros en esa consulta es porque están todas libres
For i = 8 To 14
For j = 0 To 30 Step 30
miHora = Format(i, "00") & ":" & Format(j, "00")
Hora.AddItem miHora 'Rellenamos el combo con todas las opciones
Next j
Next i
Else 'Si hay registros, es que hay horas no disponibles
For i = 8 To 14
For j = 0 To 30 Step 30
miHora = Format(i, "00") & ":" & Format(j, "00")
horaLibre = True 'Por defecto la hora está disponible
rst.MoveFirst
Do Until rst.EOF 'Buscamos en las horas de la consulta
If miHora = Format(rst("Hora").Value, "hh:mm") Then
horaLibre = False 'Si aparece esa hora, la marcamos como no disponible
End If
rst.MoveNext
Loop
If horaLibre = True Then Hora.AddItem miHora 'Rellenamos con las disponibles
Next j
Next i
End If
'Cerramos conexiones y liberamos memoria
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
End Sub

Ah, se me olvidó comentarte que el evento lo programé en el Evento Al entrar del cuadro combinado. Otra opción sería ponerlo en el evento Al Activar registro del formulario.

Vaya tarde llevo de despistes!

El código sólo pone horas suponiendo que trabajas de 8 a 15, si necesitas cambiar el tramo horario, cambia las líneas que dicen:

For i = 8 To 14

Por el tramo que tú necesites, acabando siempre una hora antes.

Y si fuera el caso de turno de mañana y tarde, sólo tienes que repetir los dos bucles for, uno con el horario de mañana y a continuación el de la tarde, algo así:

If rst.RecordCount = 0 Then 'Si no hay registros en esa consulta es porque están todas libres
For i = 8 To 14
For j = 0 To 30 Step 30

...

Next j

Next i

For i = 16 To 19
For j = 0 To 30 Step 30
...
Next j
Next i

Else ....

Hola Sveinb...

Todo marcha de maravilla, ya lo adecue con un cuadro combinado, pero me envía el siguiente error:

Error 94 en tiempo de ejecución.

Uso no valido de Null

miFecha = Me.fech_visita.Value

miSQL = "SELECT citas.Hora FROM citas WHERE (((citas.fech_visita)=#" & miFecha & "#))"

Pasa que por error deje el campo de fecha en blanco.

Como lo hago obligatorio para que no me este enviando ese mensaje del depurador si es que lo olvido.

Y otra cosa, no se si sea posible que una vez que se terminen las citas para ese día, envíe un mensaje de que no existen citas disponibles, ya que me muestra el cuadro combinado en blanco (huérfano).

A la espera de tus indicaciones, gracias.

Perdón, pero me falto comentarte otra cosa.

Habrá algún método para desactivar en el formulario (subformulario) en vista hoja de datos, específicamente donde están los nombres de los campos (tipo encabezado) unas ventanitas tipo emergentes donde me indica (en forma de cuadros combinados) algunas opciones por cada campo (en esas ventanas salen opciones como ordenar, filtros de texto, etc).

Gracias.

Para solucionar el error de la fecha, añade esto: antes de miFecha = Me.Fecha.Value

'Comprobamos que la fecha no esté vacía
If IsNull(Me.Fecha) Then
MsgBox "El campo Fecha no puede estar vacío", vbInformation + vbOKOnly, "AVISO"
Me.Fecha.SetFocus
Exit Sub
End If

Para indicar que no hay citas disponibles, añade esto al final, después del último End If:

If Hora.ListCount = 0 Then
MsgBox "No hay citas disponibles para el día seleccionado", vbInformation + vbOKOnly, "SIN CITAS"
End If

En cuanto a la segunda duda, entiendo que estás usando access 2007 o 2010, y que el subformulario lo tienes configurado como hoja de datos. La única solución que conozco, por lo poco que llevo trabajando con esas versiones, pasa por rehacer el subformulario y diseñarlo con la distribución Tabular, que es muy similar a Hoja de Datos, pero no tiene esos desplegables que te "molestan"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas