[ABAP] Akt. Server-Liste / Workprozesse holen

DATA: it_server_list_v4 TYPE STANDARD TABLE OF msxxlist WITH DEFAULT KEY.
DATA: it_server_list_v6 TYPE STANDARD TABLE OF msxxlist_v6 WITH DEFAULT KEY.
DATA: it_wpinfo TYPE STANDARD TABLE OF wpinfo WITH DEFAULT KEY.

* Server-Liste besorgen
CALL FUNCTION 'TH_SERVER_LIST'
  TABLES
    list           = it_server_list_v4
    list_ipv6      = it_server_list_v6
  EXCEPTIONS
    no_server_list = 1
    OTHERS         = 2.

IF sy-subrc = 0.
  LOOP AT it_server_list_v6 ASSIGNING FIELD-SYMBOL(<fs_srv>).
    WRITE: / <fs_srv>-name,
             <fs_srv>-host,
             <fs_srv>-serv,
             <fs_srv>-msgtypes,
             <fs_srv>-hostadr,
             <fs_srv>-servno,
             <fs_srv>-state,
             <fs_srv>-hostnamelong,
             <fs_srv>-hostaddr_v4_str,
             <fs_srv>-hostaddr_v6_str,
             <fs_srv>-sysservice0,
             <fs_srv>-sysservice1,
             <fs_srv>-sysservice2,
             <fs_srv>-sysservice3.

* Liste der Work-Prozesse ermitteln
    CALL FUNCTION 'TH_WPINFO'
      EXPORTING
        srvname       = <fs_srv>-name
        with_cpu      = '1'
        with_mtx_info = '1'
      TABLES
        wplist        = it_wpinfo
      EXCEPTIONS
        send_error    = 1
        OTHERS        = 2.

    IF sy-subrc = 0.
      LOOP AT it_wpinfo ASSIGNING FIELD-SYMBOL(<fs_wp>).
        WRITE: / <fs_wp>-wp_index,
                 <fs_wp>-wp_itype,
                 <fs_wp>-wp_typ,
                 <fs_wp>-wp_pid,
                 <fs_wp>-wp_istatus,
                 <fs_wp>-wp_status,
                 <fs_wp>-wp_iwait,
                 <fs_wp>-wp_waiting,
                 <fs_wp>-wp_sem,
                 <fs_wp>-wp_irestrt,
                 <fs_wp>-wp_restart,
                 <fs_wp>-wp_dumps,
                 <fs_wp>-wp_cpu,
                 <fs_wp>-wp_eltime,
                 <fs_wp>-wp_mandt,
                 <fs_wp>-wp_bname,
                 <fs_wp>-wp_report,
                 <fs_wp>-wp_iaction,
                 <fs_wp>-wp_action,
                 <fs_wp>-wp_table,
                 <fs_wp>-wp_server,
                 <fs_wp>-wp_waitinf,
                 <fs_wp>-wp_waittim,
                 <fs_wp>-wp_semstat,
                 <fs_wp>-wp_sem1,
                 <fs_wp>-wp_sem2,
                 <fs_wp>-wp_sem3,
                 <fs_wp>-wp_sem4,
                 <fs_wp>-wp_sem5,
                 <fs_wp>-wp_sem_locking,
                 <fs_wp>-wp_mtx,
                 <fs_wp>-wp_mtx_excl,
                 <fs_wp>-wp_mtx_shrd.
      ENDLOOP.
    ELSE.
      WRITE: / 'send_error'.
    ENDIF.
  ENDLOOP.
ELSE.
  WRITE: / 'no_server_list'.
ENDIF.

[ABAP] ABAP Code-Editor entsperren

PARAMETER: p_name TYPE trdir-name.

START-OF-SELECTION.

  DATA: lv_trdir TYPE trdir.

  SELECT SINGLE * FROM trdir INTO @lv_trdir WHERE name = @p_name.

  IF sy-subrc = 0.
    IF lv_trdir-edtx = 'X'.
      lv_trdir-edtx = space.

      CALL FUNCTION 'RS_TRDIR_UPDATE'
        EXPORTING
          trdir_row       = lv_trdir
        EXCEPTIONS
          internal_error  = 1
          parameter_error = 2
          not_found       = 3
          OTHERS          = 4.

      IF sy-subrc EQ 0.
        WRITE:/ 'Editor entsperrt.'.
      ENDIF.

    ELSE.
      WRITE:/ 'Editor ist schon entsperrt.'.
    ENDIF.
  ENDIF.

[ABAP] Breakpoints eines Programmes zur Laufzeit ermitteln

DATA: it_breakpoints TYPE STANDARD TABLE OF breakpoint.

CALL FUNCTION 'SYSTEM_DEBUG_BREAKPOINTS'
  EXPORTING
    main_program     = sy-repid
  TABLES
    breakpoints      = it_breakpoints
  EXCEPTIONS
    c_call_error     = 1
    wrong_parameters = 2
    OTHERS           = 3.

IF sy-subrc = 0.
  LOOP AT it_breakpoints ASSIGNING FIELD-SYMBOL(<fs_line>).
    WRITE: / <fs_line>-program, <fs_line>-line.
  ENDLOOP.
ENDIF.

[ABAP] Größe einer DB-Tabelle in kB

* Datenbank             Kürzel   Funktionsbaustein
* Adabas/SAP DB         ada/sdb  GET_TABLE_SIZE_ADA
* Microsoft SQL Server  mss      GET_TABLE_SIZE_MSS
* Oracle                ora      GET_TABLE_SIZE_ORA
* IBM DB2/390           db2      GET_TABLE_SIZE_DB2
* IBM DB2/400           db4      GET_TABLE_SIZE_DB4
* IBM DB2 UDB           db6      GET_TABLE_SIZE_DB6
* Informix              inf      GET_TABLE_SIZE_INF
* Sybase ASE            syb      GET_TABLE_SIZE_ALL
* HANA Database         hdb      GET_TABLE_SIZE_ALL

* Beispiel für SAP DB
DATA: lv_tabsize TYPE sy-ccurs.
DATA: lv_table_fragmented TYPE dbstatc-activ.

CALL FUNCTION 'GET_TABLE_SIZE_ADA'
  EXPORTING
    tabname                     = 'MARA'
*   OWNER_NAME                  = ' '
    data_space_only             = abap_false
  IMPORTING
    tabsize                     = lv_tabsize
    table_fragmented            = lv_table_fragmented
  EXCEPTIONS
    no_database_table           = 1
    call_get_db_info_ada_failed = 2
    table_not_found             = 3
    no_entry_found              = 4
    sel_dbparameters_ada_failed = 5
    OTHERS                      = 6.

IF sy-subrc = 0.
  WRITE: / lv_tabsize.
  WRITE: / lv_table_fragmented.
ENDIF.

[ABAP] UNIX-Pfad und -Dateinamen vom Applikationsserver aufsplitten

DATA: lv_file TYPE string VALUE '/usr/sap/test.txt'.
DATA: lv_name TYPE string.
DATA: lv_path TYPE string.

CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH'
  EXPORTING
    full_name     = lv_file
  IMPORTING
    stripped_name = lv_name
    file_path     = lv_path
  EXCEPTIONS
    x_error       = 1
    OTHERS        = 2.
    
IF sy-subrc = 0.
  WRITE: / lv_path.
  WRITE: / lv_name.
ENDIF.

[ABAP] Führende Nullen zu einer Materialnummer (MATNR), Vertriebsbeleg (VBELN) hinzufügen (zero-padding)

Variante 1 (FuBa)

DATA: lv_matnr TYPE char18 VALUE '1234567890'.

* Prüft Länge, Datentyp, fügt führende Nullen ein
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = lv_matnr
  IMPORTING
    output = lv_matnr.

WRITE: / |{ lv_matnr }|.

Variante 2 (UNPACK)

DATA: lv_c_matnr TYPE char10 VALUE '1234567890'. " 10-stellige MatNr
DATA: lv_matnr TYPE mara-matnr.                  " 18-stellige MatNr

UNPACK lv_c_matnr TO lv_matnr.

WRITE: / |{ lv_matnr }|.

Variante 3 (SHIFT/OVERLAY)

DATA: lv_c_matnr TYPE char18 VALUE '1234567890'. " 10-stellige MatNr als Input

SHIFT lv_c_matnr RIGHT DELETING TRAILING space.
* 18-stellig mit Nullen überlagern
OVERLAY lv_c_matnr WITH '000000000000000000'.

WRITE: / |{ lv_c_matnr }|.

Variante 4 (String-Template)

DATA: lv_matnr TYPE string VALUE '12345'

* 18-stellige Ausgabe mit führende Nullen
lv_matnr = |{ lv_matnr WIDTH = 18 ALPHA = IN }|.

WRITE: / |{ lv_matnr }|.

[ABAP] Führende Nullen von einer Materialnummer (MATNR), Vertriebsbeleg (VBELN) entfernen (remove preceeding zeros)

Variante 1 (FuBa)

DATA: lv_matnr_18 TYPE char18 VALUE '000000001234567890'.
DATA: lv_matnr_10 TYPE char10.

* Prüft Länge, Datentyp, entfernt führende Nullen
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
  EXPORTING
    input  = lv_matnr_18
  IMPORTING
    output = lv_matnr_10.

WRITE: / |{ lv_matnr_10 }|.

Variante 2 (SHIFT)

DATA: lv_matnr TYPE char18 VALUE '000000001234567890'.

* Führende Nullen nach links schieben
SHIFT lv_matnr LEFT DELETING LEADING '0'.

WRITE: / |{ lv_matnr }|.

Variante 3 (String-Template)

DATA: lv_matnr TYPE string VALUE '000000001234567890'.

* Führende Nullen aus dem String entfernen
lv_matnr = |{ lv_matnr ALPHA = OUT }|.

WRITE: / |{ lv_matnr }|.

[ABAP] F4-Suchhilfe anzeigen

DATA: it_return TYPE TABLE OF ddshretval.

PARAMETERS: p_matnr TYPE mara-matnr.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.
  DATA: it_return TYPE TABLE OF ddshretval.

* f4-hilfe mit übergabe der anzuzeigenden werte in interner tabelle
  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
    EXPORTING
      tabname           = 'MARA'    " Tabellenname mit Werten für die Anzeige und Auswahl
      fieldname         = 'MATNR'  " Auswahl-Spalte der Tabelle für Rückgabewert
      dynpprog          = sy-repid
      dynpnr            = sy-dynnr
      dynprofield       = 'P_MATNR'  " Name des Dynpro-Feldes für die automatische Werterückgabe
    TABLES
      return_tab        = it_return " Rückgabe-Tabelle mit den ausgewählten (geklickten) Elementen
    EXCEPTIONS
      field_not_found   = 1
      no_help_for_field = 2
      inconsistent_help = 3
      no_values_found   = 4
      OTHERS            = 5.

  IF sy-subrc = 0.
    IF lines( it_return ) > 0.
      MESSAGE it_return[ 1 ]-fieldval TYPE 'S'.
    ENDIF.
  ENDIF.

[ABAP] Dynamisches Selektionsbild erstellen

DATA: lv_tablename TYPE string VALUE 'SPFLI'.       " Tabelle, die ausgelesen werden soll

DATA: lv_selection_id TYPE rsdynsel-selid.          " Selection-ID zur Unterscheidung mehrerer Sets
DATA: lv_number_of_fields TYPE i.                   " Anzahl der Felder

DATA: it_expressions TYPE rsds_texpr.               " Expressions
DATA: it_field_ranges TYPE rsds_trange.             " Ranges
DATA: it_tables TYPE STANDARD TABLE OF rsdstabs.    " Init: Tabellen
DATA: it_fields TYPE STANDARD TABLE OF rsdsfields.  " Init: Felder
DATA: it_where_clauses TYPE rsds_twhere.            " Daten für Where-Tabelle

INITIALIZATION.
* Tabelle hinzufügen
  it_tables = VALUE #( ( prim_tab = lv_tablename ) ).

* freien Selektionsbildschirm initialisieren
  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind                     = 'T' " T: TABLES_TAB G: FIELD_GROUPS_KEY, F: FIELDS_TAB
      expressions              = it_expressions
*      field_groups_key         =
    IMPORTING
      selection_id             = lv_selection_id
      field_ranges             = it_field_ranges
    TABLES
      tables_tab               = it_tables
      fields_tab               = it_fields
    EXCEPTIONS
      fields_incomplete        = 1
      fields_no_join           = 2
      field_not_found          = 3
      no_tables                = 4
      table_not_found          = 5
      expression_not_supported = 6
      incorrect_expression     = 7
      illegal_kind             = 8
      area_not_found           = 9
      inconsistent_area        = 10
      kind_f_no_fields_left    = 11
      kind_f_no_fields         = 12
      too_many_fields          = 13
      dup_field                = 14
      field_no_type            = 15
      field_ill_type           = 16
      dup_event_field          = 17
      node_not_in_ldb          = 18
      area_no_field            = 19
      OTHERS                   = 20.

  IF sy-subrc = 0.
* freien Selektionsbildschirm anzeigen
    CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
      EXPORTING
        selection_id            = lv_selection_id
        title                   = 'Beispielselektion'
        frame_text              = 'Bitte auswählen'
        status                  = 1                 " normaler Selektionsmodus
        as_window               = abap_false        " abap_true -> als Fenster anzeigen
        no_intervals            = abap_true         " keine Intervalle im Selektionsbild anzeigen, kann über Button "Intervalle" geändert werden
      IMPORTING
        where_clauses           = it_where_clauses
        expressions             = it_expressions
        field_ranges            = it_field_ranges
        number_of_active_fields = lv_number_of_fields
      TABLES
        fields_tab              = it_fields
      EXCEPTIONS
        internal_error          = 1
        no_action               = 2
        selid_not_found         = 3
        illegal_status          = 4
        OTHERS                  = 5.

    IF sy-subrc = 0.
      TRY.
* Daten ausgeben
          DATA: o_it TYPE REF TO data.
          DATA: o_row TYPE REF TO data.
          FIELD-SYMBOLS: <fs_table> TYPE ANY TABLE. " Feldsymbol für Arbeit mit Tabelle
          FIELD-SYMBOLS: <fs_row> TYPE any.         " Feldsymbol für Arbeit mit Zeile

* dynamische Tabelle vom Typ lv_tablename erzeugen
          CREATE DATA o_it TYPE STANDARD TABLE OF (lv_tablename).
* Feldsymbol auf die dynamische Tabelle anlegen
          ASSIGN o_it->* TO <fs_table>.

          IF <fs_table> IS ASSIGNED.
* dynamische Workarea vom Typ der Tabellenzeile erzeugen
            CREATE DATA o_row LIKE LINE OF <fs_table>.
* Feldsymbol auf die Workarea anlegen
            ASSIGN o_row->* TO <fs_row>.

            IF <fs_row> IS ASSIGNED.

              IF lines( it_where_clauses ) > 0.
                DATA(ls_where_clause) = it_where_clauses[ tablename = lv_tablename ].
                SELECT * FROM (lv_tablename) INTO TABLE <fs_table> WHERE (ls_where_clause-where_tab).
              ELSE.
                SELECT * FROM (lv_tablename) INTO TABLE <fs_table>.
              ENDIF.

              IF sy-subrc = 0.
* herausfinden, wieviele Spalten die Tabelle hat
                DATA(o_struct) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( <fs_row> ) ).
                DATA(it_comp) = o_struct->get_components( ).

* alle Datensätze der Tabelle durchgehen
                LOOP AT <fs_table> INTO <fs_row>.

* spaltenweise jeden Datansatz durchgehen
                  LOOP AT it_comp ASSIGNING FIELD-SYMBOL(<fs_col>).
* den Inhalt der Strukturkomponente (Zeile) ausgeben
                    ASSIGN COMPONENT <fs_col>-name OF STRUCTURE <fs_row> TO FIELD-SYMBOL(<fs_cell>).

                    IF <fs_cell> IS ASSIGNED.
                      WRITE: <fs_cell>.
                    ENDIF.
                  ENDLOOP.

                  NEW-LINE.

                ENDLOOP.
              ELSE.
                WRITE: / 'Keine Daten verfügbar.'.
              ENDIF.
            ENDIF.
          ENDIF.
        CATCH cx_root INTO DATA(e_text).
          MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
      ENDTRY.
    ENDIF.
  ENDIF.

Links