This page contains usefull code for consultants that don't code every day, since some code may be forgetten overtime. The simple operations are excluded from this list. Only mid/advanced code is documented.
Mandatory reading to improve and keep up to date in the code syntax:
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md
https://blogs.sap.com/2015/10/25/abap-740-quick-reference/
DATA: t_table TYPE SORTED TABLE OF tt_table WITH NON-UNIQUE KEY field2 field3.
t_table1 = FILTER #( t_tabl1 IN t_table2 WHERE field1 <> field2 ).
t_table2 = CORRESPONDING #( t_table1).
SELECT invdocno
FROM dfkkinvdoc_p
INTO TABLE ct_invdocno FOR
ALL ENTRIES IN t_opbel_inv
WHERE opbel = t_opbel_inv-table_line.
INITIALIZATION.
DATA: s_restriction TYPE sscr_restrict.
s_restriction-opt_list_tab = VALUE #( ( name = 'SO_OUTBO'
options-eq = abap_true ) ).
s_restriction-ass_tab = VALUE #( ( kind = 'S'
name = 'SO_OUTBO'
sg_main = 'I'
op_main = 'SO_OUTBO' ) ).
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
EXPORTING
restriction = s_restriction.
cl_progress_indicator=>progress_indicate( i_text = |Processing: { sy-tabix }/{ lines( t_table ) }|
i_output_immediately = abap_true ).
text = |Processing: { sy-tabix }/{ lines( t_table ) }|.
Or
text = `Processing ` && sy-tabix && '/' && lines( t_table ).
Or
CONCATENATE `Processing ` sy-tabix '/' lines( t_table ) INTO text.
* Get the last character of a string
str = substring( val = str off = strlen( str ) - 1 len = 1 ).
* Remove the last character of a string
str = substring( val = str off = 0 len = strlen( str ) - 1 ).
STRLEN( is_psp-pan )
DATA(sum) = xsdbool( sy-subrc IS INITIAL ).
* IF sy-subrc IS INITIAL.
* DATA(sum) = abap_true.
* ENDIF.
* JSON to Data
*Recomended
/ui2/cl_json=>deserialize( EXPORTING json = json_response
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = es_data_out ).
*Also works with issues for example in the scenario where there is a structure inside a structure inside a structure
cl_fdt_json=>json_to_data( EXPORTING iv_json = json_response
CHANGING ca_data = es_data_error ).
* Data to json
/ui2/cl_json=>serialize( EXPORTING data = ls_code
RECEIVING r_json = rv_string ).
MESSAGE 'A really bad error occured!' TYPE 'X' RAISING cx_sy_dump_creation.
LOOP AT t_fkkcl INTO DATA(s_fkkcl) GROUP BY hkont.
CLEAR s_fkkop-betrw.
s_fkkop-opupk += 1.
s_fkkop-hkont = s_fkkcl-hkont.
LOOP AT GROUP s_fkkcl INTO DATA(line).
s_fkkop-betrw -= line-betrw.
s_fkkop-betrh = s_fkkop-betrw.
ENDLOOP.
APPEND s_fkkop TO t_fkkop.
ENDLOOP.
DATA: date_z TYPE xsddatetime_z, "yyyy-mm-ddThh:mm:ssZ
date_s TYPE CHAR20.
TRY.
CALL TRANSFORMATION id SOURCE data = date_z RESULT data = date_s.
CATCH cx_root INTO DATA(txt).
ENDTRY.
WRITE sy-datum TO gs_omp_general-omp_date USING EDIT MASK '__/__/____'.
DATA: date_char type char10. "Will use standard format yyyy-mm-dd
CALL TRANSFORMATION id SOURCE data = date RESULT data = date_char.
DATA: timestamp TYPE XSDDATETIME_LONG_Z.
GET TIME STAMP FIELD timestamp.
WRITE timestamp TO gs_lot-header-dateheurems TIME ZONE sy-zonlo USING EDIT MASK '____-__-__T__:__:__.___'.
CONVERT TIME STAMP ts TIME ZONE sy-zonlo INTO DATE DATA(date) TIME DATA(time).
CONVERT DATE sy-datum TIME sy-uzeit INTO TIME STAMP DATA(ts) TIME ZONE sy-zonlo.
"Date and Time in Milisecounds
CALL METHOD cl_pco_utility=>convert_abap_timestamp_to_java
EXPORTING
iv_date = sy-datum
iv_time = sy-uzeit
IMPORTING
ev_timestamp = timestamp.
DATA: ld_timestamp TYPE timestamp,
ld_date TYPE d.
MOVE s_data-date TO ld_timestamp.
CONVERT TIME STAMP ld_timestamp TIME ZONE sy-zonlo INTO DATE ld_date.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = date
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
error = 'X'.
EXIT.
ENDIF.
CALL FUNCTION 'TIME_CHECK_PLAUSIBILITY'
EXPORTING
time = time
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
error = abap_true.
EXIT.
ENDIF.
<br>
REPLACE ALL OCCURRENCES OF REGEX '^\{"TAG":|\}$' IN json_string WITH ``.
TYPES: BEGIN OF ty_out,
opbel LIKE dfkkzp-opbel,
amount TYPE betrw_kk,
END OF ty_out.
DATA: BEGIN OF s_out,
opbel LIKE dfkkzp-opbel,
amount TYPE betrw_kk,
INCLUDE TYPE zfica_globalpay.
END OF s_out.
DATA: BEGIN OF t_plate OCCURS 0,
zzplate LIKE dfkkop-zzplate,
END OF t_plate.
DATA(t) = 'BLART' && | LIKE | && cl_abap_dyn_prg=>quote( 'P&' ).
DATA(t) = 'BLART' && ` LIKE ` && `'P&'`.
CONCATENATE 'BLART' ` LIKE ` `'P&'` INTO DATA(t). "| not possible
DELETE ADJACENT DUPLICATES FROM <Internal Table> COMPARING <field name>.
SELECT k~keyz1, k~keyz2, k~erdat, p~selw1, p~betrz, p~txtvw, p~xclar, p~opbel
FROM dfkkzk AS k
INNER JOIN dfkkzp AS p
ON p~keyz1 = k~keyz1
INTO TABLE @DATA(t_out)
WHERE k~keyz1 IN @p_lot
AND k~keyz2 IN @p_file
AND k~erdat IN @p_date.
index += 1. " >= NW 7.54
"index = index + 1. " < NW 7.54
"ADD 1 TO index.
IF line_exists( my_table[ key = 'A' ] ).
...
ENDIF.
DATA(uppercase) = to_upper( lowercase ).
" TRANSLATE lowercase TO UPPER CASE.
REPLACE ALL OCCURENCES OF 'X' IN string WITH ` `.
unpack value TO value.
Or
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = value
IMPORTING
output = value.
Or
value = |{ value ALPHA = IN }|.
SHIFT value LEFT DELETING LEADING '0'.
Or
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = value
IMPORTING
output = value.
MESSAGE 'Error Message' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
Or
CALL FUNCTION 'BALW_BAPIRETURN_GET2'
EXPORTING
type = 'E'
cl = 'ZFICA'
number = '069'
par1 = 'Error Message'
IMPORTING
return = es_return.
RETURN.
SUBMIT program WITH p_par = p_var "Parameter
WITH p_so IN p_tb "Selection Option
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = DATA(gr_table)
CHANGING
t_table = t_dfkkop. "or t_dfkkop[]
CHECK gr_table IS BOUND.
***OR***
cl_salv_table=>factory( importing r_salv_table = lcl_alv changing t_table = gt_bits ).
*Show Buttons
DATA(lr_functions) = gr_table->get_functions( ).
lr_functions->set_all( abap_true ).
*Optimize collums
DATA(lo_cols) = gr_table->get_columns( ).
lo_cols->set_optimize( abap_true ).
*Set color on column
lr_column ?= lr_columns->get_column( 'ZZ_TRIPID' ).
lr_column->set_color( VALUE lvc_s_colo( col = 1 int = 1 ) ).
* Set Striped Pattern
gr_display = lcl_alv->get_display_settings( ).
gr_display->set_striped_pattern( abap_true ).
* Replace name at top left of the page.
gr_display = lcl_alv->get_display_settings( ).
gr_display->set_list_header( 'Log Execution' ).
* Set header
DATA: lo_header TYPE REF TO cl_salv_form_layout_grid,
CREATE OBJECT lo_header.
* Writing Bold phrase
lo_h_label = lo_header->create_label( row = 1 column = 1 ).
lo_h_label->set_text( lv_text ).
* Writing Header texts
lo_h_flow = lo_header->create_flow( row = 2 column = 1 ).
lo_h_flow->create_text( text = 'Total number of BITs analyzed:' ).
lo_h_flow = lo_header->create_flow( row = 2 column = 2 ).
lo_h_flow->create_text( text = lines( t_bits ) ).
lo_h_flow = lo_header->create_flow( row = 3 column = 1 ).
lo_h_flow->create_text( text = 'New Trips created:' ).
lo_h_flow = lo_header->create_flow( row = 3 column = 2 ).
lo_h_flow->create_text( text = count_new_trips ).
lo_h_flow = lo_header->create_flow( row = 4 column = 1 ).
lo_h_flow->create_text( text = 'Passages associated to existing trips:' ).
lo_h_flow = lo_header->create_flow( row = 4 column = 2 ).
lo_h_flow->create_text( text = count_ass_trips ).
* Set the top of list
lcl_alv->set_top_of_list( lo_header ).
* Print on top of list
lcl_alv->set_top_of_list_print( lo_header ).
* Saving Layouts.
DATA: s_key TYPE salv_s_layout_key.
s_key-report = sy-repid.
DATA(gr_layout) = gr_table->get_layout( ).
gr_layout->set_key( s_key ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
gr_layout->set_default( abap_true ).
* Change Columns info
DATA(lo_cols) = gr_table->get_columns( ).
lo_cols->set_column_position( columnname = 'AMOUNT_MISMATCH' position = 24 ).
DATA: gr_column TYPE REF TO cl_salv_column.
gr_column ?= lo_cols->get_column( columnname = 'MANDT' ).
gr_column->set_technical( value = if_salv_c_bool_sap=>true ).
gr_column ?= lo_cols->get_column( columnname = 'ICON' ).
gr_column->set_long_text( value = 'Status' ).
*Display in Pop-Up
gr_table->set_screen_popup(
start_column = 43
end_column = 70
start_line = 1
end_line = 9 ).
gr_table->display( ).
*Normal display
gr_table->display( ).
* Create 2 ALVs in splitted screen
TRY.
* Splitter - it is neccessary to specify the default_screen as parent
DATA(gr_splitter) = NEW cl_gui_splitter_container( parent = cl_gui_container=>screen0
no_autodef_progid_dynnr = abap_true
rows = 2
columns = 1 ).
* Container 1 for header
DATA(gr_container_1) = gr_splitter->get_container( row = 1
column = 1 ).
* Container 2 for detail
DATA(gr_container_2) = gr_splitter->get_container( row = 2
column = 1 ).
cl_salv_table=>factory( EXPORTING r_container = gr_container_1
IMPORTING r_salv_table = DATA(gr_salv_1)
CHANGING t_table = t_dunning ).
cl_salv_table=>factory( EXPORTING r_container = gr_container_2
IMPORTING r_salv_table = DATA(gr_salv_2)
CHANGING t_table = t_dunning ).
gr_salv_1->display( ).
gr_salv_2->display( ).
CALL SELECTION-SCREEN '1000'. "Or it can also be used WRITE: space.
CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error cx_salv_access_error INTO DATA(lx_alv).
DATA(lv_message) = lx_alv->get_text( ).
ENDTRY.
More info: https://belajarabap.wordpress.com/2022/01/29/alv-report-using-cl_salv_table/
DATA: rt_dfkkop TYPE RANGE OF dfkkop-xblnr. "or RANGES: gr_guid FOR zload_icm-meter_guid.
rt_dfkkop = VALUE #( FOR xblnr IN t_dfkkop_delete WHERE ( dalin = '' )
( sign = rsmds_c_sign-including "I
option = rsmds_c_option-equal "EQ
low = xblnr ) ).
rt_vkont = VALUE #( ( sign = rsmds_c_sign-including
option = rsmds_c_option-equal
low = vkont ) ).
t_plate[] = VALUE #( FOR s_vehicle IN t_vehicle
( zzplate = s_vehicle-vehicle_country && s_vehicle-vehicle_plate ) ).
APPEND VALUE #( sign = 'I' option = 'EQ' low = data ) TO rt_data.
DATA: t_range TYPE rs_t_rscedst,
t_where TYPE rsdmd_t_where.
t_range = VALUE #( FOR ls_infraction IN t_infraction
( fnam = 'ZZ_TRIPID'
sign = rsmds_c_sign-including
option = rsmds_c_option-equal
low = ls_infraction-tripid ) ).
CALL FUNCTION 'RSDS_RANGE_TO_WHERE'
EXPORTING
i_t_range = t_range
IMPORTING
e_t_where = t_where
EXCEPTIONS
internal_error = 1
OTHERS = 2.
t_further_sel[] = t_where.
t_transfer_i = VALUE #( FOR s_fkkmaze IN t_fkkmaze
WHERE ( dalin = '' AND blart = 'AV')
( opbel = s_fkkmaze-opbel
blart_new = 'AV' ) ).
PARAMETERS: p_kind TYPE bu_bpkind AS LISTBOX VISIBLE LENGTH 18 DEFAULT 'ADMN'.
SELECT * FROM tb004t INTO TABLE @DATA(t_bpkind) WHERE SPRAS = sy-lang.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_KIND'
values = VALUE vrm_values( FOR s_bpkind IN t_bpkind ( key = s_bpkind-bpkind
text = s_bpkind-text40 ) ).
INITIALIZATION.
sscrfields-functxt_01 = 'TAG IDs'.
sscrfields-functxt_02 = 'TAG Products'.
sscrfields-functxt_03 = 'VCD'.
sscrfields-functxt_04 = 'White List'.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN FUNCTION KEY 3.
SELECTION-SCREEN FUNCTION KEY 4.
IF sscrfields-ucomm = 'FC01'.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZCI_ISSUER_TAGID'.
IF sy-subrc <> 0.
MESSAGE 'Error showing the View for table ZCI_ISSUER_TAGID' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
IF sscrfields-ucomm = 'FC02'.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZCI_ISSUER_TAGPR'.
IF sy-subrc <> 0.
MESSAGE 'Error showing the View for table ZCI_ISSUER_TAGPR' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
Source: https://answers.sap.com/questions/3560063/push-buttons.html
SELECTION-SCREEN:
PUSHBUTTON 2(2) but1 USER-COMMAND cli1,
PUSHBUTTON 4(2) but2 USER-COMMAND cli2,
AT SELECTION-SCREEN.
CASE sscrfields.
WHEN 'CLI1'.
...
WHEN 'CLI2'.
...
ENDCASE.
START-OF-SELECTION.
but1 = 'Button 1'.
but2 = 'Button 1'.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_information
text = 'Button 2'
info = 'My Quickinfo'
IMPORTING
RESULT = but2
EXCEPTIONS
OTHERS = 0.
DATA zmoi_co_asgexternal_sei TYPE REF TO zmoi_co_asgexternal_sei.
DATA(lo_port_mgr) = cl_isx_cc_port_manager=>get_manager( EXPORTING iv_proxy_class = 'zmoi_co_asgexternal_sei' ).
DATA(logical_port) = lo_port_mgr->get_logical_port( ).
IF logical_port IS INITIAL.
RAISE system_failure.
ENDIF.
TRY.
CREATE OBJECT zmoi_co_asgexternal_sei
EXPORTING
logical_port_name = logical_port.
CATCH cx_ai_system_fault .
RAISE system_failure.
ENDTRY.
DATA: zmoi_get_unregistered_vehicle2 TYPE zmoi_get_unregistered_vehicle2,
zmoi_get_unregistered_vehicle1 TYPE zmoi_get_unregistered_vehicle1.
zmoi_get_unregistered_vehicle2-parameters = is_parameters.
TRY.
CALL METHOD zmoi_co_asgexternal_sei->get_unregistered_vehicle_data
EXPORTING
input = zmoi_get_unregistered_vehicle2
IMPORTING
output = zmoi_get_unregistered_vehicle1.
CATCH cx_ai_system_fault .
RAISE system_failure.
CATCH zmoi_cx_ws_exception .
ENDTRY.
es_vehicle_details = zmoi_get_unregistered_vehicle1-parameters-return.
CHECK es_vehicle_details-owner_id IS NOT INITIAL.
DATA: zmoi_get_unregistered_vehicle3 TYPE zmoi_get_vehicle_details_resp1,
zmoi_get_unregistered_vehicle4 TYPE zmoi_get_vehicle_details1.
MOVE-CORRESPONDING is_parameters TO zmoi_get_unregistered_vehicle4-parameters.
zmoi_get_unregistered_vehicle4-parameters-owner_id = es_vehicle_details-owner_id.
TRY.
CALL METHOD zmoi_co_asgexternal_sei->get_vehicle_details
EXPORTING
input = zmoi_get_unregistered_vehicle4
IMPORTING
output = zmoi_get_unregistered_vehicle3.
CATCH cx_ai_system_fault .
RAISE system_failure.
CATCH zmoi_cx_ws_exception .
ENDTRY.
es_vehicle_details = zmoi_get_unregistered_vehicle3-parameters-return.
DATA: s_controller TYPE prxctrl.
s_controller-field = nil.
s_controller-value = sai_ctrl_nil.
APPEND s_controller TO s_structur-controller.
*Main
rsmds_c_sign-including. "'I'
rsmds_c_option-equal. "'EQ'
*All
rsmds_c_sign-including. "'I',
rsmds_c_sign-excluding. "'E',
rsmds_c_sign-initial. "' ',
rsmds_c_option-initial. "' '
rsmds_c_option-between. "'BT'
rsmds_c_option-contains_pattern. "'CP'
rsmds_c_option-equal. "'EQ'
rsmds_c_option-greater_equal. "'GE'
rsmds_c_option-greater. "'GT'
rsmds_c_option-less_equal. "'LE'
rsmds_c_option-less. "'LT'
rsmds_c_option-not_between. "'NB'
rsmds_c_option-not_equal. "'NE'
rsmds_c_option-not_pattern. "'NP'
cl_fkk_prep=>co_pprsn_09. "09
abap_true. "'X'
abap_false. "''
cl_abap_char_utilities=>newline
DATA: log_handle TYPE balloghndl.
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = VALUE bal_s_log( object = 'ZOBJECT' subobject = 'ZSUBOBJECT' )
IMPORTING
e_log_handle = log_handle
EXCEPTIONS
log_header_inconsistent = 1
OTHERS = 2.
IF 1 = 2. MESSAGE s000(ZID). ENDIF.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_log_handle = log_handle
i_s_msg = VALUE bal_s_msg( msgid = 'ZID' msgty = 'S' msgno = '000' msgv1 = 'Message' ).
CALL FUNCTION 'BAL_DB_SAVE'
EXPORTING
i_t_log_handle = VALUE bal_t_logh( ( log_handle ) )
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 4.
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_t_log_handle = VALUE bal_t_logh( ( log_handle ) )
EXCEPTIONS
profile_inconsistent = 1
internal_error = 2
no_data_available = 3
no_authority = 4
OTHERS = 5.
cl_fkkinv_log=>create( x_object = 'ZOBJECT'
x_subobject = 'ZSUBOBJECT' ).
MESSAGE s000(zid) WITH 'message' INTO cl_fkkinv_log=>str. cl_fkkinv_log=>add_msg( ).
*IF cl_fkkinv_log=>get_lognumber( ) <> 0.
IF lines( cl_fkkinv_log=>get_messages( ) ) <> 0.
cl_fkkinv_log=>save( ).
cl_fkkinv_log=>display( ).
ENDIF.
cl_fkkinv_log=>display( ).
cl_fkkinv_log=>close( ).