ABAPZINIPARAMS

  1. REPORT zini_prg_parametros.
  2. TABLES: e070.
  3.  
  4. SELECT-OPTIONS: s_orden FOR e070-trkorr,
  5.                 s_fecha FOR sy-datum.
  6.  
  7. PARAMETERS: p_01(10) DEFAULT 'Opcion 1',
  8.             p_02(10) DEFAULT 'Opcion 2'.
  9.  
  10. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  11. *--[ Clase que importa los parámetros de entrada
  12. CLASS zini_cl_params DEFINITION.
  13.  
  14.   PUBLIC SECTION.
  15.  
  16.     TYPES: BEGIN OF ty_params,
  17.              name(8),
  18.              kind    TYPE rsscr_kind, "S / P
  19.              length  TYPE i, "<--- hay que / 2
  20.              dtyp(4),
  21.              objeto  TYPE REF TO data,
  22.            END OF ty_params.
  23.  
  24.     DATA: t_tab     TYPE STANDARD TABLE OF ty_params.
  25.  
  26.     METHODS:
  27.       constructor IMPORTING p_report TYPE string,
  28.       load_params,
  29.       get_param IMPORTING p_name    TYPE string
  30.                 EXPORTING p_valor_s TYPE ANY TABLE
  31.                           p_valor_p TYPE any,
  32.       set_param IMPORTING p_name    TYPE string
  33.                           p_valor_s TYPE ANY TABLE OPTIONAL
  34.                           p_valor_p TYPE any OPTIONAL.
  35.  
  36.   PRIVATE SECTION.
  37.  
  38.     DATA: l_REPORT  TYPE  rsvar-report,
  39.           t_selctab TYPE STANDARD TABLE OF rsscr,
  40.  
  41.           l_tab     LIKE LINE OF t_tab.
  42.  
  43. ENDCLASS.
  44.  
  45. CLASS zini_cl_params IMPLEMENTATION.
  46.  
  47.   METHOD set_param.
  48.     FIELD-SYMBOLS: <fft> TYPE table, <ff>  TYPE any.
  49.     CHECK p_name IS NOT INITIAL.
  50.     TRY.
  51.         DATA(l_tipo) = t_tab[ name = to_upper( p_name ) ]-kind.
  52.         DATA(l_new) = t_tab[ name = to_upper( p_name ) ]-objeto.
  53.         CASE l_tipo.
  54.           WHEN 'S'. ASSIGN l_new->* TO <fft>. <fft> = p_valor_s.
  55.           WHEN 'P'. ASSIGN l_new->* TO <ff>.  <ff> = p_valor_p.
  56.         ENDCASE.
  57.       CATCH cx_root.
  58.         CLEAR sy-subrc.
  59.     ENDTRY.
  60.  
  61.   ENDMETHOD.
  62.  
  63.   METHOD get_param.
  64.  
  65.     FIELD-SYMBOLS: <fft> TYPE table, <ff>  TYPE any.
  66.  
  67.     CHECK p_name IS NOT INITIAL.
  68.     TRY.
  69.         DATA(l_tipo) = t_tab[ name = to_upper( p_name ) ]-kind.
  70.         DATA(l_new)  = t_tab[ name = to_upper( p_name ) ]-objeto.
  71.         CASE l_tipo.
  72.           WHEN 'S'. ASSIGN l_new->* TO <fft>. p_valor_s = <fft>.
  73.           WHEN 'P'. ASSIGN l_new->* TO <ff>.  p_valor_p = <ff>.
  74.         ENDCASE.
  75.       CATCH cx_root.
  76.         CLEAR sy-subrc.
  77.     ENDTRY.
  78.   ENDMETHOD.
  79.  
  80.   METHOD constructor.
  81.     l_report = p_report.
  82.     load_params( ).
  83.   ENDMETHOD.
  84.  
  85.   METHOD load_params.
  86.  
  87.     PERFORM load_sscr IN PROGRAM rsdbrunt TABLES      t_selctab
  88.                                 USING       l_REPORT
  89.                                 CHANGING   sy-subrc.
  90.  
  91.     LOOP AT t_selctab INTO DATA(l_f) WHERE kind CA 'SP'.
  92.       MOVE-CORRESPONDING l_f TO l_tab.
  93.       l_tab-length = l_tab-length  DIV 2.
  94.  
  95.       CASE l_tab-kind.
  96.         WHEN 'P'.
  97.           CREATE DATA l_tab-objeto TYPE (l_f-type) LENGTH l_tab-length.
  98.         WHEN 'S'.
  99.  
  100.           DATA:
  101.             gr_structdescr TYPE REF TO cl_abap_structdescr,
  102.             gr_tabledescr  TYPE REF TO cl_abap_tabledescr,
  103.             gr_datadescr   TYPE REF TO cl_abap_datadescr,
  104. *            gr_typedescr   TYPE REF TO cl_abap_typedescr,
  105.             gt_components  TYPE abap_component_tab,
  106.             gw_component   TYPE LINE OF abap_component_tab,
  107.             gr_wa          TYPE REF TO data,
  108.             gr_tab         TYPE REF TO data.
  109.  
  110.           FIELD-SYMBOLS: <fs_wa> TYPE any.
  111.           FIELD-SYMBOLS: <fs_tab> TYPE table.
  112.  
  113.           MOVE 'SIGN' TO gw_component-name.
  114.  
  115.           REFRESH gt_components.
  116.           gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 1 ).
  117.           INSERT gw_component INTO TABLE gt_components.
  118.  
  119.           MOVE 'OPTION' TO gw_component-name.
  120.           gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 2 ).
  121.           INSERT gw_component INTO TABLE gt_components.
  122.  
  123.           MOVE 'LOW' TO gw_component-name.
  124.           gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = l_tab-length ).
  125.           INSERT gw_component INTO TABLE gt_components.
  126.  
  127.           MOVE 'HIGH' TO gw_component-name.
  128.           gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = l_tab-length ).
  129.           INSERT gw_component INTO TABLE gt_components.
  130.  
  131. * get structure descriptor -> GR_STRUCTDESCR
  132.           gr_structdescr ?= cl_abap_structdescr=>create( gt_components ).
  133.  
  134. * create work area of structure GR_STRUCTDESCR -> GR_WA
  135.           CREATE DATA gr_wa TYPE HANDLE gr_structdescr.
  136.           ASSIGN gr_wa->* TO <fs_wa>.
  137.  
  138.           gr_datadescr  ?= gr_structdescr.
  139.           gr_tabledescr ?= cl_abap_tabledescr=>create( gr_datadescr ).
  140.  
  141. * Create dynmaic internal table
  142.           CREATE DATA l_tab-objeto TYPE HANDLE gr_tabledescr.
  143.  
  144.       ENDCASE.
  145.  
  146.       APPEND l_tab TO t_tab.
  147.       AT LAST.
  148. *--[ Cargamos los registros
  149.         FIELD-SYMBOLS: <f_so> TYPE ANY TABLE,
  150.                        <f_pa> TYPE any.
  151.         LOOP AT t_tab INTO l_tab.
  152.           CASE l_tab-kind .
  153.             WHEN 'S'.
  154.               DATA(l_name) = |{ l_tab-name }[]|.
  155.               ASSIGN (l_name) TO <f_so>.
  156.               set_param( EXPORTING p_name = CONV #( l_tab-name ) p_valor_s = <f_so>[] ).
  157.             WHEN 'P'.
  158.               ASSIGN (l_tab-name) TO <f_pa>.
  159.               set_param( EXPORTING p_name = CONV #( l_tab-name ) p_valor_p = <f_pa> ).
  160.           ENDCASE.
  161.         ENDLOOP.
  162.       ENDAT.
  163.     ENDLOOP.
  164.   ENDMETHOD.
  165.  
  166. ENDCLASS.
  167.  
  168. END-OF-SELECTION.
  169.  
  170. **--[ Ejemplo de USO
  171. *    DATA(l_param) = NEW zini_cl_params( CONV #( sy-repid ) ).
  172. *  DATA: ff TYPE RANGE OF sy-datum.
  173. *  DATA: p_norel(10).
  174. *  l_param->get_param( EXPORTING p_name = 'P_01' IMPORTING p_valor_p = p_norel ).
  175. *  l_param->get_param( EXPORTING p_name = 'S_fecha' IMPORTING p_valor_s = ff ).
  176. *  BREAK-POINT.