Cómo hacer check list con un formulario de Access

Me gustaría hacer una especie de checklist con un formulario de Access. Cada Máquina tiene una serie de elementos. De momento he creado una tabla que tiene un campo Elementos y otro Máquinas por cada máquina hay varios elementos, así que las Máquinas es el campo que se repite (hice esta tabla pensando en hacer cuadros combinados en cascada aunque no es lo que realmente quiero). Quiero que en el formulario aparezca un cuadro combinado con las máquinas y que al seleccionar una máquina salga la lista de elementos posibles para la Máquina en cuestión y que se pueda rellenar el estado de cada uno de los elementos de ésta máquina y que al dar a siguiente se guarden todos los elementos con los checks en una tabla. Los datos que tengo que manejar son éstos:

1 respuesta

Respuesta
2

Hay cosas que no entiendo, luego las preguntaré. Si una maquina puede tener varios elementos, lo normal sería que hicieras una tabla Maquinas con IdMaquina(si quieres, pero también se podría suprimir)y Maquina. Luego haría una tabla Elementos como

Hago una relación UNO a VARIOS con ambas tablas por el Idmaquina. Y con ellas hago un formulario con subformulario.

Y aquí me surgen las preguntas. Si cada registro es una máquina ¿para qué poner un combinado? De todas formas te he puesto el combinado

Si en el combinado elijo una maquina, en este caso la 3

El origen de la fila del combinado Elegir es

SELECT IdMaquina, Maquina FROM Maquinas GROUP BY IdMaquina,Maquina;

Y el código del evento Después de actualizar del combinado Elegir

Private Sub Elegir_AfterUpdate()
Me.RecordSource = "select * from maquinas where idmaquina=" & Me.Elegir & ""
End Sub

Gracias! ¿Y cómo voy al siguiente registro y dónde registro? ¿Tendrá qué ser en una nueva tabla no? Al tener el subformulario en formato "Hoja de Datos" no sé cómo poner un botón para ir al nuevo registro. Si coloco el botón en el formulario principal, se me van las máquinas y por tanto la información del Subformulario, pero a la que vuelvo a seleccionar la Maquina 3, por ejemplo, vuelven a salir los últimos datos que he introducido.

Supongo que tendría que crear una tabla donde registrar, pero no se como relacionarla con lo que tengo.

Lo que has comentado del cuadro combinado, realmente no haría falta podría salir todo de golpe.

Realmente siempre se tendrá que hacer checklist de todas las máquinas y una vez todo rellenado, evocarlo todo en una tabla para que quede constancia del resultado del checklist un DÍA determinado.

La verdad, no entiendo la primera pregunta. Si tengo el formulario

Elijo España

Y ahora debajo de Romero y tomillo simplemente

De todas formas, si quieres botones de navegación, en vista diseño del subformulario en sus propiedades-formato-botones de navegación ponle que sí.

Lo mismo que en el formulario.

También se podría poner en las propiedades-datos-entrada de datos=sí, algo que no aconsejo porque te abre siempre el formulario o subformulario en un registro nuevo.

Ok pero yo no quiero añadir registros en la tabla Elementos (porque las máquinas siempre tienen los mismos elementos) lo que variará será el día, es decir, yo voy el lunes y hago el checklist. Piñon OK, Parabrisas NOK, .... en fecha (13/02/2019). Y el siguiente lunes vuelvo a hacer el checklist Piñón NOK, Parabrisas OK.

Yo quiero guardar ésta información. Cada día que haga el checklist ver lo que está OK, lo que está NOK y así tener un historial de los días qué se ha hecho checklist ver qué estaba OK y qué NOK.

Los elementos de las Maquinas son datos fijos.

Me ha costado, pero creo que ya lo entendí. Vamos a suponer que tengo la tabla Maquinas como te decía más arriba y que tengo una tabla Elementos más o menos como

