Более-менее универсальный код для Inverse Start Routine.
Для простых случаев копипастить, для более сложных - дорабатывать.
Code:
DATA: i_rt_chavl_cs TYPE rsarc_rt_chavl,
i_thx_selection_cs TYPE rsarc_thx_selcs,
c_t_selection TYPE sbiwa_t_select,
e_exact TYPE rs_bool.
DATA: l_tr_dimensions TYPE rsmds_tr_dimensions,
"table of dimension references
l_r_dimension LIKE LINE OF l_tr_dimensions,
"dimension reference
l_dimname TYPE rsmds_dimname,
"dimension name
l_sx_selection_cs LIKE LINE OF i_thx_selection_cs,
"work area for single characteristc RANGE table
l_r_universe TYPE REF TO cl_rs_infoobject_universe.
DATA: l_s_selection LIKE LINE OF c_t_selection,
l_s_chavl_cs LIKE LINE OF i_rt_chavl_cs,
date TYPE sy-datum.
TRY.
* Transform selection set for outbound
CALL METHOD i_r_selset_outbound->to_ranges
CHANGING
c_t_ranges = i_rt_chavl_cs.
" Get reference to InfoObject universe
l_r_universe = cl_rs_infoobject_universe=>get_instance( ).
*Get all dimensions (i.e. fields) from outbound selection which are
*restricted
l_tr_dimensions = i_r_selset_outbound->get_dimensions( ).
LOOP AT l_tr_dimensions INTO l_r_dimension.
CLEAR l_sx_selection_cs.
* Get dimension name (= field name)
l_sx_selection_cs-chanm = l_r_dimension->get_name( ).
"l_dimname = l_r_dimension->get_name( ).
* Transform dimension name to InfoObject name
"l_sx_selection_cs-chanm = "l_r_universe->dimname_to_iobjnm(
"l_dimname ).
*Project complete outbound selection set to current dimension and
*and convert to RANGE table representation
CALL METHOD i_r_selset_outbound->to_ranges
EXPORTING
i_r_dimension = l_r_dimension
CHANGING
c_t_ranges = l_sx_selection_cs-rt_chavl.
APPEND l_sx_selection_cs TO i_thx_selection_cs.
ENDLOOP.
LOOP AT i_thx_selection_cs INTO l_sx_selection_cs.
CLEAR l_s_selection.
l_s_selection-fieldnm = l_sx_selection_cs-chanm.
LOOP AT l_sx_selection_cs-rt_chavl INTO l_s_chavl_cs.
l_s_selection-sign = l_s_chavl_cs-sign.
l_s_selection-option = l_s_chavl_cs-option.
l_s_selection-low = l_s_chavl_cs-low.
l_s_selection-high = l_s_chavl_cs-high.
APPEND l_s_selection TO c_t_selection.
ENDLOOP.
ENDLOOP.
c_r_selset_inbound = i_r_universe_inbound->create_set_from_ranges(
i_fieldname_dimension = 'FIELDNM'
i_t_ranges = c_t_selection ).
c_exact = rs_c_true.
CATCH cx_rsmds_input_invalid cx_rsmds_input_invalid_type.
* Should not occur
* If the exception occurs request all values from source
* for this routine to be on the save side
c_r_selset_inbound = cl_rsmds_set=>get_universal_set( ).
c_exact = rs_c_false. "Inversion is no longer exact
ENDTRY.