Access 2007 - ¿Cómo puedo usar un cuadro de lista para seleccionar varios valores y crear con ellos varios registros?

Tengo una base de datos en la que tengo una tabla con personal y otra con lecciones. Me gustaría crear un formulario que me volcase en una tabla la siguiente información:

- Fecha de la clase

- Nombre (o código) de la lección

- Asistentes

Para ello me gustaría tener en el formulario un par de campos en los que selecciono fecha y código de lección, y un cuadro de lista de multiselección en el que vaya clicando de todos los posibles asistentes (la lista completa de personal) aquellos que han acudido a esa lección.

Hasta ahora he podido hacer el formulario, los campos de fecha y código de lección, y el cuadro de lista multiselección, pero no sé cómo programarlo para que, con las personas seleccionadas del cuadro me inserte los registros necesarios. ¿Alguna idea de cómo estructurar la base de datos y cómo configurar el cuadro de lista?

1 respuesta

Respuesta
1

Supongamos que tienes un control de cuadro de lista donde seleccionas a los asistentes (recuerda establecer la propiedad Selección Múltiple: Extendida), para agregar los elementos seleccionados lo puedes hacer así:

Dim intCurrentRow As Integer
For intCurrentRow = 0 To Me.TuControlCuadroDeLista.ListCount - 1
If Me.TuControlCuadroDeLista.Selected(intCurrentRow) Then
Currentdb.execute "INSERT INTO TuTabla ([Fecha de la clase], [Nombre o Código de la Lección], Asistente) VALUES (" & _
Int(cDbl(Me.ControlFecha)) & ", " & ... & Me.TuControlCuadroDeLista.Column(1,intCurrentRow) & ");"
End If
Next intCurrentRow
Adáptalo según los tipos de campos que tengas (Fecha, Texto, numero, etc.)

¿Y dónde debo colocar ese código VBA? ¿En alguno de los eventos del cuadro de lista? ¿Del formulario?

Puedes crear un botón de comando para que ejecute el código. O también puedes ponerlo en el evento al Salir del cuadro ce lista. Eso es elección tuya.

Genial, lo pruebo todo y te digo qué tal me ha ido.

Muchas gracias por tu tiempo.

He adecuado tu código a los controles y tablas que tengo en la BBDD y me escupe "error en tiempo de ejecución 3134". Error en la sintaxis de INSERT INTO.

Te copio el código tal y como lo he adaptado a mi BBDD (lo puse en el evento salida del cuadro de lista):

Dim intCurrentRow As Integer
For intCurrentRow = 0 To Me.asistentes.ListCount - 1
If Me.asistentes.Selected(intCurrentRow) Then
CurrentDb.Execute "INSERT INTO ESCUELAS REALIZADAS POR ([fecha],[codigo_escuela],asistente) VALUES (" & _
Int(CDbl(Me.fecha)) & ", " & Int(CDbl(Me.codigo_escuela)) & ", " & Me.asistentes.Column(1, intCurrentRow) & ");"
End If
Next intCurrentRow

La flecha del depurador me marca la línea que empieza con el primer Int(CDbl...)

La tabla en la que quiero meter los datos es ESCUELAS REALIZADAS POR

Los campos de esa tabla se llaman [fecha], [codigo_escuela] y [asistente]

Las etiquetas de los controles en el formulario son [fecha], [código_escuela] y [asistentes]<- (este es el cuadro de lista)

Lo primero que tienes erroneo es el nombre de la tabla, cuando tengas el nombre de un objeto con espacios o caracteres has de usar los corchetes para referirte a ellos.

Pregunto: ¿Cuántas columnas tiene el control de cuadro de lista y que tipo de datos tienes asignados?

Los controles de cuadro de lista usan columnas y la cuenta empieza en cero, entonces si tienes dos columnas y vas a guardar un dato de tipo texto en la tabla has de usar comillas simples o dobles.

El cuadro de lista tiene una única columna, procedente de una consulta que me concatena varios campos de texto (nombre, apellido1, apellido2...) en uno solo, es decir, una única columna de campo de texto.

¿Debo poner entonces CurrentDb.Execute "INSERT INTO [ESCUELAS REALIZADAS POR] ([...... me sigue dando el mismo error.

El error te lo da en el control de cuadro de lista, pensé que tenías dos campos:Código del Asistente y nombre. Yo suelo guardar los indices y recuperar la información con ello.

Si solo tienes una columna, ya te comentaba que los cuadros de lista tienen columnas y empiezan por cero; ajústalo así:

... ", '" &  Me.asistentes.Column(0, intCurrentRow) & "'));"

También has de usar las comillas simples porque es texto.

Me sigue dando el mismo error. Este es el código completo:

Dim intCurrentRow As Integer
For intCurrentRow = 0 To Me.asistentes.ListCount - 1
If Me.asistentes.Selected(intCurrentRow) Then
CurrentDb.Execute "INSERT INTO ESCUELAS REALIZADAS POR ([fecha],[codigo_escuela],asistente) VALUES (" & _
Int(CDbl(Me.fecha)) & ", " & Int(CDbl(Me.codigo_escuela)) & ", '" & Me.asistentes.Column(0, intCurrentRow) & "'));"
End If
Next intCurrentRow

Siento ser tan pesado :|

Observo varios errores, Si el control Codigo_escuela es numerico y entero, ¿para qué aplicarle la extraccion de la parte entera de un valor doble flotante?

¿Por qué cierras dos veces la cadena de los valores?

A la fecha la aplique la extraccion para que no se queje del formato regional en la fecha y si tiene parte horaria, la elimine.

Te debe de funcionar asi:

CurrentDb.Execute "INSERT INTO ESCUELAS REALIZADAS POR ([fecha],[codigo_escuela],asistente) VALUES (" & _
Int(CDbl(Me.fecha)) & ", " & Me.codigo_escuela & ", '" & Me.asistentes.Column(0, intCurrentRow) & "');"

Te invito a un curso en linea el día 21 de este mes, te paso el enlace:

http://accessusergroups.org/access-latino/

Tambien puedes visitar el foro: http://www.mvp-access.com

¡Gracias! 

Por fin lo he conseguido. Tuve que cambiar el nombre de la tabla donde volcaba los datos, eso de que tuviese espacios puede que estropease todo.

Me hace una cosa rara, y es que cada vez que lo ejecuto, me añade primero una fila con codigo_escuela y fecha correctos pero asistente en blanco, y luego ya me mete todas las demás filas con fecha, código y asistente de manera normal. No sé por qué lo hace, y no me preocupa demasiado porque eso luego se puede filtrar, pero es una curiosidad.

Dejo el código aquí apuntado:

Dim intCurrentRow As Integer
For intCurrentRow = 0 To Me.asistentes.ListCount - 1
If Me.asistentes.Selected(intCurrentRow) Then
CurrentDb.Execute "INSERT INTO ESCUELASREALIZADASPOR ([fecha],[codigo_escuela],[asistente]) VALUES (" & _
Int(CDbl(Me.fecha)) & ", '" & Me.codigo_escuela & "', '" & Me.asistentes.Column(0, intCurrentRow) & "');"
End If
Next intCurrentRow

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas