ipad能用盗版软件吗:在查询和报表中使用参数 - Access - Microsoft Office

来源:百度文库 编辑:中财网 时间:2024/04/29 17:32:11

在查询和报表中使用参数

适用于: Microsoft Office Access 2003

打印 全部显示全部隐藏

2004 3 29

作者:Sal Ricciardi

查询您提供了查询数据的手段。本文将向您介如何用参数更灵活地使用查询表,以及如何通自己设计的窗体提供参数。我们还提供了数据示例供您下

适用于 Microsoft Office Access 2003
Microsoft Access 2002

查看所有 Office 专栏
查看专栏文章:如何计算经过的时间(2004 年 2 月 9 日)


问题:如何建一个查询,使我能更改条件而无需每次都更改查询设计

您应在查询中使用参数。首先让我们根据使用环境考虑这一需求。数据库的主要用途是提供数据信息:“我公司最畅销的产品是什么?谁是我们的最佳客户?我公司在哪些方面没有达到销售目标?”所有这些问题都是您可能需要一个设计良好的数据库为您提供的信息。若要从 Access数据库中得到这些问题的答案,您可以创建一个选择查询 (选择查询:就表中存储的数据提出问题,然后在不更改数据的情况下以数据表的形式返回一个结果集。),选择合适的表,然后输入所需的条件 (条件:所指定的限制查询或筛选的结果集中包含哪些记录的条件。)。

随着时间的推移,您通常会发现自己经常询问相同的问题,也就是说会重复运行多次同样的查询。但有时在问题本身相同的情况下,搜索的值或条件发生了更改。例如,可能您今天希望查看饮料 (Beverages) 的销售情况,明天希望查看调味品 (Condiments)的销售情况,而后天又希望查看糖果 (Confections)的销售情况(暂停一下,我自己也要吃一块巧克力了)。这就意味着您必须在“设计”模式中打开查询,更改条件以指定饮料,运行查询,然后再次将其更改为调味品,运行查询,再次将其更改为糖果……依此类推。

如果您经常运行相同的查询但每次都更改查询条件,则使用查询参数将会节省您的时间。通过使用查询参数,您可以创建一个查询,要求用户提供搜索值。这样,您就可以反复使用查询而无需更改查询设计。

查询参数简介

查询参数(通常称为参数)为实际值的占位符。若要使用查询参数,您必须首先打开现有的查询,或创建一个新的查询并重新选择表和字段。若要创建参数,请在查询设计网格的“条件”行中键入一个短语,包含在方括号中(请参阅下面红圈中的示例)。当您运行查询时,Access 将读取方括号中的参数并提示您在“输入参数值”对话框中输入参数值。您输入的值将作为参数传送到查询中。就如同您在查询设计网格中直接键入了该值一样,但您已经无需更改查询设计了。

您在参数方括号中所提供的文本将作为您在“输入参数值”对话框中看到的提示,因此您应谨慎使用短语并确保其能够明确表示需要用户输入的信息。该短语同样将作为 Access 识别该参数的名称。

您输入值后(例如在上例中您输入了“Confections”),Access 继续处理查询,选择所需的日期,然后在数据表中显示查询结果。

如果您按 Enter 但没有提供参数值,Access 将显示一个空数据表。

使用多个参数

包含参数的查询称为“参数查询”。有时您可能希望参数查询提示输入多个参数值。例如,您要设计一个查询来汇总产品销售数据。每次您运行查询时,希望输入产品类别和销售时间段的开始和结束日期。

对于这样的查询,您需要三个参数。Access 允许您在多个字段中分别指定参数;此外,您也可以在一个字段中指定多个参数。在本例中,您可以在“CategoryName”字段中添加一个参数,并在“OrderDate”字段中添加两个参数。在“OrderDate”字段中,您可以在两个参数间使用内置的名为 Between...And 的运算符来告知 Access 仅包含指定开始日期和结束日期之间的销售记录。结果查询设计网格显示如下:

当您运行查询时,Access 连续显示三个“输入参数值”对话框提示您输入参数值:分别用于输入类别名称、开始日期和结束日期。

使用“查询参数”对话框

