导语:关于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_dclickFOR EVENT node_double_click OF cl_gui_alv_treeIMPORTING 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_childrenEXPORTINGi_node_key = node_keyIMPORTINGet_children = lt_children.IF NOT lt_children IS INITIAL.CALL METHOD sender->expand_nodeEXPORTINGi_node_key = node_keyi_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=>flushEXCEPTIONScntl_system_error = 1cntl_error = 2.IF sy-subrc NE 0.CALL FUNCTION 'POPUP_TO_INFORM'EXPORTINGtitel = '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_treeEXPORTINGparent = lcl_container "绑定容器node_selection_mode = cl_gui_column_tree=>node_sel_mode_singleitem_selection = 'X'no_html_header = 'X'no_toolbar = ''EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4illegal_node_selection_mode = 5failed = 6illegal_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_displayEXPORTINGis_hierarchy_header = l_hierarchy_headerCHANGINGit_fieldcatalog = gt_fcatit_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 CHANGINGp_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_fnamep_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~vrkmeINTO TABLE @lt_alvFROM vbak AS aINNER 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_nodeEXPORTINGi_relat_node_key = ''i_relationship = cl_gui_column_tree=>relat_last_childi_node_text = '单据查询'IMPORTINGe_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 NODECLEAR l_node_text.l_node_text = ls_alv-erdat.CALL METHOD lcl_tree->add_nodeEXPORTINGi_relat_node_key = l_top_key "处于祖节点之下i_relationship = cl_gui_column_tree=>relat_last_childi_node_text = l_node_textis_outtab_line = ls_nodeIMPORTINGe_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 NODECLEAR l_node_text.l_node_text = ls_alv-vbeln.CALL METHOD lcl_tree->add_nodeEXPORTINGi_relat_node_key = l_erdat_key "处于日期节点之下i_relationship = cl_gui_column_tree=>relat_last_childi_node_text = l_node_textis_outtab_line = ls_nodeIMPORTINGe_new_node_key = l_vbeln_key. "单号节点标识ENDIF."设置”叶片“,填充"叶片"数据CLEAR l_node_text.l_node_text = ls_alv-posnr.CALL METHOD lcl_tree->add_nodeEXPORTINGi_relat_node_key = l_vbeln_key "处于单号节点之下i_relationship = cl_gui_column_tree=>relat_last_childi_node_text = l_node_textis_outtab_line = ls_alv "有数据IMPORTINGe_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_eventsIMPORTINGevents = 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_eventsEXPORTINGevents = lt_eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.MESSAGE e208(00) WITH '注册前端事件失败!'. "#EC NOTEXTENDIF.
*--------------------"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