Here is a sample solution used when you need to read the internal table and when the names of keys can vary (they have to be specified dynamically).
REPORT zread_dyn.
TYPES:
ts_data TYPE tstct, " table with descriptions of transakctions
tt_data TYPE TABLE OF ts_data,
BEGIN OF ts_query,
name TYPE string,
value TYPE string,
END OF ts_query,
tt_query TYPE TABLE OF ts_query.
DATA:
lt_data TYPE tt_data,
ls_data TYPE ts_data,
lt_query TYPE tt_query,
ls_query TYPE ts_query.
START-OF-SELECTION.
* Load sample data
SELECT *
INTO TABLE lt_data
FROM tstct
WHERE sprsl = 'EN'
AND tcode LIKE 'B%'.
* Specify combination of the keys for search
ls_query-name = 'SPRSL'. ls_query-value = 'EN'. APPEND ls_query TO lt_query.
ls_query-name = 'TCODE'. ls_query-value = 'BAPI'. APPEND ls_query TO lt_query.
PERFORM read_table USING lt_data
lt_query
CHANGING ls_data.
WRITE: / ls_data-ttext. " BAPI Explorer
*&---------------------------------------------------------------------*
*& Form read_table
*&---------------------------------------------------------------------*
FORM read_table USING pt_data TYPE tt_data
pt_query TYPE tt_query
CHANGING ps_data TYPE ts_data.
DATA:
ls_query TYPE ts_query,
lv_name_txt TYPE string,
lv_value_txt TYPE string,
lv_tabix_txt TYPE string,
lv_name1 TYPE string,
lv_name2 TYPE string,
lv_name3 TYPE string,
lv_value1 TYPE string,
lv_value2 TYPE string,
lv_value3 TYPE string.
FIELD-SYMBOLS:
<fs_name> TYPE string,
<fs_value> TYPE string.
LOOP AT pt_query INTO ls_query.
lv_tabix_txt = sy-tabix.
CONCATENATE 'LV_NAME' lv_tabix_txt INTO lv_name_txt.
ASSIGN (lv_name_txt) TO <fs_name>.
<fs_name> = ls_query-name.
CONCATENATE 'LV_VALUE' lv_tabix_txt INTO lv_value_txt.
ASSIGN (lv_value_txt) TO <fs_value>.
<fs_value> = ls_query-value.
ENDLOOP.
* Empty (lv_nameX) are ignored
READ TABLE pt_data INTO ps_data WITH KEY (lv_name1) = lv_value1
(lv_name2) = lv_value2
(lv_name3) = lv_value3.
ENDFORM. "read_table