[ABAP] XLSX-Datei mit Klasse cl_ehfnd_xlsx einlesen und in SALV-Grid anzeigen

TRY.
    DATA: lv_rc TYPE i.
    DATA: it_files TYPE filetable.
    DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
    cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |xlsx (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                CHANGING  file_table  = it_files
                                                          rc          = lv_rc
                                                          user_action = lv_action ).

    IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
      IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
        DATA: lv_filesize TYPE w3param-cont_len.
        DATA: lv_filetype TYPE w3param-cont_type.
        DATA: it_bin_data TYPE w3mimetabtype.

* Excel-Datei auf Appl. Server hochladen (binary)
        cl_gui_frontend_services=>gui_upload( EXPORTING filename   = |{ it_files[ 1 ]-filename }|
                                                        filetype   = 'BIN'
                                              IMPORTING filelength = lv_filesize
                                              CHANGING  data_tab   = it_bin_data ).

* solix -> xstring
        DATA(lv_bin_data) = cl_bcs_convert=>solix_to_xstring( it_solix = it_bin_data ).

**********************************************************************
* XLSX Handling: Kapselt cl_xlsx_document
**********************************************************************
        DATA(o_excel) = cl_ehfnd_xlsx=>get_instance( ).

* XLSX Workbook (XString --> XML)
        DATA(o_doc) = o_excel->load_doc( iv_file_data = lv_bin_data ).

* XLSX Sheets des Workbooks holen
        DATA(it_sheets) = o_doc->get_sheets( ).

        IF lines( it_sheets ) > 0.
* XLSX Sheet: erste Sheet holen
          DATA(o_sheet) = o_doc->get_sheet_by_id( iv_sheet_id = 1 ).
          DATA(lv_sheet_name) = it_sheets[ 1 ]-name.

* max. Zeilenzahl der Sheet
          DATA(lv_max_rows) = o_sheet->get_last_row_number( ).
          DATA(lv_max_cols) = o_sheet->get_last_column_number_in_row( 1 ).

          IF lv_max_rows > 0 AND lv_max_cols > 0.
* Komponenten (Spalten) der Tabelle --> generische Stringtable bauen
            DATA(it_components) = VALUE cl_abap_structdescr=>component_table( ).

* Überschriften (Header) für ALV-Grid
            DATA(it_colnames) = VALUE stringtab( ).

            DO lv_max_cols TIMES.
* Spaltenbezeichner aus 1. Zeile (Header) der Excel-Tabelle holen
              DATA(lv_col_header) = o_sheet->get_cell_content( iv_row    = 1
                                                               iv_column = sy-index ).

* alle Vorkommen, die nicht [a-zA-Z0-9_] entsprechen, durch '_' ersetzen
              REPLACE ALL OCCURRENCES OF REGEX '([^\w]|[äöüÄÖÜß])+' IN lv_col_header WITH '_'.

* Tabelle mit Überschriften für ALV-Grid füllen
              APPEND lv_col_header TO it_colnames.

* Spalte vom Typ String mit generischem Namen zur Komponententabelle hinzufügen
              APPEND VALUE #( name   = |COL{ sy-index }|
                              type   = cl_abap_elemdescr=>get_string( )
                            ) TO it_components.
            ENDDO.

**********************************************************************
* generische interne Tabelle mit hilfe dynamischer Objekte erzeugen
**********************************************************************
* Strukturdeskriptor für Komponententabelle erzeugen
            DATA(o_struct_desc) = cl_abap_structdescr=>create( it_components ).

* Tabellendeskriptor erzeugen
            DATA(o_table_desc) = cl_abap_tabledescr=>create( p_line_type = o_struct_desc ).

* dynamisches Tabellenobjekt anhand des Tabellendeskriptors erstellen
            DATA: o_table TYPE REF TO data.
            CREATE DATA o_table TYPE HANDLE o_table_desc.

* Feldsymbol auf das Tabellenobjekt vom Typ STANDARD TABLE anlegen
            FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
            ASSIGN o_table->* TO <table>.

* Inhalt (ohne Header) aus XLSX in interne Tabelle schreiben
            DATA(lv_row) = 2.

            DO lv_max_rows - 1 TIMES.
              DATA(lv_col) = 1.

* neue Ausgabezeile anfügen
              APPEND INITIAL LINE TO <table>.

* neue Ausgabezeile holen und Feldsymbol zuweisen
              DATA(lv_lc) = lines( <table> ).
              ASSIGN <table>[ lv_lc ] TO FIELD-SYMBOL(<row>).

              IF <row> IS ASSIGNED.
* für alle Spalten der Tabelle
                DO lv_max_cols TIMES.
* n-te Spalte <col> der akt. Tabellenzeile <row> ermitteln
                  ASSIGN COMPONENT lv_col OF STRUCTURE <row> TO FIELD-SYMBOL(<cell>).
                  IF <cell> IS ASSIGNED.
* Inhalt der akt. Zelle in die Zelle der internen Tabelle schreiben
                    <cell> = o_sheet->get_cell_content( iv_row    = lv_row
                                                        iv_column = lv_col ).


                  ENDIF.

                  lv_col = lv_col + 1.
                ENDDO.
              ENDIF.

              lv_row = lv_row + 1.
            ENDDO.

**********************************************************************
* Anzeige der gefüllten generischen Tabelle in einem SALV-Grid
**********************************************************************
            TRY.
*             SALV-Table
                DATA: o_salv TYPE REF TO cl_salv_table.

                cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                                        CHANGING  t_table      = <table> ).

*             Grundeinstellungen
                o_salv->get_functions( )->set_all( abap_true ).
                o_salv->get_columns( )->set_optimize( abap_true ).
                o_salv->get_display_settings( )->set_list_header( CONV #( lv_sheet_name ) ).
                o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
                o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

*             Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
                LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
                  DATA(lv_idx) = sy-tabix.

                  DATA(o_col) = <c>-r_column.
                  o_col->set_short_text( || ).
                  o_col->set_medium_text( || ).
                  o_col->set_long_text( CONV #( it_colnames[ lv_idx ] ) ).
                ENDLOOP.

                o_salv->display( ).
              CATCH cx_root INTO DATA(e_txt).
                WRITE: / e_txt->get_text( ).
            ENDTRY.
          ENDIF.

        ENDIF.

      ENDIF.

    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

[ABAP] Infos zu Datenelementen und Domänen lesen

* Name Datenelement
PARAMETERS: p_dtype TYPE ddobjname DEFAULT 'CCCATEGORY'.

START-OF-SELECTION.

  DATA: lv_gotstate	TYPE ddgotstate.
  DATA: lv_dd04v_wa	TYPE dd04v.
  DATA: lv_tpara_wa	TYPE tpara.

* DD: Schnittstelle zum Lesen eines Datenelements aus dem ABAP/4 Dictionary
  CALL FUNCTION 'DDIF_DTEL_GET'
    EXPORTING
      name          = p_dtype
    IMPORTING
      gotstate      = lv_gotstate
      dd04v_wa      = lv_dd04v_wa
      tpara_wa      = lv_tpara_wa
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.

  IF sy-subrc = 0.
    DATA: lv_gotstate_d	TYPE ddgotstate.
    DATA: lv_dd01v_wa	TYPE dd01v.
    DATA: it_dd07v_tab TYPE STANDARD TABLE OF dd07v WITH DEFAULT KEY.

* DD: Schnittstelle zum Lesen einer Domäne aus dem ABAP/4 Dictionary
    CALL FUNCTION 'DDIF_DOMA_GET'
      EXPORTING
        name          = lv_dd04v_wa-domname
      IMPORTING
        gotstate      = lv_gotstate_d
        dd01v_wa      = lv_dd01v_wa
      TABLES
        dd07v_tab     = it_dd07v_tab
      EXCEPTIONS
        illegal_input = 1
        OTHERS        = 2.

    IF sy-subrc = 0.
      cl_demo_output=>next_section( |Datentyp { p_dtype }| ).
      cl_demo_output=>write_data( lv_gotstate ).
      cl_demo_output=>write_data( lv_dd04v_wa ).
      cl_demo_output=>write_data( lv_tpara_wa ).

      cl_demo_output=>next_section( |Domäne { lv_dd04v_wa-domname }| ).
      cl_demo_output=>write_data( lv_gotstate_d ).
      cl_demo_output=>write_data( lv_dd01v_wa ).
      cl_demo_output=>write_data( it_dd07v_tab ).

* HTML-Code vom Demo-Output holen
      DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
      cl_abap_browser=>show_html( EXPORTING
                                    title        = 'Infos'
                                    html_string  = lv_html
                                    container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
      WRITE: space.
    ENDIF.
  ENDIF.

[ABAP] Eigenschaften einer Klasse prüfen

DATA(lv_class) = |CL_DEMO_OUTPUT|.
DATA(lv_interface) = |IF_DEMO_OUTPUT|.

* Aktiv?
IF cl_esh_ca_check=>is_active_class( CONV #( lv_class ) ) = abap_true.
  WRITE: / |Klasse { lv_class } ist aktiv.|.
ELSE.
  WRITE: / |Klasse { lv_class } ist nicht aktiv.|.
ENDIF.

* Instanziierbar?
IF cl_esh_ca_check=>is_instantiable_class( CONV #( lv_class ) ) = abap_true.
  WRITE: / |Klasse { lv_class } ist instanziierbar.|.
ELSE.
  WRITE: / |Klasse { lv_class } ist nicht instanziierbar.|.
ENDIF.

* Implementiert Interface?
IF cl_esh_ca_check=>is_interface_implem_class( iv_class = CONV #( lv_class ) iv_interface = CONV #( lv_interface ) ) = abap_true.
  WRITE: / |Klasse { lv_class } implementier Interface { lv_interface }.|.
ELSE.
  WRITE: / |Klasse { lv_class } implementier Interface { lv_interface } nicht.|.
ENDIF.

[ABAP] Datenelemente anhand von Datentypen und Suchstrings (Tabelle DD01L, DD01T) suchen

In der Praxis kommt es oft vor, dass man zu einem Datenelement oder einer Tabelle einen passenden fertigen SAP-Datentyp aus dem DDIC sucht. Dieses kleine Programm hilft dabei, schnell und effizient das passende aus den Tabellen DD01L und DD01T zu suchen (Datentyp, Sprache, Kurztext).

* Datentyp
PARAMETERS: p_dtyp TYPE dd04l-datatype DEFAULT 'DATS'.
* Sprache
PARAMETERS: p_lang TYPE dd04t-ddlanguage DEFAULT 'D'.
* Suchtext für Suche in Kurzbeschreibung
PARAMETERS: p_search TYPE string LOWER CASE.

START-OF-SELECTION.

  SELECT dl~rollname,  " Datenelement
         dl~domname,   " Domäne
         dl~datatype,  " Datentyp
         dl~leng,      " Zahl der Stellen
         dl~memoryid,  " Parameter-Id
         dl~entitytab, " Wertetabelle
         dt~ddtext     " Kurzbeschreibung
    INTO TABLE @DATA(it_result)
    FROM dd04l AS dl
    INNER JOIN dd04t AS dt ON ( dl~rollname = dt~rollname AND dl~dtelmaster = dt~ddlanguage AND dl~as4local = dt~as4local AND dl~as4vers = dt~as4vers )
    WHERE dl~as4local   = 'A'
      AND dl~datatype   = @p_dtyp
      AND dt~ddlanguage = @p_lang.

  IF sy-subrc = 0.
    TRY.
        DATA(it_result2) = it_result.

* wenn nach bestimmten Inhalt gesucht werden soll -> Filtern
        IF NOT p_search IS INITIAL.
          it_result2 = VALUE #( FOR <s> IN it_result WHERE ( ddtext CS p_search )
                                (
                                   <s>
                                )
                              ).
        ENDIF.

* SALV-Table
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( IMPORTING
                                  r_salv_table   = o_salv
                                CHANGING
                                  t_table        = it_result2 ).

* Grundeinstellungen
        o_salv->get_functions( )->set_all( abap_true ).
        o_salv->get_columns( )->set_optimize( abap_true ).
        o_salv->get_display_settings( )->set_list_header( |Datentypen ({ lines( it_result2 ) })| ).
        o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
        LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
          DATA(o_col) = <c>-r_column.
          o_col->set_short_text( || ).
          o_col->set_medium_text( || ).
          o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
        ENDLOOP.

        o_salv->display( ).
      CATCH cx_root INTO DATA(e_txt).
        WRITE: / e_txt->get_text( ).
    ENDTRY.
  ENDIF.

Links

[ABAP] Übersicht SAP-Klassen und -Interfaces

Klasse                        Paket                         Funktion

/ui2/cl_abap2json             /UI2/BASIS_SERVICES_START_UP  ABAP nach JSON konvertieren
/ui2/cl_json                  /UI2/NWBC_CORE                JSON converter
/ui2/cl_number                /UI2/BASIS_TINY_DATA          Generic compressed serialization class
/ui5/cl_theme_util            /UI5/THEMING_INFRA            UI Theming: Utility functions
cf_reca_message_list          RE_CA_BC                      Nachrichtensammler: Factory
cl_abap_browser               SABAPDOCU                     Anzeige einer HTML- oder XML-Datei
cl_abap_char_utilities        S ABP_CONVERT                 Hilfsmittel für Zeichenverarbeitung
cl_abap_classdescr            SABP_RTTI                     Run Time Type Services
cl_abap_codepage              SABP_CONVERT                  codepage utility class
cl_abap_conv_obj              SCP                           Ein CCC Converter-Objekt
cl_abap_container_utilities   SABP_CONVERT                  Container Programmierung
cl_abap_conv_in_ce            SABP_CONVERT                  Codepage- und Endian Konvertierung (Extern -> Systemformat)
cl_abap_conv_out_ce           SABP_CONVERT                  Codepage- und Endian Konvertierung (Systemformat -> Extern)
cl_abap_datadescr             SABP_RTTI                     Run Time Type Services
cl_abap_datfm                 SABP_CONVERT                  Internationalisierung und Datumsformat
cl_abap_dyn_prg               SABP                          Support for dynamic programming
cl_abap_elemdescr             SABP_RTTI                     Run Time Type Services
cl_abap_exceptional_values    SABP_CORE                     Liefert min,max...-Werte vordefinierter Typen
cl_abap_file_utilities        SABP                          Hilfsmittel für Files
cl_abap_format                SABP                          Hilfsmittel zur Formatierung
cl_abap_gzip                  ABAP_EXPIMP                   Klasse zur (De-) Kompression (gzip)
cl_abap_hmac                  SECH                          Message Authentication Code (MAC) einer Nachricht
cl_abap_list_layout           SABP_LIST_TOOLS               Hilfsmittel für ABAP-Listen
cl_abap_matcher               SABP_REGEX                    Reguläre Ausdrücke
cl_abap_math                  SABP_CORE                     ABAP-Mathematik Bibliothek
cl_abap_message_digest        SECH                          Kryptografischer Hash-Wert einer Nachricht
cl_abap_memory_utilities      SABP_CORE                     Hilfsmittel zur ABAP-Speicherverwaltung
cl_abap_random                SABP_RANDOM                   Pseudozufallszahlengenerator
cl_abap_random_int            SABP_RANDOM                   Integer Zufallszahlen
cl_abap_random_float          SABP_RANDOM                   Float Zufallszahlen
cl_abap_regex                 SABP_REGEX                    Reguläre Ausdrücke
cl_abap_runtime               SABP_RUNTIME                  Hilfsklasse für Laufzeitmessungen
cl_abap_session_temperature   SABP_DAAG                     DB-Zugriffssteuerung für Data Aging
cl_abap_stack_temperature     SABP_DAAG                     DB-Zugriffssteuerung für Data Aging
cl_abap_structdescr           SABP_RTTI                     Run Time Type Services
cl_abap_syst                  SABP_CORE                     Sichere Ermittlung der SYST-Werte
cl_abap_tabledescr            SABP_RTTI                     Run Time Type Services
cl_abap_timefm                SABP_CONVERT                  Zeitformat
cl_abap_tstmp                 SABP_CONVERT                  Arithmetik- und Konvertierung für TimeStamps
cl_abap_typedescr             SABP_RTTI                     Run Time Type Services
cl_abap_zip                   ABAP_EXPIMP                   Zip-Utility
cl_alink_connection           SAOP                          ArchiveLink Verknüpfungen
cl_alv_table_create           SLIS                          Dynamischer Create einer ALV-Datentabelle
cl_appointment                SZTK                          Termin der R/3 Terminverwaltung
cl_binary_relation            SOBL                          API für Binäre Verknüpfung
cl_bcs_convert                SBCOMS                        BCS: Utilities für den Dokumenteninhalt
cl_bcs_message                SBCS_SEND                     BCS: Nachricht versenden
cl_bcs_utilities              SBCS_SEND                     Hilfsfunktionen zur Sendeschnittstelle
cl_bs_period_toolset_basics   BS_PERIOD_API                 Period Toolset - Basic Functions
cl_ci_query_attributes        S_CODE_INSPECTOR              Code Inspector: Abfrage von Attributen
cl_clb_tools                  S_CLB_COMMON                  Collaboration: Common Tools
cl_clb_parse_json             S_CLB_COMMON                  Utility Class to Parse JSON
cl_ctmenu                     SGUI                          Context Menu
cl_cts_language_file_io       STRALAN                       Filezugriffklasse des Sprachentransports
cl_db_sys                     SABP_CORE                     Abfragen von Datenbank-Informationen
cl_demo_output                SABAP_DEMOS_OUTPUT_STREAM     Demo-Ausgaben mit statischen Methoden oder Instanzmethoden
cl_ehfnd_xlsx                 EHFND_FW_EXPORT_IMPL          XLSX Handling
cl_esh_ca_check               S_ESH_ENG_CACHE               Cache check
cl_fdt_json                   SFDT_CORE                     Create JSON format from ABAP data and vice versa
cl_fdt_xl_spreadsheet         SFDT_EXCEL_CORE               FDT:Spreadsheet document
cl_fxs_image_processor        S_XSLFO_SUPPLEMENTARY_IMAGE   Image Processor
cl_fxs_image_info             S_XSLFO_SUPPLEMENTARY_IMAGE   Image Information Determiner
cl_fxs_mime_types             S_XSLFO_SUPPLEMENTARY         Mime Type Constants
cl_gos_attachment_query       SGOS_ATTA                     Statistiken für Anlagen
cl_gui_abapedit               SEDI                          Abap Edit Control
cl_gui_alv_grid               SLIS                          ALV List Viewer
cl_gui_calendar               SAPCALENDAR                   Calendar Control Proxy Class
cl_gui_cfw                    SCET                          Control Framework Basisklasse
cl_gui_chart_engine           SPIG                          Graphics: Präsentationsgrafiken
cl_gui_chart_engine_win       SPIG                          Graphics: Präsentationsgrafiken (WinGUI)
cl_gui_column_tree            SEU_TREE_CONTROL              Column Tree Control
cl_gui_container              SCET                          Abstracter Container fuer GUI Controls
cl_gui_control                SCET                          Proxy-Klasse für Control im GUI
cl_gui_custom_container       SCET                          Container fuer Custom Controls in der Dynpro Area
cl_gui_dialogbox_container    SCET                          Container fuer Custom Controls in der Dynpro Area
cl_gui_docking_container      SCET                          Docking Control Container
cl_gui_ecl_2dviewer           SECLVIEWER                    Engineering Client 2D Viewer
cl_gui_ecl_3dviewer           SECLVIEWER                    Engineering Client 3D Viewer
cl_gui_ecl_viewerbox          SECLVIEWER                    ECL Viewer als Pop-up Fenster
cl_gui_frontend_services      SCET                          Frontend Services
cl_gui_gos_container          SCET                          Generic Object Services Container
cl_gui_html_viewer            SAPHTML                       HTML Control proxy class
cl_gui_list_tree              SEU_TREE_CONTROL              List Tree Control
cl_gui_picture                SAPPICTURE                    SAP Picture Control
cl_gui_props_consumer         SCET                          Nimmt globale Gui-Props entgegen
cl_gui_simple_tree            SEU_TREE_CONTROL              Simple Tree Control
cl_gui_splitter_container     SCET                          Splitter Control
cl_gui_textedit               SAPTEXTEDIT                   SAP TextEdit Control
cl_gui_timer                  SCET                          SAP Timer Control
cl_gui_toolbar                SAPTOOLBAR                    Toolbar Control
cl_hcmfab_employee_api        ODATA_HCMFAB_REUSE            Employee functions 
cl_http_client                SHTTP                         HTTP client control block
cl_http_server                SIHTTP                        HTTP Framework (iHTTP) HTTP Server
cl_http_utility               SIHTTP                        HTTP Framework (iHTTP) HTTP Utilities
cl_hrpad_date_computations    PAOC_PAD_DATE_COMPUTATIONS    Datumsberechnungen
cl_i18n_utils                 SCP                           I18N related utilities
cl_icf_csv                    SHTTP                         ICF-Schnitstelle für CSV-File
cl_igs_image_converter        SPIG                          Internet Graphics Service: Image Converter
cl_message_helper             S_ABAP_EXCEPTIONS             Hilfsklasse für die Anweisung MESSAGE
cl_mmpur_constants            MMPUR_BASE                    Konstanten Einkauf
cl_openxml_helper             S_OOXML_CROSS                 OpenXML Helper Class
cl_reca_date                  RE_CA_BC                      Datumsverwaltung
cl_reca_ddic_doma             RE_CA_BC                      DDIC-Objekt: Domäne
cl_s_aut_bal_log              S_AUT                         Meldungsprotokoll-Behandler
cl_salv_controller_metadata   SALV_OM_OBJECTS               ALV: abstrakter Controller
cl_salv_ex_util               SALV_EX                       utlity Klasse
cl_salv_table                 SALV_OM_OBJECTS               Basisklasse für einfache Tabellen
cl_sec_sxml_writer            SXML_SEC                      Secure SXML Writer
cl_secxml_helper              SXML_SEC                      Helper für XML Security Tests
cl_time_chart_simple          S_DBMON_ORA_COCKPIT           Simple time chart (based on chart engine)
cl_xlsx_document              S_OOXML_XLSX                  OpenXML/xlsx Package
cl_xml_document               SWXML                         XML-Dokument für WF- WEB-Aktivität
if_fsbp_const_range           FS_BP_AL_GENERIC_SERVICES     Konstanten für die Selektionstabellen bzw. Ranges-Tabellen
if_salv_gui_table_ida         SALV_IDA_PUB                  ALV with integrated data access (ALV with IDA)

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

* Typ-Beispiele:
* Struct
*   RSDSSELOPT
* Table
*   RSELOPTION
* Klasse
*   CL_DEMO_OUTPUT
* Interface
*   IF_RANDOM_NUMBER
* Datenelement
*   I
* Referenz
*   ?
PARAMETERS: p_name TYPE string DEFAULT 'RSDSSELOPT'.

START-OF-SELECTION.

  DATA(o_type_desc) = cl_abap_typedescr=>describe_by_name( p_name ).

  CASE o_type_desc->kind.
    WHEN cl_abap_typedescr=>kind_struct.
      DATA(o_struct_desc) = CAST cl_abap_structdescr( o_type_desc ).
      cl_demo_output=>write_data( o_struct_desc->components ).
    WHEN cl_abap_typedescr=>kind_table.
      DATA(o_table_desc) = CAST cl_abap_tabledescr( o_type_desc ).
      DATA(o_tl_struct_desc) = CAST cl_abap_structdescr( o_table_desc->get_table_line_type( ) ).
      cl_demo_output=>write_data( o_tl_struct_desc->components ).
    WHEN cl_abap_typedescr=>kind_class.
      DATA(o_class_desc) = CAST cl_abap_classdescr( o_type_desc ).
      LOOP AT o_class_desc->methods ASSIGNING FIELD-SYMBOL(<m>).
        cl_demo_output=>write( <m>-name ).
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_intf.
      DATA(o_if_desc) = CAST cl_abap_intfdescr( o_type_desc ).
      LOOP AT o_if_desc->methods ASSIGNING FIELD-SYMBOL(<i>).
        cl_demo_output=>write( <i>-name ).
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_elem.
      DATA(o_elem_desc) = CAST cl_abap_elemdescr( o_type_desc ).
      cl_demo_output=>write_data( o_elem_desc->type_kind ).
    WHEN cl_abap_typedescr=>kind_ref.
  ENDCASE.

  cl_demo_output=>display( ).

Links

[ABAP] Konvertierung einer Struktur in Binärdaten (x, xstring) und zurück

Variante 1 (FIELD-SYMBOLS, CASTING: Struktur <-> Typ x)

* einfachen Typ deklarieren
TYPES: BEGIN OF ty_struct,
         matnr TYPE matnr,
         int   TYPE i,
         float TYPE f,
         text  TYPE char10,
       END OF ty_struct.

* Feldsymbol für Binärdaten
FIELD-SYMBOLS <x> TYPE x.
* Feldsymbol für Strukturdaten
FIELD-SYMBOLS <s> TYPE ty_struct.

* Struktur anlegen, deren Daten kovertiert werden soll
DATA(lv_s) = VALUE ty_struct( matnr = '1234567890'
                              int   = 1
                              float = '1.1'
                              text  = 'abc' ).

* Struktur in Binärdaten umwandeln
ASSIGN lv_s TO <x> CASTING.
IF <x> IS ASSIGNED.
* Binärdaten in Struktur umwandeln
  ASSIGN <x> TO <s> CASTING.
  IF <s> IS ASSIGNED.
    DATA(lv_s2) = <s>.
* Datenausgabe
    WRITE: / lv_s2-matnr.
    WRITE: / lv_s2-int.
    WRITE: / lv_s2-float.
    WRITE: / lv_s2-text.
  ENDIF.
ENDIF.

Variante 2 (xstring -> Struktur)

* https://www.consolut.com/s/sap-ides-zugriff/d/e/doc/M-CL_ABAP_CONV_IN_CE/
* einfachen Typ deklarieren
TYPES: BEGIN OF ty_struct,
         text TYPE char5,
         int  TYPE i,
       END OF ty_struct.

* Zielstruktur
DATA(lv_s) = VALUE ty_struct( ).

* Konverterobjekt mit UTF-8 und Little Endian Konvertierung
DATA(o_conv) = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' endian = 'L' ).
* View-Objekt
DATA(o_view) = cl_abap_view_offlen=>create_legacy_view( lv_s ).
* Eingabepuffer mit Binärdaten
DATA(lv_buffer) = CONV xstring( '616263202000000005000000' ).

* Konvertierung xstring -> Struct
*  in: HEX: 616263202000000005000000
* out: Struct: text: abc
*               ínt: 5
o_conv->convert_struc( EXPORTING
                         input = lv_buffer
                         view  = o_view
                       IMPORTING
                         data  = lv_s ).

* Datenausgabe
WRITE: / lv_s-text.
WRITE: / lv_s-int.

Variante 3 (Struktur -> xstring)

* https://www.consolut.com/s/sap-ides-zugriff/d/e/doc/M-CL_ABAP_CONV_OUT_CE/
* einfachen Typ deklarieren
TYPES: BEGIN OF ty_struct,
         text TYPE char5,
         int  TYPE i,
       END OF ty_struct.

* Struktur mit Quelldaten
DATA(lv_s) = VALUE ty_struct( text = 'abc'
                              int  = 5 ).

* Konverterobjekt mit UTF-8 und Little Endian Konvertierung
DATA(o_conv) = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' endian = 'L' ).
* View-Objekt
DATA(o_view) = cl_abap_view_offlen=>create_legacy_view( lv_s ).
* Ausgabepuffer für Binärdaten
DATA: lv_buffer type xstring.

* Konvertierung Struct -> xstring
*  in: Struct: text: abc
*               ínt: 5
* out: HEX: 616263202000000005000000
o_conv->convert_struc( EXPORTING
                         data   = lv_s
                         view   = o_view
                       IMPORTING
                         buffer = lv_buffer ).

* Datenausgabe
WRITE: / lv_buffer.

[ABAP] Binärdaten (xstring) zu String wandeln (xstring -> string)

Variante 1 (xstring -> string)

* Binärdaten als xstring
DATA(lv_xstring) = CONV xstring( 'A0B0C0FF' ).
* xstring -> string
DATA(lv_string) = CONV string( lv_xstring ).

WRITE: / lv_string.

Variante 2 (String als formatierten Hexcode ausgeben)

DATA: lv_mime_type TYPE string.
DATA: lv_image_bytes TYPE xstring.
DATA: it_text80 TYPE STANDARD TABLE OF text80 WITH DEFAULT KEY.

TRY.
* Ein paar Bytes holen: Screenshot aufnehmen
    cl_gui_frontend_services=>get_screenshot( IMPORTING
                                                mime_type_str = lv_mime_type
                                                image         = lv_image_bytes ).

* xstring -> string
    DATA(lv_string) = CONV string( lv_image_bytes ).

* formatierte Ausgabe (80 Zeichen Breite)
    CALL FUNCTION 'SWA_STRING_TO_TABLE'
      EXPORTING
        character_string = lv_string
      IMPORTING
        character_table  = it_text80.

    LOOP AT it_text80 ASSIGNING FIELD-SYMBOL(<t>).
      WRITE: / <t>.
    ENDLOOP.

  CATCH cx_root INTO DATA(e_txt).
ENDTRY.

[ABAP] Message-Klasse über Interface if_t100_dyn_msg definieren

* https://blogs.sap.com/2015/11/12/abap-news-for-release-750-converting-messages-into-exceptions/
CLASS lcl_msg_class DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_t100_dyn_msg.

    ALIASES: t100_key FOR if_t100_message~t100key.
    ALIASES: msgty    FOR if_t100_dyn_msg~msgty.
    METHODS
      constructor
        IMPORTING
          msgid TYPE symsgid
          msgno TYPE symsgno
          msgty TYPE symsgty.
ENDCLASS.

CLASS lcl_msg_class IMPLEMENTATION.
  METHOD constructor.
    me->t100_key-msgid = msgid.
    me->t100_key-msgno = msgno.
    me->msgty          = msgty.
  ENDMETHOD.

  METHOD if_message~get_text.
    result = cl_message_helper=>get_text_for_message( me ).
  ENDMETHOD.

  METHOD if_message~get_longtext.
    result = cl_message_helper=>get_longtext_for_message( me ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  MESSAGE NEW lcl_msg_class( msgid = 'XYZ'
                             msgno = '001'
                             msgty = 'E' ).