[ABAP] Message-Log als Popup: Sammeln und Ausgeben von Nachrichten

*--------------------------------------------------------------------*
* Klasse zur Anzeige eines Nachrichtenprotokolls (Logs)
*
* Kapselt folgende FuBas:
* MESSAGES_INITIALIZE
* MESSAGE_STORE
* MESSAGES_STOP
* MESSAGES_SHOW
*--------------------------------------------------------------------*
CLASS lcl_msg_log DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: init
      RETURNING VALUE(rv_ok) TYPE boolean.

    CLASS-METHODS: add
      IMPORTING
                i_arbgb      TYPE smesg-arbgb
                i_msgty      TYPE smesg-msgty
                i_txtnr      TYPE string
                i_zeile      TYPE i DEFAULT 0
                i_msgv1      TYPE string DEFAULT ''
                i_msgv2      TYPE string DEFAULT ''
                i_msgv3      TYPE string DEFAULT ''
                i_msgv4      TYPE string DEFAULT ''
      RETURNING VALUE(rv_ok) TYPE boolean.

    CLASS-METHODS: show
      IMPORTING
                i_show_amodal TYPE boolean DEFAULT abap_false
      RETURNING VALUE(rv_ok)  TYPE boolean.
ENDCLASS.
*--------------------------------------------------------------------*
CLASS lcl_msg_log IMPLEMENTATION.

*--------------------------------------------------------------------*
* Nachrichtenprotokoll initialisieren
*--------------------------------------------------------------------*
  METHOD init.

    rv_ok = abap_false.

* Nachrichtenprotokoll initialisieren
    CALL FUNCTION 'MESSAGES_INITIALIZE'
      EXCEPTIONS
        log_not_active       = 1
        wrong_identification = 2
        OTHERS               = 3.

    IF sy-subrc = 0.
      rv_ok = abap_true.
    ENDIF.

  ENDMETHOD.
*--------------------------------------------------------------------*
* Nachricht im Protokoll ablegen
*--------------------------------------------------------------------*
  METHOD add.

    rv_ok = abap_false.

* Nachricht im Protokoll ablegen
    CALL FUNCTION 'MESSAGE_STORE'
      EXPORTING
        arbgb                  = i_arbgb
        msgty                  = i_msgty
        msgv1                  = i_msgv1
        msgv2                  = i_msgv2
        msgv3                  = i_msgv3
        msgv4                  = i_msgv4
        txtnr                  = i_txtnr
        zeile                  = i_zeile
      EXCEPTIONS
        message_type_not_valid = 1
        not_active             = 2
        OTHERS                 = 3.

    IF sy-subrc = 0.
      rv_ok = abap_true.
    ENDIF.

  ENDMETHOD.
*--------------------------------------------------------------------*
* Nachrichtenprotokoll anzeigen
*--------------------------------------------------------------------*
  METHOD show.

    rv_ok = abap_false.

* Baustein analysiert Fehlerprotokoll und gibt als Status eine Exception aus
    CALL FUNCTION 'MESSAGES_STOP'
      EXCEPTIONS
        a_message         = 1
        e_message         = 2
        w_message         = 3
        i_message         = 4
        s_message         = 5
        deactivated_by_md = 6
        OTHERS            = 7.

* Nachrichtenprotokoll anzeigen
    CALL FUNCTION 'MESSAGES_SHOW'
      EXPORTING
        i_use_grid         = abap_true
        i_amodal_window    = i_show_amodal
      EXCEPTIONS
        inconsistent_range = 1
        no_messages        = 2
        OTHERS             = 3.

    IF sy-subrc = 0.
      rv_ok = abap_true.
    ENDIF.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  IF abap_true = lcl_msg_log=>init( ).

    IF abap_true = lcl_msg_log=>add( i_arbgb = 'SY'
                                     i_msgty = 'E'
                                     i_txtnr = '002'
                                     i_zeile = 0
                                     i_msgv1 = 'Fehler.' ).

      IF abap_true = lcl_msg_log=>add( i_arbgb = 'SY'
                                       i_msgty = 'W'
                                       i_txtnr = '002'
                                       i_zeile = 1
                                       i_msgv1 = 'Warnung' ).

        IF abap_true = lcl_msg_log=>add( i_arbgb = 'SY'
                                         i_msgty = 'I'
                                         i_txtnr = '002'
                                         i_zeile = 2
                                         i_msgv1 = 'Info' ).

          IF abap_true = lcl_msg_log=>show( ).

          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

[ABAP] OO: Variablen, Strukturen, interne Tabellen, Objektreferenzen anlegen

Variable anlegen

* int
DATA(lv_int) = 1.
DATA(lv_int_empty) = VALUE i( ).
 
* float
DATA(lv_float_empty) = VALUE f( ).
DATA(lv_float) = CONV f( '0.1' ).
 
* char
DATA(lv_char) = 'ABCD'.
 
* string
DATA(lv_empty_string) = ||.
DATA(lv_string) = |Text|.
 
* bool
DATA(lv_bool) = abap_true.
 
* DDIC-Typ (z.B. MATNR)
DATA(lv_matnr) = CONV matnr( '1234567890' ).
DATA(lv_matnr_empty) = VALUE matnr( ).

Struktur anlegen

* definiert vom Anwender
TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
       END OF ty_sflight.

DATA(lv_struct) = VALUE ty_sflight( carrid = 'LH'
                                    connid = '0123' ).

* Strukturtyp aus DDIC (leer)
DATA(lv_headdata_empty) = VALUE bapimathead( ).

* Strukturtyp aus DDIC (gefüllt)
DATA(lv_headdata) = VALUE bapimathead( material      = '1234567890'
                                       basic_view    = abap_true
                                       purchase_view = abap_true
                                       account_view  = abap_true ).

interne Tabelle anlegen

* definiert vom Anwender
TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
       END OF ty_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_sflight WITH DEFAULT KEY.

DATA(it_tab) = VALUE ty_it_sflight( ( carrid = 'LH' connid = '0123' )
                                    ( carrid = 'AA' connid = '3210' ) ).

* Stringtable aus DDIC (leer)
DATA(it_stringtab_empty) = VALUE stringtab( ).

* Stringtable aus DDIC (gefüllt)
DATA(it_stringtab) = VALUE stringtab( ( |Udo| )
                                      ( |Heinz| )
                                      ( |Klaus| ) ).

Objektreferenz anlegen

* Objektreferenz auf Klasse ALV-Grid
DATA(o_alv) = NEW cl_gui_alv_grid( i_parent      = cl_gui_container=>default_screen
                                   i_appl_events = abap_true ).

* Referenz auf int
DATA(lv_int) = 1.
DATA(o_int) = REF #( lv_int ).

* Referenz auf stringtab
DATA(it_stringtab) = VALUE stringtab( ).
DATA(o_tab) = REF #( it_stringtab ).

[MS Excel] Datenexport eines Tabellenblattes als CSV oder TXT

Export eines Tabellenblattes in eine CSV-Datei

Menü -> Speichern unter … -> Dateityp “CSV (Trennzeichen-getrennt) (*.csv)”

Separator-Zeichen für die CSV-Datei einstellen

Windows -> Systemsteuerung -> Region und Sprache -> Formate -> Weitere Einstellungen … -> Listentrennzeichen

Export eines Tabellenblattes in eine TXT-Datei (Tab-getrennt)

Menü -> Speichern unter … -> Dateityp “Text (Tabstopp-getrennt) (*.txt)”

Weiterführende Infos: Link

[ABAP] MM: MIGO_DIALOG – Transaktion MIGO anzeigen

