To enable RFC-based metadata extraction in the Data Lineage Metadata API, a custom function module must be installed in your SAP system (unless using a newer SAP BASIS release — see exceptions below).
Recommended Installation Methods:
-
Preferred (if already using Performer Suite):
If you have the Performer Suite installed, the function module RFC_GET_STRING is likely already present. You can reuse it — no additional installation is required. -
Alternative (via Transport Request):
Download the file Metadata API - Function Module.zip.
Import the included transport request into your SAP system to install /BLTG/RFC_GET_STRING.
Important Exceptions
-
For SAP BASIS 7.40 Support Package 27:
In this case, you cannot use the transport request mentioned above (Metadata API - Function Module.zip). Instead, insert the function module manually as described in the documentation below (or in the linked section "Manual Function Module Setup"). -
For SAP BASIS 7.50 Support Package 23:
In this case, you cannot use the transport request mentioned above. Instead, insert the function module manually as described in the documentation below.
No Custom Function Module Required (as of Metadata API version 1.4.0)
Starting with Metadata API v1.4.0, the tool uses standard SAP capabilities for RFC connections in the following BASIS releases and support package levels (or higher).
Affected releases where the custom FM is no longer needed:
-
SAP BASIS 7.51 SP13 or higher
-
SAP BASIS 7.52 SP09 or higher
-
SAP BASIS 7.53 SP07 or higher
-
SAP BASIS 7.54 SP05 or higher
-
SAP BASIS 7.55 SP03 or higher
-
SAP BASIS 7.56 SP01 or higher
Manual Function Module Setup
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
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