You are on page 1of 5

MARCO DE OPCIONES QUE NOS ACTIVA CAMPOS1

Vamos a ver en este ejemplo cómo podemos “guiar” al


usuario para rellenar los datos según el valor seleccionado
en un marco de opciones.

Como siempre, vamos a prepararnos el terreno para


desarrollar el ejemplo.

El ejemplo, para situarnos, va a consistir en introducir los


datos de un alumno. Cuando seleccionemos el curso que
quiere, a través de un marco de opciones, se nos activarán
unos campos en función del curso elegido.
Aprovecharemos para ver cómo reutilizar un combo en función también de la opción elegida.
Dicho en palabras más técnicas, vamos a hacer que el combo muestre unas opciones u otras
según el curso elegido.

Vamos allá:

1.- Creamos una tabla, a la que llamaremos TDatos, con los siguientes campos:
– [Id] → Autonumérico y clave principal
– [NomAlum] → Texto
– [Curso] → Número (aquí recogeremos la opción seleccionada en el marco de opciones)
– [Prof] → Texto
– [NivelExcel] → Texto
– [NivelAccess] → Texto
– [NivelWord] → Texto

2.- Creamos otra tabla (sin clave principal) que recogerá los profesores de cada asignatura, y
que llamaremos TProfes, que contendrá los siguientes campos:

– [NomProf] → Texto
– [Assig] → Texto

Rellenamos manualmente esta tabla con algunos registros. Para guiaros os muestro los que yo
he puesto en el ejemplo

Vamos a crear ahora un formulario sobre la tabla TDatos. Una vez tenemos hecho el formulario
vamos a realizar las siguientes operaciones en él:

– Eliminamos el campo [curso]


– Si utilizamos Access 2007 o posteriores quitamos la apilación de los campos2
1 La BD de ejemplo os la podéis bajar aquí.
2 Para hacer eso nos ponemos sobre cualquier campo. Veremos que arriba, a la izquierda del campo [Id], nos aparece una pequeña

1
Visítame en http://siliconproject.com.ar/neckkito/
– Seleccionamos el campo [Prof]. Hacemos click con el botón de la derecha y en el menú
emergente que nos aparece nos vamos a la opción Cambiar a → Cuadro combinado
– Ahora debemos conseguir que los campos
[NivelExcel], [NivelAccess] y [NivelWord] estén “todos” en
uno. Simplemente debemos arrastrar uno encima de otro,
de manera que visualmente parezca que sólo hay uno. Para
guiaros os lo muestro en la siguiente ilustración:

– Entre [NomAlum] y [Prof] vamos a añadir un marco de opciones. Nos hacemos ese
hueco en el formulario y lo insertamos. Nos saldrá el asistente. Lo configuramos de la siguiente
manera:
– Nombres de las etiquetas: Excel / Access / Word
– No queremos ninguna opción predeterminada
– Dejamos los valores numéricos por defecto (1 a 3)
– Guardamos el valor en el campo [Curso]
– Le damos el formato que más nos guste a los botones
– Como título le escribimos: Seleccione curso

Ya tenemos los elementos de nuestra base de datos preparados. Vamos a ver el proceso del
código.

Fase 1: ¿qué hacemos al seleccionar un valor en el marco de opciones? Debemos realizar dos
opciones:

Primero: partiendo de la base de que los campos [NivelExcel], [NivelAccess] y [NivelWord] no


estarán, inicialmente, visibles, debemos hacer visible uno de estos campos, el que corresponda
según la opción seleccionada.

Segundo: cambiar las características del combo que nos recoge el valor del campo [Prof],
según la opción seleccionada.

Vamos a por la primera opción:

1.- Seleccionamos el marco de opciones y nos vamos a la pestaña Otras → Nombre. Le


ponemos de nombre mrcCurso.

2.- Nos vamos a la pestaña Eventos → Después de actualizar, y le generamos el siguiente


código3:


Private Sub mrcCurso_AfterUpdate()
Dim vCurso As Integer
cruz. Clickamos sobre esa cruz, con lo que todos los campos nos saldrán seleccionados. Hacemos click con el botón de la derecha
sobre cualquiera de esos campos seleccionados y, en el menú emergente que nos sale, nos vamos a Diseño → Quitar
3 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos aparece un pequeño
botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben tocarse. El código lo
escribimos entre dichas líneas

2
Visítame en http://siliconproject.com.ar/neckkito/
vCurso = Me.mrcCurso.Value
Select Case vCurso
Case 1
With Me
.NivelExcel.Visible = True
.NivelAccess.Visible = False
.NivelWord.Visible = False
End With
Case 2
With Me
.NivelExcel.Visible = False
.NivelAccess.Visible = True
.NivelWord.Visible = False
End With
Case 3
With Me
.NivelExcel.Visible = False
.NivelAccess.Visible = False
.NivelWord.Visible = True
End With
End Select
End Sub