*i_action - Ausführbare Aktion in Transaktion MIGO
*
*Domäne: GOACTION
*
*A01  Wareneingang
*A02  Rücklieferung
*A03  Storno
*A04  Anzeigen
*A05  WE-Sperrb. freigeben
*A06  Nachlieferung
*A07  Warenausgang
*A08  Umbuchung
*A09  Auslagern
*A10  Einlagern
*A11  Nachverrechnung
*A12  Ändern

*i_refdoc - Referenzdokument Transaktion MIGO
*
*Domäne: REFDOC
*
*R01  Bestellung
*R02  Materialbeleg
*R03  Lieferschein
*R04  Anlieferung
*R05  Auslieferung
*R06  Transport
*R07  Transportidentifikation
*R08  Auftrag
*R09  Reservierung
*R10  Sonstige

* Materialbelegnummer
DATA(lv_mblnr) = CONV mblnr( '123456' ).

CALL FUNCTION 'MIGO_DIALOG'
  EXPORTING
    i_action            = 'A04'      " Anzeigen
    i_refdoc            = 'R02'      " Materialbeleg
    i_notree            = abap_false " Baumanzeige ein
    i_no_auth_check     = abap_true  " kein Authority Check
    i_deadend           = abap_false " Listboxen und Menü sind aktiv
    i_mblnr             = lv_mblnr   " Belegnummer
  EXCEPTIONS
    illegal_combination = 1
    OTHERS              = 2.

IF sy-subrc <> 0.
  MESSAGE 'Fehler beim Aufruf der Transaktion MIGO.' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.

[ABAP] MM: BAPI_MATERIAL_SAVEDATA – Anlegen und Ändern von Materialstammdaten

TYPES: ty_it_materialdescription TYPE STANDARD TABLE OF bapi_makt WITH DEFAULT KEY.

* Kopfdaten
DATA(lv_headdata) = VALUE bapimathead( material      = '123456'             " MATNR
                                       ind_sector    = CONV mbrsh( 'A' )    " Branche (Tabelle T137)
                                       matl_type     = CONV mtart( 'VERP' ) " Materialart (Tabelle T134)

                                       basic_view    = abap_true            " Sicht Grundddaten anlegen
                                       purchase_view = abap_true            " Sicht Einkauf anlegen
                                       account_view  = abap_true            " Sicht Buchhaltung
                                     ).
* Mandantenebene (MARA)
* Daten
DATA(lv_clientdata) = VALUE bapi_mara( del_flag   = abap_false               " Löschvormerkung auf Mandantenebene
                                       matl_group = CONV matkl( '00100000' ) " Warengruppe (Tabelle T023)
                                       base_uom   = CONV meins( 'KG' )       " Basismengeneinheit (Tabelle T006)
                                     ).

* Speicherflags
DATA(lv_clientdatax) = VALUE bapi_marax( del_flag   = abap_true " Löschvormerkung auf Mandantenebene setzen
                                         matl_group = abap_true " Warengruppe setzen
                                         base_uom   = abap_true " Basismengeneinheit setzen
                                       ).
* Werksebene (MARC)
* Daten
DATA(lv_plantdata) = VALUE bapi_marc( plant     = CONV werks_d( '0001' ) " Werk (Tabelle T001W)
                                      del_flag  = abap_false             " Löschvormerkung auf Werksebene
                                      pur_group = CONV ekgrp( '001' )    " Einkäufergruppe (Tabelle T024)
                                    ).

* Speicherflags
DATA(lv_plantdatax) = VALUE bapi_marcx( plant     = CONV werks_d( '0001' ) " Werk (Tabelle T001W)
                                        del_flag  = abap_true              " Löschvormerkung auf Werksebene setzen
                                        pur_group = abap_true              " Einkäufergruppe setzen
                                      ).

* Materialbewertung (MBEW)
* Daten
DATA(lv_valuationdata) = VALUE bapi_mbew( val_area  = CONV bwkey( '0001' )  " Bewertungskreis (Tabelle T001K)
                                          val_type  = CONV bwtar_d( 'ABC' ) " Bewertungsarten (Tabelle T149D)
                                          val_class = CONV bklas( '1234' )  " Bewertungsklasse (Tabelle T025)
                                          del_flag  = abap_false            " Löschvormerkung für alle Materialdaten einer Bewertungsart
                                        ).

* Speicherflags
DATA(lv_valuationdatax) = VALUE bapi_mbewx( val_area = CONV bwkey( '0001' )  " Bewertungskreis (Tabelle T001K)
                                            val_type = CONV bwtar_d( 'ABC' ) " Bewertungsarten (Tabelle T149D)
                                            val_class = abap_true            " Bewertungsklasse setzen
                                            del_flag  = abap_true            " Löschvormerkung setzen
                                          ).

* Lagerort (MARD)
* Daten
DATA(lv_storagelocationdata) = VALUE bapi_mard( plant    = CONV werks_d( '0001' ) " Werk (Tabelle T001W)
                                                stge_loc = CONV lgort_d( '1000' ) " Lagerort (Tabelle T001L)
                                                del_flag = abap_false             " Material auf Lagerortebene zum Löschen vormerken
                                              ).

* Speicherflags
DATA(lv_storagelocationdatax) = VALUE bapi_mardx( plant    = CONV werks_d( '0001' ) " Werk (Tabelle T001W)
                                                  stge_loc = CONV lgort_d( '1000' ) " Lagerort (Tabelle T001L)
                                                  del_flag = abap_false             " Löschvormerkung setzen
                                                ).

* Materialkurztext
DATA(it_materialdescription) = VALUE ty_it_materialdescription( ( langu     = sy-langu
                                                                  langu_iso = cl_i18n_languages=>sap1_to_sap2( im_lang_sap1 = sy-langu )
                                                                  matl_desc = 'Schraube 70mm' ) ).

DATA: lv_return TYPE bapiret2.
DATA: it_returnmessages TYPE STANDARD TABLE OF bapi_matreturn2 WITH DEFAULT KEY.

CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
  EXPORTING
    headdata             = lv_headdata
    clientdata           = lv_clientdata
    clientdatax          = lv_clientdatax
    plantdata            = lv_plantdata
    plantdatax           = lv_plantdatax
    valuationdata        = lv_valuationdata
    valuationdatax       = lv_valuationdatax
    storagelocationdata  = lv_storagelocationdata
    storagelocationdatax = lv_storagelocationdatax
  IMPORTING
    return               = lv_return
  TABLES
    materialdescription  = it_materialdescription
    returnmessages       = it_returnmessages.

* Meldungen des Bausteins ausgeben
LOOP AT it_returnmessages ASSIGNING FIELD-SYMBOL(<m>).
  WRITE: / <m>-type,
           <m>-id,
           <m>-number,
           <m>-message,
           <m>-log_no,
           <m>-log_msg_no,
           <m>-message_v1,
           <m>-message_v2,
           <m>-message_v3,
           <m>-message_v4,
           <m>-parameter,
           <m>-row,
           <m>-field,
           <m>-system.
ENDLOOP.

* Fehlerauswertung
* Meldungstyp auswerten, Baustein gibt nur S - Success oder E - Error zurück
IF lv_return-type = 'E'.
* Fehler -> ROLLBACK
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
    IMPORTING
      return = lv_return.

  WRITE: / lv_return-type, lv_return-id, lv_return-message.
ELSE.
* kein Fehler -> COMMIT
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*       wait   = abap_true
    IMPORTING
      return = lv_return.

  WRITE: / lv_return-type, lv_return-id, lv_return-message.
ENDIF.

[ABAP] Konvertierung einstelliges SAP-Sprachenkürzel <-> zweistellige ISO-Sprache

sy-langu -> ISO

* Variante 1 (CONVERSION_EXIT_ISOLA_OUTPUT)
DATA: lv_iso_lang TYPE laiso.

CALL FUNCTION 'CONVERSION_EXIT_ISOLA_OUTPUT'
  EXPORTING
    input  = sy-langu
  IMPORTING
    output = lv_iso_lang.

WRITE: / |{ sy-langu } -> { lv_iso_lang }|.

* Variante 2 (cl_i18n_languages)
DATA(lv_iso_lang) = cl_i18n_languages=>sap1_to_sap2( im_lang_sap1 = sy-langu ).
WRITE: / lv_iso_lang.

ISO -> sy-langu

* Variante 1 (CONVERSION_EXIT_ISOLA_INPUT)
DATA: lv_iso_lang TYPE laiso VALUE 'DE'.
DATA: lv_lang_r3 TYPE sy-langu.

CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
  EXPORTING
    input  = lv_iso_lang
  IMPORTING
    output = lv_lang_r3.

WRITE: / |{ lv_iso_lang } -> { lv_lang_r3 }|.

* Variante 2 (cl_i18n_languages)
DATA(lv_lang_r3) = cl_i18n_languages=>sap2_to_sap1( im_lang_sap2 = 'DE' ).
WRITE: / |{ lv_lang_r3 }|.

[ABAP] MM: Materialdaten lesen

DATA: lv_matnr TYPE bapi_mara_ga-material VALUE '000000001234567890'.
DATA: lv_clientdata TYPE bapi_mara_ga.

DATA: it_materialdescription TYPE STANDARD TABLE OF bapi_makt_ga WITH DEFAULT KEY.
DATA: it_return TYPE STANDARD TABLE OF bapireturn WITH DEFAULT KEY.

CALL FUNCTION 'BAPI_MATERIAL_GET_ALL'
  EXPORTING
    material            = lv_matnr
*   COMP_CODE           =
*   VAL_AREA            =
*   VAL_TYPE            =
*   PLANT               =
*   STGE_LOC            =
*   SALESORG            =
*   DISTR_CHAN          =
*   WHSENUMBER          =
*   STGE_TYPE           =
*   LIFO_VALUATION_LEVEL =
*   KZRFB_ALL           =
  IMPORTING
    clientdata          = lv_clientdata
*   PLANTDATA           =
*   FORECASTPARAMETERS  =
*   PLANNINGDATA        =
*   STORAGELOCATIONDATA =
*   VALUATIONDATA       =
*   WAREHOUSENUMBERDATA =
*   SALESDATA           =
*   STORAGETYPEDATA     =
*   PRTDATA             =
*   LIFOVALUATIONDATA   =
  TABLES
    materialdescription = it_materialdescription
*   UNITSOFMEASURE      =
*   INTERNATIONALARTNOS =
*   MATERIALLONGTEXT    =
*   TAXCLASSIFICATIONS  =
*   EXTENSIONOUT        =
    return              = it_return.

* Fehlermeldungen ausgeben
LOOP AT it_return ASSIGNING FIELD-SYMBOL(<r>).
  WRITE: / <r>-type, <r>-code, <r>-message.
ENDLOOP.

* Materialdaten (MARA)
WRITE: / lv_clientdata-material,
         lv_clientdata-matl_type,
         lv_clientdata-mat_status,
         lv_clientdata-del_flag,
         lv_clientdata-matl_group,
         lv_clientdata-base_uom.

* Materialkurztexte (MAKT)
LOOP AT it_materialdescription ASSIGNING FIELD-SYMBOL(<d>).
  WRITE: / <d>-langu, <d>-langu_iso, <d>-matl_desc.
ENDLOOP.

[ABAP] OO: Lokale Exception-Klasse anlegen, auslösen und behandeln, Nutzung des Interfaces if_t100_message

* http://havliczech.blogspot.com/2014/07/local-exception-class-message.html

* lokale Exceptionklasse
CLASS lcx_my_exception DEFINITION INHERITING FROM cx_static_check FINAL CREATE PUBLIC.
  PUBLIC SECTION.

