SAP ABAP ALV TREE(项目 WBS展开)

发布时间 2023-07-27 10:12:24作者: 年轻的小菜鸟

该程序是初版,有一些BUG请见谅

 主程序

*&---------------------------------------------------------------------*
*& Report ZTYFIR00940
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztyfir00950.

INCLUDE ZTYFIR00950_TOP.
INCLUDE ZTYFIR00950_PBO .
INCLUDE ZTYFIR00950_PAI .
INCLUDE ZTYFIR00950_FRM.

AT SELECTION-SCREEN.
  PERFORM frm_authority_check.

START-OF-SELECTION.

  CALL SCREEN 0100.
View Code

TOP

  1 *&---------------------------------------------------------------------*
  2 *&  包含                ZTYFIR00950_TOP
  3 *&---------------------------------------------------------------------*
  4 TABLES:proj,prps.
  5 
  6 TYPES:BEGIN OF ty_data,
  7       posid TYPE prps-posid,"项目/WBS
  8       post1 TYPE prps-post1,"项目/WBS名称
  9       stufe TYPE prps-stufe,"层级
 10       prart TYPE prps-prart,"项目类型
 11       pratx TYPE tcj1t-pratx,"项目类型描述
 12       rtcur TYPE char3,"币种 默认RMB
 13       objnr TYPE prps-objnr,"对象编号
 14       pspnr TYPE proj-pspnr,"项目内码
 15       pspnr1 TYPE prps-pspnr,"WBS内码
 16       ys_sum TYPE bpge-wlges,"总体-预算金额
 17       cb_sum TYPE bpge-wlges,"总体-成本金额
 18       jz_sum TYPE bpge-wlges,"总体-结转金额
 19       fp_sum TYPE bpge-wlges,"总体-发票金额
 20       fk_sum TYPE bpge-wlges,"总体-付款金额
 21       zz_sum TYPE bpge-wlges,"总体-转资金额
 22       ys_yy TYPE bpge-wlges, "2023-预算金额
 23       cb_yy TYPE bpge-wlges,"2023-成本金额
 24       jz_yy TYPE bpge-wlges,"2023-结转金额
 25       fp_yy TYPE bpge-wlges,"2023-发票金额
 26       fk_yy TYPE bpge-wlges,"2023-付款金额
 27       zz_yy TYPE bpge-wlges,"2023-转资金额
 28       cb_mm TYPE bpge-wlges,"5月-成本金额
 29       jz_mm TYPE bpge-wlges,"5月-结转金额
 30       fp_mm TYPE bpge-wlges,"5月-发票金额
 31       fk_mm TYPE bpge-wlges,"5月-付款金额
 32       zz_mm TYPE bpge-wlges,"5月-转资金额
 33       END OF ty_data,
 34 
 35       BEGIN OF ty_prps,
 36       pspnr TYPE prps-pspnr,
 37       post1 TYPE prps-post1,
 38       prart TYPE prps-prart,
 39       objnr TYPE prps-objnr,
 40       END OF ty_prps.
 41 
 42 DATA:lt_data TYPE TABLE OF ty_data,
 43      ls_data TYPE ty_data,
 44      lt_prps TYPE TABLE OF ty_prps,
 45      ls_prps TYPE ty_prps.
 46 DATA:BEGIN OF ls_bpge,
 47      objnr TYPE bpge-objnr,
 48      wlges TYPE bpge-wlges,
 49      END OF ls_bpge,
 50      lt_bpge LIKE STANDARD TABLE OF ls_bpge.
 51 
 52 DATA ok_code TYPE sy-ucomm.
 53 DATA tree1  TYPE REF TO cl_gui_alv_tree.
 54 DATA: gt_data      TYPE TABLE OF ty_data,"sflight OCCURS 0,      "Output-Table
 55       gt_sflight      TYPE sflight OCCURS 0,
 56       gt_fieldcatalog TYPE lvc_t_fcat. "Fieldcatalog
 57 
 58 *&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TAB_SHEET'
 59 CONSTANTS: BEGIN OF C_TAB_SHEET,
 60              TAB1 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC2',
 61              TAB2 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC3',
 62              TAB3 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC4',
 63              TAB4 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC5',
 64              TAB5 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC6',
 65              TAB6 LIKE SY-UCOMM VALUE 'TAB_SHEET_FC7',
 66            END OF C_TAB_SHEET.
 67 *&SPWIZARD: DATA FOR TABSTRIP 'TAB_SHEET'
 68 CONTROLS:  TAB_SHEET TYPE TABSTRIP.
 69 DATA:      BEGIN OF G_TAB_SHEET,
 70              SUBSCREEN   LIKE SY-DYNNR,
 71              PROG        LIKE SY-REPID VALUE 'ZTYFIR00950',
 72              PRESSED_TAB LIKE SY-UCOMM VALUE C_TAB_SHEET-TAB1,
 73            END OF G_TAB_SHEET.
 74 
 75 DATA gf_initialized           TYPE abap_bool VALUE abap_false.
 76 DATA gf_navigator_initialized TYPE abap_bool VALUE abap_false.
 77 
 78 DATA:cont_docking       TYPE REF TO cl_gui_docking_container,
 79      ctrl_toolbar       TYPE REF TO cl_gui_toolbar,
 80      ctrl_splitter      TYPE REF TO cl_gui_splitter_container,
 81 
 82      go_docking         TYPE REF TO cl_gui_docking_container,
 83      go_splitter1       TYPE REF TO cl_gui_splitter_container,
 84      go_sp_container1   TYPE REF TO cl_gui_container,      "screen1  的容器
 85      go_sp_container2   TYPE REF TO cl_gui_container,      "screen2  的容器
 86      go_alv_grid1       TYPE REF TO cl_gui_alv_grid,       "alv1
 87 
 88      cont_toolbar       TYPE REF TO cl_gui_container,
 89      ctrl_tree          TYPE REF TO cl_gui_column_tree,
 90      cont_tree          TYPE REF TO cl_gui_container,
 91      cont_tree_agenda   TYPE REF TO cl_gui_container,
 92      worklist_container TYPE REF TO cl_gui_container,
 93      g_hierarchy_header TYPE treev_hhdr.
 94 
 95 *----------------------------------------------------------------------*
 96 *       CLASS lcl_nav_event_receiver DEFINITION
 97 *----------------------------------------------------------------------*
 98 *
 99 *----------------------------------------------------------------------*
100 CLASS lcl_tree_event_receiver DEFINITION.
101   PUBLIC SECTION.
102     METHODS:
103       handle_double_click
104         for event node_double_click of cl_gui_alv_tree
105         importing node_key,
106       handle_item_double_click
107       FOR EVENT item_double_click OF cl_gui_alv_tree
108         IMPORTING fieldname node_key.
109 
110 ENDCLASS.                    "lcl_nav_event_receiver DEFINITION
111 *----------------------------------------------------------------------*
112 *       CLASS lcl_nav_event_receiver IMPLEMENTATION
113 *----------------------------------------------------------------------*
114 *
115 *----------------------------------------------------------------------*
116 CLASS lcl_tree_event_receiver IMPLEMENTATION.
117   METHOD handle_double_click.
118     PERFORM tree_node_double_click USING node_key.
119   ENDMETHOD.                    "link_click
120   METHOD handle_item_double_click.
121     DATA: l_value TYPE lvc_value,
122           l_layi  TYPE lvc_t_layi,
123           l_layn  TYPE lvc_s_layn .
124 
125     CALL METHOD tree1->get_outtab_line
126       EXPORTING
127         i_node_key     = node_key
128       IMPORTING
129         e_outtab_line  = ls_data
130         e_node_text    = l_value
131         et_item_layout = l_layi
132         es_node_layout = l_layn
133       EXCEPTIONS
134         node_not_found = 1
135         OTHERS         = 2.
136     IF sy-subrc = 0.
137       SET PARAMETER ID 'PRO' FIELD ls_data-posid.
138       CALL TRANSACTION 'CJ03' AND SKIP FIRST SCREEN.
139     ENDIF.
140 
141   ENDMETHOD.
142 ENDCLASS.                    "lcl_nav_event_receiver IMPLEMENTATION
143 
144 
145 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
146 PARAMETERS:p_bukrs     TYPE bkpf-bukrs OBLIGATORY.
147 PARAMETERS:p_gjahr     TYPE bkpf-gjahr OBLIGATORY DEFAULT sy-datum+0(4).
148 PARAMETERS:p_monat     TYPE bkpf-monat OBLIGATORY DEFAULT sy-datum+4(2).
149 SELECT-OPTIONS:s_prart FOR prps-prart.
150 SELECT-OPTIONS:s_pspid FOR proj-pspid.
151 SELECT-OPTIONS:s_posid FOR prps-posid.
152 SELECTION-SCREEN END OF BLOCK b1.
View Code

PBO

 1 *&---------------------------------------------------------------------*
 2 *&  Include  ZTYFIR00950_PBO
 3 *&---------------------------------------------------------------------*
 4 
 5 *&SPWIZARD: OUTPUT MODULE FOR TS 'TAB_SHEET'. DO NOT CHANGE THIS LINE!
 6 *&SPWIZARD: SETS ACTIVE TAB
 7 MODULE TAB_SHEET_ACTIVE_TAB_SET OUTPUT.
 8   TAB_SHEET-ACTIVETAB = G_TAB_SHEET-PRESSED_TAB.
 9   CASE G_TAB_SHEET-PRESSED_TAB.
10     WHEN C_TAB_SHEET-TAB1.
11       G_TAB_SHEET-SUBSCREEN = '0102'.
12     WHEN C_TAB_SHEET-TAB2.
13       G_TAB_SHEET-SUBSCREEN = '0103'.
14     WHEN C_TAB_SHEET-TAB3.
15       G_TAB_SHEET-SUBSCREEN = '0104'.
16     WHEN C_TAB_SHEET-TAB4.
17       G_TAB_SHEET-SUBSCREEN = '0105'.
18     WHEN C_TAB_SHEET-TAB5.
19       G_TAB_SHEET-SUBSCREEN = '0106'.
20     WHEN C_TAB_SHEET-TAB6.
21       G_TAB_SHEET-SUBSCREEN = '0107'.
22     WHEN OTHERS.
23 *&SPWIZARD:      DO NOTHING
24   ENDCASE.
25 ENDMODULE.
26 
27 *&---------------------------------------------------------------------*
28 *&      Module  STATUS_0100  OUTPUT
29 *&---------------------------------------------------------------------*
30 *       text
31 *----------------------------------------------------------------------*
32 MODULE status_0100 OUTPUT.
33 *工具栏
34   PERFORM status_0100.
35 
36 *屏幕拆分
37   PERFORM init_docking.
38 
39 *初始化 ALV
40 *  PERFORM initial_alv.
41 
42 ENDMODULE.
View Code

PAI

*&---------------------------------------------------------------------*
*&  Include  ZTYFIR00950_PAI
*&---------------------------------------------------------------------*

*&SPWIZARD: INPUT MODULE FOR TS 'TAB_SHEET'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE TAB_SHEET_ACTIVE_TAB_GET INPUT.
  OK_CODE = SY-UCOMM.
  CASE OK_CODE.
    WHEN C_TAB_SHEET-TAB1.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB1.
    WHEN C_TAB_SHEET-TAB2.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB2.
    WHEN C_TAB_SHEET-TAB3.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB3.
    WHEN C_TAB_SHEET-TAB4.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB4.
    WHEN C_TAB_SHEET-TAB5.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB5.
    WHEN C_TAB_SHEET-TAB6.
      G_TAB_SHEET-PRESSED_TAB = C_TAB_SHEET-TAB6.
    WHEN OTHERS.
*&SPWIZARD:      DO NOTHING
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  PERFORM user_command_0100.
ENDMODULE.
View Code

FRM

*&---------------------------------------------------------------------*
*&  包含                ZTYFIR00950_FRM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  TREE_NODE_LINK_CLICK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NODE_KEY  text
*----------------------------------------------------------------------*
FORM tree_node_double_click  USING    p_node_key TYPE lvc_nkey.
  DATA:lv_tab_sheet TYPE char20.
  BREAK-POINT.
  CHECK NOT p_node_key IS INITIAL.
  lv_tab_sheet = tab_sheet.
  CASE lv_tab_sheet.
    WHEN 'TAB_SHEET_FC2'."预算
      PERFORM frm_ys_data.
  ENDCASE.

* CALL METHOD tree1->get_outtab_line
*    EXPORTING
*      i_node_key    = p_node_key
*    IMPORTING
*      e_outtab_line = ls_400.
*  CHECK ls_400 IS NOT INITIAL.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  STATUS_0100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM status_0100.
  SET PF-STATUS '0100'.
  SET TITLEBAR '0100' WITH '项目执行情况表'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND_0100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM user_command_0100.
  DATA lv_code TYPE sy-ucomm.
  CLEAR:lv_code.
  lv_code = ok_code.

  CLEAR:ok_code.
  CASE lv_code.
    WHEN 'BACK'.
      PERFORM call_back.
    WHEN 'EXIT'.
      PERFORM call_exit.
    WHEN 'CANLE'.
      PERFORM call_canle.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CALL_BACK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM call_back.
  LEAVE TO SCREEN 0.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CALL_EXIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM call_exit.
  LEAVE TO SCREEN 0.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CALL_CANLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM call_canle.
  LEAVE TO SCREEN 0.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  INITIAL_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM initial_alv.

  DATA: l_repid            LIKE sy-repid,
        l_dynnr            LIKE sy-dynnr,
        l_hierarchy_header TYPE treev_hhdr,
        lt_events          TYPE cntl_simple_events,
        l_events           TYPE cntl_simple_event,
        l_extension        TYPE i VALUE 200,
        l_pref_value       TYPE char32.

  CHECK gf_navigator_initialized EQ abap_false.
  gf_navigator_initialized = abap_true.


*  CREATE OBJECT ctrl_event_receiver.

  CREATE OBJECT cont_docking
    EXPORTING
      extension = l_extension.

  CREATE OBJECT ctrl_splitter
    EXPORTING
      parent            = cont_docking
      rows              = 2
      columns           = 1
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  CALL METHOD ctrl_splitter->set_row_height
    EXPORTING
      id                = 1
      height            = 40
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*  CALL METHOD ctrl_splitter->set_row_sash
*    EXPORTING
*      id    = 1
*      type  = cl_gui_splitter_container=>type_movable
*      value = cl_gui_splitter_container=>false.
*
*  CALL METHOD ctrl_splitter->set_border
*    EXPORTING
*      border = space.
*
*  CALL METHOD ctrl_splitter->set_row_mode
*    EXPORTING
*      mode = cl_gui_splitter_container=>mode_absolute.
*
*  CALL METHOD ctrl_splitter->get_container
*    EXPORTING
*      row       = 2
*      column    = 1
*    RECEIVING
*      container = cont_tree.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  INIT_DOCKING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init_docking.

  DATA: l_repid            LIKE sy-repid,
        l_dynnr            LIKE sy-dynnr,
        l_hierarchy_header TYPE treev_hhdr,
        lt_events          TYPE cntl_simple_events,
        l_events           TYPE cntl_simple_event,
        l_extension        TYPE i VALUE 200,
        l_pref_value       TYPE char32.

  CHECK gf_navigator_initialized EQ abap_false.
  gf_navigator_initialized = abap_true.

**创建docking
  CREATE OBJECT go_docking
    EXPORTING
      repid     = sy-repid
      dynnr     = sy-dynnr
      extension = '150'         "屏幕大小
      side      = cl_gui_docking_container=>dock_at_top.

*将屏幕拆分成上下两个屏幕:两行一列
  CREATE OBJECT go_splitter1
    EXPORTING
      parent  = go_docking
      rows    = 1  "2
      columns = 1.

*第一个屏幕放在第一行第一列
  CALL METHOD go_splitter1->get_container
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = go_sp_container1.

*第一个屏幕高度
  CALL METHOD go_splitter1->set_row_height
    EXPORTING
      id     = 1
      height = 50.

**第二个屏幕 放在第二行第一列
*  CALL METHOD go_splitter1->get_container
*    EXPORTING
*      row       = 2
*      column    = 1
*    RECEIVING
*      container = go_sp_container2.

**--容器1
*  CREATE OBJECT go_alv_grid1
*    EXPORTING
*      i_parent          = go_sp_container1
*    EXCEPTIONS
*      error_cntl_create = 1
*      error_cntl_init   = 2
*      error_cntl_link   = 3
*      error_dp_create   = 4
*      OTHERS            = 5.
*  IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*  ENDIF.
****************************************
  IF tree1 IS INITIAL.
    PERFORM init_tree.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  INIT_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init_tree .

* create fieldcatalog for structure sflight
  PERFORM build_fieldcatalog.

* create container for alv-tree
  DATA: l_tree_container_name(30) TYPE c,
        l_custom_container        TYPE REF TO cl_gui_custom_container.
  l_tree_container_name = 'TREE1'.

*  IF sy-batch IS INITIAL.
*    CREATE OBJECT l_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'.                        "#EC NOTEXT
*    ENDIF.
*  ENDIF.

* create tree control
  CREATE OBJECT tree1
    EXPORTING
      parent                      = go_sp_container1 "l_custom_container
      node_selection_mode         = cl_gui_column_tree=>node_sel_mode_multiple
      item_selection              = abap_true    "YI3K118558
      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: lt_list_commentary TYPE slis_t_listheader,
        l_logo             TYPE sdydo_value.


* repid for saving variants
  DATA: ls_variant TYPE disvariant.
  ls_variant-report = sy-repid.

  PERFORM build_hierarchy_header.
* create emty tree-control
  CALL METHOD tree1->set_table_for_first_display
    EXPORTING
      is_hierarchy_header = g_hierarchy_header
      it_list_commentary  = lt_list_commentary
      i_logo              = l_logo
      i_background_id     = 'ALV_BACKGROUND'
      i_save              = 'A'
      is_variant          = ls_variant
    CHANGING
      it_outtab           = gt_data "table must be emty !!
      it_fieldcatalog     = gt_fieldcatalog.

* create hierarchy
  PERFORM create_hierarchy.

* add own functioncodes to the toolbar
*  PERFORM change_toolbar.

* register events
  PERFORM register_events.                                  "YI3K118558
* adjust column_width
* call method tree1->COLUMN_OPTIMIZE.
  CALL METHOD tree1->frontend_update.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .
  DATA: ls_fieldcatalog TYPE lvc_s_fcat.
  REFRESH gt_fieldcatalog.

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'POSID'.
  ls_fieldcatalog-coltext = '项目/WBS元素'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '30'.
  ls_fieldcatalog-outputlen = '30'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'POST1'.
  ls_fieldcatalog-coltext = '项目/WBS名称'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '30'.
  ls_fieldcatalog-outputlen = '30'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'PRART'.
  ls_fieldcatalog-coltext = '项目类型'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '4'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'PRATX'.
  ls_fieldcatalog-coltext = '项目类型描述'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  ls_fieldcatalog-outputlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'RTCUR'.
  ls_fieldcatalog-coltext = '币种'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '4'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'YS_SUM'.
  ls_fieldcatalog-coltext = '总体预算金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'CB_SUM'.
  ls_fieldcatalog-coltext = '总体成本金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'JZ_SUM'.
  ls_fieldcatalog-coltext = '总体结转金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FP_SUM'.
  ls_fieldcatalog-coltext = '总体发票金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FK_SUM'.
  ls_fieldcatalog-coltext = '总体付款金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'ZZ_SUM'.
  ls_fieldcatalog-coltext = '总体转资金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'YS_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-预算金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'CB_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-成本金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'JZ_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-结转金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FP_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-发票金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FK_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-付款金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'ZZ_YY'.
  ls_fieldcatalog-coltext = p_gjahr && '-转资金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'CB_MM'.
  ls_fieldcatalog-coltext = p_monat && '月-成本金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'JZ_MM'.
  ls_fieldcatalog-coltext = p_monat && '月-结转金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FP_MM'.
  ls_fieldcatalog-coltext = p_monat && '月-发票金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'FK_MM'.
  ls_fieldcatalog-coltext = p_monat && '月-付款金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .

  CLEAR ls_fieldcatalog.
  ls_fieldcatalog-fieldname = 'ZZ_MM'.
  ls_fieldcatalog-coltext = p_monat && '月-转资金额'.
  ls_fieldcatalog-key = ''.
  ls_fieldcatalog-dd_outlen = '10'.
  APPEND ls_fieldcatalog TO gt_fieldcatalog .


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CREATE_HIERARCHY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_hierarchy .
  DATA: lt_nodes       TYPE TABLE OF lvc_nkey WITH HEADER LINE,
        l_cur_node     TYPE lvc_nkey,
        l_former_stufe TYPE prps-stufe,
        l_index        TYPE i.
*get data
  PERFORM frm_get_data.

  SORT lt_data BY posid stufe prart.

  LOOP AT lt_data INTO ls_data.
    IF ls_data-stufe = '1'.
      REFRESH lt_nodes.
      l_index = ls_data-stufe.
      PERFORM add_nodes USING    ls_data
                                 ''
                        CHANGING l_cur_node.
      READ TABLE lt_nodes INDEX l_index.
      IF sy-subrc NE 0.
        APPEND l_cur_node TO lt_nodes.
      ENDIF.

    ELSEIF ls_data-stufe > l_former_stufe.      "on change of l_yyyymm
      l_index = ls_data-stufe - 1.
      READ TABLE lt_nodes INDEX l_index.

      PERFORM add_nodes USING    ls_data
                                 lt_nodes
                        CHANGING l_cur_node.
*---->保存新的当前节点
      APPEND l_cur_node TO lt_nodes.
    ELSEIF ls_data-stufe < l_former_stufe.
      l_index = ls_data-stufe - 1.
      READ TABLE lt_nodes INDEX l_index.

      PERFORM add_nodes USING    ls_data
                                 lt_nodes
                        CHANGING l_cur_node.
*---->将当前节点及之后后的所有临时存储节点KEY删除
      l_index = l_index + 1.
      DELETE lt_nodes INDEX l_index.
      DO.
        READ TABLE lt_nodes INDEX l_index.
        IF sy-subrc = 0.
          DELETE lt_nodes INDEX l_index.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
*---->保存新的当前节点
      APPEND l_cur_node TO lt_nodes.
    ELSE.
      l_index = ls_data-stufe - 1.
      READ TABLE lt_nodes INDEX l_index.
      PERFORM add_nodes USING    ls_data
                                 lt_nodes
                        CHANGING l_cur_node.
    ENDIF.
    l_former_stufe = ls_data-stufe.

  ENDLOOP.

* calculate totals
  CALL METHOD tree1->update_calculations.

* this method must be called to send the data to the frontend
  CALL METHOD tree1->frontend_update.


ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  REGISTER_EVENTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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 tree1->get_registered_events
    IMPORTING
      events = lt_events.
  CLEAR l_event.
  l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
  APPEND l_event TO lt_events.

  CLEAR l_event.
  l_event-eventid = cl_gui_column_tree=>eventid_expand_no_children.
  APPEND l_event TO lt_events.

  CLEAR l_event.
  l_event-eventid = cl_gui_column_tree=>eventid_header_click.
  APPEND l_event TO lt_events.

  CLEAR l_event.
  l_event-eventid = cl_gui_column_tree=>eventid_item_double_click.
  APPEND l_event TO lt_events.

  CALL METHOD tree1->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_double_click FOR tree1.
  SET HANDLER l_event_receiver->handle_item_double_click FOR tree1.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_YS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_ys_data .

*SET PARAMETER ID 'PSP' FIELD '11205018395'.
*SET PARAMETER ID 'PRO' FIELD '11205018395'.
*call TRANSACTION 'CJI3'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_authority_check .
  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
                      ID 'BUKRS' FIELD p_bukrs.
  IF sy-subrc NE 0.
    DATA(lv_mess) = '您没有公司代码' && p_bukrs && '的查询权限' .
    MESSAGE lv_mess TYPE 'E'.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BUILD_HIERARCHY_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_hierarchy_header .
  CLEAR g_hierarchy_header.
  g_hierarchy_header-heading = '项目/WBS'.
  g_hierarchy_header-tooltip =  '项目/WBS'.
  g_hierarchy_header-width = 30.
  g_hierarchy_header-width_pix = ''.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  DATA: gt_prps TYPE TABLE OF prps_co.
  RANGES:wbs_to_select    FOR prps-pspnr,
         wbs_to_select_up FOR prps-pspnr,
         r_pspnr FOR proj-pspnr.
  "获取符合条件的项目定义
  SELECT DISTINCT  a~pspnr
    INTO TABLE @DATA(lt_posid)
    FROM proj AS a
    INNER JOIN prps AS b ON a~pspnr = b~psphi
    WHERE a~pspid IN @s_pspid"项目定义
      AND b~posid IN @s_posid"WBS元素
      AND b~prart IN @s_prart
      AND a~vbukr = @p_bukrs
      AND b~pbukr = @p_bukrs.
  "根据项目定义获取WBS
  REFRESH:r_pspnr,wbs_to_select,wbs_to_select_up.
  CLEAR gt_prps.
  LOOP AT lt_posid INTO DATA(ls_posid).
    r_pspnr-sign = 'I'.
    r_pspnr-option = 'EQ'.
    r_pspnr-low = ls_posid-pspnr.
    APPEND r_pspnr.
    CLEAR r_pspnr.
  ENDLOOP.
  SORT r_pspnr.
  DELETE ADJACENT DUPLICATES FROM r_pspnr COMPARING ALL FIELDS.
  IF lt_posid IS INITIAL.
    MESSAGE '没有符合条件的数据' TYPE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  CALL FUNCTION 'CJDB_FILL_HIERARCHY'
    TABLES
      i_proj                 = r_pspnr[]
      e_prps_co              = gt_prps
      e_prps_not_yet_read    = wbs_to_select
      e_prps_not_yet_read_up = wbs_to_select_up.
  IF gt_prps IS NOT INITIAL.
    SORT gt_prps BY psphi pspnr stufe.
    LOOP AT gt_prps INTO DATA(gs_prps).
*      "项目定义转外码
*      CALL FUNCTION 'CONVERSION_EXIT_KONPD_OUTPUT'
*        EXPORTING
*          input  = gs_prps-psphi
*        IMPORTING
*          output = ls_data-posid.
      "内外码转换
      CALL FUNCTION 'CONVERSION_EXIT_ABPSP_OUTPUT'
        EXPORTING
          input  = gs_prps-pspnr
        IMPORTING
          output = ls_data-posid.
      ls_data-pspnr = gs_prps-psphi."项目定义内码
      ls_data-pspnr1 =  gs_prps-pspnr."WBS内码
      ls_data-stufe = gs_prps-stufe.
      APPEND ls_data TO lt_data.
    ENDLOOP.
    SORT lt_data BY posid stufe prart.

    IF lt_data IS NOT INITIAL.
      "项目定义描述
      SELECT pspnr,post1
        INTO TABLE @DATA(lt_proj)
        FROM proj
        FOR ALL ENTRIES IN @lt_data
        WHERE pspnr = @lt_data-pspnr.
      SORT lt_proj BY pspnr.
      "WBS元素描述 项目类型
      SELECT pspnr post1 prart objnr
        INTO CORRESPONDING FIELDS OF TABLE lt_prps
        FROM prps
        FOR ALL ENTRIES IN lt_data
        WHERE pspnr = lt_data-pspnr1.
      SORT lt_prps BY pspnr objnr.
      "项目类型描述
      SELECT prart,pratx
        INTO TABLE @DATA(lt_tcj1t)
        FROM tcj1t
        WHERE langu = @sy-langu.
      SORT lt_tcj1t BY prart.

      LOOP AT lt_data INTO ls_data.
        READ TABLE lt_proj INTO DATA(ls_proj) WITH KEY pspnr = ls_data-pspnr BINARY SEARCH.
        IF sy-subrc = 0.
          ls_data-post1 = ls_proj-post1.
        ENDIF.
        READ TABLE lt_prps INTO ls_prps WITH KEY pspnr = ls_data-pspnr1 BINARY SEARCH.
        IF sy-subrc = 0.
          ls_data-post1 = ls_prps-post1.
          ls_data-prart = ls_prps-prart.
          ls_data-objnr = ls_prps-objnr.
        ENDIF.
        READ TABLE lt_tcj1t INTO DATA(ls_tcj1t) WITH KEY prart = ls_data-prart BINARY SEARCH.
        IF sy-subrc = 0.
          ls_data-pratx = ls_tcj1t-pratx.
        ENDIF.
        ls_data-rtcur = 'RMB'.
        MODIFY lt_data FROM ls_data.
      ENDLOOP.


      IF lt_prps IS NOT INITIAL.
        "总体-预算金额
        PERFORM frm_get_ys_sum.

        "2023年度-预算金额
        PERFORM frm_get_ys_yy.
      ENDIF.

      "

    ENDIF.

  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  ADD_NODES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_DATA  text
*      -->P_0592   text
*      <--P_L_CUR_NODE  text
*----------------------------------------------------------------------*
FORM add_nodes  USING     ps_wbs TYPE ty_data
                          p_cnode_key TYPE lvc_nkey
                CHANGING  p_nnode_key TYPE lvc_nkey.

  DATA: l_node_text TYPE lvc_value.

  CALL FUNCTION 'CONVERSION_EXIT_ABPSN_OUTPUT'
    EXPORTING
      input  = ps_wbs-posid
    IMPORTING
      output = l_node_text.

  CALL METHOD tree1->add_node
    EXPORTING
      i_relat_node_key = p_cnode_key
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = l_node_text
      is_outtab_line   = ps_wbs
    IMPORTING
      e_new_node_key   = p_nnode_key.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_YS_SUM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_ys_sum .
  SELECT objnr
         wlges
    INTO TABLE lt_bpge
    FROM bpge
    FOR ALL ENTRIES IN lt_prps
    WHERE objnr = lt_prps-objnr
      AND wrttp = '41'.
  SORT lt_bpge BY objnr.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_YS_YY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_ys_yy .
*  SELECT objnr
*         wlges
*      INTO TABLE lt_bpge
*      FROM bpge
*      FOR ALL ENTRIES IN lt_prps
*      WHERE objnr = lt_prps-objnr
*        AND wrttp = '41'.
*  SORT lt_bpge BY objnr.
ENDFORM.
View Code

100屏幕:

101屏幕在100屏幕基础上画页签自动生成代码