行式填报表轻松搞定流水号
在各式各樣的報表業務需求中,有這樣一類,不僅要對數據進行統計呈現,還要基于這些數據做增、刪、改的操作并與數據庫進行交互。這種情況下,無論從數據庫統一管理還是數據合法性角度考慮,都難免需要進行諸如自動計算、校驗、跨表取數之類的計算。今天,小編就帶領大家 get 其中的一個新姿勢:自動計算特殊用法之“流水號”。
場景舉栗如下:
實際項目應用中,當多用戶并發填報時我們常常會遇到主鍵重復的問題,造成的結果便是前一個用戶填報的內容,會被另一個用戶給覆蓋掉,從而造成數據丟失。如果由開發人員通過編程來解決這個問題,一般都是比較麻煩的事情。而如果交由數據庫去處理,就變得簡單多了,因為不管多少個用戶,對數據庫來說只是一個更新數據庫的命令隊列,數據庫本身會對主鍵的問題進行判斷。這也就是大多數數據庫能夠提供字段自動增長功能的原因。
不過選對了報表工具,我們也可以不依賴數據庫就輕松生成流水號,避免因為主鍵重復造成數據丟失。下面我們就以潤乾報表為例,看一下具體的做法:
方法一:序號格
報表設計界面如下圖所示:
其中,
數據處理部分選擇【多源 SQL】然后【使用向導生成腳本】,“數據來源”設置如下:
“數據去向”指定編號字段作為主鍵,如下圖所示:
保存對象的舊數據,提取前兩步設置的對象名供報表取數回填使用。
報表設計方面
第 2 行標題名均與數據庫字段名稱一致;
A3 單元格,設置字段名稱為 employee. 編號;
I3 單元格,表達式為 =H3*1.2, 實現自動計算;
A3-I4 單元格類型為數值格。
要求新增行時,編號自動增長,最終效果如下圖所示
重點來了,實現方法只需選中 A3 單元格,勾選右側屬性【類型】–【序號格】即可。
【注】此方法采用數據全查詢且按照間隔為 1 的遞增規則,也就是在當前值的基礎上進行遞增計算,然后把每一次計算出的新值作為當前值。
方法二:UUID 算法
首先,在報表展現的 jsp(如:previewInput.jsp) 頁面中定義 js 方法如下:
?
? ? function?newUUID()
? ? {
? ? ? ? ? ? var?uuid?=?"";
? ? ? ? ? ? for?(var?i?=?1;?i?<=?16;?i++){
? ? ? ? ? ? ?var?n?=?Math.floor(Math.random()*16.0).toString(16);
? ? ? ? ? ? ?uuid?+=???n;
? ? ? ? ? }
? ? ? ? var?len?=?uuid.length;
? ? ? ? return?uuid;???
? ? }
?
然后,修改方法一中的報表,不要勾選【序號格】,然后將【缺省值表達式】設置為 newUUID(),調用自定義的 UUID 算法。如下圖
最終頁面上新增行展現效果如下,生成 16 位的字符串。
【注】此方法將按照一定規則隨機產生主鍵,由數字、字符串等組成的 16 位字符串。
通過以上 2 種方法,我們在報表端就可以輕輕松松搞定主鍵自增長,永久避免因主鍵沖突導致數據丟失的事情。
最最后,我們來回顧一下其中的技術要點:
1. 生成間隔為 1 的連續遞增數值做主鍵:
【技能】報表設計區域右側屬性欄–類型–序號格 勾選即可。
2. 生成由數字,字母組成的 16 位隨機字符串做主鍵:
【技能】巧妙運用 UUID 方法 +【缺省值表達式】。
作者:IBelieve
鏈接:http://c.raqsoft.com.cn/article/1542937624221?r=IBelieve
來源:乾學院
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
轉載于:https://www.cnblogs.com/IBelieve002/p/10036722.html
總結
以上是生活随笔為你收集整理的行式填报表轻松搞定流水号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ1299[LLH邀请赛]巧克力棒
- 下一篇: 科研