集算器结果不显示值导致关联失败,数据库查询有值可以关联成功
集算器的计算结果中,有些字段不显示(比如下图 1 的第一个字段 CFC01CUSTI),后续使用该字段进行关联的时候,导致关联失败 (b 为空,图 2)。同样的 sql 语句,使用数据库查询是显示所有字段的,关联后有五条字段,图 3。
"集算器的计算结果中,有些字段不显示(比如下图 1 的第一个字段 CFC01CUSTI),后续使用该字段进行关联的时候,导致关联失败 (b 为空,图 2)。同样的 sql 语句,使用数据库查询是 .."
集算器的计算结果中,有些字段不显示(比如下图 1 的第一个字段 CFC01CUSTI),后续使用该字段进行关联的时候,导致关联失败 (b 为空,图 2)。同样的 sql 语句,使用数据库查询是显示所有字段的,关联后有五条字段,图 3。
请把 A3 格的 query 表达式贴一下
发现这些不显示的字段,都是 char 类型的,使用 DBeaver 查询同样报错:Internal Driver error CCSID13124。用的数据库驱动是 com.ibm.as400.access.AS400JDBCDriver
不显示是什么意思?字段存在就总会有个值,看看是不是 null。
然后再换个简单的 SQL 检查,是不是这些字段总是读出成 null?
如果 JDBC 读不出数,SPL 在外面也无计可施。
Internal Driver error CCSID13124 应该是遇到字符集问题(ccsid 字符集编码)
这个错误应该是编码转换问题,字符串的编码与默认设置不匹配,可以尝试在数据源的 url 里添加参数,比如 jdbc:as400://system-name;ccsid=13124;
集算器单独查询,简单 sql,结果显示三条记录,但是就是显示为空。
数据源连接中添加了,jdbc:as400://app03.corebank.bj.bob.test;ccsid=13124 可以连接成功,但是输出的结果还是不显示,老师还有其他办法吗?
sql 语句中已经加了限定条件,结果出来三条记录数也正确,但是看着为空,然后判断不显示的值是不是空或者 string,F2.select(null(PRD2COD) || ifstring(PRD2COD)), 没晒选出来,见图 2
图 2
null 会显示成红色的 (null),看不见的不是 null,通常只能是空串,但这时候会把 ifstring 判断出来(前半截 null(…) 不对,但也不碍事,判断是不是 null 直接用 ==),如果选不出来,说明也不是串。
可能被 JDBC 返回成某种不能解析的对象了,看看这个 JDBC 还有什么可调的配置参数。
有没有内容,可以用 PRD2COD==null 判断是否为空, 如果不为空可以用 len(PRD2COD) 看其长度是不是 0
如果长度不为 0,但界面看不到,你可以把内容直接拷贝到文本编辑器如 UltraEdit 中进行二进制查看(ctrl+h 进入二进制查看状态)
如何复制:在右边面板中点击选中的格,然后在上面工具点击复制数据按钮
如果有数据但不是你期望的数据,那说明从数据库端到集算器端传输过程中出现了错误,这个错误是 jdbc 造成的,可能是配置(如字符集配置)不正确,也可能是 jdbc 驱动和数据库不匹配
那字符集配置不对时为什么会出现错误呢?因为从数据库里读出到集算器要进行 1 次或多次字符集转换,譬如数据库存储到硬盘时是用 utf-8,读出在内存中用 gbk,而集算器端则是 java 内存中固定使用的 utf-16be,具体细节依赖于数据库和 jdbc,以及各种字符集的配置
我在网上找了一圈文档,没找到,建议你找 ibm 的技术人员进行咨询,你问他们为什么在 DBeaver 中查询会报字符集错
使用 DBeaver 查询同样报错:Internal Driver error CCSID13124
这个是怎么报错的,是弹出一个窗口?有没有异常堆栈,有的话可以贴上来
这种显示应该是空串。如果是不认识的 java 对象的话,会显示成那个对象的 toString(),除非那个对象 toString() 也是个空串。
使用 len 发现长度不是 0,两个字段的 len 分别是 5 和 13,但是粘贴出来后,内网环境没有二进制查看的工具,也没法下载,用记事本,打开所有文件的效果不是乱码
“jdbc:as400://system-name;ccsid=13124”
这个连接字符串中的 ccsid=13124 网上说是 Traditional Chinese 不支持。
ccsid 还能设置成其它值吗?
比如:ccsid=935 1208 1380 1381 1383 1385 1386 中的任何一个试试
或者能不能再加一个参数 charset=utf-8
各种猜,错了见谅🙏
修改了 db.query()函数的处理,如果 JDBC 返回 SPL 无法识别的数据类型,会抛出异常中止;可以添加选项,执行 db.query@r(),跳过抛出异常,此时会将异常信息记录入日志。需要更新最新的 esporc-bin 包实现
在 SPL 里用 len 算它,如果不是个正常的串,应该会报错。它在 SQL 里的正常的,用 length 看不出来的。应该是 JDBC 传输过程中出的乱子。