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\doctw\Form\MultiFormReport\主從表填報.cpt
點選下載範本:主从表填报.cpt
4. 注意事項
4.1 多個內建 SQL 的執行順序
若一個填報範本中定義了多個內建 SQL,其執行順序會按照定義的順序執行,若在執行其中一個內建 SQL 時出錯,會停止下面內建 SQL 的執行並對已執行的內建 SQL 進行回滾,回滾具體請查看 報表填報屬性。