You are on page 1of 10

Display subtotal text in ALV grid

Attachments:2 Added by Joyjit Ghosh, last edited by Craig Cmehil on Mar 24, 2009
(view change)
Steps:
Declare the fields twice in the table structure on which subtotal need
s to be calculated.
-

Populate these fields with same values in the internal table.

When populating field catalog with these fields, hide one of the field
by populating no_out = 'X' and tech = 'X' in the field catalog.

alog.

Populate alv sort table for the field which is hidden in the field cat

Populate alv event table for subtotal text (slis_ev_subtotal_text) eve


nt with routine name.
-

Define the routine in the program to display subtotal text.

Code:
*&---------------------------------------------------------------------*
*& Report Z_ALV_SUBTOTAL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z_alv_subtotal.
*&---------------------------------------------------------------------*
*& Table declaration
*&---------------------------------------------------------------------*
TABLES: ekko.
*&---------------------------------------------------------------------*
*& Type pool declaration
*&---------------------------------------------------------------------*
TYPE-POOLS: slis. " Type pool for ALV
*&---------------------------------------------------------------------*
*& Selection screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_ebeln FOR ekko-ebeln.
*&---------------------------------------------------------------------*
*& Type declaration
*&---------------------------------------------------------------------*
* Type declaration for internal table to store EKPO data
TYPES: BEGIN OF x_data,
ebeln TYPE char30, " Document no.
ebelp TYPE ebelp, " Item no
matnr TYPE matnr, " Material no
matnr1 TYPE matnr, " Material no
werks TYPE werks_d, " Plant
werks1 TYPE werks_d, " Plant

ntgew TYPE entge,


gewe TYPE egewe,
END OF x_data.

" Net weight


" Unit of weight

*&---------------------------------------------------------------------*
*& Internal table declaration
*&---------------------------------------------------------------------*
DATA:
* Internal table to store EKPO data
i_ekpo TYPE STANDARD TABLE OF x_data INITIAL SIZE 0,
* Internal table for storing field catalog information
i_fieldcat TYPE slis_t_fieldcat_alv,
* Internal table for Top of Page info. in ALV Display
i_alv_top_of_page TYPE slis_t_listheader,
* Internal table for ALV Display events
i_events TYPE slis_t_event,
* Internal table for storing ALV sort information
i_sort TYPE slis_t_sortinfo_alv,
i_event TYPE slis_t_event.
*&---------------------------------------------------------------------*
*& Work area declaration
*&---------------------------------------------------------------------*
DATA:
wa_ekko TYPE x_data,
wa_layout
TYPE slis_layout_alv,
wa_events
TYPE slis_alv_event,
wa_sort TYPE slis_sortinfo_alv.
*&---------------------------------------------------------------------*
*& Constant declaration
*&---------------------------------------------------------------------*
CONSTANTS:
c_header
c_item

TYPE char1
VALUE 'H',
TYPE char1
VALUE 'S'.

"Header in ALV

*&---------------------------------------------------------------------*
*& Start-of-selection event
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Select data from ekpo
SELECT ebeln " Doc no
ebelp " Item
matnr " Material
matnr " Material
werks " Plant
werks " Plant
ntgew " Quantity
gewei " Unit
FROM ekpo
INTO TABLE i_ekpo
WHERE ebeln IN s_ebeln
AND ntgew NE '0.00'.

IF sy-subrc = 0.
SORT i_ekpo BY ebeln ebelp matnr .
ENDIF.
* To build the Page header
PERFORM sub_build_header.
* To prepare field catalog
PERFORM sub_field_catalog.
* Perform to populate the layout structure
PERFORM sub_populate_layout.
* Perform to populate the sort table.
PERFORM sub_populate_sort.
* Perform to populate ALV event
PERFORM sub_get_event.
END-OF-SELECTION.
* Perform to display ALV report
PERFORM sub_alv_report_display.
*&---------------------------------------------------------------------*
*&
Form sub_build_header
*&---------------------------------------------------------------------*
*
To build the header
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_build_header .
* Local data declaration
DATA: l_system
TYPE
l_r_line
TYPE
l_date
TYPE
l_time
TYPE
l_success_records
l_title(300) TYPE

char10 ,
slis_listheader,
char10,
char10,
TYPE i,
c.

"System id
"Hold list header
"Date
"Time
"No of success records
" Title

* Title Display
l_r_line-typ = c_header.
" header
l_title = 'Test report'(001).
l_r_line-info = l_title.
APPEND l_r_line TO i_alv_top_of_page.
CLEAR l_r_line.
* Run date Display
CLEAR l_date.
l_r_line-typ = c_item.
" Item
WRITE: sy-datum TO l_date MM/DD/YYYY.
l_r_line-key = 'Run Date :'(002).
l_r_line-info = l_date.
APPEND l_r_line TO i_alv_top_of_page.
CLEAR: l_r_line,
l_date.

ENDFORM.

" sub_build_header

*&---------------------------------------------------------------------*
*&
Form sub_field_catalog
*&---------------------------------------------------------------------*
*
Build Field Catalog
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_field_catalog .
* Build Field Catalog
PERFORM sub_fill_alv_field_catalog USING:
'01' '01' 'EBELN' 'I_EKPO' 'L'
'Doc No'(003) ' ' ' ' ' ' ' ',
'01' '02' 'EBELP' 'I_EKPO' 'L'
'Item No'(004) 'X' 'X' ' ' ' ',
'01' '03' 'MATNR' 'I_EKPO' 'L'
'Material No'(005) 'X' 'X' ' ' ' ',
'01' '03' 'MATNR1' 'I_EKPO' 'L'
'Material No'(005) ' ' ' ' ' ' ' ',
'01' '04' 'WERKS' 'I_EKPO' 'L'
'Plant'(006) 'X' 'X' ' ' ' ',
'01' '04' 'WERKS1' 'I_EKPO' 'L'
'Plant'(006) ' ' ' ' ' ' ' ',
'01' '05' 'NTGEW' 'I_EKPO' 'R'
'Net Weight'(007) ' ' ' ' 'GEWE' 'I_EKPO'.
ENDFORM.

" sub_field_catalog

*&---------------------------------------------------------------------*
*&
Form sub_fill_alv_field_catalog
*&---------------------------------------------------------------------*
*&
For building Field Catalog
*&---------------------------------------------------------------------*
*&
p_rowpos Row position
*&
p_colpos Col position
*&
p_fldnam Fldname
*&
p_tabnam Tabname
*&
p_justif Justification
*&
p_seltext Seltext
*&
p_out
no out
*&
p_tech
Technical field
*&
p_qfield Quantity field
*&
p_qtab
Quantity table
*&---------------------------------------------------------------------*
FORM sub_fill_alv_field_catalog USING p_rowpos
TYPE sycurow

p_colpos
p_fldnam
p_tabnam
p_justif
p_seltext
p_out
p_tech
p_qfield
p_qtab

TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
TYPE

sycucol
fieldname
tabname
char1
dd03p-scrtext_l
char1
char1
slis_fieldname
slis_tabname.

* Local declaration for field catalog


DATA: wa_lfl_fcat
TYPE slis_fieldcat_alv.
wa_lfl_fcat-row_pos
wa_lfl_fcat-col_pos
wa_lfl_fcat-fieldname
wa_lfl_fcat-tabname
wa_lfl_fcat-just
wa_lfl_fcat-seltext_l
wa_lfl_fcat-no_out
wa_lfl_fcat-tech
wa_lfl_fcat-qfieldname
wa_lfl_fcat-qtabname

=
=
=
=
=
=
=
=
=
=

p_rowpos.
p_colpos.
p_fldnam.
p_tabnam.
p_justif.
p_seltext.
p_out.
p_tech.
p_qfield.
p_qtab .

"Row
"Column
"Field Name
"Internal Table Name
"Screen Justified
"Field Text
"No output
"Technical field
"Quantity unit
"Quantity table

IF p_fldnam = 'NTGEW'.
wa_lfl_fcat-do_sum = 'X'.
ENDIF.
APPEND wa_lfl_fcat TO i_fieldcat.
CLEAR wa_lfl_fcat.
ENDFORM.
" sub_fill_alv_field_catalog
*&---------------------------------------------------------------------*
*&
Form sub_populate_layout
*&---------------------------------------------------------------------*
*
Populate ALV layout
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_populate_layout .
CLEAR wa_layout.
wa_layout-colwidth_optimize = 'X'." Optimization of Col width
ENDFORM.

" sub_populate_layout

*&---------------------------------------------------------------------*
*&
Form sub_populate_sort
*&---------------------------------------------------------------------*
*
Populate ALV sort table
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_populate_sort .
* Sort on material
wa_sort-spos = '01' .
wa_sort-fieldname = 'MATNR'.
wa_sort-tabname = 'I_EKPO'.
wa_sort-up = 'X'.
wa_sort-subtot = 'X'.

APPEND wa_sort TO i_sort .


CLEAR wa_sort.
* Sort on plant
wa_sort-spos = '02'.
wa_sort-fieldname = 'WERKS'.
wa_sort-tabname = 'I_EKPO'.
wa_sort-up = 'X'.
wa_sort-subtot = 'X'.
APPEND wa_sort TO i_sort .
CLEAR wa_sort.
ENDFORM.

" sub_populate_sort

*&---------------------------------------------------------------------*
*&
Form sub_get_event
*&---------------------------------------------------------------------*
*
Get ALV grid event and pass the form name to subtotal_text
*
event
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_get_event .
CONSTANTS : c_formname_subtotal_text TYPE slis_formname VALUE
'SUBTOTAL_TEXT'.
DATA: l_s_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type
= 4
IMPORTING
et_events
= i_event
EXCEPTIONS
list_type_wrong = 0
OTHERS
= 0.
* Subtotal
READ TABLE i_event INTO l_s_event
WITH KEY name = slis_ev_subtotal_text.
IF sy-subrc = 0.
MOVE c_formname_subtotal_text TO l_s_event-form.
MODIFY i_event FROM l_s_event INDEX sy-tabix.
ENDIF.
ENDFORM.

" sub_get_event

*&---------------------------------------------------------------------*
*&
Form sub_alv_report_display
*&---------------------------------------------------------------------*
*
For ALV Report Display
*----------------------------------------------------------------------*
*
No Parameter
*----------------------------------------------------------------------*
FORM sub_alv_report_display .
DATA: l_repid TYPE syrepid .
l_repid = sy-repid .

* This function module for displaying the ALV report


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= l_repid
i_callback_top_of_page = 'SUB_ALV_TOP_OF_PAGE'
is_layout
= wa_layout
it_fieldcat
= i_fieldcat
it_sort = i_sort
it_events
= i_event
i_default
= 'X'
i_save
= 'A'
TABLES
t_outtab
= i_ekpo
EXCEPTIONS
program_error
= 1
OTHERS
= 2.
IF sy-subrc <> 0.
*
MESSAGE i000 WITH 'Error in ALV report display'(055).
ENDIF.
ENDFORM.

" sub_alv_report_display

*&---------------------------------------------------------------------*
*
FORM sub_alv_top_of_page
*---------------------------------------------------------------------*
*
Call ALV top of page
*---------------------------------------------------------------------*
*
No parameter
*---------------------------------------------------------------------*
FORM sub_alv_top_of_page.

"#EC CALLED

* To write header for the ALV


CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = i_alv_top_of_page.
ENDFORM.

"alv_top_of_page

*&---------------------------------------------------------------------*
*&
Form subtotal_text
*&---------------------------------------------------------------------*
*
Build subtotal text
*----------------------------------------------------------------------*
*
P_total Total
*
p_subtot_text Subtotal text info
*----------------------------------------------------------------------*
FORM subtotal_text CHANGING
p_total TYPE any
p_subtot_text TYPE slis_subtot_text.
* Material level sub total
IF p_subtot_text-criteria = 'MATNR'.
p_subtot_text-display_text_for_subtotal
= 'Material level total'(009).
ENDIF.

* Plant level sub total


IF p_subtot_text-criteria = 'WERKS'.
p_subtot_text-display_text_for_subtotal = 'Plant level total'(010).
ENDIF.
ENDFORM.

"subtotal_text

********************************************************************************
*
New Program
********************************************************************************
*
ALV Grid List with sub-totals
REPORT z_demo_alv_sort.
*---------------------------------------------------------------------*
* This program lists orders (VBAK) with sort and sub-total for
*
* 'sold-to-party' (KUNNR) and 'Sales organization' (VKORG)
*
*---------------------------------------------------------------------*
TABLES : vbak.
TYPE-POOLS: slis.

" ALV Global types

SELECT-OPTIONS :
s_vkorg FOR vbak-vkorg,
s_kunnr FOR vbak-kunnr,
s_vbeln FOR vbak-vbeln.

" Sales organization


" Sold-to party
" Sales document

SELECTION-SCREEN :
SKIP, BEGIN OF LINE,COMMENT 5(27) v_1 FOR FIELD p_max.
PARAMETERS p_max(2) TYPE n DEFAULT '20' OBLIGATORY.
SELECTION-SCREEN END OF LINE.
DATA:
BEGIN OF gt_vbak OCCURS 0,
vkorg LIKE vbak-vkorg,
kunnr LIKE vbak-kunnr,
vbeln LIKE vbak-vbeln,
netwr LIKE vbak-netwr,
waerk LIKE vbak-waerk,
END OF gt_vbak.

"
"
"
"
"

Sales organization
Sold-to party
Sales document
Net Value of the Sales Order
Document currency

*---------------------------------------------------------------------*
INITIALIZATION.
v_1 = 'Maximum of records to read'.
*---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM f_read_data.
PERFORM f_display_data.
*---------------------------------------------------------------------*
*
Form f_read_data
*---------------------------------------------------------------------*

FORM f_read_data.
SELECT * INTO
FROM
UP
WHERE
AND
AND

CORRESPONDING FIELDS OF TABLE gt_vbak


vbak
TO p_max ROWS
kunnr IN s_kunnr
vbeln IN s_vbeln
vkorg IN s_vkorg.

ENDFORM.
" F_READ_DATA
*---------------------------------------------------------------------*
*
Form f_display_data
*---------------------------------------------------------------------*
FORM f_display_data.
DEFINE m_fieldcat.
add 1 to ls_fieldcat-col_pos.
ls_fieldcat-fieldname = &1.
ls_fieldcat-ref_tabname = 'VBAK'.
ls_fieldcat-do_sum
= &2.
ls_fieldcat-cfieldname = &3.
append ls_fieldcat to lt_fieldcat.
END-OF-DEFINITION.
DEFINE m_sort.
add 1 to ls_sort-spos.
ls_sort-fieldname = &1.
ls_sort-up
= 'X'.
ls_sort-subtot
= &2.
append ls_sort to lt_sort.
END-OF-DEFINITION.
DATA:
ls_fieldcat
lt_fieldcat
lt_sort
ls_sort
ls_layout
m_fieldcat
m_fieldcat
m_fieldcat
m_fieldcat
m_fieldcat

TYPE
TYPE
TYPE
TYPE
TYPE

'VKORG'
'KUNNR'
'VBELN'
'NETWR'
'WAERK'

slis_fieldcat_alv,
slis_t_fieldcat_alv,
slis_t_sortinfo_alv,
slis_sortinfo_alv,
slis_layout_alv.
''
''
''
'X'
''

''.
''.
''.
'WAERK'.
''.

m_sort 'VKORG' 'X'.


m_sort 'KUNNR' 'X'.
m_sort 'VBELN' ''.

" Sort by vkorg and subtotal


" Sort by kunnr and subtotal
" Sort by vbeln

ls_layout-cell_merge = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = ls_layout
it_fieldcat = lt_fieldcat
it_sort
= lt_sort
TABLES
t_outtab
= gt_vbak.
ENDFORM.

" F_DISPLAY_DATA

***************** END OF PROGRAM Z_DEMO_ALV_SORT **********************

You might also like