Académique Documents
Professionnel Documents
Culture Documents
Ya sabemos que un combo puede tener múltiples utilidades una vez seleccionado el valor que
queremos. Para este ejemplo, y por hacerlo lo más gráfico y simple posible, lo que haremos
será utilizarlo para filtrar los datos de un formulario continuo.
PRIMERA PARTE
NUESTRAS TABLAS
Imaginemos que tenemos una lista de libros, y queremos poder filtrar, en un formulario, según
su género.
Eso nos delimita la necesidad de tener dos tablas, una para los datos de los libros y otra,
auxiliar, para los géneros.
Empezaremos por la simple, la de un solo campo, que llamaremos TGeneros y que tendrá la
siguiente estructura:
Por si alguien no tiene claro a qué llamo género ahí van algunos datos:
Nos creamos otra tabla (muy simplificada), que llamaremos TLibros, con la siguiente
estructura:
1
Visítame en http://neckkito.siliconproject.com.ar
Lógicamente faltan bastantes campos (autor, editorial,
Isbn…). Pero ahora eso no es lo importante.
NUESTRO FORMULARIO
Vamos a crearnos un formulario sobre TLibros, que llamaremos FLibros. Sin embargo, lo
crearemos de manera que sea un formulario continuo (varios elementos).
Formato → Ancho de columnas, y ahí le escribimos un valor para poder ver nuestros
“futuros” datos. Por ejemplo, le escribimos “2cm” (sin las comillas)
Ya tenemos nuestro combo casi cocido; nos falta la “pizca de sal”. Para ello, en su evento “Al
recibir el enfoque” vamos a generar el siguiente código3:
…
Private Sub cboFiltro_GotFocus()
'*---Neckkito---------------------------.-
'*---19/06/16---------------------------.-
'*--------------------------------------.-
'Nos creamos una simple SQL que nos seleccione todos los registros de TGeneros
miSql = "SELECT Genero FROM TGeneros ORDER BY Genero"
2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.
3 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos clic sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.
2
Visítame en http://neckkito.siliconproject.com.ar
listaValores = Chr(34) & listaValores
'Ahora tenemos una lista de valores con un punto y coma (;) y comillas dobles finales, que nos sobran. Los
quitamos
listaValores = Left(listaValores, Len(listaValores) - 2)
'Sólo nos falta anteponer la opción "Todos" (con comillas incluidas) a nuestra lista. Así que...
listaValores = Chr(34) & "Todos" & Chr(34) & ";" & listaValores
End Sub
…
comillasDobles-Valor-comillasDobles-PuntoYComa-comillasDobles-Valor-…
Y sabiendo que el último elemento no debe llevar tras él más que unas comillas dobles.
Ahora sólo nos falta saber qué pasa tras seleccionar un valor. Para ello, en el evento “Después
de actualizar del combo”, generamos el siguiente código:
…
Private Sub cboFiltro_AfterUpdate()
Dim elValor As String
Dim miFiltro As String
3
Visítame en http://neckkito.siliconproject.com.ar
'Analizamos si el valor es "Todos" o es otro
If elValor = "Todos" Then
Me.FilterOn = False 'Quitamos el filtro
Else
miFiltro = "[GeneroLibro]='" & elValor & "'"
Me.Filter = miFiltro
Me.FilterOn = True 'Filtramos
End If
End Sub
…
SEGUNDA PARTE
Llegados a este punto quizá alguien pueda decirme: pues con un combo con dos columnas el
proceso será el mismo. ¿Para qué te enrollas con esta segunda parte?
Mi respuesta en ese caso sería sí y no. Sí, porque la base del sistema es, básicamente (valga la
“rebuznancia”), la misma; no, porque hay pequeños detalles que difieren del proceso anterior,
pequeños pero que pueden hacer que no nos salga nada en absoluto.
Por otra parte, mi idea no es repetir lo mismo que en la primera parte, sino que lo que os voy
a explicar es una manera de automatizar el sistema y que podamos aplicarlo rápidamente a
cualquier combo en nuestra aplicación que requiera de ese añadido para “todos”.
Veamos...
NUESTRAS TABLAS
A nuestro control de libros vamos a añadir los autores. Pero queremos manejar los autores a
través de identificadores.
Para ello crearemos una nueva tabla, que llamaremos TAutores, con la siguiente estructura
simple.
4
Visítame en http://neckkito.siliconproject.com.ar
NUESTRO FORMULARIO
Nos creamos un formulario sobre TLibros2, que llamaremos FLibros2. Como vamos a utilizar
para filtrar información lo crearemos como un formulario continuo (varios elementos). Sin más
secretos.
Al escribir un primer ancho de 0cm lo que estamos haciendo es ocultar la primera columna,
que usualmente es la clave principal. Si nos interesara verla pues le damos un ancho, por
poner un ejemplo, de “0,5cm”.
También, dependiendo de los caracteres, tendremos que jugar con las medidas para encontrar
la que se adapte mejor a nuestros contenidos de información.
El código para el evento “Después de actualizar” de ese combo será prácticamente igual al
explicado en la primera parte, sólo que adaptado para que filtre por un valor numérico. Es
decir, que será el siguiente:
…
Private Sub cboFiltro2_AfterUpdate()
Dim elValor As Long
Dim miFiltro As String
5
Visítame en http://neckkito.siliconproject.com.ar
miFiltro = "[AutorLibro]=" & elValor
Me.Filter = miFiltro
Me.FilterOn = True 'Filtramos
End If
End Sub
…
NUESTRO MÓDULO
Para poder convertir nuestra operativa en algo aplicable a cualquier combo que queramos
debemos inventarnos algún procedimiento que nos rellene los datos de cualquier combo. Y eso
lo vamos a conseguir a través de un módulo estándar.
En ese módulo insertaremos un procedimiento público. Pero antes de daros el código vamos a
reflexionar un momento:
¿Dónde puedo encontrar esos valores? Pues esos valores están en la tabla TAutores, en
los campos [IdAutor] y [NomAutor].
De lo anterior podemos deducir que vamos a necesitar el nombre de la tabla y el nombre del
campo que será nuestra columna 1 y el nombre del campo que será nuestra columna 2 del
combo.
¿Vamos bien?
Podríamos pensar que ya tenemos la reflexión hecha, pero… ¡un momento! El código está en
un módulo estándar, no en un formulario. Entonces,
¿Seguimos?
¿Qué pasaría si tenemos varios formularios con combos, y a todos les hemos
llamado cboFiltro2? Pues que necesitamos decirle que lo que queremos rellenar es el
cboFiltro2 del formulario FLibros2.
4 Para insertar un módulo estándar podemos abrir el editor de VB (ALT+F11) y nos vamos a Menú → Insertar → Módulo
6
Visítame en http://neckkito.siliconproject.com.ar
En consecuencia, necesitaremos también el nombre del formulario en el que se encuentra el
combo a rellenar.
…
'-----------------------------------------------------------------------------------------------------------------------
'-------Código programado por Neckkito @ http://neckkito.siliconproject.com.ar
'-------Fecha creación: 20/06/15
'-------Fecha última modificación: 20/06/15
'-----------------------------------------------------------------------------------------------------------------------
'-------La llamada se realiza desde el evento "Al recibir el enfoque" del combo, y se le deben pasar los siguientes
'-------parámetros, por este orden: nombre del campo 1, nombre del campo 2, nombre de la tabla, nombre del combo
'-------y el objeto formulario en el que está el combo. Ejemplo:
'-------Call subRellenoCbo("NombreCampo1", "NombreCampo2", "NombreTabla", Me.NombreCbo.Name, Me)
'-----------------------------------------------------------------------------------------------------------------------
'Nos creamos una simple SQL que nos seleccione todos los registros de los campos indicados, y de la tabla
especificada
miSql = "SELECT [" & campo1 & "], [" & campo2 & "]" _
& " FROM " & laTabla & " ORDER BY [" & campo2 & "]"
'Realizamos la comprobación
If vCampo1 = -1 Or vCampo2 = "" Then 'Si no hay valores los saltamos
'No hago nada y dejo que se llegue al End If
Else
'Empezamos a crear la lista con los valores.
7
Visítame en http://neckkito.siliconproject.com.ar
'Le añadimos comillas dobles tras el valor, añadimos punto y coma (;) al final como separador de listas
'y de nuevo unas comillas dobles
listaValores = listaValores & vCampo1 & Chr(34) & ";" & Chr(34)
listaValores = listaValores & vCampo2 & Chr(34) & ";" & Chr(34)
End If
.MoveNext
Loop
End With
'Ahora tenemos una lista de valores con un punto y coma (;) y comillas dobles finales, que nos sobran. Los
quitamos
listaValores = Left(listaValores, Len(listaValores) - 2)
'Sólo nos falta anteponer la opción "0-Todos" (con comillas incluidas) a nuestra lista. Así que...
listaValores = Chr(34) & "0" & Chr(34) & ";" & Chr(34) & "Todos" & Chr(34) & ";" & listaValores
With elForm.Controls(elCbo)
'Asignamos esa lista como origen de la fila del combo
.RowSource = listaValores
'Refrescamos la información en el combo
.Requery
End With
Salida:
Exit Sub
sol_err:
Resume Salida
End Sub
…
Fijaos que todo el tiempo estoy manejando, llamémosle, “pares de datos”. Eso es porque el
combo entiende que, en nuestro ejemplo, el primer miembro del par es un elemento de la
columna 1 del combo y el segundo miembro del par es un elemento de la segunda columna.
De ahí que haga la comprobación de si existe valor antes de añadir los elementos a la lista. Si
8
Visítame en http://neckkito.siliconproject.com.ar
no lo hiciera así, a partir del primer elemento vacío, me saldrían los datos desapareados en el
combo.
…
Dim vCampo1 As Long 'Porque cogemos un identificador autonumérico
Dim vCampo2 As String 'Porque cogemos un campo de tipo texto
…
…
Dim vCampo2 As Long
…
…
vCampo2 = Nz(.Fields(1).Value, -1)
…
If vCampo1 = -1 Or vCampo2 = -1 Then 'Si no hay valores los saltamos
…
En la BD que acompaña a este ejemplo hay un combo en el formulario FMenu que, además de
servir para hacer testeos, permite ver que una vez tenemos el módulo en nuestra aplicación es
muy sencillo realizar una llamada a nuestro procedimiento.
Un saludo, y…
¡suerte!
9
Visítame en http://neckkito.siliconproject.com.ar