Pasa Programación, apuntes y soluciones con Access
Página principal Mis apuntes de Access Mis utilidades Mis ejemplos Mis agradecimientos Enlaces a otras Webs

Referenciar controles

  1. Índice.
  2. Controles entre formularios.
  3. Controles entre subformularios.
  4. Bibliografía.

Controles entre subformularios

Hacer referencia a un control que está en un formulario, no en un subformulario, es sencillo. El problema lo solemos tener cuando intentamos acceder a un control que se encuentra en un subformulario, o en un subformulario dentro de otro subformulario. Casi tod@s hemos intentado acceder al principio de esta forma:

= Forms!NombreDelFormulario!NombreDelSubFormulario!NombreDelControl

Y nos hemos topado con que Access no nos muestra lo que queremos, sólo un #nombre o un #error, si lo hacemos desde un formulario, o nos pide los parámetros en una consulta, o nos lanza un error en VBA. ¿Y por qué nos ocurre esto? Porque al principio de nuestro uso con Access no nos han presentado al señor:

Control Secundario

Cuando insertamos un subformulario dentro de otro formulario, o un subinforme dentro de un informe, no insertamos directamente el objeto deseado, tal y como much@s pensamos. Access nos inserta un objeto Secundario o SubForm. Y este control es el que va a ser el contenedor del subformulario.

Nota: Para fastidiar un poco más, Access le da al control Secundario el mismo nombre que el que tiene el subformulario que contiene.

Pero claro, si el control Secundario y el formulario que usamos como subformulario tienen el mismo nombre, también tendría que funcionar. Pues no, no funciona por una simple razón: el control Secundario no tiene entre sus propiedades los controles que tiene el subformulario, y por eso no podemos acceder a esos controles tan fácilmente. Tenemos que indicar que queremos acceder al subformulario, y para eso el control Secundario dispone de una propiedad llamada Form. Así, si cambiamos la sentencia anterior por esta otra:

= Forms!NombreDelFormulario!NombreDelControlSecundario.Form!NombreDelControl

Ya podemos acceder al control y recoger sus propiedades y/o valor, ya que estamos indicando la ruta correcta:

  1. Forms: Estamos indicando que queremos acceder a la colección de formularios abiertos. Esta palabra identifica a un objeto de Access, que almacena los formularios abiertos de la base de datos.
  2. NombreDelFormulario: Aquí escribimos el nombre del formulario al que queremos acceder, tal y como lo hemos escrito al guardarlo en la base de datos.
  3. NombreDelControlSecundario: Debemos indicar qué control alberga al subformulario al que queremos acceder. Este nombre es el mismo que se ha indicado en la propiedad Nombre del control Secundario.
  4. Form: Es la propiedad del control Secundario que almacena al subformulario. Al ser una propiedad del control, este valor no se debe modificar.
  5. NombreDelControl: Aquí escribimos el nombre del control del subformulario; el nombre que pondremos será el mismo que el que hemos dado a ese control en su propiedad Nombre.

Así, si tenemos un formulario que se llama MiFormulario, y en él tenemos un control Secundario que se llama MiControlSecundario, en el cual hay un formulario de nombre MiFormSecundario, que tiene un cuadro de texto de nombre MiControlDelSubFormulario, la sentencia será similar a la siguiente:

= Forms!MiFormulario!MiControlSecundario.Form!MiControlDelSubformulario

Como podemos apreciar, no indicamos el nombre del subformulario, sólo el del control que alberga.

¿Y si queremos ir al revés? Es decir, desde un control en un subformulario recoger un valor que hay en un control del formulario principal. En este caso, la solución es más sencilla al disponer de:

La propiedad Parent

La propiedad Parent nos sirve para hacer referencia al control o formulario que alberga al control o formulario donde estamos actualmente. Y en el caso de los subformularios, su propiedad Parent apunta directamente al formulario que los contiene, no al control Secundario que está en medio. Así, siguiendo con el ejemplo anterior, y suponiendo que en el formulario principal hay un control de nombre MiControl, podemos acceder a él desde el subformulario:

= Parent!MiControl

Lo cual es bastante más sencillo de usar que el chorizo anterior.

Nota: Desde un subformulario también podemos acceder al formulario principal mediante la colección Forms.

Pues sí, usando la colección Forms podemos acceder a los formularios cargados, incluso desde el subformulario. Pero no podemos acceder a los formularios que están insertados como subformularios dentro de controles Secundarios. Y si me preguntas por qué, te diré que no lo sé; sólo supongo que es debido a cómo maneja Access los formularios y subformularios, pero tal vez esté equivocado ;-)

2008 Patxi Sanz
Libro de visitas
Hosted by www.Geocities.ws

1