zoukankan      html  css  js  c++  java
  • OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了。实际上,ALV TREE和ALV GRID的实现整体上是相似的,因此对于使用过ALV GRID的开发者来说,掌握ALV TREE会比较容易。但二者也有一些不同之处,可能会在开发过程中引起人们的困惑,现总结如下

    首先定义概念:文中的ALV GRID指的是由OO方式建立的、由类cl_gui_alv_grid实例化后产生的ALV GRID,而ALV TREE指的是由类cl_gui_alv_tree实例化后产生的ALV TREE

    1,输出内容的构建方式

          ALV GRID的输出数据是通过直接将查询结果内表作为参数传递到ALV GRID对象的 set_table_for_first_display方法而显示的。

        在ALV TREE中,传入set_table_for_first_display方法的内表需要为空,显示的数据则由 add_node方法传入。

    (如果是cl_gui_alv_tree_simple,则可通过与ALV GRID相同的方法,在set_table_for_first_display方法传入查询结果内表)

    2,自定义按钮的添加

           在ALV GRID中,如要建立工具栏自定义按钮,可以在ALV GRID的toolbar事件触发时使用 cl_alv_event_toolbar_set方法添加自定义按钮。自定义按钮触发的功能码由ALV GRID的usercommand事件接收并处理。

         而ALV TREE中是不存在toolbar事件的,因此,在ALV TREE中创建工具栏自定义按钮,需要使用类cl_gui_toolbar的对象,调用其add_button方法。同样的,自定义按钮触发的功能码也不是由ALV TREE的事件接收,而是由cl_gui_toolbar的on_function_selected事件接收和处理。

    3,刷新显示

          对ALV GRID来说,如果修改了表格中的内容,需要刷新后方可显示。 ALV GRID的刷新使用cl_gui_grid的refresh_table_display方法实现。

          对ALV TREE而言,因为最初使用set_table_for_first_display的时候内表是空的(参考上文第一条),必须使用add_node增加节点,之后TREE当中才会有实际内容。因此,它的刷新是必须的,而不是像ALV GRID一样,如果没有变化,在初始化显示之后可以不刷新。ALV TREE中方法refresh_table_display是私有方法,无法直接调用,应通过cl_gui_alv_tree的update_calculations方法和frontend_update方法实现更新。代码片段如下:

     CREATE OBJECT g_tree
        EXPORTING
          ……
        EXCEPTIONS
          ……
      PERFORM build_fieldcatalog.
    *拖拽对象
      PERFORM define_dnd_behaviour.
    *添加节点
      PERFORM add_nodes USING hierarchy_header.
    *添加工具栏按钮
      PERFORM change_toolbar.
    *注册事件
      PERFORM register_events.
    *更新显示
      CALL METHOD g_tree->update_calculations.
      CALL METHOD g_tree->frontend_update.

    4,事件注册方式

      ALV GRID中,注册事件使用set handle语句即可。

      ALV TREE中,事件的注册同样使用set handle,但某些事件稍微麻烦一点

      需要使用到get/set_registered_events方法,方才有效:

      CALL METHOD g_tree->get_registered_events
        IMPORTING
          events = lt_events.
    
      l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
      APPEND l_event TO lt_events.
      l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
      APPEND l_event TO lt_events.
    
      CALL METHOD g_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 x208(00) WITH 'ERROR'.                          "#EC NOTEXT
      ENDIF.
    
      CREATE OBJECT l_event_receiver.
      SET HANDLER l_event_receiver->handle_node_double_click FOR g_tree.
      SET HANDLER l_event_receiver->handle_node_cm_req FOR g_tree.
      SET HANDLER l_event_receiver->handle_node_cm_sel FOR g_tree.

    本文链接:http://www.cnblogs.com/hhelibeb/p/5748296.html

     
  • 相关阅读:
    aiohttp简介及快速使用
    Git的学习与使用
    基于scrapy-redis的分布式爬虫
    异步编程之asyncio简单介绍
    Scrapy框架中的CrawlSpider
    scrapy中selenium的应用
    ua池和代理池
    Scrapy持久化存储
    Scrapy的日志等级和请求传参
    virtualenv搭建Python虚拟环境
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/5748296.html
Copyright © 2011-2022 走看看