Rellenar Control mediante combo actualizabe y sin duplicados

Tengo un formulario con un control llamado "Genero" basado en el campo (del mismo nombre) de una tabla.

En el control quiero ingresar los géneros de mis libros a través de un cuadro combinado basado en el campo de la tabla.

En las propiedades del combo he puesto como "tipo de origen de la fila" tabla/consulta

y en origen de la fila "SELECT [TLibros].[Genero] from [TLibros]".  Peron no consigo lo que quiero...

Me gustaría ingresar los valores del control "Genero" a través de lo que selecciono en el cuadro combinado y en el caso de que no encontrara el valor en el cuadro combinado y tuviera que escribir el valor yo mismo, que automáticamente se incorporara al combo y que el combo en su lista de valores no admitiera duplicados. El campo "Genero" de la tabla si admite duplicados pero el combo que se basa en ese campo no debe tener duplicados.

Formulario: Biblioteca_Personal

Control: Genero

Tabla: TLibros

Campo: Genero

Combo: ComboGenero

1 Respuesta

Respuesta
2

Para que el combo no te muestre duplicados, ponle así el origen de la fila "SELECT DISTINCT [TLibros].[Genero] from [TLibros]"

Para que te permita añadir nuevos valores directamente en el combo, ponle la propiedad "Limitar a la lista" en NO

Además, para que los datos del combo se te "actualicen" al añadir un nuevo dato, puedes generarle en el evento "después de actualizar" este código:

Me. Genero. Requery

Hola

Muchas gracias. Se han solucionado  parte de los problemas, pero el caso es que cuando añado "a mano"  en el control un valor que no está en el combo, se añade a la lista del combo sólo cuando he cerrado el formulario, quiero decir que el combo sólo se actualiza cuando cierro el formulario y me gustaría que se actualizase en cuanto hubiera añadido el valor en el control "Genero".

Si te fijas una vez lo añado en el control si me voy al combo y despliego la lista sigue sin aparecer.

También está el tema de limpiar el combo una vez seleccionado el valor, es decir que en el recuadro blanco del combo donde se muestra la lista de valores, una vez seleccionado el valor de la lista se limpiara, que no apareciera en el recuadro blanco el valor.

Otro problema que aparece es que como toma el valor el combo del campo  de la tabla, en ocasiones no hay valor y por eso me muestra el combo en su lista un valor en blanco, vacío en la lista y querría evitar los valores nulos, vacíos en el combo.

Gracias

Pon esto como origen de la fila, para que no te aparezcan los "blancos":

SELECT DISTINCT TLibros.Genero FROM TLibros WHERE Nz([Genero],"")<>"" ORDER BY TLibros.Genero;

Para que te aparezca en el combo según lo añades (al menos al cambiar de registro), le pones el Me. Genero. Requery en el evento "al recibir enfoque" del cuadro combinado.

Si quieres limpiar el combo, has de poner Me.Genero=Null en el evento que estimes más oportuno. Si tu combo tiene la propiedad "origen de control" en el campo genero de la tabla, no te lo recomiendo, pues no se te almacenará nada en la tabla.

Te adjunto un ejemplillo.

Tu ejemplo es muy explicativo, nada como un ejemplo. Pero sólo me actualiza el combo como bien dices al cambiar de registro ¿Sería posible al cambiar de control al menos, aunque estuviera en el mismo registro?

De todas formas acabo de ver ahora una respuesta tuya reciente a una pregunta de otro usuario "Actualizar Valor Tabla Mediante Cuadro Combinado access 2007" (aunque yo uso 2003) y creo que me iría perfecto el código para mi duda (disculpa por no haberlo visto antes) puesto que aparece además un msgbox, etc.

Qué te parece esa solución que diste a otro usuario para mi duda, podríamos adaptarlo a lo que necesito de que no aparezcan duplicados en el combo, ni espacios en blanco y que se actualizara el combo al cambiar de control estando en el mismo registro ...? Te lo agradecería mucho.

el código que indicaste en el ejemplo "Actualizar Valor Tabla Mediante Cuadro Combinado access 2007" fue éste:

En el evento "Al no estar en al lista" de tu cuadro combinado, le generas este código:

Private Sub tuCombo_NotInList(NewData As String, Response As Integer)
If MsgBox("No está en la lista ¿Dar de alta?", vbYesNo) = vbYes Then
    Response = acDataErrContinue
    CurrentDb.Execute "INSERT INTO TuTabla(Dato) VALUES('" & NewData & "')"
    Me.tuCombo= DLookup("ID", "TuTabla", "[Dato]='" & NewData & "')"
    Me.OtroCampo.SetFocus
    Me.tuCombo.Requery
Else
    Response = acDataErrContinue
    Me.tuCombo= ""
End If
End Sub

Es otra opción perfectamente válida.

El código adaptado a tu caso sería:

Private Sub Genero_NotInList(NewData As String, Response As Integer)
If MsgBox("No está en la lista ¿Dar de alta?", vbYesNo) = vbYes Then
    Response = acDataErrContinue
    CurrentDb.Execute "INSERT INTO TLibros(Genero) VALUES('" & NewData & "')"
    Me.Genero=  NewData 
    Me.OtroCampo.SetFocus
    Me.Genero.Requery
Else
    Response = acDataErrContinue
    Me.Genero= ""
End If
End Sub

Lo único que te quedaría por cambar sería donde pone OtroCampo por el nombre del siguiente control que tengas.

Si quieres que se te actualice al pasar a otro control, ponle en el evento "al recibir el enfoque" o "al entrar" del siguiente control el Me. Genero. Requery, a ver si te funciona.

He puesto exactamente el código que me indicas pero ahora no me aparece la lista de valores en el combo, no aparece nada y veo que has sustituido esta línea

Me.tuCombo= DLookup("ID", "TuTabla", "[Dato]='" & NewData & "')"

por ésta otra

Me.tuCombo=  NewData

¿la primera línea no sería válida? ¿es necesario cambiarla?

En todo caso creo que debo tener ahora un fallo en las propiedades del combo. Te detallo lo que he puesto en propiedades:

origen del control: GENERO    (campo de la tabla TLibros)

tipo de origen de la fila: tabla/consulta

origen de la fila: (aquí qué debería poner exactamente)

Si me pudieras enviar otro ejemplo con el código adaptado a mi problema podría ver en qué he fallado

Gracias por la ayuda

No puedes usar esta línea:

Me.tuCombo= DLookup("ID", "TuTabla", "[Dato]='" &NewData & "')"

Porque tu combo no tiene un campo ID (que además es el que se guarda en la tabla), por eso le paso el valor nuevo que no está en la lista.

En origen de la fila tienes que ponerle lo que te dije en la respuesta del ejemplo (que es lo mismo del ejemplillo, si no recuerdo mal)

Resolviendo tus dudas:

1º/ para que el código que te pregunta si quieres añadir te funcione, has de ponerle la propiedad "Limitar a la lista" en Sí

2º/ Si no haces esto, y quieres añadirlo según las primeras respuestas, y que además se te actualice el combo al añadir, has de guardar el registro y recargar el combo, por ejemplo, poniendo en el evento "después de actualizar" del combo genero esto:

Me. Refresh

Me. Genero. Requery

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas