REPORT Z_MATINAL.
TYPES: BEGIN OF ty_tree_node,
id TYPE char18,
text TYPE char40,
END OF ty_tree_node.
DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_container TYPE REF TO cl_gui_custom_container.
DATA: gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat.
DATA: gs_sflight TYPE sflight , "Output-Table
gt_sflight TYPE TABLE OF sflight,
gt_scala TYPE STANDARD TABLE OF ty_tree_node,
ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm. "OK-Code
CLASS lcl_tree_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_node_double_click
FOR EVENT node_double_click OF cl_gui_alv_tree
IMPORTING node_key sender.
METHODS handle_item_double_click
FOR EVENT item_double_click OF cl_gui_alv_tree
IMPORTING fieldname node_key.
ENDCLASS.
CLASS lcl_tree_event_receiver IMPLEMENTATION.
METHOD handle_node_double_click.
DATA: lt_children TYPE lvc_t_nkey,
ls_children TYPE lvc_nkey.
"根据点击的结点找出所有的下一个结点
CALL METHOD sender->get_children
EXPORTING
i_node_key = node_key
IMPORTING
et_children = lt_children.
IF NOT lt_children IS INITIAL.
"展开结点
CALL METHOD sender->expand_node
EXPORTING
i_node_key = node_key
i_level_count = 2.
ENDIF.
ENDMETHOD.
METHOD handle_item_double_click.
DATA: l_value TYPE lvc_value,
l_layi TYPE lvc_t_layi,
l_layn TYPE lvc_s_layn.
CALL METHOD g_alv_tree->get_outtab_line
EXPORTING
i_node_key = node_key
IMPORTING
e_outtab_line = gs_sflight
e_node_text = l_value
et_item_layout = l_layi
es_node_layout = l_layn
EXCEPTIONS
node_not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
DATA:mseg TYPE string .
mseg = gs_sflight-price .
MESSAGE mseg TYPE 'I' .
ENDIF.
ENDMETHOD.
ENDCLASS.
END-OF-SELECTION.
CALL SCREEN 100.
MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'MAINTITLE' WITH '树型ALV'.
IF g_alv_tree IS INITIAL.
PERFORM init_tree.
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Automation Queue failure'(801)
txt1 = 'Internal error:'(802)
txt2 = 'A method in the automation queue'(803)
txt3 = 'caused a failure.'(804).
ENDIF.
ENDIF.
ENDMODULE. " PBO OUTPUT
MODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN '&F03' OR '&F12' OR '&F15'.
PERFORM exit_program.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE. " PAI INPUT
FORM init_tree.
DATA: l_tree_container_name(30) TYPE c.
l_tree_container_name = 'CCONTAINER1'.
CREATE OBJECT g_custom_container
EXPORTING
container_name = l_tree_container_name
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'(100).
ENDIF.
CREATE OBJECT g_alv_tree
EXPORTING
parent = g_custom_container
* node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "单选节点
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "多选节点
item_selection = 'X' "能否选中节点上的单个元素
no_html_header = 'X'
no_toolbar = ''
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
illegal_node_selection_mode = 5
failed = 6
illegal_column_name = 7.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.
DATA l_hierarchy_header TYPE treev_hhdr.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.
PERFORM build_fieldcategory.
CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
"这里可以填SE11的表,填了就参考这个表建fieldcat,下面fieldcat就不用输入参数
* i_structure_name = 'SFLIGHT'
is_hierarchy_header = l_hierarchy_header
CHANGING
it_outtab = gt_sflight "table must be empty !
it_fieldcatalog = gt_fcat. "fieldcat
PERFORM jerry_create_tree.
CALL METHOD g_alv_tree->update_calculations.
PERFORM register_events.
CALL METHOD g_alv_tree->frontend_update.
ENDFORM.
FORM build_fieldcategory .
CLEAR gs_fcat.
gs_fcat-fieldname = 'PRICE'.
gs_fcat-seltext = '航空运费'.
gs_fcat-coltext = '航空运费'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-do_sum = 'X' .
gs_fcat-h_ftype = 'AVG'.
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'CURRENCY'.
gs_fcat-seltext = '航线货币'.
gs_fcat-coltext = '航线货币'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'PLANETYPE'.
gs_fcat-seltext = '飞机类型'.
gs_fcat-coltext = '飞机类型'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSMAX'.
gs_fcat-seltext = '经济舱的最大容量'.
gs_fcat-coltext = '经济舱的最大容量'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSOCC'.
gs_fcat-seltext = '占据经济舱座位'.
gs_fcat-coltext = '占据经济舱座位'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'PAYMENTSUM'.
gs_fcat-seltext = '总计'.
gs_fcat-coltext = '总计'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSMAX_B'.
gs_fcat-seltext = '商务舱的最大容量'.
gs_fcat-coltext = '商务舱的最大容量'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSOCC_B'.
gs_fcat-seltext = '占据商务舱座位'.
gs_fcat-coltext = '占据商务舱座位'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSMAX_F'.
gs_fcat-seltext = '头等舱的最大容量'.
gs_fcat-coltext = '头等舱的最大容量'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'SEATSOCC_F'.
gs_fcat-seltext = '占据头等舱座位'.
gs_fcat-coltext = '占据头等舱座位'. " 字段输出名称
gs_fcat-no_zero = 'X' .
gs_fcat-just = 'L'.
gs_fcat-outputlen = '10'. " 输出长度
APPEND gs_fcat TO gt_fcat.
ENDFORM.
FORM jerry_create_tree.
DATA: p_relat_key TYPE lvc_nkey,
p_node_key1 TYPE lvc_nkey,
p_node_key2 TYPE lvc_nkey,
p_node_key3 TYPE lvc_nkey,
l_node_text TYPE lvc_value,
lv_line TYPE i.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_sflight
FROM sflight .
SORT gt_sflight BY carrid connid fldate .
lv_line = lines( gt_sflight ) .
LOOP AT gt_sflight ASSIGNING FIELD-SYMBOL(<fs_sflight>) FROM 0 TO lv_line .
AT NEW carrid .
CLEAR l_node_text .
l_node_text = <fs_sflight>-carrid .
* CALL FUNCTION 'CONVERSION_EXIT_ABPSN_OUTPUT'
* EXPORTING
* input = <fs_sflight>-carrid
* IMPORTING
* output = l_node_text.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
* is_outtab_line = <fs_sflight>
IMPORTING
e_new_node_key = p_node_key1.
ENDAT .
AT NEW connid .
CLEAR l_node_text .
l_node_text = <fs_sflight>-connid .
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_node_key1
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
* is_outtab_line = <fs_sflight>
IMPORTING
e_new_node_key = p_node_key2.
ENDAT .
CLEAR l_node_text .
l_node_text = <fs_sflight>-fldate .
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_node_key2
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = <fs_sflight>
IMPORTING
e_new_node_key = p_node_key3.
ENDLOOP .
ENDFORM.
FORM build_hierarchy_header CHANGING p_hierarchy_header TYPE treev_hhdr.
p_hierarchy_header-heading = '航班/航线号/日期'(300)."名称
p_hierarchy_header-tooltip = '停留显示'(400)."停留时显示
p_hierarchy_header-width = 30.
p_hierarchy_header-width_pix = ' '.
ENDFORM.
FORM exit_program.
CALL METHOD g_custom_container->free.
LEAVE PROGRAM.
ENDFORM.
FORM register_events .
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event,
l_event_receiver TYPE REF TO lcl_tree_event_receiver.
CALL METHOD g_alv_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_item_double_click.
APPEND l_event TO lt_events.
CALL METHOD g_alv_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.
CREATE OBJECT l_event_receiver.
SET HANDLER l_event_receiver->handle_node_double_click FOR g_alv_tree.
SET HANDLER l_event_receiver->handle_item_double_click FOR g_alv_tree.
ENDFORM. " register_events