JAVA调用SAP处理返回数据报错 Incorrectly encoded sign for BCD in record at field

com.sap.conn.jco.JCoField:getName() #44 

com.sap.conn.jco.JCoField:getString() #44

throw:com.sap.conn.jco.ConversionException #5346 [Incorrectly encoded sign for BCD in record  at field ]

最近SAP变更后, java调用sap,报错,

反编译jco代码

com.sap.conn.jco.rt.AbstractRecord


private final String decodeBCD(int index) {
        char[] temp_data = this.recType == 4 ? this.tableDataRows[this.row] : this.data;
        int ioffset = this.metaData.boffset[index];
        int idecimals = this.metaData.decimals[index];
        int ilength = this.metaData.length[0][index] * 2 - 1;
        int lradix = ilength - idecimals;
        StringBuilder buf = new StringBuilder(ilength + 2);
        int i = 0;
        int nibbleValue = 0;
        int signNibble = temp_data[ioffset + (ilength >> 2)] >> (3 - (ilength & 3) << 2) & 15;
        if (signNibble != 12 && signNibble != 13) {
            throw new ConversionException("Incorrectly encoded sign for BCD in record " + this.metaData.recName + " at field " + this.metaData.name[index]);
        } else {
            while(i < ilength && (nibbleValue = temp_data[ioffset + (i >> 2)] >> (3 - (i & 3) << 2) & 15) == 0) {
                ++i;
            }

            if (nibbleValue != 0 && signNibble == 13) {
                buf.append('-');
            }

            if (i >= lradix) {
                buf.append('0');
            } else {
                while(i < lradix) {
                    nibbleValue = temp_data[ioffset + (i >> 2)] >> (3 - (i & 3) << 2) & 15;
                    buf.append((char)(48 + nibbleValue));
                    ++i;
                }
            }

            if (idecimals <= 0) {
                return buf.toString();
            } else {
                buf.append('.');

                for(i = lradix; i < ilength; ++i) {
                    nibbleValue = temp_data[ioffset + (i >> 2)] >> (3 - (i & 3) << 2) & 15;
                    buf.append((char)(48 + nibbleValue));
                }

                return buf.toString();
            }
        }
    }


异常位置:
int signNibble = temp_data[ioffset + (ilength >> 2)] >> (3 - (ilength & 3) << 2) & 15;
if (signNibble != 12 && signNibble != 13) {
    throw new ConversionException("Incorrectly encoded sign for BCD in record " + this.metaData.recName + " at field " + this.metaData.name[index]);
}

一头雾水,

查询资料比较少,  有提到是SAP 缓存造成 , 建议重启sap 相关服务。

网上搜了 清理缓存的方式 ,可以考虑调用:

destination.getRepository().clear();

这里采用重启的方式,sap 调用正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值