Универсальный функциональный модуль для извлечения данных таблицы SAP

Каков наилучший способ доступа к табличным данным из системы SAP?

Я попробовал это с RFC_READ_TABLE, но этот RFC возвращает данные в конкатенированной форме в одном столбце и имеет ограничение по размеру для данных строки.

Есть ли лучший способ доступа к данным SAP в общей форме без создания в системе пользовательских RFC?

Я ищу стандартное решение RFC, а не собственный скрипт.


person Timo Westkämper    schedule 16.09.2011    source источник


Ответы (3)


Если я правильно понимаю ваш вопрос, вы хотите прочитать таблицу, но во время программирования вы не знаете, какую таблицу. С помощью Select * from (tablename)вы можете читать с динамическим именем таблицы. Целевое поле может быть определено динамически с помощью create data.

Пример (непроверенный, в настоящее время у меня нет доступа к SAP-системе):

  DATA: lv_tablename TYPE string,
        ev_filelength TYPE i.

  lv_tablename = 'mara'. "e.g. a parameter

  DATA dref TYPE REF TO data.
  CREATE DATA dref TYPE TABLE OF (lv_tablename).

  FIELD-SYMBOLS: <wa> TYPE ANY TABLE.
  ASSIGN dref->* to <wa>.
  SELECT * FROM (lv_tablename) INTO TABLE <wa>. "Attention for test, may be large result
  "<wa> is like a variable with type table mara
person knut    schedule 16.09.2011
comment
Спасибо за пример. Но это заказной скрипт. Существуют ли другие стандартные RFC для этой задачи? - person Timo Westkämper; 16.09.2011
comment
Я думал, что вы внутри SAP-системы, но вы снаружи и вам нужен RFC. Ad hoc У меня нет другой идеи, чем RFC_READ_TABLE - извините. - person knut; 16.09.2011
comment
Да, к сожалению, RFC_READ_TABLE — единственный вариант. Даже если бы у него было более щедрое ограничение длины строки, базовый подход — единственный способ сделать это, поскольку интерфейсы функциональных модулей должны быть определены статически. - person Chris Carruthers; 19.09.2011
comment
Я принимаю этот ответ, потому что, очевидно, нет правильно типизированного подхода. Спасибо. - person Timo Westkämper; 19.09.2011

Попробуйте этот фрагмент RFC_READ_TABLE, чтобы получить данные в структурированной форме:

  DATA: oref       TYPE REF TO cx_root,
        text       TYPE string,
        obj_data   TYPE REF TO data.
        lt_options TYPE TABLE OF rfc_db_opt,
        ls_option  TYPE rfc_db_opt,
        lt_fields  TYPE TABLE OF rfc_db_fld,
        ls_field   TYPE rfc_db_fld,
        lt_entries TYPE STANDARD TABLE OF tab512.

   FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE.

  TRY.

      ls_option-text = `some query`.
      APPEND ls_option TO lt_options.
      ls_field-fieldname = 'PARTNER'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'TYPE'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'BU_GROUP'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'BU_SORT1'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'TITLE'.
      APPEND ls_field TO lt_fields.

      CALL FUNCTION 'RFC_READ_TABLE' DESTINATION dest
        EXPORTING
          query_table = 'BUT000'
        TABLES
          options     = lt_options
          fields      = lt_fields
          data        = lt_entries.

    CATCH cx_root INTO oref.
      text = oref->get_text( ).
      MESSAGE text TYPE 'E'.
  ENDTRY.

  IF lt_entries IS NOT INITIAL.

    CREATE DATA obj_data TYPE TABLE OF but000.
    ASSIGN obj_data->* TO <fs_tab>.

    CREATE DATA obj_data TYPE but000.
    ASSIGN obj_data->* TO FIELD-SYMBOL(<fs_line>).

    LOOP AT lt_entries ASSIGNING FIELD-SYMBOL(<wa_data>).
        LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fs_fld>).
          ASSIGN COMPONENT <fs_fld>-fieldname OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<lv_field>).
          IF <lv_field> IS ASSIGNED AND sy-subrc IS INITIAL.
            <lv_field> = <wa_data>-wa+<fs_fld>-offset(<fs_fld>-length).
          ENDIF.

          APPEND <fs_line> TO <fs_tab>.
        ENDLOOP.
    ENDLOOP.

  ENDIF.

  IF <fs_tab> IS NOT INITIAL.
    "Bingo!
  ENDIF.
person Suncatcher    schedule 28.12.2017

Спасибо за помощь!

Я просто думаю, что это небольшая ошибка, а также рекомендация с моей стороны: Ошибка: APPEND ‹fs_line› К ‹fs_tab›. должно быть после ENDLOOP. Рекомендация: используйте FM BBP_RFC_READ_TABLE вместо RFC_READ_TABLE. В противном случае у вас будут проблемы с десятичными числами.

person Javier Ruiz    schedule 14.07.2020
comment
Добро пожаловать в СО. Ответы, начинающиеся с «Спасибо» без ссылки на конкретный ответ, могут быть восприняты как часть комментария. Поскольку похоже, что ваш ответ приносит что-то новое, я бы порекомендовал вам вместо этого сослаться на ответ, к которому вы пытаетесь добавить, поскольку вы еще не можете комментировать. Кроме того, было бы неплохо, если бы вы могли форматировать некоторые фрагменты кода, используя обратные кавычки. - person Calculuswhiz; 14.07.2020