Skip to content

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:

  1. Go to SAP transaction SE80.
  2. Create a new function group or select an existing custom function group.
  3. Ensure that the function group is active.
  4. Create a new function module in the function group.
  5. When naming the custom function module, use an organization-specific prefix followed by RFC_GET_STRING according 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