Crystal Report 使用选择参数过滤






4.88/5 (15投票s)
Crystal Report 过滤入门指南
背景
选择参数允许你过滤从数据源(在本例中为Table
)返回的数据。
当然,使用存储过程
更好更快(此处有解释),但这是一种有用的功能,值得学习。
步骤 1:数据库
- 下载并解压附加文件。
- 运行脚本以创建数据库和表。
- 你现在应该拥有以下模式。
(我尝试使用各种数据类型,text
、datetime
、float
等。)
步骤 2:窗体
我们将构建用户输入窗体,没什么特别的,文本框、日期时间选择器和一个自定义的数值递增控件。
(_数值递增控件增加了Checked
属性,稍后我们将需要它。_)

步骤 3:报表
接下来,我们将向我们的“报表”文件夹添加一个新报表,此处有解释。
步骤 4:报表的参数
很好,我们创建了报表;接下来,我们要创建要传递和搜索的参数。
除了用户窗体上的 6 个参数外,我们还需要每个字段的一个布尔参数,此布尔参数告诉我们是否将字段包含在搜索条件中。.
我们将输入第一个布尔值来指示_**从**_日期时间选择器是否有值。
- 在字段资源管理器中,右键单击参数字段>新建(_如果找不到字段资源管理器,请转到视图>其他窗口>文档大纲或按 Ctrl+Alt+T_)
- 输入**名称**
bHireDateFromChecked
和**类型**boolean
- 对其他字段执行此操作。
bHireDateToChecked
bSalaryFromChecked
等等…
我们不需要布尔值来检查用户是否要按名称搜索,我们只需检查文本长度是否大于零。
所以现在我们已经添加了布尔值。接下来,我们将添加实际要搜索的参数。
同样,添加参数,使用与数据库中相同的数据类型。
所以现在我们有了

步骤 5:报表的公式
对于每个主要的可搜索参数,我们将创建一个公式,此公式检查附加的布尔参数,以决定是否将其包含在搜索中。
所以让我们添加一个新公式
- 打开字段资源管理器
- 右键单击公式字段>新建
- 输入**名称**:
HireDateFrom
单击确定后,将出现此窗口

你创建的所有参数都在这里,如果双击其中一个参数,它就会写入编辑器中。太棒了!
现在,我们将编写以下公式,同时单击上图面板的参数。
if (double click bHireDateFromChecked) then
double click t_Employees.dHireDate >= double click dtHireFrom
Else
True
现在你应该拥有以下内容
IF({?bHireDateFromChecked}) THEN
{t_Employees.dHireDate}>={?dtHireFrom}
ELSE
TRUE
单击左上角的保存并关闭。
同样,创建公式HireDateTo
,即
IF({?bHireDateToChecked})THEN
{t_Employees.dHireDate}<={?dtHireTo}
ELSE
TRUE
同样,为**薪资**、_**从**_和_**到**_创建另外两个公式。
对于**名称**字段,我们将采用不同的方法,我们将检查传递的参数长度。
(_**注意中间的功能面板,与公式一样,双击其中一个功能后,功能就会写入编辑器中。**_)
在功能面板中展开**字符串**。
Write
IF(double click length double click sName)>0)THEN
double click t_Employees.sName = double click sName
ELSE
TRUE
现在你应该拥有以下内容
IF(Length ({?sName})>0)THEN
{t_Employees.sName}={?sName}
ELSE
TRUE
步骤 6:选择参数
右键单击报表的空灰色区域>报表>选择公式>记录。
与参数一样,我们刚刚创建的公式也在编辑器中可用。

现在我们要做的就是使用逻辑运算符AND
连接这些公式。
- 双击每个要写入编辑器的公式
- 在每个公式之间写入**AND**
…你最终应该得到这个
{@HireDateFrom} AND
{@HireDateTo} AND
{@Manager} AND
{@Name} AND
{@SalaryFrom} AND
{@SalaryTo}
关注点
你可以在一个地方设计报表,然后将其复制到其他地方。
应用程序中包含的报表(你在解决方案资源管理器->报表文件夹下看到的报表)_不是_报表查看器引用的报表,实际路径是这个
string strReportName = "rptDemo.rpt";
string strPath = Application.StartupPath + "\\Reports\\" + strReportName;
这是应用程序的_bin>Debug_ **为什么?**
在桌面应用程序中,当你想部署并添加安装项目时,这将是添加的报表文件夹的路径。

你不应该硬编码你的连接字符串。
我见过的几乎每个 CR 教程都使用硬编码的连接字符串(_它们也使用数据表,有人能告诉我为什么吗?_)
你应该使用一个名为DbConnectionInfo
的小型实用类(_不幸的是,我不记得作者是谁,无法给予他应有的赞誉。_)
private void frmReportViewer_Load(object sender, EventArgs e)
{
DbConnectionInfo.SetConnectionString(ConfigurationSettings.AppSettings[0]);
TableLogOnInfo logOnInfo;
ConnectionInfo connectionInfo;
foreach (Table table in m_cryRpt.Database.Tables)
{
logOnInfo = table.LogOnInfo;
connectionInfo = logOnInfo.ConnectionInfo;
// Set the Connection parameters.
connectionInfo.DatabaseName = DbConnectionInfo.InitialCatalog;
connectionInfo.ServerName = DbConnectionInfo.ServerName;
if (!DbConnectionInfo.UseIntegratedSecurity)
{
connectionInfo.Password = DbConnectionInfo.Password;
connectionInfo.UserID = DbConnectionInfo.UserName;
}
else
{
connectionInfo.IntegratedSecurity = true;
}
table.ApplyLogOnInfo(logOnInfo);
}
crystalReportViewer1.ReportSource = m_cryRpt;
crystalReportViewer1.Refresh();
}
你应该让用户知道他输入了什么。

始终以友好的方式显示用户输入的参数。
例如,公式lblHireDateFrom
显示输入的“从”日期
IF({?bHireDateFromChecked}) THEN
ToText ({?dtHireFrom})
ELSE
'Any'
结论
希望我已经给出了清晰的解释。欢迎提出任何问题/建议。