quarta-feira, 7 de janeiro de 2015

Criando variante para parâmetros de tela para telas dialog

Em um report para gravar e importar variantes gravados o standard faz isso automaticamente, no caso de tela em dialog isso deve ser feito manualmente. Abaixo um exemplo.

No STATUS-GUI da tela onde vai ser gravado a variante habilitar o comando salvar.

Codificar no user-command da tela as funções do botão


Abaixo o código F_SAVE_VARIANT

Como tinha muitos parâmetros em tela eu utilizei a função DYNPRO_FIELD_GET  dentro do perform F_DYNPRO_FIELD_GET e fiz um filtro eliminando os campos de tela que não são variáveis, no meu caso eu tenho uma tela com 2 subtelas diferentes então eu pego os campos conforme a tela q estou trabalhando.



*&---------------------------------------------------------------------*
*&      Form  F_SAVE_VARIANT
*&---------------------------------------------------------------------*
FORM f_save_variant .

  DATAlt_sval  TYPE TABLE OF sval,
        lt_rspar TYPE TABLE OF rsparams,
        lt_varit TYPE TABLE OF varit,
        lt_dyn   TYPE TABLE OF rsdcf,
        lt_field TYPE TABLE OF fieldname,
        lt_range TYPE TABLE OF rsvarrange.

  DATAlw_sval  TYPE sval,
        lw_rspar TYPE rsparams,
        lw_varit TYPE varit,
        lw_varid TYPE varid,
        lw_dyn   TYPE rsdcf,
        lw_range TYPE rsvarrange.

  DATAl_retcode  TYPE char1,
        l_tab      TYPE tabname,
        l_subrc    TYPE sy-subrc,
        l_offset   TYPE i,
        l_function TYPE char50.

  FIELD-SYMBOLS<lfs_par>     TYPE any,
                 <lfst_selopt> TYPE ANY TABLE,
                 <lfsw_selopt> TYPE ANY.

  DEFINE lm_comp.

    ASSIGN COMPONENT &1 OF STRUCTURE <lfsw_selopt> TO <lfs_par>.
    IF sy-subrc 0.
      &2 <lfs_par>.
    ENDIF.

  END-OF-DEFINITION.

  CLEAR lw_sval.
  lw_sval-tabname   'RSVAR'.
  lw_sval-fieldname 'VARIANT'.
  lw_sval-field_obl 'X'.
  APPEND lw_sval TO lt_sval.

  CLEAR lw_sval.
  lw_sval-tabname   'VARIT'.
  lw_sval-fieldname 'VTEXT'.
  lw_sval-field_obl 'X'.
  APPEND lw_sval TO lt_sval.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      no_value_check  'X'
      popup_title     text-006
    IMPORTING
      returncode      l_retcode
    TABLES
      fields          lt_sval
    EXCEPTIONS
      error_in_fields 1
      OTHERS          2.

  CHECK sy-subrc AND l_retcode <> 'A'.

* Tabellen initialisieren
  CLEARlt_varit[]lt_rspar[].
  CLEAR lw_varit.
