1. 概述
1.1 預期效果
使用 sql() 函數可以動态取數據庫中某個字段的值,但是如果想取得多個字段的值,就必須執行多條 sql() 函數,這樣就加大了對服務器資源的請求量;如果查詢的 SQL 又比較複雜的話,執行效率将會很慢。
可以通過一個 sql() 函數,配合 JavaScript 來獲取多個不同字段的值。如下圖所示,一個填報中通過輸入人員 ID,來獲取人員名字,姓别,電話号碼。
存字段的表:
查詢結果:
1.2 實現思路
因爲 SQL 函數 本身的使用限制,只能每次獲取一個列的信息,但是如果想獲取多列的話,我們其實是可以同時對多個字段用特殊符号拼接到一起查詢出來,再在 JavaScript 中對這一串利用特殊符号拼接的字符串進行分割,這樣就可以分别取得不同列的值。
2. 示例
2.1 準備模板
新建模板,B2 單元格添加文本框, 爲輸入 ID 的文本框,C2 單元格添加按鈕, 爲查詢的按鈕 。
D2 單元格公式内容爲:sql("FRDemo","SELECT empname||','||sex||','||tel FROM employee where EMPid='"+B2+"'",1,1)
注:不同數據庫拼接字符的方法不同,比如 Sqlite,Oracle 是||,其他 如 MSSQL, MySQL 等一般直接用+就行了 ,另外在 SQL 用於分割的拼接字段的特殊字符和 JavaScript 中分割時的要一緻 。
最後将 D 列設隐藏。如下圖所示:
2.2 添加事件
1)爲了取得 B2 單元格中控件修改後的實時值,我們需要在 B2 單元格控件設置「編輯後」事件,如下圖所示:
注意需要添加一個參數row,值爲公式 row。
JavaScript 代碼如下:
//修改後即把當前值賦值給實際值
var v=this.getValue();
contentPane.setCellValue('B'+row,null,v)
2)爲 C3 單元格中「查詢按鈕」添加「點擊」事件,如下圖所示:
注意需要添加一個參數row,值爲公式 row。
JavaScript 代碼如下:
//獲取D2單元格信息,因爲填報模板設置直接顯示控件後獲取方式不一樣,下面這種寫法保證獲取成功
var info=contentPane.curLGP.getCellValue('D'+row);
//分割查詢出來的結果
var infoarray=info.split(',');
var result='';
//這裏是上面字段的個數,如果不是3,那麽說明沒查詢到數據
if(infoarray.length==3){
result+='姓名:'+infoarray[0]+'\n';
result+='性别:'+infoarray[1]+'\n';
result+='電話号碼:'+infoarray[2]+'\n';
FR.Msg.alert('查詢結果',result);
} else {
alert('未查詢到信息!');
}
2.3 效果預覽
保存模板,點擊「填報預覽」,效果如下圖所示:
注:不支持移動端。
3. 模板下載
已完成模板可參見:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\JS實現通過SQL一次性獲取多個字段.cpt
點擊下載模板:JS實現通過sql一次性獲取多個字段.cpt