報表管理軟體FineReport中如何設置自定義提交

用戶在做填報報表時,希望點擊提交按鈕並不是往資料庫中填報數據,而是要獲取到填報頁面的數據進行進一步處理,這個該如何解決呢?下面就通過報表管理軟體FineReport來進行介紹。

工具/原料

報表管理軟體FineReport7.1.1
大小:148.2M 適用平台:windows/linux

方法/步驟

自定義事件繼承自DefinedSubmitJob這個接口,通過JobValue接口獲取填報頁面單元格,JobValue與報表填報屬性處的屬性綁定,然後用getValue()方法獲取單元格的值,getValueState()獲取值的狀態,值狀態有四種:VALUE_STATE_CHANGED、VALUE_STATE_INSERT、VALUE_STATE_DELETED和VALUE_STATE_DEFAULT。

方法一

在類裡面定義幾個JobValue,每一個JobValue對應一個單元格,在報表填報屬性中通過屬性列表中將其與對應的單元格綁定起來,具體使用如DemoSubmitJob1:

package com.fr.data;

import com.fr.data.DefinedSubmitJob;

import com.fr.data.JobValue;

import com.fr.script.Calculator;

public class DemoSubmitJob1 extends DefinedSubmitJob {

/**

* 當模板自定義事件增加的屬性 名稱與下面變量有對應時,則會自動賦值於此對應變量

*/

private JobValue studentno;   // JobValue對應單元格

private JobValue name;

private JobValue grade;

private boolean isPass;       // 非單元格,則對應具體類型值

/**

* 每一條記錄執行一次此方法

* 同一提交事件在一個處理事務內,此對象是唯一的

*/

public void doJob(Calculator calculator) throws Exception {

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (studentno.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (studentno.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (studentno.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (studentno.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

// 值獲取

System.out.print(" 學號: " + studentno.getValue());  // 通過JobValue的getValue方法獲得單元格的值

System.out.print(" 姓名: " + name.getValue());

System.out.print(" 總分: " + grade.getValue());

System.out.print(" 是否達標: " + isPass);

System.out.println();

}

}

註:可以講所有變量全部定義成JobValue對象,通過getValue()獲取對象的值。

方法二

通過doJob的方法參數Calculator中的 Property_Value屬性, Property_Value屬性對應一個map對象,Map中包含報表填報屬性中所有屬性名稱以及它們對應的值,使用map中的getValue()方法獲取屬性值,即單元格,接著使用JobValue的getValue()方法獲取單元格的值,詳細如DemoSubmitJob2:

package com.fr.data;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

import com.fr.data.DefinedSubmitJob;

import com.fr.data.JobValue;

import com.fr.script.Calculator;

public class DemoSubmitJob2 extends DefinedSubmitJob {

/**

* 每一條記錄執行一次此方法

* 同一提交事件在一個處理事務內,此對象是唯一的

*/

public void doJob(Calculator calculator) throws Exception {

// 同樣可以直接在傳入的calculator中獲取定義的屬性及其對應的值

Map map = (Map)calculator.getAttribute(PROPERTY_VALUE);

if (map == null) return;

Set set = map.entrySet();

Iterator it = set.iterator();

Entry entry;

// 遍歷Map獲取所有屬性及其值

while (it.hasNext()) {

entry = (Entry)it.next();

System.out.print(" " + entry.getKey() + ": ");

// JobValue對應單元格

if (entry.getValue() instanceof JobValue) {

JobValue ce = (JobValue)entry.getValue();

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

System.out.print(ce.getValue());         // 通過JobValue的getValue方法獲得單元格的值

} else {

// 非單元格,則對應具體類型值

System.out.print(entry.getValue());

}

}

System.out.println();

}

}

方法三

自定義事件除了可繼承自DefinedSubmitJob這個接口之外,還可以繼承TotalSubmitJob接口,這兩個接口的區別在於DefinedSubmitJob多次執行,即一行一行的獲取模板中的數據,獲取一行數據則執行一次自定義事件,而TotalSubmitJob接口只執行一次,即先獲取到模板中所有的數據,然後在類裡面循環,具體使用如DemoTotalSubmitJob:

package com.fr.data;

import com.fr.data.JobValue;

import com.fr.data.TotalSubmitJob;

import com.fr.script.Calculator;

public class DemoTotalSubmitJob extends TotalSubmitJob {

/**

* 同一提交事件,在一個提交事務內只執行一次

* @param data 以二維表排列的所有提交數據

*

*/

protected void doTotalJob(Data data, Calculator calculator)

throws Exception {

data.getColumnCount(); // 獲取列的數量,每一列對應一個添加的屬性

for (int i = 0; i < data.getColumnCount(); i++) {

System.out.println(data.getColumnName(i));   // 獲取對應的屬性名稱

}

for (int i = 0; i < data.getRowCount(); i++) {   // getRowCount 獲取一共多少行數據

System.out.print("ROW " + i + " {");

for (int j = 0; j < data.getColumnCount(); j++) {

if (j > 0) System.out.print(", ");

Object value = data.getValueAt(i, j);    // 獲取對應位置的值

if (value instanceof JobValue) {

JobValue ce = (JobValue)value;

// JobValue的getValueState()方法獲取此對應單元格的狀態

if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {

// 此單元格的值在報表初始化後被修改過

} else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {

// 此單元格是在報表初始化後新增的(例如執行了插入行操作)

} else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {

// 此單元格所在的記錄被執行了刪除操作

} else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {

// 此單元格在報表初始化後沒有變化

}

value = ce.getValue();               // 通過JobValue的getValue方法獲得單元格的值

}

System.out.print(data.getColumnName(j) + " : " + value);

}

System.out.print("}");

System.out.println();

}

}

}

填報頁面主體設置

數據準備

新建資料庫查詢ds1:SELECT * FROM [STSCORE] where name <> ''。

主體界面

將studentno,name和grade求和拖曳至單元格中,並為之添加控制項,如下圖:

B4和D4單元格為數字控制項,C4單元格為文本控制項。

報表填報屬性設置

如上所述,實現自定義事件獲取填報頁面的值有三種方法,則下面根據上述的不同方法介紹填報屬性的不同設置。

方法一——DemoSubmitJob1

將類文件放置到%FR_HOME%\WebReport\WEB-INF\classes\com\fr\data文件夾下面。

點擊模板>報表填報屬性,添加自定義事件,選擇DemoSubmitJob1這個類,為類中定義的變量綁定單元格或公式,如下圖:

註:該方法中屬性名稱跟類文件中定義的JobValue是一一對應的,必須保證報表填報屬性處添加的屬性名稱與類文件中定義的名稱保持一致,並且如果在類文件中對應參數類型不是JobValue的話,則就必須與屬性的數據類型保持一致,一般來說,為了便於維護,可以講java類中的所有變量全部設為JobValue對象,不論報表填報屬性中的屬性類型是什麼,均可以通過GetValue獲取其值。

效果展示

後台列印效果如下:

方法二——DemoSubmitJob2

將類文件放置到%FR_HOME%\WebReport\WEB-INF\classes\com\fr\data文件夾下面。

點擊模板>報表填報屬性,添加自定義事件,選擇DemoSubmitJob2這個類,為類中定義的變量綁定單元格或公式,如下圖:

註:方法二中是通過Calculator參數屬性PROPERTY_VALUE來獲取報表填報屬性處的屬性與屬性值,再通過JobValue來得到單元格的值,在類文件中並不是一一對應的獲取屬性與屬性值,而是通過map遍歷來獲取屬性與屬性值,所以在報表填報屬性處增加屬性時,屬性名字可隨意定義,但是後面的值如果是單元格的話,必須選擇單元格類型。

效果展示

後台列印效果如下:

方法三——DemoTotalSubmitJob

將類文件放置到%FR_HOME%\WebReport\WEB-INF\classes\com\fr\data文件夾下面。

點擊模板>報表填報屬性,添加自定義事件,選擇DemoTotalSubmitJob這個類,為類中定義的變量綁定單元格或公式,如下圖:

效果展示

後台列印效果如下:

原作者:FineReport

相關文章

  1. 報表匯總軟體FineReport中如何設置自定義提交

    用戶在做填報報表時,希望點擊提交按鈕並不是往資料庫中填報數據,而是要獲取到填報頁面的數據進行進一步處理,這個該如何解決呢?下面就通過報表匯總軟體FineReport來進行介紹. 工具/原料 報表匯總軟 ...
  2. 報表管理軟體FineReport中如何設置系統管理

    下面就通過報表管理軟體FineReport來簡單介紹一下. 工具/原料 報表管理軟體FineReport7.1.1 大小:148.2M 適用平台:windows/linux 方法/步驟 點擊管理系統& ...
  3. 合併報表軟體FineReport中如何設置自定義提交

    用戶在做填報報表時,希望點擊提交按鈕並不是往資料庫中填報數據,而是要獲取到填報頁面的數據進行進一步處理,這個該如何解決呢?下面就通過合併報表軟體FineReport來進行介紹. 工具/原料 合併報表軟 ...
  4. 報表管理軟體FineReport中如何設置工具欄控制

    不同用戶角色登錄系統時查看同一張模板所看到工具欄按鈕不同,比如說技術支持部長角色登錄系統時,查看一張模板,看不到工具欄上的導出和列印按鈕,技術支持總調度角色卻可以,下面通過報表管理軟體FineRepo ...
  5. 報表管理軟體FineReport中如何設置動態摺疊樹

    在進行展現數據時,希望模板的數據是可以動態摺疊的,即點擊數據前面的加號才展開對應下面的數據,此時要如何實現呢?下面就通過報表管理軟體FineReport來簡單介紹一下. 工具/原料 報表管理軟體Fin ...
  6. 報表開發軟體FineReport中如何設置強制提交

    在填報表中,很多時候數據校驗並非一定是不能提交數據,而僅僅出於警告用戶的目的.並且用戶往往由於某些原因,數據即使不合法,但是仍舊需要提交, 為了解決此類問題,報表開發軟體FineReport提供了強制 ...
  7. 報表軟體FineReport中如何設置自定義參數界面

    用戶系統可能已經使用自己框架如.net.jquery.ext等中的控制項實現了條件查詢界面,不需要再使用FR內置的參數界面,此時如何將用戶表單控制項的值傳遞給報表呢?下面通過報表軟體FineReport來 ...
  8. 報表管理軟體FineReport中自定義列印按鈕介紹

    下面通過報表管理軟體FineReport來簡單介紹一下. 工具/原料 報表管理軟體FineReport7.1.1 大小:148.2M 適用平台:windows/linux 方法/步驟 用戶系統已經自己 ...
  9. BI報表FineReport中如何設置自定義提交事件

    填報報表,修改數據後都需要點擊工具欄上的提交按鈕才會與資料庫進行交互.若不使用FR的提交按鈕,如何調用提交事件與資料庫進行交互呢?如點擊自定義的刪除按鈕,刪除行的同事就與資料庫交互: 下面就通過BI報 ...
  10. 報表開發軟體FineReport中如何設置表達式設定

    定時任務,顧名思義,就是在某個固定的時間點出發某一個事件(任務),顯然,在定義定時任務的過程中,必須要設置任務執行的時間點,但是該任務可能是每天重複執行,隔日重複執行或者是單次執行等等各種不同組合的觸 ...
  11. 報表開發軟體FineReport中如何設置高級排序

    高級排序即擴展前排序,其只能根據數據列或者對可以用數據列還原的公式進行排序,下面我們通過報表開發軟體FineReport來介紹下如何設置高級排序. 工具/原料 報表開發軟體FineReport7.1. ...
  12. 報表設計軟體FineReport中如何設置填報居中

    下面就通過報表設計軟體FineReport來簡單介紹一下如何設置填報居中. 工具/原料 報表設計軟體FineReport7.1.1 大小:148.2M 適用平台:windows/linux 方法/步驟 ...
  13. 在線報表FineReport中如何設置自定義提交事件

    填報報表,修改數據後都需要點擊工具欄上的提交按鈕才會與資料庫進行交互.若不使用FR的提交按鈕,如何調用提交事件與資料庫進行交互呢?如點擊自定義的刪除按鈕,刪除行的同事就與資料庫交互: 下面就通過在線報 ...
  14. 報表開發軟體FineReport中如何設置圖表空值顯示

    因圖表的數據是來源於資料庫數據的,所以若有值為空時,圖表中就得依需要選擇是否顯示空值.FineReport圖表中,面積圖與數據表面積圖,折線圖與數據表折線圖.數據點折線圖都有,值空時的2種顯示格式. ...
  15. 報表統計軟體FineReport中如何設置預定義樣式

    用戶系統的模板有統一的風格,如標題風格.表頭風格.正文風格等都是相同的,每製作一張模板都要反覆設置樣式很繁瑣,此時可以將常用的樣式預先定義在伺服器端,這樣當前工程下的所有模板都可以直接使用了. 預定義 ...
  16. 數據分析報表FineReport中如何設置自定義提交

    用戶在做填報報表時,希望點擊提交按鈕並不是往資料庫中填報數據,而是要獲取到填報頁面的數據進行進一步處理,這個該如何解決呢?下面就通過數據分析報表FineReport來進行介紹. 工具/原料 數據分析報 ...
  17. 報表匯總軟體FineReport中如何設置動態摺疊樹

    在進行展現數據時,希望模板的數據是可以動態摺疊的,即點擊數據前面的加號才展開對應下面的數據,此時要如何實現呢?下面就通過報表匯總軟體FineReport來簡單介紹一下. 工具/原料 報表匯總軟體Fin ...
  18. 報表開發軟體FineReport中如何設置SAP數據同步

    AP數據集提供了直接取數的方法,但自由度不高,且頻繁的取數會給SAP系統帶來很大的額外壓力,所以在部分情況下,客戶需要將數據同步到另外的資料庫中,再從資料庫中取數,也就是說將取數成功的數據集中的數據作 ...
  19. 報表管理軟體FineReport中weblogic類衝突報錯

    通過weblogic部署我方報表應用,在使用過程中可能會出現一些相關於類衝突的報錯信息,這一類問題該如何解決呢?下面就通過報表管理軟體FineReport來解決. 工具/原料 報表管理軟體FineRe ...
  20. 報表管理軟體FineReport中如何實現分級權限分配

    多部門共用系統.各個部門有其自己的管理員,並給其部門員工分配權限,即實現多級管理員層層分配,分級管理員只能管理自己職責範圍內的模板權限分配,報表管理軟體FineReport自主開發的數據決策系統中提供 ...