SAP ABAP 树形菜单栏

写了一个相对复杂画面的demo,里面包含了树形结构,alv,长文本编辑器,以后有类似需求时,可以直接使用此框架。

  1. 主程序代码
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.
  1. 100屏幕
PROCESS BEFORE OUTPUT.
  MODULE pbo .

PROCESS AFTER INPUT.
  MODULE pai .
  1. 100屏幕布局
    在这里插入图片描述
  2. 100屏幕元素清单
    在这里插入图片描述
  3. 最后看一下画面效果吧
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值