Anexar listbox

Hola, Alex tengo un problema con la actualización de un campo mediante un listbox.
Se trata de ir agregando el contenido de un listbox a un campo determinado en una tabla, mediante el evento click
de un botón de comando.
Cuando quiera añadir el nuevo contenido del listbox (ya que éste también irá cambiando) de nuevo pulsaremos el botón
de comando y se añadirá al mismo campo de la tabla anterior a continuación de los datos que existan, con un espacio y
una coma, guión o cualquier símbolo para separarlos de los datos ya existentes.
¿Qué código tendría que poner en el evento click para hacerlo?
Gracias por anticipado
Saludos Jaime

1 respuesta

Respuesta
1
Suponiendo que tienes una Lista un botón y un texto
El código al pulsar el botón seria
Private Sub Comando10_Click()
On Error GoTo Err_Comando10_Click
    If texto <> "" Then texto = texto & ","
    texto = texto & Lista.Value
Exit_Comando10_Click:
    Exit Sub
Err_Comando10_Click:
    MsgBox Err.Description
    Resume Exit_Comando10_Click
End Sub
Alex, Disculpa mi ignorancia pero no sé como escribir el código para declarar la variable con el contenido del campo de la tabla (variable "texto") ni las líneas anteriores de código referentes a la conexión, la base de datos actual, etc.. que supongo también serán necesarias, mis conocimientos sobre VBA son mínimos y tengo un lío monumental.
Un saludo y gracias
Supongo que el valor seleccionado del listbox, al pulsar el botón lo quieres añadir a un campo texto del formulario.
¿El campo listbox lo tienes lleno? ¿Cómo se llama el control?
¿El campo texto del formulario como se llama? ¿Y el botón que pulsas?
Dame estos datos y te escribo el código del click del botón.
O eso o sustituye en el siguiente código
Donde pone comando10 pon el nombre del botón
Donde pone Lista en negrita pones el nombre del listbox
Donde pone texto en negrita lo cambias por el nombre del textbox donde quieres añadir el valor de la lista.
Si en vez de separarlo por comas, lo quieres separar por otro carácter solo tienes que modificarlo en el código
Private Sub Comando10_Click()
On Error GoTo Err_Comando10_Click
    If texto <> "" Then texto = texto & ","
    texto = texto & Lista.Value
Exit_Comando10_Click:
    Exit Sub
Err_Comando10_Click:
    MsgBox Err.Description
    Resume Exit_Comando10_Click
End Sub
En resumen sustituye todo lo de negrita por los nombres de tu form.
Si no es lo que quieres me lo comentas
Private Sub MostrarlistGlobal_Click()
Dim BColumn As Long
Dim Row As Long
Dim Col As Long
Dim strTemp As String
BColumn = Me.listGlobal.BoundColumn
For Row = 0 To Me.listGlobal.ListCount - 1
strTemp = strTemp & "Fila " & Row + 1 & ": "
For Col = 1 To Me.listGlobal.ColumnCount
Me.listGlobal.BoundColumn = Col
strTemp = strTemp & Me.listGlobal.ItemData(Row) & " | "
Next
strTemp = Left(strTemp, Len(strTemp) - 3)
strTemp = strTemp & vbCrLf
Next
Me.listGlobal.BoundColumn = BColumn
MsgBox strTemp, vbInformation, "Todos los registros y sus columnas"
docmd.runsql "INSERT INTO DRENAJE (ODT) VALUES('" & strTemp "')"
End Sub
Hola Alex, este es el código que he encontrado de un ejemplo que más se aproxima a lo que intento hacer, y este es el punto en el que me encuentro:
1.- El contenido completo del listbox lo asigna a la variable "strTemp" y lo muestra en un
MsgBox y lo que necesito es que lo insertara también completo en el campo "ODT"(todo el contenido en un mismo campo y los valores concatenados uno detrás de otro separados por cualquier símbolo, coma o guión, da igual), de manera que actualizara el contenido de dicho campo, es decir, más que "insert" como aparece en la penúltima línea debería aparecer "update".
2.- En cuanto a lo que me preguntabas: el botón como ya sabrás se llama "MostrarlistGlobal"
Y la lista da igual que esté llena o no, se trata de copiar su contenido completo como explicaba anteriormente y se llama "listGlobal". La tabla se llama Drenaje.
Por último, la línea del "runsql" la he intentado adaptar de un ejemplo distinto y no sé
a qué corresponde lo del values ni como habría que escribirlo. De cualquier forma lo que necesito es update y no insert.
Un saludo y espero te aclare algo
Jaime
Si lo único que te falta es hacer un update seria:
Si en la tabla drenaje tienes un solo registro o los quieres modificar todos seria
docmd.runsql "UPDATE Drenaje Set ODT = '" & strtemp & "'"
Si solo quieres modificar el registro actual debes añadir un where con el identificador de la tabla, por ejemplo:
docmd.runsql "UPDATE Drenaje Set ODT = '" & strtemp & "' where IdDrenaje = " & me.IdDrenaje
Donde IdDrenaje seria el nombre del id que tienes en la tabla, y Me. IdDrenaje es el campo del formulario.
Recuerda que si el campo es texto va entre comillas simple y si es numérico no lleva nada.
Dime que tal
Gracias Alex por tu respuesta, disculpa que no te conteste más rápidamente pero antes de hacerlo intento entenderlo y ver cómo podría servirme aunque a veces sea parcialmente.
He conseguido avanzar bastante pues ya al menos consigo que actualize los datos de la tabla, pero como te comentaba anteriormente lo que necesito es que encadene todos los valores (todas las filas del listbox)
En un único campo o registro ( por ejemplo el campo correspondiente con la fila 2 columna 4)y que vayan separados por una coma, para lo cual el campo lo creé tipo "memo" para que pudiese almacenar algún texto aunque no creo que llegue a necesitar más de 20 o 30 palabras.
Lo que hace este código es que me guarda en la tabla el valor de la primera fila del listbox y lo repite siempre el mismo valor en todos los registros (creo que es más correcto, lamento el poderte haber confundido con lo de campos ) de la misma columna, siempre que existan registros que contengan algún valor previamente pues si no es así la tabla queda en blanco, en principio creo que es fácil de imaginar la tabla como si sólo pudiese tener dos posibles
estados, bien como una tabla vacía en cuyo caso añadiría el contenido completo en un único registro, por ejemplo el D4 o bien que este registro ya tuviese algún dato en cuyo caso sería eliminado y reemplazado con el contenido del listbox (actualización) .
En cuanto a lo que me comentas de actualizar tan sólo el registro actual también tendré que hacerlo, de hecho este listbox lo había incluido dentro de un formulario con otros muchos datos, pero en cuanto vi que necesitaba VBA para esto me decidí por ir solucionándolo paso apaso.
Un saludo y muchas gracias de nuevo
Jaime
Para coger el valor de la segunda columna, coges el valor de la lista
lista. Column(1)
Ten en cuenta que las columnas empiezan con la 0, así la 0 es la primera, la 1 la segunda y así consecutivamente.
Con esto que te envío coges el valor de la fila de la lista en la que estas situado.
Si lo que quieres es recorrer toda la lista para coger todos los valores, debes hacer lo siguiente:
'este ejemplo te pone en el campo texto2 todos los datos de la segunda columna de la lista, separados por comas
Private Sub Comando10_Click()
On Error GoTo Err_Comando10_Click
Dim strTexto As String
Dim i As Integer
     strTexto = ""
     For i = 0 To Lista.ListCount - 1
        If strTexto <> "" Then strTexto = strTexto & ","
        strTexto = strTexto & Lista.Column(1, i)
     Next i
     Texto2 = strTexto
