[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] Mengen von einer Mengeneinheit in die Menge zu einer anderen Mengeneinheit umwandeln

DATA: lv_matnr TYPE mara-matnr VALUE '1234567890'.
DATA: lv_menge TYPE ekpo-menge VALUE '1'.
DATA: lv_r_menge TYPE ekpo-menge.

* Wandelt Menge von Quellmengeeinheit in Zielmengeneinheit für Material
* Siehe auch Tabelle: T006
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
  EXPORTING
    i_matnr              = lv_matnr   " MATNR
    i_in_me              = 'KA'       " Ausgangsmengeneinheit
    i_out_me             = 'ST'       " Zielmengeneeinheit
    i_menge              = lv_menge   " Ausgangsmenge
  IMPORTING
    e_menge              = lv_r_menge " Zielmenge
  EXCEPTIONS
    error_in_application = 1
    error                = 2
    OTHERS               = 3.

IF sy-subrc = 0.

ENDIF.

[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] Spoolauftrag erzeugen und Text in den SAP-Spool ausgeben

DATA: lv_spoolid TYPE tsp01-rqident.
DATA: lv_handle TYPE sy-tabix.

* Spool: Öffnen eines Spoolauftrags zum Schreiben
CALL FUNCTION 'RSPO_SR_OPEN'
  EXPORTING
    dest             = 'LOCL'        " Ausgabeziel ist lokaler Drucker (Windows)
    layout           = 'X_65_80'
    titleline        = 'Spoolausgabe'
    doctype          = 'LIST'
  IMPORTING
    handle           = lv_handle
    spoolid          = lv_spoolid
  EXCEPTIONS
    device_missing   = 1
    name_twice       = 2
    no_such_device   = 3
    operation_failed = 4
    OTHERS           = 5.

IF sy-subrc = 0.

  WRITE: 'Open spool:', lv_spoolid.

  DATA: lv_text TYPE char255.
  lv_text = 'Testtext'.

* Spool: Schreiben einer Zeile in einen offenen Spoolauftrag
  CALL FUNCTION 'RSPO_SR_WRITE'
    EXPORTING
      handle           = lv_handle
      text             = lv_text
    EXCEPTIONS
      handle_not_valid = 1
      operation_failed = 2
      OTHERS           = 3.

  IF sy-subrc = 0.
    WRITE: / 'Text written.'.
  ELSE.
    WRITE: / 'Writing failed.'.
  ENDIF.

  IF sy-subrc = 0.
* Spool: Schliessen eines Spoolrequests
    CALL FUNCTION 'RSPO_SR_CLOSE'
      EXPORTING
        handle           = lv_handle
      EXCEPTIONS
        handle_not_valid = 1
        operation_failed = 2
        OTHERS           = 3.

    IF sy-subrc = 0.
      WRITE: / 'Close.'.
    ELSE.
      WRITE: / 'Close failed.'.
    ENDIF.
  ENDIF.
ELSE.
  WRITE: / 'Open failed.'.
ENDIF.

[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] Datenbeschaffung für Lieferscheindruck

PARAMETERS: p_kappl TYPE t681a-kappl DEFAULT 'V2'.
PARAMETERS: p_kschl TYPE t685-kschl.

START-OF-SELECTION.

  SELECT SINGLE *
    INTO @DATA(lv_nast)
    FROM nast
    WHERE kappl = @p_kappl
      AND kschl = @p_kschl
      AND spras = @sy-langu.

  IF sy-subrc = 0.

    DATA(lv_vbco3) = VALUE vbco3( spras = lv_nast-spras  " Message language
                                  vbeln = lv_nast-objky  " Vertriebsbelegnummer
                                  kunde = lv_nast-parnr  " Partnernummer (KUNNR, LIFNR, PERNR, PARNR) mit Konv.Routine
                                  parvw = lv_nast-parvw  " Partnerrolle
                                ).

    DATA: lv_vbdkl TYPE vbdkl.
    DATA: it_vbdpl TYPE STANDARD TABLE OF vbdpl WITH DEFAULT KEY.

* Datenbeschaffung für Lieferscheindruck
    CALL FUNCTION 'RV_DELIVERY_PRINT_VIEW'
      EXPORTING
        comwa = lv_vbco3
      IMPORTING
        kopf  = lv_vbdkl
      TABLES
        pos   = it_vbdpl.

    cl_demo_output=>write_data( lv_vbdkl ).
    cl_demo_output=>write_data( it_vbdpl ).

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

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