前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matinal:SAP ABAP 做一个ALV TREE的功能【代码直接可用】

matinal:SAP ABAP 做一个ALV TREE的功能【代码直接可用】

作者头像
matinal
发布2023-10-14 15:20:28
2980
发布2023-10-14 15:20:28
举报
文章被收录于专栏:SAP TechnicalSAP Technical
代码语言:javascript
复制
 PROCESS BEFORE OUTPUT.
   MODULE pbo .
 
 PROCESS AFTER INPUT.
   MODULE pai .
代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档