[ABAP] RTTI / RTTC / RTTS: Verwendung von Typdescriptoren

Datenelement

DATA(lv_i) = 1.
DATA(o_elem_desc) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_data( lv_i ) ).
cl_demo_output=>write_data( o_elem_desc->kind ).
cl_demo_output=>write_data( o_elem_desc->type_kind ).
cl_demo_output=>write_data( o_elem_desc->output_length ).
cl_demo_output=>display( ).

Struct

DATA(lv_struct) = VALUE rsdsselopt( ).
DATA(o_struct_desc) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( lv_struct ) ).
cl_demo_output=>write_data( o_struct_desc->kind ).
cl_demo_output=>write_data( o_struct_desc->components ).
cl_demo_output=>display( ).

Table

DATA(lv_table) = VALUE rseloption( ).
DATA(o_table_desc) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( lv_table ) ).
DATA(o_tl_struct_desc) = CAST cl_abap_structdescr( o_table_desc->get_table_line_type( ) ).
cl_demo_output=>write_data( o_table_desc->kind ).
cl_demo_output=>write_data( o_table_desc->table_kind ).
cl_demo_output=>write_data( o_tl_struct_desc->kind ).
cl_demo_output=>write_data( o_tl_struct_desc->components ).
cl_demo_output=>display( ).

Klasse

DATA(o_class) = NEW cl_abap_codepage( ).
DATA(o_class_desc) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_object_ref( o_class ) ).
cl_demo_output=>write_data( o_class_desc->kind ).
LOOP AT o_class_desc->methods ASSIGNING FIELD-SYMBOL(<m>).
  cl_demo_output=>write( <m>-name ).
ENDLOOP.
cl_demo_output=>display( ).

Interface

DATA(o_if_desc) = CAST cl_abap_intfdescr( cl_abap_typedescr=>describe_by_name( 'IF_RANDOM_NUMBER' ) ).
cl_demo_output=>write_data( o_if_desc->kind ).
LOOP AT o_if_desc->methods ASSIGNING FIELD-SYMBOL(<i>).
  cl_demo_output=>write( <i>-name ).
ENDLOOP.
cl_demo_output=>display( ).

Referenz

DATA(lv_i10) = 10.
DATA(o_ref) = REF #( lv_i10 ).
DATA(o_ref_desc) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( o_ref ) ).
cl_demo_output=>write_data( o_ref_desc->kind ).
cl_demo_output=>write_data( o_ref_desc->type_kind ).
cl_demo_output=>write_data( o_ref_desc->absolute_name ).
cl_demo_output=>display( ).

Enumerator

TYPES: BEGIN OF ENUM e_drive_mode BASE TYPE symsgty,
         unknown  VALUE IS INITIAL,
         forward  VALUE 'F',
         backward VALUE 'B',
       END OF ENUM e_drive_mode.

DATA(lv_enum) = VALUE e_drive_mode( ).
DATA(o_enum_desc) = CAST cl_abap_enumdescr( cl_abap_typedescr=>describe_by_data( lv_enum ) ).
cl_demo_output=>write_data( o_enum_desc->kind ).
cl_demo_output=>write_data( o_enum_desc->type_kind ).
cl_demo_output=>write_data( o_enum_desc->base_type_kind ).
cl_demo_output=>write_data( o_enum_desc->members ).
cl_demo_output=>display( ).

Links

[ABAP] Fehlermeldungen über die Standard-Exceptionklasse CX_T100_MSG ausgeben

* Auslösen der Exeption CX_T100_MSG
CLASS zxyz DEFINITION FINAL.

  PUBLIC SECTION.

    METHODS: constructor
      IMPORTING
        !iv_text TYPE string " Übergabestring für Test
      RAISING
        cx_t100_msg.         " Fehler im Konstruktor löst evtl. CX_T100_MSG aus

ENDCLASS.

CLASS zxyz IMPLEMENTATION.
  METHOD constructor.

    IF NOT iv_text IS INITIAL.

      ...

    ELSE.
* Wenn iv_text leer -> CX_T100_MSG auslösen
      RAISE EXCEPTION TYPE cx_t100_msg
        EXPORTING
          t100_msgid = '00'
          t100_msgno = '398'
          t100_msgv1 = 'Text war leer.' " 1. String
          t100_msgv2 = ''               " 2. String
          t100_msgv3 = ''               " 3. String
          t100_msgv4 = ''.              " 4. String
    ENDIF.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Exception CX_T100_MSG abfangen
  TRY.
* zum Auslösen der Exception den Übergabeparameter leer lassen
      DATA(o_test) = NEW zxyz( iv_text = '' ).
* Exception abfangen
    CATCH cx_root INTO DATA(e_txt).
* Klassenname
      WRITE: / cl_abap_classdescr=>get_class_name( p_object = e_txt ).
* Messagetext
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] CX_T100_MSG: Einfache Erstellung und Nutzung einer globalen Exception-Klasse, mit Definition eigener Nachrichten-IDs

Nutzung von SAP-Standard-Klasse CX_T100_MSG, Definition eigener Nachrichten-IDs

  • Ausnahmeklasse anlegen
  • Verwendung der vorhandenen und frei verwendbaren T100-Text-ID: 00 398 “& & & &”
    1. SE80 Projekt -> Klassen -> Anlegen
      • Klassenname: ZCX_MY_EXCEPTION
      • Oberklasse: CX_T100_MSG
      • Klassentyp: Ausnahmeklasse mit Haken bei “Nachrichtenklasse”
      • Interfaces: “IF_T100_MESSAGE” wird automatisch hinzugefügt
    2. Klasse / Interface: ZCX_MY_EXCEPTION
      • Reiter “Texte”
      • neue Ausnahme-ID (Text-ID) hinzufügen: MY_OBJECT_NOT_FOUND
      • auf Button “Nachrichtentext” klicken
      • entweder eigene Z-Nachrichtenklasse mit Nachrichtennummern und Nachrichtenkurztexten pflegen
      • oder bestehende Standardnachrichtenklasse nutzen:
      • Nachrichtenklasse: 00
      • Nachrichtennummer: 398 (ergibt Nachrichtentext “& & & &”)
      • Nachrichtentext: wird automatisch aus der Nachrichtenklasse gezogen
      • Attrib. 1 zuweisen: T100_MSGV1
      • Attrib. 2 zuweisen: T100_MSGV2
      • Attrib. 3 zuweisen: T100_MSGV3
      • Attrib. 4 zuweisen: T100_MSGV4
    3. aktivieren

Auslösen der Exeption ZCX_MY_EXCEPTION

CLASS zxyz DEFINITION PUBLIC FINAL CREATE PUBLIC.

  PUBLIC SECTION.

    METHODS: constructor
      IMPORTING
        !iv_text TYPE string " Übergabestring für Test
      RAISING
        zcx_my_exception.    " Fehler im Konstruktor löst evtl. ZCX_MY_EXCEPTION aus

ENDCLASS.

CLASS zxyz IMPLEMENTATION.

  METHOD constructor.

    IF NOT iv_text IS INITIAL.

      ...
      
    ELSE.
* Text leer -> ZCX_MY_EXCEPTION auslösen
      RAISE EXCEPTION TYPE zcx_my_exception
        EXPORTING
          textid     = zcx_my_exception=>my_object_not_found
          t100_msgid = 'E'              " nicht verwendet
          t100_msgno = '000'            " nicht verwendet
          t100_msgv1 = 'Text war leer.' " 1. String, wenn benötigt
          t100_msgv2 = ''               " 2. String, wenn benötigt
          t100_msgv3 = ''               " 3. String, wenn benötigt
          t100_msgv4 = ''.              " 4. String, wenn benötigt
    ENDIF.
  ENDMETHOD.

ENDCLASS.

Exception ZCX_MY_EXCEPTION und abfangen und Text-ID MY_OBJECT_NOT_FOUND ausgeben

TRY.
* zum Auslösen der Exception ZCX_MY_EXCEPTION den Übergabeparameter leer lassen
    DATA(o_test) = NEW zxyz( iv_text = '' ).

* Exception abfangen
  CATCH cx_root INTO DATA(e_txt).
* Klassenname
    WRITE: / cl_abap_classdescr=>get_class_name( p_object = e_txt ).
* Messagetext
    WRITE: / e_txt->get_text( ).
ENDTRY.

Links

[ABAP] Klassennamen eines Objektes ermitteln

* Variante 1 (GUI-Objekt)
DATA(o_dock) = NEW cl_gui_docking_container( ).

WRITE: / cl_abap_classdescr=>get_class_name( p_object = o_dock ).

* Variante 2 (Exception)
TRY.
* CX_SY_ZERODIVIDE
    DATA(lv_div) = 1 / 0.
    WRITE: lv_div.
  CATCH cx_root INTO DATA(e_txt).
* Klassennamen des Exception-Objektes ermitteln
    WRITE: / cl_abap_classdescr=>get_class_name( p_object = e_txt ).
ENDTRY.