[ABAP] Feldkatalog aus Tabellendefinition erstellen

* Report: BCALV_GRID_DEMO_FCAT_UTIL
DATA: it_internal_table TYPE STANDARD TABLE OF vbeln WITH DEFAULT KEY.

DATA(o_fcat_util) = cl_salv_gui_fieldcatalog_util=>get_instance( it_data = it_internal_table ).
DATA(it_fieldcat) = o_fcat_util->get_field_catalog( ).

* Hier Objekte für die Ausgabe hinzufügen
cl_demo_output=>write_data( it_fieldcat ).

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

* cl_gui_container=>default_screen erzwingen
WRITE: space.

Links

[ABAP] XML in interne Tabelle wandeln

PARAMETERS: p_fname TYPE localfile OBLIGATORY.

* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.

  DATA: lv_rc TYPE i.
  DATA: it_files TYPE filetable.
  DATA: lv_action TYPE i.

* File-Tabelle leeren, da hier noch alte Einträge von vorherigen Aufrufen drin stehen können
  CLEAR it_files.

* FileOpen-Dialog aufrufen
  TRY.
      cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter    = |xml (*.xml)\|*.xml\|{ cl_gui_frontend_services=>filetype_all }|
                                                            multiselection = abap_false
                                                  CHANGING  file_table     = it_files
                                                            rc             = lv_rc
                                                            user_action    = lv_action ).

      IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
        IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
          p_fname = it_files[ 1 ]-filename.
        ENDIF.
      ENDIF.

    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'I'.
  ENDTRY.

START-OF-SELECTION.

* XML-Document
  DATA(o_xml) = NEW cl_xml_document( ).

* Open file
  IF o_xml->import_from_file( filename = p_fname ) = 0.
    DATA: lv_xml_xstring TYPE xstring.
    DATA: lv_subrc       TYPE sy-subrc.
    DATA: lv_size        TYPE i.

* XSTRING
    o_xml->render_2_xstring( IMPORTING retcode = lv_subrc
                                       stream  = lv_xml_xstring
                                       size    = lv_size ).

    IF lv_subrc = 0.
      DATA: it_xml_tab TYPE STANDARD TABLE OF smum_xmltb WITH DEFAULT KEY.
      DATA(it_return) = VALUE bapiret2_t( ).

* interne Tabelle erstellen
      CALL FUNCTION 'SMUM_XML_PARSE'
        EXPORTING
          xml_input = lv_xml_xstring
        TABLES
          xml_table = it_xml_tab
          return    = it_return.

* Hier Objekte für die Ausgabe hinzufügen
      cl_demo_output=>write_data( it_return ).
      cl_demo_output=>write_data( it_xml_tab ).

*       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.
  ENDIF.

[ABAP] Inhalt eines Spoolauftrages auslesen

* Spoolauftrag
PARAMETERS: p_spool TYPE tsp01-rqident DEFAULT '12345' OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_spool.

  SELECT rqident, rqtitle, rqdest, rqpaper, rqdoctype
    INTO TABLE @DATA(it_spool)
    FROM tsp01
    ORDER BY rqident.

  DATA: it_return TYPE TABLE OF ddshretval.

* eigene Suchhilfe für Auswahl der Spooljobs anzeigen
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'RQIDENT'     " Spalte der internen Tabelle bei value_tab
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_SPOOL'     " Name des Dynpro-Feldes für die automatische Werterückgabe
      value_org       = 'S'           " Werteübergabe: C: zellenweise, S: strukturiert
      window_title    = 'Auswahl'
    TABLES
      value_tab       = it_spool      " Übergabe-Tabelle mit Werten für die Anzeige und Auswahl
      return_tab      = it_return     " Rückgabe-Tabelle mit den ausgewählten (geklickten) Elementen
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

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

START-OF-SELECTION.

  SELECT SINGLE FROM tsp01
    FIELDS *
    WHERE rqident = @p_spool
    INTO @DATA(lv_tsp01).

  IF sy-subrc = 0.
* TSP01 mit SYSID
    DATA(lv_spool) = CORRESPONDING tsp01sys( lv_tsp01 ).
    lv_spool-sys = sy-sysid.

    DATA: it_data TYPE STANDARD TABLE OF rspo_ds WITH DEFAULT KEY.
    DATA: it_output TYPE STANDARD TABLE OF rspo_index WITH DEFAULT KEY.

* Rohdaten eines Spool-Auftrags zurückliefern
    CALL FUNCTION 'RSPO_IRETURN_RAW_DATA'
      EXPORTING
        rq          = lv_spool
      TABLES
        line_buffer = it_data
        page_index  = it_output
      EXCEPTIONS
        error       = 1
        OTHERS      = 2.

    IF sy-subrc = 0.
* Hier Objekte für die Ausgabe hinzufügen
      cl_demo_output=>write_data( lv_spool ).
      cl_demo_output=>write_data( it_data ).
      cl_demo_output=>write_data( it_output ).

*       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.
  ENDIF.

[ABAP] User-Exits und BAdIs zu einem Programm oder einer Transaktion auflisten

PARAMETERS: p_tcode LIKE tstc-tcode DEFAULT 'ME23N'.
PARAMETERS: p_pgmna LIKE tstc-pgmna.

START-OF-SELECTION.

  DATA(lv_tsct) = VALUE tstc( ).

  IF NOT p_tcode IS INITIAL.
    SELECT SINGLE FROM tstc
      FIELDS *
      WHERE tcode EQ @p_tcode
      INTO @lv_tsct.

  ELSEIF NOT p_pgmna IS INITIAL.
    lv_tsct-pgmna = p_pgmna.
  ENDIF.

  IF sy-subrc = 0.
    SELECT SINGLE FROM tadir
      FIELDS *
      WHERE pgmid    = 'R3TR'
        AND object   = 'PROG'
        AND obj_name = @lv_tsct-pgmna
      INTO @DATA(lv_tadir).

    DATA: lv_devclass TYPE tadir-devclass.

    IF sy-subrc = 0.
      lv_devclass = lv_tadir-devclass.
    ELSE.
      SELECT SINGLE FROM trdir
        FIELDS *
        WHERE name = @lv_tsct-pgmna
        INTO @DATA(lv_trdir).

      IF sy-subrc = 0.
* Wenn Programmtyp 'Funktionsgruppe'
        IF lv_trdir-subc EQ 'F'.
          SELECT SINGLE FROM tfdir
            FIELDS *
            WHERE pname = @lv_tsct-pgmna
            INTO @DATA(lv_tfdir).

          IF sy-subrc = 0.
            SELECT SINGLE FROM enlfdir
              FIELDS *
              WHERE funcname = @lv_tfdir-funcname
              INTO @DATA(lv_enlfdir).

            IF sy-subrc = 0.
              SELECT SINGLE FROM tadir
                FIELDS *
                WHERE pgmid    = 'R3TR'
                  AND object   = 'FUGR'
                  AND obj_name = @lv_enlfdir-area
                INTO @DATA(lv_tadir_area).

              IF sy-subrc = 0.
                lv_devclass = lv_tadir_area-devclass.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.

    SELECT FROM tadir
      FIELDS *
      WHERE pgmid    = 'R3TR'
        AND object IN ('SMOD', 'SXSD')
        AND devclass = @lv_devclass
      ORDER BY object
      INTO TABLE @DATA(it_jtab).

    IF sy-subrc = 0.
      SELECT SINGLE FROM tstct
        FIELDS *
        WHERE sprsl = @sy-langu
          AND tcode = @p_tcode
        INTO @DATA(lv_tstct).

      IF sy-subrc = 0.
        WRITE: / 'Transaction:', p_tcode.
        WRITE: / 'Bezeichnung:', lv_tstct-ttext.
      ENDIF.

      WRITE: / 'Programm:', lv_tsct-pgmna.

      SKIP.

      LOOP AT it_jtab ASSIGNING FIELD-SYMBOL(<o>).
        DATA(lv_txt) = ||.

        CASE <o>-object.
          WHEN 'SMOD'. " Enhancement
            SELECT SINGLE FROM modsapt
              FIELDS modtext
              WHERE sprsl = @sy-langu
                AND name  = @<o>-obj_name
              INTO @lv_txt.
          WHEN 'SXSD'. " BAdI
            SELECT SINGLE FROM sxs_attrt
              FIELDS text
              WHERE sprsl     = @sy-langu
                AND exit_name = @<o>-obj_name
              INTO @lv_txt.
          WHEN OTHERS.
        ENDCASE.

        WRITE: / <o>-object, <o>-obj_name, lv_txt.
      ENDLOOP.

    ENDIF.

  ENDIF.

[ABAP] UTC-long-Zeitstempel nach POSIX-Standard in Datum und Zeit splitten

TRY.
* UTC-Zeitstempel nach POSIX-Standard
* z.B. 01.01.2025 06:30:10,1234567
    DATA(lv_utc_long) = utclong_current( ).

    WRITE: / 'UTC long: ', lv_utc_long.

* UTC-Long in Datum, Zeit splitten
    CONVERT UTCLONG lv_utc_long
      TIME ZONE cl_abap_context_info=>get_user_time_zone( )
      INTO DATE DATA(lv_date)               " d
      TIME DATA(lv_time)                    " t
      FRACTIONAL SECONDS DATA(lv_frac_sec)  " decfloat34
      DAYLIGHT SAVING TIME DATA(lv_is_dst). " abap_bool

    WRITE: / 'Date: ', lv_date.
    WRITE: / 'Time: ', lv_time.
    WRITE: / 'Fractionl seconds: ', lv_frac_sec.
    WRITE: / 'Daylight saving time: ', lv_is_dst.

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

[ABAP] Verwendung von Common Table Expressions (CTE)

* https://software-heroes.com/en/blog/abap-common-table-expression-en
PARAMETERS: p_mat TYPE mara-matnr.

* Definition allgemeiner Tabellenausdrücke (Common Table Expression (CTE))
WITH
  +mat AS (
    SELECT FROM mara
      FIELDS *
      WHERE matnr = @p_mat )

* Verwendung der CTE +mat
    SELECT FROM ekpo AS e
       FIELDS *
       WHERE e~matnr IN ( SELECT matnr FROM +mat )
       INTO TABLE @DATA(it_ekpo).

cl_demo_output=>display( it_ekpo ).

[ABAP] Leistungsverzeichnis lesen (MS_READ_SERVICES_FOR_BAPI)

PARAMETERS: p_lv TYPE tmp_spec-spec_no OBLIGATORY.

START-OF-SELECTION.

  SELECT SINGLE FROM tmp_spec
    FIELDS *
    WHERE spec_no = @p_lv
  INTO @DATA(lv_lv).

  DATA: it_bapiesll TYPE STANDARD TABLE OF bapiesll WITH DEFAULT KEY.
  DATA: it_bapieskl TYPE STANDARD TABLE OF bapieskl WITH DEFAULT KEY.

* Leistungsverzeichnis lesen (für BAPI GetDetail)
  CALL FUNCTION 'MS_READ_SERVICES_FOR_BAPI'
    EXPORTING
      packno     = lv_lv-packno
    TABLES
      t_bapiesll = it_bapiesll
      t_bapieskl = it_bapieskl
    EXCEPTIONS
      not_found  = 1
      OTHERS     = 2.

  IF sy-subrc = 0.
* Hier Objekte für die Ausgabe hinzufügen
    cl_demo_output=>write_data( lv_lv ).
    cl_demo_output=>write_data( it_bapiesll ).
    cl_demo_output=>write_data( it_bapieskl ).

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

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

[ABAP] SAPConnect: Kommunikationsknoten, Routing und Parameter auslesen

* SAPconnect: Kommunikationsknoten
SELECT FROM sxnodes
  FIELDS *
  INTO TABLE @DATA(it_nodes).

* SAPconnect: Routingtabelle
SELECT FROM sxroute
  FIELDS *
  INTO TABLE @DATA(it_routing).

* SAPconnect: Parametertabelle
SELECT FROM sxparams
  FIELDS *
  INTO TABLE @DATA(it_params).

* Hier Objekte für die Ausgabe hinzufügen
cl_demo_output=>write_data( it_nodes ).
cl_demo_output=>write_data( it_routing ).
cl_demo_output=>write_data( it_params ).

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