填报常见错误

  • 文档创建者:Leo.Tsai
  • 编辑次数:12次
  • 最近更新:Leo.Tsai 于 2020-09-18
  • 1. 填报到 RAW(16) 字段提交失败

    1.1 问题描述

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

    screenshot-1.png

    1.2 原因分析

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

    1.3 解决方案

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

    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;

    /**
     * @description: 将十六进制转为Oracle raw(16)
     * @author: Jimmy.Zheng
     * @create: 2020-07-14 14:28
     */
    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)设置填报提交时,只需要将入库的值用公式转换下即可,如下图所示:

    Snag_4b95e53.png

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

    2.1 问题描述

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

    20180803151247_5111.png

    2.2 原因分析

    弹出如上对话框有两种原因:一种是模板中包含大量公式,另一种是模板中有大量用于填报的控件。

    2.3 解决方案

    2.3.1 优化模板

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

    Snag_19fc46c9.png

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

    222

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

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

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

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

    1.png

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

    2.png

    2.3.2 安装修复包

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

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

    3.1 问题描述

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

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

    3.2 原因分析

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

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

    3.3 解决方案

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

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

    附件列表


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