Читать таблицу из системы SAP с использованием Java - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь прочитать таблицу из системы 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 , но сотрудник - это поле в моей таблице.

enter image description here

Документация не слишком помогает, она только говорит:

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 ).

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

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Вы пытаетесь вызвать функцию RFC_READ_TABLE, и вы пытаетесь передать значение ее параметру с именем «EMPLOYEE». Это НЕ параметр RFC_READ_TABLE, следовательно, ошибка.

RFC_READ_TABLE имеет 3 важных входных параметра:

  • QUERY_TABLE: имя таблицы базы данных, которую вы хотите запросить
  • ОПЦИИ: предложение WHERE (вы можете передать пустое значение)
  • FIELDS: список столбцов из таблицы базы данных, которую вы хотите запросить

RFC_READ_TABLE имеет 1 возвращаемый параметр:

  • ДАННЫЕ: содержимое таблицы

См. Этот пример: https://vishalmasih.wordpress.com/2014/10/31/sap-jco-searching-for-a-user-in-the-usr04-table/

0 голосов
/ 20 мая 2019

это работает на тебя сейчас? Я попробовал ваш код, и я получил ту же ошибку. Я до сих пор не понимаю, где именно я должен поставить имя таблицы и где имя поля. Я добавил код от Dirk Trilsbeek, и больше не вижу ошибок, но все, что я получил, это:

| ---------------------------------------------- -------------------------- | | ТАБЛИЦА 'RFC_DB_OPT' | ------------------------------------------------- ----------------------- | | ТЕКСТ | | ------------------------------------------------- ----------------------- | | 012345678901234567890123456789012345678901234567890123456789012345678901 | | ------------------------------------------------- ----------------------- |

| ---------------------------------------------- -------------------------- |

Что мне с этим делать? Откуда это / почему это идет?

0 голосов
/ 06 сентября 2018

Общее использование 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

...