导语:关于alv tree网上的资料比较少,在这里分享一个简单的demo这个也是我通过网上找的一个demo自己修改测试了一下,原文章的链接找不到了,后续有时间我会测一下事件,再分享alv tree的资料。
具体代码如下,只需要建一个screen就可以用了,屏幕上的控件我定义的名字就是alv tree,里面的注释还算明确。
*&---------------------------------------------------------------------*
*& Report Z_ALVTREE_TEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_alvtree_test.
*&---------------------------------------------------------------------*
*&数据对象定义
*&---------------------------------------------------------------------*
DATA:BEGIN OF gs_alv,
erdat TYPE vbak-erdat,
vbeln TYPE vbak-vbeln,
posnr TYPE vbap-posnr,
matnr TYPE vbap-matnr,
kwmeng TYPE vbap-kwmeng,
vrkme TYPE vbap-vrkme,
END OF gs_alv.
DATA gt_alv LIKE TABLE OF gs_alv.
DATA:gs_fcat TYPE lvc_s_fcat,
gt_fcat TYPE lvc_t_fcat.
DATA:lcl_container TYPE REF TO cl_gui_container, "容器类引用变量
lcl_tree TYPE REF TO cl_gui_alv_tree. "树形ALV控制器引用变量
DATA:ok_code TYPE sy-ucomm, "获取100屏幕触发的功能码
save_code TYPE sy-ucomm.
*&---------------------------------------------------------------------*
*&事件接受类定义
*&---------------------------------------------------------------------*
CLASS lcl_handle DEFINITION.
PUBLIC SECTION.
"定义双击节点事件触发时的处理方法
METHODS handle_node_dclick
FOR EVENT node_double_click OF cl_gui_alv_tree
IMPORTING node_key sender.
"其中SENDER这个参数是一个隐式的事件参数,是由ABAP对象运行系统提供,它指向了触发这个事件的实例,可以直接使用它来调用这个实例的方法。
ENDCLASS.
CLASS lcl_handle IMPLEMENTATION.
"定义处理方法的具体实施
METHOD handle_node_dclick.
DATA: lt_children TYPE lvc_t_nkey.
*检查被点击的NODE几点下面有无子节点,有则展开节点。
CALL METHOD sender->get_children
EXPORTING
i_node_key = node_key
IMPORTING
et_children = lt_children.
IF NOT lt_children IS INITIAL.
CALL METHOD sender->expand_node
EXPORTING
i_node_key = node_key
i_level_count = 2.
ELSE.
SET PARAMETER ID 'AUN' FIELD node_key.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR 'TITLE'.
IF lcl_tree IS INITIAL.
PERFORM init_tree.
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Automation Queue failure'
txt1 = 'Internal error:'
txt2 = 'A method in the automation queue'
txt3 = 'caused a failure.'.
ENDIF.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form INIT_TREE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM init_tree .
"1.实例化容器对象
lcl_container = cl_gui_container=>screen0.
"2.实例化TREE控制器
CREATE OBJECT lcl_tree
EXPORTING
parent = lcl_container "绑定容器
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
item_selection = 'X'
no_html_header = 'X'
no_toolbar = ''
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
illegal_node_selection_mode = 5
failed = 6
illegal_column_name = 7.
IF sy-subrc <> 0.
MESSAGE e208(00) WITH '实例化ALV TREE控制器失败!'. "
ENDIF.
"3.设置NODE描述字段信息
DATA l_hierarchy_header TYPE treev_hhdr.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.
"4.设置ALV字段
PERFORM frm_fillfield USING: 'ERDAT' '日期',
'VBELN' '单号',
'POSNR' '行号',
'MATNR' '物料',
'KWMENG' '数量',
'VRKME' '单位'.
"5设置ALV显示字段
CALL METHOD lcl_tree->set_table_for_first_display
EXPORTING
is_hierarchy_header = l_hierarchy_header
CHANGING
it_fieldcatalog = gt_fcat
it_outtab = gt_alv. "此表必须一直为空,且为全局变量
"6.设置根节点,填充叶节点数据
PERFORM create_hierarchy.
"7.注册事件
PERFORM register_events.
* 更新汇总字段
CALL METHOD lcl_tree->update_calculations.
*前端显示数据
CALL METHOD lcl_tree->frontend_update.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_hierarchy_header
*&---------------------------------------------------------------------*
* build hierarchy-header-information
*----------------------------------------------------------------------*
* -->P_L_HIERARCHY_HEADER strucxture for hierarchy-header
*----------------------------------------------------------------------*
FORM build_hierarchy_header CHANGING
p_hierarchy_header TYPE treev_hhdr.
p_hierarchy_header-heading = '日期'.
p_hierarchy_header-tooltip = '节点依据'.
p_hierarchy_header-width = 50.
p_hierarchy_header-width_pix = ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILLFIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_fillfield USING p_fieldname TYPE lvc_fname
p_coltext TYPE lvc_txtcol.
CLEAR gs_fcat.
gs_fcat-fieldname = p_fieldname.
gs_fcat-coltext = p_coltext.
IF p_fieldname = 'ERDAT' OR p_fieldname = 'VBELN' OR p_fieldname = 'POSNR' .
gs_fcat-no_out = 'X'."隐藏右侧输出的MATNR/WERKS/LGORT字段
ELSEIF p_fieldname = 'KWMENG'.
gs_fcat-qfieldname = 'VRKME'.
gs_fcat-do_sum = 'X'."数量汇总
gs_fcat-h_ftype = 'SUM'.
gs_fcat-ref_field = 'KWMENG'.
gs_fcat-ref_table = 'VBAP'.
gs_fcat-outputlen = '30'.
ELSEIF p_fieldname = 'MAKTX'.
gs_fcat-outputlen = '30'.
ENDIF.
APPEND gs_fcat TO gt_fcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_HIERARCHY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM create_hierarchy .
DATA: ls_node LIKE gs_alv,
ls_alv LIKE gs_alv,
lt_alv LIKE TABLE OF gs_alv,
l_last_erdat TYPE vbak-erdat,
l_last_vbeln TYPE vbak-vbeln.
DATA: l_erdat_key TYPE lvc_nkey,
l_vbeln_key TYPE lvc_nkey,
l_last_key TYPE lvc_nkey,
l_top_key TYPE lvc_nkey.
DATA l_node_text TYPE lvc_value.
SELECT a~erdat,
b~vbeln,
b~posnr,
b~matnr,
b~kwmeng,
b~vrkme
INTO TABLE @lt_alv
FROM vbak AS a
INNER JOIN vbap AS b ON a~vbeln = b~vbeln.
* SELECT d~matnr,
* d~werks,
* d~lgort,
* d~labst,
* a~meins,
* t~maktx
* INTO CORRESPONDING FIELDS OF TABLE @lt_alv UP TO 200 ROWS
* FROM mard AS d INNER JOIN mara AS a
* ON d~matnr = a~matnr
* LEFT OUTER JOIN makt AS t
* ON d~matnr = t~matnr
* WHERE t~spras = @sy-langu.
SORT lt_alv BY erdat vbeln.
"添加祖节点
CALL METHOD lcl_tree->add_node
EXPORTING
i_relat_node_key = ''
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = '单据查询'
IMPORTING
e_new_node_key = l_top_key. "祖节点标识
"按照工厂->仓库层次设置节点,设置”叶片“,填充"叶片"数据
LOOP AT lt_alv INTO ls_alv.
"设置日期节点
IF l_last_erdat NE ls_alv-erdat.
l_last_erdat = ls_alv-erdat.
"若此次循环到的工厂与上一次不相同,则创造新的工厂节点
"ADD NODE
CLEAR l_node_text.
l_node_text = ls_alv-erdat.
CALL METHOD lcl_tree->add_node
EXPORTING
i_relat_node_key = l_top_key "处于祖节点之下
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = ls_node
IMPORTING
e_new_node_key = l_erdat_key. "日期节点标识
CLEAR l_last_vbeln."当创建新的日期节点时,清空上一个日期节点
ENDIF.
"设置单号节点
IF l_last_vbeln NE ls_alv-vbeln.
l_last_vbeln = ls_alv-vbeln.
"若此次循环到的库存点点与上一次不相同,则创造新的库存节点
"ADD NODE
CLEAR l_node_text.
l_node_text = ls_alv-vbeln.
CALL METHOD lcl_tree->add_node
EXPORTING
i_relat_node_key = l_erdat_key "处于日期节点之下
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = ls_node
IMPORTING
e_new_node_key = l_vbeln_key. "单号节点标识
ENDIF.
"设置”叶片“,填充"叶片"数据
CLEAR l_node_text.
l_node_text = ls_alv-posnr.
CALL METHOD lcl_tree->add_node
EXPORTING
i_relat_node_key = l_vbeln_key "处于单号节点之下
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = ls_alv "有数据
IMPORTING
e_new_node_key = l_last_key. "行号节点标识
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form REGISTER_EVENTS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM register_events .
"注册前端后后端事件
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event,
l_event_receiver TYPE REF TO lcl_handle.
*1。获取已注册的前端事件
CALL METHOD lcl_tree->get_registered_events
IMPORTING
events = lt_events.
"2.添加前端双击时间
l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
APPEND l_event TO lt_events.
*3.重新设置前端注册时间
CALL METHOD lcl_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
IF sy-subrc <> 0.
MESSAGE e208(00) WITH '注册前端事件失败!'. "#EC NOTEXT
ENDIF.
*--------------------
"4.注册后端事件
CREATE OBJECT l_event_receiver.
SET HANDLER l_event_receiver->handle_node_dclick FOR lcl_tree.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
"释放容器,退出程序
CALL METHOD lcl_container->free.
LEAVE PROGRAM.
WHEN OTHERS.
"为正确调用工具栏按钮功能,必须调用该方法
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE.
效果展示
作者:小飞猪猪猪猪猪猪猪–CSDN