Чтение таблицы из системы SAP с помощью Java
Я пытаюсь прочитать таблицу из системы SAP, и я всегда получаю эту ошибку:
Exception in thread "main" com.sap.conn.jco.JCoRuntimeException: (127)
JCO_ERROR_FIELD_NOT_FOUND: Field EMPLOYEE is not a member of INPUT
at com.sap.conn.jco.rt.AbstractMetaData.indexOf(AbstractMetaData.java:404)
at com.sap.conn.jco.rt.AbstractRecord.setValue(AbstractRecord.java:4074)
at testConf.StepServer.main(StepServer.java:50)
И вот мой код:
public static void main(String[] args) {
// This will create a file called mySAPSystem.jcoDestination
System.out.println("executing");
String DESTINATION_NAME1 = "mySAPSystem";
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.x.xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "username");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "test");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");
createDestinationDataFile(DESTINATION_NAME1, connectProperties);
// This will use that destination file to connect to SAP
try {
JCoDestination destination = JCoDestinationManager.getDestination("mySAPSystem");
System.out.println("Attributes:");
System.out.println(destination.getAttributes());
System.out.println();
destination.ping();
} catch (JCoException e) {
e.printStackTrace();
}
try{
//here starts the problem
JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME1);
JCoFunction function = destination.getRepository().getFunction("RFC_READ_TABLE");
JCoParameterList listParam = function.getImportParameterList();
listParam.setValue("EMPLOYEE", "EMPLOYEE"); // I have found this in an example and I don't understand exactly what should I put there
// I was thinking maybe is the column name but I am not sure
function.execute(destination);
JCoTable table = function.getTableParameterList().getTable("ZEMPLOYEES");//name of my table from SAP
System.out.println(table);
}
catch (JCoException e)
{
System.out.println(e.toString());
return;
}
}
Ошибка понятна, когда она говорит JCO_ERROR_FIELD_NOT_FOUND: поле EMPLOYEE не является членом INPUT, но employee-это поле в моей таблице.
Документация не слишком помогает, она только говорит:
Sets the object as the value for the named field.
Parameters:
value - the value to set for the field
name - the name of the field to set
Ведьму, по-моему, я уже сделал.
Должен ли я сделать какие-либо дополнительные модификация в sap, чтобы прочитать эту новую таблицу из java? Все, что я сделал, - это создал новую таблицу, следуя этому руководству (создайте простую таблицу в SAP).
возможно, кто-то с большим опытом может сказать мне, как я должен настроить этот пример кода для работы.
2 ответов:
Общее использование RFC_READ_TABLE
Я никогда не использовал JCo, но, насколько мне известно, его интерфейс очень похож на NCo, .NET connector. Это в основном код НКО с некоторыми догадками, но он должен работать.
// get the table parameter FIELDS that should be in the parameter list // the parameter table has several fields, only the field FIELDNAME has to be set before calling the function module JCOTable inputTableParam = function.getTableParameterList().getTable("FIELDS"); // add a row to the FIELDS table parameter inputTableParam.appendRow(); // set values for the new row inputTableParam.setValue("FIELDNAME", "EMPLOYEE"); // just for fun, add another field to retrieve inputTableParam.appendRow(); inputTableParam.setValue("FIELDNAME", "SURNAME"); // now we have to set the non-table parameters JCoParameterList inputParamList = function.getImportParameterList(); // parameter QUERY_TABLE, defines which table to query inputParamList.setValue("QUERY_TABLE", "ZEMPLOYEES"); // parameter DELIMITER - we get a single string as the return value, the field values within that string are delimited by this character inputParamList.setValue("DELIMITER", ";"); // execute the function function.execute(destination); // the parameter table DATA contains the rows JCoTable table = function.getTableParameterList().getTable("DATA");В конце концов, ваша переменная
tableбудет содержать объект таблицы с одним полем под названиемWA. Это поле содержит содержимое полей, выбранных в таблице входных параметровFIELDS. Вы можете перебратьtableи получить строку значений по ряд.Запросы с RFC_READ_TABLE
RFC_READ_TABLEна самом деле он не разрешает запросы, а только позволяет определять предложенияWHERE. ПараметрTABLEOPTIONSимеет одно полеTEXTшириной 72 символа, которое может принимать толькоABAPсовместимыеWHEREпредложения.Чтобы расширить приведенный выше пример, мы добавим предложение where только для выбора записей из таблицы
ZEMPLOYEESСSURNAME= "SMITH" иFORNAME= "JOHN".JCOTable optionsTableParam = function.getTableParameterList().getTable("OPTIONS"); // add a row to the FIELDS table parameter optionsTableParam.appendRow(); optionsTableParam.setValue("TEXT", "SURNAME EQ 'SMITH' AND FORNAME EQ 'JOHN');Поле
Сложные соединения между таблицами могут быть достигнуты путем создания представления в системе SAP (transactionTEXTимеет длину всего 72 символа, так что если вы хотите добавьте более длинное предложение, вы вручную должны разбить свои условия на несколько строк.RFC_READ_TABLEнемного грубоват и ограничен.SE11) и последующего запроса этого представления с помощью RFC_READ_TABLE.Если вы хотите вызвать функциональные модули из JCo, было бы очень полезно ознакомиться с основными свойствами функциональных модулей. Вы можете посмотреть определение функционального модуля в транзакция
SE37. Там вы можете увидетьIMPORT,EXPORT,CHANGINGиTABLEпараметры. Параметры, которые вы должны заполнить, и параметры, которые содержат результаты, зависят от модуля функции, который вы вызываете -RFC_READ_TABLEимеет отличия от, скажем,BAPI_DELIVERY_GETLIST.Вот документация для JCoFunction и одно из отличий между JCo и NCo, JCo имеет отдельные функции для получения и установки различных типов параметров: https://help.hana.ondemand.com/javadoc/com/sap/conn/jco/JCoFunction.html
Вы пытаетесь вызвать функцию RFC_READ_TABLE и пытаетесь передать значение ее параметру с именем "EMPLOYEE". Это не параметр RFC_READ_TABLE, отсюда и ошибка.
RFC_READ_TABLE имеет 3 важных входных параметра:
- QUERY_TABLE: имя таблицы базы данных, которую вы хотите запросить
- опции: предложение WHERE (вы можете передать пустое значение)
- поля: список столбцов из таблицы базы данных, которую вы хотите создать. запрос
RFC_READ_TABLE имеет 1 возвращаемый параметр:
- данные: содержание таблицы
Смотрите этот пример : https://vishalmasih.wordpress.com/2014/10/31/sap-jco-searching-for-a-user-in-the-usr04-table/

Comments