Cómo agregar dinámicamente los datos de una tabla o consulta a un cuadro de lista o combinado en Access

Hace unas pocas entradas expliqué cómo agregar valores a un cuadro combinado o cuadro de lista, pero se trataba de valores independientes, ajenos a un origen de datos, es decir, que no eran tomados de una tabla o de una consulta. En esta entrada explico cómo se puede llenar dinámicamente un cuadro combinado o de lista con los valores de una tabla o consulta.

Para seguirle la pista a la lectura hay que saber cómo entrar a la vista diseño de un formulario, cómo alterar las propiedades de controles. También un poco de SQL y VBA.

En la mini-aplicación Artist Follower que publiqué hace pocos días (descarga), se incluye un ejemplo de llenado dinámico de datos en un cuadro de lista, que funciona igual para un cuadro combinado.

El formulario que se abre al iniciar la aplicación, llamado ArtistCatalog, tiene un cuadro de texto para escribir el nombre parcial de un artista que el usuario busca, un botón de comando para disparar la búsqueda, y un cuadro de lista para mostrar los resultados. Los datos son tomados de una tabla llamada Artists, los campos que se toman de la tabla son dos: IdArtist y ArtistName, el primero es el valor clave de la tabla y se mantiene oculto en una primera columna del cuadro de lista, el segundo es el nombre completo del artista que va en la segunda columna que ocupa todo lo ancho del cuadro de lista.

El efecto de ocultar una columna se logra alterando dos propiedades del cuadro de lista:

  • Número de columnas: 2
  • Ancho de columnas: 0 cm; 7 cm

He requerido las dos columnas porque el primer campo me sirve más adelante para otra tarea (de hecho, la Columna dependiente del cuadro de lista es el de la primera columna, no el nombre del artista), pero para los usuarios es más descriptivo ver el nombre del artista.

Para que Access sepa que los datos que se van a agregar al cuadro combinado provienen de una tabla o una consulta, he dejado la propiedad Tipo de origen de la fila con la opción Tabla/Consulta seleccionada.

El meollo del llenado del cuadro de lista viene en la propiedad Origen de la fila:

  1. SELECT Artists.IdArtist, Artists.ArtistName FROM Artists
  2. WHERE (((Artists.ArtistName)
  3. LIKE "*" & Forms!ArtistCatalog!ArtistSearch & "*"))
  4. ORDER BY Artists.ArtistName;

¡¡Qué, qué, qué!!.

Resulta que es una sentencia de consulta de datos que se complica un poco porque toma un valor de un control de texto para buscar resultados, se explica así:

  1. SELECT Artists.IdArtist, Artists.ArtistName FROM Artists

La primera línea es la más sencilla de la sentencia, traer los campos IdArtist y ArtistName de la tabla Artists. Luego viene:

  1. WHERE (((Artists.ArtistName)

Donde el campo ArtistName

  1. LIKE "*" & Forms!ArtistCatalog!ArtistSearch & "*"))

… sea como el valor dentro del control de texto llamado ArtistSearch en el formulario ArtistCatalog.

Los asteriscos concatenados antes y después del nombre del control ayudan a que Access trate de comparar el texto del control ArtistSearch con lo que contenga el campo ArtistName de la tabla de artistas sin importar si está al principio, en medio o al final del valor del campo (hay un entrada en el blog sobre el operador Like de SQL). La sentencia termina con: 

  1. ORDER BYArtists.ArtistName;

Al final solamente se están ordenando los resultados alfabéticamente.

La verdad es que la sentencia SQL puede lucir complicada, no lo hace tanto si se le mira en el diseñador de consultas de Access:

 

En el diseñador de consultas, lo único que luce complicado es el criterio de selección, pero no toma mucho tiempo entenderle.

Ya con las propiedades del cuadro de lista definidas, solamente falta un poco para lograr que la lista se actualice dinámicamente, de hecho, lo que falta es un evento controlado con un poco de VBA, el clic que el usuario hace en el botón llamado cmdSearch:

  1. Private Sub cmdSearch_Click()
  2.  
  3. ‘ update artist list with results of the search criteria
  4.   Me.ArtistList.Requery
  5.  
  6. End Sub

Se está llamando al método Requery del cuadro de lista (la palabra Me no se requiere, se refiere a “Mí, el formulario“, pero a veces se me va en el código porque VB me recuerda cómo se llaman mis controles en una lista desplegable al momento de escribir el código). Cuando el usuario hace clic en el botón cmdSearch, Access vuelve a ejecutar la consulta, usando como criterio el valor que contenga el cuadro de texto ArtistSearch (si no contiene texto devuelve todos los artistas).

***

Hay otras situaciones que conducen a actualizar dinámicamente el contenido de un cuadro combinado o un cuadro de texto, y puede que no sean tan exigentes. A veces solamente se requiere cambiar de origen de datos sin usar consultas tan complicadas:

  1. Sub OtroOrigen()
  2.     ‘ Definir tipo de origen de fila
  3.     ArtistList.RowSourceType = "Table/Query"
  4.     ‘ Origen de fila
  5.     ArtistList.RowSource = "SELECT * FROM Artists"
  6.     ‘ Cuántas columnas
  7.     ArtistList.ColumnCount = 2
  8.     ‘ Columna dependiente
  9.     ArtistList.BoundColumn = 1
  10.     ‘ Ancho de columnas
  11.     ArtistList.ColumnWidths = "0 cm; 7 cm"
  12.     ‘ Actualizar lista
  13.     ArtistList.Requery
  14. End Sub

El código del ejemplo hace mucho de lo que ya he explicado, lo que cambia es que aquí todas las propiedades del cuadro de lista se establecen con código de programación, y la consulta es mucho más sencilla, de hecho pudo haber sido aún más sencilla:

  1. ‘ Origen de fila
  2. ArtistList.RowSource = "Artists"

Porque es suficiente para la propiedad Origen de fila con el nombre de una tabla o una consulta.



One Response to “ Cómo agregar dinámicamente los datos de una tabla o consulta a un cuadro de lista o combinado en Access ”

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: Hace unas pocas entradas expliqué cómo agregar valores a un cuadro combinado o cuadro de lista, pero se trataba de valores independientes, ajenos a un origen de datos, es decir, que no eran tomados de una tabla o de una consu…

Leave a Reply