Skip to Content

This post is part of the series, Web Dynpro Selection Screen Variants.

Part 2: Assistance Class

Create new ABAP class ZCL_WD_SELECT_OPTIONS_VARIANTS with the following attributes and inheritance.

Attributes

Create public attribute constant E_KIND with the following values to identify selection types.

constants:
  BEGIN OF e_kind,
      select_options TYPE rsscr_kind VALUE 'S',
      parameter      TYPE rsscr_kind VALUE 'P',
    END OF e_kind.

Methods

Create four public methods.

GET_VARIANT_INFO

METHOD get_variant_info.

  SELECT SINGLE *
         FROM zwdvari
         INTO CORRESPONDING FIELDS OF info
         WHERE component   = component
         AND   application = application
         AND   variant     = variant.

ENDMETHOD.

VARIANT_DELETE

method VARIANT_DELETE.

  DATA lv_subrc TYPE sysubrc.

  DELETE FROM zwdvari
         WHERE component   = component
         AND   application = application
         AND   variant     = variant.
  ADD sy-subrc TO lv_subrc.

  SELECT COUNT(*)
         FROM zwdvaricon
         WHERE component   = component
         AND   application = application
         AND   variant     = variant.

  IF sy-dbcnt IS NOT INITIAL.
    DELETE FROM zwdvaricon
           WHERE component   = component
           AND   application = application
           AND   variant     = variant.
    ADD sy-subrc TO lv_subrc.
  ENDIF.

  CASE lv_subrc.
    WHEN 0.
      COMMIT WORK.
      return-subrc = lv_subrc.
      return-msgid = 'DB'.
      return-msgty = 'S'.
      return-msgno = 618. " Variant & deleted
      return-msgv1 = variant.

    WHEN OTHERS.
      ROLLBACK WORK.
      return-subrc = lv_subrc.
      return-msgid = 'DB'.
      return-msgty = 'E'.
      return-msgno = 257. " Variant & was not deleted
      return-msgv1 = variant.

  ENDCASE. " lv_subrc

endmethod.

VARIANT_GET

method VARIANT_GET.

  DATA lt_zwdvaricon TYPE SORTED TABLE OF zwdvaricon WITH UNIQUE DEFAULT KEY.
  DATA lo_selopt TYPE REF TO cl_wdr_select_options.
  DATA lt_selection_fields TYPE if_wd_select_options=>tt_selection_screen_item.
  DATA lt_parameter_fields TYPE if_wd_select_options=>tt_selection_screen_item.

  DATA lo_ranges TYPE REF TO data.
  DATA lo_range TYPE REF TO data.
  DATA lo_data TYPE REF TO data.
  DATA lo_value TYPE REF TO data.
  DATA lo_tabledescr TYPE REF TO cl_abap_tabledescr.
  DATA lo_datadescr TYPE REF TO cl_abap_datadescr.

  FIELD-SYMBOLS <selopt> TYPE REF TO if_wd_select_options.
  FIELD-SYMBOLS <field> TYPE if_wd_select_options=>t_selection_screen_item.
  FIELD-SYMBOLS <zwdvaricon> TYPE zwdvaricon.

  FIELD-SYMBOLS <range_table> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <range> TYPE any.
  FIELD-SYMBOLS <value> TYPE any.
  FIELD-SYMBOLS <sign> TYPE any.
  FIELD-SYMBOLS <option> TYPE any.
  FIELD-SYMBOLS <low> TYPE any.
  FIELD-SYMBOLS <high> TYPE any.

* -- Read variant contents

  SELECT *
         FROM zwdvaricon
         INTO TABLE lt_zwdvaricon
         WHERE component   = component
         AND   application = application
         AND   variant     = variant.

* -- Write saved variant data to the select-options references

  LOOP AT select_options_ref ASSIGNING <selopt>.

    lo_selopt ?= <selopt>.
    lo_selopt->if_wd_select_options~reset_all_selection_fields( ).
    lo_selopt->if_wd_select_options~reset_all_parameter_fields( ).

    lo_selopt->if_wd_select_options~get_selection_fields( IMPORTING et_fields = lt_selection_fields ).

    LOOP AT lt_selection_fields ASSIGNING <field>.

      lo_ranges = lo_selopt->if_wd_select_options~get_range_table_of_sel_field( <field>-m_id ).
      lo_tabledescr ?= cl_abap_typedescr=>describe_by_data_ref( lo_ranges ).
      lo_datadescr = lo_tabledescr->get_table_line_type( ).
      CREATE DATA lo_range TYPE HANDLE lo_datadescr.

      ASSIGN lo_ranges->* TO <range_table>.
      ASSIGN lo_range->* TO <range>.

      LOOP AT lt_zwdvaricon ASSIGNING <zwdvaricon>
           WHERE field = <field>-m_id
           AND   kind = me->e_kind-select_options.

        ASSIGN COMPONENT 'SIGN' OF STRUCTURE <range> TO <sign>.
        ASSIGN COMPONENT 'OPTION' OF STRUCTURE <range> TO <option>.
        ASSIGN COMPONENT 'LOW' OF STRUCTURE <range> TO <low>.
        ASSIGN COMPONENT 'HIGH' OF STRUCTURE <range> TO <high>.

        <sign> = <zwdvaricon>-sign.
        <option> = <zwdvaricon>-opti.
        <low> = <zwdvaricon>-low.
        <high> = <zwdvaricon>-high.
        APPEND <range> TO <range_table>.
      ENDLOOP. " <zwdvaricon>

      lo_selopt->if_wd_select_options~set_range_table_of_sel_field(
        i_id           = <field>-m_id
        it_range_table = lo_ranges
      ).

    ENDLOOP. " <field>

    lo_selopt->if_wd_select_options~get_parameter_fields( IMPORTING et_fields = lt_parameter_fields ).

    LOOP AT lt_parameter_fields ASSIGNING <field>.

      READ TABLE lt_zwdvaricon ASSIGNING <zwdvaricon>
           WITH KEY field = <field>-m_id
                    kind = me->e_kind-parameter.

      CHECK sy-subrc IS INITIAL.

      lo_datadescr ?= cl_abap_typedescr=>describe_by_data( <zwdvaricon>-low ).
      CREATE DATA lo_value TYPE HANDLE lo_datadescr.
      ASSIGN lo_value->* TO <value>.
      <value> = <zwdvaricon>-low.

      lo_selopt->if_wd_select_options~set_value_of_parameter_field(
        i_id    = <field>-m_id
        i_value = lo_value
      ).

    ENDLOOP. " <field>

    CLEAR: lt_selection_fields,
           lt_parameter_fields.

  ENDLOOP. " <selopt>

endmethod.

VARIANT_SAVE

method VARIANT_SAVE.

  DATA ls_zwdvari TYPE zwdvari.
  DATA lv_srtf2 TYPE srtf2.
  DATA lt_selection_fields TYPE if_wd_select_options=>tt_selection_screen_item.
  DATA lt_parameter_fields TYPE if_wd_select_options=>tt_selection_screen_item.
  DATA lo_selopt TYPE REF TO cl_wdr_select_options.
  DATA ls_contents TYPE zwdvaricon.
  DATA lt_contents TYPE SORTED TABLE OF zwdvaricon WITH UNIQUE DEFAULT KEY.
  DATA lv_subrc TYPE sysubrc.

  FIELD-SYMBOLS <selopt> TYPE REF TO if_wd_select_options.
  FIELD-SYMBOLS <field> TYPE if_wd_select_options=>t_selection_screen_item.

  FIELD-SYMBOLS <range_table> TYPE ANY TABLE.
  FIELD-SYMBOLS <range> TYPE any.
  FIELD-SYMBOLS <parameter> TYPE any.
  FIELD-SYMBOLS <sign> TYPE any.
  FIELD-SYMBOLS <option> TYPE any.
  FIELD-SYMBOLS <low> TYPE any.
  FIELD-SYMBOLS <high> TYPE any.

* -- Variant header info

  ls_zwdvari = me->get_variant_info(
    component   = component
    application = application
    variant     = variant
  ).

  IF ls_zwdvari IS INITIAL. " create new variant
    ls_zwdvari-component = component.
    ls_zwdvari-application = application.
    ls_zwdvari-variant = variant.
    ls_zwdvari-vtext = short_text.
    ls_zwdvari-version = 1.
    ls_zwdvari-ernam = sy-uname.
    ls_zwdvari-erdat = sy-datum.

  ELSE. " change existing variant
    ls_zwdvari-vtext = short_text.
    ls_zwdvari-aenam = sy-uname.
    ls_zwdvari-aedat = sy-datum.
    ADD 1 TO ls_zwdvari-version.
  ENDIF.

