Sei sulla pagina 1di 46

Introduction to ALV Classic

Reporting

A step-by-step programming guide to ALV


reports
INTRODUCTION

SAP has introduced a lot of new technologies with Release 4.6. All of these are designed to have a
more pleasing user interface and make the work of the developer easier by automating many of the standard
functionalities, which was needed to be coded explicitly earlier. Along with automation, the new technologies
also bring with it a host of new and powerful features. But to use these features you have to master them. It is
similar to saying that if you have a Formula 1 Ferrari, the thrill is only if you can drive it at 200 kms/hr.

ALV or the SAP LIST VIEWER is one such technology. It is a tool for making reports with a better and
standardized interface. All clients want the latest of technologies to be used for their implementation and our
client was no exception. We initially found the going tough because there is hardly any documentation on ALV
with the small exception of a few sample codes on the Internet. But with hard work and an exploring attitude
we (the SAP MAM Team of Transco ODC) developed a fair amount of competency in ALV. This document is
in a way, the documentation of our learnings.

This document is NOT a comprehensive work on ALV. Indeed, there are many features that we
discover every week. This manual gives an introduction to ALV and on how a person can write simple ALV
reports. It has been written with FULL code dumps and screen shots so that there is no scope for confusion. It
tries to give the initial impetus required to venture into further exploration of the technology. There is no doubt
that you will find newer features and ‘smarter’ way of doing things in ALV. It is our request to you to document
these learnings and contribute to the EAS Knowledge Base. Remember, Rome was not built in a day.

With this let us put our best foot forward …

All programs in this document (ZSOMALV1-7) are available in the SAP PDC
Server. In case you are using them, you are requested to make a copy of them
and then work on the copy.
INDEX

1. A Simple ALV Program ........................................................................................................................

2. Choosing and saving Layouts. ...........................................................................................................

3. Specifying a field Catalogue................................................................................................................

4. Initialize Events .....................................................................................................................................

5. Customize you PF Status ....................................................................................................................

6. Process callback events ......................................................................................................................

7. Sort Catalogue.......................................................................................................................................

APPENDIX: A – TYPE-POOL ‘SLIS’ ........................................................................................................

APPENDIX: B – HOW TO COLOUR LINES OF A REPORT..................................................................


Chapter

1
A Simple ALV Program
TOPICS INTRODUCED

1) A simple ALV program.

2) REUSE_ALV_GRID_DISPLAY.

3) Minimum parameters to be passed.

Report ZSOMALV1:

REPORT zsomalv1 NO STANDARD PAGE HEADING.

*Description-----------------------------------------------------------*
* This program shows a simple ALV display of the table QMEL. Use the
* 'Pattern' button to write the call to function
* 'REUSE_ALV_GRID_DISPLAY'. Pass the table i_qmel to the function.
*----------------------------------------------------------------------*

DATA: i_qmel LIKE qmel OCCURS 0.

SELECT * FROM qmel INTO TABLE i_qmel.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
i_structure_name = 'QMEL'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT =
* IT_FIELDCAT =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = i_qmel
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

OUTPUT

. 2
Any ALV program requires a minimum of two parameters to be passed to the function
REUSE_ALV_GRID_DISPLAY.
 Field Catalogue (Details of the format of the columns to be displayed in the report)
 And the data to be populated in those columns.

In the above case we are passing the name of the table itself (in place of the field catalogue which
is discussed later). The function automatically creates the field catalogue in this case.

ALV automatically sets a standard PF-STATUS (the row of buttons above the report). With these
you can do a lot of standard functions like send it by mail, sort, save as a local file etc).

A common mistake that every beginner does is not to uncomment the ‘EXPORTING’ line of the function after
writing it by the Pattern button. Due to it, the function does not recognize the structure name being passed to it.

Chapter

2
Choosing and saving Layouts
TOPICS INTRODUCED

1) How we can ensure that report allows the user to make, choose and save layouts (also called
display variants).

2) Optimize the column width to display data in the most efficient manner.

3) Other options that can be specified for layouts.

Report ZSOMALV2:

REPORT zsomalv2 NO STANDARD PAGE HEADING.


TYPE-POOLS: slis.

DATA: report_id LIKE sy-repid.


DATA: i_qmel LIKE qmel OCCURS 0.
DATA: i_layout TYPE slis_layout_alv.

SELECT * FROM qmel INTO TABLE i_qmel.

report_id = sy-repid.
PERFORM f1000_layout_init CHANGING i_layout.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

. 3
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
i_callback_program = report_id
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
i_structure_name = 'QMEL'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = i_layout
* IT_FIELDCAT =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A'
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = i_qmel
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*&---------------------------------------------------------------------*
*& Form F1000_Layout_Init
*&---------------------------------------------------------------------*

FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.

CLEAR i_layout.
i_layout-colwidth_optimize = 'X'.

ENDFORM. " F1000_Layout_Init

. 4
OUTPUT

Difference in this program is the usage of a Type-Pool (SLIS). This type pool contains all the
standard structures and tables (for eg. slis_alv_layout), which are to be populated and passed to
REUSE_ALV_GRID_DISPLAY. It is a good idea to keep a printout of this type-pool when coding
ALV programs. This is also included in this document as APPENDIX A.

Other difference is that we are passing a value ‘A’ to the parameter i_save,
Value range of parameter i_save can be,
' ' = No display variants can be saved
'X' = Only standard display variants can be saved
'U‘ = Only user-specific display variants can be saved
'A' = Standard and user-specific display variants can be saved

Note that 2 other buttons have appeared in the PF-STATUS (Change Layout and Save layout). When you click on
‘Change Layout’, a window comes up where you can specify the sort order, which all columns to be displayed and
other properties).

. 5
You can also sort the report using the sort buttons etc and click ‘Save Layout’. Then you are asked
whether it is user specific or default.

For all such interactive functions to work, we also need to pass the program ID (sy-repid) to ALV (I
meant REUSE_ALV ….). But it should never be passed alone, only after assigning it to a variable.

The final thing is the passing of layout specifications (i_layout) to ALV. Please refer to the other
fields in the structure slis_layout_alv (it is combination of two structures which has more structures
etc). Through them you can specify a host of other properties.

For example,
i_layout-zebra = ‘X’  This will result in the lines of the report having alternate colour.
i_layout-no_vline = ‘X”  Columns are separated by space.
i_layout-no_scrolling = ‘X”  Scrolling is disabled.

We found that a lot of such options were not working. If you do further R&D on this; please document them and
contribute to the EAS KB.

. 6
Chapter

3
Specifying a field Catalogue
TOPICS INTRODUCED

1) Specify a heading for a report.

2) Create a field catalogue for the report.

In real life situations we will not need to simply display a table as we have been doing above. Most
probably it will be an internal table with a specific set of fields from different tables and maybe plain
integer or character fields. In such cases the simplest method to follow is to create an internal table
(of the same structure as what is to be displayed in the report) with the data; pass it to ALV and
also a field catalogue (also called fieldcat).

Report ZSOMALV3:

REPORT zsomalv3 NO STANDARD PAGE HEADING.

*Description-----------------------------------------------------------*
* TOPICS INTRODUCED:
* 1. Specify a heading for a report.
* 2. Create a field catalogue for the report.
*----------------------------------------------------------------------*

TYPE-POOLS: slis.

DATA: BEGIN OF i_data OCCURS 0,


qmnum LIKE qmel-qmnum,
qmart LIKE qmel-qmart,
qmtxt LIKE qmel-qmtxt,
ws_row TYPE i,
ws_char(5) TYPE c,
chk,
END OF i_data.

DATA: report_id LIKE sy-repid.


DATA: ws_title TYPE lvc_title VALUE 'An ALV Report'.
DATA: i_layout TYPE slis_layout_alv.
DATA: i_fieldcat TYPE slis_t_fieldcat_alv.

SELECT qmnum
qmart
qmtxt
INTO TABLE i_data
FROM qmel
WHERE qmnum <= '00030000010'.

LOOP AT i_data.

. 7
i_data-ws_row = sy-tabix.
i_data-ws_char = 'AAAAA'.
MODIFY i_data.
ENDLOOP.

report_id = sy-repid.
PERFORM f1000_layout_init CHANGING i_layout.
PERFORM f2000_fieldcat_init CHANGING i_fieldcat.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
i_callback_program = report_id
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* i_structure_name = ' '
* I_BACKGROUND_ID = ' '
i_grid_title = ws_title
* I_GRID_SETTINGS =
is_layout = i_layout
it_fieldcat = i_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A'
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = i_data
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*&---------------------------------------------------------------------*
*& Form F1000_Layout_Init
*&---------------------------------------------------------------------*

. 8
FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.

CLEAR i_layout.
i_layout-colwidth_optimize = 'X'.
i_layout-edit = 'X'.

ENDFORM. " F1000_Layout_Init


*&---------------------------------------------------------------------*
*& Form f2000_fieldcat_init
*&---------------------------------------------------------------------*
FORM f2000_fieldcat_init CHANGING i_fieldcat TYPE slis_t_fieldcat_alv.

DATA: line_fieldcat TYPE slis_fieldcat_alv.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMNUM'. " The field name and the table
line_fieldcat-tabname = 'I_DATA'. " name are the two minimum req.
line_fieldcat-key = 'X'. " Specifies the column as a key (Blue)
line_fieldcat-seltext_m = 'Notification No.'. " Column Header
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMART'.
line_fieldcat-ref_tabname = 'I_DATA'.
line_fieldcat-hotspot = 'X'. " Shows the field as a hotspot.
line_fieldcat-seltext_m = 'Notif Type'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMTXT'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Description'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_ROW'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Row Number'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_CHAR'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Test Character Field'.
line_fieldcat-datatype = 'CHAR'.
line_fieldcat-outputlen = '15'. " You can specify the width of a
APPEND line_fieldcat TO i_fieldcat. " column.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'CHK'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Checkbox'.
line_fieldcat-checkbox = 'X'. " Display this field as a checkbox
line_fieldcat-edit = 'X'. " This option ensures that you can
" edit the checkbox. Else it will
" be protected.
APPEND line_fieldcat TO i_fieldcat.

ENDFORM. " f2000_fieldcat_init

. 9
OUTPUT

Over here we are purposely using a customized internal table which is being displayed in ALV. Notice
that it contains two kinds of fields. Ones with DDIC (Data Dictionary Reference) and others without. The
table we are using to create a field catalogue (i_fieldcat) is of type slis_t_fieldcat_alv. It is a table of structure
slis_fieldcat_alv. Refer to the SLIS type-pool to get the other options that you can specify for a column.

For example,
line_fieldcat-icon = ‘X’  Specifies this column as a column of icons. You must then
specify valid icon values for tnem to be shown in the report.
line_fieldcat-lzero = ’X’  Allows leading zeroes to be shown for a number column.
line_fieldcat-just = ‘R’  R – Justify right, L – Left, C – Centre. Etc.

You can display a heading for the report using type lvc_title as shown.

NOTE: The table i_fieldcat is passed to the parameter it_fieldcat of the function instead of
i_structure_name as earlier.

. 10
Chapter

4
Initialize Events
TOPICS INTRODUCED

1) Initialize events.

2) Execute a specific requirement when an event is triggered.

3) Use an event 'TOP_OF_PAGE' to write a header for the report.

4) REUSE_ALV_COMMENTARY WRITE.

Report ZSOMALV4:

REPORT zsomalv4 NO STANDARD PAGE HEADING.

*Description-----------------------------------------------------------*
* TOPICS INTRODUCED:
* 1. Initialize events.
* 2. Execute a specific requirement when an event is triggered.
* 3. Use an event 'TOP_OF_PAGE' to write a header for the report.
* 4. REUSE_ALV_COMMENTARY WRITE.
*----------------------------------------------------------------------*

TYPE-POOLS: slis.

DATA: BEGIN OF i_data OCCURS 0,


qmnum LIKE qmel-qmnum,
qmart LIKE qmel-qmart,
qmtxt LIKE qmel-qmtxt,
ws_row TYPE i,
ws_char(5) TYPE c,
chk,
END OF i_data.

DATA: report_id LIKE sy-repid.


DATA: ws_title TYPE lvc_title VALUE 'An ALV Report'.
DATA: i_layout TYPE slis_layout_alv.
DATA: i_fieldcat TYPE slis_t_fieldcat_alv.
DATA: i_events TYPE slis_t_event.
DATA: i_header TYPE slis_t_listheader.

SELECT qmnum
qmart
qmtxt
INTO TABLE i_data
FROM qmel
WHERE qmnum <= '00030000010'.

. 11
LOOP AT i_data.
i_data-ws_row = sy-tabix.
i_data-ws_char = 'AAAAA'.
MODIFY i_data.
ENDLOOP.

report_id = sy-repid.
PERFORM f1000_layout_init CHANGING i_layout.
PERFORM f2000_fieldcat_init CHANGING i_fieldcat.
PERFORM f3000_build_header CHANGING i_header.
PERFORM f4000_events_init CHANGING i_events.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
i_callback_program = report_id
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* i_structure_name = ' '
* I_BACKGROUND_ID = ' '
i_grid_title = ws_title
* I_GRID_SETTINGS =
is_layout = i_layout
it_fieldcat = i_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A'
* IS_VARIANT =
it_events = i_events
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = i_data
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

. 12
*&---------------------------------------------------------------------*
*& Form F1000_Layout_Init
*&---------------------------------------------------------------------*

FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.

CLEAR i_layout.
i_layout-colwidth_optimize = 'X'.
i_layout-edit = 'X'.

ENDFORM. " F1000_Layout_Init


*&---------------------------------------------------------------------*
*& Form f2000_fieldcat_init
*&---------------------------------------------------------------------*
FORM f2000_fieldcat_init CHANGING i_fieldcat TYPE slis_t_fieldcat_alv.

DATA: line_fieldcat TYPE slis_fieldcat_alv.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMNUM'. " The field name and the table
line_fieldcat-tabname = 'I_DATA'. " name are the two minimum req.
line_fieldcat-key = 'X'. " Specifies the column as a key (Blue)
line_fieldcat-seltext_m = 'Notification No.'. " Column Header
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMART'.
line_fieldcat-ref_tabname = 'I_DATA'.
line_fieldcat-hotspot = 'X'. " Shows the field as a hotspot.
line_fieldcat-seltext_m = 'Notif Type'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMTXT'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Description'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_ROW'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Row Number'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_CHAR'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Test Character Field'.
line_fieldcat-datatype = 'CHAR'.
line_fieldcat-outputlen = '15'. " You can specify the width of a
APPEND line_fieldcat TO i_fieldcat. " column.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'CHK'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Checkbox'.
line_fieldcat-checkbox = 'X'. " Display this field as a checkbox
line_fieldcat-edit = 'X'. " This option ensures that you can
" edit the checkbox. Else it will
" be protected.
APPEND line_fieldcat TO i_fieldcat.

ENDFORM. " f2000_fieldcat_init

. 13
*&---------------------------------------------------------------------*
*& Form f3000_build_header
*&---------------------------------------------------------------------*

FORM f3000_build_header USING i_header TYPE slis_t_listheader.

DATA: gs_line TYPE slis_listheader.

CLEAR gs_line.
gs_line-typ = 'H'.
gs_line-info = 'This is line of type HEADER'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'S'.
gs_line-key = 'STATUS 1'.
gs_line-info = 'This is line of type STATUS'.
APPEND gs_line TO i_header.
gs_line-key = 'STATUS 2'.
gs_line-info = 'This is also line of type STATUS'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'A'.
gs_line-info = 'This is line of type ACTION'.
APPEND gs_line TO i_header.

ENDFORM. " f3000_build_header

*&---------------------------------------------------------------------*
*& Form f4000_events_init
*&---------------------------------------------------------------------*
FORM f4000_events_init CHANGING i_events TYPE slis_t_event.

DATA: line_event TYPE slis_alv_event.

CLEAR line_event.
line_event-name = 'TOP_OF_PAGE'.
line_event-form = 'F4100_TOP_OF_PAGE'.
APPEND line_event TO i_events.

ENDFORM. " f3000_events_init

*---------------------------------------------------------------------*
* FORM F4100_TOP_OF_PAGE *
*---------------------------------------------------------------------*

FORM f4100_top_of_page.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'


EXPORTING
it_list_commentary = i_header.
ENDFORM.

. 14
OUTPUT

First let us discuss about events. As you may be aware, ABAP is a event driven language. Through
ALV we can cause one or more things to occur when an event is triggered. Over here in the above
example, we have defined the event TOP_OF_PAGE (By defining an event, I mean associating a form to it,
which is executed when that event occurs).

To define an event, first declare a table of type slis_t_event and through a form (f4000_events_init)
append lines to the table i_events. Each line is of type slis_alv_event and contains only two fields; the event
and the associated form, which is executed upon that event. Later i_events is passed to ALV.

To write a header, we use the function REUSE_ALV_COMMENTARY_WRITE. This function can be


used to write headers or footers for reports. To this function we pass a table of the text that we want to be
written in the report. It is of type slis_t_listheader. This is a table of rows, which can of three types,
HEADER, STATUS or ACTION as defined in the type slis_listheader, which is a line item of
slis_t_listheader. (P.S: Please don’t ask we why we have only three types. I don’t know!!)

ALV supports 16 events. They are:


1. ITEM_DATA_EXPAND
2. REP
3. REP_SEL_MODIFY
4. CALLER_EXIT
5. USER_COMMAND

. 15
6. TOP_OF_PAGE
7. DATA_CHANGED
8. TOP_OF_COVERPAGE
9. END_OF_COVERPAGE
10. FOREIGN_TOP_OF_PAGE
11. FOREIGN_END_OF_PAGE
12. PF_STATUS_SET
13. LIST_MODIFY
14. TOP_OF_LIST
15. END_OF_PAGE
16. END_OF_LIST
17. AFTER_LINE_OUTPUT
18. BEFORE_LINE_OUTPUT
19. SUBTOTAL_TEXT

. 16
Chapter

5
Customize you PF Status
TOPICS INTRODUCED

1) Learn about the ‘Standard’ PF-Status that comes as default.

2) Exclude function codes from ‘Standard’ PF-Status and customize it.

In all the previous reports, we have seen that ALV displays a standard PF Status by
default, which contains a bare minimum function codes (also called fcodes). This is helpful
because we do not have to explicitly code the PF Status. Actually, this PF Status is the
‘STANDARD’ PF Status of the program SAPLSALV with 46 function codes excluded (disabled).
Use transaction SE41 to view all the function codes.

In most practical cases, we will need to exclude some function codes from the standard
PF Status because they might be irrelevant to our report or because we may need to disable
certain standard function codes. (For example, there are reports where the user must NOT be
allowed to sort).

In the following program we will see how we display the entire ‘STANDARD’ PF Status
(including the 46 fcodes which are usually disabled) and also disable 4 of the fcodes.

Report ZSOMALV5:

REPORT zsomalv5 NO STANDARD PAGE HEADING.

*Description-----------------------------------------------------------*
* TOPICS INTRODUCED:
* 1. Learn about the ‘Standard’ PF-Status that comes as default.
* 2. Exclude function codes from ‘Standard’ PF-Status and customize it.
*----------------------------------------------------------------------*

TYPE-POOLS: slis.

DATA: BEGIN OF i_data OCCURS 0,


qmnum LIKE qmel-qmnum,
qmart LIKE qmel-qmart,
qmtxt LIKE qmel-qmtxt,
ws_row TYPE i,
ws_char(5) TYPE c,
chk,
END OF i_data.

DATA: report_id LIKE sy-repid.


DATA: ws_title TYPE lvc_title VALUE 'An ALV Report'.
DATA: i_layout TYPE slis_layout_alv.
DATA: i_fieldcat TYPE slis_t_fieldcat_alv.

. 17
DATA: i_events TYPE slis_t_event.
DATA: i_header TYPE slis_t_listheader.
DATA: i_extab TYPE slis_t_extab.

SELECT qmnum
qmart
qmtxt
INTO TABLE i_data
FROM qmel
WHERE qmnum <= '00030000010'.

LOOP AT i_data.
i_data-ws_row = sy-tabix.
i_data-ws_char = 'AAAAA'.
MODIFY i_data.
ENDLOOP.

report_id = sy-repid.
PERFORM f1000_layout_init CHANGING i_layout.
PERFORM f2000_fieldcat_init CHANGING i_fieldcat.
PERFORM f3000_build_header CHANGING i_header.
PERFORM f4000_events_init CHANGING i_events.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
i_callback_program = report_id
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* i_structure_name = ' '
* I_BACKGROUND_ID = ' '
i_grid_title = ws_title
* I_GRID_SETTINGS =
is_layout = i_layout
it_fieldcat = i_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A'
* IS_VARIANT =
it_events = i_events
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =

. 18
TABLES
t_outtab = i_data
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*&---------------------------------------------------------------------*
*& Form F1000_Layout_Init
*&---------------------------------------------------------------------*

FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.

CLEAR i_layout.
i_layout-colwidth_optimize = 'X'.
i_layout-edit = 'X'.

ENDFORM. " F1000_Layout_Init


*&---------------------------------------------------------------------*
*& Form f2000_fieldcat_init
*&---------------------------------------------------------------------*
FORM f2000_fieldcat_init CHANGING i_fieldcat TYPE slis_t_fieldcat_alv.

DATA: line_fieldcat TYPE slis_fieldcat_alv.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMNUM'. " The field name and the table
line_fieldcat-tabname = 'I_DATA'. " name are the two minimum req.
line_fieldcat-key = 'X'. " Specifies the column as a key (Blue)
line_fieldcat-seltext_m = 'Notification No.'. " Column Header
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMART'.
line_fieldcat-ref_tabname = 'I_DATA'.
line_fieldcat-hotspot = 'X'. " Shows the field as a hotspot.
line_fieldcat-seltext_m = 'Notif Type'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMTXT'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Description'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_ROW'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Row Number'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_CHAR'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Test Character Field'.
line_fieldcat-datatype = 'CHAR'.
line_fieldcat-outputlen = '15'. " You can specify the width of a
APPEND line_fieldcat TO i_fieldcat. " column.

. 19
CLEAR line_fieldcat.
line_fieldcat-fieldname = 'CHK'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Checkbox'.
line_fieldcat-checkbox = 'X'. " Display this field as a checkbox
line_fieldcat-edit = 'X'. " This option ensures that you can
" edit the checkbox. Else it will
" be protected.
APPEND line_fieldcat TO i_fieldcat.

ENDFORM. " f2000_fieldcat_init

*&---------------------------------------------------------------------*
*& Form f3000_build_header
*&---------------------------------------------------------------------*

FORM f3000_build_header USING i_header TYPE slis_t_listheader.

DATA: gs_line TYPE slis_listheader.

CLEAR gs_line.
gs_line-typ = 'H'.
gs_line-info = 'This is line of type HEADER'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'S'.
gs_line-key = 'STATUS 1'.
gs_line-info = 'This is line of type STATUS'.
APPEND gs_line TO i_header.
gs_line-key = 'STATUS 2'.
gs_line-info = 'This is also line of type STATUS'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'A'.
gs_line-info = 'This is line of type ACTION'.
APPEND gs_line TO i_header.

ENDFORM. " f3000_build_header

*&---------------------------------------------------------------------*
*& Form f4000_events_init
*&---------------------------------------------------------------------*
FORM f4000_events_init CHANGING i_events TYPE slis_t_event.

DATA: line_event TYPE slis_alv_event.

CLEAR line_event.
line_event-name = 'TOP_OF_PAGE'.
line_event-form = 'F4100_TOP_OF_PAGE'.
APPEND line_event TO i_events.

CLEAR line_event.
line_event-name = 'PF_STATUS_SET'.
line_event-form = 'F4200_PF_STATUS_SET'.
APPEND line_event TO i_events.

ENDFORM. " f3000_events_init

*---------------------------------------------------------------------*
* FORM F4100_TOP_OF_PAGE *
*---------------------------------------------------------------------*

. 20
FORM f4100_top_of_page.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'


EXPORTING
it_list_commentary = i_header.
ENDFORM.

*---------------------------------------------------------------------*
* FORM F4200_PF_STATUS_SET *
*---------------------------------------------------------------------*

FORM f4200_pf_status_set USING i_extab TYPE slis_t_extab.

REFRESH i_extab.
PERFORM f4210_exclude_fcodes CHANGING i_extab.
SET PF-STATUS 'STANDARD' OF PROGRAM 'SAPLSALV' EXCLUDING i_extab.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form f4210_exclude_fcodes
*&---------------------------------------------------------------------*

FORM f4210_exclude_fcodes USING i_extab TYPE slis_t_extab.

DATA: ws_fcode TYPE slis_extab.

CLEAR ws_fcode.
ws_fcode = '&EB9'. " Call up Report.
APPEND ws_fcode TO i_extab.
ws_fcode = '&ABC'. " ABC Analysis.
APPEND ws_fcode TO i_extab.
ws_fcode = '&NFO'. " Info Select.
APPEND ws_fcode TO i_extab.
ws_fcode = '&LFO'. " Information.
APPEND ws_fcode TO i_extab.

ENDFORM. " f4210_exclude_fcodes

. 21
OUTPUT

For starters, declare a new internal table ( i_extab) of type slis_t_extab. This will contain all the function codes,
which should be excluded from the PF Status. Initialize a new event called PF_STATUS_SET by assigning a
form to it. Inside this form (F4200_PF_STATUS_SET), first refresh the table i_extab, which gets populated by
the names of the 46 function codes that are populated by default by ALV. Then call a form, which populates
i_extab with the names of the 4 fcodes. Finally set the PF Status.

Chapter

. 22
Process callback events
TOPICS INTRODUCED

1) Add customized buttons (function codes) to ‘Standard’ PF Status.

2) Customize the processing of such events.

In many cases, we may need to add buttons (function codes) to our PF status and assign a code
that will be executed when that function code is triggered. We can either create our own PF status
or copy the STANDARD pf status of program SAPLSALV creating our own to which we can add
buttons and function codes.

Report ZSOMALV6:

REPORT zsomalv6 NO STANDARD PAGE HEADING.

*Description-----------------------------------------------------------*
* TOPICS INTRODUCED:
* 1. Add customized buttons (function codes) to ‘Standard’ PF Status.
* 2. Customize the processing of such events.
*----------------------------------------------------------------------*

TYPE-POOLS: slis.

DATA: BEGIN OF i_data OCCURS 0,


qmnum LIKE qmel-qmnum,
qmart LIKE qmel-qmart,
qmtxt LIKE qmel-qmtxt,
ws_row TYPE i,
ws_char(5) TYPE c,
chk,
END OF i_data.

DATA: report_id LIKE sy-repid.


DATA: ws_title TYPE lvc_title VALUE 'An ALV Report'.
DATA: i_layout TYPE slis_layout_alv.
DATA: i_fieldcat TYPE slis_t_fieldcat_alv.
DATA: i_events TYPE slis_t_event.
DATA: i_header TYPE slis_t_listheader.
DATA: i_extab TYPE slis_t_extab.

SELECT qmnum
qmart
qmtxt
INTO TABLE i_data
FROM qmel
WHERE qmnum <= '00030000010'.

LOOP AT i_data.
i_data-ws_row = sy-tabix.
i_data-ws_char = 'AAAAA'.
MODIFY i_data.
ENDLOOP.

. 23
report_id = sy-repid.
PERFORM f1000_layout_init CHANGING i_layout.
PERFORM f2000_fieldcat_init CHANGING i_fieldcat.
PERFORM f3000_build_header CHANGING i_header.
PERFORM f4000_events_init CHANGING i_events.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ' '
i_callback_program = report_id
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* i_structure_name = ' '
* I_BACKGROUND_ID = ' '
i_grid_title = ws_title
* I_GRID_SETTINGS =
is_layout = i_layout
it_fieldcat = i_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A'
* IS_VARIANT =
it_events = i_events
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_ADD_FIELDCAT =
* IT_HYPERLINK =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = i_data
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*&---------------------------------------------------------------------*
*& Form F1000_Layout_Init
*&---------------------------------------------------------------------*

FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.

CLEAR i_layout.

. 24
i_layout-colwidth_optimize = 'X'.
i_layout-edit = 'X'.

ENDFORM. " F1000_Layout_Init


*&---------------------------------------------------------------------*
*& Form f2000_fieldcat_init
*&---------------------------------------------------------------------*
FORM f2000_fieldcat_init CHANGING i_fieldcat TYPE slis_t_fieldcat_alv.

DATA: line_fieldcat TYPE slis_fieldcat_alv.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMNUM'. " The field name and the table
line_fieldcat-tabname = 'I_DATA'. " name are the two minimum req.
line_fieldcat-key = 'X'. " Specifies the column as a key (Blue)
line_fieldcat-seltext_m = 'Notification No.'. " Column Header
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMART'.
line_fieldcat-ref_tabname = 'I_DATA'.
line_fieldcat-hotspot = 'X'. " Shows the field as a hotspot.
line_fieldcat-seltext_m = 'Notif Type'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'QMTXT'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Description'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_ROW'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_m = 'Row Number'.
APPEND line_fieldcat TO i_fieldcat.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'WS_CHAR'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Test Character Field'.
line_fieldcat-datatype = 'CHAR'.
line_fieldcat-outputlen = '15'. " You can specify the width of a
APPEND line_fieldcat TO i_fieldcat. " column.

CLEAR line_fieldcat.
line_fieldcat-fieldname = 'CHK'.
line_fieldcat-tabname = 'I_DATA'.
line_fieldcat-seltext_l = 'Checkbox'.
line_fieldcat-checkbox = 'X'. " Display this field as a checkbox
line_fieldcat-edit = 'X'. " This option ensures that you can
" edit the checkbox. Else it will
" be protected.
APPEND line_fieldcat TO i_fieldcat.

ENDFORM. " f2000_fieldcat_init

*&---------------------------------------------------------------------*
*& Form f3000_build_header
*&---------------------------------------------------------------------*

FORM f3000_build_header USING i_header TYPE slis_t_listheader.

. 25
DATA: gs_line TYPE slis_listheader.

CLEAR gs_line.
gs_line-typ = 'H'.
gs_line-info = 'This is line of type HEADER'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'S'.
gs_line-key = 'STATUS 1'.
gs_line-info = 'This is line of type STATUS'.
APPEND gs_line TO i_header.
gs_line-key = 'STATUS 2'.
gs_line-info = 'This is also line of type STATUS'.
APPEND gs_line TO i_header.