通常,您希望对“输入参数值”对话框的显示顺序进行进一步的控制。例如,您可能希望首先显示“Category Name”提示,然后再显示“Enter Start Date”“Enter End Date”参数提示。您可以使用“查询参数”对话框来完成此操作。若要打开“查询参数”对话框,请首先在“设计”视图中打开查询,然后在“查询”菜单上单击“参数”

您在“查询参数”对话框中输入的值可以进行两方面的控制:第一是显示参数的顺序,第二是应为每个参数输入的数据类型。若要填写该对话框,请按照您希望的参数显示顺序输入参数,请谨慎输入文本使其与查询设计网格中的文本完全相同。您也可以在网格中选择文本,按Ctrl+C 复制,然后按 Ctrl+V 将其粘贴到“查询参数”对话框的字段中。请注意,参数文本仅为方括号中的文字;不包含 BetweenAnd 等运算符。

当您运行参数查询时,Access 将使用您在“查询参数”对话框中选择的数据类型验证您输入的数据。例如,如果您选择了日期/时间数据类型并输入 2004 2 31 (不存在的日期),Access 将显示错误消息“您为该字段输入的值无效”,并且您必须重新输入日期。如果您在“查询参数”对话框中输入参数而未指定数据类型,Access 将把输入的值转换为文本数据类型。

使用自定义窗体收集参数

用户询问更为频繁的一个关于参数的问题是,如何使用窗体而不是“输入参数值”对话框来将参数值传递给查询。使用窗体与使用“查询参数”对话框相比具有下列优点:

  • 如果有多个参数,您会发现使用窗体提交参数值要比使用多个提示对话框分别提交每个参数更为方便。多个“输入参数值”提示意味着您不得不单击“确定”或按 Enter 多次。如果您使用窗体,则可以一次输入所有的字段,然后单击“确定”或按 Enter 一次即可。
  • 您可以在提交窗体之前重新编辑刚刚输入的参数值。您可以按 Shift+Tab 移至前一个字段并进行修改,无需重新输入所有的参数值。
  • 通过使用窗体,您可以选择使用更适用于要输入的参数类型的控件 (控件:允许用户控制程序的图形用户界面对象,如文本框、复选框、滚动条或命令按钮等。可使用控件显示数据或选项、执行操作或使用户界面更易阅读。),使输入参数值更加简单。例如,您可以使用组合框来选择“Category”的值,而无需在文本框中输入。
  • 您可以在窗体中附加使用 Visual Basic for Applications (VBA,Access 使用的编程语言) 编写的代码,从而使用更强大的数据验证功能,而不仅是 Access 通过“输入参数值”对话框进行的简单数据类型检查。

创建窗体以将参数传递给查询

假设您希望查看一段时间内某种类别产品的销售汇总记录。您可以结合使用窗体、查询和简单的 VBA 代码。窗体的作用类似于标准的 Windows 对话框,用于输入和编辑参数值。在您单击“确定”后,窗体会调用预先设计的与其相关的查询。

以上显示的“Sales By Category Summary Query”参数窗体包含在示例数据库(英文)中,该数据库对这一技术进行了演示。若要创建该窗体,您需要执行多个步骤。我将首先对其进行综述,然后在需要的情况下提供每个步骤详细的操作说明,您可以展开下面的小节进行查阅。

创建“Sales By Category Summary Query”参数窗体    

  1. 新建窗体并添加输入参数所需的控件。
  2. 修改查询使其从窗体上的控件获取参数值。
  3. 在窗体上添加“OK”按钮,其作用为运行查询并关闭窗体。
  4. 添加“Cancel”按钮,其作用为关闭窗体而不执行查询。

首先,在“设计”视图中新建窗体,然后仔细选择并添加相应的控件以用于输入“Category”、“Start Date”和“EndDate”参数(请参阅下面关于每个步骤的详细操作说明)。对于本例中的窗体,我选择使用组合框来选择产品类别,使用两个文本框输入日期。对于组合框,我选择“Categories”表作为行来源,这样 Access 会自动使用所有类别名称填充组合框。

下一步,通过设置必要的属性 (属性:控件、字段或对象的命名属性,可以通过设置属性来定义对象的某种特征(如大小、颜色或屏幕位置)或对象行为的某个方面(如对象是否隐藏)。)自定义窗体及其控件的行为和外观。例如,我将窗体的属性更改为“对话框边框”,因为我希望窗体边框的外观和行为与典型 Windows 对话框相同。我还将“Category”组合框的认值属性值更改为“Beverages”,使组合框包含预加载的值。

以下是每个步骤的详细操作说明:

详细步骤说明:新建窗体并添加控件以用于输入参数

创建窗体    

  1. 在“数据库”窗口中,在“对象”下,单击“窗体”,然后单击“新建”
  2. 显示“新建窗体”对话框后,单击“设计视图”,然后单击“确定”

Access 将显示新创建的窗体。

创建“Beverages”组合框    

  1. 在工具箱中,单击“组合框”

 注释   如果工具箱不可见,请在“视图”菜单上,单击“工具箱”

  1. 确认选中了“工具箱”上的“控件向导” 按钮。然后在窗体上所需的位置单击并拖动组合框。
  2. 显示“组合框向导”后,单击“使用组合框查阅表或查询中的值”。单击“下一步”
  3. 单击“Categories”表,然后单击“下一步”
  4. “可用字段”框中,单击“CategoryName”。单击向右箭头将“CategoryName”字段移至“选定字段”框中,然后单击“下一步”
  5. 在第一个组合框中,选择“CategoryName”作为排序依据,然后单击“下一步”
  6. 保持“隐藏键列(建议)”复选框为选中状态,然后单击“下一步”
  7. 将组合框的标签更改为“Category Name:”,然后单击“完成”
  8. 右键单击新建的组合框,然后单击“属性”
  9. 如下所示设置组合框的下列属性:
属性   值设为: 名称 Category 绑定列 2 默认值 Beverages

创建“Category Name”、“Enter start date”和“Enter end date”文本框    

  1. 在工具箱上,单击“文本框”,然后将新建的文本框拖动到窗体上的所需位置。

Access 将显示新文本框,其左侧带有标签。

  1. 右键单击新建文本框的标签,然后单击“属性”。显示“属性”窗口后,将标签的标题属性更改为“Enter start date:”
  2. 仍使用打开的“属性”窗口,单击该文本框。将文本框的“名称”属性更改为“StartDate”
  3. 将文本框的“默认值”属性更改为="1/1/1997",然后关闭“属性”窗口。
  4. 单击“工具箱”中的“本框”添加另一个文本框。将新建的文本框拖动到窗体上的所需位置。

新文本框的左侧带有标签。

  1. 右键单击该标签,然后选择“属性”。显示“属性”窗口后,将标签的“标题”属性更改为“Enter end date:”
  2. 仍使用打开的“属性”窗口,单击该文本框并将其“名称”属性更改为“EndDate”
  3. 将文本框的“默认值”属性更改为="12/31/1997"
  4. 关闭“属性”窗口。
  5. 右键单击“Category Name”标签,指向“大小”,然后单击“正好容纳”。然后对“Enter start date”“Enter end date”标签重复该操作。

设置窗体属性    

  1. 通过向内拖动窗体的右下角来缩小窗体。
  2. “编辑”菜单上,单击“选择窗体”
  3. “视图”菜单上,单击“属性”
  4. 显示“属性”窗口后,单击“格式”选项卡,然后将“边框样式”属性设为对话框边框
  5. 如下所示设置下列窗体属性:
属性   值设为: 标题 Sales By Category Summary Query 允许“数据表”视图 否 允许“数据透视表”视图 否 允许“数据透视图”视图 否 滚动条 两者均无 记录选择器 否 导航按钮 否 分隔线 否 自动居中 是 控制框 否 最大最小化按钮 无 关闭按钮 否

保存窗体    

  1. “文件”菜单上,单击“另存为”
  2. “另存为”对话框中,键入“Sales By Category Form”
  3. 单击“确定”

如果窗体及其控件都按照需要正常工作,就可以保存窗体并开始修改相关的查询。首先请在“设计”视图中打开查询。然后修改查询使其引用窗体上控件中包含的数据(原先您曾使用方括号中的参数来传递数值)(具体操作请参阅详细步骤说明)。例如,如果需要 Access 使用窗体上“Category”控件的值作为查询中“Category”字段的参数值,请在查询设计网格的条件行中输入下列文本:

[Forms]![Sales By Category Form]![Category]