Vamos a suponer que también tengo una tabla Revisiones

Con ella hago un formulario continuo, al que le pongo un combinado donde voy a elegir la maquina

En este caso voy a elegir la 2 y

Ya que le he dicho que le ponga la fecha del sistema, pero se podría poner un cuadro de texto para escribir la fecha que se quisiera o entre fechas, etc. El código del evento Después de actualizar del cuadro combinado al que he llamado ElegirMaquina es

Private Sub ElegirMaquina_AfterUpdate()
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into revisiones(idmaquina,idelemento) select idmaquina,idelemento from elementos where idmaquina=" & Me.ElegirMaquina & ""
DoCmd.RunSQL "update revisiones set fecha=Date() where fecha is null"
Me.Requery
End Sub

Se le podría decir al formulario revisiones que siempre se "abra" en un registro nuevo, etc.

De todas formas. Si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando este ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Albert Borras, ya que si no sé quien me escribe ni los abro.

Perfecto, es eso que te sale a ti! Lo que no sé exactamente porqué al escribir el código, el cuadro combinado me sale en blanco. Qué tengo que poner en el apartado Datos del Cuadro Combinado ElegirMaquina?

Y referente a tabla Revisiones, de dónde coge los datos de IdMaquina e IdElemento? De la tabla Maquinas y de la tabla Elementos, respectivamente? O todo de la tabla Elementos? Tal y como lo tengo ahora, los cuadros combinados de la tabla Revisiones, me salen números en vez del nombre de las maquinas y elementos porque me coge el Id y no sé como hacer para que me coja otra columna que no sea el Id.

Albert, eso que preguntas ya es para el cum laude. Es broma. Verás, en los combinados tienes

- Origen del control.- Donde va a guardar los datos

- Tipo Origen de la fila.- Si los datos que va a mostrar "salen" de una lista de valores que le voy a escribir yo. Si van a salir de una tabla/consulta o de una lista de campos.

-Origen de la fila.- En función de lo que he elegido abajo, me muestra una cosa u otra. En el caso de que haya elegido Tabla/consulta, "genero" una consulta SQL y ahí le digo que campos debe tener en cuenta, en este caso Idmaquina y Maquina.

- Columna dependiente.- Cual de las columnas que va a tener se guardará en el Origen del control.

Solapa Formato

Número de columnas. Le digo cuantas va a mostrar, en este caso 2

Ancho de las columnas.- Le dices, valga la redundancia, el ancho que van a tener. Si le dijera que me mostrara la columna Idmaquina, me mostraría un número, por ejemplo, 14, pero ese número no me dice nada, por eso le digo que, si bien la columna "importante" sea la del idmaquina, tenga una anchura 0, o sea, que si está pero no se ve. Y la de maquina tenga una anchura de 4 cm, para ver el nombre que ese si me dice algo.

En el caso del combinado Idmaquina, en Origen de la fila le tengo puesto

SELECT IdMaquina, Maquina FROM Maquinas GROUP BY IdMaquina,Maquina;

Me ha encantado el truco de las columnas con los anchos! Gracias!

Ya me sale!

Ya casi lo tengo, ahora me falta restringir en el formulario.. ya que si selecciono la Maquina 1 y luego la 2, se me añaden los registros y me gustaría que al clicar la máquina (cuadro combinado), en el Formulario, me salieran sólo los elementos de la maquina. (no sé si me he explicado) Y que al detectar que todos los elementos tienen un OK o NOK  saliera un mensaje diciendo que ya está completo el Checklist de la Máquina 1, por ejemplo.

Aclaro que hablo sólo del formulario, en la tabla Revisiones es así como quiero que se vayan registrando, uno debajo del otro. Puedo decir que los registros ya se guardan perfectamente!

Y ya para rematar una vez rellenados todos los OK y NOK de todas las máquinas, un botón me permitiera cerrar y que al abrir pudiera empezar un nuevo registro.

