Many a times we have to display a traffic light in ALV report. We can do that easily using "Exceptions" parameter provided by SAP. But it has one drawback, we cannot change the column header to something meaningful. It always set as "Exception" in case of ALV Grid and an icon in case of ALV List.



REPORT  ztest_sourav_traffic_lights.TYPE-POOLS: slis,icon.TYPES: BEGIN OF x_sflight,carrid TYPE s_carr_id,connid TYPE s_conn_id,fldate TYPE s_date,price  TYPE s_price,currency TYPE s_currcode,seatsmax TYPE s_seatsmax,seatsocc TYPE s_seatsocc,END OF x_sflight.TYPES:BEGIN OF x_final,icon TYPE char4.INCLUDE TYPE x_sflight.TYPES: END OF x_final.
DATA: i_sflight  TYPE STANDARD TABLE OF x_sflight INITIAL SIZE 0,i_final    TYPE STANDARD TABLE OF x_final INITIAL SIZE 0,i_fieldcat TYPE slis_t_fieldcat_alv,wa_layout  TYPE slis_layout_alv.

CONSTANTS: program TYPE syrepid VALUE sy-repid.
START-OF-SELECTION.SELECT carrid    " Airline Code
  connid    " Flight Connection Number
  fldate    " Flight date
  price     " Airfare
  currency  " Local currency of airline
  seatsmax  " Maximum capacity in economy class
  seatsocc  " Occupied seats in economy class
FROM sflight   " Flight
INTO TABLE i_sflight.IF sy-subrc <> 0.MESSAGE i001(00) WITH 'No data found!'.LEAVE LIST-PROCESSING.ENDIF.

END-OF-SELECTION.
PERFORM populate_records.
PERFORM display_records.

*&---------------------------------------------------------------------*
*&      Form  populate_records
*&---------------------------------------------------------------------*
*       Populate final table
*----------------------------------------------------------------------*
FORM populate_records .
DATA:wa_sflight TYPE x_sflight,wa_final TYPE x_final,temp TYPE p DECIMALS 2.
LOOP AT i_sflight INTO wa_sflight.CLEAR temp.*Calculate Percentage of booked flights
temp = ( wa_sflight-seatsocc / wa_sflight-seatsmax ) .
IF temp > '0.9'.*If booked more than 90%
wa_final-icon = icon_green_light.ELSEIF temp < '0.2'.*If booked less than 20%
wa_final-icon = icon_red_light.ELSE.*If its between 20% to 90 %
wa_final-icon = icon_yellow_light.ENDIF.
wa_final-carrid = wa_sflight-carrid.wa_final-connid = wa_sflight-connid.wa_final-fldate = wa_sflight-fldate.wa_final-price  = wa_sflight-price.wa_final-currency = wa_sflight-currency.wa_final-seatsmax = wa_sflight-seatsmax.wa_final-seatsocc = wa_sflight-seatsocc.
APPEND wa_final TO i_final.CLEAR wa_final.ENDLOOP.FREE i_sflight.ENDFORM.                    " populate_records
*&---------------------------------------------------------------------*
*&      Form  display_records
*&---------------------------------------------------------------------*
*       Subroutines for Display
*----------------------------------------------------------------------*
FORM display_records .
PERFORM populate_field_catalog.
PERFORM populate_layout.
PERFORM trigger_alv.
ENDFORM.                    " display_records
*&---------------------------------------------------------------------*
*&      Form  populate_field_catalog
*&---------------------------------------------------------------------*
*       Popualte Field Catalog
*----------------------------------------------------------------------*
FORM populate_field_catalog .DATA:wa_fieldcat TYPE slis_fieldcat_alv.DEFINE fcat_merge.
wa_fieldcat-col_pos        = &1.wa_fieldcat-fieldname      = &2.if wa_fieldcat-fieldname   = 'ICON'.wa_fieldcat-icon         = 'X'.  " Display the field as ICON
wa_fieldcat-seltext_m    = 'Occupency Status'.   " Column Header
wa_fieldcat-inttype      = 'C'.wa_fieldcat-outputlen    = '4'.endif.
wa_fieldcat-ref_fieldname  = &3.wa_fieldcat-ref_tabname    = &4.
if wa_fieldcat-fieldname  = 'PRICE'.wa_fieldcat-cfieldname  = 'CURRENCY'.wa_fieldcat-ctabname    = 'I_FINAL'.endif.
append wa_fieldcat to i_fieldcat.clear wa_fieldcat.END-OF-DEFINITION.
fcat_merge: '1'  'ICON'     ''         '',
       '2'  'CARRID'   'CARRID'   'SFLIGHT',
       '3'  'CONNID'   'CONNID'   'SFLIGHT',
       '4'  'FLDATE'   'FLDATE'   'SFLIGHT',
       '5'  'PRICE'    'PRICE'    'SFLIGHT',
       '6'  'CURRENCY' 'CURRENCY' 'SFLIGHT',
       '7'  'SEATSMAX' 'SEATSMAX' 'SFLIGHT',
       '8'  'SEATSOCC' 'SEATSOCC' 'SFLIGHT'.
ENDFORM.                    " populate_field_catalog
*&---------------------------------------------------------------------*
*&      Form  populate_layout
*&---------------------------------------------------------------------*
*       Populate LAYOUT Structure for ALV
*----------------------------------------------------------------------*
FORM populate_layout.wa_layout-zebra = 'X'.wa_layout-colwidth_optimize = 'X'.ENDFORM.                    "populate_layout
*&---------------------------------------------------------------------*
*&      Form  trigger_alv
*&---------------------------------------------------------------------*
*       Trigger the ALV API
*----------------------------------------------------------------------*
FORM trigger_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = program
is_layout          = wa_layout
it_fieldcat        = i_fieldcat
TABLES
t_outtab           = i_final
EXCEPTIONS
program_error      = 1OTHERS             = 2.IF sy-subrc <> 0.MESSAGE i001(00) WITH 'Error while displaing ALV'.LEAVE LIST-PROCESSING.ENDIF.ENDFORM.                    " trigger_alv
 
 
Serkan AKKAVAK
Computer Engineer
ABAP Developer & SAP MM SD Consultant
Contact : serkurumsal@yandex.com