1. 描述编辑
对于在填报提交时,编辑单元格的值需要与另一报表中某个参数或者某一单元格的值进行校验的需求,FineReport 可以通过自定义函数来实现。
2. 原理编辑
在 JAVA 实现的自定义函数中,读取报表,传入参数值并执行,从执行后的报表结果中取某个单元格值的并返回,在填报表中便可以使用返回的值进行数据校验了。
对模板 reportcheck2.cpt 中单元格 D2 输入的成绩进行校验,比较对象是 reportcheck1.cpt 中的值,如下图:
D2 输入的值不能大于 reportcheck1.cpt 中的最大值,也不能小于 reportcheck1.cpt 中的最小值。
其中 reportcheck1 的最大值最小值是通过参数最终计算而来的。
该例子仅作为原理介绍,因此比较的对象直接引用参数的值,实际情况中可能是报表通过传入的参数,根据参数取得数据,执行报表后某些格子的值,与该例子是一样的。
此时在 reportcheck2.cpt 中我们怎么获取另一模板的值呢?
可以通过自定义函数 ReportCheck 获取。
ReportCheck 函数:ReportCheck(para1,para2,para3,para4) ,获取报表中某一单元格的值
参数 | 说明 |
---|---|
para1 | 报表名称 |
para2 | 传递给报表的参数值列表,格式如 "[{name:para1name,value:para1value},{name:para2name,value:para2value},......]" |
para3 | 获取单元格列号,从 0 开始 |
para4 | 获取单元格行号,从 0 开始 |
实例:
ReportCheck("reportcheck1.cpt","[{name:max,value:100},{name:min,value:0}]",1,0) :获取报表 reportcheck1 通过传入参数计算后的 B1 单元格的值
ReportCheck("reportcheck1.cpt","[]",0,0) :若没有参数,则第二个参数值设为 "[]" 获取报表 reportcheck1 的 A1 单元格的值
2. 步骤编辑
2.1 编写自定义函数
ReportCheck 函数代码如下:
https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/function/ReportCheck.java
2.2 编译自定义函数
编译 ReportCheck.java,生成类 ReportCheck.class、ReportCheck$TpObj.class,由于我们的类定义在包 com.fr.function 下,因此将最终生成的类文件拷贝至%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\function 文件夹下,没有这个路径的话可以手动创建。
2.3 注册自定义函数
启动设计器,选择服务器>函数管理器,增加一自定义函数,选择刚保存的类,如下图:
这样,这个自定义函数便注册好了,您可以在工程里的所有模板中使用这个自定义函数。
2.4 使用自定义函数
打开 reportcheck2.cpt 模板,点击模板>报表填报属性>数据校验,我们来设置校验公式。
reportcheck2.cpt 设置的数据校验如下:
添加校验信息分别为:
D2 <= ReportCheck("reportcheck1.cpt","[{name:max,value:90},{name:min,value:0}]",1,0),校验出错信息:"成绩太高,超过最高分"
D2 >= ReportCheck("reportcheck1.cpt","[{name:max,value:90},{name:min,value:0}]",1,1),校验出错信息:"成绩太低,低于最低分"
校验公式说明:给 reportcheck1 传入两个参数,max 值为 90,min 值为 0,取执行后结果中第 2 列第 1 行和第 2 列第 2 行,即 B1 和 B2 单元格的值,保存,点击填报预览
3. 预览效果编辑
成绩输入 100,点击数据校验,提示“成绩太高,超过最高分”
成绩输入 -10,提示“成绩太低,低于最低分”
成绩输入 80,校验成功