場景描述
如下圖所示報表,科目名稱欄目里面的數據不是從數據庫中拖曳擴展得來的,而是直接在單元格中輸入,需要將每個科目的期初余額和期末余額填報入庫,數據庫中有科目ID、會計科目、期初余額和期末余額幾個字段,在填報時,將每一行數據都填入到一張數據表中,本來要想將所有科目都填報入庫,則需要添加多個內置SQL,會非常影響填報效率,今天我來告訴大家可以在一個內置SQL中為單個數據表字段綁定多個單元格,即單元格組。

實現思路
在報表填報屬性中為某個字段綁定單元格組,如下圖,數據表中的會計科目和科目代碼字段在一個內置SQL中分別綁定了一個單元格組,那么在執行填報功能的時候,報表開發工具FineReport后臺會自動將單元格組根據位置拆分為多條內置SQL。

如上填報屬性綁定單元格示例,在執行填報過程的時候,就會拆分為以下4個內置SQL分別執行:
[uuid(),A2,B2]、[uuid(),A3,B3]、[uuid,A4,B4]、[uuid(),A5,B5]
注:拆分內置SQL時是根據位置拆分,并且當單元格和單元格組并存的時候,單元格的值重復根據單元格組內單元格個數進行復制。
和分別定義4個內置sql一致,4個uuid的結果是不一樣的,并且其中一個失敗,其他兩個都會回滾,保持事務的一致性
注:綁定單元格組是先拆分為多個內置sql入庫規則,然后再形成SQL語句提交入庫,而不是直接形成sql,因為單元格的值可能也是數組。
示例
以描述中的模板樣式為例,我們在web端錄入幾個會計科目的期初余額和期末余額,然后通過單個內置SQL將數據填報入庫。
1、 模板樣式設計
按照上圖所示樣式設計報表,期初余額和期末余額控件類型均設置為文本控件。
2、報表填報屬性設置
點擊模板>報表填報屬性,點擊添加按鈕,添加一個內置SQL,為數據字段綁定單元格組,如下圖:

注:單元格組手動編輯的時候,單元格間的分隔符支持英文的逗號、分號和空格。
另:如果單元格組內單元格個數超過5個,將不再顯示所有單元格,而是直接顯示“已經選擇X個單元格”,如下圖:

注:綁定多個單元格時,不能使用公式,因為單元格數組是先拆分為多個內置SQL,然后再形成入庫sql語句,而公式數組則是直接形成入庫sql語句,不會拆分為內置sql。
3、校驗
如果列的值設置為單元格組,則需要保證設置的各單元格組個數相等,這樣才能夠一一匹配起來,不允許如一個列是3個單元格,一個列是4個單元格,在智能添加單元格組對話框時點擊確定或者在填報屬性界面修改之后點擊確定會彈出警告框,如下圖:

4、效果查看
點擊填報預覽,在前面4個科目輸入對應的期初余額和期末余額,如下圖:

注:由于在設置填報屬性的時候,單元格數組只綁定了前面4行的數據,故我們這里只對前面4行操作。
點擊提交按鈕,將數據入庫,點開日志面板,可以看到如下圖所示日志信息,從日志中我們可以看出內置sql綁定的單元格數組的確是被拆分為多個內置sql之后,在形成sql語句執行提交操作:

然后再新建通過數據集查看科目余額表數據表中的數據,如下圖,可以看到更改的4個科目數據發生了變化:

具體的模板設置可參考:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Form\TypicalApp\CellsArrayForm.cpt。