在填報開發中,常見的填報表樣式有很多,其中就包含了網格式填報、交叉填報等,如下圖
這種大多都是單一數據來源,進行取數回填的,基本不涉及在報表中處理數據表間的關聯分組等複雜情況。下面我們通過一個具體的實例來看一下如何製作這種複雜的填報表 – 動態列。
需求說明
如下圖表格中左右用不同顏色劃分出了兩塊:分別是 A-D(藍色部分)、E-V(黃色部分)
其中:
-
A-D 爲固定列,數據來源於數據庫表 report_market,要求數據縱向擴展
-
E-V 爲動態列,數據來源於數據庫表 report_market_detail,要求 1-3 行分組橫向擴展, 4-5 行根據 A 列的 ID 關聯取數縱向擴展
-
E-V 爲動態列部分 按照第一行的類型可以實現分組小計自動計算,即同類型的不同維度的自動求和
-
E-V 爲動態列部分 第二行由多個字段組成,如:report_market_detail. item_type 和
report_market_detail. item_name 拼接而成
表結構
上述填報表涉及的庫表結構如下圖所示:
report_market 表
report_market_detail 表
** 注:** 兩表 report_market.id == report_market_detail.p_id 關聯;
實例所用數據庫爲 mysql
難點
-
同一報表中多個對象取數怎麼保證分片正常劃分;
-
E-V 動態列怎麼實現動態橫向擴展;
-
E-V 動態列部分怎麼實現多層分組;
-
E-V 動態列 第 2 行 組合字段怎麼形成;
-
重命名或組合字段怎麼正確對應數據庫字段入庫;
-
動態列部分怎麼實現分組小計
製作方法
1. 繪製表樣,如下圖
注: 此處表樣設計結果了難點 6 的分組小計問題,將 sum 計算放進了分組維度。
2. 編寫數據處理腳本
數據來源腳本:
代碼說明:
A1 : 連接數據庫
A2: 從數據表中 report_market_detail 取出動態列部分分組所需字段
A3: 基於 A2 返回結果作預處理
注:此處可以解決難點 4 的組合字段問題。
A4:從數據表 report_market_detail 中查詢出動態列部分所需所有字段,此處注意對 report_market_detail.p_id 做重命名處理,作用是爲了報表分片解析 關聯 report_market 表的 id 字段
A5: 基於 A4 整理出報表所需數據,並存入變量 report2 中供報表取數使用
注: 此處可以解決難點 5 的字段拼接及重命名。
A7: 從數據表 report_market 中查詢出固定列部分所需字段
A8: 基於 A7 做數據整理,並把結果存入變量 report,供報表取數使用
重點
A10 - A14 : 實現動態列數據的動態分組嵌套關係
A10 : 定義空序列,用於存儲 A11 去重後的 item_type 字段,即對應表樣 動態列第一行的內容
A13 : 循環取出,與 A10 中 item_type 匹配的 type_name(此字段由 item_type 和 item_name 組成)
A14 : 將 A10、A12 結果整合成一個序表,便於報表形成整體觀念,利於數據處理。
注: 此處解決了難點 3 的多層分組,關於多層分組詳細介紹可參考如下文章 潤乾報表 填報 - 如何製作多分組填報表
數據去向腳本:
代碼說明:
A1 : 連接數據庫
A2 : 使用集算器 db.update() 函數,處理 report_market 數據表部分的更新操作
A3 – A4 : 將數據來源部分針對 report2 做的字段重組、重命名,拆分還原,以保證跟源數據庫表 report_market_detail 中的字段匹配
注: 此處可以解決難點 5 的字段拼接及重命名後,數據回填字段對不上的問題
A5 : 基於 A3、A4 處理後的新舊對象,對 report_market_detail 執行數據庫更新操作
A6 –A7 : 根據數據庫是否有報錯信息,以邊用該控制事務的回滾或者提交操作
A8 : A1 數據源使用完成進行關閉
A9 : 返回 A6 的信息。
保存對象的舊數據:
無須特別定義,可根據數據來源及報表的對象定義 點擊進行自動提取。
3. 配置單元格屬性
重點設置:
A4:字段名稱設置不包含任何對象名稱,原因是因爲 改字段爲固定列與動態列 部分共有的關聯字段,如果指定對象名稱會導致分片出現問題。
注:此步操作保證了多個對象分片的關聯性,以及準確性。間接解決了難點 1 的問題。
C1 ,C2 : 分別從 item1 中取出數據來源腳本處理好的分組維度值。
注:數據處理完成後,想要實現橫向擴展,需滿足維度格下方有數值格則橫向擴展,詳西規則看一下文章最後的重點總結。
此處解決了難點 2 的問題。
4. 預覽
此步主要目的,確認報表設置完成後,取數是否按預想進行分片。
可以看出 report2 TAB 頁自動生成了二維表結構包含了表樣中的 A4、C1、C2、C4、D4 部分,這個結構正常是跟數據來源取數的 report2 對象數據結構相同。
注:此步操作,相當重要,如果這裏的數據結構與數據來源一致,那報表基本都可以正常取數回填,反之,如這裏不正確,那後面必然出問題。
5. Web 預覽填報效果
重點總結
1. 填報表擴展采集規則:
如果左(上)有擴展格,則延用擴展方向;否則,如果右(下)有數值則縱(橫)向擴展,右、下均有或均無數值格時出錯
2. 填報表分片規則:
每片形成一個序表(序表可以理解爲一個數據表)。通常行列上連續的一片數值格(連同對應的維度格)會被當做一片;
連續的多行(兩行以上)中,只有數值格,沒有維度格和非空普通格會被當做自由增刪行的行式分片;除了這些分片以外的單值數據(維度格、數值格)將被拼到一個一行記錄的序表中。
3.報表實例及數據表