[ABAP] Ermittlung der Anmeldedaten incl. des Rechnernamens

* Ermittlung der Anmeldedaten incl. des Rechnernamens
TRY.
    DATA(lv_server_info) = NEW cl_server_info( ).

* Server related information, Liste aller Sessions
*  SERVER_NAME Name des Applikations-Servers
*  LOGON_HDL Anmeldungs-Schlüssel
*  LOGON_ID Anmeldungs-ID
*  SESSION_HDL Backend-Session-Handle
*  USER_NAME Benutzer-ID
*  LOGON_TYPE Typ der Anmeldung
*  LOGON_SUB_TYPE Zusatzinformation zum Anmeldungs-Typ
*  TENANT Name des Mandanten
*  REQUEST_TIME Zeit-Stempel (Anzahl Sekunden seit dem 1.1.1979)
*  MEMORY In Extended Memory (EM) belegter Speicher
*  LOCATION_INFO Informationen über den Client-Rechner des Benutzers
*  APPLICATION Anwendung
*  APPLICATION_INFO Zusatzinformationen zur Anwendung
*  RFC_HDL Conversation-ID
*  RFC_TYPE RFC Typ
*  TRACE Trace-Level
*  PRIORITY Priorität
*  MEMORY_BRUTTO In Extended Segments (ES) belegter Speicher
*  MEMORY_ABAP Von der ABAP-VM belegter Speicher
*  MEMORY_HYPER Größe des Session übergreifenden Speichers
*  MEMORY_HEAP In Prozess lokalem Heap belegter Speicher
*  OPEN_TASKS Offene Aufgaben (open Tasks) dieser Session
*  ACT_PROGRAM Name des Hauptprogrammes
*  WEBSOCKET_HANDLE WebSocket-Handle

    DATA(it_session_list) = lv_server_info->get_session_list( tenant = sy-mandt ).

    cl_demo_output=>write_data( it_session_list ).
* 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       = 'CL_SERVER_INFO'
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.

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

[ABAP] Neues SAP-Fenster (Modus) öffnen und wieder schließen

* Bsp.: Transaktion SU3
PARAMETERS: p_tcode TYPE tcode DEFAULT 'SU3'.

START-OF-SELECTION.

  DATA: lv_mode TYPE sy-index.

* Eröffnen eines neuen externen Modus
  CALL FUNCTION 'TH_CREATE_MODE'
    EXPORTING
      transaktion    = p_tcode
    IMPORTING
      mode           = lv_mode
    EXCEPTIONS
      max_sessions   = 1
      internal_error = 2
      no_authority   = 3
      OTHERS         = 4.

  IF sy-subrc = 0.
    WRITE: / 'Transaktion:', p_tcode.
    WRITE: / 'Modus:', lv_mode.

    DATA: ret TYPE string.

    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar              = 'Modus'
        text_question         = 'Modus wieder schließen?'
        display_cancel_button = abap_false
      IMPORTING
        answer                = ret.

    CASE ret.
      WHEN '1'.
* Löschen eines externen Modus
        CALL FUNCTION 'TH_DELETE_MODE'
          EXPORTING
            mode = lv_mode.
      WHEN OTHERS.
    ENDCASE.
  ENDIF.

[ABAP] Installierte Softwarekomponenten ermitteln

DATA: it_comptab TYPE STANDARD TABLE OF cvers_sdu WITH DEFAULT KEY.

* Determines the installed software components
CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS'
  TABLES
    tt_comptab       = it_comptab
  EXCEPTIONS
    no_release_found = 1
    OTHERS           = 2.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_comptab ).

* 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        = |Softwarekomponenten|
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).

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

[ABAP] Variablen vom Typ XSTRING zusammenfügen (addieren)

Variante 1 (einzelne XSTRINGS)

* HEX-Daten (Beispiel)
DATA(lv_xstring) = CONV xstring( 'A1B1C1' ).
DATA(lv_xstring2) = CONV xstring( 'A2B2C2' ).

* XSTRING + XSTRING
CONCATENATE lv_xstring lv_xstring2 INTO lv_xstring IN BYTE MODE.

* Testausgabe
WRITE: lv_xstring.

Variante 2 (eine Tabelle mit XSTRINGS)

TYPES: ty_it_hex TYPE STANDARD TABLE OF xstring WITH DEFAULT KEY.

* Tabelle mit binären Beispieldaten
DATA(it_hex_data) = VALUE ty_it_hex(
                                     ( CONV xstring( 'AABBCC' ) )
                                     ( CONV xstring( 'DDEEFF' ) )
                                     ( CONV xstring( '001122' ) )
                                     ( CONV xstring( '334455' ) )
                                     ( CONV xstring( '667788' ) )
                                   ).

* Zeilen der Tabelle zu einem XSTRING zusammenfügen
CONCATENATE LINES OF it_hex_data INTO DATA(lv_xstring) IN BYTE MODE.

* Testausgabe
WRITE: lv_xstring.

[ABAP] Zustand einer SAP-Transaktion prüfen

* Transaktions-ID (LUW-Key)
WRITE: / cl_system_transaction_state=>get_sap_luw_key( ).

* Programm ist im Verbucher (1 = wahr, 0 = falsch)
CASE cl_system_transaction_state=>get_in_update_task( ).
  WHEN 1.
    WRITE: / 'Update task is active.'.
  WHEN 0.
    WRITE: / 'Not in update task.'.
ENDCASE.

* lokale Verbuchung ist eingeschaltet (1 = wahr, 0 = falsch)
CASE cl_system_transaction_state=>get_update_task_local( ).
  WHEN 1.
    WRITE: / 'Local update task is switched on.'.
  WHEN 0.
    WRITE: / 'Local update task is switched off.'.
ENDCASE.

* in ON-COMMIT/ON-ROLLBACK (1 = wahr, 0 = falsch)
CASE cl_system_transaction_state=>get_on_end_of_transaction( ).
  WHEN 1.
    WRITE: / 'In ON-COMMIT/ON-ROLLBACK.'.
  WHEN 0.
    WRITE: / 'Nicht in ON-COMMIT/ON-ROLLBACK.'.
ENDCASE.

* in ON-COMMIT (1 = wahr, 0 = falsch)
CASE cl_system_transaction_state=>get_on_commit( ).
  WHEN 1.
    WRITE: / 'In ON-COMMIT.'.
  WHEN 0.
    WRITE: / 'Nicht in ON-COMMIT.'.
ENDCASE.

* in ON-ROLLBACK (1 = wahr, 0 = falsch)
CASE cl_system_transaction_state=>get_on_rollback( ).
  WHEN 1.
    WRITE: / 'In ON-ROLLBACK.'.
  WHEN 0.
    WRITE: / 'Nicht in ON-ROLLBACK.'.
ENDCASE.

[ABAP] Worker Agent Infos vom Kernel holen

* Worker agent information
* ab Kernel 7.42
DATA(o_worker_info) = NEW cl_worker_info( ).

cl_demo_output=>write_data( o_worker_info->server_name ).

cl_demo_output=>write_data( o_worker_info->start_time ).

* Get process Id of the agent
cl_demo_output=>write_data( o_worker_info->get_pid( ) ).

* Nr des Work Prozess
cl_demo_output=>write_data( o_worker_info->index ).

* Get type of worker agent
DATA(worker_type) = o_worker_info->get_worker_type( ).

CASE worker_type.
  WHEN if_worker_types=>spool.
    cl_demo_output=>write_data( 'SPOOL' ).
  WHEN if_worker_types=>nowp.
    cl_demo_output=>write_data( 'NOWP' ).
  WHEN if_worker_types=>invalid.
    cl_demo_output=>write_data( 'INVALID' ).
  WHEN if_worker_types=>dialog.
    cl_demo_output=>write_data( 'DIALOG' ).
  WHEN if_worker_types=>update.
    cl_demo_output=>write_data( 'UPDATE' ).
  WHEN if_worker_types=>enqueue.
    cl_demo_output=>write_data( 'ENQUEUE' ).
  WHEN if_worker_types=>batch.
    cl_demo_output=>write_data( 'BATCH' ).
  WHEN if_worker_types=>update2.
    cl_demo_output=>write_data( 'UPDATE2' ).
ENDCASE.

* Get state of worker agent
DATA(worker_state) = o_worker_info->get_state( ).

CASE worker_state.
  WHEN if_worker_states=>worker_state_free.
    cl_demo_output=>write_data( 'FREE' ).
  WHEN if_worker_states=>worker_state_hold.
    cl_demo_output=>write_data( 'HOLD' ).
  WHEN if_worker_states=>worker_state_killed.
    cl_demo_output=>write_data( 'KILLED' ).
  WHEN if_worker_states=>worker_state_new.
    cl_demo_output=>write_data( 'NEW' ).
  WHEN if_worker_states=>worker_state_restricted.
    cl_demo_output=>write_data( 'RESTRICTED' ).
  WHEN if_worker_states=>worker_state_run.
    cl_demo_output=>write_data( 'RUN' ).
  WHEN if_worker_states=>worker_state_shutdown.
    cl_demo_output=>write_data( 'SHUTDOWM' ).
  WHEN if_worker_states=>worker_state_wait.
    cl_demo_output=>write_data( 'WAIT' ).
ENDCASE.

CASE o_worker_info->type.
  WHEN if_agent_types=>dispatcher.
    cl_demo_output=>write_data( 'DISPATCHER' ).
  WHEN if_agent_types=>invalid.
    cl_demo_output=>write_data( 'INVALID' ).
  WHEN if_agent_types=>gateway.
    cl_demo_output=>write_data( 'GATEWAY' ).
  WHEN if_agent_types=>icman.
    cl_demo_output=>write_data( 'ICMAN' ).
  WHEN if_agent_types=>terminal.
    cl_demo_output=>write_data( 'TERMINAL' ).
  WHEN if_agent_types=>message_server.
    cl_demo_output=>write_data( 'MESSAGE_SERVER' ).
  WHEN if_agent_types=>worker.
    cl_demo_output=>write_data( 'WORKER' ).
  WHEN if_agent_types=>ext_event.
    cl_demo_output=>write_data( 'EXT_EVENT' ).
  WHEN if_agent_types=>dp_monitor.
    cl_demo_output=>write_data( 'DP_MONITOR' ).
  WHEN if_agent_types=>ic_monitor.
    cl_demo_output=>write_data( 'IC_MONITOR' ).
ENDCASE.

* Write text into developer trace
*cl_worker_info=>write_trace( ).

* Get attribues of this worker
DATA(it_worker_attr) = o_worker_info->get_attributes( ).

cl_demo_output=>write_data( it_worker_attr ).

* 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        = 'Worker Info'
                              html_string  = lv_html
                              container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] Eintrag ins Syslog schreiben

Variante 1 (RSLG_WRITE_SYSLOG_ENTRY)

* https://wiki.scn.sap.com/wiki/display/SI/CCMS+Syslog

* Transaktionen:

* SE92 (Pflege von SysLog-Meldungen)
* SM21 (Systemprotokoll)
* RZ20 (CCMS Monitoring)

* Programme:

* RSLG0014 (Testrahmen für FUNCTION 'RSLG_WRITE_SYSLOG_ENTRY')

* Tabellen:

* TSL1D (SysLog-Meldung (ehemals 100S bzw. TSL01))
* TSL1T (SysLog: Meldungstexte (ehemals 100S, TSL01))
* TSL2D (SysLog: Klassifikationskennzeichen für Meldungen)
* TSL2T (SysLog: Namen der Meldungsklassen)
* TSL3D (SysLog: Typen von SysLog-Einträgen)
* TSL3T (SysLog: Namen der Typen von SysLog-Einträgen)
* SL_MESSAGE_AREA
* SL_MESSAGE_SUBID - Die Meldungskennung. Sie hat das Format 2+1. Meldungen werden ueber Transaktion SE92 gepflegt.
*                    Dort wird auch erklärt, dass man abgezählte Zeichen oder Worte in den Meltungstext einsetzen lassen kann.
* DATA_AREA        - Variable Daten, die abgezählt in die Meldung an Stellen wie '&5' (oder auch '$$$$$') eingesetzt werden. 64 Zeichen.
* DATA_STRUCTURE   - Kennbuchstaben fuer die Struktur von 'DATA_AREA'. Der Buchstabe wird in der C-Datei 'rslg.h' definiert und auch in Tabelle TSL3T erklärt.
*                    Im Zweifel ein Leerzeichen verwenden.
* DATA_WORD        - Variable Worte, die in die Meldung an den Stellen '&A', '&B' usw. eingesetzt werden sollen.
*                    Worte haben keine Struktur; also DATA_STRUCTURE nicht besetzen.
*                    Achtung: dieser Funktionsbaustein entfernt Leerzeichen, falls in den Worten welche enthalten sein sollten.
*                    Dieser Funktionsbaustein erlaubt keine Mischung zwischen Wort-Variablen und Struktur-Variablen.
*                    Also entweder 'DATA_AREA' oder 'DATA_WORD1',...
* PRE_PARAM_j      - Variable Vorabparameter, die in die Meldung an den Stellen '&a', '&b' usw. eingesetzt werden sollen.
* PRE_PARAM_LONG   - Langer variabler Vorabparameter, der in die Meldung an einer Stelle '&a&b&c&d' o.ä. eingesetzt werden soll.
*                    Es ist nicht möglich, einzelne Vorabparameter mit einem langen Vorabparameter zu mischen.
*                    Also entweder 'PRE_PARAM_LONG' oder 'PRE_PARAM_A',... oder gar keine Vorabparameter.
*
* indirekter Aufruf des SYSTEM-CALLs 'C_WRITE_SYSLOG_ENTRY'

* Syslog-Meldungstexte siehe Tabelle TSL1D
* AREA  SUBID   Pattern
* ------------------------------------------
* C4    1       Anwendung &A warnt: &B &C &D &E
* W1    0       &A

CALL FUNCTION 'RSLG_WRITE_SYSLOG_ENTRY'
  EXPORTING
    sl_message_area    = 'C4'
    sl_message_subid   = '1'
    data_word1         = 'Testanwendung'  " &A
    data_word2         = '01'             " &B
    data_word3         = 'E'              " &C
    data_word4         = 'Fehler'         " &D
    data_word5         = '1234'           " &E
  EXCEPTIONS
    data_missing       = 1
    data_words_problem = 2
    other_problem      = 3
    pre_params_problem = 4
    OTHERS             = 5.

IF sy-subrc = 0.

ENDIF.

Variante 2 (SYSTEM-CALL)

* direkter Aufruf des SYSTEM-CALLs
CALL 'C_WRITE_SYSLOG_ENTRY'
  ID 'TYP'  FIELD ' '
  ID 'KEY'  FIELD 'C41' " Ausgabe Text: "Anwendung &A warnt: &B &C &D &E"
  ID 'DATA' FIELD 'Testanwendung &01 &E &Fehler &1234 &'.

IF sy-subrc = 0.

ENDIF.