VS 和 CrystalReport 报告指南(全)
原文:
zh.annas-archive.org/md5/ecf79c1d847d07af59dd9dbc4960aadd译者:飞龙
协议:CC BY-NC-SA 4.0
前言
对于希望创建成功软件的开发者来说,报告至关重要。Crystal Reports 是一款出色的报告工具,因为它与 Visual Studio 和其他开发工具兼容。Crystal Reports 与许多数据库兼容,易于使用。它是一款功能强大的报告工具,可以以最少的努力创建任何报告。这本书与其他技术书籍不同,因为它不仅描述了 Crystal Reports 和 Visual Studio 中的工具和功能,还包含了一个包含八个报告的示例应用程序。每个报告都有一个新想法,并教会读者一个新工具。读者不仅学习如何创建报告,还学习如何在 Microsoft Visual Studio 应用程序中显示这些报告。
这本书涵盖的内容
第一章, 设置需求,将展示如何安装我们将使用的工具。
第二章, 设计示例应用程序,包含了我们将创建的示例应用程序的描述。
第三章, 选择正确的数据,将展示如何使用 Microsoft Visual Studio 连接到数据库并运行 SQL 查询,并讨论数据集和 TableAdapter。
第四章, 创建 您的第一个报告,将展示如何创建一个简单的报告并在我们的应用程序中显示此报告。
第五章, 增强报告,将展示如何使用分组、筛选和子报告来增强报告。
第六章, 处理交叉表报告,介绍了交叉表是什么,并描述了如何使用它。
第七章, 处理图表,涵盖了 Crystal Reports 中的不同类型的图表,并描述了如何使用它们。
您需要为这本书准备什么
您需要在您的系统上安装以下软件以运行本书中的示例:
-
Microsoft Visual Studio 2012
-
Crystal Reports for Visual Studio 2012
-
Microsoft SQL Server 2008
-
Northwind 数据库
这本书适合谁
这本书是为新接触 Crystal Reports 的开发者编写的。它也将对希望使用 Microsoft Visual Studio 探索 Crystal Reports 中一些新技术的中级用户有所帮助。读者应具备基本的 C#、Microsoft Visual Studio 和结构化查询语言(SQL)知识。
约定
在这本书中,您将找到许多不同风格的文本,以区分不同类型的信息。以下是一些这些风格的示例,以及它们含义的解释。
文本中的代码词如下所示:"下载源文件后,将其解压,然后双击vs_premium.exe文件以开始安装过程。"
新术语和重要词汇以粗体显示。你在屏幕上看到的单词,例如在菜单或对话框中,在文本中显示如下:“点击确定按钮以保存更改并运行应用程序以测试新外观。”
注意事项
警告或重要注意事项以这样的框显示。
小贴士
小贴士和技巧看起来像这样。
读者反馈
我们始终欢迎读者的反馈。告诉我们你对这本书的看法——你喜欢什么或可能不喜欢什么。读者反馈对我们开发你真正从中获得最大收益的标题非常重要。
要发送一般反馈,只需发送电子邮件到feedback@packtpub.com,并在邮件主题中提及书籍标题。
如果你在某个领域有专业知识,并且对撰写或参与一本书籍感兴趣,请参阅我们的作者指南www.packtpub.com/authors。
客户支持
现在你已经是 Packt 书籍的骄傲拥有者,我们有一些事情可以帮助你从购买中获得最大收益。
错误清单
尽管我们已经尽一切努力确保我们内容的准确性,但错误仍然会发生。如果你在我们的书中发现错误——可能是文本或代码中的错误——如果你能向我们报告这一点,我们将不胜感激。通过这样做,你可以帮助其他读者避免挫折,并帮助我们改进本书的后续版本。如果你发现任何错误清单,请通过访问www.packtpub.com/submit-errata,选择你的书籍,点击错误清单提交表单链接,并输入你的错误清单详情。一旦你的错误清单得到验证,你的提交将被接受,错误清单将被上传到我们的网站,或添加到该标题的错误清单部分。任何现有的错误清单都可以通过从www.packtpub.com/support中选择你的标题来查看。
盗版
互联网上对版权材料的盗版是一个跨所有媒体的持续问题。在 Packt,我们非常重视我们版权和许可证的保护。如果你在互联网上发现我们作品的任何非法副本,无论形式如何,请立即向我们提供位置地址或网站名称,以便我们可以追究补救措施。
请通过链接copyright@packtpub.com与我们联系,并提供涉嫌盗版材料的链接。
我们感谢你在保护我们的作者和提供有价值内容的能力方面的帮助。
问题
如果你在这本书的任何方面遇到问题,可以通过questions@packtpub.com联系我们,我们将尽力解决。
第一章. 设置需求
在本书中,我们将创建一个示例报告应用程序,并且我们需要安装一些工具以准备开始。我们将使用 Microsoft Visual Studio 2012 设计我们的示例报告应用程序,使用 Crystal Reports 设计报告,使用 Microsoft SQL Server 2008 作为数据库引擎,以及使用 Northwind 作为示例数据库。在我们开始之前,我们必须安装所有这些应用程序。
在本章中,我们将涵盖以下主题:
-
安装 Microsoft Visual Studio 2012
-
安装 Crystal Reports
-
安装 Microsoft SQL Server 2008
-
安装 Northwind 数据库
安装 Microsoft Visual Studio 2012
由于我们将使用 Microsoft Visual Studio 来创建我们的示例报告应用程序,让我们首先在我们的机器上安装它。
获取源代码
可以通过访问以下网址从 Microsoft 网站下载 Microsoft Visual Studio 2012 源代码:
www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop
我们将在示例中使用高级版。下载源文件后,提取它,然后双击vs_premium.exe文件以开始安装。
安装
现在我们已经下载并解压了源文件,让我们将其安装到我们的机器上。
-
许可协议:如以下截图所示,我们可以通过点击浏览按钮并选择我们希望安装文件的目录来更改安装目录。勾选我同意许可条款和条件复选框以完成安装,然后点击下一步按钮。
![安装]()
-
可选功能:如以下截图所示,我们可以在 Visual Studio 中自定义安装功能。在我们的报告示例应用程序中,我们需要Microsoft SQL Server Data Tools,因此我们可以取消选择所有其他功能。但最好在我们的机器上安装所有功能。选择完功能后,点击安装按钮。
![安装]()
-
安装过程:如以下截图所示,对话框仅显示安装过程的状态。这可能需要几分钟。
![安装]()
-
设置成功:几分钟后,一个对话框会弹出告诉我们我们已经成功在我们的机器上安装了 Visual Studio。
安装适用于 Visual Studio 2012 的 Crystal Reports
现在我们已经完成了 Visual Studio 的安装,让我们安装 Crystal Report。
获取源代码
Crystal Reports 源代码可以从以下 SAP 网站下载:www.sap.com/index.epx。
以下是从 Microsoft 网站下载 Crystal Reports 的步骤:
-
点击以下截图所示的免费试用链接:
![获取源代码]()
-
点击如下截图所示的SAP Crystal Reports,Microsoft Visual Studio 开发者版本:获取源代码
-
点击如下截图所示的现在下载 SAP Crystal Reports,Microsoft Visual Studio 开发者版本:获取源代码
-
如下截图所示,如果您有账户,请点击立即登录,如果没有账户,请注册并点击立即下载以开始下载。获取源代码
此版本与 Microsoft Visual Studio 2012 兼容。下载源代码后,双击CRforVS_13_0_5.exe文件以开始安装。
安装
-
安装语言:选择英语语言并点击如下截图所示的确定按钮:安装
-
欢迎:阅读此对话框中的说明和警告,然后点击如下截图所示的下一步>按钮:安装
-
许可协议:仔细阅读许可协议。然后选中我接受许可协议复选框,并点击如下截图所示的下一步按钮:安装
-
确认:如下截图所示,点击下一步按钮开始安装。安装软件到我们的机器上可能需要几分钟时间。安装
-
安装成功:此步骤告诉我们 Crystal Reports 已成功安装,并询问我们是否希望安装 64 位运行时。选中复选框并点击如下截图所示的完成按钮:安装
安装 Microsoft SQL Server 2008
现在我们来安装 SQL Server 2008。
获取源代码
Microsoft SQL Server 2008 源代码可以从 Microsoft 网站下载:
www.microsoft.com/en-us/default.aspx
以下是将 Microsoft SQL Server 2008 下载的步骤:
-
在如下截图所示中输入
download sql server 2008 r2 service pack 2以搜索 SQL Server 2008 r2 服务包 2:获取源代码 -
选择下载并点击第一个结果:获取源代码
-
点击下载:获取源代码
-
选择与您的 Windows 兼容的 SQL Server 2008 版本。我使用的是 Windows 7,64 位,所以我选择了如下截图所示的
SQLServer200BR2SP2-KB2630458x64-ENU.exe版本的 SQL Server 2008。点击下一步按钮开始下载。获取源代码 -
下载完成后,我们可以在找到名为
SQLServer2008R2SP2-KB2630458-x64-ENU.exe的文件;双击下载的文件以开始安装。
安装
以下是将 Microsoft SQL Server 2008 安装的步骤:
-
SQL Server 安装中心:如以下截图所示,选择 Installation,然后点击 New SQL Server stand-alone installation or add features to an existing installation 链接。安装截图
-
设置支持规则:如以下截图所示,Microsoft 在安装过程中检查可能发生的问题,以便在安装过程开始之前修复它们。如果任何检查失败,请点击 Show details >> 以找出出错的原因。修复它,然后点击 Re-run。如果测试成功完成,请点击 OK。安装截图
-
产品密钥:如以下截图所示,我们可以通过选择 Enter the product key: 单选按钮并填写产品密钥来输入产品密钥。如果不输入产品密钥而继续,请选择 Specify a free edition: 以评估 SQL Server 2008,然后点击 Next。安装截图
-
许可条款:阅读条款和条件后,选择 I accept the license terms 复选框,然后点击 Next。
-
设置支持文件:只需点击 Next 即可完成安装。
-
设置支持规则:如以下截图所示,Microsoft 检查在安装 SQL Server 设置支持文件时可能发生的问题。如果有任何问题,我们需要在完成安装之前修复它。如果没有问题,我们可以完成安装并点击 Next>。安装截图
-
功能选择:如以下截图所示,我们将选择要在我们的机器上安装哪些功能。对于基本安装,我们只需要安装 数据库引擎服务 和 管理工具 – 基本版。但始终安装所有功能会更好。选择您希望在机器上安装的功能后,点击 Next。安装截图
-
实例配置:如以下截图所示,我们可以选择保留 默认实例 名称 MSSQLSERVER,或将其更改为任何其他名称。尽管如此,建议您保留默认名称。另一方面,我们可以将安装目录更改为任何具有所需空间的目录。点击 Next。安装截图
-
磁盘空间需求:只需点击 Next 即可完成安装。
-
服务器配置:如以下截图所示,我们将设置用于运行 SQL Server 的 服务帐户。由于我们在自己的机器上安装 SQL Server,我们将使用所有服务的内置网络服务帐户(此帐户不需要密码)。在 帐户名称 列中,为所有服务选择 NT AUTHORITY\NETWORK SERVICE,然后点击 Next>。安装截图
-
数据库引擎配置:如以下截图所示,我们将选择身份验证安全模式。有两种类型的身份验证:
-
Windows 身份验证:当用户通过 Microsoft Windows 用户帐户连接时,SQL 服务器使用 Windows 操作系统的信息验证帐户名称和密码。这是默认的身份验证模式,比混合模式更安全。
-
混合模式:此身份验证模式允许用户通过 Windows 身份验证和 SQL 服务器身份验证连接。通过 Windows 用户帐户连接的用户可以使用由 Windows 验证的信任连接。如果您选择混合模式身份验证,您必须为所有 SQL 服务器登录设置强密码。
-
-
选择混合模式(SQL 服务器身份验证和 Windows 身份验证)并输入密码(让我们假设我们使用
asd123作为 SQL 服务器密码)。重新输入密码以确认,然后点击添加当前用户。完成此操作后,点击下一步>。![安装]()
-
分析服务配置:如果我们不在功能选择对话框中选择分析服务,我们将跳过此步骤。点击添加当前用户然后点击下一步。
-
报表服务配置:如果我们在功能选择对话框中不选择报表服务配置,则此步骤将被跳过。保留默认选项并点击下一步。
-
错误和用法报告:此步骤询问我们是否希望将错误信息发送给 Microsoft。保留选项选中并点击下一步按钮。
-
安装规则:此对话框检查是否有任何进程或其他安装正在运行,这将中断 SQL Server 2008 的安装。如果有任何问题,我们必须在安装之前修复它。如果没有问题,点击下一步。
-
准备安装:此步骤显示将在我们的计算机上安装的所有功能。点击安装以完成安装。
-
安装进度:SQL 服务器现在将安装在我们的计算机上。安装过程完成后,我们将看到一张表格,显示已安装在我们计算机上的所有功能。
-
完整:我们将看到一个小的对话框告诉我们 Microsoft SQL 服务器安装已成功完成。点击关闭以关闭此对话框。然后我们将看到主安装中心。我们可以关闭它。现在您将需要重新启动计算机。
在 Microsoft SQL Server 2008 中安装 Northwind 数据库
现在我们已经完成了 Microsoft SQL 服务器的安装,让我们安装 Northwind 数据库。
获取源
Northwind 数据库源可以从以下 Microsoft 网站下载:
www.microsoft.com/en-us/default.aspx
-
通过输入
下载 Northwind 数据库如以下截图所示来搜索 Northwind 数据库的下载:![获取源]()
-
如以下截图所示,点击第一个结果:
![获取源]()
-
如以下截图所示,点击下载以开始下载:
![获取源]()
-
下载完成后,我们将得到一个名为
SQL2000SampleDb.msi的文件。双击此文件以开始安装。
安装
以下是在我们的机器上安装 Northwind 数据库的步骤:
-
欢迎对话框:如以下截图所示,它只是一个欢迎对话框。点击下一步按钮。
![安装]()
-
许可协议:选择我同意单选按钮,并如以下截图所示点击下一步:
![安装]()
-
选择安装选项:我们将保留默认设置,如以下截图所示,然后点击下一步。
![安装]()
-
确认安装:我们现在可以在我们的机器上安装 Northwind 数据库,并点击下一步。
![安装]()
-
安装数据库:如以下截图所示,数据库脚本将安装在我们的本地驱动器上。
![安装]()
-
安装完成:在脚本安装完成后,我们将在
C:\中找到一个名为SQL Server 2000 Sample Databases的文件夹。我们将使用这些文件之一将 Northwind 数据库安装到 SQL Server 2008 中。 -
打开 SQL Server Management Studio:从开始菜单选择所有程序,然后选择Microsoft SQL Servers 2008,并点击SQL Server Management Studio。
-
连接到 SQL Server 2008:如以下截图所示,从服务器类型菜单中选择数据库引擎,服务器名称是localhost(或“.”),这代表我们的机器。身份验证类型是SQL Server 身份验证,与安装过程中选择的相同选项。登录名称是
sa,代表 SQL Server 的默认用户,密码是asd123或安装 SQL Server 时输入的密码。填写完所有字段后,点击连接。![安装]()
-
在 SQL Server 2008 中创建 Northwind 数据库:打开
C:\SQL Server 2000 Sample Databases。这是数据库脚本安装的位置。将包含创建我们服务器上 Northwind 数据库所需的所有 SQL 脚本的filenamedinstnwnd.sql文件拖动到 SQL Server Management Studio 中。如以下截图所示,点击执行按钮来运行脚本。![安装]()
-
在所有脚本正确执行后,我们将在数据库中看到 Northwind,如以下截图所示:
![安装]()
摘要
在本章中,我们学习了如何设置完成我们的示例应用所需的所有工具。在下一章中,我们将从设计我们的应用开始,我们将看到这个应用包含了大多数类型的 Crystal Reports。
第二章:设计示例应用程序
在本章中,我们将学习如何使用 Microsoft Visual Studio 2012。我们将创建我们的应用程序,并通过研究该应用程序的工作原理,我们将学习 Visual Studio 的功能。我们还将设计我们的界面并验证我们的数据。到本章结束时,我们将拥有我们应用程序的最终设计。
在本章中,我们将涵盖以下主题:
-
创建新应用程序
-
向表单添加控件
-
验证表单数据
-
在纸上绘制我们的报告
创建新应用程序
我们现在将开始使用我们在上一章中安装的 Microsoft Visual Studio:
-
从开始菜单,选择所有程序,然后选择Microsoft Visual Studio 2012文件夹,然后选择Visual Studio 2012。
-
由于我们第一次运行 Visual Studio,我们将看到以下截图。我们可以选择默认环境设置。我们还可以在我们的应用程序中更改此设置。我们将使用 C#作为编程语言,因此我们将选择Visual C# 开发设置并单击启动 Visual Studio按钮。
![创建新应用程序]()
-
现在,我们将看到 Microsoft Visual Studio 2012 的起始页。选择新建项目或通过导航到文件 | 新建 | 项目来打开它。如图所示:
![创建新应用程序]()
-
如以下截图所示,我们将选择Windows作为应用程序模板。然后我们将选择Windows 窗体应用程序作为应用程序类型。让我们将我们的应用程序命名为
Monitor。选择您想要保存应用程序的位置,然后单击确定。![创建新应用程序]()
现在我们将看到以下截图。让我们开始设计我们的应用程序界面。
![创建新应用程序]()
-
首先右键单击表单,导航到属性,如图所示:
![创建新应用程序]()
-
属性资源管理器将打开,如图所示。将文本属性从Form1更改为
monitor,将名称属性更改为MainForm,然后将大小更改为322, 563,因为我们将在表单中添加许多控件。在我完成设计过程后,我发现这是合适的表单大小;您可以根据需要更改表单大小和所有控件的大小,以更好地适应您的应用程序界面。![创建新应用程序]()
向表单添加控件
在这一步中,我们将通过向主表单添加控件来开始设计我们的应用程序界面。
我们将把主表单分为三个主要部分如下:
-
员工
-
产品和订单
-
员工和产品
员工
在本节中,我们将看到我们可以以不同的方式搜索我们的员工,并在报告中显示结果的不同方法。
开始设计过程
让我们按照以下步骤开始设计应用程序的员工部分:
-
从工具箱资源管理器中,将分组框拖放到主窗体。将分组框的大小属性更改为
286, 181,将位置属性更改为12,12,将文本属性更改为员工。 -
向主窗体添加标签。将文本属性更改为
ID,将位置属性更改为12,25。 -
向主窗体添加文本框,并将名称属性更改为
txtEmpId。将位置属性更改为70, 20。 -
向主窗体添加分组框。将分组框的大小属性更改为
250,103,将位置属性更改为6, 40,将文本属性更改为过滤器。 -
向主窗体添加标签。将文本属性更改为
标题,将位置属性更改为6,21。 -
向主窗体添加组合框。将名称属性更改为
cbEmpTitle,将位置属性更改为56,17。 -
向主窗体添加标签。将文本属性更改为
城市,将位置属性更改为6,50。 -
向主窗体添加组合框。将名称属性更改为
cbEmpCity,将位置属性更改为56,46。 -
向主窗体添加标签。将文本属性更改为
国家,将位置属性更改为6,76。 -
向主窗体添加组合框。将名称属性更改为
cbEmpCountry,将位置属性更改为56,72。 -
向主窗体添加按钮。将名称属性更改为
btnEmpAll,将位置属性更改为6,152,将文本属性更改为全部。 -
向主窗体添加按钮。将名称属性更改为
btnEmpById,将位置属性更改为99,152,将文本属性更改为按 ID。 -
向主窗体添加按钮。将名称属性更改为
btnEmpByFilters,将位置属性更改为196,152,将文本属性更改为按过滤器。
最终的设计将如下截图所示:

产品和订单
在这部分,我们将看到产品和订单之间的关系,以便展示哪些产品的订单量更高。因为我们有很多产品类别和来自不同国家的订单,所以我们通过产品类别和国家来过滤我们的报告。
开始你的设计过程
在我们完成员工部分的设计后,让我们开始设计产品和订单部分。
-
从工具箱资源管理器中,将分组框拖放到主窗体。将分组框的大小属性更改为
284,136,将位置属性更改为12,204,将文本属性更改为产品 – 订单。 -
向主窗体添加分组框。将分组框的大小属性更改为
264,77,将位置属性更改为6,20,将文本属性更改为过滤器。 -
向主窗体添加标签,将文本属性更改为
类别,将位置属性更改为6,25。 -
向主窗体添加组合框。将名称属性更改为
cbProductsCategory,将位置属性更改为61,20。 -
在主表单中添加标签。将文本属性更改为
Country并将位置属性更改为6,51。 -
在主表单中添加组合框。将名称属性更改为
cbOrdersCountry并将位置属性更改为61,47。 -
在主表单中添加按钮。将名称属性更改为
btnProductsOrdersByFilters,将位置属性更改为108,103,并将文本属性更改为By filters。
最终设计看起来如下截图所示:

员工和订单
在这部分,我们将查看员工和订单之间的关系,以便评估每位员工的表现。在本节中,我们将通过一段时间来筛选数据。
开始你的设计过程
在本节中,我们将开始设计应用程序中的最后部分:员工和订单。
-
从工具箱资源管理器中拖放分组框到主表单。将分组框的大小属性更改为
284,175,将位置属性更改为14,346,并将文本属性更改为Employees - Orders。 -
在主表单中添加分组框。将分组框的大小属性更改为264,77,将位置属性更改为
6,25,并将文本属性更改为filters。 -
在主表单中添加标签。将文本属性更改为
From并将位置属性更改为7,29。 -
在主表单中添加日期时间选择器并将名称属性更改为
dtpFrom。将位置属性更改为41,25,将格式属性更改为Short,并将值属性更改为1/1/1996。 -
在主表单中添加标签。将文本属性更改为
To并将位置属性更改为7,55。 -
在主表单中添加日期时间选择器。将名称属性更改为
dtpTo,将位置属性更改为41,51,将格式属性更改为Short,并将值属性更改为12/30/1996。 -
在主表单中添加按钮。将名称属性更改为
btnBarChart,将位置属性更改为15,117,并将文本属性更改为Bar chart。 -
在主表单中添加按钮并将名称属性更改为
btnPieChart。将位置属性更改为99,117,并将文本属性更改为Pie chart。 -
在主表单中添加按钮。将名称属性更改为
btnGaugeChart,将位置属性更改为186, 117,并将文本属性更改为Gauge chart。 -
在主表单中添加按钮。将名称属性更改为
btnAllInOne,将位置属性更改为63,144,并将文本属性更改为All In One。
最终设计看起来如下截图所示:

您可以根据需要更改位置、大小和文本属性;但不要更改名称属性,因为我们将在下一章的代码中使用它。
验证表单数据
当你开始设计你的应用程序时,你需要考虑一些事实,例如性能和图形用户界面(GUI)。你需要遵循的最重要规则之一是易用性。你需要确保用户对你的应用程序感到舒适。减少用户需要输入到你的应用程序中的数据量。因此,在我们的应用程序中,你会发现我们比使用Textbox更多地使用GroupBox,因为当我们使用GroupBox时,选择数据既容易又安全。我们将在下一章中看到如何用对应的数据填充所有 GroupBox 控件。
在纸上绘制你的报告
我们的应用程序将保持简单和完整,并设计为一个包含常见报告类型的单表单。所有报告都将在一个包含Crystal Report Viewer的另一个表单中显示,正如我们将在下一章中看到的。主表单中的每个按钮都设计用来显示报告。
-
btnEmpAll按钮将显示包含所有员工数据的报告,其外观如下面的截图所示:![在纸上绘制你的报告]()
-
btnEmpById按钮将显示包含特定员工数据的报告,其外观如下面的截图所示:![在纸上绘制你的报告]()
-
btnEmpByFilters按钮将显示包含员工数据的报告,并使用cbEmpTitle、cbEmpCity和cbEmpCountryGroupBoxes 中的数据来过滤这些员工,如下面的截图所示:![在纸上绘制你的报告]()
-
btnProductsOrdersByFilters按钮将显示一个交叉表报告,以查看产品与订单之间的关系。我们将使用cbProductsCategory和cbOrdersCountryGroupBoxes 中的数据来过滤数据,如下面的截图所示:![在纸上绘制你的报告]()
-
btnBarChart按钮将显示一个柱状图表报告,以查看员工与订单之间的关系。我们将使用dtpFrom和dtpToDateTimePicker 中的数据来过滤数据,如下面的截图所示:![在纸上绘制你的报告]()
-
btnPieChart按钮将显示一个饼图报告,展示员工与订单之间的关系。我们将使用dtpFrom和dtpToDateTimePicker 中的数据来过滤数据,如下面的截图所示。![在纸上绘制你的报告]()
-
btnGaugeChart按钮将显示一个仪表图表报告,展示员工与订单之间的关系。我们将使用dtpFrom和dtpToDateTimePicker 中的数据来过滤数据,如下面的截图所示:![在纸上绘制你的报告]()
-
btnAllInOne按钮将显示一个类似于以下截图的报告:![在纸上绘制你的报告]()
摘要
在本章中,我们讨论了应用程序的设计。该应用程序包含大多数 Crystal Reports 类型。在下一章中,我们将开始开发我们的应用程序。我们还将学习在创建报告之前如何选择需要显示的数据。
第三章。选择数据
报告是数据的格式化展示。报告用于展示存储在数据库(s)中的信息。因此,第一步是连接到数据库以从中读取数据。在本章中,我们将看到如何使用 Microsoft Visual Studio 连接到数据库并运行 SQL 查询。我们还将讨论 DataSet 和 TableAdapter,并了解如何使用它们来填充我们应用程序中的 ComboBoxes。
在本章中,我们将涵盖:
-
Visual Studio 中的 SQL 查询
-
使用数据填充 ComboBoxes
Microsoft Visual Studio 中的 SQL 查询
通常 SQL 查询分为数据定义语言和数据操作语言。
有许多类型的 SQL 查询,如选择查询、更新查询、删除查询和插入查询。在本书中,我们将只讨论选择查询,因为报告使用选择查询。在我们的示例查询中,我们将使用 Northwind 数据库,并使用 Microsoft Visual Studio 来运行所有 SQL 查询。因此,首先,我们需要连接到我们的数据库。
连接到我们的数据库
-
在 Microsoft Visual Studio 中打开我们的应用程序,Monitor。
-
点击视图并点击服务器资源管理器。
-
在服务器资源管理器中,右键单击数据连接并选择添加连接...。将出现一个类似于下一张截图的对话框:
![连接到我们的数据库]()
-
确保在数据源中Microsoft SQL Server(SqlClient)。
-
因为我们已经在我们的机器上安装了 Microsoft SQL Server,所以我们可以输入
localhost作为服务器名称或写入机器名称。 -
选择使用 SQL Server 身份验证,并以
sa作为用户名输入,并输入您在安装 Microsoft SQL Server 时使用的密码。 -
在数据库字段中输入
Northwind并点击测试连接按钮。 -
如果弹出一个消息框说测试成功,这意味着我们可以继续进行。如果没有,重新输入数据或者如果与 SQL Server 有任何连接问题,进行故障排除。
-
点击确定按钮以连接到数据库,我们将在服务器资源管理器中看到我们的数据库,如图所示:
![连接到我们的数据库]()
添加数据库图表
为了理解 Northwind 数据库及其表之间的关系,我们将创建一个新的数据库图表:
-
右键单击数据库图表并选择添加新图表。在确认消息框中点击是。
-
在添加表对话框中,选择所有表并点击添加按钮。我们可以在下一张图表中看到所有表以及这些表之间的关系。
-
使用默认名称
Diagram1保存图表。![添加数据库图表]()
测试查询
我们需要一个工具来运行查询并测试结果。Microsoft Visual Studio 有一个很好的 IDE 来运行 SQL 查询。我们可以在 服务器资源管理器 中通过右键单击数据库中的任何表名并选择 新建查询 来查看此 IDE。然后,我们将从 添加表 对话框中选择我们将用于查询的表,并点击 确定 按钮。参见图表:

如前一个截图所示,我们的查询 IDE 中有四个部分。第一部分显示我们在查询中使用的所有表,第二部分显示简单的查询构建器,第三部分显示 SQL 查询代码,第四部分显示查询结果。在我们的讨论中,我们将讨论第三和第四部分。
用数据填充组合框
在我们的应用程序中,我们有许多组合框。我们如何用数据填充它们?在本节中,我们将用数据填充组合框,并讨论选择 SQL 查询的基础知识。我们填充应用程序中任何组合框的主要步骤有四个:SQL 查询、TableAdapter、DataSource 和加载事件。在我们开始填充第一个组合框之前,我们需要将数据集添加到我们的应用程序中,以便通过 TableAdapter 保存检索到的数据。
将数据集添加到应用程序
-
在解决方案资源管理器中右键单击 Monitor 应用程序,并导航到 添加 | 新建项。
-
从对话框中选择 数据集,我们将使用默认名称
DataSet1。
填充 cbEmpTitle 组合框
-
选择数据:我们需要用所有员工的职称填充此组合框,且不包含任何重复。
如以下截图所示,我们可以使用
Select查询从Employees表中选择Title,并使用DISTINCT关键字避免重复。![填充 cbEmpTitle 组合框]()
-
创建 TableAdapter:打开
DataSet1,右键单击它并导航到 添加 | TableAdapter,如图所示:![填充 cbEmpTitle 组合框]()
在此步骤中,我们可以创建一个新的连接字符串到我们的数据库或使用我们在 服务器资源管理器 中创建的连接字符串来连接到我们的数据库。这里我们将使用之前创建的连接字符串,然后点击 下一步 按钮;我们将看到以下截图:
![填充 cbEmpTitle 组合框]()
在我们的应用程序中,我们将使用 SQL 语句来访问数据库,因此选择 使用 SQL 语句 并点击 下一步 按钮以查看以下截图:
![填充 cbEmpTitle 组合框]()
在此对话框中,我们将编写之前步骤中准备的 SQL 查询,然后点击 下一步 按钮以查看以下截图:
![填充 cbEmpTitle 组合框]()
在这个对话框中,我们将方法名称更改为
FillTitle和GetTitle,然后点击 下一步 按钮以查看以下截图:![填充 cbEmpTitle 组合框]()
我们需要看到这个对话框来确保所有过程都配置成功,然后点击完成按钮以查看以下截图所示的 TableAdapter:
![填充 cbEmpTitle 组合框]()
在上一张截图中,我们将 DataTable 名称更改为
EmpTitle,并将 TableAdapter 名称更改为EmpTitleTableAdapter。 -
设置组合框数据源:打开主表单;右键单击它并选择查看代码。我们将创建一个新的方法来发布我们的组合框数据。参考以下截图:
![填充 cbEmpTitle 组合框]()
在
PublishEmpTitle方法中,我们从DataSet1创建名为ds的对象,并从EmpTitleTableAdapter创建另一个名为Adapter的对象。然后我们通过TableAdapterAdapter使用FillTitle方法填充我们的数据集ds。最后,我们将cbEmpTitleDataSource分配给ds和DisplayMember到标题。 -
更新加载事件:在主表单的加载事件
MainForm_Load中,我们将调用我们的方法PublishEmpTitle,如下截图所示:![填充 cbEmpTitle 组合框]()
-
测试结果:运行我们的应用程序以测试结果。我们可以看到我们的组合框标题现在已填充了数据;如下截图所示:
![填充 cbEmpTitle 组合框]()
填充 cbEmpCity 组合框
-
选择数据:我们需要将所有城市填充到这个组合框中,且不能有重复。参考以下截图:
![填充 cbEmpCity 组合框]()
-
创建 TableAdapter:请按照上一节中的相同步骤创建 TableAdapter,并将其命名为
EmpCity。TableAdapter 将类似于以下截图:![填充 cbEmpCity 组合框]()
-
设置组合框数据源:参考以下截图中的代码:
![填充 cbEmpCity 组合框]()
-
更新加载事件:参考以下截图中的代码:
![填充 cbEmpCity 组合框]()
-
测试结果:结果将类似于以下截图:
![填充 cbEmpCity 组合框]()
填充 cbEmpCountry 组合框
-
选择数据:我们需要将所有员工国家填充到这个组合框中,且不能有重复,如下截图所示:
![填充 cbEmpCountry 组合框]()
-
创建 TableAdapter:请按照之前的步骤创建 TableAdapter。TableAdapter 将类似于以下截图:
![填充 cbEmpCountry 组合框]()
-
设置组合框数据源:参考以下截图中的代码:
![填充 cbEmpCountry 组合框]()
-
更新加载事件:参考以下截图中的代码:
![填充 cbEmpCountry 组合框]()
-
测试结果:结果将类似于以下截图:
![填充 cbEmpCountry 组合框]()
填充 cbProductsCategory 组合框
-
选择数据:我们需要填充这个组合框,包含所有产品类别,且不重复。请参考以下截图:
![填充 cbProductsCategory 组合框]()
-
创建 TableAdapter:再次,请按照之前的步骤创建 TableAdapter。TableAdapter 将类似于以下截图:
![填充 cbProductsCategory 组合框]()
-
设置组合框数据源:请参考以下截图中的代码:
![填充 cbProductsCategory 组合框]()
-
更新加载事件:请参考以下截图中的代码:
![填充 cbProductsCategory 组合框]()
-
测试结果:结果将类似于以下截图:
![填充 cbProductsCategory 组合框]()
填充 cbOrdersCountry 组合框
-
选择数据:我们需要填充这个组合框,包含
Customers表中的所有国家,且不重复。请参考以下截图:![填充 cbOrdersCountry 组合框]()
-
创建 TableAdapter:请按照之前的步骤创建 TableAdapter。TableAdapter 将类似于以下截图:
![填充 cbOrdersCountry 组合框]()
-
设置组合框数据源:请参考以下截图中的代码:
![填充 cbOrdersCountry 组合框]()
-
更新加载事件:为此,请参考以下截图中的代码:
![填充 cbOrdersCountry 组合框]()
-
测试结果:结果将类似于以下截图:
![填充 cbOrdersCountry 组合框]()
摘要
有效数据比报表设计更为关键,因此我们在报表中显示这些数据之前需要选择正确的数据。在我们开始任何报表应用程序之前,我们需要非常了解数据库/数据,以确保我们的报表包含正确的数据。在本章中,我们学习了如何在 Visual Studio 中编写我们的选择查询以及如何运行此查询。我们学习了如何使用 DataAdapter 填充 ComboBox。在下一章中,我们将开始使用 Crystal Reports,我们将看到如何在我们的应用程序中显示这个报表。
第四章:创建第一个报告
在本章中,我们将看到如何创建一个简单的报告并在我们的应用程序中显示这个报告。我们将首先准备报告数据并将这些数据连接到我们的报告。然后我们将制定我们的报告数据并在我们的应用程序中显示生成的报告。
我们将涵盖以下主题:
-
准备报告数据
-
将报告添加到应用程序中
-
使用数据库专家
-
选择报告模板
-
创建报告部分
-
使用线条和框进行操作
-
使用特殊字段
-
将报告添加到表单中
准备报告数据
在我们开始将 Crystal Reports 添加到我们的应用程序之前,我们需要了解我们将要显示的数据以及在这个报告中将显示哪些数据。查看以下截图中的报告设计:

选择报告数据
正如我们在前面的截图中所看到的,所有报告数据都来自Employees表。SELECT查询将显示如下截图所示:

当我们将报告数据与通过查询检索到的数据进行比较时,我们会发现两个差异变化:
-
全名列:在报告中,全名列显示为一个部分,但在数据库中它由三个部分组成(TitleOfCourtesy、FirstName和LastName)。我们可以在
SELECT查询或报告中解决这个问题。我们可以使用 SQL 查询通过加号(+)运算符将这三个字段合并为一个字段,如下截图所示:![选择报告数据]()
-
直接汇报列:在报告中,直接汇报列显示为姓名,但正如我们在前面的截图中所看到的,它显示为数字。如果我们查看Employee表,我们会看到这个表有一个自连接关系,如下截图所示:
![选择报告数据]()
我们可以通过两种方式修改查询以显示名称而不是数字:
-
使用子查询:我们将更新查询以类似于以下截图:
![选择报告数据]()
-
使用自连接:我们将更新查询以类似于以下截图:
![选择报告数据]()
创建一个 TableAdapter
创建 TableAdapter 的步骤如下:
-
从解决方案资源管理器中打开DataSet1。
-
右键点击并导航到添加 | 表适配器。
-
选择您的连接设置并点击下一步按钮。
-
选择使用 SQL 语句选项并点击下一步按钮。
-
按照前面的截图编写我们的选择查询,然后点击下一步按钮。
-
在后续屏幕上点击下一步按钮,并在最后一个屏幕上点击完成按钮。
-
按照以下截图更改您的适配器名称:
![创建 TableAdapter]()
将报告添加到应用程序中
在本节中,我们将了解如何将 Crystal Reports 添加到我们的应用程序中,以显示数据库中的所有员工数据。
-
在解决方案资源管理器中右键单击我们的应用程序(监控器),然后导航到添加 | 新建项。您将得到以下截图所示的结果:
![向应用程序添加报告]()
-
从左侧菜单中选择报表,然后从右侧选项中选择Crystal Reports。将名称更改为
crAllEmployees.rpt,然后点击添加按钮。您将得到以下截图所示的结果:![向应用程序添加报告]()
-
我们有三种创建报告的选项。从前面的截图中选择标准,并使用报告向导创建报告。我们将在后面的章节中解释其他方法。点击确定按钮以查看以下截图:
![向应用程序添加报告]()
-
在此步骤中,我们将选择我们之前创建的用于此报告的 TableAdapter。我们将展开项目数据 | ADO.NET 数据集 | Monitor.DataSet1,选择Employees TableAdapter,并将其移动到选定表列表中。然后点击下一步按钮,如图所示:
![向应用程序添加报告]()
-
在此步骤中,我们将选择需要在报告中显示的字段,我们可以在报告创建后随时添加/删除这些字段。选择所有必需的字段,将它们移动到要显示的字段菜单,然后点击下一步按钮以查看以下截图:
![向应用程序添加报告]()
-
在此步骤中,我们可以向报告中添加一个分组,但在此报告中我们不需要任何分组。我们将在其他报告中使用分组,并且我们将在创建报告后看到可以添加任何分组。点击下一步按钮以查看以下截图:
![向应用程序添加报告]()
-
在此步骤中,我们可以向报告中添加过滤器,但在此报告中我们不需要任何过滤器。我们将在其他报告中使用过滤器,并且可以在报告创建后添加任何过滤器。点击下一步按钮以查看以下截图:
![向应用程序添加报告]()
-
在此步骤中,我们将选择报告样式。您可以浏览可用的样式并选择您喜欢的样式。我们将选择标准样式并点击完成按钮,以查看以下截图:
![向应用程序添加报告]()
-
本报告包含五个主要部分:
-
第一部分(报告页眉):在此部分插入的任何数据(文本、图像等)将在报告的第一页顶部仅显示一次
-
第二部分(页面页眉):在此部分插入的任何数据(文本、图像等)将在报告每一页的页眉中显示
-
第三部分(详细信息):本节显示来自包含多行返回结果的数据源的数据,例如我们示例中的 Microsoft SQL Server。
-
第四部分(报告页脚):在此节中插入的任何数据(文本、图像等)将在报告最后一页的末尾仅显示一次
-
第五部分(页面页脚):在此节中插入的任何数据(文本、图像等)将在报告每一页的页脚中显示
-
-
我们需要在报告的报告页眉部分添加所有员工文本作为标题,因此我们将将其添加到报告页眉部分:
-
右键点击第二部分(报告页眉)并导航到插入 | 文本对象。
-
双击文本对象并输入
所有员工。 -
右键点击文本对象并选择格式对象,导航到字体选项卡,将样式更改为粗体并将大小更改为12。导航到段落选项卡,将对齐更改为居中并点击确定按钮。
-
将文本对象移动到节区的水平中间。
-
-
我们将格式化所有报告对象和字段,就像我们对所有员工****文本对象所做的那样,以便报告看起来像以下截图:
![将报告添加到应用程序]()
处理线条和框
在本节中,我们将看到如何使用框和线条来增强我们的报告设计。
-
右键点击第二部分(页面标题)并导航到插入 | 框,然后按照以下截图所示绘制一个围绕我们字段的框:
![处理线条和框]()
-
右键点击第二部分(页面标题)并导航到插入 | 线条,然后绘制如图所示的线条:
![处理线条和框]()
-
在字段之间添加一些线条,如图所示:
![处理线条和框]()
使用特殊字段
在 Crystal Reports 中,有许多特殊字段我们可以用于我们的报告;在本节中,我们将看到如何使用这些特殊字段。
我们需要在页面页脚中添加页码和总页数以显示页码在总页数中的位置。为此目的的步骤如下:
-
在我们的报告中右键点击并导航到字段资源管理器。
-
从字段资源管理器,打开特殊字段节点并将页码/总页数拖到第五部分(页面页脚)。当运行报告时,页码/总页数特殊字段将用页码替换N,用总页数替换M。请参见以下截图:
![使用特殊字段]()
将报告添加到表单中
在前面的步骤中,我们已经完成了报告设计;下一步是在用户点击btnEmpAll按钮时显示此报告。
-
首先,我们将添加一个表单,我们将使用该表单来显示所有报告;我们将此表单命名为
ReportForm。 -
从工具箱 | 报告,拖放crystalReportViewer到ReportForm并命名为
crystalReportViewer1。 -
双击btnEmpAll按钮导航到之前的代码。我们将看到btnEmpAll按钮的
click事件。 -
在按钮btnEmpAll的
click事件中,输入以下截图所示的代码:![将报告添加到表单]()
-
此代码有三个部分:
-
准备报告数据:在前三行代码中,我们通过 TableAdapter(EmployeesTableAdapter)填充数据集。
-
将数据传递给我们的报告:在接下来的两行代码中,我们在用数据填充数据集之后将数据集传递给我们的报告。
-
在表单中显示报告:在最后三行代码中,我们将我们的报告传递给ReportForm中的crystalReportViewer1并打开这个表单来显示我们的报告。
-
-
运行我们的应用程序(按F5键)并点击btnEmpAll按钮(全部)来查看我们的报告,如图所示:
![将报告添加到表单]()
摘要
在本章中,我们学习了如何创建一个简单的报告并在我们的应用程序中显示这个报告。我们看到了如何将报告连接到数据库以及如何在报告中显示和格式化数据。在下一章中,我们将创建新的报告来学习数据分组和排序。我们还将学习如何使用参数来过滤表数据。
第五章。增强报告
在上一章中,我们看到了如何创建一个简单的报告并在我们的应用程序中显示这个报告。在本章中,我们将创建一个新的报告,但这个报告将比上一个更复杂。我们将看到如何使用一个或多个字段来分组数据,如何通过参数筛选数据,以及如何添加子报告。
我们将涵盖以下主题:
-
使用参数字段
-
使用公式字段
-
使用子报告
-
分组和排序数据
-
将报告添加到表单中
在本章中,我们将有两个部分。在第一部分,我们将创建一个新的报告来显示员工,就像我们在上一章中创建的那样,但我们将为此新报告添加一些筛选器。这将允许用户选择具有相同数据的员工。在下面的截图中,我们可以看到报告中的所有员工都具有相同的数据(国家、城市和职位)。这可以通过使用参数字段来实现。在第一部分,我们将看到如何使用这些字段。

在第二部分,我们将创建一个新的报告来显示所有员工详细信息和他们的员工订单,如下面的截图所示。我们还将看到如何使用子报告、分组、排序和公式字段。

