二维码

[Tree] ALV Tree节点node的简单使用案例

Twilight发表于 2014-09-14 19:20Twilight 最后回复于 2014-09-14 19:20 [复制链接] 5065 0

在一些场景中,数据需要分层显示,比如 a sales order type 下面包含 sales order ,sales order包含 line items number,这种情况可用ALV tree解决
ALV Tree 1.gif

1、新建screen 100,画container,named:STREE;定义ok_code;逻辑流
2、新建screen 200,在屏幕上画2个输入框,named:budj(注意dec类型),rson;定义ok_code;逻辑流
alv tree 5.jpg
alv tree 6.jpg

程序代码:
  1. TABLES: vbak.
  2. CLASS cl_column_tree DEFINITION DEFERRED.
  3. DATA: g_app TYPE REF TO cl_column_tree,
  4.       g_cont TYPE REF TO cl_gui_custom_container,

  5. *On screen give custom container name as 'STREE'
  6.       g_tree TYPE REF TO cl_gui_column_tree,
  7.       tcode TYPE sy-ucomm,
  8.       ok_code TYPE sy-ucomm,
  9.       event TYPE cntl_simple_event,
  10.       t_event TYPE cntl_simple_events,
  11.       thhdr TYPE treev_hhdr.

  12. DATA: node_table TYPE treev_ntab,
  13.       item_table TYPE zitem_table, "table type of MTREEITM (prepared in SE11)
  14.       w_node TYPE treev_node,
  15.       w_item TYPE mtreeitm,
  16.       g_node_key TYPE tv_nodekey,
  17.       g_node TYPE tv_nodekey,
  18.       g_item TYPE tv_itmname.

  19. DATA: root TYPE tv_nodekey VALUE 'Root',
  20.       colm1 TYPE tv_itmname VALUE 'Column1',
  21.       colm2 TYPE tv_itmname VALUE 'Column2'.

  22. TYPES:BEGIN OF st_get,
  23.       vbeln TYPE vbak-vbeln,
  24.       auart TYPE vbak-auart,
  25.       netwr TYPE vbak-netwr,
  26.       END OF st_get.

  27. DATA: it_get TYPE STANDARD TABLE OF st_get,
  28.       wa_get TYPE st_get.

  29. TYPES:BEGIN OF st_sot,
  30.       auart TYPE vbak-auart,

  31.       END OF st_sot.

  32. DATA: it_sot TYPE STANDARD TABLE OF st_sot,
  33.       wa_sot TYPE st_sot.

  34. TYPES:BEGIN OF st_so,
  35.       vbeln TYPE vbak-vbeln,
  36.       auart TYPE vbak-auart,
  37.       netwr TYPE vbak-netwr,
  38.       END OF st_so.

  39. DATA: it_so TYPE STANDARD TABLE OF st_so,
  40.       wa_so TYPE st_so.

  41. TYPES:BEGIN OF st_line,
  42.       vbeln TYPE vbap-vbeln,
  43.       posnr TYPE vbap-posnr,
  44.       netwr TYPE vbap-netwr,
  45.       END OF st_line.

  46. DATA: it_line TYPE STANDARD TABLE OF st_line,
  47.       wa_line TYPE st_line.
  48. *-------------Screen 200 fields----------------------------------------*
  49. DATA: budj TYPE vbak-netwr,
  50.       rson TYPE string.

  51. *----------------------------------------------------------------------*
  52. *----------------------------------------------------------------------*
  53. *       CLASS cl_simple_tree DEFINITION
  54. *----------------------------------------------------------------------*
  55. *
  56. *----------------------------------------------------------------------*

  57. CLASS cl_column_tree DEFINITION.
  58.   PUBLIC SECTION.
  59.     METHODS: handle_node_double_click

  60.                            FOR EVENT node_double_click OF cl_gui_column_tree
  61.                IMPORTING
  62.                  node_key,
  63.              handle_item_double_click

  64.                            FOR EVENT item_double_click OF cl_gui_column_tree
  65.                IMPORTING
  66.                  node_key
  67.                  item_name,
  68.              handle_expand_no_children

  69.                            FOR EVENT expand_no_children OF cl_gui_column_tree
  70.                IMPORTING
  71.                  node_key.
  72. ENDCLASS.                    "cl_simple_tree DEFINITION


  73. *----------------------------------------------------------------------*
  74. *       CLASS cl_simple_tree IMPLEMENTATION
  75. *----------------------------------------------------------------------*
  76. *
  77. *----------------------------------------------------------------------*

  78. CLASS cl_column_tree IMPLEMENTATION.
  79.   METHOD handle_node_double_click.
  80.     g_node = node_key.
  81.   ENDMETHOD.                    "handle_node_double_click
  82.   METHOD handle_item_double_click.
  83.     g_node = node_key.
  84.     g_item = item_name.
  85.     IF g_item = colm2.
  86.     CALL SCREEN 200 STARTING AT 10 10
  87.                     ENDING AT 46 15.
  88.     IF budj IS NOT INITIAL.
  89.       PERFORM update_tree USING budj g_node g_item.
  90.     ENDIF.
  91.     ENDIF.
  92.   ENDMETHOD.

  93.   METHOD handle_expand_no_children.
  94.     g_node = node_key.
  95.   ENDMETHOD.                    "handle_expand_no_children
  96. ENDCLASS.                    "cl_simple_tree IMPLEMENTATION

  97. SELECTION-SCREEN: BEGIN OF BLOCK mgrp.
  98. SELECT-OPTIONS: sdtype FOR vbak-auart.
  99. SELECTION-SCREEN: END OF BLOCK mgrp.

  100. START-OF-SELECTION.

  101. CREATE OBJECT g_app.

  102.   SELECT * FROM vbak INTO CORRESPONDING FIELDS OF TABLE it_get
  103.     WHERE auart IN sdtype.

  104.   LOOP AT it_get INTO wa_get.
  105.     MOVE-CORRESPONDING wa_get TO wa_sot.
  106.     MOVE-CORRESPONDING wa_get TO wa_so.
  107.     APPEND wa_sot TO it_sot.
  108.     APPEND wa_so TO it_so.
  109.   ENDLOOP.

  110.   SORT it_sot BY auart.
  111.   DELETE ADJACENT DUPLICATES FROM it_sot.

  112.   SORT it_so BY vbeln.
  113.   DELETE ADJACENT DUPLICATES FROM it_so COMPARING vbeln.

  114.   SELECT * FROM vbap INTO CORRESPONDING FIELDS OF TABLE it_line
  115.     FOR ALL ENTRIES IN it_so
  116.     WHERE vbeln = it_so-vbeln.

  117.   SORT it_line BY vbeln.
  118.   DELETE ADJACENT DUPLICATES FROM it_line COMPARING ALL FIELDS.
  119. END-OF-SELECTION.

  120.   SET SCREEN 100.

  121. *&---------------------------------------------------------------------*
  122. *&      Module  STATUS_0100  OUTPUT
  123. *&---------------------------------------------------------------------*
  124. *       text
  125. *----------------------------------------------------------------------*
  126. MODULE status_0100 OUTPUT.
  127.   SET PF-STATUS 'TMENU'.
  128. *  SET TITLEBAR 'xxx'.
  129.   IF g_tree IS INITIAL.
  130.     PERFORM grow_tree.
  131.   ELSE.
  132.     IF budj IS NOT INITIAL AND rson IS NOT INITIAL.

  133.       CALL METHOD g_tree->delete_all_nodes
  134.         EXCEPTIONS
  135.           failed            = 1
  136.           cntl_system_error = 2
  137.           others            = 3
  138.              .
  139.       IF sy-subrc <> 0.
  140.        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  141.                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  142.       ENDIF.

  143.       CALL METHOD g_tree->add_nodes_and_items
  144.         EXPORTING
  145.           node_table                     = node_table
  146.           item_table                     = item_table
  147.           item_table_structure_name      = 'MTREEITM'
  148.         EXCEPTIONS
  149.           failed                         = 1
  150.           cntl_system_error              = 2
  151.           error_in_tables                = 3
  152.           dp_error                       = 4
  153.           table_structure_name_not_found = 5
  154.           others                         = 6
  155.              .
  156.     ENDIF.
  157.   ENDIF.
  158. ENDMODULE.                 " STATUS_0100  OUTPUT
  159. *&---------------------------------------------------------------------*
  160. *&      Module  USER_COMMAND_0100  INPUT
  161. *&---------------------------------------------------------------------*
  162. *       text
  163. *----------------------------------------------------------------------*

  164. MODULE user_command_0100 INPUT.
  165.   CASE tcode.
  166.     WHEN 'BACK'.
  167.       LEAVE TO SCREEN 0.
  168.     WHEN 'EXIT'.
  169.       LEAVE PROGRAM.
  170.   ENDCASE.
  171. ENDMODULE.                 " USER_COMMAND_0100  INPUT

  172. *&---------------------------------------------------------------------*
  173. *&      Form  GROW_TREE
  174. *&---------------------------------------------------------------------*
  175. *       text
  176. *----------------------------------------------------------------------*
  177. *  -->  p1        text
  178. *  <--  p2        text
  179. *----------------------------------------------------------------------*

  180. FORM grow_tree .
  181.   CREATE OBJECT g_cont
  182.     EXPORTING
  183.       container_name = 'STREE'.

  184. thhdr-heading = 'Column1'.
  185. thhdr-width = 30.

  186. CREATE OBJECT g_tree
  187.   EXPORTING
  188. *    lifetime                    =
  189.     parent                      = g_cont
  190. *    shellstyle                  =
  191.     node_selection_mode         = cl_gui_column_tree=>node_sel_mode_single
  192. *    hide_selection              =
  193.     item_selection              = 'X'
  194.     hierarchy_column_name       = colm1
  195.     hierarchy_header            = thhdr
  196. *    no_hierarchy_column         =
  197. *    name                        =
  198.   EXCEPTIONS
  199.     lifetime_error              = 1
  200.     cntl_system_error           = 2
  201.     create_error                = 3
  202.     illegal_node_selection_mode = 4
  203.     failed                      = 5
  204.     illegal_column_name         = 6
  205.     others                      = 7
  206.     .
  207. IF sy-subrc <> 0.
  208. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  209.             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  210. ENDIF.

  211.   event-eventid = cl_gui_column_tree=>eventid_node_double_click.
  212.   event-appl_event = 'X'. " process PAI if event occurs
  213.   APPEND event TO t_event.

  214.   event-eventid = cl_gui_column_tree=>eventid_item_double_click.
  215.   event-appl_event = 'X'. " process PAI if event occurs
  216.   APPEND event TO t_event.

  217.   " expand no children
  218.   event-eventid = cl_gui_column_tree=>eventid_expand_no_children.
  219.   event-appl_event = 'X'.
  220.   APPEND event TO t_event.

  221.   CALL METHOD g_tree->set_registered_events
  222.     EXPORTING
  223.       events                    = t_event
  224.     EXCEPTIONS
  225.       cntl_error                = 1
  226.       cntl_system_error         = 2
  227.       illegal_event_combination = 3
  228.       OTHERS                    = 4.
  229.   IF sy-subrc <> 0.
  230.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  231.                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  232.   ENDIF.

  233.   SET HANDLER g_app->handle_node_double_click FOR g_tree.
  234.   SET HANDLER g_app->handle_item_double_click FOR g_tree.
  235.   SET HANDLER g_app->handle_expand_no_children FOR g_tree.

  236.   CALL METHOD g_tree->add_column
  237.     EXPORTING
  238.       name                         = colm2
  239. *      hidden                       =
  240. *      disabled                     =
  241. *      alignment                    =
  242.       width                        = 20
  243. *      width_pix                    =
  244. *      header_image                 =
  245.       header_text                  = 'Column2'
  246. *      header_tooltip               =
  247.     EXCEPTIONS
  248.       column_exists                = 1
  249.       illegal_column_name          = 2
  250.       too_many_columns             = 3
  251.       illegal_alignment            = 4
  252.       different_column_types       = 5
  253.       cntl_system_error            = 6
  254.       failed                       = 7
  255.       predecessor_column_not_found = 8
  256.       others                       = 9
  257.          .

  258.   PERFORM build_tree USING node_table item_table.

  259.   CALL METHOD g_tree->add_nodes_and_items
  260.     EXPORTING
  261.       node_table                     = node_table
  262.       item_table                     = item_table
  263.       item_table_structure_name      = 'MTREEITM'
  264.     EXCEPTIONS
  265.       failed                         = 1
  266.       cntl_system_error              = 2
  267.       error_in_tables                = 3
  268.       dp_error                       = 4
  269.       table_structure_name_not_found = 5
  270.       others                         = 6
  271.          .
  272. ENDFORM.                    " GROW_TREE

  273. FORM build_tree USING node_table TYPE treev_ntab
  274.                       item_table TYPE zitem_table.
  275.   DATA: node TYPE mtreesnode,
  276.         item TYPE mtreeitm,
  277.         val_to_str TYPE string,
  278.         sor TYPE vbap-vbeln,
  279.         pos TYPE vbap-posnr,
  280.         sopos TYPE string.

  281.   node-node_key = root.
  282.   CLEAR node-relatship.
  283.   CLEAR node-relatkey.
  284.   node-isfolder = 'X'.
  285.   APPEND node TO node_table.

  286.   item-node_key = root.
  287.   item-item_name = colm1.
  288.   item-class = cl_gui_column_tree=>item_class_text.
  289.   item-text = root.
  290.   APPEND item TO item_table.

  291.   item-node_key = root.
  292.   item-item_name = colm2.
  293.   item-class = cl_gui_column_tree=>item_class_text.
  294.   val_to_str = root.
  295.   item-text = val_to_str.
  296.   APPEND item TO item_table.

  297.   LOOP AT it_sot INTO wa_sot.
  298.     node-node_key = wa_sot-auart.
  299.     node-relatkey = root.
  300.     node-relatship = cl_gui_column_tree=>relat_last_child.
  301.     node-isfolder = 'X'.
  302.     node-expander = 'X'.
  303.     APPEND node TO node_table.

  304.     item-node_key = wa_sot-auart.
  305.     item-item_name = colm1.
  306.     item-class = cl_gui_column_tree=>item_class_text.
  307.     val_to_str = wa_sot-auart.
  308.     item-text = val_to_str.
  309.     APPEND item TO item_table.

  310.     item-node_key = wa_sot-auart.
  311.     item-item_name = colm2.
  312.     item-class = cl_gui_column_tree=>item_class_text.
  313.     item-text = 'Net Value'.
  314.     APPEND item TO item_table.

  315.     LOOP AT it_so INTO wa_so WHERE auart = wa_sot-auart.
  316.       node-node_key = wa_so-vbeln.
  317.       node-relatkey = wa_sot-auart.
  318.       node-relatship = cl_gui_column_tree=>relat_last_child.
  319.       node-isfolder = 'X'.
  320.       node-expander = 'X'.
  321.       APPEND node TO node_table.

  322.       item-node_key = wa_so-vbeln.
  323.       item-item_name = colm1.
  324.       item-class = cl_gui_column_tree=>item_class_text.
  325.       val_to_str = wa_so-vbeln.
  326.       item-text = val_to_str.
  327.       APPEND item TO item_table.

  328.       item-node_key = wa_so-vbeln.
  329.       item-item_name = colm2.
  330.       item-class = cl_gui_column_tree=>item_class_text.
  331.       val_to_str = wa_so-netwr.
  332.       item-text = val_to_str.
  333.       APPEND item TO item_table.
  334.       LOOP AT it_line INTO wa_line WHERE vbeln = wa_so-vbeln.
  335.         SHIFT wa_line-posnr LEFT DELETING LEADING '0'.
  336.         SHIFT wa_line-vbeln LEFT DELETING LEADING '0'.
  337.         CONCATENATE wa_line-vbeln wa_line-posnr INTO sopos.
  338.         node-node_key = sopos.
  339.         node-relatkey = wa_so-vbeln.
  340.         node-relatship = cl_gui_column_tree=>relat_last_child.
  341.         node-isfolder = ''.
  342.         node-expander = ''.
  343.         APPEND node TO node_table.

  344.         item-node_key = sopos.
  345.         item-item_name = colm1.
  346.         item-class = cl_gui_column_tree=>item_class_text.
  347.         val_to_str = wa_line-posnr.
  348.         item-text = val_to_str.
  349.         APPEND item TO item_table.

  350.         item-node_key = sopos.
  351.         item-item_name = colm2.
  352.         item-class = cl_gui_column_tree=>item_class_text.
  353.         val_to_str = wa_line-netwr.
  354.         item-text = val_to_str.
  355.         APPEND item TO item_table.
  356.       ENDLOOP.
  357.       CLEAR wa_so.
  358.     ENDLOOP.
  359.     CLEAR wa_sot.
  360.   ENDLOOP.
  361. ENDFORM.
  362. *&---------------------------------------------------------------------*
  363. *&      Module  STATUS_0200  OUTPUT
  364. *&---------------------------------------------------------------------*
  365. *       text
  366. *----------------------------------------------------------------------*
  367. module STATUS_0200 output.
  368.   SET PF-STATUS 'EDIT'.
  369. *  SET TITLEBAR 'xxx'.
  370.   CLEAR: budj, rson.
  371. endmodule.                 " STATUS_0200  OUTPUT

  372. *&---------------------------------------------------------------------*
  373. *&      Module  USER_COMMAND_0200  INPUT
  374. *&---------------------------------------------------------------------*
  375. *       text
  376. *----------------------------------------------------------------------*
  377. module USER_COMMAND_0200 input.
  378.   CASE ok_code.
  379.     WHEN 'OK'.
  380.       IF budj IS NOT INITIAL AND rson IS NOT INITIAL.
  381.       LEAVE TO SCREEN 0.
  382.       ELSE.
  383.         MESSAGE 'Value cannot be nil' TYPE 'E'.
  384.       ENDIF.
  385.     WHEN 'CANC'.
  386.       LEAVE TO SCREEN 0.
  387.   ENDCASE.
  388. endmodule.                 " USER_COMMAND_0200  INPUT

  389. FORM update_tree USING budj g_node g_item.
  390. DATA: key_to_char TYPE string.
  391. LOOP AT item_table INTO w_item WHERE node_key = g_node
  392.                                 AND item_name = g_item.
  393.   w_item-node_key = g_node.
  394.   w_item-item_name = g_item.
  395.   w_item-class = cl_gui_column_tree=>item_class_text.
  396.   key_to_char = budj.
  397.   w_item-text = key_to_char.
  398.   MODIFY item_table FROM w_item.
  399. ENDLOOP.
  400. ENDFORM.
复制代码

程序执行效果:
alv tree 2.jpg
双击弹出200屏幕,修改节点的值
alv tree 3.jpg
确定 查看
alv tree 4.jpg
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表