1. 概述
1.1 問題描述
在實際填報表設計中,主從表是常見的一種填報場景,主表中的一條記錄對應從表中的多條記錄,例如「訂單表」和「訂單明細表」,「訂單表」的一個訂單可能對應「訂單明細表」中的多條産品數據,通過「訂單 ID」字段進行關聯。
修改上方訂單信息及明細數據時,數據将分别回填至對應的數據表中。
像這樣數據來自於多個數據源,填報時數據回填到多個表中的報表,也可以稱之爲多源填報表。
1.2 實現思路
首先通過設置過濾條件,将表與表關聯起來,然後通過定義多個内置 SQL 提交将數據回填到不同的數據表中。
2. 示例
2.1 數據準備
新建普通報表,新建兩個數據庫查詢,SQL 查詢語句分别爲:
ds1:SELECT * FROM 訂單
ds2:SELECT * FROM 訂單明細
2.2 報表設計
2.2.1 表格樣式設計
按照下圖所示設置表樣,并将對應的數據列拖入到對應的單元格中:
将 B4、B6、B8 單元格的「左父格」均設置爲 A3 單元格,其餘單元格爲默認,即數據均是根據「訂單 ID」擴展得來。
2.2.2 單元格設置
1)各單元格添加控件類型如下表所示:
單元格 | 控件類型 |
---|---|
B4、D4、F4、B8、A12 | 下拉框控件 |
B6、D8、B12~E12 | 數字控件 |
D6、F6 | 文本控件 |
F8 | 複選按鈕控件 |
F12、G12 | 按鈕控件 |
2)設置 B4、D4、F4、B8、A12 單元格「下拉框控件」的「數據字典」,并且設置 B4、D4、F4、A12 單元格的「單元格屬性>形态」也爲「數據字典」,具體設置均如下表所示:
單元格 | 數據庫表 | 實際值 | 顯示值 |
---|---|---|---|
B4 | 客戶 | 客戶ID | 公司名稱 |
D4 | 雇員 | 雇員ID | 姓名 |
F4 | 運貨商 | 運貨商ID | 公司名稱 |
B8 | 訂單 | 貨主城市 | 貨主城市 |
A12 | 産品 | 産品ID | 産品名稱 |
控件「數據字典」設置如下圖:
單元格形态「數據字典」設置如下圖:
3)設置 F12 和 G12 的「按鈕控件」分别爲「插入行」和「删除行」按鈕,其指定單元格都爲 A12 單元格。如下圖所示:
2.2.3 插入公式
在 H12 單元格中插入公式:C12 * D12 * (1 - E12),即:數量*進價*(1-折扣)。
在 D8 單元格中插入公式:round(sum(H12) + B6,2)。表示「應付金額」爲數量*進價*(1-折扣)+運貨費。
注:round() 表示應付金額保留兩位小數,函數詳細解釋可參考Round函數。
2.2.4 插入行策略
選中 H12 單元格,點擊右側面板「單元格屬性>其他」,将插入行策略設置爲「原值」,确保單元格公式在插入行時被保留。
2.3 參數設置
1)點擊菜單欄「模板>模板參數」,添加一個參數名爲 ID 的模板參數,默認值爲 10001。如下圖所示:
下拉框控件的數據字典:數據庫表爲「訂單」,實際值和顯示值均爲第 1 列:訂單 ID。如下圖所示:
2.4 過濾條件設置
雙擊 A3 單元格,設置過濾條件,條件爲普通條件:「訂單 ID 」列等於參數 $ID。如下圖所示:
2.5 隐藏行列設置
1)A3 單元格只是作爲過濾數據使用,不需要展示在頁面上,所以需要隐藏。可以直接選中第 3 行的行序号,單擊鼠标右鍵選擇隐藏,如下圖所示:
也可以通過給 A3 單元格添加一個行高爲 0 的條件屬性,如下圖所示:
2)同樣點擊 H 列,單擊鼠标右鍵選擇隐藏,将 H12 單元格隐藏。
2.6 報表填報屬性設置
點擊菜單欄「模板>報表填報屬性」,按照下圖所示給報表增加兩個内置 SQL 提交。
内置 SQL1:
内置 SQL2:
2.7 效果預覽
2.7.1 PC 端
保存報表,點擊「填報預覽」,查詢訂單号爲 10001 的數據,效果如下圖所示:
修改子表,修改數量與進價,點擊提交,提示成功。刷新浏覽器,再選擇10001,可以看到數據已經改變,如下圖:
2.7.2 移動端
App 端和 HTML5 端均支持,效果如下圖所示:
3. 模板下載
已完成模板可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\MultiFormReport\主從表填報.cpt
點擊下載模板:主從表填報.cpt
4. 注意事項
4.1 多個内置 SQL 的執行順序
若一個填報模板中定義了多個内置 SQL,其執行順序會按照定義的順序執行,若在執行其中一個内置 SQL 時出錯,會停止下面内置 SQL 的執行并對已執行的内置 SQL 進行回滾,回滾具體請查看 報表填報屬性。