*fill VARID structure - variant description
  LOOP AT lt_sval INTO lw_sval.

    CASE lw_sval-fieldname.
      WHEN 'VARIANT'.
        lw_varid-variant lw_sval-value.
      WHEN 'VTEXT'.
        lw_varit-vtext   lw_sval-value.
    ENDCASE.

  ENDLOOP.

  lw_varid-report  sy-repid.
  lw_varid-environmnt   'A'.

  lw_varit-mandt   sy-mandt.
  lw_varit-langu   sy-langu.
  lw_varit-report  sy-repid.
  lw_varit-variant lw_varid-variant.
  APPEND lw_varit TO lt_varit.

  CLEAR lt_dyn[].
  PERFORM f_dynpro_field_get TABLES lt_dyn
                             USING '1000'.
  IF r_novo 'X'.
    PERFORM f_dynpro_field_get TABLES lt_dyn
                               USING '9001'.
  ELSE.
    PERFORM f_dynpro_field_get TABLES lt_dyn
                                USING '1002'.
  ENDIF.

  LOOP AT lt_dyn INTO lw_dyn.

    CASE lw_dyn-dynpro_fld(2).
      WHEN 'P_' OR 'R_'.
        ASSIGN (lw_dyn-dynpro_fldTO <lfs_par>.
        CHECK sy-subrc 0.

        CLEAR lw_rspar.
        lw_rspar-selname lw_dyn-dynpro_fld.
        lw_rspar-kind  'P'.
        lw_rspar-sign  'I'.
        lw_rspar-option  'EQ'.
        lw_rspar-low  <lfs_par>.
        lw_rspar-high  space.
        APPEND lw_rspar TO lt_rspar.

      WHEN 'S_'.

        l_tab lw_dyn-dynpro_fld.
        FIND '-' IN l_tab MATCH OFFSET l_offset.
        CHECK l_offset <> 0.
        CONCATENATE l_tab+0(l_offset'[]' INTO l_tab.
        ASSIGN (l_tabTO <lfst_selopt>.
        CHECK sy-subrc 0.

        LOOP AT <lfst_selopt> ASSIGNING <lfsw_selopt>.

          CLEAR lw_rspar.
          lw_rspar-selname l_tab.
          lw_rspar-kind    'S'.
          lm_comp 'SIGN'   lw_rspar-sign.
          lm_comp 'OPTION' lw_rspar-option.
          lm_comp 'LOW'    lw_rspar-low.
          lm_comp 'HIGH'   lw_rspar-high.
          APPEND lw_rspar TO lt_rspar.

        ENDLOOP.

    ENDCASE.

  ENDLOOP.

*Check variant
  CALL FUNCTION 'RS_VARIANT_EXISTS'
    EXPORTING
      report              lw_varid-report
      variant             lw_varid-variant
    IMPORTING
      r_c                 l_subrc
    EXCEPTIONS
      not_authorized      01
      no_report           02
      report_not_existent 03
      report_not_supplied 04.

  IF sy-subrc <> 0.
    MESSAGE e001(vlWITH text-e22 DISPLAY LIKE 'S'.
  ENDIF.

  IF l_subrc 0.                    " Variante existiert

    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar              text-007
        text_question         text-008
        display_cancel_button space
      IMPORTING
        answer                l_retcode
      EXCEPTIONS
        text_not_found        1
        OTHERS                2.

    CHECK sy-subrc AND l_retcode '1'.

    l_function 'RS_CHANGE_CREATED_VARIANT'.
  ELSE.
    l_function 'RS_CREATE_VARIANT'.
  ENDIF.

  CALL FUNCTION l_function
    EXPORTING
      curr_report               lw_varid-report
      curr_variant              lw_varid-variant
      vari_desc                 lw_varid
    TABLES
      vari_contents             lt_rspar
      vari_text                 lt_varit
    EXCEPTIONS
      illegal_report_or_variant 01
      illegal_variantname       02
      not_authorized            03
      not_executed              04
      report_not_existent       05
      report_not_supplied       06
      variant_doesnt_exist      07
      variant_locked            08
      selections_no_match       09.

  l_subrc sy-subrc.

ENDFORM.                    " F_SAVE_VARIANT



*&---------------------------------------------------------------------*
*&      Form  F_DYNPRO_FIELD_GET
*&---------------------------------------------------------------------*
FORM f_dynpro_field_get TABLES ft_dyn STRUCTURE rsdcf
                        USING f_dynnr TYPE sy-dynnr.

  DATAlt_tline   TYPE TABLE OF tline,
        lt_dyn_aux TYPE TABLE OF rsdcf.

  DATAlw_tstc TYPE tstc.

  lw_tstc-dypno f_dynnr.
  lw_tstc-pgmna sy-repid.

  CALL FUNCTION 'DYNPRO_FIELD_GET'
    EXPORTING
      dynpro           lw_tstc-dypno
      program          lw_tstc-pgmna
    TABLES
      dynp_fields      lt_dyn_aux
      lines            lt_tline
    EXCEPTIONS
      dynpro_not_found 1
      OTHERS           2.

  DELETE lt_dyn_aux
   WHERE flg11         EQ '00'
      OR dynpro_fld    EQ space
      OR dynpro_fld(1EQ '%'
      OR dynpro_fld    CS '-HIGH'.

  APPEND LINES OF lt_dyn_aux TO ft_dyn.

ENDFORM.                    " F_DYNPRO_FIELD_GET



=======================================================

Abaixo o código para o botão de exibição de variante.

*&---------------------------------------------------------------------*
*&      Form  F_VARIANT_DISPLAY
*&---------------------------------------------------------------------*
FORM f_variant_display .

  DATAl_variant TYPE rsvar-variant.

  PERFORM f_choose_variant CHANGING l_variant.

  IF l_variant NE space.

    CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
      EXPORTING
        report               sy-repid
        variant              l_variant
      EXCEPTIONS
        variant_not_existent 1
        variant_obsolete     2
        OTHERS               3.
  ENDIF.

ENDFORM.                    " F_VARIANT_DISPLAY

*&---------------------------------------------------------------------*
*&      Form  F_CHOOSE_VARIANT
*&---------------------------------------------------------------------*
FORM f_choose_variant  CHANGING f_variant TYPE rsvar-variant.

  DATAl_vtext TYPE rsvar-vtext.

  CALL FUNCTION 'RS_VARIANT_CATALOG'
    EXPORTING
      report               sy-repid
      masked               'X'
    IMPORTING
      sel_variant          f_variant
      sel_variant_text     l_vtext
    EXCEPTIONS
      no_report            1
      report_not_existent  2
      report_not_supplied  3
      no_variants          4
      no_variant_selected  5
      variant_not_existent 6
      OTHERS               7.

ENDFORM.                    " F_CHOOSE_VARIANT