反饋已提交

網絡繁忙

填报常见报错

1. 填报到 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

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

问题描述

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

1600227902656990.png

原因分析

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

解决方案
2.3.1 优化模板

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

Snag_19fc46c9.png

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

222

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

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

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

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

1600238367171527.png

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

1600238401570884.png

2.3.2 安装修复包

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

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

问题描述

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

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

原因分析

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

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

解决方案

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

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

4. hologres 填报报错

问题描述

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

1607406485290829.png

原因分析

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

解决方案

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

5. Clickhouse 填报报错

问题描述

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

1607395600589651.png

原因分析

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

解决方案

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

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

问题描述

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

原因分析

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

解决方案

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

7. Mysql提交慢

问题描述

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

原因分析

Mysql默认禁用了批量提交。

解决方案

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

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

问题描述

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

原因分析

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

解决方案

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

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

问题描述

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

原因分析

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

解决方案

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

10. 数据列类型不匹配

问题描述

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

1633767007391407.png

原因分析

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

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

解决方案

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

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


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

问题描述

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

Snag_24218f54.png

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

原因分析

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

解决方案

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

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

var th=this;

setTimeout(function() {

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

}, 500)

附件列表


主題: 目录错乱的简中文档合集
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