Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

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. Instead of that you can install the Function Module /BLTG/RFC_GET_STRING via Transport Request (download )

If you already use Performer Suite you should have that function module in your system and can re-use it.

(warning) 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
  • No labels