1. 概述
1.1 問題描述
使用者在填報報表中錄入資料時,希望可以透過兩個或多個欄位來驗證資料的唯一性,確定填入的資料在資料庫中不存在。
1.2 解決思路
報表設計時將需要校驗的多個欄位連接起來作為一個欄位,然後對資料庫中的相應欄位也做同樣連接處理。填報屬性中設定內建提交校驗公式,驗證這兩個連接起來的欄位是否一致,如果一致則代表資料重複。
2. 範例
以下範例用產品名稱和單價作為聯合主鍵,來判斷輸入值是否和資料庫中已有資料重複。
2.1 資料準備
建立資料集 ds1,輸入 SQL 查詢語句:select *,(產品名稱||單價) as aa from S產品。
(產品名稱||單價)表示將產品名稱與單價連接成一個欄位。該文法適用於Sqlite資料庫,其它資料庫的連接文法可百度查詢。
2.2 設計範本
1)如下圖設計表格,A2~G2 儲存格新增正文元件。
H2 儲存格插入公式:CONCATENATE(B2, C2),表示在填報時將 B2 和 C2 儲存格的填入的內容連接在一起。
2)為了前端填報時可以新增多條記錄,需要設定 A2 儲存格縱向擴展,如下圖所示:
3)前端新增多條記錄時,需要新增的列保留 H2 儲存格中的公式,所以要將 H2 儲存格的插入欄策略設定為原值,如下圖所示:
4)H2 儲存格僅用於判斷重複資料,不需要展示,所以設定完成後可以隱藏 H 欄。
2.3 填報屬性設定
點選「範本>報表填報屬性>提交」,新增一個內建SQL,按下圖所示設定填報屬性
點選「範本>報表填報屬性>資料校驗」,新增一個內建校驗,按下圖所示設定校驗公式:
公式為:INARRAY(H2,if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa))))=0,含義為取出 ds1 中連接好的aa 欄位作為一個陣列,之後遍歷判斷每一行的 H2 是否在陣列中存在,存在的話就是重複資料。
公式解譯:
公式 | 說明 |
---|---|
ds1.group(aa) | 對 ds1 中的 aa 資料欄資料分類匯總,當個數為 1 的時候,回傳值為字串;>1 傳回陣列 |
ARRAY(ds1.group(aa)) | 將 ds1.group(aa) 匯總的資料轉換為陣列格式 |
if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa))) | 如果匯總後資料個數<1,將字串轉換為陣列 |
INARRAY(H2,if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa)))) | 傳回 H2 中連接的聯合主鍵在已有資料陣列中的位置,如果不存在傳回 0 |
2.4 效果查看
1)PC 端
儲存報表,點選填報預覽,輸入與資料庫中重複的產品名稱和單價,資料校驗時會提示報錯資訊。
2)行動端
同時支援 App 端和 H5 端,效果如下圖所示:
3. 已完成範本
點選下載範本:內建提交校驗驗證資料是否重複.cpt