Как найти путь настройки через IMG-Activity

Я хочу прочитать путь настройки IMG-Activity в SAP через код (abap). У меня есть IMG-Activity от e071K, которая хранит объекты в задании транспорта. Теперь я нашел таблицу TNODEIMG, где хранится древовидная структура SPRO. Это идеально, потому что в нем есть то, что мне нужно. Но я не могу найти связь с моей IMG-Activity. Уникальный идентификатор в TNODEIMG имеет другой формат и, похоже, является другим идентификатором. У кого-то есть идея, как я могу это прочитать?

ОБНОВИТЬ:

@vwegert: Спасибо за полезный ответ. Пока я получаю этот список, заполненный Node-Id: lt_eref_list, но не получаю родителей. Видите ли вы здесь недопонимание или неудачу?

DATA: lt_iref_list TYPE STANDARD TABLE OF hier_ref,
          lt_eref_list TYPE STANDARD TABLE OF hier_ref,
          ls_ref TYPE hier_ref,
          lt_parent_list TYPE STANDARD TABLE OF hier_iface,
          lt_check_list TYPE STANDARD TABLE OF hier_iface.

    ls_ref-node_id = 'SIMG_CFMENUOLQSOQ46'.
    APPEND ls_ref TO lt_iref_list.

    CALL FUNCTION 'STREE_GET_NODES_FOR_GIVEN_REF'
      TABLES
        i_list_of_references = lt_iref_list
        e_list_of_references = lt_eref_list.

    LOOP AT lt_eref_list ASSIGNING FIELD-SYMBOL(<ls_ref>).

      CALL FUNCTION 'STREE_GET_PARENTS_OF_NODE'
        EXPORTING
          structure_id = <ls_ref>-node_id
*     IMPORTING
*         message      = ls_message
        TABLES
          check_nodes  = lt_check_list
          parent_nodes = lt_parent_list.

    ENDLOOP.

Заранее спасибо.


person Sebi    schedule 01.08.2017    source источник
comment
Вы знаете о том, что активность может (и очень часто!) появляться в нескольких древовидных структурах, причем либо напрямую, либо через включение даже несколько раз в одном дереве?   -  person vwegert    schedule 01.08.2017
comment
@vwegert спасибо за эту информацию, я не знал об этом. Но моя проблема все та же. Как найти IMG-активность в таблице TNODESIMG. Как это связано? Я также могу прочитать несколько путей дерева, это не проблема.   -  person Sebi    schedule 02.08.2017
comment
Для чего вам это нужно - какую реальную проблему вы пытаетесь решить? Если вы просто ищете узлы, существующей функции «Где используется» действия может быть достаточно...?   -  person vwegert    schedule 02.08.2017
comment
@vwegert Я разрабатываю отчет, который создает документацию о транспортных заданиях. Если задание является заданием по настройке, я должен распечатать все дерево/деревья, как они показаны в SPRO. Я ничего не знаю о функции «Где используется», можете ли вы объяснить это? Заранее спасибо.   -  person Sebi    schedule 03.08.2017


Ответы (2)


Действия IMG поддерживаются с помощью довольно громоздкой транзакции S_CUS_IMG_ACTIVITY. Эта транзакция предоставляет функцию использования:

индекс использования

Отслеживание этой функции ведет через функциональные модули S_CUS_IMG_ACTIVITY_XREF и S_CUS_IMG_ENTRY_VIA_ACTIVITY к функциональному модулю с именем STREE_GET_NODES_FOR_GIVEN_REF, который идентифицирует узлы (для подготовки проверьте его вызывающую сторону). Чтение этих функциональных модулей дает вам много информации о структурах и функциональных модулях, которые будут использоваться.

Для ваших целей STREE_GET_NODES_FOR_GIVEN_REF может быть интересным. В списке ссылок укажите идентификатор активности как NODE_ID с типом COBJ. Это даст вам список узлов, включая их родительские идентификаторы, которые вы затем можете передать в STREE_GET_PARENTS_OF_NODE (идентификатор структуры — это идентификатор дерева из набора результатов). Чтобы получить текст узла, вы должны использовать STREE_NODE_READ.

person vwegert    schedule 03.08.2017
comment
не могли бы вы взглянуть на мое обновление? Ваш ответ очень полезен, но я борюсь... - person Sebi; 04.08.2017
comment
1. Идентификатор структуры — это идентификатор дерева, а не идентификатор узла. 2. Вам нужно передать узлы, для которых вы хотите получить родителей, в параметр CHECK_NODES. - person vwegert; 04.08.2017

Вот еще один подход к поиску пути IMG, основанный на таблице.

В e071k у нас есть технические идентификаторы действий IMG. Вы также можете включить их в SPRO через «Дополнительная информация» -> «Дополнительная информация» -> «Ключ отображения» -> «Активность IMG», поэтому они будут отображаться следующим образом:

введите здесь описание изображения

Но в таблице TNODEIMG у нас есть идентификаторы GUID, которые не совпадают с техническими. Таблица отношений, которую вы можете использовать для их связи, — это TNODEIMGR, она содержит как GUID, так и технический идентификатор каждого узла. Соединяя родительский узел, идентификатор узла и текст узла из таблиц TNODEIMGR, TNODEIMG и TNODEIMGT, мы можем построить полный путь IMG для каждого узла:

REPORT z_img.

DATA: lv_final_path TYPE string,
      exit_root     TYPE abap_bool,
      out           TYPE string.

* picking random activity from requests
SELECT SINGLE *
  FROM e071k
  INTO @DATA(lv_e071k).

* finding correspondent GUID ID for tech ID
SELECT gr~node_id, ach~text, img~parent_id
  FROM tnodeimgr AS gr
  JOIN cus_imgact AS ach
    ON ach~activity = gr~ref_object
  JOIN tnodeimg AS img
    ON img~node_id = gr~node_id
   AND spras = @sy-langu
  INTO TABLE @DATA(lt_node)
 WHERE ref_object = @lv_e071k-activity.

LOOP AT lt_node ASSIGNING FIELD-SYMBOL(<fs_tnode>).
  CLEAR: lv_final_path.

* writing bottom node text
  lv_final_path = lv_final_path && <fs_tnode>-text.
  DATA(lv_node_id) = <fs_tnode>-parent_id.

  DO 15 TIMES.
* fetching parent node text
    SELECT SINGLE g~parent_id, text
      INTO @DATA(lv_node)
      FROM tnodeimg AS g
      LEFT JOIN tnodeimgt AS t
        ON t~tree_id = g~tree_id
       AND t~extension = g~extension
       AND t~node_id = g~node_id
       AND t~ext_key = g~ext_key
       AND t~spras = @sy-langu
     WHERE g~node_id = @lv_node_id.

* checking if parent exists
    IF sy-subrc <> 0.
      exit_root = abap_true.
      EXIT.
    ELSE.
      exit_root = abap_false.
    ENDIF.

    lv_final_path = |{ lv_final_path } \n { repeat( val = |\t| occ = sy-index + 1 ) } --> { lv_node-text }|.
    lv_node_id = lv_node-parent_id.

    IF lv_node-parent_id IS INITIAL.
      EXIT.
    ENDIF.

  ENDDO.

  CHECK exit_root = abap_false.
* building the path
  lv_final_path = | IMG  path no. { sy-tabix } is \n\n { lv_final_path } \n\n |.
  out = out && lv_final_path.

ENDLOOP.

cl_demo_output=>display( out ).

Однако при таком подходе самый корневой узел IMG недоступен.

person Suncatcher    schedule 07.08.2017
comment
Я бы предпочел использовать существующую инфраструктуру, чем обращаться к таблицам напрямую. - person vwegert; 10.08.2017