Create RFC_GET_STRING Manually
This article shows how to create the custom function module RFC_GET_STRING manually in an SAP system.
Prerequisites
- Authorization to create function groups and function modules in SAP.
Create RFC_GET_STRING
To create the function module:
- Go to SAP transaction SE80.
- Create a new function group or select an existing custom function group.
- Ensure that the function group is active.
- Create a new function module in the function group.
- When naming the custom function module, use an organization-specific prefix followed by
RFC_GET_STRINGaccording to your SAP naming standards, e.g.,Z_RFC_GET_STRING.
The custom function module RFC_GET_STRING is created in an active function group and is ready for further configuration.
Note
Specify the function module prefix in the connection settings in Enterpise Glossary, e.g., in the S/4HANA connection setting Function Module Prefix. The prefix is used to identify the custom function module in the SAP system.
General Information
- Function Module Name: \<your selected prefix>RFC_GET_STRING
- Function Pool: \<your function pool>
- Remote-Enabled Module: Yes
Import Parameters
| Parameter | Associated Type | Default | Opt. | Pass | Short text | |
|---|---|---|---|---|---|---|
| I_TABLE | TYPE | DD02L-TABNAME | X | |||
| I_FIELD | TYPE | FELD_NAME | X | X | ||
| I_RAWSTRING | TYPE | SONV-FLAG | X | X | ||
| I_SCAN_STRING | TYPE | CHAR80 | X | X | ||
| I_SCAN_FIELD | TYPE | FELD_NAME | X | X | ||
| I_ROWCOUNT | TYPE | SOID-ACCNT | 0 | X | X | |
| I_DECRYPTION | TYPE | SONV-FLAG | 'X' | X | X | |
| I_DATABUFFERDECOMPRESS | TYPE | SONV-FLAG | '' | X | X | |
| I_LIMIT | TYPE | INT4 | -1 | X | X | |
| I_OFFSET | TYPE | INT4 | -1 | X | X |
Export Parameters
| Parameter | Associated Type | Pass | Short text | |
|---|---|---|---|---|
| E_STRING | TYPE | STRING | X | |
| E_STRINGTAB | TYPE | STRINGTAB | X | |
| E_RC | TYPE | INT4 | X | |
| E_MSG | TYPE | STRING | X |
Tables
| Parameter | Associated Type | Opt. | Short text | |
|---|---|---|---|---|
| T_FIELDS | LIKE | RFC_DB_FLD | ||
| T_OPTIONS | LIKE | RTXTLDAT |
Exceptions
| Exception | Short text |
|---|---|
| RELEASE_1_7 | |
| NOT_AUTHORIZED | |
| TABLE_NOT_AVAILABLE |
Source Code
RFC_GET_STRING Source Code
FUNCTION <your selected prefix>RFC_GET_STRING.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_TABLE) TYPE DD02L-TABNAME
*" VALUE(I_FIELD) TYPE FELD_NAME OPTIONAL
*" VALUE(I_RAWSTRING) TYPE SONV-FLAG OPTIONAL
*" VALUE(I_SCAN_STRING) TYPE CHAR80 OPTIONAL
*" VALUE(I_SCAN_FIELD) TYPE FELD_NAME OPTIONAL
*" VALUE(I_ROWCOUNT) TYPE SOID-ACCNT DEFAULT 0
*" VALUE(I_DECRYPTION) TYPE SONV-FLAG DEFAULT 'X'
*" VALUE(I_DATABUFFERDECOMPRESS) TYPE SONV-FLAG DEFAULT ''
*" EXPORTING
*" VALUE(E_STRING) TYPE STRING
*" VALUE(E_STRINGTAB) TYPE STRINGTAB
*" VALUE(E_RC) TYPE INT4
*" VALUE(E_MSG) TYPE STRING
*" TABLES
*" T_FIELDS STRUCTURE RFC_DB_FLD
*" T_OPTIONS STRUCTURE RTXTLDAT
*" EXCEPTIONS
*" RELEASE_1_7
*" NOT_AUTHORIZED
*" TABLE_NOT_AVAILABLE
*"----------------------------------------------------------------------
"Check Auth.
CALL FUNCTION 'VIEW_AUTHORITY_CHECK'
EXPORTING
view_action = 'S'
view_name = i_table
EXCEPTIONS
no_authority = 2
no_clientindependent_authority = 2
no_linedependent_authority = 2
OTHERS = 1.
IF sy-subrc = 2.
RAISE not_authorized.
ELSEIF sy-subrc = 1.
RAISE table_not_available.
ENDIF.
DATA:
lr_error TYPE REF TO cx_root,
lr_dataref TYPE REF TO data,
lv_rawstring TYPE rswr_data_xstring,
lv_zip TYPE c LENGTH 1.
* Variables
DATA:
lv_string TYPE string,
lv_decrypt TYPE string,
lv_temp TYPE string,
ls_dfies TYPE dfies,
lt_dfields TYPE ddfields,
lt_alldfields TYPE ddfields,
lt_stringtab TYPE stringtab, "temp. result table
lv_skip TYPE c LENGTH 1. "Flag for skipping dataset insert
FIELD-SYMBOLS:
<lt_tab> TYPE ANY TABLE,
<ls_line> TYPE any,
<lv_any> TYPE any.
IF i_field IS INITIAL.
*catch any exception and pass message along to caller
TRY.
*Get meta data for table
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = i_table
TABLES
dfies_tab = lt_alldfields
EXCEPTIONS
OTHERS = 2.
IF sy-subrc <> 0.
e_rc = 4.
e_msg = 'TABLE NOT FOUND, PLEASE TRY AGAIN.'.
RETURN.
ENDIF.
IF t_fields[] IS INITIAL.
*No restrictions provided; use all fields
lt_dfields = lt_alldfields.
ELSE.
*Verify that all fieldnames specified exist in table
LOOP AT t_fields ASSIGNING <lv_any>.
READ TABLE lt_alldfields INTO ls_dfies
WITH KEY fieldname = <lv_any>.
IF sy-subrc <> 0.
*Specified field not found in table
e_rc = 4.
CONCATENATE 'FIELD' <lv_any> 'NOT FOUND IN TABLE' i_table
INTO e_msg SEPARATED BY space.
RETURN.
ENDIF.
*Fieldname found; insert line into working dfies table
INSERT ls_dfies INTO TABLE lt_dfields.
ENDLOOP.
ENDIF.
CREATE DATA lr_dataref TYPE STANDARD TABLE OF (i_table).
ASSIGN lr_dataref->* TO <lt_tab>.
SELECT * FROM (i_table) INTO TABLE <lt_tab>
WHERE (t_options).
*************New ADÜ_20180209
IF i_databufferdecompress = 'X' AND i_table = 'RSBKCMD'.
DATA: lt_rsbkcmd TYPE TABLE OF rsbkcmd,
ls_rsbkcmd TYPE rsbkcmd,
lt_rsbkcmd2 TYPE TABLE OF rsbkcmd.
lt_rsbkcmd = <lt_tab>.
CLEAR <lt_tab>.
LOOP AT lt_rsbkcmd INTO ls_rsbkcmd.
IF ls_rsbkcmd-cmd = 'COMPRESS'.
IMPORT instances TO lt_rsbkcmd2 FROM DATA BUFFER ls_rsbkcmd-tpl_instance.
INSERT LINES OF lt_rsbkcmd2 INTO TABLE <lt_tab>.
CLEAR lt_rsbkcmd2.
ELSE.
INSERT ls_rsbkcmd INTO TABLE <lt_tab>.
ENDIF.
ENDLOOP.
ENDIF.
************End New ADÜ_20180209
LOOP AT <lt_tab> ASSIGNING <ls_line>.
FREE lt_stringtab.
LOOP AT lt_dfields INTO ls_dfies.
CLEAR: lv_string, lv_decrypt.
ASSIGN COMPONENT ls_dfies-position
OF STRUCTURE <ls_line> TO <lv_any>.
lv_temp = <lv_any>. "force the type conversion
"Zipped?
IF ls_dfies-fieldname = 'COMPRESSION'.
lv_zip = lv_temp.
ENDIF.
"special treatment for RAWSTRING fields
IF ls_dfies-datatype = 'RSTR' AND i_decryption = 'X'.
lv_rawstring = lv_temp.
PERFORM decrypt_rawstring
USING lv_zip lv_rawstring CHANGING lv_decrypt.
e_string = lv_decrypt.
lv_temp = lv_decrypt.
ENDIF.
lv_string = lv_temp.
INSERT lv_string INTO TABLE lt_stringtab.
"In case a string scan is done check if found
IF i_scan_string IS NOT INITIAL.
IF i_scan_field = ls_dfies-fieldname.
IF lv_string CP i_scan_string.
CLEAR lv_skip.
ELSE."string not found
lv_skip = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
"In case scan had no hit -> no insert in result table
IF lv_skip IS INITIAL.
APPEND LINES OF lt_stringtab TO e_stringtab.
ENDIF.
"Exit if a rowcount restriction was set
IF i_rowcount > 0 AND sy-tabix GE i_rowcount.
EXIT.
ENDIF.
ENDLOOP.
CATCH cx_root INTO lr_error.
e_rc = 4.
e_msg = lr_error->get_text( ).
ENDTRY.
ELSE."read single line and field
IF i_rawstring = 'X' AND i_decryption = 'X'.
SELECT SINGLE (i_field) FROM (i_table)
INTO lv_rawstring WHERE (t_options).
CLEAR lv_zip.
PERFORM decrypt_rawstring
USING lv_zip lv_rawstring CHANGING lv_decrypt.
e_string = lv_decrypt.
"BEGIN NEW
ELSEIF i_rawstring = 'X' AND i_decryption = ''.
SELECT SINGLE (i_field) FROM (i_table)
INTO lv_rawstring WHERE (t_options).
e_string = lv_rawstring.
"END NEW
ELSE.
SELECT SINGLE (i_field) FROM (i_table)
INTO e_string WHERE (t_options).
ENDIF.
ENDIF.
ENDFUNCTION.
*&--------------------------------------------------------------------*
*& Form decrypt_rawstring
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM decrypt_rawstring USING lv_zip lv_rawstring CHANGING lv_decrypt.
"Transform rawstring to text
DATA: lv_converter TYPE REF TO cl_abap_conv_in_ce.
DATA: lv_xstring TYPE xstring.
* unzip if compressed
IF NOT lv_zip IS INITIAL.
TRY.
cl_abap_gzip=>decompress_binary(
EXPORTING
gzip_in = lv_rawstring
IMPORTING
raw_out = lv_xstring ).
CATCH: cx_parameter_invalid_range cx_sy_buffer_overflow.
ENDTRY.
ELSE.
lv_xstring = lv_rawstring.
ENDIF.
* read
lv_converter = cl_abap_conv_in_ce=>create(
input = lv_xstring
encoding = 'UTF-8'
replacement = '?'
ignore_cerr = abap_true ).
TRY.
CALL METHOD lv_converter->read( IMPORTING data = lv_decrypt ).
CATCH cx_sy_conversion_codepage.
*-- Should ignore errors in code conversions
CATCH cx_sy_codepage_converter_init.
*-- Should ignore errors in code conversions
CATCH cx_parameter_invalid_type.
CATCH cx_parameter_invalid_range.
ENDTRY.
ENDFORM. "decrypt_rawstring
Last update: September 16, 2026