使用参数字段
我们将以与上一章中创建报告相同的方式创建一个新的报告,步骤如下:
-
我们将使用我们在上一章中创建的相同的 TableAdapter(EmployeesTableAdapter),如下面的截图所示:
![使用参数字段]()
-
向我们的应用程序添加一个新的 Crystal Reports,并将其重命名为
crFilteredEmployees。 -
如以下截图所示,我们将选择作为一个空白报告单选按钮,以了解在创建报告后如何使用报告连接到数据库。点击确定按钮。
![使用参数字段]()
-
从字段资源管理器,右键单击数据库字段并选择数据库专家。选择
Employees表,如下面的截图所示。点击确定按钮。![使用参数字段]()
-
现在当您导航到字段资源管理器 | 数据库字段 | Employees时,您将看到字段表,如下面的截图所示:
![使用参数字段]()
-
将员工字段拖到我们的报告中的详细信息部分,并格式化报告,如下面的截图所示:
![使用参数字段]()
到目前为止,我们的报告会显示所有员工,因此现在我们需要更新这个报告以通过他们的数据(国家、城市和职位)来筛选员工。在接下来的步骤中,我们将看到如何向我们的报告添加筛选器。
-
在字段资源管理器中,右键单击参数字段并选择新建。
如以下截图所示,我们将此参数命名为
pmCountry,并选择其类型为String。我们将保留表单中其他字段的默认值,并点击OK按钮:![使用参数字段]()
-
创建两个更多类型的String参数,分别命名为
pmCity和pmTitle。现在我们共有三个参数,如下截图所示:![使用参数字段]()
到目前为止,我们还没有使用这些参数,它们在我们的报告中没有任何效果。
-
右键单击报告,导航到报告 | 选择公式 | 记录。以下截图显示了这一操作:
![使用参数字段]()
-
我们将编写一些代码将参数应用到我们的报告中,如下截图所示:
![使用参数字段]()
-
在代码的第一行(
{Employees.Title}={?pmTitle})中,我们通过pmTitle参数过滤了员工标题。 -
在第二行代码(
{Employees.Country}={?pmCountry})中,我们通过pmCountry参数过滤了员工国家。 -
在第三行代码(
{Employees.City}={?pmCity})中,我们通过pmCity参数过滤了员工城市。 -
最后,我们使用
and关键字将三条语句绑定在一起,以确保三个过滤器必须一起应用;如果其中一个过滤器失败,其他过滤器也会失败。提示
您可以从上方的报告字段(字段树)中将表和参数字段拖放到代码框中。
-
-
从顶部保存并关闭表单。
到目前为止,我们已经完成了报告设计,现在我们需要在应用程序中显示我们的报告;当用户点击
btnEmpByFilters按钮(按过滤器)时,标题、城市和国家组合框的值将动态传递到我们的报告参数pmTitle、pmCity和pmCountry。 -
从解决方案资源管理器中打开MainForm。双击
btnEmpByFilters按钮,进入点击事件代码,并编写以下截图所示的代码:![使用参数字段]()
我们在上一章中看到了大多数之前提到的代码行,但在这里我们只添加了三条额外的代码行,以动态地将三个参数传递到我们的报告中。这三条代码行如下:
report.SetParameterValue("pmTitle",cbEmpTitle.Text); report.SetParameterValue("pmCountry", cbEmpCountry.Text); report.SetParameterValue("pmCity", cbEmpCity.Text); -
当我们运行应用程序并测试结果时,我们将看到报告结果,具体取决于过滤器中提供的数据。
我们需要改进我们的报告,使用户可以使用一个或两个过滤器,而不是三个过滤器,或者他可以停止所有过滤器。我们将允许用户通过在用于过滤报告数据的组合框中输入
"ALL"字符串来停止任何过滤器。我们只需要更改报告中参数的代码以满足这一改进。 -
在字段资源管理器中右键单击任何参数字段,并选择在公式中查找。
-
将我们之前编写的代码更新为新版本,如以下截图所示,然后保存并关闭。
![使用参数字段]()
-
运行应用程序以测试新的更改。在用于过滤报告数据的三个组合框中输入
"ALL",然后单击 按筛选器 按钮。现在您将看到报告中的所有员工数据。您可以更改一个或两个筛选器,保留其他筛选器以测试报告结果。
在下一节中,我们将创建一个报告来显示所有员工的订单数据。此报告包含一个主报告,其中包含员工数据,以及另一个包含员工订单的子报告。我们将通过在主报告字段中过滤数据来了解如何使用子报告。
-
首先,我们将创建一个包含
Employees表中所有数据的 TableAdapter,选择查询将类似于以下屏幕截图:![使用参数字段]()
在前面的查询中,我们使用了
LEFT OUTER JOIN来选择包含所有员工数据的左表中的所有数据,并在第二个表中存在的情况下选择了主管(ReportsTo)数据。我们没有使用INNER JOIN,因为 ID 为 2 的员工(Fuller)没有主管(ReportsTo)。我们还在使用与之前章节中学习相同的表进行SELF JOIN。TableAdapter 将类似于以下屏幕截图:![使用参数字段]()
-
我们将创建一个新的水晶报告,命名为
crEmployeeDetails,并将Employee1作为报告数据源。将数据字段拖放到报告中的 员工详细信息 部分,并格式化字段以类似于以下屏幕截图:![使用参数字段]()
请注意,在之前的报告中,我们使用了 SQL 查询来显示报告中的员工和主管的全名。在本节中,我们将使用公式字段来显示他们的全名。正如我们在之前的屏幕截图中看到的,全名和汇报对象是公式字段 (@fmu_FullName, @fmu_ReportTo)。现在我们将了解如何使用公式字段。
与公式字段一起工作
在本节中,我们将了解如何使用公式字段以及它们如何有助于提高我们的报告的实用性和强大功能。
-
从 字段资源管理器,右键单击 公式字段 并选择新建。输入公式名称
fmu_FullName并单击 确定 按钮。您将在以下屏幕截图中看到:![与公式字段一起工作]()
此公式字段将以我们之前使用 SQL 查询创建的相同格式显示员工的姓名。在这里,我们使用连接运算符(
+)将头衔与员工的姓氏和名字连接起来。 -
创建另一个公式字段并将其命名为
fmu_ReportsTo。您将在以下屏幕截图中看到公式代码:![与公式字段一起工作]()
-
将两个公式字段拖放到报告中,就像我们之前做的那样。
-
将参数字段添加到报告中,并将其命名为
EmpId。我们将使用此参数按 ID 过滤员工,如下截图所示:![处理公式字段]()
-
从解决方案资源管理器中打开MainForm。双击btnEmpById按钮进入点击事件代码,并编写以下截图所示的代码:
![处理公式字段]()
-
运行应用程序以测试我们的报告,在
txtEmpId文本框中输入一个 ID 号码,然后点击按 ID按钮以测试结果。
通过这一步,我们完成了包含员工数据的主体报告;在接下来的几个步骤中,我们将向主报告添加一个子报告,该子报告将包含员工订单。
处理子报告
现在,我们将看到 Crystal Reports 中的另一个强大工具;那就是子报告。子报告用于在另一个报告中创建报告,并通过关系或过滤器将两个报告链接起来。
-
创建包含员工订单和
Orders表中所有数据的 TableAdapter。我们将根据以下截图将适配器重命名为OrdersByEmployeeIdTableAdapter:![处理子报告]()
-
在主报告中,在细节部分,右键单击并导航到插入 | 子报告。将此子报告拖放到主报告的末尾(在员工细节部分的
Notes字段之后)。然后我们将看到以下截图:![处理子报告]()
如我们所见,我们可以从应用程序报告中选择子报告,从硬盘上导出它,或使用报表向导创建一个新的报告。我们将选择最后一个选项,因此点击报表向导...按钮并完成向导,就像我们之前学过的那样。确保您使用
OrdersByEmployeeId表作为子报告的数据源。我们将子报告命名为crOrdersByEmployeeId并点击确定按钮。 -
右键单击子报告并选择编辑子报告。在子报告中,我们将按国家分组员工订单,因此接下来我们将看到如何在 Crystal Reports 中使用分组。
分组和排序数据
在本节中,我们将看到如何使用一个或多个字段对报告数据进行分组和排序。
-
在字段浏览器中,右键单击分组名称字段并选择插入分组。以下截图将展示这一过程:
![分组和排序数据]()
选择分组字段(ShipCountry)和排序类型(升序)。我们可以通过选项选项卡更改字段标题。点击确定按钮。
-
按以下截图格式化子报告。您可以看到在创建分组后添加到报告中的两个新部分。
![分组和排序数据]()
现在我们需要使用主报告中的参数字段在子报告中过滤数据。
-
返回到主报告,右键单击子报告,并选择更改子报告 链接…。我们将看到以下截图:
![分组和排序数据]()
在此对话框中,我们将主报告中的EmpId参数字段映射到子报告中的EmployeeID。从可用字段列表中,我们将选择EmpId参数并将其移动到要链接的字段(s)列表中。在对话框的最后部分,我们将从右侧下拉列表中选择EmployeeID,将其与左侧下拉列表中的EmpId参数链接。点击确定按钮。
现在两个报告通过一个参数:EmpId连接在一起。最后一步是在向用户显示报告之前填充子报告中的数据。
-
返回到按钮点击事件,更新你的代码,如下截图所示:
![分组和排序数据]()
我们只向旧代码中添加了三行代码,这三行代码用于使用OrdersByEmployeeIdTableAdapter TableAdapter 填充子报告中的数据。
-
运行我们的应用程序以测试最后更改。最终的报告将看起来如下截图所示:
![分组和排序数据]()
-
如前一个截图所示,日期格式包含时间;我们希望更改此格式以仅显示日期。返回到我们的报告,在报告中的任何日期字段上右键单击,选择格式对象,并选择如下截图所示的日期格式:
![分组和排序数据]()
在所有日期字段(BirthDate、HireDate、OrderDate和ShippedDate)更改日期格式后,报告将看起来如下截图所示:
![分组和排序数据]()
摘要
在本章中,我们创建了两个报告,并从第一个报告中学习了如何使用参数字段以及如何使用这些字段来过滤报告数据。在第二个报告中,我们学习了如何使用子报告以及如何使用分组和排序。在下一章中,我们将创建特殊类型的报告,并了解如何创建交叉表报告。
第六章。处理交叉表报表
在本章中,我们将看到 Crystal Reports 中最重要的一种类型:交叉表报表。它是 Crystal Reports 中最强大的工具之一。交叉表报表用于有效地汇总数据,正如我们将在本章中所见。
我们将涵盖以下主题:
-
创建交叉表报表
-
使用交叉表专家自定义交叉表外观
-
进行页面设置
交叉表报表对用户非常有用,因为它以简单的方式汇总了大量信息,从而为用户提供所需的信息。我们可以看到最终报表,如下面的屏幕截图所示:

正如我们在前面的屏幕截图中所见,该报表显示了每个城市的订单产品总和。在我们的应用程序中,用户将选择产品类别和国家。报表将显示前面屏幕截图中的结果。
创建我们的报表
因此,让我们开始创建我们的报表:
-
我们在报表中将使用的 SQL 查询如下所示:
![创建我们的报表]()
-
我们将使用此 SQL 查询创建一个新的 TableAdapter,并将其命名为
ProductsOrdersTableAdapter,如下面的屏幕截图所示:![创建我们的报表]()
-
将一个新的水晶报表添加到我们的应用程序中,并将其命名为
crProductsOrders。正如我们在下面的屏幕截图中所见,我们可以通过选择使用报表向导选项,然后选择交叉表作为专家,来创建我们的报表,或者我们可以选择作为空白报表,然后我们将在报表本身中添加交叉表。我们将选择第二个选项,以便在创建报表后随时添加或修改我们的交叉表,因此我们将选择作为空白报表,如下面的屏幕截图所示:![创建我们的报表]()
-
在字段资源管理器中的数据库字段上右键单击,并选择数据库专家,然后出现一个窗口,如下面的屏幕截图所示。如下所示,我们将选择我们的 TableAdapter ProductsOrders作为数据源:
![创建我们的报表]()
-
在报表上右键单击,导航到插入 | 交叉表,并将其拖到Section1(报表页眉)。正如我们在下面的屏幕截图中所见,我们将ShipCountry和ShipCity添加到列列表中,CategoryName和ProductName添加到行列表中,Quantity添加到汇总字段列表中。从样式选项卡中,我们可以选择任何样式,但首选原始样式。我们将在接下来的几个步骤中看到如何使用自定义样式选项卡。单击确定按钮。
![创建我们的报表]()
-
到目前为止,我们的报告显示了所有产品和国家,因此我们将添加两个参数字段来通过产品类别和运输国家筛选报告数据。第一个参数字段是pmCountry,第二个是pmCategory。请参阅以下截图:
![创建我们的报告]()
-
在报告中添加一个文本对象作为报告标题,并在其中输入
畅销产品。 -
进入我们应用程序的主表单,双击btnProductsOrdersByFilters(按筛选器)按钮以导航到代码背后,并编写代码以在我们的应用程序中显示报告,如图所示:
![创建我们的报告]()
-
运行应用程序以测试结果。从类别列表中选择乳制品,从国家列表中选择英国,如图所示。点击按筛选器按钮以显示报告。
![创建我们的报告]()
-
报告将如下截图所示:
![创建我们的报告]()
自定义交叉表外观
在接下来的几个步骤中,我们将看到如何更新报告以类似于本章开头的设计。
如前一个截图所示,最后两列和最后两行有相同的日期,因此我们将在我们的报告中隐藏最后一列和最后一行。
-
在交叉表的左上角右键单击,选择交叉表专家,然后导航到自定义样式选项卡。我们将选择以下截图中所见的抑制行总计和抑制列总计复选框。点击确定按钮。
![自定义交叉表外观]()
-
运行应用程序以测试结果。它看起来如下截图所示:
![自定义交叉表外观]()
-
在这个报告中,我们可以看到显示的产品数量比我们在本章开头设计的报告中看到的多。因此,我们需要根据订单数量对产品进行排序。
-
在本章开头设计的报告中,我们只显示了订单率最高的两个产品,因此报告标题是各国畅销产品,而不是所有产品。在下一步中,我们将看到如何控制我们报告中显示的产品数量。
-
在交叉表的左上角右键单击,选择分组排序专家,然后导航到以下截图所示的ProductsOrders.ProductName选项卡:
![自定义交叉表外观]()
-
我们将从为此组排序列表中选择Top N值,并在N 在哪里文本框中输入
2以在交叉表中仅显示两个产品。点击确定按钮并运行应用程序以查看以下截图所示的结果:![自定义交叉表外观]()
-
如果我们将这个报告与本章开头设计的报告进行比较,我们会发现它们之间除了文本和数字的格式外没有区别。您可以按照您的需求进行格式化。
-
在下一步中,我们将看到如何更改网格线的格式和单元格的背景颜色。
-
右键点击交叉表的左上角,选择交叉表专家并导航到自定义样式选项卡。正如我们在下面的屏幕截图中所见,我们将选择要更改背景颜色的行或列,并选择要应用的颜色。
![自定义交叉表外观]()
-
点击格式化网格线按钮,将交叉表线条格式化,如图所示。选择线条。线条颜色、样式或宽度可以按需更改。
![自定义交叉表外观]()
-
点击确定按钮保存更改并运行应用程序以测试新的外观。这如图所示:
![自定义交叉表外观]()
-
如果用户需要向特定国家显示所有类别的产品,并且能够通过产品类别过滤数据,会怎样?
-
我们将进行一个小改动以应用这个请求:我们将更改报告中的参数条件,如图所示:
![自定义交叉表外观]()
-
当用户在类别列表中写入字符串
ALL时,报告将显示所有类别。运行应用程序并测试更改,结果将如图所示:![自定义交叉表外观]()
执行页面设置
当我们使用交叉表时,我们需要注意页面大小,因为报告的宽度会动态增长。如果我们尝试通过输入值USA来测试交叉表,我们会看到报告被分成两部分,如图所示:

这个问题发生是因为我们的数据库中USA值对应的城市有很多,我们的报告设计为以竖排信纸形式显示和打印。我们可以通过右键点击报告并导航到设计 | 页面设置来更改基本页面设置。如图所示。页面大小已更改为A3,方向为横幅。

如果我们再次通过输入值USA进行测试,结果将类似于以下屏幕截图:

摘要
在本章中,我们看到了交叉表有多有用。我们学习了如何创建交叉表报告并使用交叉表专家来控制交叉表的每个部分。在下一章中,我们将看到 Crystal Reports 中的另一个神奇工具;我们将看到如何创建包含图表的报告。
第七章。与图表一起工作
在本章中,我们将看到如何在 Crystal Reports 中使用图表。Crystal Reports 支持许多类型的图表,但我们将创建包含不同图表样本的四个报告。
我们将涵盖:
-
图表类型
-
创建图表
-
使用图表专家
我们将在我们的报告中使用相同的数据表,并查看如何以不同的图表显示这些数据。第一份报告将以柱形图的形式显示数据,正如以下截图所示:

第二份报告将以饼图的形式显示数据,正如我们在以下截图中所见:

第三份报告将以仪表图的形式显示数据,正如我们在以下截图中所见:

在最终报告中,我们将看到如何在一份报告中显示不同的图表。请参考以下截图:

创建报告数据源
在本节中,我们将创建我们将用于本章所有报告的数据源。本章的所有报告都显示了员工与订单之间的关系。这些报告显示了每个员工的订单数量。
-
我们在报告中使用的 SQL 查询如下截图所示:
![创建报告数据源]()
-
我们将使用之前的 SQL 查询创建一个新的 TableAdapter,并将其命名为
EmployeeOrdersTableAdapter,如下截图所示:![创建报告数据源]()
创建第一个报告 – 柱形图
让我们开始创建第一个图表报告。我们将从柱形图开始。
-
向我们的应用程序添加一个新的 Crystal Reports,并将其命名为
crEmpPerBar。我们将选择作为一个空白报告选项,以了解我们如何在报告创建后随时添加或修改我们的图表。 -
右键点击字段资源管理器中的数据库字段,并选择数据库专家选项。正如以下截图所示,我们将选择我们的 TableAdapter EmployeeOrders作为数据源:
![创建第一个报告 – 柱形图]()
-
右键点击报告,导航到插入 | 图表,并将其拖入Section1(报告页眉)。正如以下截图所示,在类型选项卡中,我们将选择柱形图作为图表类型,并从右窗口出现的下拉菜单中选择并列柱形图
![创建第一个报告 – 柱形图]()
-
导航到数据选项卡,正如以下截图所示:
![创建第一个报告 – 柱形图]()
-
在此步骤中,我们将看到如何以柱状图的形式显示数据。我们需要在 X 轴上显示员工姓名,在 Y 轴上显示订单数量。我们将把EmployeeOrders.fullName字段添加到右上角的列表中,以便在 X 轴上显示,并将EmployeeOrders.Quantity字段添加到下方的列表中,以便在 Y 轴上显示。我们可以使用TopN按钮仅显示特定数量的员工,就像我们在交叉表中看到的那样。我们将保持其他选项在其他选项卡中,并点击确定按钮。
-
我们想按日期段过滤订单,因此我们将向报告中添加两个类型为日期的过滤器参数。我们将第一个参数命名为
pmFrom,第二个参数命名为pmTo。查看以下截图以了解过滤器代码:![创建第一个报告 – 柱状图]()
-
转到主表单,双击btnBarChart按钮(柱状图)以导航到其背后的代码窗口。为
click事件编写如图下截图所示的代码:![创建第一个报告 – 柱状图]()
-
运行应用程序以测试结果。输入如图下截图所示的从和到日期:
![创建第一个报告 – 柱状图]()
-
点击柱状图按钮,查看如图下截图所示的报告结果:
![创建第一个报告 – 柱状图]()
现在,我们将看到如何更新我们的报告以获取我们在本章开头设计的所需报告。
移除图例
图例是如图下截图所示出现在右侧的框;默认情况下,它显示在图表旁边。在以下步骤中,我们将看到如何移除它:
-
右键点击图表,导航到图表选项 | 常规。导航到图例选项卡,如图下截图所示:
![移除图例]()
-
取消选择显示图例复选框。对话框有许多可用的选项。尝试更改这些选项并测试结果。点击确定按钮。
移除图表的标题
在接下来的几个步骤中,我们将看到如何移除或更改默认的图表标题:
-
右键点击我们的图表,导航到图表选项 | 标题,如图下截图所示:
![移除图表标题]()
-
清除标题文本框和分组标题文本框。点击确定按钮。
更改图表的外观
Crystal Reports 允许我们修改图表的外观以满足用户需求。在以下步骤中,我们将看到如何实现这一点:
-
右键点击我们的图表,导航到图表选项 | 常规。
-
导航到外观选项卡;更新外观属性,如图下截图所示:
![更改图表的外观]()
-
选择使用深度复选框。更改深度值,如图所示。
-
调整报告中的图表大小以适应报告宽度。
-
运行应用程序以测试结果;我们将看到报告与之前设计的相同。
创建第二个报告 – 饼图
我们接下来要创建的第二个图表报告是一个饼图。让我们开始工作:
-
将一个新的 Crystal Reports 添加到我们的应用程序中,命名为
crEmpPerPie。我们将选择作为一个空白报告选项。 -
右键点击字段资源管理器中的数据库字段并选择数据库专家。我们将选择我们的 TableAdapter EmployeeOrders作为数据源。
-
右键点击报告并导航到插入 | 图表,将其拖入Section1(报告页眉)。如图所示,在类型选项卡中,我们将选择饼图作为图表类型:
![创建第二个报告 – 饼图]()
-
移动到数据选项卡并选择数据字段,就像我们在之前的报告中做的那样。点击确定按钮。
-
添加两个日期过滤器,就像我们在之前的报告中做的那样。
-
转到主窗体,双击btnPieChart按钮(饼图)以导航到其背后的代码窗口。为
click事件编写如图所示的代码:![创建第二个报告 – 饼图]()
-
运行应用程序以测试结果。我们将看到如图所示的报告结果:
![创建第二个报告 – 饼图]()
现在我们将看到如何更新我们的报告以满足我们在本章开头设计的所需报告。
删除图例
在接下来的几个步骤中,我们将像之前处理条形图那样删除图例:
-
右键点击我们的图表并导航到图表选项 | 常规。
-
导航到图例选项卡。
-
取消选择显示图例复选框。
-
点击确定按钮。
删除图表的标题
在接下来的几个步骤中,我们将再次删除图表的标题,就像我们之前处理条形图时做的那样。
-
右键点击我们的图表并导航到图表选项 | 标题。
-
清除标题文本框。
-
点击确定按钮。
更改图表的外观
我们将按照之前处理条形图的方式更改图表的外观,执行以下步骤:
-
右键点击我们的图表并导航到图表选项 | 常规。
-
导航到外观选项卡;更新外观属性,如图所示:
![更改图表的外观]()
-
调整报告中的图表大小以适应报告宽度。
创建第三个报告 – 仪表图
我们接下来要创建的下一个图表报告是一个仪表图报告。让我们开始:
-
将一个新的 Crystal Reports 添加到我们的应用程序中,命名为
crEmpPerGauge。我们将选择作为一个空白报告选项。 -
在字段资源管理器中右键单击数据库字段,然后导航到数据库专家。我们将选择我们的 TableAdapter EmployeeOrders作为数据源。
-
右键单击报告,然后导航到插入 | 图表,并将其拖动到Section1(报告页眉)。如图所示,在类型选项卡中,我们将选择仪表图作为图表类型:
![创建第三个报告 – 仪表图]()
-
导航到数据选项卡,并选择数据字段,就像我们在第一个报告中做的那样。点击确定按钮。
-
添加两个日期过滤器,就像我们在第一个报告中做的那样。
-
前往主表单,双击btnGaugeChart按钮(仪表图)以导航到其背后的代码窗口。为
click事件编写如下截图所示的代码:![创建第三个报告 – 仪表图]()
-
运行应用程序以测试结果。我们将看到如下截图所示的报告结果:
![创建第三个报告 – 仪表图]()
现在,我们将了解如何更新我们的报告以满足我们在本章开头设计的报告。
移除图例
在接下来的几个步骤中,我们将像之前处理柱状图那样移除图例:
-
右键单击我们的图表,然后导航到图表选项 | 一般。
-
导航到图例选项卡。
-
取消选择显示图例复选框。
-
点击确定按钮。
移除图表的标题
在接下来的几个步骤中,我们将像之前处理柱状图那样移除图表的标题:
-
右键单击我们的图表,然后导航到图表选项 | 标题。
-
清除标题文本框。
-
点击确定按钮。
更改图表的外观
我们将通过以下步骤更改图表的外观,就像之前处理柱状图那样:
-
右键单击我们的图表,然后导航到图表选项 | 一般。
-
导航到外观选项卡;更新外观属性,如下截图所示:
![更改图表的外观]()
-
在报告中调整图表大小以适应报告宽度。
创建第四个报告 – 一体化
在本报告中,我们在一个报告中使用不同的图表,并使用图表显示数据。
-
向我们的应用程序添加新的 Crystal Reports,并将其命名为
crEmpAllInOne。我们将选择作为一个空白报告选项。 -
在字段资源管理器中右键单击数据库字段并选择数据库专家。我们将选择我们的 TableAdapter EmployeeOrders作为数据源。
-
右键单击报告,然后导航到插入 | 图表,并将其拖动到Section1(报告页眉)。在类型选项卡中,我们将选择柱状图并调整图表大小以适应报告宽度。
-
右键单击报告,然后导航到插入 | 图表,并将其拖动到Section1(报告页眉)。在类型选项卡中,我们将选择饼图作为图表类型,并将其定位在柱状图下方,调整图表大小以适应报告宽度。
-
右键点击报告,导航到插入 | 图表并将它拖入Section1(报告页眉)。在类型选项卡中,我们将选择仪表作为图表类型。在饼图下找到它,并调整图表大小以适应报告的宽度。
-
更新所有三个图表的外观,就像我们之前做的那样。
-
添加两个日期过滤器,就像我们在上一个报告中做的那样。
-
将报告字段拖放到详细信息部分,并按照以下截图所示进行格式化。
![创建第四个报告 – 全部在一个中]()
-
前往主窗体,双击btnAllInOne按钮(全部在一个中)以进入其背后的代码窗口。为
click事件编写以下截图所示的代码:![创建第四个报告 – 全部在一个中]()
-
运行应用程序以测试结果。它将与我们之前设计的报告相同。
摘要
在本章中,我们学习了如何使用图表构建出色且强大的报告。我们看到了 Crystal Reports 支持许多类型的图表,以及使用这些图表是多么容易。
这本书的最后一章。我们学习了如何从头到尾创建一个报告应用程序。我试图向读者提供关于 Crystal Reports 等工具的知识,同时也尝试教授他们可能帮助他们快速轻松使用这些工具的技能和技术。我们学习了如何设计应用程序,以及我们可以使用哪些工具来创建我们的应用程序。我们学习了如何安装我们的工具,如何使用每个工具,以及这些工具之间是如何相互通信的。我们学习了 Crystal Reports 工具,如数据库专家、参数、分组、排序、线条和框。我们学习了如何创建不同类型的报告,如表格、交叉表和图表,以及如何在一份报告中混合这些类型。我们学习了如何在 Visual Studio 中显示我们的报告,并使用 C#代码动态传递参数值。























































































































































