原创 Tab Zhu [ SAP TAB ](javascript:void\(0\);)
上次发了OO ALV模板( [ 个人OO ALV 模版-加快你的ALV开发
](http://mp.weixin.qq.com/s?__biz=MzUxODI4MTQyMg==&mid=2247484112&idx=1&sn=99eacecf9eca503ac4a7bd935184608c&chksm=f98a0371cefd8a67fbc648a2cbd7fe8c2cf990e7c55f6dadbfe206d47987c0c30f7e538b37c6&scene=21#wechat_redirect)
)后,小伙伴们用的可舒服的,这次整理下tree alv的模板
## 1\. 我们随便来点数据
SELECT * FROM sflight INTO TABLE @gt_sflight UP TO 50 ROWS.## 2\. 创建屏幕
这里我们行列给到最大值200
_255
然后在绘制界面中给一个容器CONTAINER1(长高也是255 _ 200,同时给到
)这样容器就会根据你电脑分表率大小自动调节了 对应创建OK_CODE
## 3\. 添加逻辑流
MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
IF g_alv_tree IS INITIAL.PERFORM init_tree.
CALL METHOD cl_gui_cfw=>flushEXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
ASSERT sy-subrc = 0.
ENDIF.
ENDMODULE.MODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
CALL METHOD g_alv_tree->r_container->free.LEAVE PROGRAM.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE.## 4\. Tree ALV 调用示例
输入以下代码,然后直接点击执行程序,我们可以看到一个ALV tree
*&=====================================================================*
*& Created date: 2022.05.11
*& Created by: Tab-Zhu (微信公众号:Tab_JXZHU)
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT ztab_test_02.
TYPES: BEGIN OF ty_tree_node,id TYPE char18,
text TYPE char40,
END OF ty_tree_node.
DATA: g_alv_tree TYPE REF TO zcl_tab_tree_alv.
DATA: gt_sflight TYPE sflight OCCURS 0, "Output-Tablegt_scala TYPE STANDARD TABLE OF ty_tree_node,
ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm, "OK-Code
g_max TYPE i VALUE 255.
START-OF-SELECTION.
SELECT * FROM sflight INTO TABLE @gt_sflight UP TO 50 ROWS.CHECK sy-subrc EQ 0.
END-OF-SELECTION.CALL SCREEN 9000.MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
IF g_alv_tree IS INITIAL.PERFORM init_tree.
CALL METHOD cl_gui_cfw=>flushEXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
ASSERT sy-subrc = 0.
ENDIF.ENDMODULE. " PBO OUTPUTMODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
CALL METHOD g_alv_tree->r_container->free.LEAVE PROGRAM.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE. " PAI INPUT
FORM init_tree.
CREATE OBJECT g_alv_tree.
DATA(ls_alv_tree_head) = VALUE treev_hhdr( heading = '航班' tooltip = '航班'width = 35 width_pix = space ).
CALL METHOD zcl_tab_tree_alv=>set_default_fieldcatCHANGING
it_data = gt_sflight
RECEIVING
rt_fieldcat = DATA(lt_fieldcat)EXCEPTIONS
error_in_get_fieldcat = 1
OTHERS = 2.
IF sy-subrc <> 0.CLEAR lt_fieldcat[].
ENDIF.
LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fcat>).
DATA(lv_tabix) = sy-tabix.CASE <fs_fcat>-fieldname.
WHEN 'MANDT'.
DELETE lt_fieldcat INDEX lv_tabix.
WHEN 'CARRID'.
<fs_fcat>-outputlen = 10.
WHEN 'CONNID'.
<fs_fcat>-outputlen = 10.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
CALL METHOD g_alv_tree->create_tree_alvEXPORTING
• iv_repid = SY-CPROG
• iv_screen = '9000'
• iv_item_selection = 'X'
• iv_no_html_header = 'X'
iv_hierarchy_header = ls_alv_tree_headiv_container_name = 'CONTAINER1'
• iv_variant_handle = '1'
it_fieldcat = lt_fieldcati_set_tree_node_form = 'FRM_SET_TREE_NODE_FORM'
• i_set_toolbar_form =
• i_function_selected_form =
• i_dropdown_clicked_form =
• i_checkbox_change_form =
• i_link_click_form =
CHANGING
ct_data = gt_sflight
EXCEPTIONS
create_tree_alv_failed = 1OTHERS = 2.
IF sy-subrc <> 0.MESSAGE x208(00) WITH 'Create tree alv failed'.
ENDIF.
ENDFORM.
FORM frm_set_tree_node_formCHANGING cr_alv_tree TYPE REF TO cl_gui_alv_tree
ct_data TYPE STANDARD TABLE.
DATA:lt_data TYPE TABLE OF sflight."inner table structure ex:sflight 以航班表为例子
DATA:ls_output_line TYPE sflight.
DATA:ls_layout_node TYPE lvc_s_layn.
DATA: ls_layout_item TYPE lvc_s_layi,lt_layout_item TYPE lvc_t_layi.
DATA:lv_top_key TYPE lvc_nkey.
DATA:lv_next_key TYPE lvc_nkey.
DATA:lv_node_text TYPE lvc_value.lt_data = ct_data.CHECK lt_data IS NOT INITIAL.
LOOP AT lt_data INTO DATA(ls_data) GROUP BY (
carrid = ls_data-carrid )ASSIGNING FIELD-SYMBOL(<fs_group>).
"HEADER
"层级名称
lv_node_text = 'LEVEL 1'.• "选择框
• CLEAR ls_layout_item.
* ls_layout_item-fieldname = cr_alv_tree->c_hierarchy_column_name."层级名称
* ls_layout_item-class = cl_gui_column_tree=>item_class_checkbox.
* ls_layout_item-editable = 'X'.• APPEND ls_layout_item TO lt_layout_item.
• "设置图标
• CLEAR ls_layout_item.
* ls_layout_item-fieldname = 'STATUS'."对于某个字段设置为图标
* ls_layout_item-t_image = '@09@'."yellow• APPEND ls_layout_item TO lt_layout_item.
CLEAR ls_output_line.
MOVE-CORRESPONDING <fs_group> TO ls_output_line.
CALL METHOD cr_alv_tree->add_nodeEXPORTING
i_relat_node_key = ''
i_relationship = cl_gui_column_tree=>relat_last_child "how to insert the node
i_node_text = lv_node_text "hierarchy node text
* is_node_layout = ls_layout_node "node layout
is_outtab_line = ls_output_line "attributes of the inserted node
* it_item_layout = lt_layout_item "item layoutIMPORTING
e_new_node_key = lv_top_key.LOOP AT GROUP <fs_group> ASSIGNING FIELD-SYMBOL(<fs_line>)."item
CLEAR ls_output_line.
MOVE-CORRESPONDING <fs_line> TO ls_output_line.
lv_node_text = 'LEVEL 2'.
CALL METHOD cr_alv_tree->add_nodeEXPORTING
i_relat_node_key = lv_top_key "Top keyi_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = lv_node_text
is_outtab_line = ls_output_line
* is_node_layout = ls_layout_node
* it_item_layout = lt_layout_itemIMPORTING
e_new_node_key = lv_next_key.
ENDLOOP.
ENDLOOP.
ENDFORM.## 5\. 模板代码
下面介绍ZCL_TAB_TREE_ALV代码- 复制可用 小伙伴们可以直接SE24,创建一个类,然后点击基于源代码创建,然后COPY代码即可
*&=====================================================================*
*& Created date: 2022.05.11
*& Created by: Tab-Zhu (微信公众号:Tab_JXZHU)
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*CLASS zcl_tab_tree_alv DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
DATA r_container TYPE REF TO cl_gui_custom_container .
DATA r_alv_tree TYPE REF TO cl_gui_alv_tree .
DATA r_toolbar TYPE REF TO cl_gui_toolbar.
DATA r_line_behaviour TYPE REF TO cl_dragdrop .
DATA r_fav_behaviour TYPE REF TO cl_dragdrop .
...