Mil gracias por todo!

Me surgen mil preguntas.

1º Por lo que me parece entender, la fecha no interviene para nada. ¿Es así?

2º Las casillas de verificación tienen que estar rellenas sí o sí. Me explico, si una casilla no tiene marcada la casilla OK, ¿por narices tiene que estar marcada la NOK? Lo digo porque en la tabla, se le podría poner al campo NOK como valor predeterminado Si pero que cuando se "marcara" la casilla OK, se "desmarcara" la de NOK.

3º Supongo, que no lo sé, que mientras haya una casilla "marcada" con el NOK, el formulario se debería seguir viendo para que sepas que debes solucionarle esa "avería"

4º Lo del botón cerrar e ir a un nuevo registro. Supongo que te refieres a uno del formulario.

Te pongo un poco en contexto. Mi idea es que los operarios de las maquinas rellenen el formulario, y  quiero que ellos sólo tengan permiso para ir máquina por máquina (en el Formulario) poniendo OK o NOK a cada elemento de cada máquina, y en el caso que algo esté NOK que en los campos Cual y Causa puedan rellenar lo que ellos quieran. Cuando terminen de poner OK o NOK a cada elemento de cada maquina tienen que cerrar para otro dia que se haga mantenimiento, al abrir el formulario les aparezca todo blanco para poder rellenar de nuevo. 

Por otro lado lo que yo quiero es tener una tabla, en este caso Revisiones, donde vea el Dia que se ha hecho el chechklist y ver lo que han puesto OK o NOK y solucionar lo que han puesto NOK. (en el último mensaje ya te he comentado que los datos se me introducen correctamente en la tabla).

Y mi idea después de esto es hacer una consulta con los NOK y así tener un historial de lo que se ha estropeado.

A ver si ahora con el contexto entiendes más la idea. Gracias de nuevo!

Lo normal y aconsejable es que las "operaciones" se dirijan sólo desde un formulario, así que he creado uno al que llamo Principal

Si pulso el botón, se abre el formulario Maquinas en un registro nuevo para que la dé de alta con sus componentes.

Si por el contrario, elijo una máquina para anotar una revisión

Primero, me comprueba que esa máquina no tenga alguna revisión pendiente. Si la tuviera me avisaría como verás luego. Si no la tiene me crea los registros

Ahora relleno la fecha y si es OK o NOK.

Como puedes ver, la batería ni la han tocado(que sinvergüenzas, me dijeron que sí)

Ese mismo día u otro elijo la maquina 1 y 

Si le digo que no, no hace nada. Si le digo que si

Anoto la fecha, si OK o No Ok, con lo cual esa revisión estaría completa. Pasan los días y pienso en hacerle otra revisión a la máquina( no me fío ni un pelo de los operarios). Como la anterior ya se completó, al elegir maquina 1

Y vuelta a empezar

Tal como están los datos, en el formulario Principal se le puede poner que te muestre aquellos elementos que son NOK, el motivo, revisiones por fechas, etc.

El código del formulario es

Private Sub Comando0_Click()
DoCmd.OpenForm "MAQUINAS", , , , acFormAdd, acDialog
End Sub
Private Sub ElegirMaquina_BeforeUpdate(Cancel As Integer)
If DCount("*", "revisiones", "idmaquina=" & Me.ElegirMaquina & " and ok=0 and nok=0") >= 1 Then
Dim respuesta As Byte
respuesta = MsgBox("A esa máquina le faltan por completar revisiones de elementos. ¿Quiere verla?", vbYesNo + vbCritical, "No digas que no te avisé")
If respuesta = vbYes Then
DoCmd.OpenForm "revisiones", , , "idmaquina=" & Me.ElegirMaquina & " and ok=0 and nok=0"
ElseIf respuesta = vbNo Then
Exit Sub
End If
Else
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into revisiones(idmaquina,idelemento) select idmaquina,idelemento from elementos where idmaquina=" & Me.ElegirMaquina & ""
DoCmd.OpenForm "revisiones", , , "idmaquina=" & Me.ElegirMaquina & " and fecha is null", , acDialog
End If
End Sub

