填報之動態擴展列

在填報開發中,常見的填報表樣式有很多,其中就包含了網格式填報、交叉填報等,如下圖

1png

2png

這種大多都是單一數據來源,進行取數回填的,基本不涉及在報表中處理數據表間的關聯分組等複雜情況。下面我們通過一個具體的實例來看一下如何製作這種複雜的填報表 – 動態列。

需求說明

如下圖表格中左右用不同顏色劃分出了兩塊:分別是 A-D(藍色部分)、E-V(黃色部分)

3png

其中:

  1. A-D 爲固定列,數據來源於數據庫表 report_market,要求數據縱向擴展

  2. E-V 爲動態列,數據來源於數據庫表 report_market_detail,要求 1-3 行分組橫向擴展, 4-5 行根據 A 列的 ID 關聯取數縱向擴展

  3. E-V 爲動態列部分 按照第一行的類型可以實現分組小計自動計算,即同類型的不同維度的自動求和

  4. E-V 爲動態列部分 第二行由多個字段組成,如:report_market_detail. item_type 和

report_market_detail. item_name 拼接而成

表結構

上述填報表涉及的庫表結構如下圖所示:

report_market 表

4png

report_market_detail 表

5png

** 注:** 兩表 report_market.id == report_market_detail.p_id 關聯;

實例所用數據庫爲 mysql

難點

  1. 同一報表中多個對象取數怎麼保證分片正常劃分;

  2. E-V 動態列怎麼實現動態橫向擴展;

  3. E-V 動態列部分怎麼實現多層分組;

  4. E-V 動態列 第 2 行 組合字段怎麼形成;

  5. 重命名或組合字段怎麼正確對應數據庫字段入庫;

  6. 動態列部分怎麼實現分組小計

製作方法

1. 繪製表樣,如下圖

6png

注: 此處表樣設計結果了難點 6 的分組小計問題,將 sum 計算放進了分組維度。

2. 編寫數據處理腳本

數據來源腳本

7png

代碼說明

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 的多層分組,關於多層分組詳細介紹可參考如下文章 潤乾報表 填報 - 如何製作多分組填報表

數據去向腳本:

8png

代碼說明:

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 的信息。

保存對象的舊數據:

9png

無須特別定義,可根據數據來源及報表的對象定義 點擊imagepng進行自動提取。

3. 配置單元格屬性

10png

重點設置:

A4:字段名稱設置不包含任何對象名稱,原因是因爲 改字段爲固定列與動態列 部分共有的關聯字段,如果指定對象名稱會導致分片出現問題。

注:此步操作保證了多個對象分片的關聯性,以及準確性。間接解決了難點 1 的問題。

C1 ,C2 : 分別從 item1 中取出數據來源腳本處理好的分組維度值。

注:數據處理完成後,想要實現橫向擴展,需滿足維度格下方有數值格則橫向擴展,詳西規則看一下文章最後的重點總結。

此處解決了難點 2 的問題。

4. 預覽

此步主要目的,確認報表設置完成後,取數是否按預想進行分片。

11png

可以看出 report2 TAB 頁自動生成了二維表結構包含了表樣中的 A4、C1、C2、C4、D4 部分,這個結構正常是跟數據來源取數的 report2 對象數據結構相同。

12png

注:此步操作,相當重要,如果這裏的數據結構與數據來源一致,那報表基本都可以正常取數回填,反之,如這裏不正確,那後面必然出問題。

5. Web 預覽填報效果

gif

重點總結

1. 填報表擴展采集規則:

如果左(上)有擴展格,則延用擴展方向;否則,如果右(下)有數值則縱(橫)向擴展,右、下均有或均無數值格時出錯

2. 填報表分片規則:

每片形成一個序表(序表可以理解爲一個數據表)。通常行列上連續的一片數值格(連同對應的維度格)會被當做一片;

連續的多行(兩行以上)中,只有數值格,沒有維度格和非空普通格會被當做自由增刪行的行式分片;除了這些分片以外的單值數據(維度格、數值格)將被拼到一個一行記錄的序表中。

3.報表實例及數據表

詳情鏈接:http://c.raqsoft.com.cn/article/1575943820059?r=gxy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章