1. 程式人生 > >潤乾V4實現行式報表新增行內資料的校驗

潤乾V4實現行式報表新增行內資料的校驗

需求描述

使用者在網頁端錄入股票資料,要通過行式填報表在網頁端插入空行,然後進行資料的錄入,錄入資料時要求實現校驗功能,如下圖:

紅色區域在報表展現時為一行,現在通過行式報表的新增行功能添加了三行,要求在這三行內輸入明細資訊,主要問題在身份證號及證券名稱程式碼這裡,要求同一個身份證號下不能出現相同的證券程式碼,這就要求在填寫證券程式碼時先判斷當前行對應的身份證號是否在其他行出現過,如果出現過在判斷當前證券程式碼是否和同一身份證號證券程式碼相同,如果相同則彈出出錯資訊,如下圖:

可以看到,當輸出第三行時身份證相同,證券號碼相同,則彈出錯誤提示。

解決辦法:

潤乾報表支援校驗,並且能夠引用js函式校驗,這樣就可以通過自定義js函式實現該校驗功能,但在使用中有幾個注意事項。

   在潤乾的應用開發文件中介紹到了可以用document.getElementById("report1_A1").value方式獲得單元格的值,這樣就可以通過這種方式迴圈遍歷擴充套件行看是否值相同,但在實際使用時發現這種方式只能獲取固定單元格的值,並不能獲取動態插入的這些行的單元格,例如,擴充套件區域在第10行,頁面端插入了兩行,此時用document.getElementById("report1_A11").value獲得的值並不是插入的第11行,而是在報表設計時的第11行值,這樣前邊的需求就無法實現,只能通過其他方式實現。

實際上可以把標籤生成的報表table當做一個數組,然後從這個陣列中動態獲得值,這個陣列中的值是報表在頁面端插入行後的值,如:document.getElementById("report1").rows[r].cells[2].value下面介紹下實現思路。

首先在證券程式碼單元格校驗中引用js函式,並且傳入相關引數:checkNo(J10,C10.toString(),E10.toString()),可以看到,這裡傳入三個引數,C10為身份證號單元格用於判斷身份證是否相同,E10單元格是證券號單元格,但該函式又傳入一個單元格J10,這個主要是因為將來做資料判斷證券號和身份證號時必須要把當前行的單元格除去,否則肯定會報迴圈引用錯誤,所以J10單元格是通過流水號動態的獲得當前是第幾行,方便校驗判斷。

在jsp中定義js函式:

function checkNo(num,sfz,zqh){//校驗證券好函式,傳入三個引數,行號,身份證號,證券號

       var len=document.getElementById("report1").rows.length-5;//獲得擴充套件區行數,減去5是因為擴充套件區下邊有5個固定行,將這部分減去只判斷擴充套件區的值

           num=num-2;//以陣列形式,要將行號-2

               for(var r=9;r<len;r++){//從第10行開始動態判斷

                      if(num!=r){//過濾掉當前行

            var cellC10=document.getElementById("report1").rows[r].cells[2].value;//獲得頁面端身份證號,注意這裡是用陣列形式

            var cellE10=document.getElementById("report1").rows[r].cells[3].value;//獲得頁面端證券號

                       if(sfz==cellC10){//如果身份證號和當前身份證相同,繼續比較

                          if(zqh==cellE10){//判斷證券號是否相同

                                 return false;//如相同,返回false

                                 }

                          }

                        }

                      }

       return true;//返回true,校驗通過

       }

這樣就可以實現上述業務需求。