第一个组件 [Forms] 告知 Access 查找“窗体”集合 (集合:包含一组相关对象的对象。每当集合发生变化后,对象在集合内的位置可能也会发生变化。因此,集合中任何特定对象的位置都可能发生变化。)。Access 使用多个集合,分别包括表、查询、报表、数据访问页,以及宏和模块。Access 通常将对象组织成集合。

第二个组件指定“窗体”集合中特定的窗体。在本例中,窗体名称为 [Sales By Category Form]。第三个组件[Category]表示控件的名称。包含全部三个组件的名称(如此例所示)即为“完全符合要求”。有时您可以在名称中仅包含控件名称(而不是完全符合要求的名称),Access 会自动确定其余组件。

这并不是我们现在所要做的,因为我们需要将 Access 指向特定的窗体。

如果我们以相反的顺序读取在条件字段中输入的文本,也就是说告知 Access 获取“Category”控件中的值,而“Category”控件在“Sales By Category Form”窗体中,该窗体可以在当前打开的数据库的“窗体”集合中找到。该值即成为查询设计中该单元格的条件,就好像您直接输入了该值一样。

您可以采用相同的步骤为“Order Date”字段输入条件,替换 Access 将从中获取参数值的窗体中相应控件的名称。最后,您的查询设计应类似于下列文本:

在本例中,我从 Access 附带的 Northwind.mdb 示例数据库中引用了“Sales By Category”查询,修改后将其保存为“Sales By Category Query”。

以下是每个步骤的详细操作说明:

详细步骤说明:修改查询使其从窗体上的控件获取参数值

  1. 在“设计”视图中打开查询。在此例中,我将使用 Northwind.mdb 中的“Sales By Category”查询。
  2. 在查询设计网格中,在“CategoryName”列中,单击“条件”字段。
  3. 键入“[Forms]![Sales By Category Form]![Category]”
  4. 在查询设计网格中,在“OrderDate”列中,单击“条件”字段。
  5. 将条件更改为“Between [Forms]![Sales By Category Form]![StartDate] And [Forms]![Sales By Category Form]![EndDate]”
  6. “文件”菜单上,单击“另存为”。在“另存为”对话框中,键入“Sales By Category Query”,然后单击“确定”

在参数窗体中添加命令按钮

若要提供一种提交参数或取消查询途径,您需要添加两个命令按钮。通常这两个按钮是“OK”和“Cancel”。如果您已完成输入参数并准备提交查询,可以单击“OK”。如果您改变了想法并且不希望运行查询,可以单击“Cancel”。

添加“OK”和“Cancel”按钮的过程非常简单。若要添加命令按钮,请在“设计”视图中打开窗体,选择“工具箱”,然后单击“工具箱”中的“命令按钮”。如果“工具箱”不可见,请在“视图”菜单上单击“工具箱”。然后,在工具箱中单击“命令按钮”,将鼠标指针移至窗体上方,然后单击鼠标创建命令按钮。如果显示“命令按钮向导”,请单击“取消”

执行上述操作创建“OK”按钮,然后再次执行上述操作创建“Cancel”按钮。这时两个按钮通常具有 Access 自动生成的名称,类似于“Command1”和“Command2”(或“Command”和其他数字的组合)。

然后,右键单击第一个按钮并单击“属性”。显示“属性”窗口后,将标题更改为“OK”。然后单击“事件”选项卡。显示“事件”选项卡后,单击“单击”事件 (事件:由对象识别的操作,如鼠标单击或按键,可为这些操作定义响应。事件可能由用户操作或 Visual Basic 语句引发,或者由系统触发。)字段。

只要您在“窗体”视图中单击命令按钮,即触发单击事件。通过为该事件添加 VBA 代码,您可以告知 Access 在用户单击命令按钮时执行何种操作。请单击字段旁边显示的省略号按钮 (...)。

Access 将显示“选择生成器”对话框。请单击“代码生成器”,然后单击“确定”。在代码编辑器中输入下列代码,使 OK_Click 过程如下所示:

Private Sub OK_Click()Me.Visible = FalseDoCmd.OpenQuery "Sales By Category Query", acViewNormal, acEditDoCmd.Close acForm, "Sales By Category Form"End Sub

该过程首先隐藏参数窗体并使其不可见。然后 DoCmd.OpenQuery 语句运行名为“Sales By Category Query”的查询。该查询中的参数引用了窗体上控件中的值。调用查询后,该过程将关闭参数窗体。