El código es muy sencillo: miramos el valor seleccionado y volvemos visible el campo oportuno.
¿Por qué, entonces, cada vez volvemos invisibles los otros, si ya lo están? Buena pregunta...
Imaginaos que yo marco Excel, y me doy cuenta de que me he equivocado. Entonces marco
Word. ¿Qué pasará? Que tendremos [NivellExcel] y [NivelWord] visibles a la vez. Por ello
debemos “cubrirnos las espaldas” y volver cada vez invisibles el resto de campos.

Vamos a por la segunda parte: el combo. Debemos construirnos una consulta SQL que nos dé
los profesores que están ligados a cada curso.

Explicaremos primero cómo construir la SQL, y después veremos cómo lo adaptamos al código
que ya tenemos.

Vamos a ligar la SQL a una variable, que llamaremos miSql, que será siempre de tipo String. Si
la construimos sin filtro la SQL sería como sigue:

miSql = “SELECT TProfes.NomProf FROM TProfes”

Esa SQL nos mostraría todos los nombres de los profesores. Tengamos en cuenta que lo que
acabamos de escribir es común para cualquiera de las opciones que seleccionemos. Lo que nos
va a marcar la diferencia es el filtro que apliquemos a la SQL, en función de la opción escogida.

Y, para aplicar un filtro en la SQL, debemos utilizar WHERE. Así tendremos que:

miSql = Parte común & Parte con filtro

Es decir, y suponiendo que escogemos Excel:

miSql = miSql & “ WHERE TProfes.Assig='Excel'”

¡Tened en cuenta que es necesario que haya un espacio en blanco antes del WHERE!

¿Le cogemos la mecánica? Vamos a ver cómo debemos modificar nuestro código:

3
Visítame en http://siliconproject.com.ar/neckkito/

Private Sub mrcCurso_AfterUpdate()
Dim vCurso As Integer
Dim miSql As String
miSql = "SELECT TProfes.NomProf FROM TProfes"
vCurso = Me.mrcCurso.Value
Select Case vCurso
Case 1
miSql = miSql & " WHERE TProfes.Assig='Excel'"
With Me
.NivelExcel.Visible = True
.NivelAccess.Visible = False
.NivelWord.Visible = False
End With
Case 2
miSql = miSql & " WHERE TProfes.Assig='Access'"
With Me
.NivelExcel.Visible = False
.NivelAccess.Visible = True
.NivelWord.Visible = False
End With
Case 3
miSql = miSql & " WHERE TProfes.Assig='Word'"
With Me
.NivelExcel.Visible = False
.NivelAccess.Visible = False
.NivelWord.Visible = True
End With
End Select
Me.Prof.RowSource = miSql
Me.Prof.Requery
End Sub

Es decir:

– Según la opción seleccionada aplicamos el filtro en la SQL


– Le decimos que el origen del combo es la propia SQL, a través de ROWSOURCE
– Refrescamos la información del combo a través del REQUERY

¿Fácil, no?

Fase 2: ¿qué ocurre si añadimos un nuevo registro, o navegamos por los registros existentes?

Si damos de alta un alumno en Access, por ejemplo, y añadimos un nuevo registro, nuestro
campo [NivelAccess] seguirá visible. De igual manera, nuestro combo seguirá guardando el
RowSource del último registro dado de alta.

¿Y si recorremos los registros con los botones de navegación? Pues que el resultado puede ser
catastrófico: el formulario nos mostrará información que no tiene sentido.

Para prevenir lo anterior debemos decirle “algo” al formulario para que se dé cuenta de si
estamos en un registro nuevo, o de si estamos navegando en los registros.

Y para hacer esto debemos recurrir al evento de formulario “Al activar registro”, teniendo en

4
Visítame en http://siliconproject.com.ar/neckkito/
cuenta que vamos a tomar el campo [Id] como “chivato”: si no tiene valor es que estamos en
un registro nuevo; si, por el contrario, tiene un valor asignado, es que estamos
navegando por los registros.

Los códigos que vamos a utilizar son prácticamente iguales


a los que hemos utilizado hasta ahora, añadiéndole que el
código va a actuar en función del valor de nuestro “chivato”
particular.

Así pues, lo que debemos hacer es lo siguiente:

1.- Sacamos las propiedades del formulario y nos vamos a la pestaña Eventos → Al activar
registro.

2.- Le generamos el siguiente código:



Private Sub Form_Current()
Dim vId As Long
'Si hay valor, vId coge el valor; si no hay valor devuelve cero (0)
vId = Nz(Me.Id.Value, 0)
'Si devuelve cero es que estamos en un nuevo registro. Actuamos en consecuencia:
If vId = 0 Then
With Me
.NivelExcel.Visible = False
.NivelAccess.Visible = False
.NivelWord.Visible = False
.Prof.RowSource = ""
.Prof.Requery
End With
'Si contiene valor llamamos al procedimiento del marco
Else
mrcCurso_AfterUpdate
End If
End Sub

Fijaos que no he tenido que programar de nuevo todas las acciones posibles en función de la
opción seleccionada en el marco. Me ha bastado llamar al procedimiento del marco de
“Después de actualizar” para que ejecute el código pertinente. :)

Y eso es todo. Espero que este ejemplo os sea útil.

¡Suerte!

5
Visítame en http://siliconproject.com.ar/neckkito/

You might also like