反饋已提交
網絡繁忙
32 位十六进制数据(如GUID)填报到 RAW(16) 数据类型的字段时,报错ORA-12899: 列 "xxx"."xxx"."xxx" 的值太大 (实际值: 32, 最大值: 16),如下图所示:
32 位十六进制字符串插入 RAW(16) 时,需要使用 hextoraw() 进行转换,但是通用 SQL 不好判断数据库列是否是 RAW(16) 类型,故无法直接应用 hextoraw 进行转换。
可以使用函数在入库前对需插入数据进行转换,所用函数可以通过自定义函数或者函数插件自定义,现提供一种自定义函数作为参考。自定义函数方法如下:
1)设计器菜单栏点击「服务器>函数管理器」,自定义一个函数,命名为「transform」,点击「编辑」按钮,输入 Java 代码,点击「编译」按钮,编译成功后保存即可,步骤如下图所示:
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)设置填报提交时,只需要将入库的值用公式转换下即可,如下图所示:
填报时弹出警告信息:停止运行此脚本吗?此页面上的脚本造成 Web 浏览器运行速度减慢。如果继续运行,您的计算机将可能停止响应。如下图所示:
弹出如上对话框有两种原因:一种是模板中包含大量公式,另一种是模板中有大量用于填报的控件。
1)将所有公式在编辑界面打开,取消默认勾选的「填报/分析时,保留公式用于计算」,如下图所示:
2)将需要填报的数据单独查询出来,这些数据绑定控件进行填报,其他数据不绑定控件,直接在单元格中展示,这样可以大大减少控件的数量,如下图所示:
将填报模板分为两部分:「填报部分」和「展示部分」,这两部分的结构都是一样的。
填报部分:设置控件,并通过参数过滤出需要修改的那条记录
展示部分:没有控件,不用过滤,显示出全部记录
参数部分:隐藏查询按钮,在下拉框中添加「编辑后事件」,实现自动查询,详细介绍参见文档:JS 实现无需点击查询按钮即可自动查询
3)减少控件的另一种方法,如下图示例,数据全部展示出来,在产品编号上添加超链,需要修改该记录时,点击超链接到另外一张模板单独进行填报修改。
微软官方针对该问题提供了修复包,下载后直接安装即可,点击下载修复包:jb51-MicrosoftFixit50403.rar
填报中使用了 now() 和 UUID() 等公式,提交后入库的数据跟前端显示的数据不同。
填报时使用了层次坐标 ,提交后入库的数据跟前端显示的数据不同。
now() 和 UUID() 等公式提交时都会重新计算一遍,因而入库后数据会改变。
填报二次计算时不支持层次坐标。
新增模板参数 p ,参数值为公式 now(),设计模板时单元格添加公式 $p,报表填报属性设置提交时列对应的值设置为参数 $p,即可完美的解决该问题,UUID 同理。
对于包含层次坐标的复杂嵌套公式,需要在公式编辑界面将「填报/分析时,保留公式用于计算」取消勾选,避免二次计算。
使用阿里云的 hologres 产品(类似数据库),可正常查询数据,但是填报使用「内置SQL」提交类型时,点击「提交」会弹出一个报错,如下图所示:
hologres 产品本身不支持事务中执行 insert 语句。
填报提交的时候使用「自定义提交」方式,通过写代码的方式执行 insert 语句。
使用 Clickhouse 数据库进行填报时,点击「提交」会弹出一个报错,如下图所示:
Clickhouse 数据库本身不支持 UPDATE 和 DELETE 操作。
设置「报表填报属性」时,提交类型选择「插入提交」。
「填报前」和「填报后」事件是前端事件,仅在前端请求的时候发生在填报前或填报后,后端执行顺序不能保证。即前端请求之后不必等待返回就继续执行填报提交了,加上网络影响,就有可能出现「填报前」事件在后端发生于填报提交之后,或「填报后」事件在后端发生于填报提交之前。
例如:填报时在「模板 Web 属性>填报页面设置」添加「填报前」事件,设置填报前删除提交,即填报预览时点击「提交」按钮后,应先删除原数据再进行提交。但偶尔会出现显示提交成功,而数据没有入库,需再次点击「提交」才成功入库的情况。
文 檔回 饋
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