上一篇提到了預設變數,然而預設變數不能作任何更動與設定,如果想自己定義變數用於報表中,就要自行設定變數的屬性。
來新增一個變數,認識變數的屬性吧
先介紹一些常用的屬性:
表達式通常可以放入要對哪個Field作為變數計算的資料。
Calculation是對報表數據進行計算的方式,有許多不同的計算類型,如下表:
Calculation | 功能 |
---|---|
Sum | 累計某個數字欄位的總和 |
Count | 計算資料出現的次數 |
Distinct Count | 計算不重複的資料筆數 |
Average | 計算數值欄位的平均值 |
Lowest | 取得資料欄位中的最小值 |
Highest | 取得資料欄位中的最大值 |
Standard Deviation | 計算數值欄位的標準差 |
Variance | 計算數值欄位的變異數 |
System | 變數值由系統提供,一般用來記錄像是頁碼、時間戳等資訊 |
First | 變數會保留資料集中第一個出現的值 |
這些屬性要如何應用在報表上呢?
來實際操作一次,這次我想將學生修的課程分組,以變數顯示每個課程的學生最高成績。
新增一個變數,取名highestScore,將Text Field以"課程最高成績:" + $V{highestScore}
表達式放到Group Footer中,此時模板已經完成:
我們目的是顯示每個課程的學生最高成績,因此
$F{score}
,表示此變數會以「score」的數值來計算因為要用課程分組,SQL要以courseDesc為第一順位排序。
@Override
public List<StudentCourseScoreDto> getStudentCourseScoreData() {
QStudentEntity qStudent = QStudentEntity.studentEntity;
QDepartmentEntity qDepartment = QDepartmentEntity.departmentEntity;
QCourseEntity qCourse = QCourseEntity.courseEntity;
QScoreEntity qScore = QScoreEntity.scoreEntity;
return queryFactory.select(Projections.bean(StudentCourseScoreDto.class,
qStudent.studentId, qStudent.firstName, qStudent.lastName,
qStudent.gender, qStudent.grade, qDepartment.departmentId,
qDepartment.departmentName, qDepartment.departmentDesc,
qCourse.courseId, qCourse.courseName, qCourse.courseDesc,
qCourse.credit, qScore.scoreId, qScore.score, qScore.testDate))
.from(qStudent)
.innerJoin(qDepartment)
.on(qStudent.departmentId.eq(qDepartment.departmentId))
.innerJoin(qScore)
.on(qStudent.studentId.eq(qScore.studentId))
.innerJoin(qCourse)
.on(qScore.courseId.eq(qCourse.courseId))
.orderBy(qCourse.courseDesc.asc(),
qStudent.grade.asc(), qStudent.studentId.asc())
.fetch();
}
最後可以看到在每個組別的Footer,都會顯示該課程中學生考試的最高成績囉