ALV TREE DEMO

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值