65.9K
CodeProject 正在变化。 阅读更多。
Home

Crystal Report 使用选择参数过滤

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (15投票s)

2011 年 6 月 2 日

CPOL

3分钟阅读

viewsIcon

269682

downloadIcon

9273

Crystal Report 过滤入门指南

背景

选择参数允许你过滤从数据源(在本例中为Table)返回的数据。

当然,使用存储过程更好更快(此处有解释),但这是一种有用的功能,值得学习。

步骤 1:数据库

  1. 下载并解压附加文件。
  2. 运行脚本以创建数据库和表。
  3. 你现在应该拥有以下模式。

Schema.jpg

(我尝试使用各种数据类型,textdatetimefloat 等。)

步骤 2:窗体

我们将构建用户输入窗体,没什么特别的,文本框、日期时间选择器和一个自定义的数值递增控件。

(_数值递增控件增加了Checked属性,稍后我们将需要它。_)

Main.jpg

步骤 3:报表

接下来,我们将向我们的“报表”文件夹添加一个新报表,此处有解释。

步骤 4:报表的参数

很好,我们创建了报表;接下来,我们要创建要传递和搜索的参数。

除了用户窗体上的 6 个参数外,我们还需要每个字段的一个布尔参数,此布尔参数告诉我们是否将字段包含在搜索条件中。.

我们将输入第一个布尔值来指示_**从**_日期时间选择器是否有值。

  1. 在字段资源管理器中,右键单击参数字段>新建(_如果找不到字段资源管理器,请转到视图>其他窗口>文档大纲或按 Ctrl+Alt+T_)

    Parameter_1.jpg

  2. 输入**名称**bHireDateFromChecked和**类型**boolean

    All_params.jpg

  3. 对其他字段执行此操作。bHireDateToChecked bSalaryFromChecked等等…

我们不需要布尔值来检查用户是否要按名称搜索,我们只需检查文本长度是否大于零。

所以现在我们已经添加了布尔值。接下来,我们将添加实际要搜索的参数。

同样,添加参数,使用与数据库中相同的数据类型。

所以现在我们有了

SelectDatabase.jpg

步骤 5:报表的公式

对于每个主要的可搜索参数,我们将创建一个公式,此公式检查附加的布尔参数,以决定是否将其包含在搜索中。

所以让我们添加一个新公式

  1. 打开字段资源管理器
  2. 右键单击公式字段>新建
  3. 输入**名称**: HireDateFrom

单击确定后,将出现此窗口

SelectTable.jpg

你创建的所有参数都在这里,如果双击其中一个参数,它就会写入编辑器中。太棒了!

现在,我们将编写以下公式,同时单击上图面板的参数。

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:选择参数

右键单击报表的空灰色区域>报表>选择公式>记录。

与参数一样,我们刚刚创建的公式也在编辑器中可用。

FieldExplorer.jpg

现在我们要做的就是使用逻辑运算符AND连接这些公式。

  1. 双击每个要写入编辑器的公式
  2. 在每个公式之间写入**AND**

…你最终应该得到这个

{@HireDateFrom} AND
{@HireDateTo} AND
{@Manager} AND
{@Name} AND
{@SalaryFrom} AND
{@SalaryTo}

关注点

你可以在一个地方设计报表,然后将其复制到其他地方。

应用程序中包含的报表(你在解决方案资源管理器->报表文件夹下看到的报表)_不是_报表查看器引用的报表,实际路径是这个

string strReportName = "rptDemo.rpt";
string strPath = Application.StartupPath + "\\Reports\\" + strReportName;

这是应用程序的_bin>Debug_ **为什么?**

在桌面应用程序中,当你想部署并添加安装项目时,这将是添加的报表文件夹的路径。

Deploy.jpg

你不应该硬编码你的连接字符串。

我见过的几乎每个 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();
        }

你应该让用户知道他输入了什么。

ReportHeader.jpg

始终以友好的方式显示用户输入的参数。

例如,公式lblHireDateFrom显示输入的“从”日期

IF({?bHireDateFromChecked}) THEN
   ToText ({?dtHireFrom})
ELSE
    'Any'

结论

希望我已经给出了清晰的解释。欢迎提出任何问题/建议。

© . All rights reserved.