Skip to content

Instantly share code, notes, and snippets.

@benjaminkwilliams
Created October 13, 2018 15:21
Show Gist options
  • Save benjaminkwilliams/bbf406a72cb737aee13835d076043f54 to your computer and use it in GitHub Desktop.
Save benjaminkwilliams/bbf406a72cb737aee13835d076043f54 to your computer and use it in GitHub Desktop.
Utilities for SAP ABAP ALV Programming
*&---------------------------------------------------------------------*
*& Include Z_UTILITIES_ALV
*&---------------------------------------------------------------------*
************************************************************************
* Created By: Benjamin Williams
* Date: Jul/01/2010
*Include Name: Z_Utilities_ALV
* Title: Utilities for ALV Programming
* Purpose: Utility subroutines for aiding the creation of ALV
*
************************************************************************
* Modification History
************************************************************************
* Date Author Correction Description
* 07/01/10 BWILLIAM Initial Release
* 09/10/10 BWILLIAM Added SET_COLUMN_HIDDEN
* 09/14/10 BWILLIAM Added SET_SORT
* 10/11/10 BWILLIAM Added SET_QUANTITY_COLUMN
* 10/14/10 BWILLIAM Added code so Unicode doesn't complain for TRANSLATE
************************************************************************
DATA: lo_alv_error TYPE REF TO cx_salv_error,
lang TYPE tcp0c-langu,
cntry TYPE tcp0c-country,
mod TYPE tcp0c-modifier.
*&---------------------------------------------------------------------*
*& Form PROCESS_ALV_ERROR_MSG
*&---------------------------------------------------------------------*
* Process an error from an ALV TRY block
*----------------------------------------------------------------------*
* --> p_cx_error TYPE REF TO cx_salv_error
* --> p_error_type text (SY-MSGTY)
*----------------------------------------------------------------------*
FORM process_alv_error_msg USING p_cx_error TYPE REF TO cx_salv_error
p_error_type.
DATA: result_message TYPE bal_s_msg.
result_message = p_cx_error->get_message( ).
MESSAGE ID result_message-msgid
TYPE p_error_type
NUMBER result_message-msgno
WITH result_message-msgv1
result_message-msgv2
result_message-msgv3
result_message-msgv4.
ENDFORM. " PROCESS_ALV_ERROR_MSG
*&---------------------------------------------------------------------*
*& Form PROCESS_ALV_NOT_FOUND
*&---------------------------------------------------------------------*
* Process an error from an ALV TRY block
*----------------------------------------------------------------------*
* --> p_cx_error TYPE REF TO cx_salv_not_found
* --> p_error_type text (SY-MSGTY)
*----------------------------------------------------------------------*
FORM process_alv_not_found USING p_cx_error TYPE REF TO cx_salv_not_found
p_error_type.
DATA: result_message TYPE bal_s_msg .
result_message = p_cx_error->get_message( ).
MESSAGE ID result_message-msgid
TYPE p_error_type
NUMBER result_message-msgno
WITH result_message-msgv1
result_message-msgv2
result_message-msgv3
result_message-msgv4.
ENDFORM. " PROCESS_ALV_NOT_FOUND
*&---------------------------------------------------------------------*
*& Form SET_COLUMN_NAMES
*&---------------------------------------------------------------------*
* Add/Change Column Names
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_Name text Name of Column to change
* -->P_Short text Short Text
* -->P_Med text Medium Text
* -->P_Long text Long Text
* -->P_TTip text Tooltip Text
*----------------------------------------------------------------------*
FORM set_column_names USING p_alv TYPE REF TO cl_salv_table
p_name
p_short
p_med
p_long
p_ttip.
DATA: lr_columns TYPE REF TO cl_salv_columns_table,
lr_column TYPE REF TO cl_salv_column_table,
l_scrtext_s TYPE scrtext_s,
l_scrtext_m TYPE scrtext_m,
l_scrtext_l TYPE scrtext_l,
l_lvc_tip TYPE lvc_tip,
name TYPE salv_s_column_ref-columnname.
" Make p_name upper case. (The errors were getting annoying)
PERFORM: toupper USING p_name CHANGING name.
" Get all columns from the alv
lr_columns = p_alv->get_columns( ).
" Get a column from all columns
TRY.
lr_column ?= lr_columns->get_column( columnname = name ).
CATCH cx_salv_not_found INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
*Assign:
*short
l_scrtext_s = p_short.
lr_column->set_short_text( value = l_scrtext_s ).
* medium
l_scrtext_m = p_med.
lr_column->set_medium_text( value = l_scrtext_m ).
* long
l_scrtext_l = p_long.
lr_column->set_long_text( value = l_scrtext_l ).
* tooltip
l_lvc_tip = p_ttip.
lr_column->set_tooltip( value = l_lvc_tip ).
ENDFORM. " SET_COLUMN_NAMES
*&---------------------------------------------------------------------*
*& Form ADD_LABEL_TEXT_PAIR
*&---------------------------------------------------------------------*
* Adds a Label and Text Pair to an ALV Layout Grid (Header)
* MUST CALL apply_header_changes TO APPLY LABEL/TEXT
*----------------------------------------------------------------------*
* -->P_ALV_GRID TYPE REF TO cl_salv_form_layout_grid
* -->P_label text
* -->P_lrow int
* -->P_lcol int
* -->P_text text
* -->P_trow int
* -->P_tcol int
*----------------------------------------------------------------------*
FORM add_label_text_pair USING p_alv_grid TYPE REF TO cl_salv_form_layout_grid
p_label
p_lrow
p_lcol
p_text
p_trow
p_tcol.
DATA: lo_alv_label TYPE REF TO cl_salv_form_label,
lo_alv_text TYPE REF TO cl_salv_form_text.
lo_alv_label = p_alv_grid->create_label(
text = p_label
row = p_lrow
column = p_lcol ).
lo_alv_text = p_alv_grid->create_text(
text = p_text
row = p_trow
column = p_tcol ).
lo_alv_label->set_label_for( lo_alv_text ).
ENDFORM. " ADD_LABEL_TEXT_PAIR
*&---------------------------------------------------------------------*
*& Form ADD_COLUMN_AGGREGATION
*&---------------------------------------------------------------------*
* Adds aggregation to a column
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_NAME text
* -->P_AGGTYPE int4
*----------------------------------------------------------------------*
FORM add_column_aggregation USING p_alv TYPE REF TO cl_salv_table
p_name
p_aggtype TYPE int4.
DATA: lr_aggrs TYPE REF TO cl_salv_aggregations,
lr_aggr TYPE REF TO cl_salv_aggregation,
name TYPE salv_s_column_ref-columnname.
" Make p_name upper case. (The errors were getting annoying)
PERFORM: toupper USING p_name CHANGING name..
"Total=1, minimum=2, maximum=3, average=4, none=0
TRY.
lr_aggrs = p_alv->get_aggregations( ).
" Allow aggregation if it is forbidden
IF lr_aggrs->is_aggregation_allowed( name ) = abap_false.
lr_aggrs->set_aggregation_allowed( name ).
ENDIF.
lr_aggrs->add_aggregation( name ).
lr_aggr = lr_aggrs->get_aggregation( columnname = name ).
CASE p_aggtype.
WHEN 1.
lr_aggr->set( aggregation = if_salv_c_aggregation=>total ).
WHEN 2.
lr_aggr->set( aggregation = if_salv_c_aggregation=>minimum ).
WHEN 3.
lr_aggr->set( aggregation = if_salv_c_aggregation=>maximum ).
WHEN 4.
lr_aggr->set( aggregation = if_salv_c_aggregation=>average ).
WHEN 0.
lr_aggr->set( aggregation = if_salv_c_aggregation=>none ).
ENDCASE.
CATCH cx_salv_data_error
cx_salv_not_found
cx_salv_existing INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
ENDFORM. " ADD_COLUMN_AGGREGATION
*&---------------------------------------------------------------------*
*& Form SET_ZEBRA_FORMAT
*&---------------------------------------------------------------------*
* Set the Zebra Format
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_Bool TYPE abap_bool
*----------------------------------------------------------------------*
FORM set_zebra_format USING p_alv TYPE REF TO cl_salv_table
p_bool TYPE abap_bool.
DATA: lr_display TYPE REF TO cl_salv_display_settings.
IF p_bool = abap_true.
" Enable Striped Pattern (Zebra)
lr_display = p_alv->get_display_settings( ).
lr_display->set_striped_pattern( cl_salv_display_settings=>true ).
ELSE.
lr_display = p_alv->get_display_settings( ).
lr_display->set_striped_pattern( cl_salv_display_settings=>false ).
ENDIF.
ENDFORM. " SET_ZEBRA_FORMAT
*&---------------------------------------------------------------------*
*& Form SET_TOOLBAR_SHOW_ALL
*&---------------------------------------------------------------------*
* Show all toolbar buttons
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_Bool TYPE abap_bool
*----------------------------------------------------------------------*
FORM set_toolbar_show_all USING p_alv TYPE REF TO cl_salv_table
p_bool TYPE abap_bool.
DATA: lr_functions TYPE REF TO cl_salv_functions.
lr_functions = p_alv->get_functions( ).
lr_functions->set_all( p_bool ).
ENDFORM. " SET_TOOLBAR_SHOW_ALL
*&---------------------------------------------------------------------*
*& Form SET_COLUMN_WIDTH_OPTIMIZE
*&---------------------------------------------------------------------*
* Set Column Width to Optimize
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
*----------------------------------------------------------------------*
FORM set_column_width_optimize USING p_alv TYPE REF TO cl_salv_table.
DATA: lr_columns TYPE REF TO cl_salv_columns_table.
lr_columns = p_alv->get_columns( ).
" No bool check because I'm not sure what the negation is.
lr_columns->set_optimize( ).
ENDFORM. " SET_TOOLBAR_SHOW_ALL
*&---------------------------------------------------------------------*
*& Form ADD_HEADER_INFORMATION
*&---------------------------------------------------------------------*
* Add Header text to layout grid.
* MUST CALL apply_header_changes TO APPLY HEADER INFORMATION
*----------------------------------------------------------------------*
* -->P_ALV_GRID TYPE REF TO cl_salv_form_layout_grid
* -->P_Header text
* -->P_Row text
* -->P_Col text
*----------------------------------------------------------------------*
FORM add_header_information USING p_alv_grid TYPE REF TO cl_salv_form_layout_grid
p_header
p_row
p_col.
p_alv_grid->create_header_information(
row = p_row
column = p_col
text = p_header ).
ENDFORM. " ADD_HEADER_INFORMATION
*&---------------------------------------------------------------------*
*& Form APPLY_HEADER_CHANGES
*&---------------------------------------------------------------------*
* Apply the changes made to an
* object type ref to cl_salv_form_layout_grid
* to an object type ref to cl_salv_table
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_ALV_GRID TYPE REF TO cl_salv_form_layout_grid
*----------------------------------------------------------------------*
FORM apply_header_changes USING p_alv TYPE REF TO cl_salv_table
p_alv_grid TYPE REF TO cl_salv_form_layout_grid.
p_alv->set_top_of_list( p_alv_grid ).
ENDFORM. " APPLY_HEADER_CHANGES
*&---------------------------------------------------------------------*
*& Form SET_SELECTION_MODE
*&---------------------------------------------------------------------*
* Set the selection mode of
* an object type ref to cl_salv_table
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_MODE INT4
*----------------------------------------------------------------------*
FORM set_selection_mode USING p_alv TYPE REF TO cl_salv_table
p_mode TYPE int4.
DATA: gr_selections TYPE REF TO cl_salv_selections.
" None = 0, Single = 1, Multiple = 2, Cell = 3, Row_Column = 4
TRY.
gr_selections = p_alv->get_selections( ).
CASE p_mode.
WHEN 1.
gr_selections->set_selection_mode( gr_selections->single ).
WHEN 2.
gr_selections->set_selection_mode( gr_selections->multiple ).
WHEN 3.
gr_selections->set_selection_mode( gr_selections->cell ).
WHEN 4.
gr_selections->set_selection_mode( gr_selections->row_column ).
WHEN 0.
gr_selections->set_selection_mode( gr_selections->none ).
ENDCASE.
CATCH cx_salv_data_error
cx_salv_not_found
cx_salv_existing INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
ENDFORM. " SET_SELECTION_MODE
*&---------------------------------------------------------------------*
*& Form SET_COLUMN_HIDDEN
*&---------------------------------------------------------------------*
* Hides a column from display on the UI
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_NAME text
*----------------------------------------------------------------------*
FORM set_column_hidden USING p_alv TYPE REF TO cl_salv_table
p_name.
DATA: name TYPE salv_s_column_ref-columnname,
lr_columns TYPE REF TO cl_salv_columns_table,
lr_column TYPE REF TO cl_salv_column_table.
" Make p_name upper case. (The errors were getting annoying)
PERFORM: toupper USING p_name CHANGING name.
TRY.
lr_columns = p_alv->get_columns( ).
lr_column ?= lr_columns->get_column( name ).
lr_column->set_technical( abap_true ).
CATCH cx_salv_not_found INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
ENDFORM. " SET_COLUMN_HIDDEN
*&---------------------------------------------------------------------*
*& Form SET_SORT
*&---------------------------------------------------------------------*
* Adds a column to be sorted on (Max nine per ALV output)
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_NAME text
* -->P_POS int4 (if_salv_c_sort)
* -->P_SEQ int4 (if_salv_c_sort)
* -->P_SUB abap_bool
* -->P_GRP int4 (if_salv_c_sort)
* -->P_OBL abap_bool
*----------------------------------------------------------------------*
FORM set_sort USING p_alv TYPE REF TO cl_salv_table
p_name
p_pos TYPE int4
p_seq TYPE int4
p_sub TYPE abap_bool
p_grp TYPE int4
p_obl TYPE abap_bool.
DATA: name TYPE salv_s_column_ref-columnname,
lr_sorts TYPE REF TO cl_salv_sorts,
lr_sort TYPE REF TO cl_salv_sort.
lr_sorts = p_alv->get_sorts( ).
" Make p_name upper case. (The errors were getting annoying)
PERFORM: toupper USING p_name CHANGING name.
TRY.
CALL METHOD lr_sorts->add_sort
EXPORTING
columnname = name
position = p_pos " Position of the sort
sequence = p_seq " ASC = 1, DESC = 2, NONE = 0
subtotal = p_sub " Bool
group = p_grp " Underline = 2, Newpage = 1, None = 0
obligatory = p_obl
RECEIVING
value = lr_sort.
CATCH cx_salv_not_found
cx_salv_existing
cx_salv_data_error INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
ENDFORM. " SET_SORT
*&---------------------------------------------------------------------*
*& Form SET_QUANTITY_COLUMN
*&---------------------------------------------------------------------*
* Sets the Quantity Column
*----------------------------------------------------------------------*
* -->P_ALV TYPE REF TO cl_salv_table
* -->P_QUANTITY text
* -->P_UNIT text
*----------------------------------------------------------------------*
FORM set_quantity_column USING p_alv TYPE REF TO cl_salv_table
p_quantity
p_unit.
DATA: quantity TYPE salv_s_column_ref-columnname,
unit TYPE salv_s_column_ref-columnname,
lr_columns TYPE REF TO cl_salv_columns_table,
lr_column TYPE REF TO cl_salv_column_table.
" Make quantity and unit upper case. (The errors were getting annoying)
PERFORM toupper: USING p_quantity CHANGING quantity,
USING p_unit CHANGING unit.
TRY.
lr_columns = p_alv->get_columns( ).
lr_column ?= lr_columns->get_column( quantity ).
" Sets the quantity column
CALL METHOD lr_column->set_quantity_column
EXPORTING
value = unit.
CATCH cx_salv_not_found
cx_salv_data_error INTO lo_alv_error.
PERFORM process_alv_error_msg USING lo_alv_error 'A'.
ENDTRY.
ENDFORM. " SET_QUANTITY_COLUMN
*&---------------------------------------------------------------------*
*& Form TOUPPER
*&---------------------------------------------------------------------*
* Unicode safe version to make text upper case
*----------------------------------------------------------------------*
* -->I_IN Text In
* <--C_OUT Text Out
*----------------------------------------------------------------------*
FORM toupper USING i_in TYPE any
CHANGING c_out TYPE any.
DATA: lv_lang TYPE tcp0c-langu,
lv_cntry TYPE tcp0c-country,
lv_mod TYPE tcp0c-modifier.
GET LOCALE LANGUAGE lv_lang COUNTRY lv_cntry MODIFIER lv_mod.
SET LOCALE LANGUAGE lv_lang.
c_out = i_in.
TRANSLATE c_out TO UPPER CASE.
ENDFORM. " TOUPPER
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment