REPORT zini_prg_parametros.
TABLES: e070.
SELECT-OPTIONS: s_orden FOR e070-trkorr,
s_fecha FOR sy-datum.
PARAMETERS: p_01(10) DEFAULT 'Opcion 1',
p_02(10) DEFAULT 'Opcion 2'.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase que importa los parámetros de entrada
CLASS zini_cl_params DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_params,
name(8),
kind TYPE rsscr_kind, "S / P
length TYPE i, "<--- hay que / 2
dtyp(4),
objeto TYPE REF TO data,
END OF ty_params.
DATA: t_tab TYPE STANDARD TABLE OF ty_params.
METHODS:
constructor IMPORTING p_report TYPE string,
load_params,
get_param IMPORTING p_name TYPE string
EXPORTING p_valor_s TYPE ANY TABLE
p_valor_p TYPE any,
set_param IMPORTING p_name TYPE string
p_valor_s TYPE ANY TABLE OPTIONAL
p_valor_p TYPE any OPTIONAL.
PRIVATE SECTION.
DATA: l_REPORT TYPE rsvar-report,
t_selctab TYPE STANDARD TABLE OF rsscr,
l_tab LIKE LINE OF t_tab.
ENDCLASS.
CLASS zini_cl_params IMPLEMENTATION.
METHOD set_param.
FIELD-SYMBOLS: <fft> TYPE table, <ff> TYPE any.
CHECK p_name IS NOT INITIAL.
TRY.
DATA(l_tipo) = t_tab[ name = to_upper( p_name ) ]-kind.
DATA(l_new) = t_tab[ name = to_upper( p_name ) ]-objeto.
CASE l_tipo.
WHEN 'S'. ASSIGN l_new->* TO <fft>. <fft> = p_valor_s.
WHEN 'P'. ASSIGN l_new->* TO <ff>. <ff> = p_valor_p.
ENDCASE.
CATCH cx_root.
CLEAR sy-subrc.
ENDTRY.
ENDMETHOD.
METHOD get_param.
FIELD-SYMBOLS: <fft> TYPE table, <ff> TYPE any.
CHECK p_name IS NOT INITIAL.
TRY.
DATA(l_tipo) = t_tab[ name = to_upper( p_name ) ]-kind.
DATA(l_new) = t_tab[ name = to_upper( p_name ) ]-objeto.
CASE l_tipo.
WHEN 'S'. ASSIGN l_new->* TO <fft>. p_valor_s = <fft>.
WHEN 'P'. ASSIGN l_new->* TO <ff>. p_valor_p = <ff>.
ENDCASE.
CATCH cx_root.
CLEAR sy-subrc.
ENDTRY.
ENDMETHOD.
METHOD constructor.
l_report = p_report.
load_params( ).
ENDMETHOD.
METHOD load_params.
PERFORM load_sscr IN PROGRAM rsdbrunt TABLES t_selctab
USING l_REPORT
CHANGING sy-subrc.
LOOP AT t_selctab INTO DATA(l_f) WHERE kind CA 'SP'.
MOVE-CORRESPONDING l_f TO l_tab.
l_tab-length = l_tab-length DIV 2.
CASE l_tab-kind.
WHEN 'P'.
CREATE DATA l_tab-objeto TYPE (l_f-type) LENGTH l_tab-length.
WHEN 'S'.
DATA:
gr_structdescr TYPE REF TO cl_abap_structdescr,
gr_tabledescr TYPE REF TO cl_abap_tabledescr,
gr_datadescr TYPE REF TO cl_abap_datadescr,
* gr_typedescr TYPE REF TO cl_abap_typedescr,
gt_components TYPE abap_component_tab,
gw_component TYPE LINE OF abap_component_tab,
gr_wa TYPE REF TO data,
gr_tab TYPE REF TO data.
FIELD-SYMBOLS: <fs_wa> TYPE any.
FIELD-SYMBOLS: <fs_tab> TYPE table.
MOVE 'SIGN' TO gw_component-name.
REFRESH gt_components.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 1 ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'OPTION' TO gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 2 ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'LOW' TO gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = l_tab-length ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'HIGH' TO gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = l_tab-length ).
INSERT gw_component INTO TABLE gt_components.
* get structure descriptor -> GR_STRUCTDESCR
gr_structdescr ?= cl_abap_structdescr=>create( gt_components ).
* create work area of structure GR_STRUCTDESCR -> GR_WA
CREATE DATA gr_wa TYPE HANDLE gr_structdescr.
ASSIGN gr_wa->* TO <fs_wa>.
gr_datadescr ?= gr_structdescr.
gr_tabledescr ?= cl_abap_tabledescr=>create( gr_datadescr ).
* Create dynmaic internal table
CREATE DATA l_tab-objeto TYPE HANDLE gr_tabledescr.
ENDCASE.
APPEND l_tab TO t_tab.
AT LAST.
*--[ Cargamos los registros
FIELD-SYMBOLS: <f_so> TYPE ANY TABLE,
<f_pa> TYPE any.
LOOP AT t_tab INTO l_tab.
CASE l_tab-kind .
WHEN 'S'.
DATA(l_name) = |{ l_tab-name }[]|.
ASSIGN (l_name) TO <f_so>.
set_param( EXPORTING p_name = CONV #( l_tab-name ) p_valor_s = <f_so>[] ).
WHEN 'P'.
ASSIGN (l_tab-name) TO <f_pa>.
set_param( EXPORTING p_name = CONV #( l_tab-name ) p_valor_p = <f_pa> ).
ENDCASE.
ENDLOOP.
ENDAT.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
END-OF-SELECTION.
**--[ Ejemplo de USO
* DATA(l_param) = NEW zini_cl_params( CONV #( sy-repid ) ).
* DATA: ff TYPE RANGE OF sy-datum.
* DATA: p_norel(10).
* l_param->get_param( EXPORTING p_name = 'P_01' IMPORTING p_valor_p = p_norel ).
* l_param->get_param( EXPORTING p_name = 'S_fecha' IMPORTING p_valor_s = ff ).
* BREAK-POINT.