[ABAP] Ergebnisse eines SQL-Ausdrucks in einer Zeile verketten

* STRING_AGG verkettet die Ergebnisse eines SQL-Ausdrucks in einer Zeile (Typ SSTRING, Länge 1333)
* wenn der String länger als 1333 Zeichen ist, wird eine Ausnahme (CX_SY_OPEN_SQL_DB) geworfen
* die Beschränkung auf 1333 Zeichen kann durch die Funktion TO_CLOB umgangen werden

SELECT FROM t100
  FIELDS arbgb,
         to_clob( STRING_AGG( text, ', ' ) ) AS text_agg
WHERE sprsl = 'D'
GROUP BY arbgb
ORDER BY arbgb
INTO TABLE @DATA(it_t100)
UP TO 10 ROWS.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_t100 ).

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

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

[ABAP] Liste aller Umgebungsvariablen

DATA(it_env) = VALUE spfl_environment_list_t( ).
* Get a list of all environment variables
IF cl_spfl_environment=>get_list( IMPORTING env = it_env ) = 0.
* Hier Objekte für die Ausgabe hinzufügen
  cl_demo_output=>write_data( it_env ).

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

[ABAP] Muster-Leistungsverzeichnisse lesen

* Muster-LV-Nummer
PARAMETERS: p_spec TYPE tmp_spec-spec_no.

START-OF-SELECTION.

* Muster-Leistungsverzeichnis
  SELECT SINGLE FROM tmp_spec
    FIELDS *
    WHERE spec_no = @p_spec
    INTO @DATA(lv_spec).

  IF sy-subrc = 0.
    DATA(it_esll) = VALUE mmsrv_ml_esll( ).

* Leistungsverzeichnis lesen für Listausgabe im PM/PS
    CALL FUNCTION 'MS_FETCH_SPEC_FOR_LIST'
      EXPORTING
        spec_packno            = lv_spec-packno
      TABLES
        servicetab             = it_esll
*       LIMITTAB               =
      EXCEPTIONS
        no_specification_exist = 1
        OTHERS                 = 2.

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

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

[ABAP] ABAP2XLSX: Column Autosize, Verwendung Iterator

SELECT FROM mara
  FIELDS *
  INTO TABLE @DATA(it_mara)
  UP TO 10 ROWS.

IF sy-subrc = 0.
* Excel-Objekt
  DATA(o_xl) = NEW zcl_excel( ).

* aktive Worksheet
  DATA(o_xl_ws) = o_xl->get_active_worksheet( ).
			  
* Name der Sheet
  o_xl_ws->set_title( ip_title = 'Daten' ).

* Tabelle übergeben und Style festlegen
  o_xl_ws->bind_table( ip_table          = it_mara
                       is_table_settings = VALUE #(
*                                                    table_style      = zcl_excel_table=>builtinstyle_medium2
                                                    show_row_stripes = abap_true
                                                  )
                     ).

* alle Spalten mit Iterator durchlaufen und auf Autosize setzen
  DATA(o_col_iterator) = o_xl_ws->get_columns_iterator( ).
  IF o_col_iterator IS BOUND.
	WHILE o_col_iterator->has_next( ).
	  DATA(o_col) = CAST zcl_excel_column( o_col_iterator->get_next( ) ).
	  o_col->set_auto_size( abap_true ).
	ENDWHILE.
  ENDIF.

* Änderungen für alle Spalten übernehmen
  o_xl_ws->calculate_column_widths( ).
ENDIF.

[ABAP] Schlüsselspalten einer DB-Tabelle ermitteln

SELECT FROM mara
  FIELDS *
  INTO TABLE @DATA(it_mara)
  UP TO 10 ROWS.

IF sy-subrc = 0.
* Table: Beschreibung
  DATA(o_tdesc) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( it_mara ) ).
* Row: Beschreibung
  DATA(o_sdesc) = CAST cl_abap_structdescr( o_tdesc->get_table_line_type( ) ).
* Key Fields
  DATA(it_keyflied_list) = o_sdesc->get_ddic_field_list( ).
* nur die Keyfields zurückgeben
  DELETE it_keyflied_list WHERE keyflag <> abap_true.

  cl_demo_output=>write_data( it_keyflied_list ).
  cl_demo_output=>write_data( it_mara ).

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

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

[ABAP] SALV-Grid: Eventhandler für Klick auf eine Zelle (link_click, hotspot)

CLASS lcl_salv DEFINITION FINAL.

  PUBLIC SECTION.

    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.

    CLASS-METHODS on_link_click FOR EVENT link_click OF cl_salv_events_table
      IMPORTING
        row
        column
        sender.
ENDCLASS.

CLASS lcl_salv IMPLEMENTATION.

  METHOD on_link_click.
    IF o_salv IS BOUND.
* Wert in der geklickten Zelle holen
      DATA(lv_matnr18) = CONV matnr18( o_salv->get_selections( )->get_current_cell( )-value ).

* Parameter zum Aufruf MM03:
* https://www.samplecodeabap.com/call-transaction-mm03-with-specific-tab/

