Búsqueda personalizada

10 sept 2013

Pin It

Widgets

Basar un cuadro combinado en otro

19:39

Pego aquí un resultado de la página http://office.microsoft.com, ya que este tema me costó varios días de quebradero de cabeza y cuando encontré esto ví el cielo abierto.

Basar un cuadro combinado en otro

Pregunta: ¿cómo puedo crear un cuadro combinado que limite su lista en función de la selección realizada en otro cuadro combinado?    
El segundo cuadro combinado se basa en una consulta que coincide con las files que contienen el valor seleccionado en el primer cuadro combinado. También tendrá que colocar código de Microsoft Visual Basic para Aplicaciones (VBA) en algunos eventos de control y formulario. El código garantiza que los cuadros combinados muestren los valores correctos cuando se produzcan determinados eventos (por ejemplo, cuando se realice una selección en el primer cuadro combinado o cuando el formulario se abra por primera vez. En primer lugar, veamos las propiedadesRowSource y RowSourceType  .

Introducción a las propiedades RowSource y RowSourceType

La propiedad RowSource permite definir el origen de los elementos que aparecen en el cuadro combinado. Se utiliza junto con la propiedad RowSourceType para indicar a Access cómo tiene que rellenar el cuadro combinado. Por ejemplo, puede establecer la propiedad RowSourceType en Tabla o consulta y, a continuación, establecer la propiedad RowSource en el nombre de una consulta. Access ejecutará la consulta y usará los resultados para rellenar el cuadro combinado.
Hoja de propiedades mostrando las propiedades Row Source y Row Source Type
No es necesario utilizar una consulta guardada. Si la propiedad RowSourceType está establecida en Tabla o consulta, puede crear una consulta que exista como declaración SQL SELECT en la propiedad RowSource del cuadro combinado. Esta es la técnica empleada en el formulario de ejemplo de la base de datos a la que se refiere este artículo.
En la tabla siguiente, se enumeran las posibles configuraciones de la propiedad RowSourceType.
CONFIGURACIÓNDESCRIPCIÓN
Tabla o consultaLos datos se obtienen de una tabla, una consulta o una declaración SQL especificado mediante la propiedad RowSource. Esta es la opción predeterminada.
Lista de valoresLos datos se obtienen de una lista de elementos especificados mediante la propiedadRowSource.
Lista de camposLos datos se obtienen de una lista de nombres de campo de una tabla, una consulta o una declaración SQL especificado mediante la propiedad RowSource.
La mayoría de las veces, utilizará la opción Tabla o consulta, que es la predeterminada.

Crear el formulario de ejemplo

Puede descargar la base de datos de ejemplo de este artículo. En la base de datos, encontrará un formulario de ejemplo en el que se demuestra la técnica que se explica aquí. Para crear su propio formulario de ejemplo, inicie Access y siga los pasos de la siguiente sección expandible y, a continuación, siga con el resto de la columna.

Cómo agregar criterios a la consulta por productos

Como puede hacer que Access rellene un cuadro combinado con los resultados de una consulta, también puede agregar criterios a dicha consulta para limitar lo que aparece en el cuadro combinado. En nuestro caso, queremos que los criterios del segundo cuadro combinado sólo limiten los resultados de las filas que coinciden con el valor del primer cuadro combinado.
Por ejemplo, supongamos que desea tener un cuadro combinado de categorías con el nombre Categoría y cuadro combinado de productos con el nombre Producto. Quiere que al hacer clic en el cuadro combinadoCategoría sólo aparezcan en el cuadro combinado Producto los productos de dicha categoría. Esto se puede conseguir colocando criterios en la consulta del cuadro combinado Producto que coincide con el valor actual en el cuadro combinado Categoría.
Para agregar criterios a la consulta    
  1. Abra la hoja de propiedades del cuadro combinado Producto combo box.
  2. Haga clic en el cuadro Origen de la fila y, a continuación, haga clic en el botón de puntos suspensivos (...) cuando aparezca.
  3. En el Generador de consultas, asegúrese de que en la lista de cuadrícula de campos aparecen las columnas de la tabla Productos que desea que aparezcan en el cuadro combinado Producto, por ejemplo, IdProducto, NombreProducto, etc. Asegúrese de incluir el campo Id. de categoría.
  4. En la columna IdCategoría de la cuadrícula del Generador de consultas, escriba [Formularios]![Formulario combinado]![Categoría] en la fila Criterios, sustituyendo "Formulario combinado" por el nombre de su formulario. Los criterios indican a Access que restrinja los resultados de la consulta sólo a las filas que coincidan con el valor que está actualmente seleccionado en el cuadro combinado Categoría. La cuadrícula del Generador de consultas tendrá un aspecto parecido al de la ilustración siguiente.
Criterios del Generador de consultas para vincular cuadros combinados
  1. Por último, cierre el Generador de consultas y, a continuación, cierre la hoja de propiedades de consulta haciendo clic en  cuando Access le pregunte si desea guardar los cambios.
Access insertará una declaración SQL en la propiedad RowSource cuando cierre el Generador de consultas. La declaración SQL incluye una cláusula WHERE parecida a la siguiente:
WHERE (((Products.CategoryID)=[Forms]![Combo Form]![Category]))
La cláusula WHERE restringe las filas a aquéllas que coinciden con el valor del cuadro combinado Categoría.
  1. Guarde el formulario.

Comprender las propiedades BoundColumn y ColumnCount

Una de las ventajas de usar el Asistente para cuadros combinados es que rellena automáticamente las propiedades que necesita. Dos de estas propiedades merecen una explicación más detallada.
  • La propiedad BoundColumn indica a Access qué columna del cuadro combinado contiene el valor que se va a asociar al control. Esta propiedad contiene un número que representa una columna en el origen de la fila, empezando con 1 y siguiendo en progresión con 2, 3, etc., de izquierda a derecha. Normalmente se selecciona la columna que contiene la clave primaria, como IdCategoría o IdProducto. De este modo, si se hace referencia al valor de control, se obtiene el valor del campo IdCategoría o IdProducto de la fila seleccionada.
Por ejemplo, la expresión [Formularios]![Formulario combinado]![Categoría] (escrita en la cuadrícula del Generador de consultas en la ilustración anterior) devuelve el valor almacenado en la propiedad BoundColumnde la fila seleccionada en el control de cuadro combinado Categoría. Se devuelve el valor del campo IdCategoría porque la propiedad BoundColumn del cuadro combinado Categoría está establecida en el valor 1, que representa la columna IdCategoría. A continuación, la consulta utiliza el valor IdCategoría para buscar coincidencias con las filas del cuadro combinado Producto.
  • La propiedad ColumnCount indica a Access cuántas columnas hay en el cuadro combinado. Por ejemplo, en el cuadro combinado Categoría, el valor de esta propiedad se establece en 2 porque hay dos columnas en el origen de la fila: IdCategoría y NombreCategoría. Para el cuadro combinado Producto la propiedadColumnCount se establece en 3, porque el origen de las filas incluye las columnas, IdProducto, NombreProducto y IdCategoría.
Tenga en cuenta que al calcular un valor para ColumnCount, debe contar todas las columnas cuyo valor va a estar disponible en Access, tanto si la columna se puede ver en el cuadro combinado como si no. Puede ocultar una columna usando la propiedad ColumnWidths.
Para obtener más información, consulte la sección Ocultar algunas columnas.

Cómo mantener actualizado el cuadro combinado

El cuadro combinado Producto debe actualizarse cada vez que cambie el valor del cuadro combinado Categoría. Para ello, puede agregar código VBA vara volver a consultar el origen de filas del cuadro combinado Productocada vez que se actualice el cuadro combinado Categoría. Access proporciona un evento AfterUpdate sólo para este fin.
Echemos un vistazo al código del evento AfterUpdate. Primero, establecemos el valor del cuadro combinadoProducto en Nulo con el objeto de asegurar que inicialmente no aparezca nada en el cuadro. Es una buena idea, porque una vez elegida esta categoría, el valor que esté seleccionado en ese momento en el cuadro combinadoProducto deja de ser válido (puesto que el producto que se está mostrando pertenece a la categoría anterior. 
A continuación, se llama al método NuevaConsulta para volver a rellenar el cuadro combinado Producto en función de la categoría actual. Por último, el cuadro Producto está preestablecido en el primer elemento de la lista usando la propiedad ItemData. La propiedad ItemData devuelve el valor de la fila especificada en un cuadro combinado o un cuadro de lista. Como la lista es de base cero, no olvide elegir 0 como índice para la primera fila en lugar de 1.
Private Sub CategoryAfterUpdate()
  Me.Product = Null
  Me.Product.Requery
  Me.Product = Me.Product.ItemData(0)
End Sub
Para obtener instrucciones detalladas paso a paso sobre cómo colocar el código en el evento AfterUpdate del cuadro combinado Categoría, consulte la siguiente sección expandible.

Qué hacer al abrir el formulario

Cuando abra el formulario por primera vez, puede que los cuadros combinados no muestren ningún valor porque aún no ha elegido ninguno. Para el formulario de ejemplo, decidí que sería mejor mostrar el primer valor de la lista de categorías y el primer producto de esa categoría, así que coloqué el siguiente código de VBA en el eventoLoad. La llamada al código tiene lugar la primera vez que se abre el formulario. Establece la categoría en el primer valor de la lista y, a continuación, se realiza la llamada al procedimiento Category_AfterUpdate para actualizar el cuadro combinado Producto.
Private Sub Form_Load(Cancel As Integer)
  Me.Category = Me.Category.ItemData(0)
  Call Category_AfterUpdate
End Sub
El formulario de ejemplo usa cuadros combinados no enlazados. Los cuadros combinados no enlazados son los que no están vinculados a un campo en una tabla o en una consulta. En cambio, si usa cuadros combinadosenlazados, probablemente no le convendrá emplear el procedimiento Form_Load descrito anteriormente, porque restablece la categoría cada vez que se carga el formulario. Si es así, elimine ese código o use un código como el siguiente:
Private Sub Form_Load(Cancel As Integer)
  If IsNull(Category) Then
    Me.Category = Me.Category.ItemData(0)
    Call Category_AfterUpdate
  End If
End Sub
Esta versión sólo restablece la categoría si está vacía.
Para obtener instrucciones detalladas paso a paso sobre cómo colocar el código en el evento Load del formulario, consulte la siguiente sección expandible.

Cómo realizar el desplazamiento entre registros

Si usa cuadros combinados enlazados, puede utilizar la técnica que se describe aquí, pero deberá tener en cuenta lo que desea que ocurra cuando el registro actual cambie como resultado del desplazamiento del usuario entre los registros. En ese caso, puede que tenga que volver a consultar el segundo cuadro combinado cada vez que se desplace de un registro a otro. La forma más adecuada de hacerlo es utilizar el evento Current del formulario con un código parecido al del ejemplo siguiente:
Private Sub Form_Current()
  Me.Product.Requery
End Sub
Para obtener instrucciones detalladas paso a paso sobre cómo colocar el código en el evento Current del formulario, consulte la siguiente sección expandible.

Ocultar algunas columnas

Cuando cree el cuadro combinado Producto, tendrá que incluir (como mínimo) las columnas IdProducto, NombreProducto e IdCategoría, pero lo más probable es que sólo desee ver la columna NombreProducto. Para ocultar las columnas que no desea mostrar, puede configurar la propiedad ColumnWidths del cuadro combinadoProducto como se muestra en la ilustración siguiente. 
Propiedad de ancho de columnas en el cuadro combinado Producto
La propiedad ColumnWidths permite especificar el ancho de cada columna del cuadro combinado en pulgadas (o en centímetros, si está utilizando el sistema métrico). Las medidas de las columnas se separan mediante punto y coma. Para las columnas que desee ocultar, establezca el ancho en 0.
Tenga en cuenta que aunque se establezca el valor de la columna en cero y se oculte, ésta sigue existiendo y sus valores siguen estando disponibles para. De este modo, en la ilustración anterior del cuadro combinadoProducto, las columnas IdProducto e IdCategoría están ocultas, pero los valores siguen estando disponibles. De hecho, Access proporciona la propiedad Column para que pueda obtener el valor actual de cualquier columna en la fila seleccionada en un cuadro combinado. Por ejemplo, Product.Column(0) devuelve el valor de la columna IdProducto, Product.Column(1) devuelve el de la columna NombreProducto y Product.Column(2) el de IdCategoría.

Descargar la base de datos de ejemplo

La base de datos de ejemplo incluye el ejemplo que hemos utilizado en este artículo y datos de ejemplo obtenidos de la base de datos Northwind.mdb incluida en Access.

Mercedes Conde Blanco

Escrito por

Si tienes alguna otra duda, o quieres comentar algo sobre el tema, te animo a que dejes un comentario. También puedes visitar nuestro foro. ¡Un saludo!

0 comentarios:

Publicar un comentario

 

© 2014 Aplicaciones ...---Chey---.... All rights resevered. Designed by Chey Developer

Back To Top
Recibe las actualizaciones directo a tu correo