SAP ABAP 关于oo alv tree的top_of_page事件的实现步骤

  • Post author:
  • Post category:其他


导读:接上一文章:

SAP ABAP之BOM物料递归查询方法汇总以及树状TREE ALV展示BOM物料层级

在此基础上,再加上表头数据说明,查阅了很多相关资料,发现网上并没有这一教程,都是基于

alv grid

去实现的


top_of_page


,没有基于

alv tree

去实现

top_of_page

的案例。所以在此记录一下我的实现过程。

先来说一下思路:

其实alv tree 与 alv grid实现TOP_OF_PAGE的思路是一致的,都是

  • 第一:先分割设置好容器;(

    因为表头需要单独一个容器,所以此处需要分割成两个,自定义两个容器也行,或者用docking加上splitter容器进行切割也行,这里的例子用docking实现

  • 第二:声明事件类;
  • 第三注册事件类;

主要是上面三个步骤。

废话不多说,直接上实例代码

先声明此例程需要用到的全局参数

DATA: tree1 TYPE REF TO cl_gui_alv_tree.      "树控件

DATA:go_docking          TYPE REF TO cl_gui_docking_container, "全屏自适应
     go_split_container1 TYPE REF TO cl_gui_splitter_container, "控件拆分
     go_split_container2 TYPE REF TO cl_gui_splitter_container, "控件拆分
     go_container1       TYPE REF TO cl_gui_container,"表头容器
     go_container2       TYPE REF TO cl_gui_container."表体数据容器
DATA: go_dyndoc_id  TYPE REF TO cl_dd_document,  "文档
      go_html_cntrl TYPE REF TO cl_gui_html_viewer. "HTML CONTRL PROXY CLASS

第一步,容器拆分以及分配容器:

*  创建docking容器
  CREATE OBJECT go_docking
    EXPORTING
      repid                       = sy-repid
      dynnr                       = sy-dynnr
      side                        = cl_gui_docking_container=>dock_at_bottom "dock_at_top
      extension                   = 99999
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.
  "将容器分为两行一列
  CREATE OBJECT go_split_container1
    EXPORTING
      link_dynnr = sy-dynnr
      link_repid = sy-repid
      parent     = go_docking
      rows       = 2   "分成一行
      columns    = 1.   "分成两列
  "分配容器
  CALL METHOD go_split_container1->get_container "表头
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = go_container1.
*  创建文档对象
  CREATE OBJECT go_dyndoc_id
    EXPORTING
      style = 'ALV_GRID'.
*  分配容器
  CALL METHOD go_split_container1->get_container "表体(树)
    EXPORTING
      row       = 2
      column    = 1
    RECEIVING
      container = go_container2.
*  设置第一个容器的高度(表头)
  CALL METHOD go_split_container1->set_row_height
    EXPORTING
      id     = 1
      height = 20.
*  创建tree1控件对象
  CREATE OBJECT tree1
    EXPORTING
      parent              = go_container2
      node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
      item_selection      = 'X'
      no_html_header      = 'X'
      no_toolbar          = ' '.

第二步:声明事件类:

"tree alv事件声明
CLASS cl_alv_tree_event DEFINITION.
  PUBLIC SECTION.
    "声明top_of_page事件
    METHODS: top_of_page FOR EVENT top_of_page OF cl_gui_alv_tree..
ENDCLASS.

"tree alv事件实施
CLASS cl_alv_tree_event IMPLEMENTATION.
  "实施top_of_page事件
  METHOD top_of_page.
    PERFORM top_of_page.
  ENDMETHOD.
ENDCLASS.

"定义事件对象
DATA:go_event_9000 TYPE REF TO cl_alv_tree_event.

第三步:将事件类实例化并注册到tree控件中

"注册事件
  CREATE OBJECT go_event_9000.
  SET HANDLER go_event_9000->top_of_page FOR tree1.
  CALL METHOD tree1->top_of_page_event.

初始化文档对象:

*初始化
  CALL METHOD go_dyndoc_id->initialize_document
    EXPORTING
      background_color = cl_dd_area=>col_textarea.

FORM :TOP_OF_PAGE

FORM top_of_page.
  DATA:dl_text(255) TYPE c.

* 文本
  CLEAR dl_text.
  CALL METHOD go_dyndoc_id->add_text
    EXPORTING
      text         = 'TOP_OF_PAGE'
      sap_style    = cl_dd_area=>heading
      sap_fontsize = cl_dd_area=>small
      sap_color    = cl_dd_area=>list_heading_int.

  IF go_html_cntrl IS INITIAL.
    CREATE OBJECT go_html_cntrl
      EXPORTING
        parent = go_container1.
  ENDIF.

  CALL METHOD go_dyndoc_id->merge_document.
  go_dyndoc_id->html_control = go_html_cntrl.
  CALL METHOD go_dyndoc_id->display_document
    EXPORTING
      reuse_control      = 'X'
      parent             = go_container1
    EXCEPTIONS
      html_display_error = 1.
ENDFORM.


注意:

实现第三步时,不像alv tree注册其他类似双击事件一样需要调用

tree1->set_registered_events

这里的

tree1->top_of_page_event.

的意思其实和set_registered_events意思是一样的,都是向tree控件注册事件,所以此处不再使用set_registered_events(这个事件注册也不能注册TOP_OF_PAGE事件),而是选择了

top_of_page_event

方式向tree注册事件。

到此,完成!

如有疑问,欢迎留言,定当知无不言~



版权声明:本文为yishangbing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。