写了一个相对复杂画面的demo,里面包含了树形结构,alv,长文本编辑器,以后有类似需求时,可以直接使用此框架。
- 主程序代码
REPORT zmm_rpt_538_wu0.
TYPES: BEGIN OF ty_tree_node,
id TYPE char18,
text TYPE char40,
END OF ty_tree_node.
TYPES: BEGIN OF stream,
default TYPE char100,
END OF stream.
*树
DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_container TYPE REF TO cl_gui_custom_container,
g_docking_container TYPE REF TO cl_gui_docking_container,
gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat.
*ALV
DATA: g_container TYPE REF TO cl_gui_custom_container,
g_grid TYPE REF TO cl_gui_alv_grid.
*长描述
DATA: g_container_t TYPE REF TO cl_gui_custom_container,
g_editor TYPE REF TO cl_gui_textedit,
g_textstream TYPE TABLE OF stream. "文本流
*屏幕字段
DATA: gvs_werks TYPE werks_d,
gvs_matnr TYPE matnr.
DATA: gs_sflight TYPE sflight, "Output-Table
gt_sflight TYPE TABLE OF sflight,
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.
START-OF-SELECTION.
CALL SCREEN 100.
MODULE pbo OUTPUT.
SET PF-STATUS '9001'.
* SET TITLEBAR 'MAINTITLE' WITH '树型ALV'.
gvs_werks = '3121'.
gvs_matnr = '1111111111111'.
IF g_alv_tree IS INITIAL.
*创建树形左菜单
PERFORM frm_init_tree.
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
*创建alv
PERFORM frm_create_alv.
*创建长描述输出框
PERFORM frm_create_longt.
ENDIF.
ENDMODULE. " PBO OUTPUT
MODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN '&F03' OR '&F12' OR '&F15'.
PERFORM frm_exit_program.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE. " PAI INPUT
FORM frm_init_tree.
DATA: l_tree_container_name(30) TYPE c.
DATA l_hierarchy_header TYPE treev_hhdr.
DATA lt_list_commentary TYPE slis_t_listheader.
*方法1,需要在屏幕上画出容器
* l_tree_container_name = 'CONTAINER1'.
*
* 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.
*方法2
*实例化容器
CREATE OBJECT g_docking_container
EXPORTING
side = cl_gui_docking_container=>dock_at_left
extension = 350
repid = sy-repid
dynnr = '0100'.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'(100).
ENDIF.
*实例化树控制器
CREATE OBJECT g_alv_tree
EXPORTING
* parent = g_custom_container
parent = g_docking_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 = '' "是否展示抬头备注
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 e208(00) WITH '实例化ALV TREE控制器失败!'. "
ENDIF.
*设置NODE描述字段信息
PERFORM frm_build_hierarchy_header CHANGING l_hierarchy_header.
*设置字段
PERFORM frm_build_fieldcategory.
*设置抬头备注
PERFORM frm_build_comment USING lt_list_commentary.
CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
*参考表结构建fieldcat,it_fieldcatalog则不用输入参数
* i_structure_name = 'SFLIGHT'
is_hierarchy_header = l_hierarchy_header
it_list_commentary = lt_list_commentary
CHANGING
it_outtab = gt_sflight "table must be empty !
it_fieldcatalog = gt_fcat. "fieldcat
PERFORM frm_jerry_create_tree.
CALL METHOD g_alv_tree->update_calculations.
PERFORM frm_register_events.
CALL METHOD g_alv_tree->frontend_update.
ENDFORM.
FORM frm_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.
ENDFORM.
FORM frm_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 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 frm_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 frm_exit_program.
* CALL METHOD g_custom_container->free.
CALL METHOD g_docking_container->free.
LEAVE PROGRAM.
ENDFORM.
FORM frm_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
FORM frm_build_comment USING pt_list_commentary TYPE slis_t_listheader.
DATA: ls_line TYPE slis_listheader.
REFRESH pt_list_commentary.
CLEAR ls_line.
ls_line-typ = 'S'.
ls_line-key = '创建日期:'.
ls_line-info = sy-datum.
APPEND ls_line TO pt_list_commentary.
ls_line-key = '创建时间:'.
ls_line-info = sy-uzeit.
APPEND ls_line TO pt_list_commentary.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_create_alv .
DATA: gs_layout TYPE lvc_s_layo.
DATA: gt_exclude TYPE ui_functions.
DATA: gs_variant TYPE disvariant.
CREATE OBJECT g_container
EXPORTING
container_name = 'CONTAINER1' "#EC NOTEXT
EXCEPTIONS
OTHERS = 1.
CREATE OBJECT g_grid
EXPORTING
i_appl_events = 'X'
"i_parent = g_splitter->bottom_right_container.
i_parent = g_container.
CALL METHOD g_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1.
gs_layout-info_fname = 'CLR'. " 行颜色字段
gs_variant-report = sy-repid.
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
is_variant = gs_variant
i_save = 'U'
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
CHANGING
* it_fieldcatalog = lt_fieldcatalog_alv
it_outtab = gt_sflight[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_longt
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_create_longt .
PERFORM frm_get_text.
IF g_container_t IS INITIAL.
CREATE OBJECT g_container_t
EXPORTING
container_name = 'CONT_LONG'.
CREATE OBJECT g_editor
EXPORTING
parent = g_container_t
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = 140
wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
ENDIF.
CALL METHOD g_editor->set_text_as_stream EXPORTING text = g_textstream. "写数据
CALL METHOD g_editor->set_toolbar_mode EXPORTING toolbar_mode = 0. "去掉工具栏
CALL METHOD g_editor->set_statusbar_mode EXPORTING statusbar_mode = 0. "去掉状态栏
CALL METHOD g_editor->set_readonly_mode "仅输出
EXPORTING
readonly_mode = '1'
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_text
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_text .
DATA:lv_name TYPE tdobname,
lt_tline TYPE STANDARD TABLE OF tline.
lv_name = '4500001333'.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'F01'
language = sy-langu
name = lv_name
object = 'EKKO'
TABLES
lines = lt_tline
EXCEPTIONS ##FM_SUBRC_OK
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
EXPORTING
language = sy-langu
TABLES
itf_text = lt_tline
text_stream = g_textstream.
ENDFORM.
- 100屏幕
PROCESS BEFORE OUTPUT.
MODULE pbo .
PROCESS AFTER INPUT.
MODULE pai .
- 100屏幕布局
- 100屏幕元素清单
- 最后看一下画面效果吧