作为大部分报表程序的基础,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 =
cntl_system_error =
illegal_event_combination = .
IF sy-subrc <> .
MESSAGE x208() 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

 


OO方式下,ALV TREE和ALV GRID的不同之处的更多相关文章

  1. OO方式实现ALV: cl_salv_table

    这里总结最近用cl_salv_table实现ALV遇到问题和解决办法 FORM set_alv2 . DATA: lv_syrepid TYPE syrepid. lv_syrepid = sy-cp ...

  2. ALV TREE 实例

    ALV TREE 实例 REPORT ZRPT_PS_PS021TREE . TABLES: PROJ, "项目定义数据 PRPS, "WBS元素数据 ZCJ30, "A ...

  3. OO博客总结——OO落下帷幕

    OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...

  4. CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)

    CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...

  5. php cli方式下获取服务器ip

    (未整理....) (1)php cli方式下获取服务器ip [php]  function getServerIp(){          $ss = exec('/sbin/ifconfig et ...

  6. php任何优化的方式下这样第个列表都是再次查询

    我们的代码经理是这样的:计算总行数:select count(*) from tablename where -..查询列表select * from tablename where - limit- ...

  7. ORACLE用户管理方式下备份数据和复制数据库

    首先要明确的是,oracle数据库的备份可以分为逻辑备份和物理备份.           逻辑备份的是通过数据导出对数据进行备份,主要方式有老式的IMP/EXP和数据泵灯方式.适合变化较少的数据库,而 ...

  8. php在cli和cgi方式下获取服务器ip的实例

    php cli方式下获取服务器ip php内核没有提供这样的命令,需要借助linux中的命令ifconfig来实现,如下两个函数代码: function getServerIp(){          ...

  9. Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的, ...

随机推荐

  1. [转]Linux常用命令

    系统信息arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / ...

  2. Sql Server系列:索引基础

    1 索引概念 索引用于快速查找在某个列中某个特定值的行,不使用索引,数据库必须从第1条记录开始读完整个表,知道找出需要的行.表越大,查询数据所花费的时间越多.如果表中查询的列有索引,数据库能快速到达一 ...

  3. Caffe学习笔记1--Ubuntu 14.04 64bit caffe安装

    本篇博客主要用于记录Ubuntu 14.04 64bit操作系统搭建caffe环境,目前针对的的是CPU版本: 1.安装依赖库 sudo apt-get install libprotobuf-dev ...

  4. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为’A’   成绩>=最高分-20  等级为’B’ 成绩>=最高分-30  等级为’C’ ...

  5. Apache漏洞修复

    今天受同事的委托,修复一台服务器的Apache漏洞,主要集中在以下几点: 1.Apache httpd remote denial of service(中危) 修复建议:将Apache HTTP S ...

  6. IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解

    上一篇:<IDDD 实现领域驱动设计-由贫血导致的失忆症> 这篇博文是对<实现领域驱动设计>第一章后半部分内容的理解. Domain Experts-领域专家 这节点内容是昨天 ...

  7. sublime3破解版sublime3注册码

    Sublime Text 3 官方网址:http://www.sublimetext.com/ Mac下载地址: http://c758482.r82.cf2.rackcdn.com/Sublime% ...

  8. 如何设置SharePoint 2013 的根网站集下的“更改此术语的目标页面”

    起因: 首先看问题截图Figure 1,在术语驱动的页面中设置更改此术语的目标页面,会被警告“该URL 不指向某个页面”,原因是我所找到的这个目标页面是一个非aspx结尾的URL链接. Figure ...

  9. Unity调用Android类方法

    Unity调用Android类方法 1.  添加Unity的classes.jar文件 创建一个Android工程AndroidUnityDemo. 由于Unity的版本不同,直接在Unity安装包文 ...

  10. ZOJ Problem Set - 1337 Pi 最大公约数

    这道题目的关键在于怎么求两个整数的最大公约数,这里正好复习一下以前的知识,如下: 1.设整数a和b 2.如果a和b都为0,则二者的最大公约数不存在 3.如果a或b等于0,则二者的最大公约数为非0的一个 ...