* -- Collect select-options' items and their values

  LOOP AT select_options_ref ASSIGNING <selopt>.

    lo_selopt ?= <selopt>.
    lo_selopt->if_wd_select_options~get_selection_fields( IMPORTING et_fields = lt_selection_fields ).

    LOOP AT lt_selection_fields ASSIGNING <field>
         WHERE mt_range_table IS NOT INITIAL.

      AT NEW m_id.
        CLEAR lv_srtf2.
      ENDAT. " NEW m_id

      ASSIGN <field>-mt_range_table->* TO <range_table>.

      LOOP AT <range_table> ASSIGNING <range>.

        MOVE-CORRESPONDING ls_zwdvari TO ls_contents.
        ls_contents-field = <field>-m_id.
        ls_contents-kind = me->e_kind-select_options.
        ls_contents-srtf2 = lv_srtf2.

        ASSIGN COMPONENT 'SIGN' OF STRUCTURE <range> TO <sign>.
        ls_contents-sign = <sign>.

        ASSIGN COMPONENT 'OPTION' OF STRUCTURE <range> TO <option>.
        ls_contents-opti = <option>.

        ASSIGN COMPONENT 'LOW' OF STRUCTURE <range> TO <low>.
        ls_contents-low = condense( <low> ).

        ASSIGN COMPONENT 'HIGH' OF STRUCTURE <range> TO <high>.
        ls_contents-high = condense( <high> ).

        INSERT ls_contents INTO TABLE lt_contents.
        CLEAR: ls_contents.
        ADD 1 TO lv_srtf2.

      ENDLOOP. " <range>
    ENDLOOP. " <field>

    lo_selopt->if_wd_select_options~get_parameter_fields( IMPORTING et_fields = lt_parameter_fields ).

    LOOP AT lt_parameter_fields ASSIGNING <field>
         WHERE m_value IS NOT INITIAL.

      MOVE-CORRESPONDING ls_zwdvari TO ls_contents.
      ls_contents-field = <field>-m_id.
      ls_contents-kind = me->e_kind-parameter.

      ASSIGN <field>-m_value->* TO <parameter>.
      ls_contents-sign = 'I'.
      ls_contents-opti = 'EQ'.
      ls_contents-low = condense( <parameter> ).

      INSERT ls_contents INTO TABLE lt_contents.
      CLEAR: ls_contents.

    ENDLOOP. " <field>

    CLEAR: lt_selection_fields,
           lt_parameter_fields.

  ENDLOOP. " <selopt>

* -- Save to database

  IF ls_zwdvari-version > 1.
    DELETE FROM zwdvari
           WHERE component   = component
           AND   application = application
           AND   variant     = variant.
    ADD sy-subrc TO lv_subrc.

    SELECT COUNT(*)
           FROM zwdvaricon
           WHERE component   = component
           AND   application = application
           AND   variant     = variant.

    IF sy-dbcnt IS NOT INITIAL.
      DELETE FROM zwdvaricon
             WHERE component   = component
             AND   application = application
             AND   variant     = variant.
      ADD sy-subrc TO lv_subrc.
    ENDIF.
  ENDIF. " version

  INSERT zwdvari FROM ls_zwdvari.
  ADD sy-subrc TO lv_subrc.

  INSERT zwdvaricon FROM TABLE lt_contents.
  ADD sy-subrc TO lv_subrc.

  CASE lv_subrc.
    WHEN 0.
      COMMIT WORK.
      return-subrc = lv_subrc.
      return-msgid = 'DB'.
      return-msgty = 'S'.
      return-msgno = 617. " Variant & saved
      return-msgv1 = variant.

    WHEN OTHERS.
      ROLLBACK WORK.
      IF ls_zwdvari-version > 1.
        return-subrc = lv_subrc.
        return-msgid = 'DB'.
        return-msgty = 'E'.
        return-msgno = 255. " Variant & was not changed
        return-msgv1 = variant.
      ELSE.
        return-subrc = lv_subrc.
        return-msgid = 'DB'.
        return-msgty = 'E'.
        return-msgno = 254. " Variant & was not created
        return-msgv1 = variant.
      ENDIF. " version

  ENDCASE. " lv_subrc

endmethod.

Up Next

In Part 3, the series continues with creation of the Web Dynpro Component and its component controller.

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply