1. 概述
1.1 问题描述
在做填报报表时,希望点击提交按钮后,获取到填报页面的数据做一些自定义的处理,要如何实现呢?
1.2 实现思路
在「报表填报属性」章节中介绍了报表填报属性有 2 种设置方式,一个是内置 SQL 直接绑定字段,往数据库中填报数据,另外一种是添加自定义事件。如果需要获取数据后对数据进行自定义处理,则可选择使用自定义提交。
1.3 功能说明
1)自定义提交的本质是获取页面数据后做自定义的处理,所以获取值后的代码部分需要用户自己根据业务需求编写和维护。
2)暂不支持回调,即将数据处理的结果返回给页面展示。
3)自定义提交支持移动端使用。
2. 示例
2.1 准备数据
新建数据集 ds1,从FRDemo取数,SQL 语句为:SELECT * FROM S产品 limit 3
2.2 设计填报表格
设计填报表格,将数据集相应字段拖到单元格中,A2 单元格添加「数字控件」,B2 单元格添加「文本控件」,表格样式如下图所示:
2.3 编写自定义提交类
2.3.1 获取模板数据
参考以下代码可获取相应的模板数据,之后就可以按自定义的需求对数据做处理。
package com.fr.data;
import com.fr.log.FineLoggerFactory;
import com.fr.script.Calculator;
public class SubmitDemo extends DefinedSubmitJob {
public String getJobType() {
return " ";
}
/**
* 当模板填报属性增加的参数名与下面变量名一致时,则会自动赋值于此对应变量
* JobValue代表绑定的值为单元格,其他类型数据需按照各自类型去定义类,例如字符串为String
* 不支持单元格组
*/
private JobValue ID;
private JobValue Name;
private String Type;
private Integer Count;
/**
* 每一条记录执行一次此方法
*/
public void doJob(Calculator calculator) throws Exception {
FineLoggerFactory.getLogger().error("---------ID:" + ID.getValue() + ",Name:" + Name.getValue() + ",Type:" + Type + ",Count:" + Count + "------------");
//在fanruan.log以error级别输出获取到的参数值
if (ID.getState().checkChanged()) {
//FineLoggerFactory.getLogger().error("---------修改:"+ID.getValue()+"------------");
// 在fanruan.log以error级别输出被标记为"修改"的数据
} else if (ID.getState().checkDeleted()) {
//FineLoggerFactory.getLogger().error("---------删除:"+ID.getValue()+"------------");
// 在fanruan.log以error级别输出被标记为"删除"的数据
} else if (ID.getState().checkDefault()) {
//FineLoggerFactory.getLogger().error("---------默认:"+ID.getValue()+"------------");
// 在fanruan.log以error级别输出被标记为"默认"的数据
}
}
}
2.3.2 获取文件
1)需要在 2.3.1 节代码的基础上导入以下包:
import com.fr.general.FArray;
import com.fr.cache.Attachment;
import com.fr.stable.xml.FRFile;
2)文件控件上传的文件,需要在使用JobValue.getValue()后做进一步的处理,才能获取到文件名和文件流。
假设文件单元格对应的参数名为FName,在使用private JobValue FName定义好对象之后,参考下方代码处理:
if (FName.getValue() instanceof FArray) {
FArray farray = (FArray) (FName.getValue());
for (int i = 0; i < farray.length(); i++) {
Attachment cache = (Attachment) (farray.elementAt(i));
FineLoggerFactory.getLogger().error("------filename:" + cache.getFilename() + "--------");
//getFilename()获取文件名
FineLoggerFactory.getLogger().error("------file:" + cache.getBytes() + "--------");
//getBytes()获取文件流
}
}
else if (FName.getValue() instanceof FRFile){
FRFile cache = (FRFile) FName.getValue();
FineLoggerFactory.getLogger().error("------filename:" + cache.getFileName() + "--------");
//getFilename()获取文件名
FineLoggerFactory.getLogger().error("------file:" + cache.getBytes() + "--------");
//getBytes()获取文件流
}
2.4 设置填报属性
1)点击「模板>报表填报属性」,新增一个自定义提交,点击编辑按钮,如下图所示:
2)将上面的Java 代码复制到自定义函数编辑界面,点击「编译」按钮,显示编译成功后,点击「保存」按钮,如下图所示:
注:除了上述编译方式外,也可以将外部编译好的 class 文件放到 %FR_HOME%\webapps\webroot\WEB-INF\classes 文件夹下和代码中定义的 package 路径一致的位置,然后点击「选择按钮」引用 class 文件。若修改替换了 class 文件,则需要重启设计器或帆软服务,修改的代码才会生效。
点击可下载 class 文件:SubmitDemo.rar
3)点击增加属性按钮,给提交事件添加 4 个属性,注意值的类型需要和代码中定义的类型一致,如下图所示:
2.5 效果预览
使用填报预览,点击提交按钮,查看日志。
注:支持移动端预览。
3.模板下载
点击下载模板:自定义提交.cpt