“Cancel”按钮的“单击”事件也需要添加少量的 VBA 代码。首先,右键单击第二个按钮并单击“属性”。显示“属性”窗口后,将“标题”属性更改为“Cancel”。然后单击“事件”选项卡。显示“事件”选项卡后,单击“单击”事件,然后单击省略号按钮 (...)。显示“选择生成器”对话框后,请选择“代码生成器”,然后单击“确定”。在代码编辑器中输入下列代码,使 Cancel_Click 过程如下所示:

Private Sub Cancel_Click()DoCmd.Close 'Close FormEnd Sub

完成编辑代码后,请在“文件”菜单上单击“保存”。然后在“文件”菜单上,单击“关闭并返回到 Microsoft Office Access”。最后,关闭除数据库窗口外的其他所有窗口。您已经完成了所有工作啦!现在您就可以运行“Sales By Category Form”窗体,该窗体会依次运行参数查询。

在本部分的示例数据库中包含的“Sales By Category Form”窗体和“Sales By Category Query”查询演示了上述技术。

在报表中使用参数

带有参数的查询非常适用于问题的查询和答案的显示,特别是需要经常变更查询条件的情况下。但是有时您需要对问题答案的数据显示进行更全面的控制,需要更灵活地组织和显示汇总信息,并需要更好地支持信息的打印,特别是打印多页信息数据的情况下。对于这样的需求,您需要使用报表。

Access的报表设计功能提供了多种灵活的方式用于信息显示。其灵活性还包括选择报表的数据源。例如,您可以基于表、查询或“结构化查询语言”(SQL)代码来创建报表。SQL 是查询、更新和管理数据库常用的语言。所有的 Access 查询都基于 SQL 来实现。

由于可以根据查询创建报表,您也可以使用参数查询。若要实现该操作,请将报表的“记录源”属性设为参数查询的名称。首先在“设计”视图中打开报表,然后在“编辑”菜单上单击“选择报表”。最后在“视图”菜单上单击“属性”

然后您可以单击“记录源”组合框并选择查询或表。记录属性将告知 Access 报表数据的来源。当您运行报表时,Access 会运行查询并提示您输入参数值,如同直接运行查询时提示您输入参数值一样。

使用的每一个参数都会使 Access 运行报表时显示一个“输入参数值”对话框,因此如果您使用了多个参数,也可以考虑在此使用窗体。示例数据库中的“Sales By Category Report”报表演示了使用窗体将参数提交到报表的过程。该过程依赖于 Access 处理事件的顺序。

创建窗体为报表应用参数

Access 使用一种同时由系统和用户触发并生成事件的模型。例如,单击鼠标生成事件。在 Access中打开窗体生成多个事件。甚至运行报表也会生成一系列事件。其中许多事件可以使用 VBA 代码进行响应。事实上对事件作出响应是自定义 Access数据库的一种主要的方式。因此,了解需要对何种事件作出响应非常重要。

当 Access 打开报表时,首先运行与报表的 Open 事件相关的代码。由于 Access 会首先处理 Open 事件,然后再运行生成报表数据的查询,您可以通过 Open 事件运行一个窗体,并使用该窗体向查询提供参数。这就是示例数据库中“Sales By Category Report”报表的基本原理。

以下是实现该方法的具体步骤:

  • 打开报表。
  • Access 处理与报表的 Open 事件相关的代码。
  • 这部分代码打开用于收集参数的窗体。
  • 输入参数并单击“OK”
  • Access 隐藏窗体,但窗体并未关闭。
  • Access 处理将生成报表数据的查询。
  • 查询从已经隐藏的窗体上的控件获取参数值,执行查询,然后将结果传递到报表。
  • 完成报表并显示结果。
  • 当您关闭报表时,与报表的 Close 事件相关的代码会关闭已经隐藏的窗体。

为了演示相关技术,我创建了名为“Sales by Category Dialog”的窗体和名为“Source Query forSales By Category Report”的查询,然后修改了 Access 附带的 Northwind.mdb示例数据库中的“Sales By CategoryReport”报表的一个副本。当您打开修改后的报表并准备进行打印或查看时,报表会首先打开一个窗体以收集参数。然后 Access会运行查询来向报表提供数据 — 查询会将窗体控件中的数值赋给报表中的参数。您可以在示例数据库中找到相关的窗体、查询和报表。