Exit_Comando10_Click:
    Exit Sub
Err_Comando10_Click:
    MsgBox Err.Description
    Resume Exit_Comando10_Click
End Sub
Espero haber respuesto a tu duda, si no es así no dudes en decírmelo.
Si esto es todo pro favor cierra la pregunta.
Hola Alex
Ahora en la tabla aparecen los nombres de las filas concatenados pero sin su contenido, es decir, Fila 1: Fila 2: Fila 3: Fila 4: | y lo mismo en todos los campos de la columna ODT, y lo que necesito es lo contrario, el contenido de cada una de ellas y sin lo de Fila 1: Fila 2, etc.
Si me das tu email podría enviarte el archivo comprimido en el que se ve más claro, aunque los nombres varían algo de los que he puesto en los mensajes que eran para abreviar y como ya te comenté quité en su momento muchos campos del formulario para simplificar, pero creo que tenías razón en tus comentarios sobre vincular formulario y tabla mediante un campo común, y el campo ODT que se debe llenar con los valores del listbox tan sólo debe ser el que iguale otro que contenga el formulario, el que aparezca en el control "Cod_Proyecto_Drenaje_y_Estructuras". De hecho es así como lo diseñe antes de incluir el listbox pero el formulario quedaba saturado con tantos tipos de obra cada una con su control correspondiente y todas ellas relacionadas entre sí, por lo que me decidí a crear un listbox que las fuera recogiendo y juntándolas.
Alex siento mucho no poder decir "está resuelto" y cerrar el mensaje pero es que como ya ves no tengo ni idea y no consigo que esto funcione así que cuando tú digas cierro el mensaje y de verdad que te agradezco mucho el interés que has puesto.
Saludos y gracias
Jaime
No entiendo muy bien lo que me dices de los campos que ves.
Enviame la bbdd a [email protected] explicándome exactamente que quieres que te haga el formulario e intento solucionártelo.
Alex acabo de enviarte el archivo, espero que te llegue sin problemas. Hay algunos nombres cambiados pero es debido a que no paro de hacer pruebas con lo que se me ocurre, pero creo que es bastante simple de qué se trata:
Consiste en que al pulsar el botón de guardar, se actualize el campo ODTs de la tabla en el campo que coincida con el valor Cod_Proyecto_Drenaje_y_Estructuras, tanto en la tabla como en el formulario (ya que les he puesto el mismo nombre, y quizás les debí haber puesto nombre diferentes para evitar confusiones).
La actualización debe hacerse con el contenido completo del listbox, sin que aparezca lo de fila1, fila2, etc...
Saludos y gracias
Te contacto por correo, ciérrame la pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas