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.