Now we're ready to build the data for screen output, call the update screen and then move the data back from screen to reference data. We will use here:
  • COC1_FEATURE_CHECK to get characteristic ID
  • CTMS_DDB_INIT to initialize memory 
  • CTMS_CLASS_DDB to put in memory classification settings
  • CTMS_DDB_SET_VAL_FROM_OBJECT to set values in update screen from existing object (option)
  • CTMS_DDB_SET_VALUE_INTERNAL to set values in update screen in case of using reference data structure
  • CTMS_DDB_SET_VALUE_ONLINE to call the update screen
  • CTMS_DDB_HAS_VALUES_INTERNAL to check and get the values from the update screen after user action
  • zcl_abapblog_com_classific=>create_structure_for_class to create reference data structure
  • zcl_abapblog_com_classific=>move_screen_val_to_ref_data to move screen values to reference data
  • zcl_abapblog_com_classific=>clear_initial_line_api_vari to delete initial line for multiple values characteristics
  • zcl_abapblog_com_classific=>move_ref_data_to_screen_val to move reference data to update screen values table
Ok, so let's starts with parameters:
Importing:

value( I_SET_VAL_FROM_OBJECT ) TYPE FLAG -> If set to 'X' then we get values from the classification object directly, if empty then from ref data
value( I_OBJECT ) TYPE AUSP-OBJEK -> Key of object to be classified
value( I_TABLE ) TYPE TCLA-OBTAB -> Name of database table for object
value( I_DATE ) TYPE SY-DATUM  DEFAULT SY-DATUM -> date for characteristics value
I_STRUCTURE TYPE REF TO CL_ABAP_STRUCTDESCR OPTIONAL -> structure of classification for reference data

Exporting:

ET_VALUES TYPE TT_API_VALI -> table with update screen values in it's internal format

Changing:

C_DATA TYPE REF TO DATA OPTIONAL -> Classification details with reference data

Exceptions:

CHARACTERISTIC_UNKNOWN  
ERROR_SETTING_CHAR_VALUES  
NO_VALUES_FOUND  
ERROR_CREATING_TABLE

Implementation:

  method show_charact_values_screen.

    datam_ucomm like sy-ucomm.
    datams_api_char type api_char.
    datamt_api_char like standard table of ms_api_char.
    datam_atinn type api_value-atinn.
    datamt_error_val type standard table of api_vali.
    datamt_vali type standard table of api_vali.
    datamt_vali2 type standard table of api_vali.
    datams_data type ref to data.
    datamo_structure type ref to cl_abap_structdescr.
    datamo_table     type ref to cl_abap_tabledescr.

    refresh et_values[].

    "get characteristic ID
    call function 'COC1_FEATURE_CHECK'
      exporting
*       feature_id                  = atinn
        feature_neutral_name        i_atnam
      
importing
        feature_id                  m_atinn
*       feature_neutral_name        = atnam
*       conversion_exit             = l_atkon
*       number_of_positions         = l_anzst
*       set_get_parameter           = l_atpid
      exceptions
        invalid_class_type          1
        missing_feature_information 2
        no_feature_found            3
        no_feature_valid            4
        no_language                 5
        others                      6.

    if sy-subrc <> 0.
*   Error
      raise characteristic_unknown.
    endif.

    ms_api_char-atinn m_atinn.
    append ms_api_char to mt_api_char.

    call function 'CTMS_DDB_INIT'.


    call function 'CTMS_CLASS_DDB'
      exporting
        class             i_class
        classtype         
i_klart
        
mode              'S'
*       LANGUAGE          = SY-LANGU
        key_date          i_date
        objectid          
i_table
        object            
i_object
*       I_ADD_ON_CHAR     = ' '
*       I_TABS_ACTIVE     = ' '
*       INIT_CONF         = ' '
*       READONLY          = ' '
*       I_CALLED_FROM_DDB = ' '
      exceptions
        not_found         1
        others            2.
    if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    endif.

    if i_set_val_from_object is not initial and
       i_object is not initial              and
       i_table  is not initial.
      call function 'CTMS_DDB_SET_VAL_FROM_OBJECT'
        exporting
          object                             i_object
          objectid                           
i_table
          
date                               i_date
*   TABLES
*     OBJECTS                            = OBJECTS
       exceptions
         not_found                          1
         no_objectid                        2
         no_object                          3
         fb_ctms_class_ddb_not_called       4
         others                             5
                .
      if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.

    elseif it_values[] is supplied.
      zcl_abapblog_com_classific=>clear_initial_line_api_variit_api_char mt_api_char   ).

      call function 'CTMS_DDB_SET_VALUE_INTERNAL'
        tables
          imp_values                    it_values[]
          exp_values_error              
mt_error_val[]
        
exceptions
          currency_check                1
          date_check                    2
          format_check                  3
          illegal_internal_baseunit     4
          interval_check                5
          pattern_check                 6
          time_check                    7
          unit_check                    8
          value_not_found               9
          no_valid_dimension            10
          interval_not_allowed          11
          display_mode                  12
          characteristic_not_found      13
          value_not_possible            14
          characteristic_enqueue        15
          objectcharacteristic          16
          only_one_value_allowed        17
          characteristic_not_selectable 18
          input_to_long                 19
          value_contradiction           20
          others                        21.
      if sy-subrc <> 0.
        raise error_setting_char_values.
      endif.
    elseif c_data is not initial.


      zcl_abapblog_com_classific=>move_ref_data_to_screen_val(
        exporting
          i_atnam                      i_atnam
          i_data                       
c_data
        
changing
          ct_values                    mt_vali
        
exceptions
          no_structure_or_table_passed 1
          error_creating_structure     2
          no_data_to_change            3
          structure_error              4
          others                       5
             ).
      if sy-subrc eq 0.
        zcl_abapblog_com_classific=>clear_initial_line_api_variit_api_char mt_api_char   ).

        call function 'CTMS_DDB_SET_VALUE_INTERNAL'
          tables
            imp_values                    mt_vali[]
            exp_values_error              
mt_error_val[]
          
exceptions
            currency_check                1
            date_check                    2
            format_check                  3
            illegal_internal_baseunit     4
            interval_check                5
            pattern_check                 6
            time_check                    7
            unit_check                    8
            value_not_found               9
            no_valid_dimension            10
            interval_not_allowed          11
            display_mode                  12
            characteristic_not_found      13
            value_not_possible            14
            characteristic_enqueue        15
            objectcharacteristic          16
            only_one_value_allowed        17
            characteristic_not_selectable 18
            input_to_long                 19
            value_contradiction           20
            others                        21.
        if sy-subrc <> 0.
          raise error_setting_char_values.
        endif.

      endif.
    endif.

    call function 'CTMS_DDB_SET_VALUE_ONLINE'
      exporting
        characteristic       m_atinn
        display              
i_display
*       udef_instance        = '999'
      importing
        return_with_function m_ucomm.


    call function 'CTMS_DDB_HAS_VALUES_INTERNAL'
      exporting
        assigned_values      'X'
        allowed_values       ' '
        valid_values         ' '
        inconsistent_values  ' '
        first_assigned_value ' '
        default_values       ' '
        language             sy-langu
        document_info        
' '
        excl_knowledge       ' '
        i_called_from_ddb    ' '
      tables
        imp_characteristics  mt_api_char[]
        exp_values           
et_values[]
      
exceptions
        not_found            1
        others               2.

    if sy-subrc <> 0.
      raise no_values_found.
    endif.
*  endif.


    if c_data is requested.

      if c_data is initial.
        if i_structure is bound.
          mo_structure i_structure.
        else.
          zcl_abapblog_com_classific=>create_structure_for_class(
            exporting
              i_class                     i_class
              i_classtype                 
i_klart
              i_key_date                  
i_date
            
importing
              e_structure                 mo_structure
*          et_data                     = es_classif_details-data
*          e_table                     = mo_table
            exceptions
              class_classtype_fetch_error 1
              error_creating_table        2
              characteristics_error       3
              others                      4
                 ).
          if sy-subrc eq 0.
          endif.

        endif.

        try.
            create data c_data type handle mo_structure.
          catch cx_sy_create_data_error.
            raise error_creating_table.
        endtry.
      endif.

      zcl_abapblog_com_classific=>move_screen_val_to_ref_data(
      exporting
        it_values                    et_values[]
        i_atnam                      
i_atnam
      
changing
        c_data                       c_data
      
exceptions
        no_structure_or_table_passed 1
        error_creating_structure     2
        no_data_to_change            3
        structure_error              4
        others                       5
        ).
      if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.



    endif.
  endmethod.                    "show_charact_values_screen