填报自定义提交

编辑
  • 文档创建者:文档助手1
  • 浏览次数:17242次
  • 编辑次数:30次
  • 最近更新:别打男爵 于 2019-07-24
  • 1. 问题描述

    用户在做填报报表时,希望点击提交按钮并不是往数据库中填报数据,而是要获取到填报页面的数据进行进一步处理,这个该如何解决呢?

    2. 解决思路

    在 报表填报属性 中介绍了报表填报属性有 2 种设置方式,一个是内置 SQL 直接绑定字段,往数据库中填报数据,另外一种是添加自定义事件,如果需要获取数据对数据进行进一步处理,则可选择添加自定义事件,下面详细介绍。

    3. 示例

    获取填报页面的值,通过自定义事件获取到数据并在后台打印出来。

    注:这里示例的自定义填报提交类的作用是输出内容到FineReport10.0\logs和FineReport10.0\bin\out.txt,数据不会入库。

    3.1 自定义事件类

    自定义事件继承自 DefinedSubmitJob 这个接口,通过JobValue接口获取填报页面单元格,JobValue 与报表填报属性处的属性绑定,然后用 getValue()方法获取单元格的值,getValueState() 获取值的状态,值状态有四种:VALUE_STATE_CHANGED、VALUE_STATE_INSERT、VALUE_STATE_DELETED 和VALUE_STATE_DEFAULT。

    1)方法一

    在类里面定义几个 JobValue,每一个 JobValue 对应一个单元格,在报表填报属性中通过属性列表中将其与对应的单元格绑定起来,具体使用如 DemoSubmitJob1:


    package com.fr.data;    
        
    import com.fr.data.DefinedSubmitJob;    
    import com.fr.data.JobValue;    
    import com.fr.script.Calculator;    
        
    public class DemoSubmitJob1 extends DefinedSubmitJob {    
        /**  
         * 当模板自定义事件增加的属性 名称与下面变量有对应时,则会自动赋值于此对应变量  
         */    
        public String getJobType(){    
        return " ";    
    }     
        private JobValue studentno;   // JobValue 对应单元格    
        private JobValue name;    
        private JobValue grade;    
        private boolean isPass;       // 非单元格,则对应具体类型值    
        
        /**  
         * 每一条记录执行一次此方法  
         * 同一提交事件在一个处理事务内,此对象是唯一的  
         */    
        public void doJob(Calculator calculator) throws Exception {    
            // JobValue 的 getValueState()方法获取此对应单元格的状态    
            if (studentno.getValueState() == JobValue.VALUE_STATE_CHANGED) {    
                // 此单元格的值在报表初始化后被修改过    
            } else if (studentno.getValueState() == JobValue.VALUE_STATE_INSERT) {    
                // 此单元格是在报表初始化后新增的(例如执行了插入行操作)    
            } else if (studentno.getValueState() == JobValue.VALUE_STATE_DELETED) {    
                // 此单元格所在的记录被执行了删除操作    
            } else if (studentno.getValueState() == JobValue.VALUE_STATE_DEFAULT) {    
                // 此单元格在报表初始化后没有变化    
            }    
                
            // 值获取    
            System.out.print(" 学号: " + studentno.getValue());  // 通过 JobValue 的 getValue 方法获得单元格的值    
            System.out.print(" 姓名: " + name.getValue());    
            System.out.print(" 总分: " + grade.getValue());    
            System.out.print(" 是否达标: " + isPass);    
            System.out.println();    
        }    
    }

    注:可以将所有变量全部定义成 JobValue 对象,通过 getValue() 获取对象的值。

    2)方法二

    通过 doJob 的方法参数 Calculator 中的 Property_Value 属性, Property_Value 属性对应一个 map 对象,Map 中包含报表填报属性中所有属性名称以及它们对应的值,使用 map 中的 getValue() 方法获取属性值,即单元格,接着使用 JobValue的getValue() 方法获取单元格的值,详细如 DemoSubmitJob2:


    package com.fr.data;
    import com.fr.script.Calculator;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    public class DemoSubmitJob2 extends DefinedSubmitJob {
        /**
         * 每一条记录执行一次此方法
         * 同一提交事件在一个处理事务内,此对象是唯一的
         */
        public String getJobType(){
            return " ";
        }
        public void doJob(Calculator calculator) throws Exception {
            // 同样可以直接在传入的 calculator 中获取定义的属性及其对应的值
            Map map = (Map)calculator.getAttribute(PROPERTY_VALUE);
            if (map == null) return;
            Set set = map.entrySet();
            Iterator it = set.iterator();
            Entry entry;
            // 遍历Map获取所有属性及其值
            while (it.hasNext()) {
                entry = (Entry)it.next();
                System.out.print(" " + entry.getKey() + ": ");
                // JobValue对应单元格
                if (entry.getValue() instanceof JobValue) {
                    JobValue ce = (JobValue)entry.getValue();
                    // JobValue的getValueState()方法获取此对应单元格的状态
                    if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {
                        // 此单元格的值在报表初始化后被修改过
                    } else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {
                        // 此单元格是在报表初始化后新增的(例如执行了插入行操作)
                    } else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {
                        // 此单元格所在的记录被执行了删除操作
                    } else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {
                        // 此单元格在报表初始化后没有变化
                    }
                    System.out.print(ce.getValue());         // 通过 JobValue 的 getValue 方法获得单元格的值
                } else {
                    // 非单元格,则对应具体类型值
                    System.out.print(entry.getValue());
                }
            }
            System.out.println();
        }
    }

    3)方法三

    自定义事件除了可继承自 DefinedSubmitJob 这个接口之外,还可以继承 TotalSubmitJob 接口,这两个接口的区别在于 DefinedSubmitJob 多次执行,即一行一行的获取模板中的数据,获取一行数据则执行一次自定义事件,而 TotalSubmitJob 接口只执行一次,即先获取到模板中所有的数据,然后在类里面循环,具体使用如DemoTotalSubmitJob:


    package com.fr.data;
    import com.fr.data.JobValue;
    import com.fr.data.TotalSubmitJob;
    import com.fr.script.Calculator;
    public class DemoTotalSubmitJob extends TotalSubmitJob {
    /**
    * 同一提交事件,在一个提交事务内只执行一次
    * @param data 以二维表排列的所有提交数据

    */
    public String getJobType(){
    return " ";

    protected void doTotalJob(Data data, Calculator calculator)
    throws Exception {
    data.getColumnCount(); // 获取列的数量,每一列对应一个添加的属性
    for (int i = 0; i < data.getColumnCount(); i++) {
    System.out.println(data.getColumnName(i));   // 获取对应的属性名称
    }
    for (int i = 0; i < data.getRowCount(); i++) {   // getRowCount 获取一共多少行数据
    System.out.print("ROW " + i + " {");
    for (int j = 0; j < data.getColumnCount(); j++) {
    if (j > 0) System.out.print(", ");
    Object value = data.getValueAt(i, j);    // 获取对应位置的值
    if (value instanceof JobValue) {
    JobValue ce = (JobValue)value;
    // JobValue的getValueState()方法获取此对应单元格的状态
    if (ce.getValueState() == JobValue.VALUE_STATE_CHANGED) {
    // 此单元格的值在报表初始化后被修改过
    } else if (ce.getValueState() == JobValue.VALUE_STATE_INSERT) {
    // 此单元格是在报表初始化后新增的(例如执行了插入行操作)
    } else if (ce.getValueState() == JobValue.VALUE_STATE_DELETED) {
    // 此单元格所在的记录被执行了删除操作
    } else if (ce.getValueState() == JobValue.VALUE_STATE_DEFAULT) {
    // 此单元格在报表初始化后没有变化
    }
    value = ce.getValue();               // 通过 JobValue 的 getValue 方法获得单元格的值
    }
    System.out.print(data.getColumnName(j) + " : " + value);
    }
    System.out.print("}");
    System.out.println();
    }
    }
    }

    3.2 填报页面主体设置

    1)数据准备

    新建数据库查询ds1,SQL 语句为:SELECT * FROM STSCORE where name <> ''


    2)界面设置

    将 studentno,name 和 grade 求和拖曳至单元格中,并为之添加控件,B5 和 D5 单元格为数字控件,C5 单元格为文本控件。如下图:

    3.3 报表填报属性设置

    如上所述,实现自定义事件获取填报页面的值有三种方法,则下面根据上述的不同方法介绍填报属性的不同设置。

    1)方法一(DemoSubmitJob1)

    将类文件放置到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data文件夹下面。

    点击模板>报表填报属性,添加自定义事件,选择 DemoSubmitJob1 这个类,为类中定义的变量绑定单元格或公式,如下图:


    注:该方法中属性名称跟类文件中定义的 JobValue 是一一对应的,必须保证报表填报属性处添加的属性名称与类文件中定义的名称保持一致,并且如果在类文件中对应参数类型不是 JobValue 的话,则就必须与属性的数据类型保持一致,一般来说,为了便于维护,可以讲 Java 类中的所有变量全部设为 JobValue 对象,不论报表填报属性中的属性类型是什么,均可以通过 GetValue 获取其值。

    效果展示

    后台打印效果如下:


    2)方法二(DemoSubmitJob2) 

    将类文件放置到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data文件夹下面。

    点击模板>报表填报属性,添加自定义事件,选择 DemoSubmitJob2 这个类,为类中定义的变量绑定单元格或公式,如下图:


    注:方法二中是通过 Calculator 参数属性 PROPERTY_VALUE 来获取报表填报属性处的属性与属性值,再通过 JobValue 来得到单元格的值,在类文件中并不是一一对应的获取属性与属性值,而是通过 map 遍历来获取属性与属性值,所以在报表填报属性处增加属性时,属性名字可随意定义,但是后面的值如果是单元格的话,必须选择单元格类型。

    效果展示

    后台打印效果如下:


    3)方法三(DemoTotalSubmitJob)

    将类文件放置到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data文件夹下面。

    点击模板>报表填报属性,添加自定义事件,选择 DemoTotalSubmitJob 这个类,为类中定义的变量绑定单元格或公式,如下图:


    注:方法三与方法二中的使用方式类似。

    效果展示

    后台打印效果如下:


    3.4 其他应用

    自定义事件不仅可用于报表填报属性处,也可用于按钮控件中的提交事件,具体可查看 上传文件至服务器插件


    附件列表


    主题: 二次开发
    标签: 暂无标签 编辑/添加标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]