本文只适用于 Microsoft Access 项目 (.adp)。 但是,下面的解决方法向您说明了如何继续使用存储过程作为窗体的记录源,同时又能成功地实现 WHERE 条件或过滤器。 小心:执行本示例中的步骤将会修改示例 Access 项目 NorthwindCS.adp。您可能需要备份 NorthwindCS.adp 文件,并在项目副本上执行这些步骤。 打开示例项目 NorthwindCS.adp。 在“数据库”窗口中,单击以突出显示 Categories 表,然后单击插入菜单上的自动窗体。 在设计视图中打开窗体。 从主窗体中删除标有 Table.Products 的子窗体对象,然后向该窗体中添加一个命令按钮。如果向导启动,请单击取消。 为命令按钮设置下列属性:Name:cmdFilterProducts Caption:Filter Products On Click:[Event Procedure] 将该命令按钮的 onClick 属性设置为以下事件过程:Private Sub cmdFilterProducts_Click() DoCmd.OpenForm "Products", acNormal, , , acFormEdit, acWindowNormal End Sub 在文件菜单上,单击“关闭并返回到 Microsoft Access”。 在文件菜单上,单击保存,然后将窗体另存为 Categories1。 在“数据库”窗口中,单击查询,然后单击新建。 在新建查询对话框中,单击创建文本存储过程,然后单击确定。 键入或粘贴以下 Transact-SQL 语句,然后关闭并使用 spProducts 的默认名称保存该过程:CREATE PROCEDURE spProducts @CatID int AS SELECT * FROM Products WHERE CategoryID = @CatID RETURN 在设计视图中打开 Products 窗体,然后将 Record Source 属性从 Products 更改为 spProducts。 向下滚动到窗体的 InputParameters 属性,然后为该属性分配以下值: @CatID int = Forms![Categories1]![CategoryID] 小心:执行本示例中的步骤将会修改示例 Access 项目 NorthwindCS.adp。您可能需要备份 NorthwindCS.adp 文件,并在项目副本上执行这些步骤。 重现问题的步骤 按照本文此前“解决方法”部分中的第 1 到 5 步进行操作。 将该命令按钮的 onClick 属性设置为以下事件过程:Private Sub cmdFilterProducts_Click() DoCmd.OpenForm "Products", acNormal, , "[CategoryID] = " & Me!CategoryID, acFormEdit, acWindowNormal End Sub 在文件菜单上,单击关闭并返回到 Microsoft Access。 在文件菜单上,单击保存,然后将窗体另存为 Categories1。 在窗体视图中打开窗体。 浏览到类别名称 Confections,然后单击 Filter Products(过滤产品)按钮。注意,Products 窗体仅打开并显示那些类别为 Confections 的产品。 关闭 Products 和 Categories1 这两个窗体。 在“数据库”窗口中,单击查询,然后单击新建。单击 创建文本存储过程,然后单击确定。 键入或粘贴以下 Transact-SQL 语句,然后关闭并使用 spProducts 的默认名称保存该过程:CREATE PROCEDURE spProducts AS SELECT * FROM Products RETURN 在设计视图中打开 Products 窗体,然后将 RecordSource 属性从 Products 更改为 spProducts。 关闭并保存 Products 窗体,然后打开 Categories1 窗体。 浏览到类别名称 Confections,然后单击 Filter Products(过滤产品)按钮。请注意,Products 窗体打开并显示所有产品,而不只是 Confections 类别中的那些产品。 |