最新历史版本 :自定义提交 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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 编写自定义提交类

参考以下代码可获取相应的模板数据,之后就可以按自定义的需求对数据做处理。

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().checkInsert()) {
            //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级别输出被标记为"默认"的数据
        }
    }
}

如果是文件控件上传的文件,则需要在使用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)点击「模板>报表填报属性」,新增一个自定义提交,点击编辑按钮,如下图所示:

1596178832950191.png

2)将上面的Java 代码复制到自定义函数编辑界面,点击「编译」按钮,显示编译成功后,点击「保存」按钮,如下图所示:

1596179070793852.gif

注:除了上述编译方式外,也可以将外部编译好的 class 文件放到 %FR_HOME%\webapps\webroot\WEB-INF\classes 文件夹下和代码中定义的 package 路径一致的位置,然后点击「选择按钮」引用 class 文件。若修改替换了 class 文件,则需要重启设计器或帆软服务,修改的代码才会生效。

点击可下载 class 文件:SubmitDemo.rar

3)点击增加属性按钮,给提交事件添加 4 个属性,注意值的类型需要和代码中定义的类型一致,如下图所示:

2.5 效果预览

使用填报预览,点击提交按钮,查看日志。

1.gif

注:支持移动端预览。

3.模板下载编辑

点击下载模板:自定义提交.cpt