Increíble! Ya casi está.. porque hay algo que creo que a ti te lo hace bien pero a mi no. Ya que si cierro el formulario y lo vuelvo a abrir (imaginando que hago una nueva revisión), al elegir la Maquina 1, me salen los registros antiguos completados y los nuevos por completar y yo quiero que sólo se vean los nuevos. No sé a qué se debe esto. 

Se puede hacer que no se pueda marcar a la vez el OK y el No OK? (básicamente para evitar errores)

Y otra cosita, me interesa que la fecha salga automática y que no la tengan que escribir como me habias puesto en los ejemplos iniciales (cómo seria entonces el código?)

Mil gracias!

Imposibol, ya que si miras el código le digo que abra el formulario Revisiones con aquellos registros en que la fecha es nula. Por tanto no pueden aparecer registros con valor en el control Fecha.

Con respecto a lo de Ok, se puede hacer de muchas formas, por ejemplo, en el evento Al recibir el enfoque de la casilla OK se le puede poner

If NOK=-1 then

ok.enabled=false

end if

Y en la casilla NOK pon

If ok=-1 then

nok.enabled=false

end if

Con respecto a la fecha ¿qué fecha? ¿La del sistema?. En todos los registros o sólo en aquellos en que vayan a anotar un OK o un NOK. Esto sería lo lógico, ya que si no van a marcar nada ¿para qué ponerle fecha?

Tenias razón era imposibol, funciona perfectamente!

Lo del OK y NOK no termina de funcionar... si por ejemplo marco la OK y luego la NOK, al desmarcar la NOK va bien pero si la que desmarco es la OK se me ponen todas las OK de todos los elementos deshabilitadas.

Y el tema fecha, quiero que ellos cuando abran les salga la fecha del sistema porque tiene que quedar registrado el día que hacen el checklist. Si siempre tienen que introducirla ellos a parte que la faena es más pesada, puede llevar a errores de introducción de datos.

Y cuando el Ingeniero de mantenimiento quiera ver la revisión del día X pueda verla con todos sus elementos completados. Por eso en el caso que se dejen de marcar algún elemento y les sale el Msgbox, en este caso si que tendrían que poner ellos la fecha ya que pertenecerá a una revisión anterior. (máximo se hace una revisión al día)

En un formulario único solo ves un registro, el registro activo. Si quieres ver otro registro te tienes que desplazar a él. En ese momento se convierte en el activo y "existe".

En los formularios continuos, el único registro que existe es el activo, que está marcado por una punta de flecha

Los demás son imágenes virtuales que no tienen existencia física. Sólo la tendrán cuando se conviertan en activos. Por eso cuando haces referencia a una propiedad, se "transmite" a todos. Algo se puede subsanar usando el formato condicional pero las casillas de verificación no tienen.

Yo personalmente usaría, teniendo en cuenta que por diseño las casillas de verificación cambian de estado al actualizar

Private Sub NOK_AfterUpdate()
If NOK = 0 Then
OK = -1
ElseIf NOK = -1 Then
OK = 0
End If
End Sub
Private Sub OK_AfterUpdate()
If OK = 0 Then
NOK = -1
ElseIf OK = -1 Then
NOK = 0
End If
End Sub

En el caso de la fecha, puedes poner en el evento al recibir el enfoque de ese control

If isnull([fecha]) then

fecha=date()

end if

Todo perfecto! Mil gracias!

Sólo una cosita más ya para rematar. Cómo hago si quiero añadir un campo que sea Observaciones por Máquina (NO de los Elementos) y otro Observaciones por Día (generales). ¿Tendría qué hacer dos tablas una Observación Máquinas y otra Observación Día y que se vaya registrando allí?

