Jaspersoft Studio Subreport 控件实现主子表
官网参考:https://community.jaspersoft.com/wiki/subreports-jaspersoft-studio
报表案例下载:下载
1.表及数据环境
学生表
CREATE TABLE Student(
SID NUMBER,
NAME VARCHAR(20)
);
教师表
CREATE TABLE Teacher(
TID NUMBER,
NAME VARCHAR(20)
);
课程信息表
CREATE TABLE CourseList(
CID NUMBER,
TID NUMBER,
NAME VARCHAR(20)
);
学科成绩表
CREATE TABLE CourseScore(
SID NUMBER,
CID NUMBER,
SCORE NUMBER
);
模拟数据插入
-- Student 表
INSERT INTO STUDENT ("SID", "NAME") VALUES ('1', '张三');
INSERT INTO STUDENT ("SID", "NAME") VALUES ('2', '李四');
-- Teacher 表
INSERT INTO TEACHER ("TID", "NAME") VALUES ('1', '老王');
INSERT INTO TEACHER ("TID", "NAME") VALUES ('2', '老李');
INSERT INTO TEACHER ("TID", "NAME") VALUES ('3', '老张');
-- CourseList 表
INSERT INTO CourseList ("CID", "TID", "NAME") VALUES ('1', '1', '语文');
INSERT INTO CourseList ("CID", "TID", "NAME") VALUES ('2', '2', '英语');
INSERT INTO CourseList ("CID", "TID", "NAME") VALUES ('3', '3', '数学');
-- CourseScore 表
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('1', '1', '50');
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('1', '2', '60');
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('1', '3', '80');
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('2', '1', '90');
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('2', '2', '88');
INSERT INTO CourseScore ("SID", "CID", "SCORE") VALUES ('2', '3', '86');
2.创建主报表文件 Main.jrxml
数据源如下:
SELECT SID "学号", Name "学生名称" FROM Student
3.主报表 主页面控件拖拽如下
4.创建子报表文件 Sub.jrxml
数据源配置如下:
SELECT cl.Name "课程名",t.Name "任课老师名", cs.SCORE "成绩"
FROM CourseScore cs LEFT JOIN Student s ON s.SID = cs.SID LEFT JOIN CourseList cl ON cs.CID = cl.CID
LEFT JOIN Teacher t ON t.TID = cl.TID
WHERE s.SID = $P{学号}
并配置子报表的参数:
5.子报表 主页面控件拖拽如下
6.在主报表(Main.jrxml)中 添加 Subreport 控件
选择对应工作目录的子报表,我这边为 Sub.jrxml 文件
我这边为同一个数据库连接
这边配置 主报表 给 子报表 传递的参数,$F{学号} 是 主报表中查询出的结果,传给 子报表中 $P{学号} 参数
7.主报表(Main.jrxml)最终拖拽结果
8.执行结果
9.各方面注意事项
1、子报表一般为了好看需要将 子报表的 Page Format 中 Margins 都改为 0
2、子报表中的查询语句要使用 $P ,而不是 $F 为字段(Field),$P 为参数(Parameter)
3、在拖拽控件时主报表要考虑子报表的对应高度