作为大部分报表程序的基础,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. 即时搜索(input框)

    做搜索功能的时候,经常遇到输入框检查的需求,最常见的是即时搜索,今天好好小结一下. 即时搜索的方案: (1)change事件    触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标 ...

  2. jquery实现的网页选项卡(拾忆)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 给Easyui combobox设定默认值

          今天做到那个北理工二期的项目,里面刚好有几个dialog需要弄一个默认值,一般是选择启用与否,但是,为了方便用户,最好有一个默认值,所以,增加一个默认值的属性.代码入下: JS代码:   ...

  4. angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”

    曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...

  5. 窥探Swift之类的继承与类的访问权限

    上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...

  6. 小菜学习编程-Winform系列(初学者)

    前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙着公司产品上线,但是答应的一定要实现,大家看我上 ...

  7. 异步Promise实现

    简介 异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题. 简单的实现了Promise API: (function ...

  8. Winform在线更新

    引言 2015年第一篇,Winform在线更新,算是重操旧业吧,09年刚到北京时一直做硬件联动编程,所以大多数时间都在搞Winform, 但是从来没做过在线更新这个功能,前几天参与部门另一个项目,上来 ...

  9. 在新浪云SAE中使用smarty引擎模版

    在新浪云上使用smarty时会发现又这样的错误信息: “SAE_Fatal_error: Uncaught exception 'SmartyException' with message 'unab ...

  10. 用Vagrant创建Jenkins构建环境

    这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...