Tablas temporales

Hola, tengo una duda sobre el uso de las tablas temporales en visual basic.
Estoy trabajando sobre una BBDD en Access y mi problema es el siguiente:
LLevo la información sobre los cursos de formación impartidos a los empleados de una empresa, en este caso tengo un formulario de asistentes, donde con 2 cuadros indico el curso para el que quiero inscribir un asistente (sacado de una tabla de cursos) y selecciono el asistente en el otro cuándo (sacado de otra tabla de empleados), posteriormente al darle a guardar me guarda los datos en otra tabla (asistentes) guardando la información unívoca en relación al curso y al asistente.
Lo que me gustaría hacer es permitir una selección múltiple sin tener que ir eligiendo de uno en uno a cada persona, sino algo así como que al hacer click en el registro de un empleado me lo almacenara en una tabla temporal y al darle a guardar me grabara todos los registros marcados, pero no sé como hacerlo.
Estoy más habituado a hacer trabajos en un SQL server y en cuanto a código de VB estoy perdidísimo.
Gracias por la ayuda, un saludo.

1 respuesta

Respuesta
1
En primer lugar debes permitir la selección múltiple en los cuadros de lista.
El código para el botón que usas para confirmar sería el siguiente:
Dim i As Integer
    Dim j As Integer
    Dim rs As Recordset
    Set rs = CurrentDb().OpenRecordset("Inscritos")
    For i = 0 To Me.listaCursos.ListCount - 1
        If Me.listaCursos.Selected(i) Then
            For j = 0 To Me.listaAlumnos.ListCount - 1
                If Me.listaAlumnos.Selected(j) Then
                    rs.AddNew
                    rs!curso = Me.listaCursos.ItemData(i)
                    rs!alumno = Me.listaAlumnos.ItemData(j)
                    rs.Update
                End If
            Next j
        End If
    Next i
    rs.Close
OJO: Es posible que te graben dos veces el mismo curso/alumno, por lo que yo pondría esos dos campos como clave en la tabla de inscritos y después controlaría el error cuando se intentara duplicar esos campos.
La forma de controlar ese error podría ser sustituir la línea que pone "rs.update" por estas que vienen a continuación
    On Error Resume Next
    rs.Update
    If Err <> 0 Then
        ' El error 3022 es que se ha repetido la clave
        If Err = 3022 Then rs.CancelUpdate Else MsgBox Error$
    End If
    On Error GoTo 0
Lo primero de todo muchas gracias por la ayuda, ahora mismo estoy probando el código pero me está dando problemas.
Me olvidé de decir que uno de los cuadros (el de la lista de cursos) es combinado, no sé si tiene alguna importancia pero por si acaso yo lo indico, selecciono de ahí el curso que quiero y luego ya paso a la lista de empleados al que le he puesto la selección múltiple extendida.
He copiado el código que me pusiste sustituyendo cada nombre por su correspondiente en mi BBDD, "Inscritos" imagino que se refiere a la tabla donde anoto la relación empleado-curso.
El caso es que al probarlo cuando ejecuto el código al llegar a la línea de Next J dice que hay error de compilación por Next sin For, aunque copié todo lo que pusiste:
Private Sub Comando25_Click()
    Dim i As Integer
    Dim j As Integer
    Dim rs As Recordset
    Set rs = CurrentDb().OpenRecordset("Asistente")
    For i = 0 To Me.Lista13.ListCount - 1                      //Lista13 = ListaCurso
        If Me.Lista13.Selected(i) Then
            For j = 0 To Me.Lista15.ListCount - 1             //Lista15 = ListaAlumno
                If Me.Lista15.Selected(j) Then
                    rs.AddNew
                    rs!curso = Me.Lista13.ItemData(i)
                    rs!alumno = Me.Lista15.ItemData(j)
                   On Error Resume Next
                    rs.Update
                    If Err <> 0 Then
                        ' El error 3022 es que se ha repetido la clave
                    If Err = 3022 Then rs.CancelUpdate Else MsgBox Error$
                    End If
                    On Error GoTo 0
            Next j
        End If
    Next i
    rs.Close
End Sub
Siento los problemas que te estoy dando...
Un saludo y gracias.
Por lo que veo te falta cerrar la instrucción 'If Me. Lista15. Selected(j) Then' con un 'end if'. Ese es el motivo por el que te da el error en la línea 'Next j'.
Si el curso es un cuadro combinado sólo puede tener un valor, no múltiples, por lo que se simplificaría el código.
He intentado poner tus nombres de campos en el código. Espero que no te de problemas.
Private Sub Comando25_Click()
    Dim i As Integer
    Dim rs As Recordset
    If Me.lista13 = "" Then Exit Sub
    Set rs = CurrentDb().OpenRecordset("Asistente")
    For i = 0 To Me.lista15.ListCount - 1
        If Me.lista15.Selected(i) Then
            rs.AddNew
            rs!curso = Me.lista13
            rs!alumno = Me.lista15.ItemData(i)
            On Error Resume Next
            rs.Update
            If Err <> 0 Then
                ' El error 3022 es que se ha repetido la clave
                If Err = 3022 Then rs.CancelUpdate Else MsgBox Error$
            End If
            On Error GoTo 0
        End If
    Next i
    rs.Close
End Sub
No te preocupes por preguntar. Todos tenemos dudas en muchos temas.
mmmm... al ejecutarlo me da un error en tiempo de ejecución "No se encontró el elemento en esta colección" en lo referido a rs! Curso (e imagino que también daría el mismo error con rs! Alumno).
¿Ahí tengo que poner el campo que quiero que coja de la lista, es decir rs![id curso]? (Por ejemplo).
¿Al poner rs As Recordset es donde tengo que definir "curso" y "alumno" como el tipo de campos que son?
La verdad es que son unas preguntas que me surgieron antes, pero como no había dado error lo dejé pasar... pero parece que ya pasa factura.
Gracias por tu dedicación,
Un saludo.
Acabo de comprobarlo y resultó ser eso, así que ya esta todo ok.
Genial! Muchísimas gracias por tu ayuda, una solución estupenda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas