1. 概述
1.1 問題描述
資料庫自增長 ID 填報是指在 FineReport 範本中進行資料填報的時候,不需要設定和綁定 ID 資料欄。在往資料庫中插入資料的時候,資料庫會自動為每筆資料生成一個增量的ID。
1.2 實現思路
自增長ID的實現主要依賴資料庫的設定,需要先在資料表中建立對應的自增ID欄位。具體建立方式每種資料庫可能會有差別,可百度尋找相關資料。
本文將簡單介紹幾種常見資料庫的自增id設定方式。
注1:使用者也可透過安裝「序列號函式插件」,實現生成序列,主要用於填報生成主鍵功能。該插件無需依賴資料庫的類型,方便報表切換資料庫,在任意資料庫都可以使用。詳情請參見:序列號函式插件
注2:方案支援行動端填報。
2. SQL Server資料庫
在 SQL Server 資料庫中,提供了標識,可以透過設定標識、標識種子和標識增量來實現 SQL Server 主鍵的自增長。
2.1 自增長ID設定
1)假設在 SQL Server 資料庫中存在下面一張資料表,我們需要將其 ID 列實現自增長,就可以在
中設定 ,修改標識增量和標識種子,如下圖:2)也可以使用 SQL 語句來建立,identity(1,1)指定 ID 由 1 開始,每次增長 1.
2.2 範本製作
1)建立資料連結
建立一個資料連結,連結至該資料庫,建立資料連結的方法詳細請參照 資料連結。
2)範本設定
建立一張範本,新增資料集SELECT * FROM dbo.[KHK]。
在範本設計主體頁面第一欄分別新增兩個正文元件和一個 插入列 的按鈕元件,並在第三行中將資料欄拖曳至對應儲存格中,如下圖:
3)填報屬性設定
點選「範本>報表填報屬性」,增加一個內建 SQL,如下圖:
注:如果只有新增資料的需求,那麼不需要綁定自增id欄位,否則提交可能會報錯「當 IDENTITY_INSERT 設定為 OFF 時,不能為表 'KHK' 中的標識列插入顯式值」。
2.3 效果預覽
點選「填報預覽」,在 Web 端進行資料填報,如下圖:
在 KH 標題下面的元件中插入2筆資料,點選「提交」按鈕,將資料提交入庫,重新整理頁面,可以看到下面藍色區域部分多了 2 筆資料,即剛剛填報資料的資料,並且 ID列也進行了自增長。
3. Oracle 資料庫
3.1 自增長ID設定
在 Oracle 資料庫中,提供了序列的功能,可以透過 Oracle 的序列及觸發器,實現主鍵的自增長。
1) 建立序列
2)建立觸發器
3.2 範本實現
其範本實現與 SQL Server 資料庫一致,這裏不再贅述。
4. 常見問題
4.1 問題現象
使用資料庫自增長 ID 進行資料填報時,可能會發生下圖所示報錯:當 IDENTITY_INSERT 設定為 OFF 時,不能為表 'KHK' 中的標識列插入顯式值。
4.2 問題原因
出現該報錯原因是,自增長ID的機制是插入資料時,自動給這筆資料一個編號,而不需要人為填入。這時候如果在填報屬性中給這個自增長欄位綁定了值,那麼就會導致上述的衝突報錯。例如下圖所示,id為自增長欄位,給id綁定了值就會出現報錯。
4.3 解決方案
4.3.1 方案一(適用於只需要新增資料,無更新和刪除需求的場景)
移除填報屬性中的自增長id欄位。
4.3.2 方案二(適用於需要同時實現新增,更新和刪除需求的場景)
將以下的內容寫入記事本檔案中,並將檔案另存為insertIgnoreColumn.properties,put 命令%FR_HOME%\WEB-INF\resources資料夾下。該檔案作用為在新增資料時,忽略掉自增長id欄位。檔案內容為:
說明:
KHK:填報資料的資料表名稱,需要按照實際場景修改
id:自增長id的欄位列名稱,需要按照實際場景修改
注:如果有多個資料表需要使用自增長 ID,那麼直接在此配置檔案中換行寫入即可。新增或修改配置檔案都需要重啟web伺服器才會生效。