* von Interface if_t100_message ableiten
    INTERFACES if_t100_message.

    DATA: methname TYPE string READ-ONLY ##NEEDED.
    DATA: msg      TYPE string READ-ONLY ##NEEDED.
    DATA: code     TYPE char2  READ-ONLY ##NEEDED.

    METHODS constructor
      IMPORTING methname TYPE sys_calls-eventname
                msg      TYPE string
                code     TYPE char2.
ENDCLASS.

CLASS lcx_my_exception IMPLEMENTATION.

* Übergabe der Parameter erfolgt im Conructor
  METHOD constructor.
    super->constructor( ).

    me->methname = methname.
    me->msg      = msg.
    me->code     = code.

* Standard Message-Typ verwenden: & & & &
    me->if_t100_message~t100key-msgid = 'SY'.
    me->if_t100_message~t100key-msgno = '499'.
    me->if_t100_message~t100key-attr1 = 'METHNAME'.
    me->if_t100_message~t100key-attr2 = 'MSG'.
    me->if_t100_message~t100key-attr3 = 'CODE'.
    me->if_t100_message~t100key-attr4 = ''.
  ENDMETHOD.

ENDCLASS.

* Testklasse zum Auslösen der Exception
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      div
        IMPORTING i_val1        TYPE f
                  i_val2        TYPE f
        RETURNING VALUE(rv_ret) TYPE f
* Propagieren der Exception
        RAISING   lcx_my_exception.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD div.
    IF i_val2 = '0.0'.
* Wenn durch 0.0 geteilt werden soll: Auslösen der lokalen Exception, zusätzlichen Parameter übergeben
      RAISE EXCEPTION TYPE lcx_my_exception
        EXPORTING
          methname = 'DIV'
          msg      = 'Division durch 0'
          code     = 'DD'.
    ELSE.
      rv_ret = i_val1 / i_val2.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
* durch 0.0 teilen -> Exception wird ausgelöst
      WRITE: / lcl_demo=>div( i_val1 = '1.1'
                              i_val2 = '0.0' ).
* Abfangen der lokalen Exception
    CATCH lcx_my_exception INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] GUI-Toolbar mit statischem Context-Menü, Eventhandling

TYPES: ty_it_events TYPE STANDARD TABLE OF cntl_simple_event WITH DEFAULT KEY.

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      on_function_selected FOR EVENT function_selected OF cl_gui_toolbar
        IMPORTING
            fcode
            sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
* Toolbar: Button oder Menüpunkt geklickt
  METHOD on_function_selected.

* Funktionscode auswerten
    CASE fcode.
      WHEN 'BTN_CLOSE'.
        LEAVE PROGRAM.
      WHEN 'M1'.
      WHEN 'M2'.
    ENDCASE.

* fcode ausgeben
    MESSAGE fcode TYPE 'S'.

  ENDMETHOD.
ENDCLASS.

INITIALIZATION.

* Splitter erzeugen
  DATA(o_splitter) = NEW cl_gui_splitter_container( parent = cl_gui_container=>default_screen
                                                    no_autodef_progid_dynnr = abap_true
                                                    rows = 2
                                                    columns = 1 ).

* Absoluter Modus für Zeilenhöhe
  o_splitter->set_row_mode( mode = cl_gui_splitter_container=>mode_absolute ).

* Höhe absolut 24 Pixel für Splitter oben
  o_splitter->set_row_height( id = 1 height = 24 ).

* Splitter für oberen Container fest und verborgen
  o_splitter->set_row_sash( id    = 1
                            type  = cl_gui_splitter_container=>type_movable
                            value = cl_gui_splitter_container=>false ).

  o_splitter->set_row_sash( id    = 1
                            type  = cl_gui_splitter_container=>type_sashvisible
                            value = cl_gui_splitter_container=>false ).

  DATA(o_container_top) = o_splitter->get_container( row = 1 column = 1 ).
  DATA(o_container_bottom) = o_splitter->get_container( row = 2 column = 1 ).

