[ABAP] SALV: Selektierte Zeilen (selected rows) eines SALV-Gitters auswerten

* Beispiel für die Auswertung von selektierten Zeilen eines SALV-Grids,
* nachdem ein Button in der Toolbar geklickt wurde
CLASS lcl_salv DEFINITION FINAL.

  PUBLIC SECTION.

* Variablen
    CLASS-DATA: it_data TYPE ty_it_mytable.
    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.
	
* Eventhandler-Methode für Button-Klicks in der Toolbar des SALV-Grids
    CLASS-METHODS: on_toolbar_click FOR EVENT added_function OF cl_salv_events_table
      IMPORTING
        e_salv_function
        sender.
ENDCLASS.

CLASS lcl_salv IMPLEMENTATION.

  METHOD on_toolbar_click.
	TRY.
		IF o_salv IS BOUND.

		  CASE e_salv_function.

			WHEN 'BTN_CHECK'.

* selektierte Zeilen des SALV-Grids holen
			  DATA(it_sel_rows) = o_salv->get_selections( )->get_selected_rows( ).
			  IF lines( it_sel_rows ) > 0.
* Daten aus der internen Tabelle holen
				DATA(it_items) = VALUE ty_it_mytable( FOR <s> IN it_sel_rows ( it_data[ <s> ] ) ).

				...


			  ENDIF.

		  ENDCASE.

		ENDIF.

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

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

    TRY.
        cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                                IMPORTING r_salv_table = lcl_salv=>o_salv
                                CHANGING  t_table      = lcl_salv=>it_data ).
        ...

* eigenen Button in die Toolbar hinzufügen		
        lcl_salv=>o_salv->get_functions( )->add_function( name = 'BTN_CHECK'
                                                          icon = |{ icon_icon_list }|
                                                          text = 'Check'
                                                          tooltip = 'Check'
                                                          position = if_salv_c_function_position=>right_of_salv_functions ).

* Klick-Handler für Toolbar-Buttons													  
        SET HANDLER lcl_salv=>on_toolbar_click FOR lcl_salv=>o_salv->get_event( ).

        ...
		
        lcl_salv=>o_salv->display( ).

* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
        WRITE: space.

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

[ABAP] SALV: Button-Separator in der SALV-Toolbar einfügen

START-OF-SELECTION.
    TRY.
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                                IMPORTING r_salv_table = o_salv
                                CHANGING  t_table      = it_... ).

        ...
								
* Standardmäßig ist beim SALV-Grid nicht vorgesehen, dass ein sog. Button-Separator zur optischen Trennung
* der Bedienbuttons in der SALV-Toolbar eingefügt werden kann. Im Beispiel wird daher ein Standard-Button eingefügt, der
* disabled dargestellt wird (ausgegraut):
        DATA(o_separator) = o_salv->get_functions( )->add_function( name = 'BTN_SEPARATOR|'
                                                                    text = '|'
                                                                    tooltip = ''
                                                                    position = if_salv_c_function_position=>right_of_salv_functions ).
        o_separator->set_enable( abap_false ).

        ...

        o_salv->display( ).

* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
        WRITE: space.

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

[ABAP] CDS-Views: Alle Spaltenbezeichner eines CDS-Views ausgeben

* Beispiel: alle Annotationen des CDS-Views 'C_PURCHASEORDERITEMMONI' lesen
cl_dd_ddl_annotation_service=>get_annos( EXPORTING entityname    = 'C_PURCHASEORDERITEMMONI'
                                         IMPORTING element_annos = DATA(it_element_annos) ).

* alle Annotationen in der Liste löschen, außer 'EnduserText.Label'
DELETE it_element_annos WHERE annoname NE 'ENDUSERTEXT.LABEL'.

LOOP AT it_element_annos ASSIGNING FIELD-SYMBOL(<a>).
  WRITE: / <a>-elementname, <a>-value.
ENDLOOP.

[ABAP] User-Logondaten lesen

DATA: lv_uslogond TYPE uslogond.

* Benutzer: Lesen Logondaten aus Puffer
CALL FUNCTION 'SUSR_USER_LOGONDATA_GET'
  EXPORTING
    user_name           = sy-uname
  IMPORTING
    user_logondata      = lv_uslogond
  EXCEPTIONS
    user_name_not_exist = 1
    OTHERS              = 2.

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

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

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

[ABAP] SALV: Druckausgabe eines SALV-Gitters in SAP-Spool (SP01)

Druckausgabe per ABAP-Code anschieben

SELECT * INTO TABLE @DATA(it_ispfli) FROM spfli UP TO 50 ROWS.

IF sy-subrc = 0.
  TRY.
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                              CHANGING  t_table      = it_ispfli ).

      DATA: lv_print_params TYPE pri_params.

* Druckparameter holen
      CALL FUNCTION 'GET_PRINT_PARAMETERS'
        EXPORTING
          no_dialog              = abap_true
        IMPORTING
          out_parameters         = lv_print_params
        EXCEPTIONS
          archive_info_not_found = 1
          invalid_print_params   = 2
          invalid_archive_params = 3
          OTHERS                 = 4.

      IF sy-subrc = 0.
* nur Drucken in Spool, keine Anzeige des ALV-Grids

* Name eines Geräts
        lv_print_params-pdest = 'LOCL'.
* Beschreibungstext
        lv_print_params-prtxt = |{ sy-datum } { sy-uzeit }|.

* Druckparameter setzen
        DATA(o_print) = o_salv->get_print( ).
        DATA(lv_print_ctrl) = o_print->get_print_control( ).
        lv_print_ctrl-pri_params = lv_print_params.

        o_print->set_print_control( lv_print_ctrl ).
        o_print->set_print_only( abap_true ).

* SALV-Grid anzeigen
        o_salv->display( ).
      ENDIF.

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

Druckausgabe im Batchmodus

SELECT * INTO TABLE @DATA(it_ispfli) FROM spfli UP TO 50 ROWS.

IF sy-subrc = 0.
* Wenn Batchmodus aktiv, dann nur SALV-Objekt erzeugen und per display( ) ausgeben.
* Das SALV-Grid erzeugt automatisch eine Listausgabe der Tabelle in die Spool.
  IF sy-batch = abap_true.
    TRY.
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                                CHANGING  t_table      = it_ispfli ).

* Tabelle im Spool ausgeben
        o_salv->display( ).

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

[ABAP] Statuswerte zu einem IH-Auftrag lesen

* IH-Auftrag
PARAMETERS: p_aufnr TYPE aufk-aufnr.

START-OF-SELECTION.

  SELECT FROM aufk AS a
    INNER JOIN jest AS j ON a~objnr = j~objnr
    INNER JOIN jsto AS o ON j~objnr = o~objnr
    INNER JOIN tj02 AS t2 ON j~stat = t2~istat
    INNER JOIN tj02t AS t ON j~stat = t~istat
*    LEFT OUTER JOIN tj04 AS t4 ON o~obtyp = t4~obtyp AND j~stat = t4~istat
    FIELDS
      a~aufnr,
      a~auart,
      j~objnr,
      o~obtyp,
      o~stsma,
      t~txt04,
      t~txt30
    WHERE a~aufnr = @p_aufnr
      AND j~inact = @abap_false
      AND t~spras = @sy-langu
      AND t2~nodis = @abap_false " keine internen Statuswerte
    INTO TABLE @DATA(it_data).

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

*   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] Gantt-Chart anzeigen

DATA(lv_title) = CONV text70( 'GANTT Demo' ).
DATA(lv_subtitle) = CONV text70( 'Subtitle' ).
DATA(lv_cattitle) = CONV text70( 'Cattitle' ).
DATA(lv_custob) = CONV w3objid( '/ISDFPS/GC200' ). "/ISDFPS/GC250, /ISDFPS/GC300

