[ABAP] Dynamische Dokumente mit SALV-Form LayoutGrid / ABAP-Renderer erstellen

START-OF-SELECTION.

* Grid
  DATA(o_grid) = NEW cl_salv_form_layout_grid( ).

* Gridlines
  o_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).

* Header (Überschrift), Colspan
  DATA(o_head) = o_grid->create_header_information( row = 1
                                                    column = 1
                                                    text = 'Überschrift'
                                                    colspan = 2 ).

* Header Align Center
  DATA: o_al_head TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_head ?= o_head->get_layout_data( ).
  o_al_head->set_h_align( if_salv_form_c_h_align=>center ).

* Text
  DATA(o_text) = o_grid->create_text( row = 2
                                      column  = 2
                                      text    = 'Right'
                                      tooltip = 'Right' ).

* Text Align Right
  DATA: o_al_text TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_text ?= o_text->get_layout_data( ).
  o_al_text->set_h_align( if_salv_form_c_h_align=>right ).

* GroupBox
  DATA(o_grp1) = NEW cl_salv_form_groupbox( header = 'My Groupbox 1' ).
  o_grid->set_element( row = 3
                       column = 1
                       r_element = o_grp1 ).

  DATA(o_grp_grid) = o_grp1->create_grid( ).
  o_grp_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).
  o_grp_grid->create_text( row = 1
                           column = 1
                           text = 'Icon' ).

* Icon
  DATA(o_icon) = NEW cl_salv_form_icon( icon = icon_header
                                        tooltip = 'Tooltip for Icon' ).

  o_grp_grid->set_element( row       = 1
                           column    = 2
                           r_element = o_icon ).

* Label, Text
  DATA(o_label) = o_grid->create_label( row = 4
                                        column = 1
                                        text = 'Name:' ).
  o_text = o_grid->create_text( row = 4
                                column = 2
                                text = 'Herr Mayer' ).
  o_label->set_label_for( o_text ).

* Row
  DATA(o_row) = o_grid->add_row( ).
  o_label = o_row->create_label( text = 'Firma:' ).
  o_text = o_row->create_text( text = 'Beier' ).
  o_label->set_label_for( o_text ).

* HTML-Renderer
  DATA(o_form) = NEW cl_salv_form_window_dydos( popup = abap_true     " als modales Fenster anzeigen, nicht verfügbar bei cl_salv_form_window_abap
                                                r_content = o_grid ).

* Status
  DATA(o_status) = o_form->get_status( ).
  o_status->set_titlebar( titlebar       = 'FORM1_TITLE'              " GUI-Titel der Anwendung muss gepflegt sein
                          titlebar_repid = sy-repid ).

* Display
  o_form->display( ).

[ABAP] Anzeige der Toolbar unterdrücken / ausschalten

Variante 1 (cl_abap_list_layout)

PARAMETERS: p_matnr TYPE matnr.

AT SELECTION-SCREEN OUTPUT.
* Unterdrückt die Applikationszeile auf dem Listdynpro
  cl_abap_list_layout=>suppress_toolbar( ).

START-OF-SELECTION.
  WRITE: / p_matnr.

Variante 2 (RPY_DYNPRO_READ, RPY_DYNPRO_INSERT)

PARAMETERS: p_matnr TYPE matnr.

AT SELECTION-SCREEN OUTPUT.

  DATA: lv_header               TYPE rpy_dyhead.
  DATA: it_containers           TYPE dycatt_tab.
  DATA: it_fields_to_containers TYPE dyfatc_tab.
  DATA: it_flow_logic           TYPE swydyflow.

* Lesen eines Dynpros
  CALL FUNCTION 'RPY_DYNPRO_READ'
    EXPORTING
      progname             = sy-cprog
      dynnr                = sy-dynnr
    IMPORTING
      header               = lv_header
    TABLES
      containers           = it_containers
      fields_to_containers = it_fields_to_containers
      flow_logic           = it_flow_logic
    EXCEPTIONS
      cancelled            = 1
      not_found            = 2
      permission_error     = 3
      OTHERS               = 4.

  IF sy-subrc = 0.
* Anzeige der Toolbar prüfen
    IF lv_header-no_toolbar = abap_false.
      lv_header-no_toolbar = abap_true.

* Einfügen eines Dynpros
      CALL FUNCTION 'RPY_DYNPRO_INSERT'
        EXPORTING
          header                 = lv_header
          suppress_exist_checks  = abap_true
        TABLES
          containers             = it_containers
          fields_to_containers   = it_fields_to_containers
          flow_logic             = it_flow_logic
        EXCEPTIONS
          cancelled              = 1
          already_exists         = 2
          program_not_exists     = 3
          not_executed           = 4
          missing_required_field = 5
          illegal_field_value    = 6
          field_not_allowed      = 7
          not_generated          = 8
          illegal_field_position = 9
          OTHERS                 = 10.
    ENDIF.
  ENDIF.

START-OF-SELECTION.
  WRITE: / p_matnr.

[ABAP] Grundstruktur für Report mit Dynpro

DATA: ok_code TYPE sy-ucomm.                      " OK-CODE für Benutzer-Kommandos (Buttons, Menü, ...)
DATA: o_cont TYPE REF TO cl_gui_custom_container. " Containerobjekt für andere GUI-Elemente

START-OF-SELECTION.
  " Screen 100 aufrufen, auf diesen muss sich ein
  " Custom-Control 'CNT_MAIN' befinden (Screenpainter)
  " und es muss ein PF-STATUS 'ST_100' und
  " ein GUI-TITLE 'ST_100_TITLE' vorhanden sein
  CALL SCREEN 100.

*---------------------------------------------------------------------*
*      Module  STATUS_0100  OUTPUT
*---------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'ST_100'.
  SET TITLEBAR 'ST_100_TITLE'.

  " cl_gui_custom_container erzeugen und in Container 'CNT_MAIN' ablegen
  " cl_gui_custom_container kann andere GUI-Elemente tragen
  IF o_cont IS NOT BOUND.
    o_cont = NEW cl_gui_custom_container( container_name = 'CNT_MAIN' ).
  ENDIF.
ENDMODULE.
*---------------------------------------------------------------------*
*      Module  USER_COMMAND_0100  INPUT
*---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE ok_code.
    " wenn im PF-STATUS die Kommandos 'BACK' / 'CANCEL' / 'EXIT
    " gesetzt wurden, hier darau reagieren
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      " Container freigeben
      IF o_cont IS BOUND.
        o_cont->free( ).
      ENDIF.

      " Programm beenden
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

[ABAP] Dialogbox mit SALV-Table ohne zusätzliches Dynpro

* Eventhandlerklasse
CLASS cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS on_close FOR EVENT close OF cl_gui_dialogbox_container
      IMPORTING sender.
ENDCLASS.

CLASS cl_handle_events IMPLEMENTATION.
  METHOD on_close.
    IF sender IS NOT INITIAL.
      sender->free( ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.

DATA: it_sflight TYPE STANDARD TABLE OF sflight.

START-OF-SELECTION.
  " Daten holen
  SELECT * INTO TABLE it_sflight FROM sflight WHERE carrid = 'LH'.

  " Container für Popup erzeugen
  DATA(o_gui_cnt) = NEW cl_gui_dialogbox_container( no_autodef_progid_dynnr = abap_true
                                                    caption = 'Ausgabe Testdaten für Lufthansa'
                                                    top = 20
                                                    left = 20
                                                    width = 1280
                                                    height = 400 ).

  DATA: o_salv TYPE REF TO cl_salv_table.

  " SALV-Table erzeugen
  cl_salv_table=>factory( EXPORTING
                            r_container  = o_gui_cnt
                          IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_sflight ).

  " Events registrieren
  DATA(o_events) = NEW cl_handle_events( ).
  SET HANDLER o_events->on_close FOR o_gui_cnt.

  " SALV-Table anzeigen
  o_salv->display( ).

  " Anzeige des Popup erzwingen
  WRITE: / space.

[ABAP] Variablen im ABAP-Programmspeicher zwischenspeichern, IMPORT / EXPORT FROM MEMORY ID

Die Objekte sind solange im Zwischenspeicher vorhanden, wie die aktuelle Session aktiv ist.

Beispiel 1 (String)

* Name für Speicherobjekt definieren
CONSTANTS: c_mem_str TYPE char10 VALUE 'STR_TEST1'.

DATA: lv_s TYPE string VALUE 'Test123'.

INITIALIZATION.
* Variable aus dem Zwischenspeicher holen
  IMPORT lv_s FROM MEMORY ID c_mem_str.

START-OF-SELECTION.

  WRITE: / 'Alt:', lv_s.

* Speicherinhalt löschen
  DELETE FROM MEMORY ID c_mem_str.

  lv_s = ''.

* Speicherinhalt importieren
* -> Es werden nur INITIAL-Variablen überschrieben!
  IMPORT lv_s FROM MEMORY ID c_mem_str.

  WRITE: / 'Leer: ', lv_s.

* Variable verändern
  lv_s = sy-uzeit.

* Variable im Zwischenspeicher ablegen
  EXPORT lv_s TO MEMORY ID c_mem_str.

  WRITE: / 'Neu:', lv_s.

Beispiel 2 (interne Tabelle)

* Name für Speicherobjekt definieren
CONSTANTS: c_mem_itab TYPE char10 VALUE 'ITAB_STR'.

DATA: it_strings TYPE STANDARD TABLE OF string WITH DEFAULT KEY.

INITIALIZATION.
* iTab aus dem Zwischenspeicher holen
  IMPORT it_strings FROM MEMORY ID c_mem_itab.

START-OF-SELECTION.

  WRITE: / 'Alt:'.

  LOOP AT it_strings ASSIGNING FIELD-SYMBOL(<fs_line1>).
    WRITE: / <fs_line1>.
  ENDLOOP.

* Speicherinhalt löschen
  DELETE FROM MEMORY ID c_mem_itab.

  CLEAR: it_strings.

* Speicherinhalt importieren
* -> Es werden nur INITIAL-Variablen überschrieben!
  IMPORT it_strings FROM MEMORY ID c_mem_itab.

  ULINE.
  WRITE: / 'Leer:'.

  LOOP AT it_strings ASSIGNING FIELD-SYMBOL(<fs_line2>).
    WRITE: / <fs_line2>.
  ENDLOOP.

* itab mit neuen Daten füllen
  DATA: lv_tsl TYPE timestampl.
  GET TIME STAMP FIELD lv_tsl.

  it_strings = VALUE #( ( |{ lv_tsl TIMESTAMP = USER }| ) ( |{ lv_tsl TIMESTAMP = USER }| ) ( |{ lv_tsl TIMESTAMP = USER }| ) ).

* iTab im Zwischenspeicher ablegen
  EXPORT it_strings TO MEMORY ID c_mem_itab.

  ULINE.
  WRITE: / 'Neu:'.

  LOOP AT it_strings ASSIGNING FIELD-SYMBOL(<fs_line3>).
    WRITE: / <fs_line3>.
  ENDLOOP.

Weiterführende Links: Link und Link

[ABAP] GUI-Splitter und ALV-Grid ohne zusätzliches Dynpro

DATA: lt_sflight TYPE TABLE OF sflight.

START-OF-SELECTION.
  SELECT * FROM sflight INTO TABLE @lt_sflight.

  DATA(l_splitter) = NEW cl_gui_splitter_container( parent = cl_gui_container=>default_screen
                                                    no_autodef_progid_dynnr = abap_true       " wichtig
                                                    rows = 1
                                                    columns = 2 ).

  DATA(l_container_left) = l_splitter->get_container( row = 1 column = 1 ).
  DATA(l_container_right) = l_splitter->get_container( row = 1 column = 2 ).

  l_splitter->set_column_width( id = 1 width = 30 ).

  DATA(l_alv_left) = NEW cl_gui_alv_grid( i_parent = l_container_left ).
  DATA(l_alv_right) = NEW cl_gui_alv_grid( i_parent = l_container_right ).

  l_alv_left->set_table_for_first_display( EXPORTING
                                             i_structure_name = 'SFLIGHT'
                                           CHANGING
                                             it_outtab        = lt_sflight ).

  l_alv_right->set_table_for_first_display( EXPORTING
                                              i_structure_name = 'SFLIGHT'
                                            CHANGING
                                              it_outtab        = lt_sflight ).

  WRITE: space. " wichtig: Ausgabe des Dynpros erzwingen

[ABAP] Sprachausgabe im SAP über Microsoft SAPI.SpVoice

DATA: v_objole TYPE ole2_object.
DATA: o_voice  TYPE ole2_object.
DATA: lv_satz  TYPE string.

CREATE OBJECT o_voice 'SAPI.SpVoice'.

SET PROPERTY OF o_voice 'Volume' = 100.
SET PROPERTY OF o_voice 'Rate' = -1.
*SET PROPERTY OF o_voice 'Voice' = 0.

lv_satz = 'SAP ist toll!'.

CALL METHOD OF o_voice 'Speak' = v_objole
  EXPORTING
    #1 = lv_satz
    #2 = 1. " SVSFlagsAsync.

FREE OBJECT: o_voice.
FREE OBJECT: v_objole.

[ABAP] Subscreens auf dem Selektionsbild verwenden und per Pushbutton umschalten

SELECTION-SCREEN COMMENT /1(50) comm1.
SELECTION-SCREEN SKIP.

* TabStrip als Containerobjekt, ohne Tabs
SELECTION-SCREEN BEGIN OF TABBED BLOCK sub FOR 3 LINES.
SELECTION-SCREEN END OF BLOCK sub.

* Umschaltbuttons
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
SELECTION-SCREEN PUSHBUTTON (10) btn_1 USER-COMMAND btn_back.
SELECTION-SCREEN PUSHBUTTON (10) btn_2 USER-COMMAND btn_fwd.
SELECTION-SCREEN END OF LINE.

* SUBSCREEN 1
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title1.
PARAMETERS: p1 TYPE string.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 100.

* SUBSCREEN 2
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE title2.
PARAMETERS: p2 TYPE string.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 200.

* SUBSCREEN 3
SELECTION-SCREEN BEGIN OF SCREEN 300 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE title3.
PARAMETERS: p3 TYPE string.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 300.

INITIALIZATION.
  comm1 = 'Beispiel für die Verwendung von Subscreens'.

  title1 = 'Sub1'.
  title2 = 'Sub2'.
  title3 = 'Sub3'.

  btn_1 = |{ icon_column_left }Zurück|.
  btn_2 = |{ icon_column_right }Vor|.

* Subscreen 100 anzeigen
  sub-prog = sy-repid.
  sub-dynnr = 100.

  p1 = '11'.
  p2 = '22'.
  p3 = '33'.

AT SELECTION-SCREEN.

  CASE sy-dynnr.
    WHEN 100.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 300.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 200.
      ENDIF.
    WHEN 200.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 100.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 300.
      ENDIF.
    WHEN 300.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 200.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 100.
      ENDIF.
  ENDCASE.

START-OF-SELECTION.

  WRITE: / p1, p2, p3.