FineReport自学题目——参数联动

更新:[ 2020.03.05 ]修改了数据集定义,现在学生学号将会单独列出一个数据集,使用ClassNo作为参数进行筛选。修改了文中关于 IN 语法的描述。感谢 Melivora 同志的指正。

题目

FineReport自学题目——参数联动_第1张图片
实现功能:

  • 班级,学号实现参数联动
  • 班级为下拉框,学号为复选框,使用sql中定义参数
  • 实现参数为空选出全部的功能,班级为空选出全部班级,学号为空,选出班级下的所有学生
  • 选出全部班级时数据按班级分组显示
  • 实现页面数据居中显示

使用数据:

  • FRDemo中的Stscore表

思路

本题中表格数据十分简单直接,不需要关联其他表,所有的重点都放在了对参数的处理上。在本题中,我们需要设计参数界面使用户可以通过“班级号”和“学号”两个参数进行查询,且在无参时显示所有数据。
在这里,我们设计两个数据集为我们提供查询所需的数据:一个是 student_no 数据集,它为我们提供学号信息;一个是 stu_score 数据集,它会根据查询条件返回对应班级和学生的信息,参数为空时,显示全部信息。班级信息可以选用数据集提供,也可以如下图所示直接在数据字典中选择数据库表作为数据来源。FineReport自学题目——参数联动_第2张图片

数据集设计

以下是两个数据集的SQL语句:

-- student_no 学生学号信息
SELECT
	STUDENTNO
	, CLASSNO
FROM
	STSCORE
WHERE
	1 = 1
	${IF(LEN(CLASS_NO) = 0, "", " AND CLASSNO = '" + CLASS_NO + "' ")}
	-- 使用班级作为参数,学号列表内容将会随着班号的变更而变更
GROUP BY 
	STUDENTNO

--  stu_score 成绩列表
SELECT
	*
FROM 
	STSCORE
WHERE
	 1 = 1
	 ${IF(LEN(CLASS_NO) = 0, "", " AND CLASSNO = '" + CLASS_NO + "' ")}
	 ${IF(LEN(STU_NO) = 0, "", " AND STUDENTNO IN (" + STU_NO + ") ")}
	 -- 此处 STUDENTNO 字段属于数字类型

此处的数据集写法参考了帮助文档中关于 下拉复选框 的内容。IF语句中的内容与我们在JAVA中常见的三目运算符相似,第一个逗号前的内容是条件,中间和后面的是结果A和B,条件成立则将A拼接到SQL语句后面,否则拼接B。
在这里,我们判断参数 CLASS_NO 或 STU_NO是否为空(长度为0则实物空),如果不为空,则将AND子句拼接上去,否则只拼接一个空字符串。“1 = 1”是为了确保WHERE语句不会因为无查询条件而报错。
理论上我们可以直接在数据集中声明参数并直接在其他数据集中使用它们,但为了让参数内容更加可控且易于维护,我建议先在模板参数中声明我们需要使用的参数,并使用注释写明参数用途。
FineReport自学题目——参数联动_第3张图片
如上图所示,设置默认值为公式类型即可使用注释声明其用途,不影响使用,主要是为了让后来人看得懂我们写了什么。

参数设计

1、按上文设计好数据集后,我们将得到两个参数 CLASS_NO和 STU_NO,按照老办法,点击 “控件设置” 中的 “全部添加” ,将参数全部加到设计界面中,简单修改下样式让它们看起来更顺眼些。同时,我们选择下拉框作为 CLASS_NO 的参数控件,选择下拉复选框作为 STU_NO 的参数控件。
FineReport自学题目——参数联动_第4张图片
2、设置下拉复选框的返回值类型为 “字符串” 并用“逗号”进行分隔。
在这里插入图片描述
3、设置完成后,我们通过分页预览查看下效果
FineReport自学题目——参数联动_第5张图片

总结

从这个题目中我们可以学到如果利用IF语句实现有参无参情况下的参数联动查询,同时,我们也使用两个数据列横向纵向的扩展设计了一个简单的交叉报表,掌握此处的内容有助于我们未来设计参数环境复杂的多维报表。

你可能感兴趣的:(学习笔记)