Created
October 13, 2018 15:21
-
-
Save benjaminkwilliams/bbf406a72cb737aee13835d076043f54 to your computer and use it in GitHub Desktop.
Utilities for SAP ABAP ALV Programming
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*&---------------------------------------------------------------------* | |
*& 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