Como condicionar un formulario en access 2016 para que alerte agendas ocupadas por otros usuarios

Tengo tablas así:

Tabla horas, tabla maquinas, tabla fechas.

Un formulario con campos de usuario, fecha, maquina, horas ya establecida así (7a 2) (2a10)

Como puedo poner el condicional en el formulario para que funcione así:

Usuario pepito, agendó homogenizador el 24.09.19 de 7 a 2

Usuario 2 Margarita, agenda homogenizador el 24/09/2019 de 7 a 2

Me debería salir un mensaje que ya esta ocupado y seleccione otra fecha y hora u otro horario.

Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "cita", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas='" & Me.HORAS & "'") >= 1 Then
MsgBox "esta maquina ya esta reservada en esa fecha y hora", vbOKOnly, "seleccione otra fecha y hora"
DoCmd.CancelEvent
End If
End Sub

Me han ayudado con ese código siempre me sale error y siempre diferente, agradezco me ayuden.

Ya revise tablas nombres cualquier variable en cada paso, no me da el código.

2 Respuestas

Respuesta
2

Saber el error que te da, suele ayudar a encontrar una solución al problema. Lo que me extraña es que cada vez de te un error diferente...

A priori la forma de validar que usas es correcta, aunque me parece raro que uses lo del forms! Programa! Fechafabrica.

Cosas que te pueden fallar:

1º/ Que el campo equipo no sea numérico, que sea de texto. Entonces el DCount sería:

