Общее использование RFC_READ_TABLE
Я никогда не использовал JCo, но, насколько мне известно, его интерфейс очень похож на NCo, разъем .Net. Это в основном код NCo с добавлением некоторых догадок, но он должен работать.
// 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 символа, которое может принимать только предложения *1010*, соответствующие 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 (транзакция 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