You are on page 1of 27

# Content

1 ALV Using Factory Methods

2 ALV factory method with user defined types

3 Hotspot in ALV with ALV factory methods

4 Interactive ALV with factory method using events

5 Totals and Subtotals in ALV factory methods

6 Top of page and end of page in ALV with factory methods

ALV Using Factory Methods


Last Updated: February 20th 2014 by Ashok Kumar Reddy

Developing ALV reports using object oriented factory methods, example ALV
report using factory methods

+ -

ALV Factory Methods:


After ALV with Function Modules, Object Oriented Concepts with custom container
(CL_GUI_ALV_GRID), SAP introduces one more ALV programming model with Object Oriented
concepts, the main purpose of this ALV model is to reduce developer time and at the same time
providing maximum possible user specific functionality by using object oriented methodologies.

Follow below steps to develop a simple ALV


Step1: Data decelerations for required internal tables and work areas, get data from data base.

REPORT ZSAPN_ALV_MARA_FACTARY.
DATA : IT_MARA TYPE TABLE OF MARA,
WA_MARA TYPE MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE.
SELECT * FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.

Step2: Call static method FACTORY of class CL_SALV_TABLE, to get table instance with data.

* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.

Step3: Call method 'Display' to display ALV.

LR_ALV->DISPLAY( ). "display grid

Learner Questions

No Questions by learners, be first one to ask ..!!

ALV factory method with user


defined types
Last Updated: February 20th 2014 by Ashok Kumar Reddy

ALV report with user defined types using Object Oriented Factory methods

+ -
When ever we use ALV factory methods to display ALV, we don`t need to create any field catalog,
we can directly add our user defined tables instance as it automatically determine fields and
displays.

Example program using ALV factory methods 

REPORT ZSAPN_ALV_MARA_FACTARY.
TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE.
SELECT MATNR MTART MBRSH MATKL MEINS FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.

* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.
LR_ALV->DISPLAY( ). "display grid

Learner Questions
No Questions by learners, be first one to ask ..!!

Hotspot in ALV with ALV factory


methods
Last Updated: February 20th 2014 by Ashok Kumar Reddy

Insert hotspot into ALV columns using factory methods, example ALV report with
hotspot factory methods

+ -
The below example explains you how to insert hotspot in a column using factory methods.
Step1: Data decelerations, get alv factory instance.
REPORT ZSAPN_ALV_MARA_FACTORY.
TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE.
SELECT MATNR MTART MBRSH MATKL MEINS FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.
* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.

Step2: Get ALV Columns using GET_COLUMNS method.

**get ALV columns


DATA : LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE. "columns instance
CALL METHOD LR_ALV->GET_COLUMNS "get all columns
RECEIVING
VALUE = LR_COLUMNS.

Step3: Get single column to add hotspot.

DATA : LR_COL TYPE REF TO CL_SALV_COLUMN_TABLE. "column instance


TRY.
LR_COL ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ). "get MATNR columns to insert
hotspot
CATCH CX_SALV_NOT_FOUND.
ENDTRY.

Step4:Insert hotspot into column using SET_CELL_TYPE method.

* Set the Hotspot for MATNR Column


TRY.
CALL METHOD LR_COL->SET_CELL_TYPE "set cell type hotspot
EXPORTING
VALUE = IF_SALV_C_CELL_TYPE=>HOTSPOT.
.
CATCH CX_SALV_DATA_ERROR .
ENDTRY.

Step5: Display ALV .

LR_ALV->DISPLAY( ). "display grid

Final code will be


REPORT ZSAPN_ALV_MARA_FACTORY.
TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE.
SELECT MATNR MTART MBRSH MATKL MEINS FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.
* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.

**get ALV columns


DATA : LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE. "columns instance
DATA : LR_COL TYPE REF TO CL_SALV_COLUMN_TABLE. "column instance
CALL METHOD LR_ALV->GET_COLUMNS "get all columns
RECEIVING
VALUE = LR_COLUMNS.
IF LR_COLUMNS IS NOT INITIAL.
*TRY.
* Get VBELN column
TRY.
LR_COL ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ). "get MATNR columns to insert
hotspot
CATCH CX_SALV_NOT_FOUND.
ENDTRY.
*
* Set the Hotspot for MATNR Column
TRY.
CALL METHOD LR_COL->SET_CELL_TYPE "set cell type hotspot
EXPORTING
VALUE = IF_SALV_C_CELL_TYPE=>HOTSPOT.
.
CATCH CX_SALV_DATA_ERROR .
ENDTRY.
ENDIF.
LR_ALV->DISPLAY( ). "display grid

Out put of ALV using factory method

Learner Questions
No Questions by learners, be first one to ask ..!!

Interactive ALV with factory method


using events
Last Updated: February 21st 2014 by Ashok Kumar Reddy

Interactive ALV with factory method using events and event handler methods,
using events in ALV factory methods

+ -
The below example explains you of using events in ALV factory methods, first thing I recommend
you is to go through what are events on Object Oriented ABAP .

Step1: Data declerations , get instance of ALV factory.

TYPES: BEGIN OF TY_MARA, "MARA internal table


MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE TY_MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "SALV table instance
SELECT MATNR MTART MBRSH MATKL MEINS FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.
"fetch data
* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.

Step2: Get ALV columns and insert hotspot.

**get ALV columns


DATA : LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE. "columns instance
DATA : LR_COL TYPE REF TO CL_SALV_COLUMN_TABLE. "column instance
CALL METHOD LR_ALV->GET_COLUMNS "get all columns
RECEIVING
VALUE = LR_COLUMNS.
IF LR_COLUMNS IS NOT INITIAL.
*TRY.
* Get MATNR column
TRY.
LR_COL ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ). "get MATNR columns to insert
hotspot
CATCH CX_SALV_NOT_FOUND.
ENDTRY.

* Set the HotSpot for MATNR Column


TRY.
CALL METHOD LR_COL->SET_CELL_TYPE "set cell type hotspot
EXPORTING
VALUE = IF_SALV_C_CELL_TYPE=>HOTSPOT.
.
CATCH CX_SALV_DATA_ERROR .
ENDTRY.
ENDIF.
Inorder to implement hotspot click there is a event called LINK_CLICK, we need to implement this
event to implement hotspot click.

Step3:Follow below steps to implement LINK_CLICK event.

 Create a local class.


 Create a event handler method in that local class to handle LINK_CLICK of
CL_SALV_EVENTS_TABLE.

CLASS LCL_HANDLE_EVENTS DEFINITION.


PUBLIC SECTION.
METHODS:
ON_LINE_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
IMPORTING ROW COLUMN. "event handler method, imports row and column of
clicked value
ENDCLASS.

 Implement event handler method.

CLASS LCL_HANDLE_EVENTS IMPLEMENTATION.


METHOD ON_LINE_CLICK. "double click implementation
**handle double click here
READ TABLE IT_MARA INTO WA_MARA INDEX ROW.
IF SY-SUBRC EQ 0.
SET PARAMETER ID 'MAT' FIELD WA_MARA-MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDMETHOD. "on_link_click
ENDCLASS. "lcl_events IMPLEMENTATION

 Get events of ALV using GET_EVENT method.

*Register events
DATA: LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE.
LR_EVENTS = LR_ALV->GET_EVENT( ). "get event
 Register event handler method.

DATA: GR_EVENTS TYPE REF TO LCL_HANDLE_EVENTS.


CREATE OBJECT GR_EVENTS.
SET HANDLER GR_EVENTS->ON_LINE_CLICK FOR LR_EVENTS. "register event handler
method

Step4: Add Functions to ALV.

To set functions to ALV, we use SET_SCREEN_STATUS method, to implement this create a menu
in SE41 for this program and add using above method.
In this example I am using standard ALV functions (menu).

**set standard ALV functions visible


LR_ALV->SET_SCREEN_STATUS(
PFSTATUS = 'SALV_STANDARD'
REPORT = 'SALV_TEST_FUNCTIONS'
SET_FUNCTIONS = LR_ALV->C_FUNCTIONS_ALL ).

Final Code will be

REPORT ZSAPN_ALV_MARA_FACTARY.
CLASS LCL_HANDLE_EVENTS DEFINITION DEFERRED. "class definition deffered
TYPES: BEGIN OF TY_MARA, "MARA internal table
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE TY_MARA.
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "SALV table instance
SELECT MATNR MTART MBRSH MATKL MEINS FROM MARA INTO TABLE IT_MARA UP TO 50 ROWS.
"fetch data
* TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "get SALV factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_MARA.
* CATCH CX_SALV_MSG .
* ENDTRY.

**get ALV columns


DATA : LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE. "columns instance
DATA : LR_COL TYPE REF TO CL_SALV_COLUMN_TABLE. "column instance
CALL METHOD LR_ALV->GET_COLUMNS "get all columns
RECEIVING
VALUE = LR_COLUMNS.
IF LR_COLUMNS IS NOT INITIAL.
*TRY.
* Get MATNR column
TRY.
LR_COL ?= LR_COLUMNS->GET_COLUMN( 'MATNR' ). "get MATNR columns to insert
hotspot
CATCH CX_SALV_NOT_FOUND.
ENDTRY.

* Set the HotSpot for MATNR Column


TRY.
CALL METHOD LR_COL->SET_CELL_TYPE "set cell type hotspot
EXPORTING
VALUE = IF_SALV_C_CELL_TYPE=>HOTSPOT.
.
CATCH CX_SALV_DATA_ERROR .
ENDTRY.
ENDIF.

*Event handler method for ALV


DATA: GR_EVENTS TYPE REF TO LCL_HANDLE_EVENTS.
***handle hotspot click
CLASS LCL_HANDLE_EVENTS DEFINITION.
PUBLIC SECTION.
METHODS:
ON_LINE_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
IMPORTING ROW COLUMN. "event handler method, importing row and column of
clicked value
ENDCLASS. "lcl_events DEFINITION

*Register events
DATA: LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE.
LR_EVENTS = LR_ALV->GET_EVENT( ). "get event
CREATE OBJECT GR_EVENTS.
SET HANDLER GR_EVENTS->ON_LINE_CLICK FOR LR_EVENTS. "register event handler method
**set standard ALV functions visible
LR_ALV->SET_SCREEN_STATUS(
PFSTATUS = 'SALV_STANDARD'
REPORT = 'SALV_TEST_FUNCTIONS'
SET_FUNCTIONS = LR_ALV->C_FUNCTIONS_ALL ).

LR_ALV->DISPLAY( ). "display grid


CLASS LCL_HANDLE_EVENTS IMPLEMENTATION.
METHOD ON_LINE_CLICK. "double click implementation
**handle double click here
READ TABLE IT_MARA INTO WA_MARA INDEX ROW. "here row is index no
IF SY-SUBRC EQ 0.
SET PARAMETER ID 'MAT' FIELD WA_MARA-MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDMETHOD. "on_link_click
ENDCLASS. "lcl_events IMPLEMENTATION

Output

Click on any material no and test

Learner Questions

No Questions by learners, be first one to ask ..!!

Totals and Subtotals in ALV factory


methods
Last Updated: February 21st 2014 by Ashok Kumar Reddy

Display totals and subtotals in ALV with factory methods, aggregations in ALV,
sort in ALV

+ -
Most of the times, we may need to display totals and subtotals in ALV reports, in this lesson you will
be able to learn how to display totals and subtotals in ALV with factory methods.

Requirement:Display purchase order details for a range of purchase orders, display totals and
subtotals for a purchase order number .
Requirement Analysis: For the above requirement, we need to get data from EKPO(purchase
order item table), display subtotals for each purchase order number(EBELN field)(one purchase
order can have multiple items) and display totals of all purchase orders at the bottom.

Step1: Data declerations, get data and get factory instance.

REPORT ZSAPN_ALV_FACTORY_TOTALS.
TABLES: EKKO.
SELECT-OPTIONS : S_EBELN FOR EKKO-EBELN. "po number input
TYPES: BEGIN OF TY_EKPO, "user defined types
EBELN TYPE EKPO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE EKPO-MATNR,
BUKRS TYPE EKPO-BUKRS,
MENGE TYPE EKPO-MENGE,
END OF TY_EKPO.
DATA : IT_EKPO TYPE TABLE OF TY_EKPO, "internal table
WA_EKPO TYPE TY_EKPO. "work area

START-OF-SELECTION.
SELECT EBELN EBELP MATNR BUKRS MENGE FROM EKPO INTO TABLE IT_EKPO WHERE EBELN IN
S_EBELN. "get po data
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "alv referance

*TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "load factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_EKPO.
* CATCH CX_SALV_MSG .
*ENDTRY.

Step2: Add totals

To add totals we need to use GET_AGGREGATIONS, once we get aggregations instance, we need
to add aggregation by passing column name and aggregation type to method
ADD_AGGREGATION.
DATA: LO_AGGRS TYPE REF TO CL_SALV_AGGREGATIONS.
LO_AGGRS = LR_ALV->GET_AGGREGATIONS( ). "get aggregations
* Add TOTAL for COLUMN NETWR
TRY.
CALL METHOD LO_AGGRS->ADD_AGGREGATION "add aggregation
EXPORTING
COLUMNNAME = 'MENGE' "aggregation column name
AGGREGATION = IF_SALV_C_AGGREGATION=>TOTAL. "aggregation type

CATCH CX_SALV_DATA_ERROR . "#EC NO_HANDLER


CATCH CX_SALV_NOT_FOUND . "#EC NO_HANDLER
CATCH CX_SALV_EXISTING . "#EC NO_HANDLER
ENDTRY.

Step3: Add subtotals

To add subtotals, we need to add sort to the columns and then we have to use SET_SUBTOTAL
method to display subtotals.
DATA : LR_SORT TYPE REF TO CL_SALV_SORTS. "ALV sorts
CALL METHOD LR_ALV->GET_SORTS "get sorts
RECEIVING
VALUE = LR_SORT.
*TRY.
DATA : LR_SORT_COLUMN TYPE REF TO CL_SALV_SORT. "column sort
CALL METHOD LR_SORT->ADD_SORT "add column sort
EXPORTING
COLUMNNAME = 'EBELN' "sort column always keyfield
* POSITION =
* SEQUENCE = IF_SALV_C_SORT=>SORT_UP
* SUBTOTAL = IF_SALV_C_BOOL_SAP=>FALSE
* GROUP = IF_SALV_C_SORT=>GROUP_NONE
* OBLIGATORY = IF_SALV_C_BOOL_SAP=>FALSE
RECEIVING
VALUE = LR_SORT_COLUMN.

* TRY.
CALL METHOD LR_SORT_COLUMN->SET_SUBTOTAL "add subtotal
EXPORTING
VALUE = IF_SALV_C_BOOL_SAP=>TRUE.
* CATCH CX_SALV_DATA_ERROR .
* ENDTRY.

Step4: Display ALV

LR_ALV->DISPLAY( ). "display ALV

Final code will be

REPORT ZSAPN_ALV_FACTORY_TOTALS.
TABLES: EKKO.
SELECT-OPTIONS : S_EBELN FOR EKKO-EBELN. "po number input
TYPES: BEGIN OF TY_EKPO, "user defined types
EBELN TYPE EKPO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE EKPO-MATNR,
BUKRS TYPE EKPO-BUKRS,
MENGE TYPE EKPO-MENGE,
END OF TY_EKPO.
DATA : IT_EKPO TYPE TABLE OF TY_EKPO, "internal table
WA_EKPO TYPE TY_EKPO. "work area
START-OF-SELECTION.
SELECT EBELN EBELP MATNR BUKRS MENGE FROM EKPO INTO TABLE IT_EKPO WHERE EBELN IN
S_EBELN. "get po data
DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "alv referance
*TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY "load factory instance
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = IT_EKPO.
* CATCH CX_SALV_MSG .
*ENDTRY.

DATA: LO_AGGRS TYPE REF TO CL_SALV_AGGREGATIONS.


LO_AGGRS = LR_ALV->GET_AGGREGATIONS( ). "get aggregations
* Add TOTAL for COLUMN NETWR
TRY.
CALL METHOD LO_AGGRS->ADD_AGGREGATION "add aggregation
EXPORTING
COLUMNNAME = 'MENGE' "aggregation column name
AGGREGATION = IF_SALV_C_AGGREGATION=>TOTAL. "aggregation type

CATCH CX_SALV_DATA_ERROR . "#EC NO_HANDLER


CATCH CX_SALV_NOT_FOUND . "#EC NO_HANDLER
CATCH CX_SALV_EXISTING . "#EC NO_HANDLER
ENDTRY.
* Bring the total line to top
DATA : LR_SORT TYPE REF TO CL_SALV_SORTS. "ALV sorts
CALL METHOD LR_ALV->GET_SORTS "get sorts
RECEIVING
VALUE = LR_SORT.
*TRY.
DATA : LR_SORT_COLUMN TYPE REF TO CL_SALV_SORT. "column sort
CALL METHOD LR_SORT->ADD_SORT "add column sort
EXPORTING
COLUMNNAME = 'EBELN' "sort column always keyfield
* POSITION =
* SEQUENCE = IF_SALV_C_SORT=>SORT_UP
* SUBTOTAL = IF_SALV_C_BOOL_SAP=>FALSE
* GROUP = IF_SALV_C_SORT=>GROUP_NONE
* OBLIGATORY = IF_SALV_C_BOOL_SAP=>FALSE
RECEIVING
VALUE = LR_SORT_COLUMN.
* TRY.
CALL METHOD LR_SORT_COLUMN->SET_SUBTOTAL "add subtotal
EXPORTING
VALUE = IF_SALV_C_BOOL_SAP=>TRUE.
* CATCH CX_SALV_DATA_ERROR .
* ENDTRY.
* CATCH CX_SALV_NOT_FOUND .
* CATCH CX_SALV_EXISTING .
* CATCH CX_SALV_DATA_ERROR .
*ENDTRY.
LR_ALV->DISPLAY( ). "display ALV

Output
Learner Questions

 I want to show a text like "Total" before each Total value (not at the end of the list). Please let
me know how to do it. Urgent.
 Thank you for providing an illustration of Aggregation. Please do add one more solution for
my question, How can we set subtotals for multiple columns using factory method? In the
illustration provided, we may add one more column, say NETPR, for displaying Net
Purchasing Value. In that case we need to aggregate subtotal for both the MENGE and
NETPR fields. Please help me modify the code accordingly. Is there any other methods to
achieve aggregation of multiple columns? Please do reply.
 Top of page and end of page in
ALV with factory methods
 Last Updated: February 21st 2014 by Ashok Kumar Reddy
 Display top of page, end of page using ALV factory methods, top of list in
ALV factory methods
 + -
 The below example explains you how to add top of page(top of list) and end of page to ALV
report with factory method.
 Requirement:Display purchase order details for a range of purchase orders, display totals
and subtotals for a purchase order number .Display top of page(top of list) and end of list.
 Requirement Analysis: For the above requirement, we need to get data from
EKPO(purchase order item table), display subtotals for each purchase order number(EBELN
field)(one purchase order can have multiple items) and display totals of all purchase orders
at the bottom.Display top of page(top of list) and end of list
 Step1: Data decelerations, get data and get factory instance.
 REPORT ZSAPN_ALV_FACTORY_TOTALS.
 TABLES: EKKO.
 SELECT-OPTIONS : S_EBELN FOR EKKO-EBELN. "po number input
 TYPES: BEGIN OF TY_EKPO, "user defined types
 EBELN TYPE EKPO-EBELN,
 EBELP TYPE EKPO-EBELP,
 MATNR TYPE EKPO-MATNR,
 BUKRS TYPE EKPO-BUKRS,
 MENGE TYPE EKPO-MENGE,
 END OF TY_EKPO.
 DATA : IT_EKPO TYPE TABLE OF TY_EKPO, "internal table
 WA_EKPO TYPE TY_EKPO. "work area

 START-OF-SELECTION.
 SELECT EBELN EBELP MATNR BUKRS MENGE FROM EKPO INTO TABLE IT_EKPO WHERE
EBELN IN S_EBELN. "get po data
 DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "alv referance

 *TRY.
 CALL METHOD CL_SALV_TABLE=>FACTORY "load factory instance
 * EXPORTING
 * LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
 * R_CONTAINER =
 * CONTAINER_NAME =
 IMPORTING
 R_SALV_TABLE = LR_ALV
 CHANGING
 T_TABLE = IT_EKPO.
 * CATCH CX_SALV_MSG .
 *ENDTRY.

 Step2: Add totals


 To add totals we need to use GET_AGGREGATIONS, once we get aggregations instance,
we need to add aggregation by passing column name and aggregation type to method
ADD_AGGREGATION.
 DATA: LO_AGGRS TYPE REF TO CL_SALV_AGGREGATIONS.
 LO_AGGRS = LR_ALV->GET_AGGREGATIONS( ). "get aggregations
 * Add TOTAL for COLUMN NETWR
 TRY.
 CALL METHOD LO_AGGRS->ADD_AGGREGATION "add aggregation
 EXPORTING
 COLUMNNAME = 'MENGE' "aggregation column name
 AGGREGATION = IF_SALV_C_AGGREGATION=>TOTAL. "aggregation type

 CATCH CX_SALV_DATA_ERROR . "#EC NO_HANDLER
 CATCH CX_SALV_NOT_FOUND . "#EC NO_HANDLER
 CATCH CX_SALV_EXISTING . "#EC NO_HANDLER
 ENDTRY.

 Step3: Add subtotals


 To add subtotals, we need to add sort to the columns and then we have to use
SET_SUBTOTAL method to display subtotals.
 DATA : LR_SORT TYPE REF TO CL_SALV_SORTS. "ALV sorts
 CALL METHOD LR_ALV->GET_SORTS "get sorts
 RECEIVING
 VALUE = LR_SORT.
 *TRY.
 DATA : LR_SORT_COLUMN TYPE REF TO CL_SALV_SORT. "column sort
 CALL METHOD LR_SORT->ADD_SORT "add column sort
 EXPORTING
 COLUMNNAME = 'EBELN' "sort column always keyfield
 * POSITION =
 * SEQUENCE = IF_SALV_C_SORT=>SORT_UP
 * SUBTOTAL = IF_SALV_C_BOOL_SAP=>FALSE
 * GROUP = IF_SALV_C_SORT=>GROUP_NONE
 * OBLIGATORY = IF_SALV_C_BOOL_SAP=>FALSE
 RECEIVING
 VALUE = LR_SORT_COLUMN.

 * TRY.
 CALL METHOD LR_SORT_COLUMN->SET_SUBTOTAL "add subtotal
 EXPORTING
 VALUE = IF_SALV_C_BOOL_SAP=>TRUE.
 * CATCH CX_SALV_DATA_ERROR .
 * ENDTRY.

 Step4: Add top of page(top of list) and end of list.


 To add top of page and end of list we need to create a layout gird and insert that grid into
ALV using method SET_TOP_OF_LIST.
 Create layout grid.
 DATA : LR_HEADER TYPE REF TO CL_SALV_FORM_ELEMENT.
 DATA: LR_GRID_LAYOUT TYPE REF TO CL_SALV_FORM_LAYOUT_GRID,
 LR_LABEL TYPE REF TO CL_SALV_FORM_LABEL,
 LR_TEXT TYPE REF TO CL_SALV_FORM_TEXT,
 L_TEXT TYPE STRING.
 CREATE OBJECT LR_GRID_LAYOUT.
 L_TEXT = 'Purchase Order Report' .
 LR_GRID_LAYOUT->CREATE_HEADER_INFORMATION(
 ROW = 1
 COLUMN = 3
 TEXT = L_TEXT
 TOOLTIP = L_TEXT ).
 LR_GRID_LAYOUT->ADD_ROW( ).
 * LR_GRID_LAYOUT_1 = LR_GRID_LAYOUT->CREATE_GRID(
 * ROW = 3
 * COLUMN = 1 ).
 LR_LABEL = LR_GRID_LAYOUT->CREATE_LABEL(
 ROW = 2
 COLUMN = 1
 TEXT = 'Number of records found: '
 TOOLTIP = 'Number of records found for your query' ).
 LR_TEXT = LR_GRID_LAYOUT->CREATE_TEXT(
 ROW = 2
 COLUMN = 2
 TEXT = LV_CNT
 TOOLTIP = LV_CNT ).
 LR_LABEL->SET_LABEL_FOR( LR_TEXT ).
 LR_LABEL = LR_GRID_LAYOUT->CREATE_LABEL(
 ROW = 3
 COLUMN = 1
 TEXT = 'Date : '
 TOOLTIP = 'Date' ).
 L_TEXT = SY-DATUM.
 LR_TEXT = LR_GRID_LAYOUT->CREATE_TEXT(
 ROW = 3
 COLUMN = 2
 TEXT = L_TEXT
 TOOLTIP = L_TEXT ).
 LR_LABEL->SET_LABEL_FOR( LR_TEXT ).
 LR_HEADER = LR_GRID_LAYOUT.
 Create top of list.
 CALL METHOD LR_ALV->SET_TOP_OF_LIST
 EXPORTING
 VALUE = LR_HEADER.

 Step5: Add End Of List


 End of list can be created using method SET_END_OF_LIST.
 DATA: LR_FOOTER TYPE REF TO CL_SALV_FORM_HEADER_INFO.
 CLEAR L_TEXT.
 L_TEXT = 'End of List as Footer'.
 CREATE OBJECT LR_FOOTER
 EXPORTING
 TEXT = L_TEXT
 TOOLTIP = L_TEXT.
 LR_ALV->SET_END_OF_LIST( LR_FOOTER ).

 Step6: Display ALV


 LR_ALV->DISPLAY( ). "display ALV

 Final code will be


 REPORT ZSAPN_ALV_FACTORY_TOPOFLIST.
 TABLES: EKKO.
 SELECT-OPTIONS : S_EBELN FOR EKKO-EBELN. "po number input
 TYPES: BEGIN OF TY_EKPO, "user defined types
 EBELN TYPE EKPO-EBELN,
 EBELP TYPE EKPO-EBELP,
 MATNR TYPE EKPO-MATNR,
 BUKRS TYPE EKPO-BUKRS,
 MENGE TYPE EKPO-MENGE,
 END OF TY_EKPO.
 DATA : IT_EKPO TYPE TABLE OF TY_EKPO, "internal table
 WA_EKPO TYPE TY_EKPO. "work area
 DATA : LV_CNT TYPE I.

 START-OF-SELECTION.
 SELECT EBELN EBELP MATNR BUKRS MENGE FROM EKPO INTO TABLE IT_EKPO WHERE
EBELN IN S_EBELN. "get po data
 DESCRIBE TABLE IT_EKPO LINES LV_CNT.
 DATA : LR_ALV TYPE REF TO CL_SALV_TABLE. "alv referance
 *TRY.
 CALL METHOD CL_SALV_TABLE=>FACTORY "load factory instance
 * EXPORTING
 * LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
 * R_CONTAINER =
 * CONTAINER_NAME =
 IMPORTING
 R_SALV_TABLE = LR_ALV
 CHANGING
 T_TABLE = IT_EKPO.
 * CATCH CX_SALV_MSG .
 *ENDTRY.

 DATA: LO_AGGRS TYPE REF TO CL_SALV_AGGREGATIONS.
 LO_AGGRS = LR_ALV->GET_AGGREGATIONS( ). "get aggregations
 * Add TOTAL for COLUMN NETWR
 TRY.
 CALL METHOD LO_AGGRS->ADD_AGGREGATION "add aggregation
 EXPORTING
 COLUMNNAME = 'MENGE' "aggregation column name
 AGGREGATION = IF_SALV_C_AGGREGATION=>TOTAL. "aggregation type

 CATCH CX_SALV_DATA_ERROR . "#EC NO_HANDLER
 CATCH CX_SALV_NOT_FOUND . "#EC NO_HANDLER
 CATCH CX_SALV_EXISTING . "#EC NO_HANDLER
 ENDTRY.
 * Bring the total line to top
 DATA : LR_SORT TYPE REF TO CL_SALV_SORTS. "ALV sorts
 CALL METHOD LR_ALV->GET_SORTS "get sorts
 RECEIVING
 VALUE = LR_SORT.
 *TRY.
 DATA : LR_SORT_COLUMN TYPE REF TO CL_SALV_SORT. "column sort
 CALL METHOD LR_SORT->ADD_SORT "add column sort
 EXPORTING
 COLUMNNAME = 'EBELN' "sort column always keyfield
 * POSITION =
 * SEQUENCE = IF_SALV_C_SORT=>SORT_UP
 * SUBTOTAL = IF_SALV_C_BOOL_SAP=>FALSE
 * GROUP = IF_SALV_C_SORT=>GROUP_NONE
 * OBLIGATORY = IF_SALV_C_BOOL_SAP=>FALSE
 RECEIVING
 VALUE = LR_SORT_COLUMN.
 * TRY.
 CALL METHOD LR_SORT_COLUMN->SET_SUBTOTAL "add subtotal
 EXPORTING
 VALUE = IF_SALV_C_BOOL_SAP=>TRUE.
 * CATCH CX_SALV_DATA_ERROR .
 * ENDTRY.
 * CATCH CX_SALV_NOT_FOUND .
 * CATCH CX_SALV_EXISTING .
 * CATCH CX_SALV_DATA_ERROR .
 *ENDTRY.
 ***Top of Page
 DATA : LR_HEADER TYPE REF TO CL_SALV_FORM_ELEMENT.
 DATA: LR_GRID_LAYOUT TYPE REF TO CL_SALV_FORM_LAYOUT_GRID,
 LR_LABEL TYPE REF TO CL_SALV_FORM_LABEL,
 LR_TEXT TYPE REF TO CL_SALV_FORM_TEXT,
 L_TEXT TYPE STRING.
 CREATE OBJECT LR_GRID_LAYOUT.
 L_TEXT = 'Purchase Order Report' .
 LR_GRID_LAYOUT->CREATE_HEADER_INFORMATION( "create header for gird
 ROW = 1
 COLUMN = 3
 TEXT = L_TEXT
 TOOLTIP = L_TEXT ).
 LR_GRID_LAYOUT->ADD_ROW( ). "add row
 LR_LABEL = LR_GRID_LAYOUT->CREATE_LABEL(
 ROW = 2
 COLUMN = 1
 TEXT = 'Number of records found: '
 TOOLTIP = 'Number of records found for your query' ).
 LR_TEXT = LR_GRID_LAYOUT->CREATE_TEXT(
 ROW = 2
 COLUMN = 2
 TEXT = LV_CNT
 TOOLTIP = LV_CNT ).
 LR_LABEL->SET_LABEL_FOR( LR_TEXT ).
 LR_LABEL = LR_GRID_LAYOUT->CREATE_LABEL(
 ROW = 3
 COLUMN = 1
 TEXT = 'Date : '
 TOOLTIP = 'Date' ).
 L_TEXT = SY-DATUM.
 LR_TEXT = LR_GRID_LAYOUT->CREATE_TEXT(
 ROW = 3
 COLUMN = 2
 TEXT = L_TEXT
 TOOLTIP = L_TEXT ).
 LR_LABEL->SET_LABEL_FOR( LR_TEXT ).
 LR_HEADER = LR_GRID_LAYOUT.
 CALL METHOD LR_ALV->SET_TOP_OF_LIST "set top of list
 EXPORTING
 VALUE = LR_HEADER.
 ***end of list
 DATA: LR_FOOTER TYPE REF TO CL_SALV_FORM_HEADER_INFO.
 CLEAR L_TEXT.
 L_TEXT = 'End of List as Footer'.
 CREATE OBJECT LR_FOOTER
 EXPORTING
 TEXT = L_TEXT
 TOOLTIP = L_TEXT.
 LR_ALV->SET_END_OF_LIST( LR_FOOTER ). "set end of list

 LR_ALV->DISPLAY( ). "display ALV

 Output

 Learner Questions

 No Questions by learners, be first one to ask ..!!

You might also like