自定义校验

  • 文档创建者:文档助手1
  • 编辑次数:30次
  • 最近更新:Leo.Tsai 于 2020-08-03
  • 1. 概述

    1.1 应用场景

    一些特殊的业务逻辑用公式校验实现起来比较复杂,希望可以交付给用户自定义的程序来判断,然后将结果返回给 FineReport 。

    1.2 功能入口

    设计器菜单栏点击模板>报表填报属性,设置界面选择数据校验,点击Snag_2033736c.png,选择自定义校验即可,如下图所示:

    1596442363720294.png

    2. 示例

    2.1 准备数据

    新建数据查询数据集 ds1,SQL 语句为:SELECT * FROM 销售总额

    Snag_39b226a1.png

    2.2 设计表格

    设计填报表格, 将数据集字段拖到对应单元格中,给 A2~B2 单元格添加文本控件,如下图所示:

    Snag_39b4b5d7.png

    2.3 设置提交

    设计器菜单栏点击模板>报表填报属性,提交设置项下新增一个内置SQL提交,如下图所示:

    1596443262832083.png

    2.4 自定义校验类

    可以通过如下 2 个接口实现自定义校验类:

    • com.fr.data.VerifyJob.class:对每条记录进行校验,校验失败时定位所有出错的单元格。

    • com.fr.data.TotalVerifyJob.class:对每条记录进行校验,但无法定位出错的单元格。

    注:不论继承哪个接口类,都需要定义一个私有变量 type (名称可变),用来返回校验结果。type=0 表示校验成功,type=1 表示校验失败,默认 type=0。

    2.4.1 方法一:com.fr.data.VerifyJob.class

    示例要实现的效果是:销售总额的值小于 2000 时,弹出校验出错提示“销量值不能小于最小基数”。

    1)报表填报属性界面新增一个自定义校验,点击编辑按钮,如下图所示:

    1596444600217626.png

    2)将 Java 代码拷贝到自定义函数编辑界面,点击编译按钮,只有显示编译成功后,才能保存,如下图所示:

    注:也可以将外部编译得到的 class 文件放到%FR_HOME%\webapps\webroot\WEB-INF\classes文件夹下,然后点击选择按钮引用 class 文件。

    Snag_39d047e3.png

    Java 代码如下:

    package com.fr.demo;  
      
    import com.fr.base.Utils;  
    import com.fr.data.DefinedVerifyJob;  
    import com.fr.data.JobValue;  
    import com.fr.data.Verifier;  
    import com.fr.script.Calculator;  
      
    public class VerifyJobDemo extends DefinedVerifyJob{  
        /* 
         * 必须要定义此私有变量,变量名可改,表示校验状态 
         * 0  表示校验成功,默认校验状态位为0 
         * 1  表示校验失败 
         */  
        private int type = 0;  
      
        /** 
         * 当模板自定义事件增加的属性 名称与下面变量有对应时,则会自动赋值于此对应变量 
         */  
        private JobValue salenum;   // JobValue 对应单元格  
        private int minnum;       // 非单元格,则对应具体类型值  
      
        public void doJob(Calculator calculator) throws Exception {  
            /* 
             * 如这边提供一个简单的判断来模拟执行过程 
             * 校验规则为销量需要大于等于最小基数:salenum >= minnum 
             * 校验不通过,提示“销量值不能小于最小基数” 
             */  
            if(salenum != null){  
                int sale = 0;  
                if(salenum.getValue() instanceof Integer){ //将单元格值转为整型以便用于比较  
                    sale = (Integer)salenum.getValue();  
      
      
                }else {  
                    sale = Integer.parseInt(Utils.objectToString(salenum.getValue()));  
                }  
      
                if(sale < minnum){ //校验判断  
                    type = 1;  
                }  
            }else {  
                type = 1;  
            }  
      
        }  
      
        public String getMessage() {  
            // 根据校验状态是成功还是失败,设置对应的返回信息  
            if(type == 0){  
                return "恭喜你,校验成功";//这个值并没有用,成功的时候不会显示这里的内容,还是显示我们默认的  
            }else{  
                return "销量值不能小于最小基数";  
            }  
      
        }  
        public Verifier.Status getType() {  
            // 返回校验状态  
            return Verifier.Status.parse(type);  
        }  
      
        public void doFinish(Calculator arg0) throws Exception {  
            // TODO Auto-generated method stub  
      
        }  
      
    }

    3)点击增加属性按钮,添加 2 个属性,分别与 Java 类中的 2 个变量对应,如下图所示:

    1596445188840764.png

    注1:minnum 即校验值,此处设置为 2000,可自行更改。

    注2:如果继承自 com.fr.data.VerifyJob.class接口类,那么自定义校验中的属性名称必须与 Java 类中的变量名称保持一致。

    2.4.2 方法二:com.fr.data.TotalVerifyJob.class

    1)报表填报属性界面新增一个自定义校验,点击编辑按钮,如下图所示:

    1596444600217626.png

    2)将 Java 代码拷贝到自定义函数编辑界面,点击编译按钮,只有显示编译成功后,才能保存,如下图所示:

    注:也可以将外部编译得到的 class 文件放到%FR_HOME%\webapps\webroot\WEB-INF\classes文件夹下,然后点击选择按钮引用 class 文件。

    Snag_39e86aa8.png

    Java 代码如下:

    package com.fr.demo;  
      
    import com.fr.base.Utils;  
    import com.fr.data.JobValue;  
    import com.fr.data.TotalVerifyJob;  
    import com.fr.data.Verifier;  
    import com.fr.script.Calculator;  
      
    public class TotalVerifyJobDemo extends TotalVerifyJob{  
        /* 
         * type : 必须要定义此私有变量,变量名可改,表示校验状态 
         * 0  表示校验成功,默认校验状态位为 0 
         * 1  表示校验失败 
         */  
        private int type = 0;   
          
        @Override  
        protected void doTotalJob(Data data, Calculator calculator)   
        throws Exception { // @param data 以二维表排列的所有提交数据  
            int sale, min;  
            JobValue salenum, minnum;   
      
            int row = data.getRowCount(); // 获取一共多少行数据  
            for (int i = 0; i < row; i++) {  // 遍历每行,进行校验  
                salenum = (JobValue) data.getValueAt(i, 0);  
                sale = Integer.parseInt(Utils.objectToString(salenum.getValue()));   
                  
                minnum = (JobValue) data.getValueAt(i, 1);  
                min = Integer.parseInt(Utils.objectToString(minnum.getValue()));  
                  
                if(sale < min){ //校验判断  
                    type = 1;  
                }  
            }    
              
        }  
      
        public String getMessage() {  
            // 根据校验状态是成功还是失败,设置对应的返回信息  
            if(type == 0){  
                return "恭喜你,校验成功";//这个值并没有用,成功的时候不会显示这里的内容,还是显示我们默认的  
            }else{  
                return "销量值不能小于最小基数";  
            }  
        }  
      
        public Verifier.Status getType() {  
            // 返回校验状态  
            return Verifier.Status.parse(type);  
        }  
      
        public String getJobType() {  
            return "totalVerifyJob";  
        }  
    }

    3)点击增加属性按钮,添加 2 个属性,分别与 Java 类中的 2 个变量对应,如下图所示:

    1596446549533366.png

    注:不同于 VerifyJob 方法,这里的属性名称不一定要与 Java 类中 JobValue 对象的名称一致,其是按照位置对应的,即自定义校验时,FineReport 会将这两个属性值以二维列表形式存放在 Data 参数中,按照顺序取数,Data 的第一列为第一个属性对应的值,如果属性值为单元格,则获取单元格扩展后的所有值,如果为固定值,则该列的所有行均为该值,行数由单元格扩展的行数确定。

    2.5 效果预览

    2.5.1 方法一:com.fr.data.VerifyJob.class

    1)PC 端

    保存报表,点击填报预览,前端点击数据校验后,弹出多条校验出错信息且小于 2000 的数据会被定位出来,如下图所示:

    1596445815723276.gif

    2)移动端

    同时支持 App 端和 H5 端预览,但是不支持定位哪些单元格出错,如下图所示:

    1596447332463036.gif

    2.5.2 方法二:com.fr.data.TotalVerifyJob.class

    1)PC 端

    保存报表,点击填报预览,前端点击数据校验后,弹出一条校验出错信息,但无法定位出错单元格,如下图所示:

    B4C310E9-CE44-4B74-81D5-D668D6D87FCF.GIF

    2)移动端

    同时支持 App 端和 H5 端预览,不支持定位哪些单元格出错,如下图所示:

    1596447556941003.gif

    3. 模板下载

    3.1 方法一

    已完成模板参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\VerifyForm\自定义校验方法一.cpt

    点击下载模板:自定义校验方法一.cpt

    3.2 方法二

    已完成模板参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\VerifyForm\自定义校验方法二.cpt

    点击下载模板:自定义校验方法二.cpt

    附件列表


    主题: 填报应用
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!