最近忙里偷闲,研究了下ABAP Tree 相关功能,整理常用实现方法,顺手做了自定义配置表统一管理程序。
先说说常用到的对象及其用途:
1、CL_GUI_SIMPLE_TREE Simple Tree Control
可作为侧边栏来用,单列现实,类似于通用启动界面的菜单。
(本程序调用逻辑见:FRM_INIT_SIMPLE_TREE)
2、CL_GUI_ALV_TREE_SIMPLE Simple ALV Tree
可作为简单的树状ALV展示,类似SPRO功能,也可用于简单报表展示。
(本程序调用逻辑见:FRM_INIT_ALV_TREE_SIMPLE)
3、CL_GUI_ALV_TREE ALV Tree Control
树状ALV展示,支持更多的功能,可改图标等,可参考 MMBE 库存查询报表。
实现基本流程:
1、程序及全局定义
2、屏幕及其容器
3、初始化调用(包含取数逻辑)
先看效果:
TREE 内容根据配置表自动生成,可通过按钮 更新清单 自行配置。
另外,批导自定义表 功能是调用一个通用批导表功能,详细见文章(后补)。
由于本程序专门给 IT内部 使用,故暂时没有设计细分权限管控,可自行参考添加功能。
自定义表清单配置表:
程序屏幕:
(屏幕编号:2000 ,仅需建一个容器控件,命名:CON_TREE 即可)
(状态:2000)
(标题:2000)
程序详细信息如下:
1、主程序:
********************************************************************
* 事务代码: *
* 程序名称:ZIT_CONFIG_TABLES *
* 程序目的:自定义配置表管理平台 *
* 使用变式: *
* 设 计 人: *
* 设计时间:2024.07.15 *
* 程序类型: REPORT *
* 输入文件: *
* 输出文件: *
* 应用类型: *
* 描 述: 自定义配置表管理平台 *
* 日 志 表: *
*(修改日志)--------------------------------------------------------*
* *
* 日志号 修改人 修改时间 修改说明 传输号码 *
* ---- ---- ------ ----------- *
* 001 *
********************************************************************
*设计思路:
*采用结构树形式
*1、cl_gui_simple_tree 适合侧边栏功能 范例:FRM_INIT_SIMPLE_TREE
*2、cl_gui_alv_tree_simple 属于ALV TREE,类似SPRO 范例:FRM_INIT_SIMPLE_TREE
*3、cl_gui_alv_tree 属于ALV TREE,功能更加全面
********************************************************************
REPORT zit_config_tables.
INCLUDE zit_config_tables_top.
INCLUDE zit_config_tables_class.
INCLUDE zit_config_tables_module.
INCLUDE zit_config_tables_form.
START-OF-SELECTION.
PERFORM frm_init_data.
CALL SCREEN 2000.
2、全局定义 - 表、结构、对象等
*&---------------------------------------------------------------------*
*& 包含 ZIT_CONFIG_TABLES_TOP
*&---------------------------------------------------------------------*
CLASS lcl_application DEFINITION DEFERRED.
DATA: g_application TYPE REF TO lcl_application.
DATA: gt_node TYPE TABLE OF mtreesnode.
DATA: g_container TYPE REF TO cl_gui_custom_container,
g_tree TYPE REF TO cl_gui_simple_tree, "Simple Tree Control
g_alv_tree TYPE REF TO cl_gui_alv_tree_simple. "Simple ALV Tree
DATA: node_key TYPE mtreesnode-node_key VALUE 'ROOT'. "定义初始的子屏幕
TYPES: BEGIN OF ty_module,
zmodule TYPE ztcom_config_tab-zmodule,
zmodule_text TYPE string,
END OF ty_module,
BEGIN OF ty_table,
zmodule TYPE ztcom_config_tab-zmodule,
* spe_use TYPE ztcom_config_tab-spe_use,
tabname TYPE ztcom_config_tab-tabname,
ddtext TYPE dd02t-ddtext,
tcode TYPE ztcom_config_tab-tcode,
* programm TYPE ztcom_config_tab-programm,
remark TYPE ztcom_config_tab-remark,
subnode TYPE char30,
END OF ty_table.
DATA: gt_moudle TYPE TABLE OF ty_module,
gs_moudle TYPE ty_module,
gt_table TYPE TABLE OF ty_table,
gs_table TYPE ty_table.
FIELD-SYMBOLS:
<fs_table> TYPE ty_table.
DATA: gt_fieldcat TYPE lvc_t_fcat, "控制输出列
gt_sort TYPE lvc_t_sort. "控制节点
3、类定义 - 类事件响应(分别定义cl_gui_simple_tree,cl_gui_alv_tree_simple 响应事件类)
*&---------------------------------------------------------------------*
*& 包含 ZIT_CONFIG_TABLES_CLASS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_application DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application DEFINITION.
PUBLIC SECTION.
METHODS:
handle_node_double_click
FOR EVENT node_double_click OF cl_gui_simple_tree
IMPORTING node_key.
ENDCLASS. "lcl_application DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_application IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.
METHOD handle_node_double_click.
PERFORM frm_node_double_click USING node_key.
ENDMETHOD. "handle_node_double_click
ENDCLASS. "lcl_application IMPLEMENTATION
"定义事件注册类(使用双击事件)
*----------------------------------------------------------------------*
* INCLUDE BCALV_TREE_EVENT_REC_DRAGDROP *
*----------------------------------------------------------------------*
CLASS cl_tree_event_receiver DEFINITION.
PUBLIC SECTION.
* double click item
METHODS handle_double_click
FOR EVENT node_double_click OF cl_gui_alv_tree_simple
IMPORTING index_outtab grouplevel.
METHODS handle_item_double_click
FOR EVENT item_double_click OF cl_gui_alv_tree_simple
IMPORTING fieldname index_outtab grouplevel.
ENDCLASS. "CL_TREE_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
* CLASS CL_TREE_EVENT_RECEIVER IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS cl_tree_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
PERFORM frm_handle_double_click USING index_outtab grouplevel.
ENDMETHOD. "HANDLE_DOUBLE_CLICK
METHOD handle_item_double_click.
PERFORM frm_handle_double_click USING index_outtab grouplevel.
ENDMETHOD.
ENDCLASS. "CL_TREE_EVENT_RECEIVER IMPLEMENTATION
DATA: tree_event_receiver TYPE REF TO cl_tree_event_receiver.
4、屏幕逻辑流
*&---------------------------------------------------------------------*
*& 包含 ZIT_CONFIG_TABLES_MODULE
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_2000 OUTPUT.
SET PF-STATUS '2000'.
SET TITLEBAR '2000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_2000 INPUT.
DATA: LV_UCOMM TYPE SY-UCOMM.
CLEAR: LV_UCOMM.
LV_UCOMM = SY-UCOMM.
CASE LV_UCOMM.
WHEN '&BACK' OR '&EXIT' OR '&CANCEL'.
LEAVE TO SCREEN 0.
WHEN '&CONFIG'.
PERFORM frm_config_table USING 'ZTCOM_CONFIG_TAB'.
when '&BATCH'.
PERFORM frm_call_ztable.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_2000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_2000 OUTPUT.
* PERFORM FRM_INIT_DATA.
* PERFORM FRM_INIT_SIMPLE_TREE.
PERFORM FRM_INIT_ALV_TREE_SIMPLE.
ENDMODULE.
5、子例程逻辑处理
*&---------------------------------------------------------------------*
*& 包含 ZIT_CONFIG_TABLES_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_INIT_SIMPLE_TREE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_simple_tree .
CHECK g_container IS INITIAL .
CREATE OBJECT g_container
EXPORTING
container_name = 'CON_TREE' " 100屏幕CONTAINER控件
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
CREATE OBJECT g_tree
EXPORTING
* lifetime =
parent = g_container
* shellstyle =
node_selection_mode = g_tree->node_sel_mode_single
* hide_selection =
* name =
EXCEPTIONS
lifetime_error = 1
cntl_system_error = 2
create_error = 3
failed = 4
illegal_node_selection_mode = 5
OTHERS = 6.
CALL METHOD g_tree->set_alignment
EXPORTING
alignment = '15'. """ 不能大于15;
DATA: lt_events TYPE cntl_simple_events,
ls_event TYPE cntl_simple_event.
" node double click
CLEAR: lt_events.
ls_event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
ls_event-appl_event = 'X'. " process PAI if event occurs
APPEND ls_event TO lt_events.
CALL METHOD g_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
CREATE OBJECT g_application.
SET HANDLER g_application->handle_node_double_click FOR g_tree.
DATA: lv_subnode TYPE text30.
REFRESH gt_node.
LOOP AT gt_moudle INTO gs_moudle.
"设置第一层节点
PERFORM frm_add_node USING gs_moudle-zmodule '' gs_moudle-zmodule_text 'X' ''.
"设置第二层 表信息
LOOP AT gt_table ASSIGNING <fs_table> WHERE zmodule = gs_moudle-zmodule.
CLEAR:lv_subnode.
lv_subnode = |{ <fs_table>-zmodule }{ sy-tabix }|.
<fs_table>-subnode = lv_subnode.
PERFORM frm_add_node USING lv_subnode gs_moudle-zmodule <fs_table>-ddtext '' 'ICON_GRAPHICS'.
ENDLOOP.
ENDLOOP.
IF gt_node IS NOT INITIAL.
CALL METHOD g_tree->add_nodes
EXPORTING
table_structure_name = 'MTREESNODE'
node_table = gt_node[]
EXCEPTIONS
failed = 1
error_in_node_table = 2
dp_error = 3
table_structure_name_not_found = 4
OTHERS = 5.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_NODE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_NODEKEY
*& --> LV_RELATKEY
*& --> LV_TEXT
*& --> LV_ISFOLDER
*& --> LV_IMAGE
*&---------------------------------------------------------------------*
FORM frm_add_node USING pv_nodekey
pv_relatkey
pv_text
pv_isfolder
pv_image.
DATA: ls_node TYPE mtreesnode.
CLEAR:ls_node.
ls_node-node_key = pv_nodekey.
ls_node-relatkey = pv_relatkey.
ls_node-text = pv_text."- 给用户用
ls_node-isfolder = pv_isfolder.
ls_node-n_image = pv_image.
APPEND ls_node TO gt_node.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_NODE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_NODE_KEY text
*----------------------------------------------------------------------*
FORM frm_node_double_click USING p_node_key.
READ TABLE gt_table INTO gs_table WITH KEY subnode = p_node_key.
IF sy-subrc = 0.
PERFORM frm_config_table USING gs_table-tabname.
ENDIF.
ENDFORM. " FRM_NODE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*& Form FRM_INIT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_data .
DATA: lt_data TYPE TABLE OF ztcom_config_tab,
ls_data TYPE ztcom_config_tab,
lt_dd07t TYPE TABLE OF dd07t,
ls_dd07t TYPE dd07t.
CLEAR: lt_data.
SELECT *
INTO TABLE lt_data
FROM ztcom_config_tab.
CLEAR: gt_table.
LOOP AT lt_data INTO ls_data.
CLEAR: gs_table.
MOVE-CORRESPONDING ls_data TO gs_table.
IF gs_table-tabname IS NOT INITIAL.
SELECT SINGLE ddtext INTO gs_table-ddtext FROM dd02t WHERE tabname = gs_table-tabname AND ddlanguage = sy-langu.
ENDIF.
APPEND gs_table TO gt_table.
ENDLOOP.
SORT lt_data BY zmodule.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING zmodule.
CLEAR: lt_dd07t.
SELECT * INTO TABLE lt_dd07t FROM dd07t WHERE domname = 'ZDM_MOUDLE' AND ddlanguage = sy-langu.
LOOP AT lt_data INTO ls_data.
CLEAR:gs_moudle.
gs_moudle-zmodule = ls_data-zmodule.
READ TABLE lt_dd07t INTO ls_dd07t WITH KEY domvalue_l = gs_moudle-zmodule.
IF sy-subrc = 0.
gs_moudle-zmodule_text = ls_dd07t-ddtext.
ENDIF.
APPEND gs_moudle TO gt_moudle.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_INIT_ALV_TREE_SIMPLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_alv_tree_simple.
CHECK g_container IS INITIAL .
"报表头
DATA ls_list_comm TYPE slis_t_listheader.
DATA ls_alist_comm TYPE slis_listheader.
ls_alist_comm-typ = 'H'.
ls_alist_comm-info = '自定义配置表统一管理平台'.
APPEND ls_alist_comm TO ls_list_comm.
CREATE OBJECT g_container
EXPORTING
container_name = 'CON_TREE'.
CREATE OBJECT g_alv_tree
EXPORTING
i_parent = g_container.
"设置Fieldcat
PERFORM frm_set_fieldcat.
"设置Level
PERFORM frm_set_level.
"事件相关
PERFORM frm_register_event.
CREATE OBJECT tree_event_receiver.
SET HANDLER tree_event_receiver->handle_double_click FOR g_alv_tree.
SET HANDLER tree_event_receiver->handle_item_double_click FOR g_alv_tree.
CALL METHOD g_alv_tree->set_table_for_first_display
* EXPORTING
* it_list_commentary = ls_list_comm
" i_structure_name = 'ZTEST_SHOW' "se11建的想要展示的结构
CHANGING
it_sort = gt_sort
it_fieldcatalog = gt_fieldcat
it_outtab = gt_table[]. "数据表
CALL METHOD g_alv_tree->expand_tree
EXPORTING
i_level = 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
DATA:ls_fieldcat TYPE lvc_s_fcat.
DEFINE mrc_set_fieldcat.
CLEAR:ls_fieldcat.
ls_fieldcat-no_out = &1.
ls_fieldcat-edit = &1.
ls_fieldcat-col_pos = &2.
ls_fieldcat-fieldname = &3.
ls_fieldcat-scrtext_l = &4.
ls_fieldcat-scrtext_m = &4.
ls_fieldcat-scrtext_s = &4.
ls_fieldcat-coltext = &4.
ls_fieldcat-ref_table = &5.
ls_fieldcat-ref_field = &6.
ls_fieldcat-outputlen = &7.
ls_fieldcat-hotspot = 'X'.
APPEND ls_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
mrc_set_fieldcat 'X' '1' 'ZMODULE' '模块' 'ZTCOM_CONFIG_TAB' 'ZMODULE' '8'.
* mrc_set_fieldcat '' '1' 'SPE_USE' '专用' 'ZTCOM_CONFIG_TAB' 'SPE_USE' '5'.
mrc_set_fieldcat 'X' '1' 'TABNAME' '表名' 'ZTCOM_CONFIG_TAB' 'TABNAME' '10'.
mrc_set_fieldcat '' '1' 'DDTEXT' '表描述' 'ZTCOM_CONFIG_TAB' 'DDTEXT' '40'.
mrc_set_fieldcat '' '1' 'TCODE' '事务码' 'ZTCOM_CONFIG_TAB' 'TCODE' '15'.
* mrc_set_fieldcat '' '1' 'PROGRAMM' '程序名' 'ZTCOM_CONFIG_TAB' 'PROGRAMM' '15'.
mrc_set_fieldcat '' '1' 'REMARK' '备注' 'ZTCOM_CONFIG_TAB' 'REMARK' '35'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_level
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_level .
* zmodule type ztcom_config_tab-zmodule,
* spe_use type ztcom_config_tab-spe_use,
* tabname type ztcom_config_tab-tabname,
* ddtext type dd02t-ddtext,
* programm type ztcom_config_tab-programm,
* remark type ztcom_config_tab-remark,
* subnode type char30,
DATA: lv_index TYPE int4 VALUE '1' .
DATA: ls_sort TYPE lvc_s_sort .
ls_sort-spos = lv_index .
ls_sort-fieldname = 'ZMODULE' . "
ls_sort-up = 'X' .
ls_sort-subtot = 'X' .
APPEND ls_sort TO gt_sort .
lv_index = lv_index + 1 .
ls_sort-spos = lv_index .
ls_sort-fieldname = 'TABNAME' . "
ls_sort-up = 'X' .
ls_sort-subtot = 'X' .
APPEND ls_sort TO gt_sort .
lv_index = lv_index + 1 .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_handle_double_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> INDEX_OUTTAB
*& --> GROUPLEVEL
*&---------------------------------------------------------------------*
FORM frm_handle_double_click USING p_index_outtab
p_grouplevel.
DATA: lt_seltab TYPE TABLE OF rsparams, "选择条件通用表
ls_seltab TYPE rsparams.
"确保选择的是表行
CHECK p_index_outtab IS NOT INITIAL AND p_grouplevel IS INITIAL.
READ TABLE gt_table INTO gs_table INDEX p_index_outtab.
IF sy-subrc = 0.
CLEAR:ls_seltab.
ls_seltab-selname = 'S_TAB'.
ls_seltab-sign = 'I'.
ls_seltab-option = 'EQ'.
ls_seltab-low = gs_table-tabname.
* ls_seltab-high = ''.
APPEND ls_seltab TO lt_seltab.
SUBMIT zfid005 WITH SELECTION-TABLE lt_seltab AND RETURN.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_register_event
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_register_event .
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event,
l_event_receiver TYPE REF TO cl_tree_event_receiver.
CALL METHOD g_alv_tree->get_registered_events
IMPORTING
events = lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
l_event-appl_event = 'X' .
APPEND l_event TO lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_item_double_click.
l_event-appl_event = 'X' .
APPEND l_event TO lt_events.
CALL METHOD g_alv_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_config_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_config_table USING pv_tabname.
* DATA: lt_seltab TYPE TABLE OF rsparams, "选择条件通用表
* ls_seltab TYPE rsparams.
* CLEAR:lt_seltab.
* CLEAR:ls_seltab.
* ls_seltab-selname = 'S_TAB'.
* ls_seltab-sign = 'I'.
* ls_seltab-option = 'EQ'.
* ls_seltab-low = pv_tabname.
* APPEND ls_seltab TO lt_seltab.
* SUBMIT zfid005 WITH SELECTION-TABLE lt_seltab AND RETURN.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
* CORR_NUMBER = ' '
* GENERATE_MAINT_TOOL_IF_MISSING = ' '
* SHOW_SELECTION_POPUP = ' '
view_name = pv_tabname
* NO_WARNING_FOR_CLIENTINDEP = ' '
* RFC_DESTINATION_FOR_UPGRADE = ' '
* CLIENT_FOR_UPGRADE = ' '
* VARIANT_FOR_SELECTION = ' '
* COMPLEX_SELCONDS_USED = ' '
* CHECK_DDIC_MAINFLAG = ' '
* SUPPRESS_WA_POPUP = ' '
* TABLES
* DBA_SELLIST =
* EXCL_CUA_FUNCT =
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_call_ztable
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_call_ztable .
* CALL TRANSACTION 'ZTABLE'.
ENDFORM.