Como usar el condicional en access 2016
Estoy haciendo una base de datos la cual consiste en programar equipos para fabricar. En donde cada usuario ingresa y programa el equipo, fecha y hora (para hora se maneja de 7.30 a 13, 13 a17, 7.30 a 17).
Se requiere:
Pregunta 1: Si un usuario solicita el equipo POR, en la fecha Y y el horario Z quede agendado.
Y si hay otro usuario que coincida con los mismos datos, no le permita agendar el equipo. Deberá buscar otra fecha y hora libre.
Pregunta 2: cuando se termine de diligenciar el formulario se pueda guardar y enviar por correo al usuario y al administrador de la base de datos.
Pregunta 3: hice el formulario con el asistente, en el cual hay un campo usuario, pero no logro traerlo automático según la autenticación del login.
Logre traerlo con una etiqueta pero al guardar no queda guardado en la tabla. ¿Cómo se puede guardar?
1 Respuesta
Vamos por partes, con respecto al formulario de Login, todo depende de si quieres que se oculte o no.
Vamos a suponer que no. Cuando el usuario acierta con la clave supongo que tendrás puesto algo así como
Docmd.openform"Peticiones"...
Pues si lo pones como
Docmd. Openform"peticiones",,,, acformadd, acdialog
Te lo abrirá en un registro nuevo y en vista dialogo. Bastaría entonces con poner en el evento Al cargar del formulario Peticiones
If currentproject.allforms("Login").isloaded then
usuario=forms!login!usuario
end if
Es decir, que si el formulario Login está cargado, que sí lo está, el valor del control Usuario del formulario Peticiones sea igual al que aparece en el control Usuario del formulario Login.
Vamos a suponer que si quieres que se oculte. Te aconsejaría que usaras una tabla llamada por ejemplo Registro donde guardes que Usuario entro, el día y la hora, de forma que cuando acierta, en ese formulario login puedes poner
Docmd. Runsql"insert into registro(usuario, fecha, hora)values(usuario, date(), Time())"
Así sabes quien entró por si tienes que ajustarle las cuentas.
Entonces bastaría con poner en el formulario Peticiones, en el evento Al activar el registro
If me.newrecord then
usuario=dlast("usuario","registro")
Por otro lado, para que no se repita la petición, puedes poner, por ejemplo, en el evento Antes de actualizar del cuadro de texto HoraFinalPeticion
If dcount("*","nombredelatabla","equipo='" & me.equipo & "' and fecha =forms!peticiones!fecha and horaInicialPetición=forms!peticiones!horainicial!peticion")>=1 then
Msgbox"No puede ser, ese equipo ya está pedido ese día y en ese período", vbokonly,"Otra vez será"
Docmd. Cancelevent
end if
Es decir, antes de que puedas dar enter, contará si ya hay una petición de ese equipo, en ese día y en ese período. Si la hay te dirá lo del mensaje y el cursor se vuelve para que rectifiques.
Por último, ¿qué es lo que quieres enviar por email, el formulario o un informe o simplemente un texto que recoja los puntos anteriores?
Buen día
gracias por tu respuesta. Probé los cambios que menciona, y no me funcionaron.
en login tengo asi:
Private Sub Comando1_Click()
If IsNull(Me.txtusuario) Then
MsgBox "Por favor, Escriba su Usuario", vdInformation, "Usuario Requerido"
Me.txtusuario.SetFocus
ElseIf IsNull(Me.txtpass) Then
MsgBox "Por favor Ingrese su Contraseña", vdInformation, "Contraseña Requerida"
Me.txtpass.SetFocus
Else
If (IsNull(DLookup("(Usuario)", "Usuarios", "(Usuario) ='" & Me.txtusuario.Value & "' And Pass = '" & Me.txtpass.Value & "'"))) Then
MsgBox "Usuario y/o Contraseña Incorrectos"
Else
USERLEVEL = DLookup("ADMIN", "Usuarios", "Usuario = '" & Me.txtusuario.Value & "'")
If USERLEVEL = 1 Then
LOGEDUSER = Me.txtusuario
DoCmd.Close
DoCmd.OpenForm "menu"
Else
LOGEDUSER = Me.txtusuario.Value
DoCmd.Close
DoCmd.OpenForm "menu"
End If
End If
End If
Cuando me dice que si quiero que se oculte o no, no quiero que se oculte.
la logica que le estoy dando es que despues del login habra el menu, en el cual coloque una etiqueta en el encabezado para que salga el nombre del usuario q ingreso, esto ya me funciona.
luego selecciono el formulario en este caso se llama "solicitud programa fabrica" en el cual el usuario diligencia cada campo. Es en este formulario en el cual quiero que el campo usuario salga automatico. y el usurio solo llene el resto de campos. luego guardo el fomulario y me aparecera en la consulta q hice. esto me funciona salgo que el campo usuario no sale automatico y lo estoy diligenciando manual. Lo que hice fue introducir una etiqueta igual q en login y si sale el usuario autenticado en login, pero no guarda en el formulario.
Quisiera que el campo directo del formulario salga el usuario o bien que la etiqueta quede guardada, de tal manera que se observe en la consulta o tabla original donde tome la consulta.
Por otro lado el condicional me sale un error de sintaxis.
lo escribi exactamente asi:
Private Sub HORAS_BeforeUpdate(Cancel As Integer)
If DCount("*", "SOLICITUD_PROGRAMA_FABRICA_1", "EQUIPO='" & Me.EQUIPO & "' and FECHA_DE_FABRICA =forms!SOLICITUD_PROGRAMA_FABRICA_1!FECHA_DE_FABRICA and HORAS,"SOLICITUD_FABRICA_1"=forms!SOLICITUD FABRICA 1!HORAS!SOLICITUD FABRICA 1") >= 1 Then
MsgBox "EQUIPO RESERVADO EN ESA FECHA Y HORA POR OTRO USUAIRO", vbOKOnly, "SELECCIONE OTRA FECHA"
DoCmd.CancelEvent
End If
Agradezco su ayuda ya que no encuentro el error. cuando funcione, entiendo que si le digo cancelar el evento me cerraria el formulario y se limpiaria el formulario? para q ingresen otros datos o en el mismo podria cambiar los datos.
y sobre el mail require enviar cualquiera de las dos formas el formulario o el texto, lo estaba haciendo con macros lo cual se me dificulta, pq se debe enviar al usuario que se autentico y al administrador en este caso yo. y pues desde que inicio en el formulario no me trae el usuario automatico.
quedo atenta a su amable respuesta, esto es lo q me falta para finalizar y he visto muchos tutoriales que no me han resuelto esta duda.
Vamos por partes. En la instrucción que tienes puesta le pones
If userlevel=1 then
Es decir que si userlevel=1 haga esto y lo otro
Pero tambien le dices
Else (es decir que no sea igual a 1) pero le dices que haga exactamente lo mismo. Entonces ¿para que sirve el if? Por ejemplo le dices
Si mi pelo es rubio lávame la cabeza
Si no es rubio lávame la cabeza
Con poner Lávame la cabeza directamente llega
Voy a obviar parte del registro y como dices que no quieres ocultar el login
Si tengo la tabla
Y una tabla Peticiones donde, para el ejemplo, ya le he añadido un registro. Fíjate en las horas
También tengo un formulario Login
Escribo el usuario y la contraseña y pulso Validar. Como el usuario y la clave son correctas abre en vista diálogo el formulario Peticiones, con el nombre del usuario
Relleno los datos
Como puedes ver carmen ha pedido el taladro el mismo día y a una hora que está "ocupada" por Pepe. Cuando pulso Enter
Al pulsar Aceptar el cursor se vuelve a HoraInicio para que la cambies.
El código del formulario Peticiones es
Private Sub Form_Load() If CurrentProject.AllForms("login").IsLoaded Then Usuario = Forms!login!Usuario End If End Sub Private Sub HoraInicio_BeforeUpdate(Cancel As Integer) If HoraInicio >= DLast("horainicio", "peticiones", "equipo='" & Me.Equipo & "'") And HoraInicio <= DLast("horafin", "peticiones", "equipo='" & Me.Equipo & "'") Then Dim s As String, t As String, i As Date, f As Date s = DLast("usuario", "peticiones", "equipo='" & Me.Equipo & "'") i = DLast("horainicio", "peticiones", "equipo='" & Me.Equipo & "'") f = DLast("horafin", "peticiones", "equipo='" & Me.Equipo & "'") t = "En esas horas no puedes. Está pedido por" & " " & "" & s & "" & " " & "desde las" & " " & "" & i & "" & " " & "hasta las" & " " & "" & f & """" MsgBox "" & t & "", vbOKOnly, "Elige otras horas" DoCmd.CancelEvent End If End Sub
Buen día
Solicito me disculpe la falta de comprensión a su pregunta si quiero o no que se oculte el login.
en el login modifique el campo que se repite en el codigo y funciono adecuadamente, segun su respuesta.
la tabla la diseñe asi:
genere el login, el usuario entra y se autentica con usuario y clave, al aceptar, se cierra esta ventana y abre el menu, en el menu esta los distintos botones para ingresar a cada modulo.
uno de ellos se llama programacion, al dar click sobre él, abre el formulario "programa"
en el cual diligencio los datos: como puede observar el campo usuario no me lo trae automatico. ahi deberia estar el nombre del usuario autenticado en el login.
como no sale debo escribirlo, pero no debe ser asi.
realice el codigo segun su explicacion pero me genera error: "la expresion al cargar que ha especificado como valor de la propiedad de evento produjo el error, se ha detectado un nombre ambiguo form_load"
el codigo en este formulario lo tengo asi:
en la parte detalle me trae el usuario automatico para la etiqueta del encabezado.
Pero en el formulario no me trae la información, como se observa arriba en el formulario, el campo usuario esta vacio.
en la parte de horas, no estoy usando hora inicio ni hora fin, estos horarios ya los coloque en el coloque en la seleccion que realiza el usurio, segun imagen abajo del codigo.
Private Sub Detalle_Click() End Sub Private Sub Form_Load() Me.usuarioactivo = UCase(LOGEDUSER) End Sub Private Sub Form_Load() If CurrentProject.AllForms("login").IsLoaded Then USUARIO = Forms!login!USUARIO End If End Sub Private Sub HORAS_BeforeUpdate(Cancel As Integer) If HORAS >= DLast("horas", "programa", "equipo='" & Me.EQUIPO & "'") And HORAS <= DLast("horas", "programa", "equipo='" & Me.EQUIPO & "'") Then Dim s As String, i As Date, f As Date s = DLast("usuario", "programa", "equipo='" & Me.EQUIPO & "'") i = DLast("horas", "programa", "equipo='" & Me.EQUIPO & "'") t = "En esas horas no puedes. Está pedido por" & " " & "" & s & "" & " " & "desde las" & " " & "" & i & "" & " " & """" MsgBox "" & t & "", vbOKOnly, "Elige otras horas" DoCmd.CancelEvent End If
se requiere que salga el usuario automatico en este formulario y si escogen un equipo en una fecha y horario determinado, que coincida con la peticion de otro usuario no permita agendar y deben buscar otro espacio.
y luego de diligenciar la totalidad del formulario ya que cada campo es obligatorio, pulse el boton guardar y que envie el formulario en pdf por correo al usuario autenticado y al administrador. el correo que se usa es outlook.
Agradezco su amable ayuda.
Quedo atenta
Siendo los horarios fijos es más sencillo. Vamos a hacer una cosa, si quieres, repito si quieres, haz una copia de tu base pero sólo con el formulario Menú y el formulario programa ( y si pones la tabla origen del formulario Programa vacía, mejor que mejor, así trabajo menos) y me la mandas a [email protected]
La miro, retoco las cosas. Por ejemplo, tal como está ahora, si el usuario, por error pone mal o el usuario o la clave no hace nada. Es preferible darle, por ejemplo, tres oportunidades y si a la tercera falla, le dices a la pantalla que le dispare un láser a los ojos o que el ratón le coma la mano.
Si lo haces, en el asunto del mensaje pon tu alias Gloria, ya que si no sé quien me escribe ni los abro.
Buen día
He enviado la tabla, para su respectiva orientación en los campos pendientes según se ha revisado en estas conversaciones.
Quedo atenta
Buen día, muchas gracias por su ayuda y paciencia, espero pueda hacerle una consulta adicional.
Por fin logre traer el usuario según sus indicaciones en el archivo vía mail.
Consulta: estoy ingresando en el formulario login con usuario y contraseña, al aceptar abre el formulario menu, y la ventana del login queda detrás del menu.
Al pulsar el botón del menu que me abrirá el formulario de solicitud, la ventana del login se antepone y queda tapando el formulario solicitud, en su ejemplo veo que cada vez que abre los formularios estos van quedando atrás según los vaya abriendo, ¿cómo podría lograr lo mismo?, ¿Sin cerrar el login que este quede atrás del resto de formularios que necesite abrir?
Consulta: en cuanto al condicional, ¿cómo podría hacerlo? ¿Pues cómo le comente antes los horarios ya están definidos en el menu desplegable?.
Si uso un equipo POR en un día Y, En un horario Z (de los que están en la selección),
Como hacer el condicional para que otro usuario no pueda programar en las mismas fechas y horarios dicho equipo, ¿y me pida cambiar esos datos?
Quedo atenta
- Compartir respuesta