* MATNR setzen
      SET PARAMETER ID 'MAT' FIELD lv_matnr18.
* K - Grunddaten anzeigen
      SET PARAMETER ID 'MXX' FIELD 'K'.
* Transaktion MM03 aufrufen (Material anzeigen)
      CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

  SELECT FROM mara AS m
    INNER JOIN makt AS t ON m~matnr = t~matnr
    FIELDS m~matnr,
           m~laeda,
           m~mtart,
           m~meins,
           t~maktx
    WHERE t~spras EQ @sy-langu
    INTO TABLE @DATA(it_mara)
	UP TO 50 ROWS.

  IF sy-subrc = 0.
    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table = lcl_salv=>o_salv
                                CHANGING  t_table      = it_mara ).

* Grundeinstellungen
        lcl_salv=>o_salv->get_functions( )->set_all( abap_true ).
        lcl_salv=>o_salv->get_columns( )->set_optimize( abap_true ).
        lcl_salv=>o_salv->get_display_settings( )->set_list_header( 'Material' ).
        lcl_salv=>o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        lcl_salv=>o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
        LOOP AT lcl_salv=>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_long_text( ) }| ).
        ENDLOOP.

* Link-Klick für Spalte MATNR
        CAST cl_salv_column_table( lcl_salv=>o_salv->get_columns( )->get_column( 'MATNR' ) )->set_cell_type( if_salv_c_cell_type=>hotspot ).
* Event-Hanlder für Link-Klick
        SET HANDLER lcl_salv=>on_link_click FOR lcl_salv=>o_salv->get_event( ).

        lcl_salv=>o_salv->display( ).

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

[ABAP] Material-Ledger: Materialpreise für unterschiedliche Währungstypen pflegen

* MATNR
PARAMETERS: p_matnr TYPE mara-matnr.
* Bewertungskreis
PARAMETERS: p_bwkey TYPE t001k-bwkey.
* Preis
PARAMETERS: p_price TYPE bapi_matval_prices-price DEFAULT '1.00'.
* Währung
PARAMETERS: p_waers TYPE tcurc-waers DEFAULT 'EUR'.

START-OF-SELECTION.

* Bewertungskreis (MBEW-BWKEY) == WERKS
  DATA(lv_valuationarea) = CONV bapi_matval_key-val_area( p_bwkey ).
* Bewertungsart (MBEW-BWTAR), siehe Tabelle T149D
  DATA(lv_valuationtype) = CONV bapi_matval_key-val_type( ' ' ).
* Struktur Preisänderungs-Datum
  DATA(lv_pricedate) = VALUE bapi_matval_pricedate( price_date  = sy-datum
                                                    fisc_period = sy-datum+4(2)
                                                    fisc_year   = sy-datum+0(4)
                                                  ).
* Belegkopftext
  DATA(lv_doc_header_text) = CONV bktxt( 'Materialbeleg Text' ).

* Material-Ledger-Typ zum Bewertungskreis
  SELECT SINGLE FROM tckm2
    FIELDS matled
    WHERE bwkey = @p_bwkey
    INTO @DATA(lv_matled).

  IF sy-subrc = 0.
* Währungs-, Bewertungstypen zum Material-Ledger-Typ
* CURTP (Währungstyp)
    SELECT FROM tckmit
      INNER JOIN tcval ON tckmit~cvtyp = tcval~cvtyp
      FIELDS tckmit~cvtyp,  " Währungs- und Bewertungstyp
             tcval~currtyp, " Währungstyp
             tcval~valutyp  " Bewertungssicht
      WHERE matled = @lv_matled
      INTO TABLE @DATA(it_cvtyp).

    IF sy-subrc = 0.
* Währungscodes
      SELECT SINGLE FROM tcurc
        FIELDS altwr
        WHERE waers = @p_waers
        INTO @DATA(lv_iso).

      IF sy-subrc = 0.
* Preise für alle Währungstypen (CVTYP) setzen
        DATA: it_prices TYPE STANDARD TABLE OF bapi_matval_prices WITH DEFAULT KEY.

        LOOP AT it_cvtyp ASSIGNING FIELD-SYMBOL(<cv>).
* Beispiel:
*   Preise + Währungen für alle Währungstypen des Ledgers zum Bewertungskreis gleich setzen
* Beachte: es gibt andere Anwendungsfälle, insbesondere bei abweichenden Währungstypen (anderen Konzernwährungen (USD usw.)),
*          bei denen die Preise unterschiedlich sein können
* siehe auch MM03 (Reiter "Buchhaltung 1")
          APPEND VALUE #( valuation_view = <cv>-valutyp            " DOMÄNE VALUTYP: 0  - Legale Bewertung, 1 - Konzernbewertung, 2 - Profit-Center-Bewertung
                          curr_type      = <cv>-cvtyp              " 10 - Buchungskreiswährung, 30 - Konzernwährung, 31 - Konzernwährung, Konzernbewertung
                          currency       = p_waers                 " EUR
                          currency_iso   = lv_iso                  " EUR -> 978
                          price_unit     = 1                       " Preiseinheit aus MBEW-BWPEI
                          price          = p_price ) TO it_prices. " Preis ggf. aus MBEW-VERPR
        ENDLOOP.

