作为大部分报表程序的基础,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. CRM/ERP 企业管理软件中常见的七种程序设计模式

    管理软件中的常见代码设计模式,来自于业务上的需要,有不恰当的地方欢迎批评指正. 1  RE-TRY 重试模式 场景:在连接数据库服务器时,如果SQL Server数据库没有启动或正在启动,我们需要有一 ...

  2. 神奇的CSS sprites,制作特效的新方法

    本文主要内容简译自Dava Shea的英文文章 CSS Sprites: Image Slicing’s Kiss of Death,如果觉得博主讲的含糊不清的话,可以看作者原文. 熟悉了常规切图的我 ...

  3. OpenWebGlobe-开源三维GIS初体验(附源码和演示)

    1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...

  4. 轻量级前端MVVM框架avalon - ViewModel

    废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...

  5. WPF做验证码,小部分修改原作者内容

    原文地址:http://www.cnblogs.com/tianguook/p/4142346.html 首先感谢aparche大牛的帖子,因为过两天可能要做个登录的页面,因此,需要用到验证码,从而看 ...

  6. 前端学PHP之面向对象系列第四篇——关键字

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...

  7. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  8. 读《linux内核完全注释》的FAQ

    以下只是个人看了<linux内核完全注释>的一点理解,如果有错误,欢迎指正! 1 eip中保存的地址是逻辑地址.线性地址还是物理地址? 这个应该要分情况.eip保存的是下一条要执行的指令地 ...

  9. 追根溯源:EntityFramework 实体的状态变化

    阅读目录: 1. 应用场景 2. 场景测试 3. 问题分析 4. 追根溯源 5. 简要总结 1. 应用场景 首先,应用程序使用 EntityFramework,应用场景中有两个实体 S_Class(班 ...

  10. position:fixed和scroll实现div浮动【示例】

    前言 在自己建站的过程中,要实现一个div随滚动条浮动的效果,网上找了些示例不太好用,还是自己动手,丰衣足食,写的不好请大家谅解,毕竟我不是搞前端的,因为自己建站毕竟每一步都必须自己来,这边只是做个记 ...