ALV TREE DEMO

news/2025/2/15 18:08:36/

导语:关于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


http://www.ppmy.cn/news/741290.html

相关文章

Functional ALV系列 (01) - ALV开发入门

SAP 的 ALV 全称是 SAP List Viewer&#xff0c;是 SAP 用于显示行列表格化数据的主要方式&#xff0c;从 SAP 推出的技术来看&#xff0c;大体有如下几种 函数生成 ALV&#xff0c;调用 REUSE_ALV*相关的函数ALV Grid 控件框架&#xff1a;SAP 提供 cl_gui_alv_grid 类&#…

06-ALV

开发ALV的基本流程 开发ALV的基本流程 第1步&#xff1a;声明变量 定义ALV所要用到的类型池&#xff1a;TYPE-POOLS: SLIS 针对ALV的控制信息数据&#xff08;Layout & Fieldcat&#xff09; 第2步&#xff1a;定义内表 存放自定义数据文件的数据&#xff0c;以及在A…

Web——Vaadin

Vaadin 依赖说明&#xff1a;一个 Web 框架&#xff0c;允许你用纯Java 编写 UI&#xff0c;而不会陷入JS、HTML 和 CSS 的泥潭。 Vaadin的工作方式依赖于服务器端渲染&#xff0c;因此可以自然地集成到诸如Spring之类的框架中。 当您是后端开发人员时&#xff0c;您会听到人们…

什么是 WAL

什么是 WAL WAL(Write Ahead Log)预写日志&#xff0c;是数据库系统中常见的一种手段&#xff0c;用于保证数据操作的原子性和持久性。 在计算机科学中&#xff0c;「预写式日志」&#xff08;Write-ahead logging&#xff0c;缩写 WAL&#xff09;是关系数据库系统中用于提供…

verilog理论刷题篇1 Alwaysblock1 2

总结&#xff1a; using an assign statement,连续赋值给wire类型赋值assigna combinational always block,组合逻辑 always 块给wire类型赋值always (*)and a clocked always block.时序逻辑always 块给reg类型赋值always (posedge clk) 组合逻辑:使用assign always (&#x…

sqlserver2016无域alwayson搭建

前期准备&#xff1a; windows系统&#xff1a;window server 2016 数据库&#xff1a;sqlserver 2016 两台电脑 两个虚拟IP 1.安装windows 故障转移功能; 2.两节点添加相同名称的后缀DNS 3.访问 C:\Windows\System32\drivers\etc &#xff0c;修改host文件&#xff08…

ALE简介

ALE的全称&#xff1a;Application Level Events ALE的位置&#xff1a; ALE的优势&#xff1a;屏蔽了“获取EPC数据组件”、“过滤组件”、“应用程序”之间的联系&#xff0c;使得其中任意组件的改变都不会影响到其他组件。 ALE接口&#xff1a; 1. Reading API 2. Writing A…

AVL-Review

二叉树的删除 最值节点一定是叶节点&#xff0c;没有子树&#xff0c;所以在移动最值节点后删除的时候不用考虑最值节点下的节点移动问题。 完全二叉树和完美二叉树的区别&#xff1a; 完美二叉树&#xff1a;一个深度为k(>-1)且有2^(k1) - 1个结点的二叉树 ​ 深度&am…