[ABAP] Informationen zu einem Dynpro ermitteln

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl1 FOR FIELD p_matnr.
  PARAMETERS: p_matnr TYPE matnr.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Material:'.

START-OF-SELECTION.

  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.
    cl_demo_output=>write_data( lv_header ).
    cl_demo_output=>write_data( it_containers ).
    cl_demo_output=>write_data( it_fields_to_containers ).
    cl_demo_output=>write_data( it_flow_logic ).

* 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 des Dynpros { sy-dynnr }|
                                  html_string  = lv_html
                                  container    = cl_gui_container=>default_screen ).

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

[ABAP] Inhalt eines Dynpros lesen

* Inhalte und Positionen aller Dynprofelder
DATA: it_dynpro_list TYPE STANDARD TABLE OF dynp_list WITH DEFAULT KEY.
* Tabelle mit verwendeten Include-Dynpros
DATA: it_include_dynpro_info TYPE STANDARD TABLE OF incl_dynps WITH DEFAULT KEY.

* Erzeugt Liste mit Positionen und Inhalten aller Einträge eines Dynpros
CALL FUNCTION 'GET_DYNPRO_LIST'
  EXPORTING
    dyname                     = 'SAPLSD_ENTRY' " Name des ABAP/4-Programms (SE11)"
    dynumb                     = '1000'         " Nummer des auszugebenden Dynpros"
*   INCL_COLUMN                = 0
*   INCL_LINE                  = 0
*   INCL_WIDTH                 = 0
*   INCL_HEIGHT                = 0
*   PROCESS_ACTUAL_DYNPRO      = 'X'
  TABLES
    dynpro_list                = it_dynpro_list
    include_dynpro_info        = it_include_dynpro_info
  EXCEPTIONS
    no_such_dynpro             = 1
    no_include_dynpro_infos    = 2
    wrong_include_dynpro_infos = 3
    OTHERS                     = 4.

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

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

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

[ABAP] Informationen zu einem Dynpro lesen

* Dynproheaderstruktur
DATA: lv_header LIKE d020s.
* Dynprofeldtabelle
DATA: it_ftab TYPE STANDARD TABLE OF d021s WITH DEFAULT KEY.
* Tabelle für Dynproablauflogik
DATA: it_pltab TYPE STANDARD TABLE OF d022s WITH DEFAULT KEY.

* Dynproloadinformationen mit ABAP-Mitteln
* request:
*  - 'A' - Dynproheader u. Felder
*  - 'F' - Dynprofelder
*  - 'C' - Dynproablauflogik
*  - 'G' - Generiere
*  - 'H' - Dynproheader
*  - 'T' - Testharms
CALL FUNCTION 'RS_IMPORT_DYNPRO'
  EXPORTING
    dylang               = sy-langu       " Dynprogenerierungssprache
    dyname               = 'SAPLSD_ENTRY' " Name des Dynpros (SE11)
    dynumb               = '1000'         " Nummer des Dynpros
    suppress_checks      = abap_true
*    request              = 'A'
  IMPORTING
    header               = lv_header
  TABLES
    ftab                 = it_ftab
    pltab                = it_pltab
  EXCEPTIONS
    button_error         = 1
    dylanguage_invalid   = 2
    dylanguage_not_inst  = 3
    dyname_invalid       = 4
    dynproload_not_found = 5
    dynpro_old           = 6
    dynumb_invalid       = 7
    ftab_invalid         = 8
    gen_error            = 9
    gen_ok               = 10
    header_invalid       = 11
    internal_error       = 12
    no_dynpro            = 13
    no_ftab_row          = 14
    no_memory            = 15
    no_processlogic      = 16
    pltab_invalid        = 17
    request_invalid      = 18
    OTHERS               = 19.

IF sy-subrc = 0.
  cl_demo_output=>write_data( lv_header ).
  cl_demo_output=>write_data( it_ftab ).
  cl_demo_output=>write_data( it_pltab ).

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

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

[ABAP] Popup-Fenster mit Eingabefeldern anzeigen

Variante 1 (Einfaches Popup-Fenster mit Eingabefeld)

* Button Pos 2 Länge 20, sendet Kommando 'CMD_SHOW'
SELECTION-SCREEN: PUSHBUTTON 2(20) btn1 USER-COMMAND cmd_show.

* Popup-Fenster (Selektionsbild 100) deklarieren
SELECTION-SCREEN BEGIN OF SCREEN 100 TITLE title.
PARAMETERS: p_text TYPE string.
SELECTION-SCREEN END OF SCREEN 100.

INITIALIZATION.
* Fenstertitel
  title = 'Popup'.
* Button-Text setzen
  btn1 = |{ icon_activity }Popup anzeigen|.

AT SELECTION-SCREEN.
* wenn Button-Kommando 'CMD_SHOW'
  IF sy-ucomm = 'CMD_SHOW'.
* Popup-Fenster (Selektionsbild 100) anzeigen
    CALL SELECTION-SCREEN 100 STARTING AT 10 5.
  ENDIF.

START-OF-SELECTION.
* Datenausgabe
  WRITE: / p_text.

Variante 2 (Passwortdialog mit eigenem PF-Status)

* Inspiriert (Quelle) von: http://www.abapgit.org
DATA: gv_user TYPE string.
DATA: gv_pass TYPE string.

**********************************************************************
*
* Dynproelemente für Standard-Selektionbild
*
**********************************************************************
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 2(30) b_pop USER-COMMAND pop.
SELECTION-SCREEN END OF LINE.
**********************************************************************
*
* Dynproelemente für Popup
*
**********************************************************************
SELECTION-SCREEN BEGIN OF SCREEN 3000 TITLE s_title.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) s_user FOR FIELD p_user.
PARAMETERS: p_user TYPE string LOWER CASE.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) s_pass FOR FIELD p_pass.
PARAMETERS: p_pass TYPE string LOWER CASE.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF SCREEN 3000.
**********************************************************************
*
* Klasse zur Anzeige des Popup-Fensters
*
**********************************************************************
CLASS lcl_pwdlg DEFINITION FINAL.

  PUBLIC SECTION.
    CONSTANTS: co_dynnr TYPE char4 VALUE '3000'.

    CLASS-METHODS on_initialization.
    CLASS-METHODS on_output.
    CLASS-METHODS on_event
      IMPORTING
        i_ucomm TYPE sy-ucomm.

    CLASS-METHODS show
      IMPORTING
        i_user TYPE string
      EXPORTING
        e_user TYPE string
        e_pass TYPE string.

  PRIVATE SECTION.
    CLASS-DATA: gv_ok TYPE abap_bool.

ENDCLASS.

CLASS lcl_pwdlg IMPLEMENTATION.

  METHOD on_initialization.
    s_title = 'Loginfenster'.
    s_user  = 'Benutzer'.
    s_pass  = 'Passwort'.
  ENDMETHOD.

  METHOD on_output.
    IF sy-dynnr = lcl_pwdlg=>co_dynnr.
* Wenn Popup angezeigt werden soll

* GUI Status aus Program RSDBRUNT setzen (Ausführen- und Schließen-Button)
      PERFORM set_pf_status IN PROGRAM rsdbrunt IF FOUND.

      DATA: it_ucomm TYPE STANDARD TABLE OF sy-ucomm WITH DEFAULT KEY.

* Prüfen-Button entfernen
      APPEND 'NONE' TO it_ucomm.
* Variante-Speichern-Button entfernen
      APPEND 'SPOS' TO it_ucomm.

      CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
        EXPORTING
          p_status  = sy-pfkey
        TABLES
          p_exclude = it_ucomm.

      IF NOT p_user IS INITIAL.
* Cursor in Passwort-Feld setzen
        SET CURSOR FIELD 'P_PASS'.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD show.

