需求描述:
使用者在網頁端錄入股票資料,要通過行式填報表在網頁端插入空行,然後進行資料的錄入,錄入資料時要求實作校驗功能,如下圖:
紅色區域在報表展現時為一行,現在通過行式報表的添加行功能添加了三行,要求在這三行内輸入明細資訊,主要問題在身份證号及證券名稱代碼這裡,要求同一個身份證号下不能出現相同的證券代碼,這就要求在填寫證券代碼時先判斷目前行對應的身份證号是否在其他行出現過,如果出現過在判斷目前證券代碼是否和同一身份證号證券代碼相同,如果相同則彈出出錯資訊,如下圖:
可以看到,當輸出第三行時身份證相同,證券号碼相同,則彈出錯誤提示。
解決辦法:
潤乾報表支援校驗,并且能夠引用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,校驗通過
}
這樣就可以實作上述業務需求。