2017-08-01 62 views
5

我想通過代碼(abap)讀取SAP中IMG活動的自定義路徑。我有來自e071K的IMG-Activity,它存儲傳輸作業​​中的對象。現在我找到了表SPRO的樹結構存儲的表TNODEIMG。這是完美的,因爲它擁有我需要的東西。但是我找不到與IMG-Activity的連接。 TNODEIMG中的Unique-Id採用其他格式,似乎是不同的Id。有人知道我怎麼能讀出來?如何通過IMG活動找到自定義路徑

更新:

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

在此先感謝您。

+0

您知道一個活動可以(並且非常頻繁地!)出現在多個樹結構中,並且直接或通過在同一棵樹中多次包含? – vwegert

+0

@vwegert感謝您提供這些信息,我不知道這一點。但我的問題仍然是一樣的。如何在TNODESIMG表中找到IMG活動。這是如何鏈接的?我也可以閱讀多個樹的路徑,那不是問題。 – Sebi

+0

你需要什麼 - 你正試圖解決的實際問題是什麼?如果您只是在搜索節點,那麼該活動的現有Where-Used功能可能就足夠了......? – vwegert

回答

1

IMG活動使用相當難處理的交易S_CUS_IMG_ACTIVITY來維護。該事務供給何處使用功能:

where-used index

跟蹤該功能導致通過功能模塊S_CUS_IMG_ACTIVITY_XREFS_CUS_IMG_ENTRY_VIA_ACTIVITY到名爲STREE_GET_NODES_FOR_GIVEN_REF的功能模塊,其識別所述節點(用於製備,檢查它的調用者)。讀取這些功能模塊將爲您提供大量關於要使用的結構和功能模塊的信息。

爲您的目的,STREE_GET_NODES_FOR_GIVEN_REF可能會有趣。在參考文獻列表中,將活動標識指定爲NODE_ID,類型爲COBJ。這會給你一個節點列表,其中包括它們的父ID,然後你可以將其饋送到STREE_GET_PARENTS_OF_NODE(結構ID是來自結果集的樹ID)。要獲取節點文本,您可以使用STREE_NODE_READ

+0

你可以看看我的更新嗎?你的回答非常有幫助,但我很努力...... – Sebi

+0

1.結構ID是樹ID,而不是節點ID。 2.您需要將想要獲取其父節點的節點傳遞給參數CHECK_NODES。 – vwegert

0

這是另一種查找基於表格的IMG路徑的方法。

e071k我們有技術 IMG活動的ID。 >其他信息 - - > Display鍵 - 您還可以通過其他方式使他們在SPRO> IMG活動,所以他們會表現出這樣的:

enter image description here

TNODEIMG表,我們有GUID標識,這與技術上的不一樣。你可以用它來鏈接它們的關係表是TNODEIMGR,它包含每個節點的GUID和技術ID。加入父節點,節點ID和節點文本從TNODEIMGRTNODEIMGTNODEIMGT表,我們可以建立完整的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節點不使用這種方法進行訪問。

+0

我寧願使用現有的基礎結構,而不是直接訪問表。 – vwegert

相關問題