1. 概述
1.1 問題描述
在做填報報表時,希望點選提交按鈕後,獲取到填報頁面的資料做一些自訂的處理,要如何實現呢?
1.2 實現思路
在「報表填報屬性」章節中介紹了報表填報屬性有 2 種設定方式,一個是內建 SQL 直接綁定欄位,往資料庫中填報資料,另外一種是新增自訂事件。如果需要獲取資料後對資料進行自訂處理,則可選擇使用自訂提交。
1.3 功能說明
1)自訂提交的本質是獲取頁面資料後做自訂的處理,所以獲取值後的程式碼部分需要使用者自己根據業務需求編寫和維護。
2)暫不支援回呼,即將資料處理的結果傳回給頁面展示。
3)自訂提交支援行動端使用。
2. 範例
2.1 準備資料
建立資料集 ds1,從FRDemo取數,SQL 語句為:SELECT * FROM S產品 limit 3
2.2 設計填報表格
設計填報表格,將資料集相應欄位拖到儲存格中,A2 儲存格新增「數字元件」,B2 儲存格新增「正文元件」,表格樣式如下圖所示:
2.3 編寫自訂提交類
2.3.1 獲取範本資料
參考以下程式碼可獲取相應的範本資料,之後就可以按自訂的需求對資料做處理。
package com.fr.data;
import com.fr.log.FineLoggerFactory;
import com.fr.script.Calculator;
public class SubmitDemo extends DefinedSubmitJob {
public String getJobType() {
return " ";
}
/**
* 當範本填報屬性增加的參數名與下面變數名一致時,則會自動指派於此對應變數
* JobValue代表綁定的值為儲存格,其他類型資料需按照各自類型去定義類,例如字串為String
* 不支援儲存格組
*/
private JobValue ID;
private JobValue Name;
private String Type;
private Integer Count;
/**
* 每一條記錄執行一次此方法
*/
public void doJob(Calculator calculator) throws Exception {
FineLoggerFactory.getLogger().error("---------ID:" + ID.getValue() + ",Name:" + Name.getValue() + ",Type:" + Type + ",Count:" + Count + "------------");
//在fanruan.log以error級別匯出獲取到的參數值
if (ID.getState().checkChanged()) {
//FineLoggerFactory.getLogger().error("---------修改:"+ID.getValue()+"------------");
// 在fanruan.log以error級別匯出被標記為"修改"的資料
} else if (ID.getState().checkInsert()) {
//FineLoggerFactory.getLogger().error("---------新增:"+ID.getValue()+"------------");
// 在fanruan.log以error級別匯出被標記為"新增"的資料
} else if (ID.getState().checkDeleted()) {
//FineLoggerFactory.getLogger().error("---------刪除:"+ID.getValue()+"------------");
// 在fanruan.log以error級別匯出被標記為"刪除"的資料
} else if (ID.getState().checkDefault()) {
//FineLoggerFactory.getLogger().error("---------預設:"+ID.getValue()+"------------");
// 在fanruan.log以error級別匯出被標記為"預設"的資料
}
}
}
2.3.2 獲取檔案
1)需要在 2.3.1 節程式碼的基礎上匯入以下包:
2)檔案元件上傳的檔案,需要在使用JobValue.getValue()後做進一步的處理,才能獲取到檔案名稱和檔案流。
假設檔案儲存格對應的參數名為FName,在使用private JobValue FName定義好物件之後,參考下方程式碼處理:
if (FName.getValue() instanceof FArray) {
FArray farray = (FArray) (FName.getValue());
for (int i = 0; i < farray.length(); i++) {
Attachment cache = (Attachment) (farray.elementAt(i));
FineLoggerFactory.getLogger().error("------filename:" + cache.getFilename() + "--------");
//getFilename()獲取檔案名稱
FineLoggerFactory.getLogger().error("------file:" + cache.getBytes() + "--------");
//getBytes()獲取檔案流
}
}
else if (FName.getValue() instanceof FRFile){
FRFile cache = (FRFile) FName.getValue();
FineLoggerFactory.getLogger().error("------filename:" + cache.getFileName() + "--------");
//getFilename()獲取檔案名稱
FineLoggerFactory.getLogger().error("------file:" + cache.getBytes() + "--------");
//getBytes()獲取檔案流
}
2.4 設定填報屬性
1)點選「範本>報表填報屬性」,新增一個自訂提交,點選編輯按鈕,如下圖所示:
2)將上面的Java 程式碼複製到自訂函式編輯介面,點選「編譯」按鈕,顯示編譯成功後,點選「儲存」按鈕,如下圖所示:
注:除了上述編譯方式外,也可以將外部編譯好的 class 檔案放到 %FR_HOME%\webapps\webroot\WEB-INF\classes 資料夾下和程式碼中定義的 package 路徑一致的位置,然後點選「選擇按鈕」引用 class 檔案。若修改更換了 class 檔案,則需要重啟設計器或帆軟服務,修改的程式碼才會生效。
點選可下載 class 檔案:SubmitDemo.rar
3)點選增加屬性按鈕,給提交事件新增 4 個屬性,注意值的類型需要和程式碼中定義的類型一致,如下圖所示:
2.5 效果預覽
使用填報預覽,點選提交按鈕,查看日誌。
3.範本下載
點選下載範本:自定义提交.cpt