若要在报表的 OpenClose 事件中输入代码,请在“设计”视图中打开报表。然后在“编辑”菜单上单击“选择报表”。然后在“视图”菜单上单击“属性”。单击“事件”选项卡,然后单击打开属性。单击字段旁边显示的省略号按钮 (...)。显示“选择生成器”对话框后,请单击“代码生成器”,然后单击“确定”

“Sales By Category Report”报表的 CloseOpen 事件中的 VBA 代码如下所示:

Private Sub Report_Close()DoCmd.Close acForm, "Sales By Category Dialog"End SubPrivate Sub Report_Open(Cancel As Integer)' Set public variable to true to indicate that the report' is in the Open eventbInReportOpenEvent = True' Open Sales By Category DialogDoCmd.OpenForm "Sales By Category Dialog", , , , , acDialog' Cancel Report if User Clicked the Cancel ButtonIf IsLoaded("Sales By Category Dialog") = False Then Cancel = True' Set public variable to false to indicate that the' Open event is completedbInReportOpenEvent = FalseEnd Sub

报表的 Open 事件过程 (Report_Open) 首先将变量 (变量:已命名存储位置,所包含的数据能够在程序执行过程中发生变动。每一变量都有名称,在它的作用域级别范围内能够唯一标识该变量。既可以指定数据类型,也可以不指定。)bInReportOpenEvent 的值设为 True,以表明报表的 Open 事件正在执行。这部分代码会首先执行,以便其他过程(特别是“Sales by Category Dialog”的 Open 事件过程)可以引用该变量以确定报表的 Open 事件是否正在执行。

然后,DoCmd.OpenForm 语句打开窗体以便用户输入参数值。当您单击“OK”“Cancel”提交窗体时,相关代码会检查窗体是否关闭(即确认您单击了“Cancel”)。请回忆一下,如果您单击“OK”,则会隐藏窗体,而参数仍可用于生成报表数据的查询。如果已关闭窗体,则会取消报表。最后,bInReportOpenEvent 变量被设为 False 以表明报表的 Open 事件已完成。

报表的 Close 事件代码相对比较简单,只是在关闭报表时关闭隐藏的窗体。

在窗体的事件中加入代码

用于创建“Sales by Category Dialog”窗体的步骤与早先用于创建窗体以用于向查询提交参数的步骤相同。不同之处并非在于创建窗体的方式,而是为窗体事件添加的代码。例如,由于该窗体应直接被报表的 Open 事件调用(而不是通过其自身或其他过程调用),窗体的 Open 事件包含对其(打开条件)进行检验的代码。“Sales by Category Dialog”窗体的代码如下所示:

Private Sub Cancel_Click()DoCmd.CloseEnd SubPrivate Sub Form_Open(Cancel As Integer)If Not bInReportOpenEvent Then' If we're not called from the reportMsgBox "For use from the Sales By Category Report only", vbOKOnlyCancel = TrueEnd IfForm_Open_Exit:Exit SubEnd SubPrivate Sub OK_Click()Me.Visible = FalseEnd Sub

打开窗体时,Access 会调用窗体的 Open 事件过程 (Form_Open)。其中的代码检验并确定报表的 Open 事件是否正在执行。如果未执行,则认为窗体已被报表外的其他对象或代码打开。例如,可能从数据库窗口中直接打开了窗体。由于窗体并未设计为用于这种方式,窗体代码将显示相应的提示信息,并关闭窗体。反之,如果报表的 Open 事件确实正在执行,则窗体的 Open 事件过程将顺利打开窗体以供用户编辑。您可以在窗体中输入和编辑参数。

您单击“OK”后,窗体的属性被设为 False。这样将会隐藏窗体,而窗体控件中输入的值仍然可用,报表会继续执行。如果您单击“Cancel”,决定不运行报表,窗体会被关闭。报表的 Open 事件代码会检测到这一情况并取消运行报表。

下载示例数据库

该示例数据库(英文)包含的窗体、查询和报表演示了参数的使用,并带有 Access 附带的 Northwind.mdb 示例数据库中的示例数据。

下一期文章

希望下一期文章介绍哪些内容?请将您的宝贵意见和建议发至 msaccess@microsoft.com。