* User + Passwort setzen
    p_user = i_user.
    CLEAR: p_pass.

    gv_ok = abap_false.

* Selektionsbild CO_DYNNR (das Popup) anzeigen
    CALL SELECTION-SCREEN co_dynnr STARTING AT 15 10 ENDING AT 75 12.

    IF gv_ok = abap_true.
* wenn Popup per Ausführen (F8) oder ENTER geschlossen wird, dann Werte übernehmen
      e_user = p_user.
      e_pass = p_pass.
    ENDIF.

    CLEAR: p_user.
    CLEAR: p_pass.

  ENDMETHOD.

  METHOD on_event.
* Tastendrücke vom Popup abfangen
    IF sy-dynnr = co_dynnr.
      CASE i_ucomm.
        WHEN 'CRET'.
* für Ausführen (F8)
          gv_ok = abap_true.
        WHEN OTHERS.
* für ENTER
          gv_ok = abap_true.
          LEAVE TO SCREEN 0.
      ENDCASE.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

INITIALIZATION.
  b_pop   = 'Popup öffnen'.
* Popup initialisieren
  lcl_pwdlg=>on_initialization( ).

AT SELECTION-SCREEN OUTPUT.
  CASE sy-dynnr.
    WHEN 1000.
* wenn Ereignis aus dem Standart-Selektionsbild (Dynpro 1000) getriggert wird

    WHEN lcl_pwdlg=>co_dynnr.
* wenn Ereignis aus dem Popup (Dynpro CO_DYNNR) getriggert wird
      lcl_pwdlg=>on_output( ).
    WHEN OTHERS.
  ENDCASE.

AT SELECTION-SCREEN.
  CASE sy-dynnr.
    WHEN 1000.
* wenn Ereignis aus dem Standart-Selektionsbild (Dynpro 1000) getriggert wird
      CASE sy-ucomm.
* Button "Popup öffnen" geklickt
        WHEN 'POP'.
* Popup anzeigen
          lcl_pwdlg=>show( EXPORTING i_user = CONV #( sy-uname )
                           IMPORTING e_user = gv_user
                                     e_pass = gv_pass ).
      ENDCASE.
    WHEN lcl_pwdlg=>co_dynnr.
* wenn Ereignis aus dem Popup (Dynpro CO_DYNNR) getriggert wird
      lcl_pwdlg=>on_event( sy-ucomm ).
  ENDCASE.

START-OF-SELECTION.
  WRITE: / gv_user.
  WRITE: / gv_pass.

[ABAP] Dynpro: Arbeit mit einer Listbox, welche im Screenpainter erzeugt wurde

Dynpro 0100 im Screenpainter definieren

Textfeld vom Typ Listbox einfügen

Variablendefinition im Top-Include des Reports/Modulpools

* globaler Bezeichner für Listbox definieren, dieser muss namensgleich dem
* Bezeichner des Screenpainter-Elements (Listbox) sein
* Über diesen Bezeichner erfolgt der Zugriff aus dem Code heraus
* --> beim Programmstart wird dieser automatisch dem Screenpainter-Elements
* (Listbox) zugeordnet
DATA: lb_listbox TYPE char255.
* globale Liste für Listboxwerte
DATA: it_lb_values TYPE vrm_values.

Dynpro 0100 PBO -> Initialisierung der Listbox

PROCESS BEFORE OUTPUT.

  MODULE status_0100.

  ...

MODULE status_0100 OUTPUT.

* Werteliste für Listbox initialisieren
  it_lb_values = VALUE vrm_values( ( key = 'A' text = 'Wert1' )
                                   ( key = 'B' text = 'Wert2' )
                                   ( key = 'C' text = 'Wert3' ) ).

* Werteliste der Listbox setzen
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'LB_LISTBOX'
      values          = it_lb_values
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

* Vorauswahl für die Listbox treffen, entsprechenden Key setzen
  lb_listbox = 'A'.

ENDMODULE.

Dynpro 0100 PAI -> Auslesen der Listbox-Auswahl

PROCESS AFTER INPUT.

  MODULE user_command_0100.

  ...

MODULE user_command_0100 INPUT.

  DATA(lv_lb_text) = VALUE char255( ).

* Text aus der Listbox anhand des Keys ermitteln
  TRY.
      lv_lb_text = it_lb_values[ key = lb_listbox ]-text.
    CATCH cx_root.
  ENDTRY.
  
  ...

ENDMODULE.

[ABAP] Werte an Dynpro-Elemente übergeben

Variante 1 (ein Wert mit SET_DYNP_VALUE)

PARAMETERS: p_test TYPE char32 DEFAULT ''.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.

  DATA: lv_value TYPE char32 VALUE 'Test123'.

  CALL FUNCTION 'SET_DYNP_VALUE'
    EXPORTING
      i_field = 'P_TEST'
      i_repid = sy-repid
      i_dynnr = sy-dynnr
      i_value = CONV dynpread-fieldvalue( lv_value ).

Variante 2 (mehrere Werte mit DYNP_UPDATE_FIELDS für Screens mit PBO/PAI-Event)

MODULE status_0100 OUTPUT.

  IF NOT sy-ucomm = 'QUIT'.
* nur durchlaufen, wenn Kommando 'QUIT' nicht getriggert wird
    DATA(it_dyn_update) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' fieldvalue = 'Testwert' ) ).

    CALL FUNCTION 'DYNP_UPDATE_FIELDS'
      EXPORTING
        dyname               = sy-repid
        dynumb               = sy-dynnr
      TABLES
        dynpfields           = it_dyn_update
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        undefind_error       = 7
        OTHERS               = 8.

    IF sy-subrc = 0.

    ENDIF.
  
  ELSE.
* wenn Kommando "QUIT", dann Programmende
    LEAVE PROGRAM.
  ENDIF.

ENDMODULE.

Variante 3 (mehrere Werte mit DYNP_VALUES_UPDATE, funktioniert bei Screens ohne PBO/PAI-Event (z.B. Selektionsbild, F4-Hilfe))

* https://www.berater-wiki.de/Funktionsbaustein_DYNP_VALUES_UPDATE
PARAMETERS: p_test TYPE char32 DEFAULT ''.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
* Tabelle mit Feldern / GUI-Elementen, deren Werte gesetzt werden sollen
  DATA(it_dyn_update) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' fieldvalue = 'Testwert' ) ).

  CALL FUNCTION 'DYNP_VALUES_UPDATE'
    EXPORTING
      dyname               = sy-repid " sy-cprog
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = it_dyn_update
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      undefind_error       = 7
      OTHERS               = 8.

  IF sy-subrc = 0.
* ggf. Screen-Update über Setzen eines Funktionscodes triggern
*    CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'.
  ENDIF.

[ABAP] Werte von Dynpro-Elementen auslesen

Variante 1 (ein Wert mit GET_DYNP_VALUE)

PARAMETERS: p_test TYPE char32 DEFAULT 'Test123'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
  DATA(lv_value) = VALUE char255( ).

* sy-repid und sy-dynnr müssen beim Auslesevorgang auch im akt. Ereignis vorhanden sein, sonst Exception
  CALL FUNCTION 'GET_DYNP_VALUE'
    EXPORTING
      i_field = 'P_TEST'
      i_repid = sy-repid
      i_dynnr = sy-dynnr
    CHANGING
      o_value = lv_value.

  MESSAGE lv_value TYPE 'I'.

Variante 2 (mehrere Werte mit DYNP_VALUES_READ)

PARAMETERS: p_test TYPE char32 DEFAULT 'Test123'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
* Tabelle mit Feldern / GUI-Elementen, die ausgelesen werden sollen
  DATA(it_dyn_read) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' ) ).

* sy-repid und sy-dynnr müssen beim Auslesevorgang auch im akt. Ereignis vorhanden sein, sonst Exception
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname               = sy-repid " sy-cprog
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = it_dyn_read
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      invalid_parameter    = 7
      undefind_error       = 8
      double_conversion    = 9
      stepl_not_found      = 10
      OTHERS               = 11.

  IF sy-subrc = 0.
    IF lines( it_dyn_read ) > 0.
      MESSAGE it_dyn_read[ 1 ]-fieldvalue TYPE 'I'.
    ENDIF.
  ENDIF.

[ABAP] Buttons aus der Drucktastenleiste des akt. GUI Status einblenden / ausblenden

Manchmal ist es notwendig Buttons der Drucktastenleiste ein- oder auszublenden.

  • Standard-GUI-Status für Screen 1000: ‘%_00’ (RSSYSTDB)
  • weitere Button-Bezeichner sind zur Programmlaufzeit im Menü unter System -> Status… -> Doppelklick auf “Oberflächenstatus” erreichbar

Beispiel 1 (ausblenden)

* Drucktastenleiste: Button "Ausführen (F8)" entfernen
DATA: it_exclude_btn TYPE STANDARD TABLE OF rsexfcode WITH DEFAULT KEY.
it_exclude_btn = VALUE #( ( fcode = 'ONLI' ) ).

CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
  EXPORTING
    p_status  = '%_00' " akt. Standard-GUI-Status für Screen 1000, ggf. auch sy-pfkey nutzen
  TABLES
    p_exclude = it_exclude_btn.

Beispiel 2 (einblenden)

DATA: it_exclude_btn TYPE STANDARD TABLE OF rsexfcode WITH DEFAULT KEY.
* alle auszublendenden Buttons entfernen
CLEAR: it_exclude_btn.

CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
  EXPORTING
    p_status  = '%_00' " akt. Standard-GUI-Status für Screen 1000, ggf. auch sy-pfkey nutzen
  TABLES
    p_exclude = it_exclude_btn.

Links

[ABAP] TextEdit Control (cl_gui_textedit) für Quellcodedarstellung in eigenem Dynpro anzeigen

DATA: ok_code TYPE sy-ucomm.
DATA: o_cont TYPE REF TO cl_gui_custom_container.
DATA: o_edit TYPE REF TO cl_gui_textedit.

START-OF-SELECTION.
  CALL SCREEN 100. " Screen 100 hat ein Custom-Control 'CNT_MAIN'

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

  IF o_cont IS NOT BOUND.
    o_cont = NEW cl_gui_custom_container( container_name = 'CNT_MAIN' ).
  ENDIF.

  IF o_edit IS NOT BOUND.
    o_edit = NEW cl_gui_textedit( wordwrap_mode = cl_gui_textedit=>wordwrap_at_windowborder
                                  wordwrap_to_linebreak_mode = cl_gui_textedit=>true
                                  parent = o_cont ).
  ENDIF.

  IF o_cont IS BOUND AND o_edit IS BOUND.
* Text readonly
    o_edit->set_readonly_mode( readonly_mode = cl_gui_textedit=>true ).
* für Quellcodedarstellung z.B. Kommentare hervorheben
    o_edit->set_comments_string( comments_string = '*' ).
    o_edit->set_highlight_comments_mode( highlight_comments_mode = cl_gui_textedit=>true ).
* Anzeige von Toolbar und Statusbar des Texteditors unterdrücken
    " o_edit->set_toolbar_mode( toolbar_mode = cl_gui_textedit=>false ).
    " o_edit->set_statusbar_mode( statusbar_mode = cl_gui_textedit=>false ).
  ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      IF o_edit IS BOUND.
        o_edit->free( ).
      ENDIF.

      IF o_cont IS BOUND.
        o_cont->free( ).
      ENDIF.

      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT

Weiterführende Infos: Link