反馈已提交

网络繁忙

填报常见问题

  • 文档创建者:Leo.Tsai
  • 编辑次数:31次
  • 最近更新:星踪 于 2022-09-27
  • 1. 概述

    1.1 版本

    Finereport 版本
    11.0

    1.2 应用场景

    本文介绍填报模板制作、预览、提交过程中,常见的问题及排查步骤。

    2. 通用排查方法

    2.1 排查方式

    根据本位了解了相关报错可能的原因后,可以采取一些针对性的方式去定位问题,下面列出几种常用的方法。

    • 对填报属性进行二分法测试,定位到出问题的字段,查看其绑定的值是否有问题。

    • 对模板结构进行简化,删除不相关的元素,定位出问题点。

    • 在数据库新建一个简单的表来测试是否提交成功。

    • 更换其他数据库来提交测试。

    2.2 填报异常检测

    11.0.2 及以后,模板检测助手新增「填报异常检测」功能。通过此检测功能,用户可以方便快速的找出填报模板中的异常问题,减少排查时间,降低维护成本。

    用户打开一个填报模板后,点击工具栏「模板检测助手」,如果模板中填报相关属性设置异常,则会提醒用户异常内容和异常所在位置,同时给出修改意见。用户可根据提示内容进行修改。

    2.3 填报调试插件

    在排查提交异常的问题时,推荐安装此插件:填报调试插件。该插件可根据设置的填报属性,将页面数据结果可视化,让您对提交结果一目了然。

    3. 常见报错


    报错可能原因
    1无法将 NULL 插入XX数据库表设置了某字段不能为空,但是该字段提交的数据中存在空值
    2check constraint (NASMES.SYS_C0014107) violated提交的数据中存在违反数据库设置的约束的数据,比如某字段设置为了主键不能有重复值,但是提交的数据中存在重复值
    3违反唯一键约束
    4Violate unique constraint on[***]
    5no operation allowed after statement closed数据库设置了权限,限制了增删改sql语句的执行
    6no operations allowed
    7ora-01031 权限不足
    8当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'XXX' 中的标识列插入显式值对自增长id进行修改时的报错,可参考 数据库自增长ID填报 解决
    9无效数字某个提交值和其入库字段类型不一致
    10批处理异常
    11No value specified for parameter XX
    12数据提交错误,索引中丢失in 或out
    13没有为参数号XX设置值
    14数据列类型错误/不匹配
    15FR-Engine-Write_Column_Type_Mismatch
    16Data too long for column 'file' at row X某个提交值的长度超过了其入库字段的限制
    17将截断字符串或二进制数据
    18ERRORCODE=-4229, SQLSTATE=null
    19公式解析错误某个公式存在问题
    20Task DCL error HiveException: [Error 20132] Error, you should set transaction.type before any DCL statement星环数据库的报错,未在DCL声明前定义事务类型,可尝试在数据连接url后增加transaction.type=inceptor参数
    21Lock wait timeout exceeded; try restarting transaction填报事务已锁死,需要先在数据库解锁对应事务,才可继续填报
    22Attempt to do update or delete using transaction manager that does not support these operationshive数据库中没有开启update和delete操作,需要在数据库开启
    23没有为参数号设置值检查填报属性的「内置SQL」提交设置中,「值」是否都已配置且配置正确
    24updates on append-only tables are not supported in serializable transactionsgp数据库隔离级别有问题,可以尝试在finedb的FINE_CONF_ENTITY表中添加字段WriteOptimizationConfig.transactionRepeatableRead=false将隔离级别改回原值。

    4. 填报到 RAW(16) 字段提交失败

    问题描述:

    32 位十六进制数据(如GUID)填报到 RAW(16) 数据类型的字段时,报错「ORA-12899: 列 "xxx"."xxx"."xxx" 的值太大 (实际值: 32, 最大值: 16)」。如下图所示:

    screenshot-1.png

    原因分析:

    32 位十六进制字符串插入 RAW(16) 时,需要使用 hextoraw() 进行转换,但是通用 SQL 不好判断数据库列是否是 RAW(16) 类型,故无法直接应用 hextoraw 进行转换。

    解决方案:

    可以使用函数在入库前对需插入数据进行转换,所用函数可以通过自定义函数或者函数插件自定义,现提供一种自定义函数作为参考。自定义函数方法如下:

    1)设计器菜单栏点击「服务器>函数管理器」,自定义一个函数,命名为「transform」,点击「编辑」按钮,输入 Java 代码,点击「编译」按钮,编译成功后保存即可,步骤如下图所示:

    1595316577757219.png

    Java 代码如下:

    package com.fr.function;

    import com.fr.general.FArray;
    import com.fr.general.GeneralUtils;
    import com.fr.script.AbstractFunction;
    import com.fr.stable.ArrayUtils;
    import com.fr.stable.Primitive;
    import com.fr.stable.exception.FormulaException;

    public class Hex2Raw extends AbstractFunction {
        @Override
        public Object run(Object[] objects) throws FormulaException {
            int len = ArrayUtils.getLength(objects);
            if (len == 0) {
                return Primitive.ERROR_VALUE;
            } else if (len == 1) {
                Object item = objects[0];
                if (item instanceof FArray) {
                    FArray data = (FArray) item;
                    FArray<byte[]> result = new FArray<byte[]>();
                    for (Object el : data) {
                        result.add(parseHexString2ByteArray(GeneralUtils.objectToString(el)));
                    }
                    return result;
                } else {
                    return parseHexString2ByteArray(GeneralUtils.objectToString(item));
                }
            } else {
                FArray<byte[]> result = new FArray<byte[]>();
                for (Object item : objects) {
                    result.add(parseHexString2ByteArray(GeneralUtils.objectToString(item)));
                }
                return result;
            }
        }

        public byte[] parseHexString2ByteArray(String hexStr) {
            if (hexStr.length() < 1)
                return new byte[0];
            byte[] result = new byte[hexStr.length() / 2];
            for (int i = 0; i < hexStr.length() / 2; i++) {
                // 两位为一组转为十进制
                int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
                int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
                // 转为十进制存入byte数组
                result[i] = (byte) (high * 16 + low);
            }
            return result;
        }
    }

    2)设置填报提交时,只需要将入库的值用公式转换下即可,如下图所示:

    1595315670462736.png

    5. 警告信息:停止运行此脚本吗?

    问题描述:

    填报时弹出警告信息:「停止运行此脚本吗?此页面上的脚本造成 Web 浏览器运行速度减慢。如果继续运行,您的计算机将可能停止响应。」如下图所示:

    1600227902656990.png

    原因分析:

    弹出如上对话框有两种原因:

    1)模板中包含大量公式。

    2)另一种是模板中有大量用于填报的控件。

    5.1 优化模板

    1)将所有公式在编辑界面打开,取消默认勾选的「填报/分析时,保留公式用于计算」,如下图所示:

    Snag_19fc46c9.png

    2)将需要填报的数据单独查询出来,这些数据绑定控件进行填报,其他数据不绑定控件,直接在单元格中展示,这样可以大大减少控件的数量,如下图所示:

    将填报模板分为两部分:「填报部分」和「展示部分」,这两部分的结构都是一样的。

    • 填报部分:设置控件,并通过参数过滤出需要修改的那条记录

    • 展示部分:没有控件,不用过滤,显示出全部记录

    • 参数部分:隐藏查询按钮,在下拉框中添加「编辑后事件」,实现自动查询,详细介绍参见文档:JS 实现无需点击查询按钮即可自动查询

    1600238367171527.png

    3)减少控件的另一种方法,如下图示例,数据全部展示出来,在产品编号上添加超链,需要修改该记录时,点击超链接到另外一张模板单独进行填报修改。

    1600238401570884.png

    5.2 安装修复包

    微软官方针对该问题提供了修复包,下载后直接安装即可,点击下载修复包:jb51-MicrosoftFixit50403.rar

    6. 填报入库数据跟预览数据不同

    问题描述:

    • 填报中使用了 now() 和 UUID() 等公式,提交后入库的数据跟前端显示的数据不同。

    • 填报时使用了层次坐标 ,提交后入库的数据跟前端显示的数据不同。

    原因分析:

    • now() 和 UUID() 等公式提交时都会重新计算一遍,因而入库后数据会改变。

    • 填报二次计算时不支持层次坐标。

    解决方案:

    • 新增模板参数 p ,参数值为公式 now(),设计模板时单元格添加公式 $p,报表填报属性设置提交时列对应的值设置为参数 $p,即可完美的解决该问题,UUID 同理。

    • 对于包含层次坐标的复杂嵌套公式,需要在公式编辑界面将「填报/分析时,保留公式用于计算」取消勾选,避免二次计算。

    7. hologres 填报报错

    问题描述:

    使用阿里云的 hologres 产品(类似数据库),可正常查询数据,但是填报使用「内置SQL」提交类型时,点击「提交」会弹出一个报错,如下图所示:

    1607406485290829.png

    原因分析:

    hologres 产品本身不支持事务中执行 insert 语句。

    解决方案:

    填报提交的时候使用「自定义提交」方式,通过写代码的方式执行 insert 语句。 

    8. Clickhouse 填报报错

    问题描述

    使用 Clickhouse 数据库进行填报时,点击「提交」会弹出一个报错,如下图所示:

    1607395600589651.png

    原因分析

    Clickhouse 数据库 UPDATE 和 DELETE 操作和常规的数据库删改语法不同,不支持使用。支持使用的语法格式可参考 报表填报属性简介 2.1节。

    解决方案

    设置「报表填报属性」时,提交类型选择「插入提交」。

    9. ADB数据库智能提交无法插入数据

    问题描述

    阿里云的ADB数据库使用智能提交时,无法新增数据。使用插入提交正常。

    原因分析

    ADB3.0以上版本更新了数据库机制,导致本应该插入的数据在返回影响行数的时候,从0变为了1,所以后续就不会执行插入了。

    解决方案

    在ADB的console里找到RC_UPDATE_AUTO_CONVERT_ENABLE参数,将其设置为false即可。如果没有该参数,则需要手动添加。

    10. Mysql提交慢

    问题描述

    同样的模板,其它数据库正常,只有Mysql数据库提交非常慢。

    原因分析

    Mysql默认禁用了批量提交。

    解决方案

    在数据连接的url后增加&rewriteBatchedStatements=true参数。

    11. 删除行按钮添加提交事件时删除失败

    问题描述

    删除行按钮中设置了提交入库的事件,偶发出现删除失败和数据错位的现象。

    原因分析

    删除行动作和删除提交动作的顺序不是固定的,当顺序相反时就会出现问题。

    解决方案

    用普通按钮设置提交事件,在回调函数中用JS删除行。具体可参考记录填报操作中2.2的设置方式。

    12. 公式单元格作为主键时删除失败

    问题描述

    填报属性绑定了某个写了公式的单元格作为主键,删除行提交后,该数据并未从数据库删除。

    原因分析

    删除行的公式在提交时会二次计算,返回空字符串,所以无法删除对应数据。

    解决方案

    去除勾选公式的填报/分析时,保留公式用于计算,或者将公式直接写到填报属性中。

    13. 数据列类型不匹配

    问题描述

    填报时有时候会遇到数据列类型不匹配的报错,如下图所示:

    1633767007391407.png

    原因分析

    第一种可能原因:确认下自己设置填报属性绑定单元格列值的时候有没有出错,如果错把数据库字段跟标题所在单元格绑定了会报这个错;

    第二种可能原因:看下数据库字段是不是 NUMBER 类型,数据库字段类型跟单元格数据类型不一致导致的。

    解决方案

    第一种原因:重新绑定数据库字段跟填报单元格;

    第二种原因:前端用数字控件,确保是数值类型符合数据库要求;或者将数据库字段修改成 VARCHAR2 类型。

    14. 直接显示控件与控件初始化后事件报错

    问题描述

    在模板 Web 属性中填报页面设置下勾选直接显示控件后

    Snag_24218f54.png

    如果控件初始化后事件中使用到 getWidgetByname,getWidgetByCell 等接口会有报错:CustomJSError:Cannot read properties of undefined

    原因分析:

    直接显示控件加载要比 JS 事件触发慢导致的。

    解决方案:

    给 JS 事件加延时,等控件加载完了,再执行代码就不会报错了

    初始化事件中嵌套一个延时函数试试,延时函数中不能用 this,需要外面定义好,代码如下:

    var th=this;

    setTimeout(function() {

         你的代码;(你代码的this换成th)

    }, 500)

    15. 填报成功事件偶发不生效

    问题描述:

    火狐浏览器设置了填报成功事件,但是偶发不生效。

    解决方案:

    通过 about:config 打开火狐浏览器的 dom.allow_scripts_to_close_windows 配置为 true 即可。

    16. 单元格为空时赋值HTML无效

    问题描述:

    单元格设置了用HTML显示内容,当初始内容为空时,手动填写或者JS赋值HTML内容时,单元格无法正常展现HTML样式。

    1648611932983777.gif

    原因分析:

    当单元格初始为空时,该单元格即使设置了「用HTML显示内容」,也不会被标记为HTML显示。因此,在后续赋值时,不会有HTML效果。

    解决方案:

    可以在单元格中输入一个空格作为默认值,确保单元格初始化时有内容。

    1648612281223394.gif

    17. 填报或者导入Excel时报错null/会话失效/发送失败

    问题描述:

    填报或者导入Excel时报错null/会话失效/发送失败/0。

      

    17.1 网络配置

    原因分析:

    例如nginx之类的代理服务器,其一些参数设置会影响请求的转发,如果设置有问题,则会导致报错。可以测试不走代理时的模板,在使用时是否报错来确认问题是否和代理服务器设置有关。

    解决方案:

    检查代理服务器的参数设置,例如nginx的超时时间参数proxy_send_timeout,上传文件大小限制参数client_max_body_size等,适当调大。

    17.2 容器配置

    原因分析:

    容器自身有请求超时时间的限制,如果填报或者导入时间过长超过了限制,就会出现报错。

    解决方案:

    调整容器的超时时间,例如Tomcat可以在/conf/server.xml中,修改connectionTimeout参数值,适当调大。


    17.3 智能运维

    原因分析:

    当工程整体占用内存过高的时候,模板的会话可能会被智能运维清理掉,造成会话失效报错。可以通过报错时间段的gc日志或者内存管理中的内存情况来判断是否是此情况。

    解决方案:

    优化模板或者工程来降低内存使用情况。

    17.4 自定义过滤器

    原因分析:

    对工程做了自定义的filter,可能会影响一些请求,导致报错。可以检查工程WEB-INF文件夹下是否存在web.xml文件,存在的话备份删除后重启测试,如果问题不再出现,则可以判断为此原因。

    解决方案:

    由于自定义filter不属于工程本身功能,所以需要根据实际情况自主排查filter的代码哪里有问题。

    18. 决策报表填报使用数据集函数获取不到值

    问题描述:

    决策报表填报,在填报属性设置界面中,使用了数据集函数(value,ds1.select,ds1.find,ds1.group),提交后发现相应公式未正确执行,导致提交数据异常。


    原因分析:

    决策报表填报属性设置界面,不支持数据集函数,使用时相关函数的返回值为空。

    解决方案:

    将数据集函数设置在一个文本控件中进行计算,并在填报属性中直接引用该文本控件获取计算后的值。

    19. 控件异常显示为config type cannot be null

    问题描述:

    模板预览时,偶发出现部分或者所有控件显示为config type cannot be null。


    原因分析:

    模板设置了自定义的JS刷新页面,同时又在该JS或者其他初始化/加载结束事件中定义了JS获取相关控件。此时由于网络请求先后的不确定性,就可能出现获取控件的JS在页面未刷新完成的情况下就执行了,这时候由于获取不到控件而报错。

    解决方案:

    为获取控件的JS增加延时,确保页面加载完毕后再执行获取控件的语句。如下图所示:

    20. 填报报错 incorrect string value

    问题描述:

    数据填报到MySQL数据库,提交时报错「incorrect string value:'xf0x9f」

    原因分析:

    提交的数据中带有Emoji表情或者某些特殊字符,是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

    解决方案:

    修改mysql的my.ini文件:

    [mysqld]                                                                                                                                                                                                   
    character-set-server=utf8mb4
    [mysql]
    default-character-set=utf8mb4

    重启mysql服务后就可以正常插入了。

    21. 填报round函数计算精度不正确

    问题描述:

    在填报场景中使用round函数计算时,可能会出现数字的精度问题,例如公式=round(1.9999,2)的页面显示计算结果为2,但是在填报入库时,填入的却是1.9999。


    原因分析:

    在小数位较多的情况下,round函数如果只有2个参数的话,会有精度不准确的问题,需要添加第三个参数true来解决。

    解决方案:

    添加第三个参数true,就可以解决填报时精度不准确的问题。例如:=round(1.9999,2,true)




    附件列表


    主题: 数据准备

    售前咨询电话

    400-811-8890转1

    在线技术支持

    在线QQ:800049425

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526

    文 档反 馈

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