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

[ABAP] Informationen zu Business Objekten anzeigen

PARAMETERS: p_objtyp TYPE swo_objtyp DEFAULT 'BUS2012'.

START-OF-SELECTION.

  SELECT dv~objtype,   " BO Typ
         dv~verb,      " Funktion
         dv~verbtype,  " Funktionstyp ( ' ' =	Kein Verb, K = Schlüsselfeld, A = Attribut, M = Methode, E = Ereignis )
         dv~editelem,  " Element
         dv~refstruct, " Tabelle
         dv~reffield,  " Bezugsfeld
         dv~abapname,  " Funktionsbaustein
         tv~descript,  " Beschreibung
         tv~shorttext  " Kurztext
    INTO TABLE @DATA(it_bor_info)
    FROM swotdv AS dv
    INNER JOIN swottv AS tv ON dv~objtype = tv~objtype AND dv~verb = tv~verb
    WHERE dv~objtype = @p_objtyp
      AND tv~language = @sy-langu.

  IF sy-subrc = 0.

    SORT: it_bor_info BY verbtype verb.

    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        = it_bor_info ).

* 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( 'BO Infos' ).
        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.

[ABAP] Funktionen von Business Objekten aufrufen

Beispiel 1 (Bestellung anzeigen)

* http://saptechnical.com/Tutorials/Workflow/BusinessObjects/Page1.htm
* weitere Funktionen siehe SAP-Include:
* INCLUDE <cntn01>.

* Paket: SWO

* Tabellen:

* TOJTB (Business Object Repository Grunddaten)
* TOJTT (Texte Grunddaten)
* TOJTD (Customizing Objekttypen)
* SWOTDI (Definition Schnittstellen)
* SWOTDV (Objekttyp Verben Definition)
* SWOTLQ (Laufzeittabelle Parameter, Ausnahmen)
* SWOTLV (Laufzeittabelle Verben)

* BUS2012 == Bestellung
PARAMETERS: p_objtyp TYPE swo_objtyp DEFAULT 'BUS2012'.
* Bestellnummer
PARAMETERS: p_objkey TYPE swo_typeid DEFAULT '0001122333'.

START-OF-SELECTION.

  TYPES: ty_it_container TYPE STANDARD TABLE OF swcont WITH DEFAULT KEY.

  DATA: lv_obj TYPE swo_objhnd.
  DATA: lv_ret TYPE swotreturn.

  * Business Objekt initiieren
  CALL FUNCTION 'SWO_CREATE'
    EXPORTING
      objtype           = p_objtyp
      objkey            = p_objkey
    IMPORTING
      object            = lv_obj
      return            = lv_ret
    EXCEPTIONS
      no_remote_objects = 1
      OTHERS            = 2.

  IF sy-subrc = 0.
  * Container für Rückgabewerte
    DATA: it_container TYPE ty_it_container.

  * Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access     = 'C'        " C - Call Method, G - Get Attribute
        object     = lv_obj
        verb       = 'DISPLAY'  " Anzeigen
      IMPORTING
        return     = lv_ret
      TABLES
        container  = it_container.

    IF lv_ret-code <> 0.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ELSE.
    IF lv_ret-code <> 0.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'SWO_FREE'
    EXPORTING
      object = lv_obj
    IMPORTING
      return = lv_ret.

  IF lv_ret-code <> 0.
    WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
  ENDIF.

Beispiel 2 (Details zur Bestellung auflisten)

* http://saptechnical.com/Tutorials/Workflow/BusinessObjects/Page1.htm
* weitere Funktionen siehe SAP-Include:
* INCLUDE <cntn01>.

* BUS2012 == Bestellung
PARAMETERS: p_objtyp TYPE swo_objtyp DEFAULT 'BUS2012'.
* Bestellnummer
PARAMETERS: p_objkey TYPE swo_typeid DEFAULT '0001122333'.

START-OF-SELECTION.

  TYPES: ty_it_container TYPE STANDARD TABLE OF swcont WITH DEFAULT KEY.

  DATA: lv_obj TYPE swo_objhnd.
  DATA: lv_ret TYPE swotreturn.

  * Business Objekt initiieren
  CALL FUNCTION 'SWO_CREATE'
    EXPORTING
      objtype           = p_objtyp
      objkey            = p_objkey
    IMPORTING
      object            = lv_obj
      return            = lv_ret
    EXCEPTIONS
      no_remote_objects = 1
      OTHERS            = 2.

  IF sy-subrc = 0.
  * Container für Rückgabewerte
    DATA: it_container TYPE ty_it_container.

  * Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access    = 'C'           " C - Call Method, G - Get Attribute
        object    = lv_obj
        verb      = 'GETDETAIL1'  " Details
      IMPORTING
        return    = lv_ret
      TABLES
        container = it_container.

    IF lv_ret-code = 0.
      LOOP AT it_container ASSIGNING FIELD-SYMBOL(<a>).
        WRITE: / |{ <a>-element }: { <a>-value }|.
      ENDLOOP.
    ELSE.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ELSE.
    IF lv_ret-code <> 0.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'SWO_FREE'
    EXPORTING
      object = lv_obj
    IMPORTING
      return = lv_ret.

  IF lv_ret-code <> 0.
    WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
  ENDIF.

Beispiel 3 (Attribut zum Material anzeigen)

* http://saptechnical.com/Tutorials/Workflow/BusinessObjects/Page1.htm
* weitere Funktionen siehe SAP-Include:
* INCLUDE <cntn01>.

* BUS1001006 == Standard Material
PARAMETERS: p_objtyp TYPE swo_objtyp DEFAULT 'BUS1001006'.
* 18-stellige Materialnummer
PARAMETERS: p_objkey TYPE swo_typeid DEFAULT '000000001112223333'.

START-OF-SELECTION.

  TYPES: ty_it_container TYPE STANDARD TABLE OF swcont WITH DEFAULT KEY.

  DATA: lv_obj TYPE swo_objhnd.
  DATA: lv_ret TYPE swotreturn.

  * Buisiness Objekt initiieren
  CALL FUNCTION 'SWO_CREATE'
    EXPORTING
      objtype           = p_objtyp
      objkey            = p_objkey
    IMPORTING
      object            = lv_obj
      return            = lv_ret
    EXCEPTIONS
      no_remote_objects = 1
      OTHERS            = 2.

  IF sy-subrc = 0.
  * Container für Rückgabewerte
    DATA: it_container TYPE ty_it_container.

  * Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access    = 'G'             " C - Call Method, G - Get Attribute
        object    = lv_obj
        verb      = 'MATERIALTYPE'  " Attribut
      IMPORTING
        return    = lv_ret
      TABLES
        container = it_container.

    IF lv_ret-code = 0.
      LOOP AT it_container ASSIGNING FIELD-SYMBOL(<a>).
        WRITE: / |{ <a>-element }: { <a>-value }|.
      ENDLOOP.
    ELSE.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ELSE.
    IF lv_ret-code <> 0.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'SWO_FREE'
    EXPORTING
      object = lv_obj
    IMPORTING
      return = lv_ret.

  IF lv_ret-code <> 0.
    WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
  ENDIF.

Beispiel 4 (Material Detail)

* http://saptechnical.com/Tutorials/Workflow/BusinessObjects/Page1.htm
* weitere Funktionen siehe SAP-Include:
* INCLUDE <cntn01>.

* BUS1001006 == Standard Material
PARAMETERS: p_objtyp TYPE swo_objtyp DEFAULT 'BUS1001006'.
* 18-stellige Materialnummer
PARAMETERS: p_objkey TYPE swo_typeid DEFAULT '000000001112223333'.

START-OF-SELECTION.

  TYPES: ty_it_container TYPE STANDARD TABLE OF swcont WITH DEFAULT KEY.

  DATA: lv_obj TYPE swo_objhnd.
  DATA: lv_ret TYPE swotreturn.

  * Buisiness Objekt initiieren
  CALL FUNCTION 'SWO_CREATE'
    EXPORTING
      objtype           = p_objtyp
      objkey            = p_objkey
    IMPORTING
      object            = lv_obj
      return            = lv_ret
    EXCEPTIONS
      no_remote_objects = 1
      OTHERS            = 2.

  IF sy-subrc = 0.
  * Container für Rückgabewerte
    DATA: it_container TYPE ty_it_container.

  * SWO1 -> Objekttyp -> Methoden
  * oder
  * Tabelle SWOTDV -> Spalte VERB, VERBTYPE = M
  *GetDetail                             Detaildaten zu einem Material ermitteln
  *ExistenceCheck                        Existenz des Objekts prüfen
  *GetList                               Liste mit Kurztext
  *Display                               Material anzeigen
  *GetMRPList                            Dispositionsliste eines Materials
  *GetStockRequirementsList              Aktuelle Bedarfs-/Bestandsliste eines Materials

  * Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access    = 'C'          " C - Call Method, G - Get Attribute
        object    = lv_obj
        verb      = 'GETDETAIL'  " Details
      IMPORTING
        return    = lv_ret
      TABLES
        container = it_container.

    IF lv_ret-code = 0.
      LOOP AT it_container ASSIGNING FIELD-SYMBOL(<a>).
        WRITE: / |{ <a>-element }: { <a>-value }|.
      ENDLOOP.
    ELSE.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ELSE.
    IF lv_ret-code <> 0.
      WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'SWO_FREE'
    EXPORTING
      object = lv_obj
    IMPORTING
      return = lv_ret.

  IF lv_ret-code <> 0.
    WRITE: / lv_ret-code, lv_ret-errortype, lv_ret-workarea, lv_ret-message, lv_ret-text, lv_ret-variable1, lv_ret-variable2, lv_ret-variable3, lv_ret-variable4.
  ENDIF.

[ABAP] IMG-Aktivität (Customizing-Punkt) zu einer Transaktion ermitteln

* Tabellen:
*  CUS_ACTEXT (Customizing Aktivität - zugeordnetes Erweiterungs-Objekt)
*  CUS_ACTH   (Customizing Aktivität - Kopfdaten)
*  CUS_ACTOBJ (Customizing Aktivität - Liste der Objekte)
*  CUS_ACTOBT (Customizing Aktivität - Liste der Objekte)
*  CUS_ACTT   (Texttabelle zu den Customizing Aktivitäten)

* TCode
PARAMETERS: p_tc TYPE tstc-tcode DEFAULT 'OMBT'.

START-OF-SELECTION.

  SELECT o~tcode,
         o~act_id,
         o~objectname,
         o~text AS etext,
         t~text,
         e~exit_name,
         e~impl_name,
         e~enhancement
    INTO TABLE @DATA(it_activities)
    FROM cus_actobt AS o
    INNER JOIN cus_acth AS h ON o~act_id = h~act_id
    INNER JOIN cus_actt AS t ON h~act_id = t~act_id
    LEFT OUTER JOIN cus_actext AS e ON o~act_id = e~act_id
    WHERE o~tcode = @p_tc
      AND o~spras = @sy-langu
      AND t~spras = @sy-langu.

  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        = it_activities ).

* 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( 'IMG-Aktivitäten zur Transaktion' ).
      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.

[ABAP] API-Klasse mit Ersatzfunktionen für eingeschränkte ABAP-Funktionalität in der SAP S/4HANA Cloud-Umgebung

* Verfügbar für SAP S/4HANA Cloud
* SY-DATUM
DATA(lv_sy_datum) = cl_abap_context_info=>get_system_date( ).
* SY-UZEIT
DATA(lv_sy_uzeit) = cl_abap_context_info=>get_system_time( ).
* SY-UNAME
DATA(lv_sy_uname) = cl_abap_context_info=>get_user_technical_name( ).
* Username
DATA(lv_user_name) = cl_abap_context_info=>get_user_formatted_name( ).
* User Description
DATA(lv_user_desc) = cl_abap_context_info=>get_user_description( ).
* SY-LANGU
DATA(lv_sy_langu) = cl_abap_context_info=>get_user_language_abap_format( ).
* ISO-Language
DATA(lv_langu_iso) = cl_abap_context_info=>get_user_language_iso_format( ).
* SY-ZONLO
DATA(lv_sy_zonlo) = cl_abap_context_info=>get_user_time_zone( ).
* System URL
DATA(lv_system_url) = cl_abap_context_info=>get_system_url( ).
* User Business Partner ID
DATA(lv_user_bpid) = cl_abap_context_info=>get_user_business_partner_id( ).

[ABAP] Archivierte Objekte lesen

*  Beispiele:
*
*  https://www.abapforum.com/forum/viewtopic.php?t=1196
*  https://copycodesap.wordpress.com/2014/10/27/custom-table-archival-read-program/
*
*  Transaktion:
*    ALO1 (Ermitteln Verknüpfungen ASH/DOREX)
*
*  Reports:
*    SBOOKR
*    SBOOKR_2
*    SBOOKR_3
*    RDRBFI00
*
*  Paket: SARC
*  Funktionsgruppe: ARCH
*
*  Funktionsbausteine:
*
*    ARCHIVE_CLOSE_FILE (Offene Archivdateien werden geschlossen)
*    ARCHIVE_GET_CUSTOMIZING_DATA (Customizing-Daten eines Archivierungsobjektes lesen)
*    ARCHIVE_GET_INFORMATION (Archivobjekt-Informationen werden aufgrund eines Handles übergeben)
*    ARCHIVE_GET_NEXT_OBJECT (Datenobjekt aus der Archivdatei lesen)
*    ARCHIVE_GET_NEXT_RECORD (Sequentielles Lesen der Sätze aus einem Datenobjekt)
*    ARCHIVE_GET_STATISTICS (Übernahme der vom ADK gesammelten Statistikdaten)
*    ARCHIVE_GET_TABLE (Sätze strukturgerecht aus aktuellem Datenobjekt lesen)
*    ARCHIVE_GIVE_STATISTICS (Übergabe von Statistikdaten in Programmen der Datenarchivierung)
*    ARCHIVE_NEW_OBJECT (Datenobjekt zum Schreiben anfordern)
*    ARCHIVE_OPEN_FOR_DELETE (Archivdatei öffnen zum Löschen der Sätze in der Datenbank)
*    ARCHIVE_OPEN_FOR_MOVE (Datenobjekte in eine neue Archivdatei schreiben und/oder zurückladen)
*    ARCHIVE_OPEN_FOR_READ (Öffnen einer vorhandenen Archivdatei zum Lesen)
*    ARCHIVE_OPEN_FOR_WRITE (Archivdatei zum Schreiben öffnen)
*    ARCHIVE_PUT_RECORD (Datensatz in Datenobjekt schreiben)
*    ARCHIVE_PUT_TABLE (Sätze strukturgerecht in aktuelles Datenobjekt stellen)
*    ARCHIVE_READ_OBJECT (Lesen eines Datenobjektes aus einer Archivdatei)
*    ARCHIVE_SAVE_OBJECT (Datenobjekt in die Archivdatei schreiben)
*    ARCHIVE_WRITE_STATISTICS (Ausgabe der vom ADK gesammelten Statistikdaten (Standardprotokoll))
*
*  Paket: SWW
*  Funktionsgruppe: SWWX
*
*  Funktionsbausteine:
*
*    WORKITEM_ARCHIVE_GET_TABLE (Lesen von archivierten Workitems)
*    WORKITEM_ARCHIVE_OBJECT (Archivierungsklasse WORKITEM: Schreiben eines Workitems in ein Archiv)
*    WORKITEM_ARCHIVE_PUT_TABLE (Übergabe konvertierter Daten an das ADK)
*    WORKITEM_READ_ARCHIVE_OBJ (Archivierungsklasse WORKITEM: Lesen von Workitems aus dem Archiv)
*
*  Tabellen:
*
*    ARCH_OBJ (Objekte für die Archivierung und Reorganisation)
*    ARCH_TXT (Bezeichnung der Archivierungsobjekte)
*    ARCH_DEF (Definition eines Archivierungsobjekts)
*    ADMI_RUN (Archivierungsläufe Kopfdaten)
*    ADMI_FILES (Archivdateien der Archivierungsläufe)
*    PATH (Definition der physischen Dateipfade je Syntax)
*    FILENAME (Umsetztabelle von internen Dateinamen in externe Dateinamen)
*    FILESYS (Definition der Gruppen der Dateibeschreibungssyntax)
*    FSYSTXT (Bezeichnung der Dateibeschreibungssyntax)
*    FILENAMECI (Plattformunabhängige Dateinamen, mandantenübergreifend)
*    FILEPATH (Definition der logischen Dateipfade)
*    PATHTEXT (Bezeichnung der logischen Dateipfade)
*
*  Customizing Dateipfade:
*
*  Transaktion FILE
*  oder
*  SPRO -> SAP NetWeaver -> Application Server -> Systemadministration -> Plattformunabhängige Dateinamen -> Dateinamen und Dateipfade mandantenunabhängig pflegen

* Archivierungsobjekt
PARAMETERS: p_obj TYPE arch_def-object DEFAULT 'CHANGEDOCU'.

DATA(lv_handle) = VALUE sy-tabix( ).
DATA: it_archive_files TYPE STANDARD TABLE OF rng_archiv WITH DEFAULT KEY.
DATA: it_selected_files TYPE STANDARD TABLE OF admi_files WITH DEFAULT KEY.

* Öffnen einer vorhandenen Archivdatei zum Lesen
* wenn nur ein Wert für "object" angegeben wurde, dann erscheint ein Auswahl-Popup
CALL FUNCTION 'ARCHIVE_OPEN_FOR_READ'
  EXPORTING
*   archive_document             = '000000'
*   ARCHIVE_NAME                 = ' '
    object                       = p_obj
*   MAINTAIN_INDEX               = ' '
  IMPORTING
    archive_handle               = lv_handle
  TABLES
    archive_files                = it_archive_files
    selected_files               = it_selected_files
  EXCEPTIONS
    file_already_open            = 1
    file_io_error                = 2
    internal_error               = 3
    no_files_available           = 4
    object_not_found             = 5
    open_error                   = 6
    not_authorized               = 7
    archiving_standard_violation = 8
    OTHERS                       = 9.

IF sy-subrc = 0.
* Testweise den externen Speicherpfad im UNIX-Dateisystem ermitteln
  LOOP AT it_selected_files ASSIGNING FIELD-SYMBOL(<f>).
    SELECT SINGLE pathextern
      INTO @DATA(lv_pathextern)
      FROM path
      WHERE pathintern = @<f>-pathintern
        AND filesys = 'UNIX'.

    WRITE: / <f>-document, <f>-archiv_key, <f>-pathintern, lv_pathextern.
  ENDLOOP.

  ULINE.

  DO.
* Datenobjekt aus der Archivdatei lesen
    CALL FUNCTION 'ARCHIVE_GET_NEXT_OBJECT'
      EXPORTING
        archive_handle          = lv_handle
*         IMPORTING
*       OBJECT_ID               =
*       OBJECT_OFFSET           =
*       ARCHIVE_NAME            =
*       COMPR_OBJECT_LENGTH     =
*       SESSION                 =
*       EV_CONTAIN_BLOCKED_DATA =
      EXCEPTIONS
        end_of_file             = 1
        file_io_error           = 2
        internal_error          = 3
        open_error              = 4
        wrong_access_to_archive = 5
        OTHERS                  = 6.

    IF sy-subrc <> 0.
* Keine Objekte mehr
      EXIT.
    ELSE.
      DO.
        DATA(lv_data_struct) = VALUE arc_buffer-rname( ).
* Datenreferenz -> Unicodefähigkeit
        DATA: o_data_ref TYPE REF TO data.

* Sequentielles Lesen der Sätze aus einem Datenobjekt
        CALL FUNCTION 'ARCHIVE_GET_NEXT_RECORD'
          EXPORTING
            archive_handle   = lv_handle
          IMPORTING
            record_structure = lv_data_struct
            record_ref       = o_data_ref
          EXCEPTIONS
            end_of_object    = 1
            OTHERS           = 2.

        IF sy-subrc <> 0.
* Keine Daten mehr
          EXIT.
        ELSE.
* Farbe definieren
          FORMAT COLOR COL_HEADING.
* Ausgabetext
          WRITE: / 'Struktur:', to_upper( lv_data_struct ).
* Leerzeichen am Zeilenende, damit der Farbbalken durchgezogen wird
          WRITE AT sy-linsz space.
* Farbdefinition abschalten
          FORMAT COLOR OFF.

* Generische Datenausgabe
* Strukturbeschreibung der akt. Archivstruktur
          DATA(o_desc) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( lv_data_struct ) ).
* Komponenten
          DATA(gt_comp) = o_desc->get_components( ).
* generische Objekte für Zugriff
          FIELD-SYMBOLS: <row> TYPE any.
          ASSIGN o_data_ref->* TO <row>.

          DATA(lv_head) = ||.
          DATA(lv_data) = ||.

* Alle Felder der Struktur durchloopen
          LOOP AT gt_comp ASSIGNING FIELD-SYMBOL(<c>).
* Spaltenbreite
            DATA(lv_width) = strlen( <c>-name ).

* Prüfen, ob DDIC-Typ
            DATA(o_edesc) = CAST cl_abap_elemdescr( <c>-type ).
            IF o_edesc->is_ddic_type( ) EQ abap_true.
* Feld anhand des Komponentennamens aus der Struktur ermitteln und Feldsymbol zuweisen
              ASSIGN COMPONENT <c>-name OF STRUCTURE <row> TO FIELD-SYMBOL(<cell>).
              IF <cell> IS ASSIGNED.
* Spaltenbreite, falls Zellinhalt breiter
                IF strlen( condense( <cell> ) ) > lv_width.
                  lv_width = strlen( condense( <cell> ) ).
                ENDIF.

* Formatierung Daten
                lv_data = COND #( WHEN lv_data IS INITIAL THEN |{ condense( <cell> ) WIDTH = lv_width }| ELSE |{ lv_data }\|{ condense( <cell> ) WIDTH = lv_width }| ).
              ENDIF.
            ENDIF.

* Formatierung Kopf
            lv_head = COND #( WHEN lv_head IS INITIAL THEN |{ <c>-name WIDTH = lv_width }| ELSE |{ lv_head }\|{ <c>-name WIDTH = lv_width }| ).

          ENDLOOP.

* Ausgabe
          WRITE: / lv_head.
          WRITE: / lv_data.

          ULINE.
        ENDIF.

      ENDDO.
    ENDIF.
  ENDDO.

* Offene Archivdateien werden geschlossen
  CALL FUNCTION 'ARCHIVE_CLOSE_FILE'
    EXPORTING
      archive_handle = lv_handle.

ENDIF.