* Materialpreis-Änderungsbeleg
        DATA: lv_pricechangedocument TYPE bapi_pricechange_document.
* Fehlermeldungen des BAPIs
        DATA(it_bapiret2) = VALUE bapiret2_t( ).

* Materialpreis-Änderung
* Voraussetzung ist Pflege der Materialbewertung zum Materialstamm
        CALL FUNCTION 'BAPI_MATVAL_PRICE_CHANGE'
          EXPORTING
            material            = CONV bapi_matval_key-material( p_matnr ) " MARA-MATNR
            valuationarea       = lv_valuationarea                         " MBEW-BWKEY
            valuationtype       = lv_valuationtype                         " MBEW-BWTAR
            pricedate           = lv_pricedate
            doc_header_text     = lv_doc_header_text
          IMPORTING
            pricechangedocument = lv_pricechangedocument
          TABLES
            prices              = it_prices
            return              = it_bapiret2.

        IF lines( it_bapiret2 ) > 0.
          IF it_bapiret2[ 1 ]-type CA 'EAX'.
* bei Fehler: Rollback
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
            DATA(lv_return) = VALUE bapiret2( ).
* alles ok: COMMIT
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait   = abap_true
              IMPORTING
                return = lv_return.
          ENDIF.
        ENDIF.

        cl_demo_output=>write_data( p_matnr ).
        cl_demo_output=>write_data( p_bwkey ).
        cl_demo_output=>write_data( lv_pricedate ).
        cl_demo_output=>write_data( lv_doc_header_text ).
        cl_demo_output=>write_data( it_prices ).
        cl_demo_output=>write_data( lv_pricechangedocument ).
        cl_demo_output=>write_data( it_bapiret2 ).
        cl_demo_output=>write_data( lv_return ).

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

[ABAP] Dokumente per URL im Document Viewer anzeigen

PARAMETERS: p_url TYPE swk_url DEFAULT 'https://google.de'.

START-OF-SELECTION.

* https://help.sap.com/docs/SAP_NETWEAVER_731_BW_ABAP/70396d7dec4c4f19b9ca3b2e47559d12/493278eee8c55aabe10000000a42189d.html
  TRY.
      DATA: o_viewer TYPE REF TO i_oi_document_viewer.

* Container-Control-Factory-Klasse
      c_oi_container_control_creator=>get_document_viewer( IMPORTING viewer = o_viewer ).
* Standardcontainer nutzen
      o_viewer->init_viewer( parent = cl_gui_container=>default_screen ).
* Dokument inplace anhand einer URL anzeigen
      o_viewer->view_document_from_url( document_url = p_url
                                        show_inplace = abap_true ).

      WRITE: space.

    CATCH cx_root.
  ENDTRY.

[ABAP] Systeminformationen anzeigen

DATA: lv_rfcsi_export TYPE rfcsi.
DATA: lv_current_resources TYPE sy-index.
DATA: lv_maximal_resources TYPE sy-index.
DATA: lv_recommended_delay TYPE sy-index.
DATA: lv_s4_hana TYPE char1.
DATA: lv_fast_ser_vers TYPE int4.
DATA: lv_fqhn	TYPE string.

* Liefert versch. Informationen über das System.
CALL FUNCTION 'RFC_SYSTEM_INFO'
  IMPORTING
    rfcsi_export      = lv_rfcsi_export
    current_resources = lv_current_resources
    maximal_resources = lv_maximal_resources
    recommended_delay = lv_recommended_delay
    s4_hana           = lv_s4_hana
    fast_ser_vers     = lv_fast_ser_vers
    fqhn              = lv_fqhn.

cl_demo_output=>write_data( lv_rfcsi_export ).
cl_demo_output=>write_data( lv_current_resources ).
cl_demo_output=>write_data( lv_maximal_resources ).
cl_demo_output=>write_data( lv_recommended_delay ).
cl_demo_output=>write_data( lv_s4_hana ).
cl_demo_output=>write_data( lv_fast_ser_vers ).
cl_demo_output=>write_data( lv_fqhn ).

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

* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] XML-Editor in der SAPGUI anzeigen, XML-Daten editieren

DATA(it_xml) = VALUE string_table( ( |<?xml version="1.0" encoding="utf-8"?>| )
                                   ( |<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">| )
                                   ( |<asx:values>| )
                                   ( |<TEXT>Hello world!</TEXT>| )
                                   ( |</asx:values>| )
                                   ( |</asx:abap>| )
                                 ).

* XML Viewer and Editor
* XML-Editor im aktuellen Modus im SAPGUI anzeigen
DATA(o_xml) = NEW cl_proxy_xml_edit( cl_gui_container=>default_screen ).

* XML in Editor übergeben
o_xml->set_text( it_xml ).
* Editmode einschalten
o_xml->set_change_mode( abap_true ).
* XML formatieren
o_xml->pretty_print( ).
* Editor visible setzen
o_xml->set_visible( abap_true ).

* Ausgabe auf cl_gui_container=>default_screen erzwingen
WRITE: space.