历史版本3 :JS实现通过sql一次性获取多个字段 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1.概述编辑

我们知道,利用在JS代码中使用FineReport内置的公式在JS中可通过FR.remoteEvaluate()和sql()函数配合可以动态取得数据库中某个字段的值,但是如果在JS中想取得多个字段的值,就必须执行多条FR.remoteEvaluate函数,这样就加大了对服务器资源的请求量,如果查询的sql又比较复杂的话,执行效率会比较慢,下面以一个填报中通过输入人员ID,来获取人员名字,姓别,电话号码的JS为例,展示如何通过一个FR.remoteEvaluate来获取这三个不同字段的值。

222


222


2.实现思路编辑编辑

因为sql ()函数本身的使用限制(详情见SQL函数)只能每次获取一个列的信息,但是如果想获取多列的话,我们其实是可以同时对多个字段进行拼接,拼到到一起,用特殊符号进行分割,如逗号等,再在JS中对这一串利用特殊符号进行分开,这样就能分别取得不同列的值了


3.实现过程编辑

3.1 新建模板

新建一个模板,模板如下图,B2为输入ID的文本框,C2为查询的按钮
222


3.2 添加JS代码
3.2.1 为了取得B2控件修改后的实时值,我们需要在B2单元格控件设置编辑后事件,如下图


222



//修改后即把当前值赋值给实际值 var v=this.getValue(); contentPane.setCellValue('B'+row,null,v)
3.2.2 查询按钮的点击事件代码

为C3单元格查询按钮添加点击事件,如下图


222

//获取B2单元格信息,因为填报模板设置直接显示控件后获取方式不一样,下面这种写法保证获取成功 var empID=contentPane.curLGP.getCellValue('B'+row); //查询的sql var sql="sql(\"FRDemo\",\"SELECT empname||','||sex||','||tel FROM employee where EMPid='"+empID+"'\",1,1)"; //执行sql var info=FR.remoteEvaluate(sql)+''; //分割查询出来的结果 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('未查询到信息!'); }    

至此,可以看到,只通过一条FR.remoteEvaluate函数,经过一次请求便可以获取到多个字段列的值了,在其他地方,如超链接,填报成功事件等等中,都可以利用此方法高效获取多个值了

注:不同数据库拼接字符的方法不同,比如sqlite是||,其他如mssql,oracle等一般直接用+就行了 ,另外在sql用于分割的拼接字段的特殊字符和JS中分割时的要