Чтение таблицы из системы 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).



возможно, кто-то с большим опытом может сказать мне, как я должен настроить этот пример кода для работы.

554   2  

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. Параметр TABLE OPTIONS имеет одно поле 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');

Поле TEXT имеет длину всего 72 символа, так что если вы хотите добавьте более длинное предложение, вы вручную должны разбить свои условия на несколько строк. RFC_READ_TABLE немного грубоват и ограничен.

Сложные соединения между таблицами могут быть достигнуты путем создания представления в системе SAP (transaction 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

    Ничего не найдено.