Igualar campo a Listbox

El asunto es cómo hacer coincidir el contenido completo de un listbox, sin necesidad de seleccionar nada previamente( lo que creo lo debería simplificar de alguna forma) con el de un campo de una tabla, es decir a medida que introduzco o elimino datos del listbox ocurra lo mismo en el campo de la tabla, tampoco es necesario que sea simultáneo y podría actualizarse mediante algún evento como perdida del enfoque de listbox, o cualquier otro.
He probado asignando el campo de la tabla como origen de control del listbox pero según dicen por ahí solo sirve si hay una selección

1 respuesta

Respuesta
1
Supongamos que en Access tenemos una tabla llamada "Personas" con 2 campos "Id" y "Nombre" y en VB tenemos un ListBox llamado "LstPersonas", y el campo Id está "relacionado" con LstPersonas por medio de la propiedad "ItemData" de ésta.
Por ejemplo:
Tabla: Personas ListBox: LstPersonas
Id Nombre ItemData Nombre
1 Ana 1 Ana
2 Miguel 2 Miguel
3 Alba 3 Alba
Podemos hacer "interactuar" LstPersonas con la tabla "Personas" por medio de un botón [llamémosle CmdActualizarBD] y otros 2 botones para agregar y quitar elementos de la lista [llamémosles CmdAgregar y CmdQuitar]. El código quedaría así:
Dim Cnx As New ADODB.Connection
Private Sub CmdAgregar_Click()
    Dim Rst As New ADODB.Recordset
    'recuperamos el Id máximo de la tabla Personas
    Rst. Open "SELECT MAX(Id) FROM Personas", Cnx, adOpenStatic, adLockPessimistic
    With LstPersonas
        'pedimos al usuario el nuevo elemento en la lista
'obviamente esto lo debes adecuar a tu BD
        .AddItem InputBox("Nueva persona", "Agregando")
        'agregamos la clave única al nuevo elemento en la lista
'simplemente sumando al Id máximo uno más
        .ItemData(.NewIndex) = Rst(0).Value + 1
    End With
End Sub
Private Sub CmdQuitar_Click()
    With LstPersonas
        'quitar el elemento seleccionado
        .RemoveItem .ListIndex
    End With
End Sub
Private Sub CmdActualizarBD_Click()
    Dim Rst As New ADODB.Recordset
    Dim i As Integer
    With LstPersonas
        For i = 0 To .ListCount - 1
            'recorrer la lista para verificar que el código del elemento _
            no exista, es decir, los elementos que ya estaban en la lista _
            NO los inserta de nuevo en la BD, sólo los nuevos
            Rst.Open "SELECT Id FROM Personas WHERE Id = " & _
            .ItemData(i), Cnx, adOpenStatic, adLockPessimistic
            If Rst.RecordCount = 0 Then
                Cnx.Execute "INSERT INTO Personas VALUES (" & _
                .ItemData(i) & ", '" & .List(i) & "')"
            End If
            Rst.Close
        Next
    End With
End Sub
Private Sub Form_Load()
    Dim Rst As New ADODB.Recordset
    Dim i As Integer
    'realizar la conexion a la BD
    Cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\BD.mdb"
    'recuperar todos los registros de la tabla "Personas"
    Rst.Open "SELECT * FROM Personas", Cnx, adOpenStatic, adLockPessimistic
    With LstPersonas
        If Rst.RecordCount Then
            For i = 1 To Rst.RecordCount
                'recorrer la tabla y agregar cada campo a la lista
                .AddItem Rst(1).Value
                'añadir el código único al elemento de la lista
                .ItemData(.NewIndex) = Rst(0).Value
                Rst.MoveNext
            Next i
        End If
    End With
End Sub
Espero haberte podido ayudar, si tienes alguna duda consúltame de nuevo y la resolveremos.
Saludos desde México. Juan Pablo E.P.
En primer lugar muchas gracias por la ayuda Juan Pablo, y la probaré
más detenidamente aunque lamento no haberme explicado mejor ya que
lo que intento hacer es introducir el contenido completo del lstPersonas en
un único campo de la tabla Personas, por ejemplo en el campo nombre, y
unidos los distintos nombres uno detrás de otro separados por una coma,
en dicho campo. De manera que el campo personas de la tabla siempre estaría
actualizado con el contenido del lstPersonas mediante cualquier evento posible,
no sé si es posible hacerlo de manera simultánea a como se van introduciendo los
valores en el listbox, en cuyo caso sería ideal, el resto de los campos de la tabla no hay
que considerarlos puesto que tomarían los valores de otros controles del formulario
distintos al del listbox.
Un saludo
Hola de nuevo Juan Pablo, he intentado adaptar el código que me enviaste para que
hiciera lo que te explicaba en la anterior respuesta pero no consigo hacerlo. Por otra
parte estoy intentando hacerlo mediante la creación de una variable que contenga el contenido completo del listbox y pasarle dicho contenido al campo de la tabla de manera encadenada (es decir, las filas del listbox irían una detrás de otra, separadas por una coma en un único campo de la tabla) pero no sé como se asigna el valor a la variable ni tampoco como pasarlo, en fin, que mis conocimientos sobre VBA son limitadísimos, un saluco y gracias de nuevo
Lo que deseas hacer, si no me equivoco, es "concatenar" todos los elementos de ListBox, para hacer eso debes crear un ciclo que lo recorra e ir agregando el texto a la cadena.
Private Sub ConcatenarStr()
   Dim i as Integer
   Dim MiCadena As String
   For i = 0 to LstPersonas.ListCount - 1
      MiCadena = MiCadena & ", " & LstPersonas.List(i)
   Next i
End Sub
El resultado final sería que "MiCadena" tendría todos los elementos del ListBox, separados por coma (,).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas