If you want to use the RFC connection you have to install the function module. All properties you need to generate it are described below.
If you already use Performer Suite you should have that function module in your system and can re-use it.
No Function Module needed since version v1.4.0 of the Metadata API and
with SAP BASIS releases >
7.40 SP27
7.50 SP23
7.51 SP13
7.52 SP09
7.53 SP07
7.54 SP05
7.55 SP03
7.56 SP01
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 |
|
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
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