[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.

[ABAP] Objekte über die Systemklasse CL_OS_STATE clonen (kopieren)

* die Klasse, deren Objekte geclont werden sollen, muss von CL_OS_STATE
* ableiten, damit das Interface IF_OS_CLONE implementiert wird
CLASS lcl_clone_test DEFINITION INHERITING FROM cl_os_state.

  PUBLIC SECTION.
* ALIAS für die Implementierung von cl_os_state=>if_os_clone~clone( )
* ruft SYSTEM-CALL OBJMGR CLONE me TO result.
    ALIASES: clone FOR if_os_clone~clone.

    METHODS:
      constructor
        IMPORTING i_text TYPE string.
    METHODS:
      get_text
        RETURNING VALUE(rv_text) TYPE string.

  PRIVATE SECTION.
    DATA:
      gv_text TYPE string.

ENDCLASS.

CLASS lcl_clone_test IMPLEMENTATION.

  METHOD constructor.
* Konstruktor der Basisklasse CL_OS_STATE rufen
    super->constructor( ).
    gv_text = i_text.
  ENDMETHOD.

  METHOD get_text.
    rv_text = gv_text.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  DATA(o_src) = NEW lcl_clone_test( 'SRC' ).
  WRITE: / o_src->get_text( ).

* Objekt O_SRC clonen, Rückgabe von REF TO object nach LCL_CLONE_TEST explizit casten
* es wird ein neues, zu O_SRC identisches, Objekt erzeugt
  DATA(o_clone) = CAST lcl_clone_test( o_src->clone( ) ).
  WRITE: / o_clone->get_text( ).

[ABAP] Code der aufrufenden Transaktion ausgeben

Variante 1 (GET_PARAMETER_TCOD)

DATA: lv_ctc TYPE sy-tcode.

* liefert Namen der gestarteten/aufgerufenen Parameter-Transaktion
CALL FUNCTION 'GET_PARAMETER_TCOD'
IMPORTING
  ptcod = lv_ctc.
  
WRITE: / lv_ctc.

Variante 2 (SYTEM_CALL)

DATA: lv_calling_tcode TYPE sy-tcode.

CALL 'GET_PARAM_TCOD' ID 'PTCOD' FIELD lv_calling_tcode.

WRITE: / lv_calling_tcode.

[ABAP] Höhe und Breite des aktuellen SAP-Fensters ermitteln

Variante 1 (sy-scols / sy-srows)

* Zeilen und Spalten in Pixel umrechnen
DATA(lv_x_metric) = cl_gui_cfw=>compute_metric_from_dynp( metric = cl_gui_control=>metric_pixel
                                                          x_or_y = 'X'
                                                          in = sy-scols ).

DATA(lv_y_metric) = cl_gui_cfw=>compute_metric_from_dynp( metric = cl_gui_control=>metric_pixel
                                                          x_or_y = 'Y'
                                                          in = sy-srows ).

WRITE: / |X: { lv_x_metric }|.
WRITE: / |Y: { lv_y_metric }|.

Variante 2 (Kernel-Methode ‘GET_WINDOW_DATA’)

DATA: lv_begin_r TYPE i.
DATA: lv_end_r TYPE i.

DATA: lv_begin_c TYPE i.
DATA: lv_end_c TYPE i.

* Kernel-Methode 'GET_WINDOW_DATA' aufrufen, gibt Position des Fensters in Dynprozeilen und -spalten zurück
CALL 'GET_WINDOW_DATA' ID 'BEGROW' FIELD lv_begin_r ID 'BEGCOL' FIELD lv_begin_c ID 'ENDROW' FIELD lv_end_r ID 'ENDCOL' FIELD lv_end_c.

WRITE: / |From col: { lv_begin_c } to row: { lv_end_c }|.
WRITE: / |From row: { lv_begin_r } to row: { lv_end_r }|.

* Zeilen und Spalten gesamt ausrechnen
DATA(lv_cols) = lv_end_c - lv_begin_c.
DATA(lv_rows) = lv_end_r - lv_begin_r.

WRITE: / |Cols: { lv_cols }|.
WRITE: / |Rows: { lv_rows }|.

* Zeilen und Spalten in Pixel umrechnen
DATA(lv_x_metric) = cl_gui_cfw=>compute_metric_from_dynp( metric = cl_gui_control=>metric_pixel
                                                          x_or_y = 'X'
                                                          in = lv_cols ).

DATA(lv_y_metric) = cl_gui_cfw=>compute_metric_from_dynp( metric = cl_gui_control=>metric_pixel
                                                          x_or_y = 'Y'
                                                          in = lv_rows ).

* Breite des Fensters in Pixel
WRITE: / |X: { lv_x_metric }|.
* Höhe des Fensters in Pixel
WRITE: / |Y: { lv_y_metric }|.

[ABAP] Prüfen, ob ein Funktionsbaustein oder Programm per RFC aufgerufen wurde

DATA: lv_caller_in_same_system TYPE answer.

* RFC-Ausführung im gleichen R/3-System ?
CALL FUNCTION 'RFC_WITHIN_SAME_SYSTEM'
  IMPORTING
    caller_in_same_system     = lv_caller_in_same_system
  EXCEPTIONS
    system_call_not_supported = 1
    no_rfc_communication      = 2
    internal_error            = 3
    OTHERS                    = 4.

WRITE: / 'Same system:', lv_caller_in_same_system.
WRITE: / sy-subrc.

oder

CALL 'RFCControl' ID 'CODE' FIELD 'B'.
IF sy-subrc = 0.
  WRITE:/ 'RFC'.
ENDIF.

[ABAP] System-Funktion des c-kernel aufrufen

Vorsicht: Unsachgemäßer Aufruf von Kernelfunktionen kann Systemschäden verursachen!

* Server-Directory auflisten
DATA: lv_cmd TYPE char255.
DATA: lt_result_tab TYPE TABLE OF char255.

lv_cmd = 'ls -lasi'.

CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd ID 'TAB' FIELD lt_result_tab.

LOOP AT lt_result_tab INTO DATA(res_line).
  WRITE: / res_line.
ENDLOOP.

* eingegebenen OK-Code ermitteln
DATA: my_ucomm TYPE sy-ucomm.
CALL 'DYNP_OKCODE_GET' ID 'FCODE' FIELD my_ucomm.
WRITE: / my_ucomm.

* CPUID ermitteln
DATA: local_host LIKE spfid-host.
CALL 'C_GET_CPU_ID' ID 'CPUID' FIELD local_host.
WRITE: / local_host.

* SAP-System ermitteln
DATA: sapsystem LIKE spfid-sysnr.
CALL 'C_GET_SYSTEM_NUMBER' ID 'SYSTEM' FIELD sapsystem.
WRITE: / sapsystem.

* Directory für Audit-Files
DATA: lv_audir TYPE rsauflist-dir_name.
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'DIR_AUDIT' ID 'VALUE' FIELD lv_audir.
WRITE: / lv_audir.

* Namens-Format für Audit-Files
DATA: lv_aufn TYPE rsauflist-file_name.
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'FN_AUDIT' ID 'VALUE' FIELD lv_aufn.
WRITE: / lv_aufn.

* SAP Servername
DATA: lv_server_name LIKE btctgtsrvr-srvname.
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'rdisp/myname' ID 'VALUE' FIELD lv_server_name.
WRITE: / lv_server_name.

Weiterführende Infos: Link