Как исправить «JCO_ERROR_CONVERSION: невозможно преобразовать значение из типа java.lang.String в STRUCTURE»

Одна из функций, которые мы внедрили в SAP, работает некорректно. В SAP все функции работают правильно и возвращают правильные значения, однако при вызове в Java JCo Клиенту нужна структура, а не String или int. При извлечении структуры из параметра она дает структуру, которая имеет два безымянных столбца, каждый из которых не имеет длины байтов для заполнения.

Metadata:
{[],[]}
0,0

Мы пробовали разные типы данных в SAP для входного параметра «I_REZEPT», например int8 и char12.

private String sollwerte(JSONObject jsonin) throws JSONException, JCoException {
String id = String.valueOf(jsonin.getInt("rezeptid"));
JCoStructure in = input.getStructure("I_REZEPT");
System.out.println("Fieldcount:"+in.getFieldCount());
input.setValue("I_REZEPT", id);
e.printStackTrace();
function.execute(destination);
...

Stacktrace: com.sap.conn.jco.ConversionException: (122) JCO_ERROR_CONVERSION: невозможно преобразовать значение «1» из типа java.lang.String в STRUCTURE в поле I_REZEPT в com.sap.conn.jco.rt.AbstractRecord. createConversionException(AbstractRecord.java:436) в com.sap.conn.jco.rt.AbstractRecord.createConversionException(AbstractRecord.java:430) в com.sap.conn.jco.rt.AbstractRecord.setValue(AbstractRecord.java:2824) на com.sap.conn.jco.rt.AbstractRecord.setValue(AbstractRecord.java:3933) на edu.hsalbsig.intellifarm.connector.sap.IntellifarmSapFunction.sollwerte(IntellifarmSapFunction.java:226) на edu.hsalbsig.intellifarm.connector .sap.IntellifarmSapFunction.execute(IntellifarmSapFunction.java:61) в edu.hsalbsig.intellifarm.connector.mqtt.IntellifarmMqttClient.messageArrived(IntellifarmMqttClient.java:98) в org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage (CommsCallback.java:513) на org.eclipse.paho.client.mqttv3.internal.CommsCallba ck.handleMessage(CommsCallback.java:416) в org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:213) в java.base/java.lang.Thread.run(Thread.java: 834)


При отладке функция из SAP выглядит так

Input:
|--------|
| PARAMETERS 'INPUT'
|--------|
|I_REZEPT|
|--------|
|        |
|--------|
|I_REZEPT|
|--------|

ожидалось что-то вроде этого

Input:
|------------------|
| PARAMETERS 'INPUT'
|------------------|
|I_REZEPT          |
|------------------|
|012345678901234567|
|------------------|
|                  |
|------------------|

person Kanvas    schedule 05.06.2019    source источник
comment
Привет! Добро пожаловать в Stack Overflow! Вы уже прошли тур? Кроме того, убедитесь, что вы прочитали Как создать минимальный, полный и проверяемый пример и Как задать хороший вопрос?, чтобы улучшить свой вопрос. Прямо сейчас не очень понятно, чего вы пытаетесь достичь и в чем заключается ваш вопрос.   -  person Soutzikevich    schedule 06.06.2019


Ответы (1)


Не зная определения интерфейса вашей функции со стороны ABAP, здесь трудно помочь. Но если input.getStructure("I_REZEPT"); работает, этот параметр импорта I_REZEPT кажется структурным. Поэтому вы не можете вызвать input.setValue("I_REZEPT", (String)id);, пытаясь установить для него строку, и это то, что показывает исключение. I_REZEPT является параметром IMPORT и имеет тип STRUCTURE, а не параметр типа STRING или CHAR. Он содержит различные другие поля - по крайней мере, одно.

Вместо этого, я думаю, вы можете вызвать in.setValue(0, id); для установки первого поля этой структуры или in.setValue("FIELDNAME", id); с использованием правильного имени поля в структуре.

person Trixx    schedule 06.06.2019
comment
Спасибо за быстрый ответ. Я забыл упомянуть, что я уже пытался извлечь структуру. В результате получилась структура с двумя незаполняемыми столбцами без имен. Наполнение структуры оказалось для меня бесполезным. Из того, что я вижу на панели инструментов SAP, тип переменной импорта был объявлен как CHAR12. - person Kanvas; 07.06.2019
comment
Структура содержит 1 или более полей, где каждое поле также может быть другой (вложенной) структурой или даже таблицей. Вы можете просмотреть и просмотреть структуру с транзакцией SE37 и двойным щелчком элементов в графическом интерфейсе SAP. Также обратите внимание на различия между input и in в моем предыдущем ответе. - person Trixx; 07.06.2019
comment
И если вы хотите поиграть со структурами и метаданными в Java, взгляните также на методы toXML(), getListMetaData() и getRecordMetaData(). - person Trixx; 07.06.2019