如何通过 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_XREF
和 S_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。加入来自TNODEIMGR
、TNODEIMG
和TNODEIMGT
table的父节点、节点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 节点。
我想通过代码 (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_XREF
和 S_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。加入来自TNODEIMGR
、TNODEIMG
和TNODEIMGT
table的父节点、节点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 节点。