If DCount("*", "cita", "equipo='" & Me.EQUIPO & "' and .....

Fíjate que lleva comillas simples, como en el caso de horas.

2º/ Si la fecha la tienes en el mismo formulario, yo lo pondría:

If DCount("*", "cita", ".... and fechafabrica=#" & Me.fechafabrica & "# and ....

3º/ Si horas depende de una tabla auxiliar, es posible que el cuadro combinado trabaje con un identificador numérico aunque tu veas un texto, con lo que el campo horas sería numérico y no de texto, y te sobrarían las comillas simples:

If DCount("*", "cita", "....  and horas=" & Me.HORAS ) >= 1 Then

El código lo tengo así

Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas='" & Me.HORAS & "'") >= 1 Then
MsgBox "Euipo reservado en esa fecha y hora", vbOKOnly, "Seleccione otra fecha y hora"
DoCmd.CancelEvent
End If
End Sub

La tabla se llama "solicitud", el formulario  "programa" en el formulario los campos estan en este orden

fechafabrica, Equipo, hora las horas ya están definidas en un cuadro combinado así (6 a 2 pm) y (2 a 10 pm)

Me dice error 3464 y se ubica en el campo If dcount. Y de ahí no paso, me han dicho que utilice el idequipo, pero si lo uso al guardar me guarda el numero y necesito que se vea el nombre.

En la tabla el el campo equipo y horas esta como numero, en la tabla equipo el campo esta como texto igual el de horas. Ya he dejado las tres de la misma forma y no pasa el código, y si módico la forma en la tabla solciitud es decir la dejo como numero me elimina la posibilidad de filtrar en una consulta que hice para otra actividad, si lo cambio en cada tabla igual se me anula la consulta y fue un complique lograr que diera

El error 3464, si no me equivoco, es un error de que no coinciden los tipos.

Si esto es así, o bien es porque el campo equipo es te texto (y tu le estás pasando un número) o bien el campo horas es numérico (y tu le estás pasando un texto)

Como no me queda clara la cosntrucción de tu BD con la explicación anterior, vete probando estas opciones para el if, a ver cual te funciona:

Equipo y horas de texto:
If DCount("*", "solicitud", "equipo='" & Me.EQUIPO & "' and fechafabrica=forms!programa!fechafabrica and horas='" & Me.HORAS & "'") >= 1 Then
Equipo y horas numéricos:
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) >= 1 Then
Equipo texto y horas numérico:
If DCount("*", "solicitud", "equipo='" & Me.EQUIPO & "' and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) >= 1 Then

Como te decía en mi anterior respuesta, yo pondría la fecha referenciada directamente:

Equipo numérico y horas texto (tu código original):
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=#" & Me.fechafabrica & "# and horas='" & Me.HORAS & "'") >= 1 Then
Equipo y horas de texto:
If DCount("*", "solicitud", "equipo='" & Me.EQUIPO & "' and fechafabrica=#" & Me.fechafabrica & "# and horas='" & Me.HORAS & "'") >= 1 Then
Equipo y horas numéricos:
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=#" & Me.fechafabrica & "# and horas=" & Me.HORAS) >= 1 Then
Equipo texto y horas numérico:
If DCount("*", "solicitud", "equipo='" & Me.EQUIPO & "' and fechafabrica=#" & Me.fechafabrica & "# and horas=" & Me.HORAS) >= 1 Then

Y si ves que te hace "cosas raras" con las fechas, ponlo así:

..... and fechafabrica=#" & Format(Me.fechafabrica,"mm/dd/yyyy")  & "# and ....

Muchas gracias, le cuento que del primer código para horas me funciono el de equipo y horas numéricos, funciono perfecto.

Respecto al segundo de referenciar la fecha igual tome el de equipo y horas numéricos.

Sin embargo me alerta que no encuentra el método o el dato miembro

Y resalta en azul la parte que dice me .equipo solo resalta el .equipo. probé con los cuatro códigos haber si tenia algo pero me alertaban.

Lo de referenciar la fecha que cambiaría, ¿qué si coge una fecha que ya esta ocupada no deje continuar?

ese codigo lo probe con private sub fecha before update.... y tambien con equipo, me alertaba igual

Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=#" & Me.fechafabrica & "# and horas=" & Me.HORAS) >= 1 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
DoCmd.CancelEvent
End If
End Sub

Si te dice que no encuentra el método o dato meimbro y te marca Me. Equipo, será porque en tu formulario el control no se llama Equipo. Tendrás que comprobarlo (Propiedades ->Otras->Nombre) y cambiarlo.

Buen día

Si los nombre concuerdan tal cual.

Tengo este código me funciona perfectamente gracias a su ayuda en mensajes más arriba. Sin embargo viendo el uso ya directo con los formularios no me deja pasar ni tampoco salir.

Le podría añadir algo más, pues si selecciona una fecha y equipo, que ya esta separado en los dos rangos de horas, no me deja pasar, esta bien. Pero de que forma podría añadir al código para que se devuelva a la fecha y así el usuario seleccione otra fecha.

Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) >= 1 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
DoCmd.CancelEvent
End If
End Sub

Cuando usas un evento "Antes de actualizar", o pones un valor que cumpla la validación o vuelvas al estado previo, y mientras no lo hagas, no te dejará salir del campo en el que tienes el código, por lo que no podrás pasar el foco al campo fecha.

Una solución sería deshacer todo el registro:

Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) >= 1 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
Cancel=True
Me.Undo
End If
End Sub

Pero no creo que sea lo más adecuado...

Otra sería hacer la validación "a posteriori", en el evento "después de actualizar":

Private Sub HORAS_AfterUpdate()
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) > 0 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
Me.fecha=null
Me.Hora=NUll
Me.fecha.setfocus
End If
End Sub

Buen día

He colocado el código según su segunda orientación a posteriori.

Casi funciona, salio la alerta de equipo reservado, sin embargo salio otro este error

Error 2147352567 (80020009)en tiempo de ejecución: escriba un valor en le campo SOLICITUD.FECHAFABRICA

Ya revise el campo equipo y horas son un cuadro combinado están como numero y el campo fecha esta como fecha/hora. en el origen del control no tiene expresiones, tanto en la tabla como en el formulario esta así tal cual el código.

Private Sub HORAS_AfterUpdate()
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas=" & Me.HORAS) >= 1 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
Me.FECHAFABRICA = Null
Me.HORAS = Null
Me.FECHAFABRICA.SetFocus
End If
End Sub

Agradezco su ayuda para eliminar este error

Gracias

Parece que el campo no te admite un valor null. Prueba así:

Me. Fechafabrica. Undo

O así

Me.FECHAFABRICA=""

Y si te sigue dando error, no borres su valor, simplemente ponle el foco al campo para que lo cambie el usuario.

Buenas tardes

El código que me ha enviado funciona. Genera el aviso cuando esta ocupado el espacio. Y me deja mover hacia la fecha para cambiarla y seleccionar otro horario. Sin embargo si cierro los cuadros de advertencia igual me deja guardar el registro así lo deje con la fecha y hora que ya están ocupados.

Selecciono una fecha y hora que se están ocupados, y sale el mensaje que esta ocupado, y al cerrarlo sale este mensaje:

ERROR 2147352567 (800200009) En tiempo de ejecución. Escriba un valor en el campo

`Solicitud.fechafabrica`

Le doy finalizar y si quisiera continuar con el registro igual lo guarda.

Como podría eliminarse este error, y que el registro se pueda guardar solo cuando haya seleccionado la fecha y hora libres.

El código quedo así:

Private Sub HORAS_AfterUpdate()
If DCount("*", "solicitud", "equipo=" & Me.EQUIPO & " and FECHAFABRICA=forms!programa!FECHAFABRICA and horas=" & Me.HORAS) >= 1 Then
MsgBox "Seleccione otra fecha y hora", vbOKOnly, "EQUIPO RESERVADO"
Me.FECHAFABRICA = ""
Me.HORAS = Null
Me.FECHAFABRICA.SetFocus
End If
End Sub

agradezco su orientación.

Ese error no tiene nada que ver con el código (o no debería). Algo más debes de tener en tu BD que lo provoca (por ejemplo tener el campo como Requerido, pero en ese caso no te debería dejar guardar sin ponerle un valor).

Como parece que con el código no avanzamos, te propongo otra cosa:

1º/ Abre tu tabla en vista diseño

2º/ En la barra de opciones vete a Indices

3º/ En una fila en blanco, pon en la columna "nombre de índice": validación, en Nombre de campo, selcciona el campo "equipo", y en criterio de ordenación: "ascendente"

4º/ En la siguiente fila, deja el nombre de índice en blanco, selecciona el campo "fechafabrica", y "ascendente"

5º/ En la siguiente fila, deja el nombre de índice en blanco, selecciona el campo "horas", y "ascendente"

6º/ Para acabar, vuelve a la fila que tiene el nombre del índice (la del paso 3º), y en la parte de abajo, en las propiedades del índice, ponle Única: Sí.

De esta forma el propio Access se encarga de controlar que no haya dos registros con los tres campos iguales, y no te dejará seguir hasta que cambies alguno o canceles.

La idea es que te quede un índice como el de la imagen (pero con tus campos):

Respuesta
1

Si especifica el número de error o el mensaje del mismo de pronto le podría colaborar. Para que pueda hacer un seguimiento a las variables y valores guarde el criterio en una cadena de texto, algo como:

DIM strCriterio AS String

strCritrio="equipo=" & Me.EQUIPO

strCriterio=strCriterio & " AND fechafabrica=" & forms!programa!fechafabrica"

strCriterio=strCriterio & " AND '"  &  Me.HORAS & "'"

'Verifique el contenido para ver si la cadena arroja el resultado esperado  con :

MsgBox strCriterio

STOP

If nz(DCount("*", "cita", strCriterio),0) <>0 Then

O trate de seguir lo siguiente:

If nz(DCount("*", "cita", "equipo=" & Me.EQUIPO & " and fechafabrica=forms!programa!fechafabrica and horas='" & Me.HORAS & "'"),0) <>0 Then

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas