Comprobar al insertar un registro que no esta ya consultando varios campos de una tabla access

Nuevamente necesito de vuestros conocimientos.

Quisiera saber como podría hacer mediante un botón o algo saber si ya tengo ocupado un espacio, me explico.

Yo cojo una serie de datos Fecha, vehículo, hora inicio y hora fin, lo que pretendo es no duplicar registro es decir que si yo tengo:

14/10/2015 9999cfk 9:00 a 11:00 cuando meta un registro o algo en ese espacio de tiempo me diga que esta ocupado como lo puedo hacer o por lo menos que me avise aunque sea de la hora de inicio para que no me deje continuar pero con ese vehículo si fuera otro si por ejemplo.

La tabla donde están los datos se llama TDatos.

1 respuesta

Respuesta
2

Te lo pongo un tanto genérico porque desconozco las características de tus campos.

En el evento "Después de actualizar de la hora escribes:

...

Private sub...

Dim yaExiste as variant

yaExiste=dlookup("Matricula","TDatos", "Matricula='" & me.Matricula & "' AND Fecha=#" & format(me.fecha,"mm/dd/yy") & "# AND HoraSalida=#" & format(me.HoraSalida,"hh:mm"))

If not isnull(yaExiste) then

msgbox "Ya existe una salida este día para este vehículo a esta hora",vbInformation, "COINCIDENCIA"

'Resto de código que quieras que se ejecute

End if

...

Como te lo he escrito de cabeza quizás tengas que ajustar alguna cosilla del dlookup, pero no creo que tengas demasiados problemas.

Rectifico:

yaExiste=dlookup("Matricula","TDatos", "Matricula='" & me.Matricula & "' AND Fecha=#" & format(me.fecha,"mm/dd/yy") & "# AND HoraSalida=#" & format(me.HoraSalida,"hh:mm") & "#")

Se me olvidó la última almohadilla.

Muchas gracias en cuanto puedo lo pruebo y te digo.

Un saludo

Muy buenas Neckkito, funciona correctamente pero solo si coincide la hora exacta, me explico, si yo pongo Hora salida 9:00 y meto otro registro salta el msgbox correctamente pero si pongo las 9:30 o 9:01 ya me deja seguir.

Pues pon el filtro de hora en un "mayor o igual que" hora de inicio y un "menor o igual que" hora de fin.

yaExiste = DLookup("Aula", "TDatos", "Aula='" & Me.Aula & "' AND Fecha=#" & Format(Me.Fecha, "mm/dd/yy") & "# AND HoraInicio>=#" & Format(Me.HoraInicio, "hh:mm") & "#" AND HoraFin<=#" & Format(Me.HoraFin, "hh:mm") & "#")

me da error de sintaxis, los filtros con fechas y horas y yo no nos llevamos del todo bien esto es una espinita que me tengo que quitar a base de trabajo, mas horas le tengo que echar a esta parte

yaExiste = DLookup("Aula", "TDatos", "Aula='" & Me.Aula & "' AND Fecha=#" & Format(Me.Fecha, "mm/dd/yy") & "# AND (HoraInicio>=#" & Format(Me.HoraInicio, "hh:mm") & "# AND HoraFin<=#" & Format(Me.HoraFin, "hh:mm") & "#"))

Me sigue dando error he probado a cambiar los paréntesis e incluso probé a poner doble la " # " a la almohadillas de esta parte del código y tampoco es la solución.

Format(Me.Fecha, "mm/dd/yy") & "#"
AND (HoraInicio>=#" & Format(Me.HoraInicio, "hh:mm") & "#"

Vamos a ver...

En primer lugar, tal y como te comentaba, te lo he escrito de memoria. Al haber tantos parámetros en el criterio de filtro, y encima tratarse de formatos de fecha-hora, lo mejor es hacer pruebas sobre la base de datos, y la base de datos la tienes tú.

En segundo lugar, si la consulta va a depender del valor de dos horas, el código no te va a funcionar si utilizas el evento de la hora de entrada y no hay valor en el campo de la hora de salida. Luego el código debería estar en el segundo campo de hora, no en el primero.

En tercer lugar el código debería, precisamente por ese motivo, controlar:

1.- Que haya valor en la hora de entrada y de salida

2.- Que la hora de salida no sea inferior a la hora de entrada.

Todo lo anterior son cosas que, entiendo yo, deberías ya saber.

Finalmente, y sin tener la BD delante, prueba con esto:

    yaExiste = DLookup("Aula", "TDatos", "Aula='" & Me.Aula & "' AND Fecha=#" & Format(Me.Fecha, "mm/dd/yy") & "# AND (HoraInicio>=#" & Format(Me.HoraInicio, "hh:mm") & "# AND HoraFin<=#" & Format(Me.HoraFin, "hh:mm") & "#)")

---------------------------------------

Paso a contestar la consulta en el comentario de Jacinto:

Efectivamente, lo ideal y lo que recomienda Microsoft es utilizar "nn" para indicar los minutos, y no "mm", dado que "mm" se utiliza para indicar el mes.

Pero, por otra parte, cuando no tienes formatos complicados o más "compuestos" puedes utilizar el "mm" para los minutos. Por ejemplo, para el siguiente formato no deberías utilizar "mm" para los minutos:

format (laFecha,"dd/mm/yy hh:nn:ss")

En el caso de Kike es lícito utilizar "hh:mm" porque es un formato de hora simple y Access "no se hace la picha un lío".

De todas maneras, por cualquier mínimo problema que se detecte (en relación a los formatos, quiero decir) utiliza mejor "nn".

¿Cómo comprobar que funciona? Pues haz esto:

Créate un formulario en blanco

Inserta un control con formato de hora corta y llámalo txt1

Inserta otro control con formato de hora corta y llámalo txt2

Inserta un botón de comando, y le generas este código:

me.txt2.value=format(me.txt1.value,"hh:mm")

Cuando tú escribas 10:25 en txt1 y pulses el botón verás que en txt2 te aparece 10:25 sin problemas.

A continuación cambia, en el código, las "m" por "n", y vuélvelo a probar. Verás que sigue funcionando igual de bien.

Saludos. Neckkito

Buenas noches Necckito, he realizado un pequeño ejemplo con lo que me comentaste en esta ultima respuesta, hay algo que no me termina de funcionar correctamente y no se si lo tendré en los eventos adecuados.

http://www.filebig.net/files/WjHStfVnbZ 

Espero que más o menos este bien je je.

Un saludo

Sinceramente, Kike, alucino que, con los códigos que has manejado desde que te conozco, no seas capaz de entender lo que hace el código y, por tanto, estructurarlo correctamente. De verdad que no lo entiendo.

Si el usuario no escribe la hora final debes controlarlo, por supuesto, pero, tras ese control, ¿por qué sigues dejando que el código se ejecute? ¿Por qué no sigues una secuencia lógica y te complicas la vida con Elses? Eso lo puedes hacer cuando controlas VBA, pero cuando vas haciendo "por impulso" simplifica, hombre, y déjate de filigranas.

En fin...

...

Private Sub HoraFin_LostFocus()
    Dim yaExiste As Variant
    If IsNull(Me.HoraFin) = True Then
        MsgBox "Debes selecionar una Hora Final", vbInformation, "Aviso"
        Me.Matricula.SetFocus
        Me.HoraFin.SetFocus
        Exit Sub
    End If
    If Me.HoraFin <= Me.HoraInicio Then
        MsgBox "La Hora Final no puede ser Inferior de la Inicial", vbInformation, "AVISO"
        Me.HoraInicio.SetFocus
        Me.HoraFin.SetFocus
        Exit Sub
    End If
    yaExiste = DLookup("Matricula", "TDatos", "Matricula='" & Me.Matricula _
        & "' AND Fecha=#" & Format(Me.Fecha, "mm/dd/yy") _
        & "# AND (HoraInicio>=#" & Format(Me.HoraInicio, "hh:mm") & "# AND HoraFin<=#" & Format(Me.HoraFin, "hh:mm") & "#)")
    If Not IsNull(yaExiste) Then
        MsgBox "Ya existe una salida este día para este vehículo a esta hora", vbInformation, "COINCIDENCIA"
    End If
End Sub

...

Buenos días Neckkito, como siempre tienes razón pero intentaba hacerlo así para ir aprendiendo e ir un poco más allá nada más de verdad.

Funciona correctamente pero no comprueba la parte del yaExiste ya que si meto un registro y le meto unas horas intermedias o algo me funciona.

Sería lógico poner el ya existe después de actualizar la hora de inicio? es decir cuando meta matricula, fecha y hora inicio, me diga si ese dia y esa matricula tienen registro y la hora de inicio esta comprendida en ese registro, así se compara una hora entre un intervalo no las dos con los intervalos.

ahora cada vez que actualizas algo de un registro te dice todo el dia que ya existe una salida......

Sería controlable mediante un control de errores o algo?

Muy buenas Neckkito, muchas gracias, me arreglare asi para no molestarte más ya que funciona correctamente en ese intervalo haciendo pruebas con tu bd revisada si por ejemplo tenias un registro de 11:00 a 13:00 pues si metes uno de 11 a 13:01 te deja registrarlo, controlar todas las variables es super complicado.

Muchas gracias por todo de verdad.

Un saludo

Buenas Neckkito, ¿una ultima cuestión sobre este tema como ambas horas por separado están controladas dentro de un intervalo anteriormente registrado y avisa de ello correctamente habría forma después de meter las 2 horas y no coincide ni una ni otra dentro del registro nos avisara? Me explico en tu ejemplo había 3 registros:

1) de 11 a 13

2) de 8 a 9

3) 9 a 11

Si yo pongo una reserva que par empezar antes de las 8 y acabe antes de la 13 me avisa.

Si la pongo a empezar más tarde de las 8 también me avisa.

Pero si la pongo de 7:59 a 13:¿01 ya no hay manera de construir un if que me coja las 2 horas y me las compare con las que halla registradas? Aunque sea como condición en un cmd antes de guardar.

¿Si es más o menos sencillo de plantear eh? Sino me arreglo así, es que intente hacer en papel un recorset sobre los registro pero no se como compararlos con lo que meto.

Un saludo

Arréglatelas así. Estoy muy liado y ya le he dedicado demasiado tiempo a esta consulta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas