5. OO SALV tree

  利用函数和GRID的功能发布的SALV包程序(SALV也称为New ALV)。通过类cl_salv_tree,实现tree类型ALV的输出。

5.1显示tree ALV

          通过cl_salv_tree类对象lo_tree,显示tree ALV。

代码实例:

  全局变量定义,使用icon需要引入type-pools:icon;gt_spfli显示的内表结构,是一个空内表;lo_tree为cl_salv_tree类对象;lo_error为异常类对象;lo_container为容器类对象。

"使用icon
type-pools: icon.

"这个内表创建alv时,没有数据
DATA:gt_spfli TYPE STANDARD TABLE OF spfli.
"cl_salv_tree类对象
DATA:lo_tree TYPE REF TO cl_salv_tree.
"异常类对象
DATA:lo_error TYPE REF TO  CX_SALV_ERROR.
"屏幕容器类对象
DATA:lo_container TYPE REF TO cl_gui_custom_container.

创建cl_salv_tree类对象,设置显示tree结构

"创建tree alv,全屏显示
FORM creat_alv_fullscreen.
  TRY .
      "获取cl_salv_tree类对象
      cl_salv_tree=>factory(
        importing
          r_salv_tree = lo_tree
        changing
          t_table = gt_spfli ).

      "设置全局
      PERFORM set_tree_settings.
      "获取数据,设置tree结构
      PERFORM set_tree.
      "显示alv
      lo_tree->display( ).
    CATCH CX_SALV_NO_NEW_DATA_ALLOWED CX_SALV_ERROR INTO lo_error.
      DATA:result TYPE string.
      result = lo_error->IF_MESSAGE~GET_TEXT( ).
      MESSAGE result TYPE 'E'.
  ENDTRY.
ENDFORM.

设置tree的树形结构,数据是在这个阶段获取的,而生成cl_salv_tree类对象lo_tree时传入的table为空。

代码实例:

"设置tree结构
FORM set_tree.
  DATA:lt_spfli TYPE STANDARD TABLE OF spfli.
  DATA:lw_spfli LIKE LINE OF lt_spfli.
  DATA:l_carrid_key type lvc_nkey.
  DATA:l_connid_key type lvc_nkey.
  DATA:l_last_key type lvc_nkey.

  DATA:lo_nodes type ref to cl_salv_nodes.
  DATA:lo_node type ref to cl_salv_node.
  DATA:lo_item type ref to cl_salv_item.

  "查询数据
  SELECT * INTO TABLE lt_spfli FROM spfli.
  "获取tree的node节点
  "插入节点
  "IF_SALV_C_NODE_RELATION~FIRST_CHILD:第一个child
  "IF_SALV_C_NODE_RELATION~FIRST_SIBLING:第一个brother
  "IF_SALV_C_NODE_RELATION~LAST_CHILD:最后child
  "IF_SALV_C_NODE_RELATION~LAST_SIBLING:最后brother
  "IF_SALV_C_NODE_RELATION~NEXT_SIBLING:next brother
  "IF_SALV_C_NODE_RELATION~PREVIOUS_SIBLING:previous brother
  "IF_SALV_C_NODE_RELATION~PARENT:parent节点
  lo_nodes = lo_tree->get_nodes( ).
  LOOP AT lt_spfli INTO lw_spfli.
    ON CHANGE OF lw_spfli-carrid.
      TRY .
          "添加子节点
          lo_node = lo_nodes->add_node(
             related_node = ''
             data_row = lw_spfli
             relationship = cl_salv_nodes=>IF_SALV_C_NODE_RELATION~LAST_CHILD
           ).
          l_carrid_key = lo_node->get_key( ).
        CATCH cx_salv_msg.
      ENDTRY.
    ENDON.

    ON CHANGE OF lw_spfli-connid.
      TRY .
          "添加子节点
          lo_node = lo_nodes->add_node(
             related_node = l_carrid_key
             data_row = lw_spfli
             relationship = cl_salv_nodes=>IF_SALV_C_NODE_RELATION~LAST_CHILD
           ).
          "获取节点key
          l_connid_key = lo_node->get_key( ).
        CATCH cx_salv_msg.
      ENDTRY.
    ENDON.

    "添加最后层
    TRY .
        "添加子节点
        lo_node = lo_nodes->add_node(
           related_node = l_connid_key
           data_row = lw_spfli
           relationship = cl_salv_nodes=>IF_SALV_C_NODE_RELATION~LAST_CHILD
         ).
        "获取节点key
        l_last_key = lo_node->get_key( ).
      CATCH cx_salv_msg.
    ENDTRY.

  ENDLOOP.
ENDFORM.
View Code

相关文章: