1 1 1 1 1 Rating 0% (0 Votes)
Today I'll start to show you how you can prepare some methods to be able to read classification data without carrying each time about the kind of characteristics. If you follow my suggestions then you'll be able to use this methods each time you deal with classifications. In this part I will show you how to prepare a method to create a structure and table for classification data. I know that some of you can say we can create such structure manually with data or types statement directly in each of our development, but one day you'll see that sometimes it's easier to prepare a function or method which will do it for you so you can keep the logic in each of your program without doing maual work.
 
To create the structure of the class I will use FM BAPI_CLASS_READ  to read class data, then I will use FM BAPI_CHARACT_GETDETAIL to read the characteristics and in each step I'll be using classes cl_abap_elemdescr, cl_abap_structdescr and cl_abap_tabledescr to create the structure I need.
 
Import:

i_classtype klah-class-> class number
i_classtypetype klah-klart ->class type
i_key_datetype sy-datum  default sy-datum-> key date for class

Export:

e_structuretype ref to cl_abap_structdescr-> structure for our class
et_datatype ref to data -> table created on a base of class structure
e_tabletype ref to cl_abap_tabledescr-> table type for our class

Exceptions:

class_classtype_fetch_error
error_creating_table
characteristics_error

Implementation of method:

method create_structure_for_class.
*This is the code from http://abapblog.com.
  field-symbols<char> type bapi1003_charact_r.
  datamt_classdescriptions type standard table of  bapi1003_catch_r.
  datamt_classlongtexts type standard table of  bapi1003_longtext_r.
  datamt_classcharacteristics type standard table of  bapi1003_charact_r.
  datamt_classcharactvalues type standard table of  bapi1003_char_val_r.
  datamt_return type standard table of bapiret2.
  datams_charact_detail type bapicharactdetail.
  datam_lenght type i.
  datam_decimals type i.
  datamt_comp type cl_abap_structdescr=>component_table.
  datamt_comp_final type cl_abap_structdescr=>component_table.
  datamo_str  type ref to cl_abap_structdescr.
  datamo_tab type ref to cl_abap_tabledescr.
  datamt_data type ref to data.
  datams_comp like line of mt_comp.
  datams_return type bapiret2.

"we read class data
  call function 'BAPI_CLASS_READ'
    exporting
      classtype            i_classtype
      classnum             
i_class
*     LANGUISO             = LANGUISO
*     LANGUINT             = SY-LANGU
      keydate              i_key_date
    
importing
*     CLASSBASICDATA       = CLASSBASICDATA
*     CLASSDOCUMENT        = CLASSDOCUMENT
*     CLASSADDITIONAL      = CLASSADDITIONAL
*     CLASSSTANDARD        = CLASSSTANDARD
      return               ms_return
    
tables
      classdescriptions    mt_classdescriptions
      classlongtexts       
mt_classlongtexts
      classcharacteristics 
mt_classcharacteristics
      classcharactvalues   
mt_classcharactvalues.

"if there is no error then we continue
  if ms_return-type cn 'AE'.
    "firstly I add key fields for structure like Object, class, class type,
    " object table
    ms_comp-name 'OBJECT_NUMBER'.
    ms_comp-type ?= cl_abap_elemdescr=>describe_by_namep_name 'OBJNUM' ).
    append ms_comp to mt_comp_final.
    ms_comp-name 'CLASS'.
    ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data i_class ).
    append ms_comp to mt_comp_final.
    ms_comp-name 'CLASSTYPE'.
    ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data i_classtype ).
    append ms_comp to mt_comp_final.
    ms_comp-name 'OBJECT_TABLE'.
    ms_comp-type ?= cl_abap_elemdescr=>describe_by_namep_name 'TABELLE' ).
    append ms_comp to mt_comp_final.

    "Then let's loop through characteristics
    loop at mt_classcharacteristics assigning <char>.
      clear ms_charact_detail.
      "check each characteristic details
      call function 'BAPI_CHARACT_GETDETAIL'
        exporting
          charactname         <char>-name_char
          keydate             
i_key_date
*         LANGUAGE            = LANGUAGE
        importing
          charactdetail       ms_charact_detail
        
tables
*         CHARACTDESCR        = CHARACTDESCR
*         CHARACTVALUESNUM    = CHARACTVALUESNUM
*         CHARACTVALUESCHAR   = CHARACTVALUESCHAR
*         CHARACTVALUESCURR   = CHARACTVALUESCURR
*         CHARACTVALUESDESCR  = CHARACTVALUESDESCR
*         CHARACTREFERENCES   = CHARACTREFERENCES
*         CHARACTRESTRICTIONS = CHARACTRESTRICTIONS
          return              mt_return.
      "check if we have error
      loop at mt_return into ms_return where type ca 'AE'.
        raise characteristics_error.
      endloop.
      refresh mt_comp[].
      clearms_comp.

      m_lenght ms_charact_detail-length.
      m_decimals ms_charact_detail-decimals.

      clearms_comp.
      ms_comp-name 'LOW'.
      "depanding on data type we create different type for LOW component
      case ms_charact_detail-data_type.
        when 'NUM'.
          ms_comp-type cl_abap_elemdescr=>get_p(
                                                   p_length   m_lenght
                                                   p_decimals 
m_decimals
                                                   
).
        when 'DATE'.
          ms_comp-type cl_abap_elemdescr=>get_d( ).
        when 'TIME'.
          ms_comp-type cl_abap_elemdescr=>get_t( ).
        when 'CHAR'.
          ms_comp-type cl_abap_elemdescr=>get_cp_length m_lenght ).
        when 'CURR'.
          ms_comp-type cl_abap_elemdescr=>get_p(
                                                p_length   m_lenght
                                                p_decimals 
m_decimals
                                                 
).
        when others.
          ms_comp-type cl_abap_elemdescr=>get_cp_length m_lenght ).
      endcase.
      append ms_comp to mt_comp.
      "HIGH component will have same type as LOW so I do not clear work area
      ms_comp-name 'HIGH'.
      append ms_comp to mt_comp.
      "now OPTION for LOW
      clearms_comp.
      ms_comp-name 'OPTLOW'.
      ms_comp-type cl_abap_elemdescr=>get_cp_length ).
      append ms_comp to mt_comp.
      "OPTION for HIGH
      clearms_comp.
      ms_comp-name 'OPTHIGH'.
      ms_comp-type cl_abap_elemdescr=>get_cp_length ).
      append ms_comp to mt_comp.
      "UNIT FROM
      clearms_comp.
      ms_comp-name 'UNIT_FROM'.
      ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data ms_charact_detail-unit_of_measurement  ).
      append ms_comp to mt_comp.
      "UNIT TO
      clearms_comp.
      ms_comp-name 'UNIT_TO'.
      ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data ms_charact_detail-unit_of_measurement  ).
      append ms_comp to mt_comp.
      "CURRENCY FROM
      clearms_comp.
      ms_comp-name 'CURRENCY_FROM'.
      ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data ms_charact_detail-currency  ).
      append ms_comp to mt_comp.
      "CURRENCY TO
      clearms_comp.
      ms_comp-name 'CURRENCY_TO'.
      ms_comp-type ?= cl_abap_elemdescr=>describe_by_datap_data ms_charact_detail-currency  ).
      append ms_comp to mt_comp.

      "We got all components so we can create structure of a characteristic
      mo_str =  cl_abap_structdescr=>createmt_comp ).
      "and we can create table for this characteristic
      mo_tab cl_abap_tabledescr=>createp_line_type  mo_str
                                           p_table_kind 
cl_abap_tabledescr=>tablekind_std
                                           p_unique     
abap_false ).

      "then we add the characteristic table as a component for our final structure
      clear ms_comp.
      ms_comp-name <char>-name_char.
      ms_comp-type ?= mo_tab.
      append ms_comp to mt_comp_final.
      free mo_tab.
      free mo_str.
    endloop.
    "we've got now key fields + separate deep field for each characteristic so we can
    "create our final structure and table
    if mt_comp_final[] is not initial.
      e_structure =  cl_abap_structdescr=>createmt_comp_final ).
      e_table      cl_abap_tabledescr=>create(  p_line_type  e_structure
                                                  p_table_kind 
cl_abap_tabledescr=>tablekind_std
                                                  p_unique     
abap_false ).
      try.
          create data et_data  type handle e_table.
        catch cx_sy_create_data_error.
          raise error_creating_table.
      endtry.

    endif.

  else.
    raise class_classtype_fetch_error.
  endif.

endmethod.

 
 
Enjoy!