Formulario o informe que está enlazado a un procedimiento almacenado o una función no se aplica la condición WHERE


Moderada: Requiere macro básico, codificación y conocimientos de interoperabilidad.


En este artículo sólo se aplica a un proyecto de Microsoft Access (.adp).


Síntomas


Cuando intenta filtrar un formulario o informe Access mediante un valor que se muestra en otro objeto, como otro formulario de Access, no se aplica el filtro.

Solución


Hay varios métodos que se podrían usar para resolver la incapacidad para filtrar un formulario o un informe que está enlazado a un procedimiento almacenado o una función. La mayoría de estas soluciones implica reemplazar el procedimiento almacenado o la función con algún otro tipo de origen de registros, como una tabla, una vista o una instrucción SQL.

Sin embargo, la resolución siguiente muestra cómo puede seguir al utilizar un procedimiento almacenado como el origen de registros para un formulario mientras se implementan correctamente una condición WHERE o un filtro.

Precaución: Si sigue los pasos de este ejemplo, modificará el proyecto de Access de ejemplo NorthwindCS.adp. Puede que desee hacer copia de seguridad del archivo NorthwindCS.adp y seguir estos pasos en una copia del proyecto.

  1. Abra el proyecto de ejemplo NorthwindCS.adp.
  2. En la ventana Base de datos, haga clic para resaltar la tabla Categorías y, a continuación, haga clic en Autoformulario en el menú Insertar .

    Nota: Si utiliza Access 2007, haga clic para resaltar la tabla Categories en la ventana Base de datos y, a continuación, haga clic en formulario en el grupo formularios de la ficha crear .
  3. Abra el formulario en la vista Diseño.
  4. Elimine el objeto de subformulario que esté etiquetado como tabla.productos desde el formulario principal y, a continuación, agregue un botón de comando al formulario. Si inicia el asistente, haga clic en Cancelar.
  5. Establezca las siguientes propiedades del botón de comando:

    Name: cmdFilterProducts
    Caption: Filter Products
    On Click: [Event Procedure]
  6. Establezca la propiedad AlHacerClic (OnClick) del botón de comando como el siguiente procedimiento de evento:
    Private Sub cmdFilterProducts_Click()
    DoCmd.OpenForm "Products", acNormal, , , acFormEdit, acWindowNormal
    End Sub
  7. En el menú archivo , haga clic en Cerrar y volver a Microsoft Access.
  8. En el menú archivo , haga clic en Guardary guarde el formulario como Categories1.

    Nota: En la barra de herramientas de Acceso rápido , haga clic en Guardar.
  9. En la ventana Base de datos, haga clic en consultasy, a continuación, haga clic en nuevo.

    Nota: Si utiliza Access 2007, haga clic en Asistente para consultas , en el grupo otros de la ficha crear .
  10. En el cuadro de diálogo Nueva consulta , haga clic en Crear un procedimiento almacenado de textoy, a continuación, haga clic en Aceptar.
  11. Escriba o pegue la siguiente instrucción de Transact-SQL, cerrar y guardar el procedimiento con el nombre predeterminado de spProducts:
    CREATE PROCEDURE spProducts
    @CatID int
    AS
    SELECT * FROM Products WHERE CategoryID = @CatID
    RETURN
  12. Abra el formulario productos en la vista Diseño y, a continuación, cambie la propiedad Origen de registros de productos a spProducts.
  13. Desplácese hacia abajo hasta la propiedad ParámetrosEntrada (InputParameters) del formulario y, a continuación, asignar el siguiente valor para esta propiedad:
    Int @CatID = Forms! [Categories1]! [IdCategoría]
  14. Cierre y guarde el formulario de productos y, a continuación, abra el formulario Categories1.
  15. Busque el NombreCategoría reposteríay haga clic en el botón Filtro de productos . Observe que el formulario productos abre y muestra sólo los productos donde la categoría es igual a repostería.

Estado


Este comportamiento es por diseño.

Más información


A menudo, un usuario de acceso desee limitar el número de registros que aparecen en un formulario de Access o un informe. Un método para hacerlo es para filtrar registros en el formulario (o informe) con una condición WHERE y utilizar otro objeto para proporcionar el valor condicional. Por ejemplo, un formulario puede mostrar un valor condicional que se utilizará con el fin de limitar el número de registros que se mostrarán por otro formulario. Sin embargo, si el formulario que está intentando filtrar tiene un procedimiento almacenado o una función como origen de registros, se omite el filtro. Los pasos siguientes ilustran este comportamiento.

Precaución: Si sigue los pasos de este ejemplo, modificará el proyecto de Access de ejemplo NorthwindCS.adp. Puede que desee hacer copia de seguridad del archivo NorthwindCS.adp y seguir estos pasos en una copia del proyecto.

Pasos para reproducir el comportamiento en Access 2003

  1. Siga los pasos 1 a 5 de la sección "Solución" anteriormente en este artículo.
  2. Establezca la propiedad AlHacerClic (OnClick) del botón de comando como el siguiente procedimiento de evento:
    Private Sub cmdFilterProducts_Click()
    DoCmd.OpenForm "Products", acNormal, , "[CategoryID] = " & Me!CategoryID, acFormEdit, acWindowNormal
    End Sub
  3. En el menú archivo , haga clic en Cerrar y volver a Microsoft Access.
  4. En el menú archivo , haga clic en Guardary, a continuación, guarde el formulario como Categories1.
  5. Abra el formulario en la vista formulario.
  6. Busque el NombreCategoría reposteríay haga clic en el botón Filtro de productos . Observe que el formulario productos abre y muestra sólo los productos donde la categoría es igual a repostería.
  7. Cierre los productos y el Categories1 formularios.
  8. En la ventana Base de datos, haga clic en consultasy, a continuación, haga clic en nuevo. Haga clic en Crear un procedimiento almacenado de textoy, a continuación, haga clic en Aceptar.
  9. Escriba o pegue la siguiente instrucción de Transact-SQL, cerrar y guardar el procedimiento con el nombre predeterminado de spProducts:
    CREATE PROCEDURE spProducts
    AS
    SELECT * FROM Products
    RETURN
  10. Abra el formulario productos en la vista Diseño y, a continuación, cambiar la propiedad OrigenDelRegistro (RecordSource) de productos a spProducts.
  11. Cierre y guarde el formulario de productos y, a continuación, abra el formulario Categories1.
  12. Busque el NombreCategoría reposteríay haga clic en el botón Filtro de productos . Observe que el formulario productos abre y muestra todos los productos en lugar de sólo los productos de la categoría de repostería.