* Toolbar hoizontal
  DATA(o_tool) = NEW cl_gui_toolbar( parent       = o_container_top
                                     display_mode = cl_gui_toolbar=>m_mode_horizontal ).

* Eventtypten müssen gesondert registriert werden
  DATA(it_events) = VALUE ty_it_events( ( eventid    = cl_gui_toolbar=>m_id_function_selected
                                          appl_event = abap_true ) ).

  o_tool->set_registered_events( events = it_events ).

* Toolbar-Buttons und Menüs hinzufügen
* Buttontypen sind in Typgruppe CNTB definiert
  o_tool->add_button( fcode       = 'BTN_MENU'
                      icon        = icon_activate
                      butn_type   = cntb_btype_menu
                      text        = 'Menü'
                      quickinfo   = 'Menü anzeigen'
                      is_checked  = abap_false
                      is_disabled = abap_false ).

* statisches Kontextmenü für Button "BTN_MENU" erstellen
  DATA(o_menu) = NEW cl_ctmenu( ).
  o_menu->add_function( fcode   = 'M1'
                        checked = abap_false
                        text    = 'Punkt1' ).

  o_menu->add_function( fcode   = 'M2'
                        checked = abap_false
                        text    = 'Punkt2' ).

* statisches Kontextmenü mit Button verknüpfen, Zuordnung erfolgt über den Namen
* daher muss "function" gleich "fcode" des Menü-Buttons sein, sonst Exception
  DATA(it_ctxmenu) = VALUE ttb_btnmnu( ( function = 'BTN_MENU'
                                         ctmenu   = o_menu ) ).

* siehe auch Methode "set_static_ctxmenu"
  o_tool->assign_static_ctxmenu_table( it_ctxmenu ).

* Separator
  o_tool->add_button( fcode       = ''
                      icon        = ''
                      butn_type   = cntb_btype_sep
                      text        = ''
                      quickinfo   = ''
                      is_checked  = abap_false
                      is_disabled = abap_false ).

* Schließen-Button
  o_tool->add_button( fcode       = 'BTN_CLOSE'
                      icon        = icon_close
                      butn_type   = cntb_btype_button
                      text        = 'Schließen'
                      quickinfo   = 'Schließen'
                      is_checked  = abap_false
                      is_disabled = abap_false ).

* Eventhandler registrieren
  SET HANDLER lcl_events=>on_function_selected FOR o_tool.

* im unteren Splitter Beispieldaten anzeigen
  DATA: it_sflight TYPE STANDARD TABLE OF sflight.

  SELECT * FROM sflight INTO TABLE @it_sflight.

  DATA: o_salv TYPE REF TO cl_salv_table.

  cl_salv_table=>factory( EXPORTING
                            r_container  = o_container_bottom
                          IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_sflight ).

  o_salv->get_functions( )->set_all( ).
  o_salv->display( ).

* leere Standard-Toolbar ausblenden
  cl_abap_list_layout=>suppress_toolbar( ).

* Ausgabe von cl_gui_container=>default_screen erzwingen
  WRITE: space.

[ABAP] Minimum/Maximum eines Datentyps ermitteln

* Variable deklarieren
DATA: lv_p TYPE p LENGTH 5 DECIMALS 2.

* Minimumwert ermitteln
DATA(lv_min) = cl_abap_exceptional_values=>get_min_value( lv_p ).
ASSIGN lv_min->* TO FIELD-SYMBOL(<min>).
IF <min> IS ASSIGNED.
  WRITE: / <min>.
ENDIF.

* Maximumwert ermitteln
DATA(lv_max) = cl_abap_exceptional_values=>get_max_value( lv_p ).
ASSIGN lv_max->* TO FIELD-SYMBOL(<max>).
IF <max> IS ASSIGNED.
  WRITE: / <max>.
ENDIF.