如何通过 IMG-Activity 找到自定义路径

How to find the Customizing Path via IMG-Activity

我想通过代码 (abap) 在 SAP 中读取 IMG-Activity 的自定义路径。我有来自 e071K 的 IMG-Activity,它在传输作业中存储对象。现在我找到了存储 SPRO 树结构的 table TNODEIMG。这是完美的,因为它包含我需要的东西。但是我找不到与我的 IMG-Activity 的连接。 TNODEIMG 中的 Unique-Id 是其他格式,似乎是不同的 Id。有人知道我如何读出这个吗?

更新:

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

提前致谢。

IMG 活动是使用相当笨重的事务 S_CUS_IMG_ACTIVITY 维护的。该交易提供了一个使用函数:

跟踪该函数通过函数模块 S_CUS_IMG_ACTIVITY_XREFS_CUS_IMG_ENTRY_VIA_ACTIVITY 到达名为 STREE_GET_NODES_FOR_GIVEN_REF 的函数模块,该模块标识节点(为了准备,检查其调用者)。阅读这些功能模块可以让您了解很多有关要使用的结构和功能模块的信息。

就您的目的而言,STREE_GET_NODES_FOR_GIVEN_REF 可能很有趣。在引用列表中,将 activity ID 指定为 NODE_ID,类型为 COBJ。这将为您提供一个节点列表,包括它们的父 ID,然后您可以将其提供给 STREE_GET_PARENTS_OF_NODE(结构 ID 是结果集中的树 ID)。要获取节点文本,您可以使用 STREE_NODE_READ.

这是另一种查找 IMG 路径的方法,基于 table。

e071k 中,我们有 IMG 活动的 技术 ID。您也可以在 SPRO 中通过 Additional Information –> Additional Information –> Display Key –> IMG Activity 启用它们,因此它们将显示如下:

但是在 TNODEIMG table 中我们有 GUID ID,这与技术 ID 不同。可用于链接它们的关系 table 是 TNODEIMGR,它包含每个节点的 GUID 和技术 ID。加入来自TNODEIMGRTNODEIMGTNODEIMGTtable的父节点、节点ID和节点文本,我们可以为每个节点构建完整的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 节点。