Programmatische Anlage einer Klasse

I’d rather write code that writes code than write code

mir unbekannter Autor

Dieses Zitat passt sehr gut zu dem hier vorgestellten Code-Schnipsel. Mit diesem kleinen Programm zeige ich dir exemplarisch, wie man per Programm eine Klasse im Repository anlegen kann. Es wird die folgende Klasse angelegt:

CLASS zcl_test_007 DEFINITION
  PUBLIC
  CREATE PUBLIC.

  PUBLIC SECTION.

    INTERFACES zif_test .

    METHODS demo .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_test_007 IMPLEMENTATION.

  METHOD demo.
* demo implementation
  ENDMETHOD.

  METHOD zif_test~if_test.
* demo interface implementation
  ENDMETHOD.
ENDCLASS.

Anlegen einer Klasse

Aber nun zu dem spannenden Teil: Der Anlage der Klasse. Es werden alle notwendigen Bestandteile mitgegeben. Bei den meisten verwendeten Tabellen des Bausteins SEO_CLASS_CREATE_COMPLETE beziehen sich auf Datenbankviews, so dass man einfach bei vorhandenen Klassen nachsehen kann, welche Attribute welche Werte erhalten sollten. In der Regel kann man dies auch über die Festwerte der jeweiligen Domäne erfahren.

Code

REPORT.
TYPE-POOLS seoc.

PARAMETERS pa_num TYPE num03 DEFAULT 1.

START-OF-SELECTION.

  DATA t_attributes TYPE seoo_attributes_r.
  DATA t_methods TYPE seoo_methods_r.
  DATA t_method_sources TYPE seo_method_source_table.
  DATA t_interfaces TYPE seor_implementings_r.
  DATA s_class TYPE vseoclass.

  s_class = VALUE #(
    clsname = |ZCL_TEST_{ pa_num }|
    descript = |Test class number { pa_num }|
    langu    = sy-langu
    exposure = 2
    fixpt    = abap_true
    state    = 1 ). "implemented

  t_attributes = VALUE #(
    ( clsname    = s_class-clsname
      cmpname    = 'DEMO'
      descript   = 'Demo attribute'
      exposure   = 2 "public
      attdecltyp = 0 "instance
      state      = 1
      ) ).
  t_methods = VALUE #(
   ( clsname    = s_class-clsname
     cmpname    = 'DEMO'
     descript   = 'demo method'
     langu      = sy-langu
     exposure   = 2 "public
     mtddecltyp = 0 "instance
     state      = 1
     ) ).

  t_method_sources = VALUE #(
    ( cpdname = 'DEMO' source = VALUE #( ( `* demo implementation` ) ) )
    ( cpdname = 'ZIF_TEST~IF_TEST' source = VALUE #( ( `* demo interface implementation` ) ) ) ).

  t_interfaces = VALUE #(
   ( clsname    = s_class-clsname
     refclsname = 'ZIF_TEST'
     exposure   = 2 "public
     state      = 1
     reltype    = 1 ) ).

  "Create class
  CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'
    EXPORTING
      devclass        = '$TMP'
      overwrite       = space
      version         = seoc_version_active
      suppress_dialog = abap_true " Parameter missing in 702
      method_sources  = t_method_sources
    CHANGING
      implementings   = t_interfaces
      class           = s_class
      attributes      = t_attributes
      methods         = t_methods
    EXCEPTIONS
      existing        = 1
      is_interface    = 2
      db_error        = 3
      component_error = 4
      no_access       = 5
      other           = 6
      OTHERS          = 7.

  WRITE: / sy-subrc.

Enno Wulff