¿Cómo hago para que un formulario me lleve los datos a distintas tablas?

¿El campo Observaciones por máquina (en un día en concreto) lo pondría poner en el Pie de formulario del Formulario Revisiones?

¿Y el campo Observaciones generales (por día) lo podríamos poner en el Menú "Principal"?

No sé si voy equivocado.. ¿cómo lo pondrías tu?

Gracias!

Si te fijas, en la primera imagen que te mandé que era una tabla de qué datos quería introducir, hay los campos de "Observación Máquina" (observación por máquina un día en concreto) y "Observación general" (observaciones generales sin especificar máquina, sólo el día). ¿Cómo lo añadirías en los formularios que tenemos creados?

Vamos a ver si me explico. Una cosa son los formularios, que "buscan" la forma más cómoda de introducir datos en una(s) tabla(s), que simplemente son un almacén y otra "presentar" los resultados. Las empresas tienen una forma de llevar la contabilidad, pero para la presentación de balances, cuenta de pérdidas y ganancias, etc recurren a presentar un informe.

Pues en Access lo mismo, una cosa es como introduces datos y otra como se presentan los resultados. Para que te quede "bonito", como has puesto en la primera imagen se puede hacer un informe.

Con respecto a lo de las observaciones. Lo mejor es hacer una tabla Observaciones, relacionada con, por ejemplo, la tabla Maquinas, Revisiones o la que sea por Idmáquina, idRevisión o lo que sea. Por ejemplo, en el formulario

Maquinas, si pulso el botón Obs, se abre en vista diálogo y en un registro nuevo el formulario Observaciones, anoto lo que tenga que anotar, y como en el evento Al activar el registro de éste último tengo puesto

If CurrentProject.AllForms("maquinas").IsLoaded Then
IdMaquina = Forms!maquinas!IdMaquina
End If

También le hubiera podido añadir un campo fecha para saber cuando se hizo esa observación.

Con lo cual

Y ya tengo en la tabla Observaciones el Idmaquina de la maquina A y la observación que haya anotado.

Para llevar datos a distintas tablas bastaría con

Docmd.runsql"insert into tablaA(campoA,campob,...)values(textA,TextB,...)"

Docmd.runsql"insert into TablaB(campoC,CampoX,...)values(....)"

O si fueran mucho registros a "pasar"

Docmd.runsql"insert into TablaA(CampoA,CampoB,...) select campoX, campoY,... from tablaquesea where....."

Perfecto! Solucionado! Gracias por las aclaraciones.

Podría hacer que cuando aparezca el formulario Revisiones no me lo deje cerrar si no están todas las casillas marcadas con OK o NOK? (incluso que aparezca un mensaje diciendo que lo debe rellenar)

Y con las marcadas en NOK podría hacer que no me deje cerrar el formulario Revisiones si no se rellena el campo "¿Cuál?"

Gracias!

Sólo he entendido la primera parte de la pregunta. Si tengo el formulario Maquinas, al que le he añadido un botón Cerrar, y he anulado el botón cerrar del propio formulario

Hay una revisión en que no se ha marcado ni OK ni NOK. Cuando pulso el botón para cerrar.

El código del botón es

If DCount("*", "revisiones", "ok=0 and nok=0 and idmaquina=" & Me.IdMaquina & "") >= 1 Then
Dim d
d = DLookup("fecha", "revisiones", "ok=0 and nok=0 and idmaquina=" & Me.IdMaquina & "")
MsgBox "No se puede cerrar porque hay casillas de un mismo registro" + Chr$(10) + "sin rellenar, corresponde al " & d, vbOKCancel + vbExclamation, "Para otra vez te fijas más"
Exit Sub
Else
DoCmd.Close
End If

Por último, no quiero parecer descortés, pero esta página es para resolver preguntas concretas, no para correspondencia epistolar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas