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 调用正常