DATA(it_gantt_serie_data) = VALUE /isdfps/gantt_serie_tab( ( serie = 'SERIES1' serie_label = 'Person 1' )
                                                           ( serie = 'SERIES2' serie_label = 'Person 2' ) ).

DATA(it_gantt_value_data) = VALUE /isdfps/gantt_value_tab( ( bartext = 'Host Müller' category = '1' sub_category = '1' serie = 'SERIES1' begda = '20250101' begti = '080000' endda = '20250102' endti = '100000' objkey = '1' )
                                                           ( bartext = 'Ina Meier'   category = '2' sub_category = '2' serie = 'SERIES2' begda = '20250101' begti = '100000' endda = '20250103' endti = '110000' objkey = '2' ) ).

* Gantt Chart Anzeige
CALL FUNCTION '/ISDFPS/GANTT_CHART_DISPLAY'
  EXPORTING
    title               = lv_title
    subtitle            = lv_subtitle
    category_title      = lv_cattitle
    gantt_serie_data    = it_gantt_serie_data
    gantt_value_data    = it_gantt_value_data
    customizing_object  = lv_custob
*    begda               = '20250101'
*    endda               = '20250103'
*    3dview              = abap_true
  EXCEPTIONS
    no_serie_data       = 1
    no_value_data       = 2
    no_customizing_data = 3
    OTHERS              = 4.

IF sy-subrc <> 0.

ENDIF.

[ABAP] SAPscript-Texte: Clusterdaten ohne READ_TEXT direkt aus Tabelle STXL lesen

TYPES: BEGIN OF ty_s_stxl_raw,
         clustr TYPE stxl-clustr,
         clustd TYPE stxl-clustd,
       END OF ty_s_stxl_raw.

TYPES: ty_t_stxl_raw TYPE STANDARD TABLE OF ty_s_stxl_raw.

PARAMETERS: p_tdobj TYPE ttxob-tdobject DEFAULT 'TEXT'.
PARAMETERS: p_tdname TYPE stxh-tdname MATCHCODE OBJECT icl_stxh DEFAULT 'ADDRESS'.
PARAMETERS: p_tdid TYPE ttxid-tdid DEFAULT 'ST'.

START-OF-SELECTION.

* STXD SAPscript Text-Datei Header
  SELECT FROM stxh
    FIELDS
      tdname,
      tdobject,
      tdid
    WHERE tdobject = @p_tdobj
      AND tdname   = @p_tdname
      AND tdid     = @p_tdid
      AND tdspras  = @sy-langu
    INTO TABLE @DATA(it_stxh).

  IF sy-subrc = 0.

* STXD SAPscript Text-Datei Lines
    SELECT FROM stxl
      FIELDS
        tdname,
        clustr,
        clustd
      FOR ALL ENTRIES IN @it_stxh
      WHERE relid    = 'TX'
        AND tdobject = @it_stxh-tdobject
        AND tdname   = @it_stxh-tdname
        AND tdid     = @it_stxh-tdid
        AND tdspras  = @sy-langu
      INTO TABLE @DATA(it_stxl)
      PACKAGE SIZE 3000. " Datenmenge bei SELECT begrenzen, um Laufzeitfehler zu vermeiden

      DATA: it_stxl_raw TYPE ty_t_stxl_raw.
      CLEAR: it_stxl_raw.

      LOOP AT it_stxl ASSIGNING FIELD-SYMBOL(<stxl>).

        APPEND VALUE ty_s_stxl_raw( clustr = <stxl>-clustr
                                    clustd = <stxl>-clustd ) TO it_stxl_raw.

        DATA(it_lines) = VALUE tline_t( ).

* Zeilen aus Datencluster lesen
        IMPORT tline = it_lines FROM INTERNAL TABLE it_stxl_raw.

        LOOP AT it_lines ASSIGNING FIELD-SYMBOL(<l>).
          WRITE: / <stxl>-tdname, <l>-tdformat, <l>-tdline.
        ENDLOOP.

      ENDLOOP.

    ENDSELECT.

  ENDIF.

Links