上一篇提到了預設變數,然而預設變數不能作任何更動與設定,如果想自己定義變數用於報表中,就要自行設定變數的屬性。
來新增一個變數,認識變數的屬性吧
 
 
先介紹一些常用的屬性:
表達式通常可以放入要對哪個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,都會顯示該課程中學生考試的最高成績囉