CLEAR gs_line.
gs_line-typ = 'A'.
gs_line-info = 'This is line of type ACTION'.
APPEND gs_line TO i_header.

ENDFORM. " f3000_build_header

*&---------------------------------------------------------------------*
*& Form f4000_events_init
*&---------------------------------------------------------------------*
FORM f4000_events_init CHANGING i_events TYPE slis_t_event.

DATA: line_event TYPE slis_alv_event.

CLEAR line_event.
line_event-name = 'TOP_OF_PAGE'.
line_event-form = 'F4100_TOP_OF_PAGE'.
APPEND line_event TO i_events.

CLEAR line_event.
line_event-name = 'PF_STATUS_SET'.
line_event-form = 'F4200_PF_STATUS_SET'.
APPEND line_event TO i_events.

CLEAR line_event.
line_event-name = 'USER_COMMAND'.
line_event-form = 'F4300_USER_COMMAND'.
APPEND line_event TO i_events.
ENDFORM. " f3000_events_init

*---------------------------------------------------------------------*
* FORM F4100_TOP_OF_PAGE *
*---------------------------------------------------------------------*

FORM f4100_top_of_page.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'


EXPORTING
it_list_commentary = i_header.
ENDFORM.

*---------------------------------------------------------------------*
* FORM F4200_PF_STATUS_SET *
*---------------------------------------------------------------------*

FORM f4200_pf_status_set USING i_extab TYPE slis_t_extab.

. 26
REFRESH i_extab.
PERFORM f4210_exclude_fcodes CHANGING i_extab.

* The PF status is an exact copy of the PF status 'STANDARD' of program


* SAPLSALV but with command 'CHNG' added to it.
SET PF-STATUS 'ZSOM_STANDARD' EXCLUDING i_extab.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form f4210_exclude_fcodes
*&---------------------------------------------------------------------*

FORM f4210_exclude_fcodes USING i_extab TYPE slis_t_extab.

DATA: ws_fcode TYPE slis_extab.

CLEAR ws_fcode.
ws_fcode = '&EB9'. " Call up Report.
APPEND ws_fcode TO i_extab.
ws_fcode = '&ABC'. " ABC Analysis.
APPEND ws_fcode TO i_extab.
ws_fcode = '&NFO'. " Info Select.
APPEND ws_fcode TO i_extab.
ws_fcode = '&LFO'. " Information.
APPEND ws_fcode TO i_extab.

ENDFORM. " f4210_exclude_fcodes

*&---------------------------------------------------------------------*
*& Form f4300_user_command
*&---------------------------------------------------------------------*

FORM f4300_user_command USING ucomm LIKE sy-ucomm


selfield TYPE slis_selfield.
CASE ucomm.
WHEN '&IC1'. "Double Click line Item
READ TABLE i_data INDEX selfield-tabindex.
IF i_data-qmnum NE space.
SET PARAMETER ID 'IQM' FIELD i_data-qmnum.
CALL TRANSACTION 'IW52' AND SKIP FIRST SCREEN.
CLEAR ucomm.
ENDIF.

WHEN 'CHNG'. " Change Notification Icon


READ TABLE i_data INDEX selfield-tabindex.
IF i_data-qmnum NE space.
SET PARAMETER ID 'IQM' FIELD i_data-qmnum.
CALL TRANSACTION 'IW52' AND SKIP FIRST SCREEN.
CLEAR ucomm.
ENDIF.
ENDCASE.

CLEAR ucomm.

ENDFORM. " f4300_user_command

. 27
OUTPUT

In this program, first we created a PF status (ZSOM_STANDARD), which was an exact copy of STANDARD of
program SAPLSALV through transaction SE41 (Menu Painter). Then we added another button to it (circled in
white) with a new fcode called ‘CHNG’. Creation of PF status is not covered in this document, as it is available in
any standard ABAP material. After this this we set this PF status instead of STANADRD.

We initialize a third event USER_COMMAND and associate a form with it. In this form we can capture the
function codes and write any functionality under it. If we write functionality for an existing fcode, then this gets
precedence over the default functionality that might be associated with it.

In this example, we capture a standard fcode ‘&IC1’ that is nothing but double clicking a line of the report. We
are capturing the notification number of that line and calling transaction IW52 with it. We are also doing the
same when a user clicks on the new ‘Change Notification’ button.

When the user clicks the “Back’ button in IW52, it comes back to the report.

. 28
Chapter

7
Sort Catalogue
TOPICS INTRODUCED

1) Define a sort catalogue for a report.

2) Sort a report using a sort catalogue.

Creating a sort catalogue is very similar to creating a field catalogue. In it we can specify the
fieldnames, table names, order of sorting, whether it should be sorted ascending or descending.

The steps to be taken are, first declare an internal table ( i_sort ) of type slis_t_sortinfo_alv. This is
a table of the structure slis_sortinfo_alv. Then create the sort catalogue in a form which is to be
called before the call to ALV. (i.e. REUSE_ALV_GRID_DISPLAY)

*&---------------------------------------------------------------------*
*& Form f5000_sortcat_init
*&---------------------------------------------------------------------*

form f5000_sortcat_init changing i_sortcat TYPE slis_t_sortinfo_alv..


DATA: line_sortinfo TYPE slis_sortinfo_alv.

CLEAR line_sortinfo.
line_sortinfo-fieldname = 'QMART'.
line_sortinfo-tabname = 'I_DATA'.
line_sortinfo-spos = 1. " First sort by this field.
line_sortinfo-down = 'X'. " Descending
APPEND line_sortinfo TO i_sortcat.

line_sortinfo-fieldname = 'WS_ROW'.
line_sortinfo-tabname = 'I_DATA'.
line_sortinfo-spos = 2. " Second sort by this field.
line_sortinfo-up = 'X'. " Ascending
APPEND line_sortinfo TO i_sortcat.

endform. " f5000_sortcat_init

Then pass i_sortcat to ALV through the parameter it_sort.

it_fieldcat = i_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
IT_SORT = i_sortcat
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'

. 29
In form F4200_pf_status_set, change the setting of the PF status to,

SET PF-STATUS 'ZSOM_STANDARD' OF PROGRAM 'ZSOMALV6' EXCLUDING i_extab.

Or else you will get an error. This is because this PF status was created for program ZSOMALV6.

OUTPUT

In this example we have sorted the above list first by notification type (QMART) descending and then by row
number (WS_ROW) ascending. Do note the small red arrows that come up in the column header indicating the
type of sort.

The usage of a sort catalogue is actually not required !! This is also the reason why I have decided to put it towards
the last. Just sort the internal data table (i_data) in the required manner before passing it to ALV and it will be
displayed as shown above. The only difference is that the red arrows won’t be there. . In short the statement,

SORT i_data BY qmart DESCENDING ws_row ASCENDING.

Is enough to replace all the code written above !!

. 30
Appendix

Type-Pool ‘SLIS’

type-pool slis .

">>Y9CK015723
types: begin of slis_lvc_s_bds_extended,
bytesize type int4,
EXTOBJID type char255, "Y9CK016268
end of slis_lvc_s_bds_extended.

types: begin of slis_lvc_s_bds2.


include type lvc_s_bds.
include type slis_lvc_s_bds_extended.
types: end of slis_lvc_s_bds2.

types: slis_lvc_t_bds2 type slis_lvc_s_bds2 occurs 1.


"<<Y9CK015723

">>Y9CK016292
*Trace Extern-Intern-Konvertierung
types: begin of slis_lvc_s_expa,
OP type CHAR4,
EXTERN type LVC_VALUE,
INTERN type LVC_VALUE,
*INCLUDE type RSCONVLITE
ACTIVE type RSSCR_CFLG,
OLENGTH type RSSCR_OLEN,
DECIMALS type RSDECIMALS,
SIGN type SIGNFLAG,
LOWER type RSSCR_LOWC,
CONVEXIT type CONVEXIT,
*INCLUDE type TABFIELD
TABNAME type TABNAME,
FIELDNAME type FIELDNAME,
LFIELDNAME type FNAM_____4,
CURRENCY type CHAR30,
end of slis_lvc_s_expa.

*Textstruktur(ALV-Batch)
types: begin of slis_lvc_s_1022,
line(1022) type c,
end of slis_lvc_s_1022.

*Text-Tabelle(ALV Batch)
types: slis_lvc_t_1022 type slis_lvc_s_1022 occurs 1.

*Ausgabefiles
types: begin of slis_lvc_s_fils,

. 31
FILENAME type CHAR255,
SIZE type INT4,
MIMETYPE type CHAR128,
PRIMARY type FLAG,
BINARY type FLAG,
end of slis_lvc_s_fils.

*Filestruktur
types: slis_lvc_t_fils type slis_lvc_s_fils occurs 1.

*Mimetype-Mapping
types: begin of slis_lvc_s_mima,
MIMETYPE type CHAR128,
BINARY type FLAG,
end of slis_lvc_s_mima.

*ALV: Mime-Mapping
types: slis_lvc_t_mima type slis_lvc_s_mima occurs 1.

*ALV-W3Text
types: slis_lvc_t_text type w3html occurs 1.

*X255-Tabelle
types: slis_lvc_t_mime type w3mime occurs 1.

*Tabelle X1022
types: slis_lvc_t_x1022 type bapiconten occurs 1.
"<<Y9CK016292

types: slis_list_type(1) type n,


slis_char_1(1) type c,
slis_text40(40) type c.

types: slis_tabname(30) type c,


slis_fieldname(30) type c,
slis_sel_tab_field(60) type c,
slis_formname(30) type c,
slis_entry(60) type c,
slis_edit_mask(60) type c,
slis_coldesc(4) type c.

*types: begin of slis_filtered_entries,


* index type i,
* end of slis_filtered_entries.
types: slis_t_filtered_entries type i occurs 0.

*--- Structure for additional fieldcat


types: begin of slis_add_fieldcat,
fieldname type slis_fieldname,
web_field type slis_fieldname,
href_hndl type i,
end of slis_add_fieldcat.
types: slis_t_add_fieldcat type slis_add_fieldcat occurs 0.

*--- Structure for reprep-initialization


types: begin of slis_reprep_id,
tool(2) type c,
appl(4) type c,
subc(2) type c,
onam(54) type c,
end of slis_reprep_id.

. 32
types: begin of slis_reprep_communication,
stop(1) type c,
end of slis_reprep_communication.

*** Structure for colors


types: begin of slis_color,
col type i,
int type i,
inv type i,
end of slis_color.

types: begin of slis_coltypes,


heacolfir type slis_color, " heading_cols_first
heacolnex type slis_color, " heading_cols_nex
hearowfir type slis_color, " heading_rows_first
hearownex type slis_color, " heading_rows_next
lisbodfir type slis_color, " list_body_first
lisbodnex type slis_color, " list_body_next
lisbod type slis_color, " list_body
higcolkey type slis_color, " highlight_col_key
higcol type slis_color, " highlight_col
higrow type slis_color, " highlight_row
higsum type slis_color, " highlight_sum
higsumhig type slis_color, " highlight_sum_high
higsumlow type slis_color, " highlight_sum_low
higins type slis_color, " highlight_inserted
higpos type slis_color, " highlight_positive
higneg type slis_color, " highlight_negative
hig type slis_color, " highlight
heahie type slis_color, " heading_hier
lisbodhie type slis_color, " list_body_hierinfo
end of slis_coltypes.

*** Fieldcat
types: begin of slis_fieldcat_main0,
row_pos like sy-curow, " output in row
col_pos like sy-cucol, " position of the column
fieldname type slis_fieldname,
tabname type slis_tabname,
currency(5) type c,
cfieldname type slis_fieldname, " field with currency unit
ctabname type slis_tabname, " and table
ifieldname type slis_fieldname, " initial column
quantity(3) type c,
qfieldname type slis_fieldname, " field with quantity unit
qtabname type slis_tabname, " and table
round type i, " round in write statement
exponent(3) type c, " exponent for floats
key(1) type c, " column with key-color
icon(1) type c, " as icon
symbol(1) type c, " as symbol
checkbox(1) type c, " as checkbox
just(1) type c, " (R)ight (L)eft (C)ent.
lzero(1) type c, " leading zero
no_sign(1) type c, " write no-sign
no_zero(1) type c, " write no-zero
no_convext(1) type c,
edit_mask type slis_edit_mask, "
emphasize(4) type c, " emphasize
fix_column(1) type c, " Spalte fixieren
do_sum(1) type c, " sum up
no_out(1) type c, " (O)blig.(X)no out
tech(1) type c, " technical field

. 33
outputlen like dd03p-outputlen,
offset type dd03p-outputlen, " offset
seltext_l like dd03p-scrtext_l, " long key word
seltext_m like dd03p-scrtext_m, " middle key word
seltext_s like dd03p-scrtext_s, " short key word
ddictxt(1) type c, " (S)hort (M)iddle (L)ong
rollname like dd03p-rollname,
datatype like dd03p-datatype,
inttype like dd03p-inttype,
intlen like dd03p-intlen,
lowercase like dd03p-lowercase,
end of slis_fieldcat_main0.

types: begin of slis_fieldcat_main1,


ref_fieldname like dd03p-fieldname,
ref_tabname like dd03p-tabname,
roundfieldname type slis_fieldname,
roundtabname type slis_tabname,
decimalsfieldname type slis_fieldname,
decimalstabname type slis_tabname,
decimals_out(6) type c, " decimals in write statement
text_fieldname type slis_fieldname,
reptext_ddic like dd03p-reptext, " heading (ddic)
ddic_outputlen like dd03p-outputlen,
end of slis_fieldcat_main1.

types: begin of slis_fieldcat_main.


include type slis_fieldcat_main0.
include type slis_fieldcat_main1.
types: end of slis_fieldcat_main.

types: begin of slis_fieldcat_alv_spec,


key_sel(1) type c, " field not obligatory
no_sum(1) type c, " do not sum up
sp_group(4) type c, " group specification
reprep(1) type c, " selection for rep/rep
input(1) type c, " input
edit(1) type c, " internal use only
hotspot(1) type c, " hotspot
end of slis_fieldcat_alv_spec.

types: begin of slis_fieldcat_alv.


include type slis_fieldcat_main.
include type slis_fieldcat_alv_spec.
types: end of slis_fieldcat_alv.

types: begin of slis_fieldcat_alv1.


include type slis_fieldcat_main1.
types: end of slis_fieldcat_alv1.

types: slis_t_fieldcat_alv type slis_fieldcat_alv occurs 1.

* Events for Callback


types: begin of slis_event_exit.
types: ucomm like sy-ucomm,
before(1) type c,
after(1) type c,
end of slis_event_exit.
types: slis_t_event_exit type slis_event_exit occurs 1.

* Callback Interface structure for non display subtotals text


types: begin of slis_subtot_text,
criteria type slis_fieldname,

. 34
keyword like dd03p-reptext,
criteria_text(255) type c,
max_len like dd03p-outputlen,
display_text_for_subtotal(255) type c,
end of slis_subtot_text.

*** Layout
types: begin of slis_print_alv0,
print(1) type c, " print to spool
prnt_title(1) type c, " moment to print the title
end of slis_print_alv0.

types: begin of slis_print_alv1,


no_print_selinfos(1) type c, " display no selection infos
no_coverpage(1) type c, "
no_new_page(1) type c, "
reserve_lines type i, " lines reserved for end of page
no_print_listinfos(1) type c, " display no listinfos
no_change_print_params(1) type c, " don't change linesize
no_print_hierseq_item(1) type c, "don't expand item
end of slis_print_alv1.

types: begin of slis_print_alv.


include type alv_s_prnt.
include type slis_print_alv1.
types: end of slis_print_alv.

types: begin of slis_layout_main,


dummy,
end of slis_layout_main.

types: begin of slis_layout_alv_spec0,


no_colhead(1) type c, " no headings
no_hotspot(1) type c, " headings not as hotspot
zebra(1) type c, " striped pattern
no_vline(1) type c, " columns separated by space
cell_merge(1) type c, " not suppress field replication
edit(1) type c, " for grid only
edit_mode(1) type c, " for grid only
numc_sum(1) type c, " totals for NUMC-Fields possib.
no_input(1) type c, " only display fields
f2code like sy-ucomm, "
reprep(1) type c, " report report interface active
no_keyfix(1) type c, " do not fix keycolumns
expand_all(1) type c, " Expand all positions
no_author(1) type c, " No standard authority check
* PF-status
def_status(1) type c, " default status space or 'A'
item_text(20) type c, " Text for item button
end of slis_layout_alv_spec0.

types: begin of slis_layout_alv_spec1,


* Display options
colwidth_optimize(1) type c,
no_min_linesize(1) type c, " line size = width of the list
min_linesize like sy-linsz, " if initial min_linesize = 80
max_linesize like sy-linsz, " Default 250
window_titlebar like sy-title,
no_uline_hs(1) type c,
* Exceptions
lights_fieldname type slis_fieldname," fieldname for exception
lights_tabname type slis_tabname, " fieldname for exception
lights_rollname like dfies-rollname," rollname f. exceptiondocu

. 35
lights_condense(1) type c, " fieldname for exception
* Sums
no_sumchoice(1) type c, " no choice for summing up
no_totalline(1) type c, " no total line
no_subchoice(1) type c, " no choice for subtotals
no_subtotals(1) type c, " no subtotals possible
no_unit_splitting type c, " no sep. tot.lines by inh.units
totals_before_items type c, " diplay totals before the items
totals_only(1) type c, " show only totals
totals_text(60) type c, " text for 1st col. in total line
subtotals_text(60) type c, " text for 1st col. in subtotals
* Interaction
box_fieldname type slis_fieldname, " fieldname for checkbox
box_tabname type slis_tabname," tabname for checkbox
box_rollname like dd03p-rollname," rollname for checkbox
expand_fieldname type slis_fieldname, " fieldname flag 'expand'
hotspot_fieldname type slis_fieldname, " fieldname flag hotspot
confirmation_prompt, " confirm. prompt when leaving
key_hotspot(1) type c, " keys as hotspot " K_KEYHOT
flexible_key(1) type c, " key columns movable,...
group_buttons(1) type c, " buttons for COL1 - COL5
get_selinfos(1) type c, " read selection screen
group_change_edit(1) type c, " Settings by user for new group
no_scrolling(1) type c, " no scrolling
* Detailed screen
detail_popup(1) type c, " show detail in popup
detail_initial_lines(1) type c, " show also initial lines
detail_titlebar like sy-title," Titlebar for detail
* Display variants
header_text(20) type c, " Text for header button
default_item(1) type c, " Items as default
* colour
info_fieldname type slis_fieldname, " infofield for listoutput
coltab_fieldname type slis_fieldname, " colors
* others
list_append(1) type c, " no call screen
xifunckey type aqs_xikey, " eXtended interaction(SAPQuery)
xidirect type flag, " eXtended INTeraction(SAPQuery)
dtc_layout type dtc_s_layo, "Layout for configure the Tabstip
end of slis_layout_alv_spec1.

types: begin of slis_layout_alv_spec.


include type slis_layout_alv_spec0.
include type slis_layout_alv_spec1.
types: end of slis_layout_alv_spec.

types: begin of slis_layout_alv.


include type slis_layout_main.
include type slis_layout_alv_spec.
types: end of slis_layout_alv.

types: begin of slis_layout_alv1.


include type slis_layout_main.
include type slis_layout_alv_spec1.
types: end of slis_layout_alv1.

*--- Structure for the excluding table (function codes)


types: begin of slis_extab,
fcode like rsmpe-func,
end of slis_extab.
*--- Lineinfo before output
types: begin of slis_lineinfo,
tabname type slis_tabname,

. 36
tabindex like sy-tabix,
subtot(1) type c,
subtot_level(2) type n,
endsum(1) type c,
sumindex like sy-tabix,
linsz like sy-linsz,
linno like sy-linno,
end of slis_lineinfo.
*--- Structure for scrolling in list
types: begin of slis_list_scroll,
lsind like sy-lsind,
cpage like sy-cpage,
staro like sy-staro,
staco like sy-staco,
cursor_line like sy-curow,
cursor_offset like sy-cucol,
end of slis_list_scroll.
* information cursor position ALV
types: begin of slis_selfield,
tabname type slis_tabname,
tabindex like sy-tabix,
sumindex like sy-tabix,
endsum(1) type c,
sel_tab_field type slis_sel_tab_field,
value type slis_entry,
before_action(1) type c,
after_action(1) type c,
refresh(1) type c,
ignore_multi(1) type c, " ignore selection by checkboxes (F2)
col_stable(1) type c,
row_stable(1) type c,
* colwidth_optimize(1) type c,
exit(1) type c,
fieldname type slis_fieldname,
grouplevel type i,
collect_from type i,
collect_to type i,
end of slis_selfield.

*--- excluding table


types: slis_t_extab type slis_extab occurs 1.
* special groups for column selection
types: begin of slis_sp_group_alv,
sp_group(4) type c,
text(40) type c,
end of slis_sp_group_alv.
types: slis_t_sp_group_alv type slis_sp_group_alv occurs 1.

* information for sort and subtotals


types: begin of slis_sortinfo_alv,
* spos(2) type n,
spos like alvdynp-sortpos,
fieldname type slis_fieldname,
tabname type slis_fieldname,
* up(1) type c,
* down(1) type c,
* group(2) type c,
* subtot(1) type c,
up like alvdynp-sortup,
down like alvdynp-sortdown,
group like alvdynp-grouplevel,
subtot like alvdynp-subtotals,
comp(1) type c,

. 37
expa(1) type c,
obligatory(1) type c,
end of slis_sortinfo_alv.
types: slis_t_sortinfo_alv type slis_sortinfo_alv occurs 1.
* information for selections
types: begin of slis_seldis1_alv,
field like dfies-fieldname,
table like dfies-tabname,
stext(40),
valuf(80),
valut(80),
sign0(1),
optio(2),
ltext(40),
stype(1),
length type p,
no_text(1),
inttype like dfies-inttype,
fieldname type slis_fieldname,
tabname type slis_tabname,
org_selname type rsscr_name, "introduced this FO 09.01.00
end of slis_seldis1_alv.

types: slis_seldis_alv type slis_seldis1_alv occurs 1.

* filter
types: begin of slis_filter_alv0,
fieldname type slis_fieldname,
tabname type slis_tabname,
seltext(40),
valuf(80),
valut(80),
valuf_int(80),
valut_int(80),
sign0(1),
sign_icon(4),
optio(2),
stype(1),
decimals like dfies-decimals,
intlen like dfies-intlen,
convexit like dfies-convexit,
edit_mask type slis_edit_mask,
lowercase like dfies-lowercase,
inttype like dfies-inttype,
datatype like dfies-datatype,
exception(1) type c,
no_sign(1) type c,
or(1) type c,
order type order,
cqvalue(5) type c,
end of slis_filter_alv0.

types: begin of slis_filter_alv1,


ref_fieldname like dfies-fieldname,
ref_tabname like dfies-tabname,
ddic_outputlen like dfies-outputlen,
end of slis_filter_alv1.

types: begin of slis_filter_alv.


include type slis_filter_alv0.
include type slis_filter_alv1.
types: end of slis_filter_alv.
types: slis_t_filter_alv type slis_filter_alv occurs 1.

. 38
* delete or add an entry in the select-option info
types: begin of slis_selentry_hide_alv,
mode(1) type c, "(D)elete (A)dd
selname like rsparams-selname.
include type slis_seldis1_alv.
types end of slis_selentry_hide_alv.
types: slis_t_selentry_hide_alv type slis_selentry_hide_alv occurs 1.

* delete or add an entry in the select-option info


types: begin of slis_sel_hide_alv,
mode(1) type c, "(R)eplace or (C)hange
t_entries type slis_t_selentry_hide_alv,
end of slis_sel_hide_alv.
* Header table for top of page
types: begin of slis_listheader,
typ(1) type c, " H = Header, S = Selection, A = Action
key(20) type c,
info type slis_entry,
end of slis_listheader.
types: slis_t_listheader type slis_listheader occurs 1.
*--- Structure for specific color settings
types: begin of slis_specialcol_alv,
fieldname type slis_fieldname,
color type slis_color,
nokeycol(1) type c,
end of slis_specialcol_alv.
types: slis_t_specialcol_alv type slis_specialcol_alv occurs 1.
*--- Structure for event handling
types: begin of slis_alv_event,
name(30),
form(30),
end of slis_alv_event.
types: slis_t_event type slis_alv_event occurs 0.
*--- Structure for key information
types: begin of slis_keyinfo_alv,
header01 type slis_fieldname,
item01 type slis_fieldname,
header02 type slis_fieldname,
item02 type slis_fieldname,
header03 type slis_fieldname,
item03 type slis_fieldname,
header04 type slis_fieldname,
item04 type slis_fieldname,
header05 type slis_fieldname,
item05 type slis_fieldname,
end of slis_keyinfo_alv.
*--- Structure for callback CALLER_EXIT and REUSE_ALV_POPUP_TO_SELECT
types: begin of slis_data_caller_exit,
dummy like sy-repid,
without_load_variant(1),
callback_header_transport type slis_formname,
columnopt(1),
end of slis_data_caller_exit.

types: begin of slis_status,


callback_program like sy-repid,
callback_pf_status_set type slis_formname,
callback_user_command type slis_formname,
counter_of_lists_added type i,
actual_list_to_display type i,
flg_to_be_refreshed,
it_excluding type slis_t_extab,

. 39
print type slis_print_alv,
flg_checkboxes_active,
flg_overview_active,
flg_intcheck(1) type c,
end of slis_status.
* Exporting structure
types: begin of slis_exit_by_user,
back(1) type c,
exit(1) type c,
cancel(1) type c,
end of slis_exit_by_user.

constants:
* Events
slis_ev_item_data_expand type slis_formname value 'ITEM_DATA_EXPAND',
slis_ev_reprep_sel_modify type slis_formname value 'REPREP_SEL_MODIFY',
slis_ev_caller_exit_at_start type slis_formname value 'CALLER_EXIT',
slis_ev_user_command type slis_formname value 'USER_COMMAND',
slis_ev_top_of_page type slis_formname value 'TOP_OF_PAGE',
slis_ev_data_changed type slis_formname value 'DATA_CHANGED',
slis_ev_top_of_coverpage type slis_formname value 'TOP_OF_COVERPAGE',
slis_ev_end_of_coverpage type slis_formname value 'END_OF_COVERPAGE',
slis_ev_foreign_top_of_page type slis_formname
value 'FOREIGN_TOP_OF_PAGE',
slis_ev_foreign_end_of_page type slis_formname
value 'FOREIGN_END_OF_PAGE',
slis_ev_pf_status_set type slis_formname value 'PF_STATUS_SET',
slis_ev_list_modify type slis_formname value 'LIST_MODIFY',
slis_ev_top_of_list type slis_formname value 'TOP_OF_LIST',
slis_ev_end_of_page type slis_formname value 'END_OF_PAGE',
slis_ev_end_of_list type slis_formname value 'END_OF_LIST',
slis_ev_after_line_output type slis_formname value 'AFTER_LINE_OUTPUT',
slis_ev_before_line_output type slis_formname value
'BEFORE_LINE_OUTPUT',
slis_ev_subtotal_text type slis_formname value
'SUBTOTAL_TEXT'.

. 40
Appendix

How to colour lines of a report


1. Include a 4-character field in the internal data table that is being passed to
REUSE_ALV_GRID_DISPLAY.

Eg: DATA: BEGIN OF i_data OCCURS 10,


qmnum LIKE viqmel-qmnum,
qmart LIKE viqmel-qmart,
zzvalstat LIKE viqmel-zzvalstat,
valstattxt LIKE zawprcode-valstattxt,
kunum LIKE viqmel-kunum,
bstnk LIKE viqmel-bstnk,
qmtxt LIKE viqmel-qmtxt,
ws_color(4)TYPE c,
END OF i_data.

2. In the code, loop through the lines of the internal table and assign values to this field. The 4-
character value will be of the format - Cxyz.

Char 1 – is always C indicating that it’s a color property.


Char 2 (x) – color code, which can be any value from (1 – 7).
Char 3 (y) – Intensity on/off. (1 = on, 0 = off).
Char 4 (z) – Inverse display on/off. (1 = on, 0 = off).

(From the above, it is clear that we can have only 28 different coloring options)
Eg: C401.

LOOP AT i_data.
IF (expression 1).
i_data-ws_color = ‘C510’.
ELSEIF(expression 2).
i_data-ws_color = ‘C200’.
ELSE.
i_data-ws_color = ‘C711’.
ENDIF.
MODIFY i_data.
ENDLOOP.

3. When specifying the layout properties, specify the name of this field (ws_color) as the color field.

FORM f1200_define_layout CHANGING p_i_layout TYPE


slis_layout_alv.

CLEAR p_i_layout.
p_i_layout-zebra = 'X'.
p_i_layout-colwidth_optimize = 'X'.

. 41
p_i_layout-info_fieldname = 'WS_COLOR'.

ENDFORM. " F1200_define_layout

Example:
Shown below is screen dump with 14 coloring options. You could try out the rest 14!!

Code:

LOOP AT i_data.
cnt = cnt + 1.
elseIF cnt = 8.
IF cnt = 1. i_data-ws_color = 'C100'.
i_data-ws_color = 'C110'. ELSEIF cnt = 9.
ELSEIF cnt = 2. i_data-ws_color = 'C200'.
i_data-ws_color = 'C210'. ELSEIF cnt = 10
ELSEIF cnt = 3. i_data-ws_color = 'C300'.
i_data-ws_color = 'C310'. ELSEIF cnt = 11.
ELSEIF cnt = 4. i_data-ws_color = 'C400'.
i_data-ws_color = 'C410'. ELSEIF cnt = 12.
ELSEIF cnt = 5. i_data-ws_color = 'C500'.
i_data-ws_color = 'C510'. ELSEIF cnt = 13.
ELSEIF cnt = 6. i_data-ws_color = 'C600'.
i_data-ws_color = 'C610'. ELSEIF cnt = 14.
ELSEIF cnt = 7. i_data-ws_color = 'C700'.
i_data-ws_color = 'C710'. ENDIF.
MODIFY i_data.
ENDLOOP.

. 42
. 43

Potrebbero piacerti anche