[ABAP] Profilparameter auslesen

Variante 1 (SXPG_PROFILE_PARAMETER_GET)

DATA: lv_par TYPE tpfyvalue-value.
DATA: lv_ret TYPE i.

CALL FUNCTION 'SXPG_PROFILE_PARAMETER_GET'
  EXPORTING
    parameter_name  = 'DIR_GLOBAL'
  IMPORTING
    parameter_value = lv_par
    ret             = lv_ret.

IF lv_ret = 0.
  WRITE: / lv_par.
ELSE.
  WRITE: / 'Access not allowed.'.
ENDIF.

Variante 2 (TH_GET_PROFILE_VALUE)

DATA: lv_par_value type tpfyvalue-value.

CALL FUNCTION 'TH_GET_PROFILE_VALUE'
  EXPORTING
    name           = 'DIR_GLOBAL'
    server         = space
  IMPORTING
    value          = lv_par_value
  EXCEPTIONS
    internal_error = 1
    too_large      = 2
    not_found      = 3
    OTHERS         = 4.

IF sy-subrc = 0.
  WRITE: / lv_par_value.
ENDIF.

[ABAP] MIME-Repository: logische Objekt-ID, physiche Object-ID, Berechtigungen

DATA: lv_loio	TYPE skwf_io.
DATA: lv_is_folder TYPE boole_d.

DATA(o_mime_rep) = cl_mime_repository_api=>get_api( ).

TRY.
* logische IO zu MIME-Objekt holen
    o_mime_rep->get_io_for_url( EXPORTING
                                  i_url       = '/SAP/PUBLIC/xyz.jpg'
                                IMPORTING
                                  e_is_folder = lv_is_folder
                                  e_loio      = lv_loio ).

    WRITE: / lv_is_folder.
    WRITE: / lv_loio.

    DATA: lv_error TYPE skwf_error.
    DATA: it_phios TYPE STANDARD TABLE OF skwf_io WITH DEFAULT KEY.

* physical IOs zu log. IO holen
    CALL FUNCTION 'SKWF_LOIO_ALL_PHIOS_GET'
      EXPORTING
        loio  = lv_loio
      IMPORTING
        error = lv_error
      TABLES
        phios = it_phios.

    LOOP AT it_phios ASSIGNING FIELD-SYMBOL(<p>).

      DATA: lv_err TYPE skwf_error.

* Berechtigungen zu physical IO prüfen
      CALL FUNCTION 'SKWF_AUTH_OBJECT_CHECK'
        EXPORTING
          activity = skwfa_c_act_read
          object   = <p>
        IMPORTING
          error    = lv_err.

      IF lv_err-type = 'E'.
      ELSE.
        WRITE: / <p>.
      ENDIF.

    ENDLOOP.

  CATCH cx_root INTO DATA(e).
    WRITE: / e->get_text( ).
ENDTRY.

[ABAP] Zeit zu Zeit und Datum rechnen

DATA: lv_sdate TYPE d.
DATA: lv_stime TYPE t.

* akt. Datum und Zeit
lv_sdate = sy-datum.
lv_stime = sy-uzeit.

* 10:00:00Uhr
DATA: lv_addtime TYPE t VALUE '100000'.

DATA: lv_edate TYPE d.
DATA: lv_etime TYPE t.

START-OF-SELECTION.

* Zeitwerte addieren
  CALL FUNCTION 'C14B_ADD_TIME'
    EXPORTING
      i_starttime = lv_stime
      i_startdate = lv_sdate
      i_addtime   = lv_addtime
    IMPORTING
      e_endtime   = lv_etime
      e_enddate   = lv_edate.

  WRITE: / lv_sdate, lv_stime.
  WRITE: / lv_edate, lv_etime.

[ABAP] Testen, ob eine RFC-Verbindung vorhanden ist und funktioniert

PARAMETERS: p_rfc TYPE rfcdest.

START-OF-SELECTION.

* Nachschauen, ob RFC-Verbindung vorhanden
  SELECT SINGLE d~rfcdest, d~rfctype, d~rfcoptions, t~rfcdoc1, t~rfcdoc2, t~rfcdoc3
    INTO @DATA(lv_rfc)
    FROM rfcdes AS d
    INNER JOIN rfcdoc AS t ON ( d~rfcdest = t~rfcdest )
    WHERE d~rfcdest = @p_rfc
      AND t~rfclang = @sy-langu.

  IF sy-subrc = 0.
    WRITE: / '[', p_rfc, ']', lv_rfc-rfcdest, lv_rfc-rfctype, lv_rfc-rfcoptions, lv_rfc-rfcdoc1, lv_rfc-rfcdoc2, lv_rfc-rfcdoc3.

    DATA: lv_err_msg TYPE char255.
* wenn RFC-Verbindung vorhanden -> anpingen und Systemfehler (Dumps) abfangen
    CALL FUNCTION 'RFC_PING' DESTINATION p_rfc
      EXCEPTIONS
        system_failure        = 1 MESSAGE lv_err_msg
        communication_failure = 2 MESSAGE lv_err_msg
        OTHERS                = 3.

    IF sy-subrc = 0.
* RFC-Ping ok
      WRITE: / '[', p_rfc, '] RFC-Aufruf erfolgreich.'.
    ELSE.
* RFC-Ping fehlerhaft
      WRITE: / '[', p_rfc, '] RFC-Aufruf gescheitert:', lv_err_msg.
    ENDIF.
  ELSE.
* RFC-Verbindung nicht vorhanden
    WRITE: / '[', p_rfc, '] RFC-Verbindung nicht vorhanden.'.
  ENDIF.

[ABAP] SELECT-OPTIONS: Einschränkung der Mehrfachauswahl

* https://www.consolut.com/s/sap-ides-zugriff/d/e/doc/E-SELECT_OPTIONS_RESTRICT/
* http://saptechnical.com/Tips/ABAP/restrict.htm

DATA: lv_matnr TYPE matnr.
SELECT-OPTIONS: so_matnr FOR lv_matnr.

INITIALIZATION.
* Name einer Optionenliste für SELECT-OPTIONS-Restriktionen
  DATA(lv_opt_list) = 'OPT_LIST'.

* Optionenliste
  DATA(it_options) = VALUE sscr_opt_list_tab( ( name       = lv_opt_list
                                                options-eq = abap_true ) ).

* Zuweisungen
  DATA(it_assignment) = VALUE sscr_ass_tab( ( kind    = 'S'                " A(ll), B(lock), S(elect-Option)
                                              name    = 'SO_MATNR'         " Blockname, maximal 20 Zeichen
                                              sg_main = 'I'                " (only) I, SPACE = both
                                              op_main = lv_opt_list ) ).

* Einschränkungen für die SELECT-OPTIONS
  DATA(it_restrictions) = VALUE sscr_restrict( opt_list_tab = it_options
                                               ass_tab      = it_assignment ).

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = it_restrictions
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

  IF sy-subrc = 0.

  ENDIF.

[ABAP] Zugriff auf Elemente des Selektionsbildes (dirty assign)

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (8) lbl1 FOR FIELD p_name.
PARAMETERS: p_name TYPE string LOWER CASE.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
* "dirty assign" über Namen in Großbuchstaben
  ASSIGN ('LBL1') TO FIELD-SYMBOL(<l>).
  <l> = 'Eingabe:'.

* "dirty assign" über Namen in Großbuchstaben
  ASSIGN ('P_NAME') TO FIELD-SYMBOL(<p>).
  <p> = 'Test'.

START-OF-SELECTION.
  WRITE: / <l>, <p>.

[ABAP] Klasse zur Darstellung von Nachrichtentexten in einem SALV-Grid in einem Popup-Dialog

CLASS lcl_popup_msg_box DEFINITION.

  PUBLIC SECTION.
* Typ Textzeile
    TYPES: BEGIN OF ty_textline,
             idx  TYPE rspos,
             text TYPE bapi_msg,
           END OF ty_textline.

    TYPES: ty_it_messagetab TYPE STANDARD TABLE OF ty_textline WITH DEFAULT KEY.

* Typ Button-Event
    TYPES: ty_it_events TYPE STANDARD TABLE OF cntl_simple_event WITH DEFAULT KEY.

* Anzeige des Popups
    CLASS-METHODS show
      IMPORTING
                i_window_title   TYPE string
                i_window_top     TYPE i
                i_window_left    TYPE i
                i_window_width   TYPE i
                i_window_height  TYPE i
                i_show_functions TYPE boolean
                i_it_messages    TYPE ty_it_messagetab
      RETURNING VALUE(rv_ok)     TYPE boolean.

  PRIVATE SECTION.

* Button Funktionskonstanten
    CONSTANTS: co_btn_ok TYPE ui_func VALUE 'BTN_OK'.
    CONSTANTS: co_btn_cancel TYPE ui_func VALUE 'BTN_CANCEL'.

* Message-Tabelle
    CLASS-DATA: it_messages TYPE ty_it_messagetab.

* GUI-Objekte
    CLASS-DATA: o_cnt TYPE REF TO cl_gui_dialogbox_container.
    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.
    CLASS-DATA: o_split TYPE REF TO cl_gui_splitter_container.
    CLASS-DATA: o_tool TYPE REF TO cl_gui_toolbar.
    CLASS-DATA: gv_retval TYPE boolean VALUE abap_false.

* on_close-Handler
    CLASS-METHODS:
      on_close FOR EVENT close OF cl_gui_dialogbox_container
        IMPORTING
            sender.
* on_function_selected Handler
    CLASS-METHODS:
      on_function_selected FOR EVENT function_selected OF cl_gui_toolbar
        IMPORTING
            fcode
            sender.

ENDCLASS.

CLASS lcl_popup_msg_box IMPLEMENTATION.

  METHOD show.

    it_messages = i_it_messages.

* Container für GUI-Elemente
    o_cnt = NEW #( parent = cl_gui_container=>default_screen
                   caption = |{ i_window_title }|
                   top = i_window_top
                   left = i_window_left
                   width = i_window_width
                   height = i_window_height
                   no_autodef_progid_dynnr = abap_true
                 ).

* on_close-Handler setzen
    SET HANDLER on_close FOR o_cnt.

* Splitter für Grid und Toolbar
    o_split = NEW #( parent = o_cnt
                     no_autodef_progid_dynnr = abap_true
                     rows = 2
                     columns = 1 ).

* Unteren Splitterbereich setzen
    o_split->set_row_sash( id    = 2
                           type  = cl_gui_splitter_container=>type_movable
                           value = cl_gui_splitter_container=>false ).

    o_split->set_row_sash( id    = 2
                           type  = cl_gui_splitter_container=>type_sashvisible
                           value = cl_gui_splitter_container=>false ).

    o_split->set_row_height( id = 2 height = 8 ).

* Oberen und unteren Splittercontainer holen
    DATA(o_container_top)    = o_split->get_container( row = 1 column = 1 ).
    DATA(o_container_bottom) = o_split->get_container( row = 2 column = 1 ).
* Toolbar für Buttons erzeugen
    DATA(o_tool) = NEW cl_gui_toolbar( parent       = o_container_bottom
                                       display_mode = cl_gui_toolbar=>m_mode_horizontal
                                       align_right  = 1 ).

* Toolbarevents
    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 ).

* Buttons + Separator einfügen
    o_tool->add_button( fcode       = co_btn_ok
                        icon        = icon_okay
                        butn_type   = cntb_btype_button
                        text        = 'Ok'
                        quickinfo   = 'Ok'
                        is_checked  = abap_false
                        is_disabled = abap_false ).

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

    o_tool->add_button( fcode       = co_btn_cancel
                        icon        = icon_cancel
                        butn_type   = cntb_btype_button
                        text        = 'Abbruch'
                        quickinfo   = 'Abbruch'
                        is_checked  = abap_false
                        is_disabled = abap_false ).

* on_function_selected-Handler
    SET HANDLER on_function_selected FOR o_tool.

* SALV-Grid im oberen Splitter einfügen
    cl_salv_table=>factory( EXPORTING
                              r_container  = o_container_top
                            IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_messages ).

* Eigenschaften SALV-Grid
    o_salv->get_columns( )->set_optimize( abap_true ).
    o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
    IF i_show_functions = abap_true.
      o_salv->get_functions( )->set_all( ).
    ENDIF.
    o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).
    o_salv->display( ).

* Dummy-Screen aufrufen und somit cl_gui_container=>default_screen erzeugen -> Trägerdynpro für cl_gui_dialogbox_container
    CALL SCREEN 100.

* nach Buttonclick noch die Ergebnisrückgabe
    rv_ok = gv_retval.
  ENDMETHOD.

  METHOD on_close.

* cl_gui_dialogbox_container bei Klick auf Schließen-Kreuz schließen
    IF sender IS NOT INITIAL.
      sender->free( ).
    ENDIF.

* Zum aufrufenden Dynpro zurück
    LEAVE TO SCREEN 0.

  ENDMETHOD.

* Button ermitteln -> Reaktion -> Setzen des Rückgabewertes beim Schließen des Popups
  METHOD on_function_selected.
    CASE fcode.
      WHEN co_btn_ok.
        gv_retval = abap_true.
      WHEN co_btn_cancel.
        gv_retval = abap_false.
    ENDCASE.

* Popup-Fenster schließen
    on_close( o_cnt ).
  ENDMETHOD.
ENDCLASS.

* Dummy-Screen für cl_gui_container=>default_screen deklarieren
SELECTION-SCREEN BEGIN OF SCREEN 100.
SELECTION-SCREEN END OF SCREEN 100.

START-OF-SELECTION.

* Nachrichtentabelle erzeugen
  DATA(it_msg) = VALUE lcl_popup_msg_box=>ty_it_messagetab( ( idx = 1 text = 'Nachricht 1' )
                                                            ( idx = 2 text = 'Nachricht 2' )
                                                          ).

* Popup mit Nachrichten anzeigen
  IF abap_true = lcl_popup_msg_box=>show( EXPORTING
                                            i_window_title   = 'Meldungen'
                                            i_window_top     = 100
                                            i_window_left    = 100
                                            i_window_width   = 240
                                            i_window_height  = 240
                                            i_show_functions = abap_false
                                            i_it_messages    = it_msg ).
    WRITE: / 'OK.'.
  ELSE.
    WRITE: / 'Abbruch.'.
  ENDIF.

[ABAP] Struktur -> JSON

Variante 1 (/ui2/cl_json)

* ABAP-Typ
TYPES: BEGIN OF ty_struct,
         name TYPE string,
         age  TYPE i,
         size TYPE f,
       END OF ty_struct.

* Test-Daten
DATA(lv_struc) = VALUE ty_struct( name = 'Udo' age = 25 size = '1.5' ).

* Struct -> JSON
* {"name":"Udo","age":25,"size":1.5000000000000000E+00}
DATA(lv_json_str) = /ui2/cl_json=>serialize( data        = lv_struc
                                             pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).

WRITE: / lv_json_str.

Variante 2 (/ui2/cl_abap2json)

* ABAP-Typ
TYPES: BEGIN OF ty_struct,
         name TYPE string,
         age  TYPE i,
         size TYPE f,
       END OF ty_struct.

* Test-Daten
DATA(lv_struc) = VALUE ty_struct( name = 'Udo' age = 25 size = '1.5' ).

* Struct -> JSON
DATA(o_conv) = NEW /ui2/cl_abap2json( ).
DATA(lv_json_str) = o_conv->struc2json( iv_struc = lv_struc ).

WRITE: / lv_json_str.