二维码

[fmalv] 在alv grid中使用subtotal小计数据

Twilight发表于 2014-08-13 10:28Twilight 最后回复于 2014-08-13 10:28 [复制链接] 4908 0

小计需要配置的地方:
1、fieldcate中指定需要do_sum合计的字段
2、sort中指定合计依据的需排序字段
3、event事件回调subtotal_text子过程,显示文本

程序代码:
  1. *&---------------------------------------------------------------------*
  2. *& Table declaration
  3. *&---------------------------------------------------------------------*
  4. TABLES: ekko.
  5. *&---------------------------------------------------------------------*
  6. *& Type pool declaration
  7. *&---------------------------------------------------------------------*
  8. TYPE-POOLS: slis. " Type pool for ALV
  9. *&---------------------------------------------------------------------*
  10. *& Selection screen
  11. *&---------------------------------------------------------------------*
  12. SELECT-OPTIONS: s_ebeln FOR ekko-ebeln.
  13. *&---------------------------------------------------------------------*
  14. *& Type declaration
  15. *&---------------------------------------------------------------------*
  16. * Type declaration for internal table to store EKPO data
  17. TYPES: BEGIN OF x_data,
  18.        ebeln  TYPE char30,  " Document no.
  19.        ebelp  TYPE ebelp,   " Item no
  20.        matnr  TYPE matnr,   " Material no
  21.        matnr1 TYPE matnr,   " Material no
  22.        werks  TYPE werks_d, " Plant
  23.        werks1 TYPE werks_d, " Plant
  24.        ntgew  TYPE entge,   " Net weight
  25.        gewe   TYPE egewe,   " Unit of weight                            
  26.        END OF x_data.
  27. *&---------------------------------------------------------------------*
  28. *& Internal table declaration
  29. *&---------------------------------------------------------------------*
  30. DATA:
  31. * Internal table to store EKPO data
  32.   i_ekpo TYPE STANDARD TABLE OF x_data INITIAL SIZE 0,
  33. * Internal table for storing field catalog information
  34.   i_fieldcat TYPE slis_t_fieldcat_alv,
  35. * Internal table for Top of Page info. in ALV Display
  36.   i_alv_top_of_page TYPE slis_t_listheader,
  37. * Internal table for ALV Display events
  38.   i_events TYPE slis_t_event,
  39. * Internal table for storing ALV sort information
  40.   i_sort TYPE  slis_t_sortinfo_alv,
  41.   i_event TYPE slis_t_event.
  42. *&---------------------------------------------------------------------*
  43. *& Work area declaration
  44. *&---------------------------------------------------------------------*
  45. DATA:
  46.   wa_ekko TYPE x_data,
  47.   wa_layout     TYPE slis_layout_alv,
  48.   wa_events         TYPE slis_alv_event,
  49.   wa_sort TYPE slis_sortinfo_alv.
  50. *&---------------------------------------------------------------------*
  51. *& Constant declaration
  52. *&---------------------------------------------------------------------*
  53. CONSTANTS:
  54.    c_header   TYPE char1
  55.               VALUE 'H',                    "Header in ALV
  56.    c_item     TYPE char1
  57.               VALUE 'S'.
  58. *&---------------------------------------------------------------------*
  59. *& Start-of-selection event
  60. *&---------------------------------------------------------------------*
  61. START-OF-SELECTION.
  62. * Select data from ekpo
  63.   SELECT ebeln " Doc no
  64.          ebelp " Item
  65.          matnr " Material
  66.          matnr " Material
  67.          werks " Plant
  68.          werks " Plant
  69.          ntgew " Quantity
  70.          gewei " Unit
  71.          FROM ekpo
  72.          INTO TABLE i_ekpo
  73.          WHERE ebeln IN s_ebeln
  74.          AND ntgew NE '0.00'.
  75.   IF sy-subrc = 0.
  76.     SORT i_ekpo BY ebeln ebelp matnr .
  77.   ENDIF.
  78. * To build the Page header
  79.   PERFORM sub_build_header.
  80. * To prepare field catalog
  81.   PERFORM sub_field_catalog.
  82. * Perform to populate the layout structure
  83.   PERFORM sub_populate_layout.
  84. * Perform to populate the sort table.
  85.   PERFORM sub_populate_sort.
  86. * Perform to populate ALV event
  87.   PERFORM sub_get_event.
  88. END-OF-SELECTION.
  89. * Perform to display ALV report
  90.   PERFORM sub_alv_report_display.

  91. *&---------------------------------------------------------------------*
  92. *&      Form  sub_build_header
  93. *&---------------------------------------------------------------------*
  94. *       To build the header
  95. *----------------------------------------------------------------------*
  96. *       No Parameter
  97. *----------------------------------------------------------------------*
  98. FORM sub_build_header .
  99. * Local data declaration
  100.   DATA: l_system     TYPE char10 ,          "System id
  101.         l_r_line     TYPE slis_listheader,  "Hold list header
  102.         l_date       TYPE char10,           "Date
  103.         l_time       TYPE char10,           "Time
  104.         l_success_records TYPE i,           "No of success records
  105.         l_title(300) TYPE c.                " Title

  106. * Title  Display
  107.   l_r_line-typ = c_header.               " header
  108.   l_title = 'Test report'(001).
  109.   l_r_line-info = l_title.
  110.   APPEND l_r_line TO i_alv_top_of_page.
  111.   CLEAR l_r_line.
  112. * Run date Display
  113.   CLEAR l_date.
  114.   l_r_line-typ  = c_item.                " Item
  115.   WRITE: sy-datum  TO l_date MM/DD/YYYY.
  116.   l_r_line-key = 'Run Date :'(002).
  117.   l_r_line-info = l_date.
  118.   APPEND l_r_line TO i_alv_top_of_page.
  119.   CLEAR: l_r_line,
  120.          l_date.
  121. ENDFORM.                    " sub_build_header

  122. *&---------------------------------------------------------------------*
  123. *&      Form  sub_field_catalog
  124. *&---------------------------------------------------------------------*
  125. *       Build Field Catalog
  126. *----------------------------------------------------------------------*
  127. *       No Parameter
  128. *----------------------------------------------------------------------*
  129. FORM sub_field_catalog .
  130. *  Build Field Catalog
  131.   PERFORM sub_fill_alv_field_catalog USING:
  132.      '01' '01' 'EBELN' 'I_EKPO' 'L'
  133.      'Doc No'(003) ' ' ' ' ' ' ' ',
  134.      '01' '02' 'EBELP' 'I_EKPO' 'L'
  135.      'Item No'(004) 'X' 'X' ' ' ' ',
  136.      '01' '03' 'MATNR' 'I_EKPO' 'L'
  137.      'Material No'(005) 'X' 'X' ' ' ' ',
  138.      '01' '03' 'MATNR1' 'I_EKPO' 'L'
  139.      'Material No'(005) ' ' ' ' ' ' ' ',

  140.      '01' '04' 'WERKS' 'I_EKPO' 'L'
  141.      'Plant'(006) 'X' 'X' ' ' ' ',
  142.      '01' '04' 'WERKS1' 'I_EKPO' 'L'
  143.      'Plant'(006) ' ' ' ' ' ' ' ',
  144.      '01' '05' 'NTGEW' 'I_EKPO' 'R'
  145.      'Net Weight'(007) ' ' ' ' 'GEWE' 'I_EKPO'.
  146. ENDFORM.                    " sub_field_catalog
  147. *&---------------------------------------------------------------------*
  148. *&     Form  sub_fill_alv_field_catalog
  149. *&---------------------------------------------------------------------*
  150. *&     For building Field Catalog
  151. *&---------------------------------------------------------------------*
  152. *&     p_rowpos   Row position
  153. *&     p_colpos   Col position
  154. *&     p_fldnam   Fldname
  155. *&     p_tabnam   Tabname
  156. *&     p_justif   Justification
  157. *&     p_seltext  Seltext
  158. *&     p_out      no out
  159. *&     p_tech     Technical field
  160. *&     p_qfield   Quantity field
  161. *&     p_qtab     Quantity table
  162. *&---------------------------------------------------------------------*
  163. FORM sub_fill_alv_field_catalog  USING  p_rowpos    TYPE sycurow
  164.                                         p_colpos    TYPE sycucol
  165.                                         p_fldnam    TYPE fieldname
  166.                                         p_tabnam    TYPE tabname
  167.                                         p_justif    TYPE char1
  168.                                         p_seltext   TYPE dd03p-scrtext_l
  169.                                         p_out       TYPE char1
  170.                                         p_tech      TYPE char1
  171.                                         p_qfield    TYPE slis_fieldname
  172.                                         p_qtab      TYPE slis_tabname.
  173. * Local declaration for field catalog
  174.   DATA: wa_lfl_fcat    TYPE  slis_fieldcat_alv.
  175.   wa_lfl_fcat-row_pos        =  p_rowpos.     "Row
  176.   wa_lfl_fcat-col_pos        =  p_colpos.     "Column
  177.   wa_lfl_fcat-fieldname      =  p_fldnam.     "Field Name
  178.   wa_lfl_fcat-tabname        =  p_tabnam.     "Internal Table Name
  179.   wa_lfl_fcat-just           =  p_justif.     "Screen Justified
  180.   wa_lfl_fcat-seltext_l      =  p_seltext.    "Field Text
  181.   wa_lfl_fcat-no_out         =  p_out.        "No output
  182.   wa_lfl_fcat-tech           =  p_tech.       "Technical field
  183.   wa_lfl_fcat-qfieldname     =  p_qfield.     "Quantity unit
  184.   wa_lfl_fcat-qtabname       =  p_qtab .      "Quantity table
  185.   IF p_fldnam = 'NTGEW'.
  186.     wa_lfl_fcat-do_sum  = 'X'.
  187.   ENDIF.
  188.   APPEND wa_lfl_fcat TO i_fieldcat.
  189.   CLEAR wa_lfl_fcat.
  190. ENDFORM.                    " sub_fill_alv_field_catalog
  191. *&---------------------------------------------------------------------*
  192. *&      Form  sub_populate_layout
  193. *&---------------------------------------------------------------------*
  194. *       Populate ALV layout
  195. *----------------------------------------------------------------------*
  196. *       No Parameter
  197. *----------------------------------------------------------------------*
  198. FORM sub_populate_layout .
  199.   CLEAR wa_layout.
  200.   wa_layout-colwidth_optimize = 'X'." Optimization of Col width
  201. ENDFORM.                    " sub_populate_layout
  202. *&---------------------------------------------------------------------*
  203. *&      Form  sub_populate_sort
  204. *&---------------------------------------------------------------------*
  205. *       Populate ALV sort table
  206. *----------------------------------------------------------------------*
  207. *       No Parameter
  208. *----------------------------------------------------------------------*
  209. FORM sub_populate_sort .
  210. * Sort on material
  211.   wa_sort-spos = '01' .
  212.   wa_sort-fieldname = 'MATNR'.
  213.   wa_sort-tabname = 'I_EKPO'.
  214.   wa_sort-up = 'X'.
  215.   wa_sort-subtot = 'X'.
  216.   APPEND wa_sort TO i_sort .
  217.   CLEAR wa_sort.
  218. * Sort on plant
  219.   wa_sort-spos = '02'.
  220.   wa_sort-fieldname = 'WERKS'.
  221.   wa_sort-tabname = 'I_EKPO'.
  222.   wa_sort-up = 'X'.
  223.   wa_sort-subtot = 'X'.
  224.   APPEND wa_sort TO i_sort .
  225.   CLEAR wa_sort.

  226. ENDFORM.                    " sub_populate_sort
  227. *&---------------------------------------------------------------------*
  228. *&      Form  sub_get_event
  229. *&---------------------------------------------------------------------*
  230. *       Get ALV grid event and pass the form name to subtotal_text
  231. *       event
  232. *----------------------------------------------------------------------*
  233. *       No Parameter
  234. *----------------------------------------------------------------------*
  235. FORM sub_get_event .
  236.   CONSTANTS : c_formname_subtotal_text TYPE slis_formname VALUE
  237. 'SUBTOTAL_TEXT'.
  238.   DATA: l_s_event TYPE slis_alv_event.

  239.   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
  240.     EXPORTING
  241.       i_list_type     = 4
  242.     IMPORTING
  243.       et_events       = i_event
  244.     EXCEPTIONS
  245.       list_type_wrong = 0
  246.       OTHERS          = 0.
  247. * Subtotal
  248.   READ TABLE i_event  INTO l_s_event
  249.                     WITH KEY name = slis_ev_subtotal_text."在类型池中默认的值为SUBTOTAL_TEXT
  250.   IF sy-subrc = 0.
  251.     MOVE c_formname_subtotal_text TO l_s_event-form.
  252.     MODIFY i_event FROM l_s_event INDEX sy-tabix.
  253.   ENDIF.
  254. ENDFORM.                    " sub_get_event
  255. *&---------------------------------------------------------------------*
  256. *&      Form  sub_alv_report_display
  257. *&---------------------------------------------------------------------*
  258. *       For ALV Report Display
  259. *----------------------------------------------------------------------*
  260. *       No Parameter
  261. *----------------------------------------------------------------------*
  262. FORM sub_alv_report_display .
  263.   DATA: l_repid TYPE syrepid .
  264.   l_repid = sy-repid .
  265. * This function module for displaying the ALV report
  266.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  267.     EXPORTING
  268.       i_callback_program       = l_repid
  269.       i_callback_top_of_page   = 'SUB_ALV_TOP_OF_PAGE'
  270.       is_layout                = wa_layout
  271.       it_fieldcat              = i_fieldcat
  272.       it_sort = i_sort
  273.       it_events                = i_event
  274.       i_default                = 'X'
  275.       i_save                   = 'A'
  276.     TABLES
  277.       t_outtab                 = i_ekpo
  278.     EXCEPTIONS
  279.       program_error            = 1
  280.       OTHERS                   = 2.
  281.   IF sy-subrc <> 0.
  282. *    MESSAGE i000 WITH 'Error in ALV report display'(055).
  283.   ENDIF.
  284. ENDFORM.                    " sub_alv_report_display
  285. *&---------------------------------------------------------------------*
  286. *       FORM sub_alv_top_of_page
  287. *---------------------------------------------------------------------*
  288. *       Call ALV top of page
  289. *---------------------------------------------------------------------*
  290. *       No parameter
  291. *---------------------------------------------------------------------*
  292. FORM sub_alv_top_of_page.                                   "#EC CALLED
  293. * To write header for the ALV
  294.   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
  295.     EXPORTING
  296.       it_list_commentary = i_alv_top_of_page.

  297. ENDFORM.                    "alv_top_of_page
  298. *&---------------------------------------------------------------------*
  299. *&      Form  subtotal_text
  300. *&---------------------------------------------------------------------*
  301. *       Build subtotal text
  302. *----------------------------------------------------------------------*
  303. *       P_total  Total
  304. *       p_subtot_text Subtotal text info
  305. *----------------------------------------------------------------------*
  306. FORM subtotal_text CHANGING
  307.                p_total TYPE any
  308.                p_subtot_text TYPE slis_subtot_text.

  309. * Material level sub total
  310.   IF p_subtot_text-criteria = 'MATNR'.
  311.     p_subtot_text-display_text_for_subtotal
  312.     = 'Material level total'(009).
  313.   ENDIF.
  314. * Plant level sub total
  315.   IF p_subtot_text-criteria = 'WERKS'.
  316.     p_subtot_text-display_text_for_subtotal = 'Plant level total'(010).
  317.   ENDIF.

  318. ENDFORM.                    "subtotal_text
复制代码


输出效果:
subtotal.png
回复

使用道具 举报

快速回帖

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

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