[ABAP] SCREEN-Felder im Selektionsbild manuell setzen

DATA: pernr TYPE persno.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.

PARAMETERS: pa_bukrs TYPE pa0001-bukrs.
SELECT-OPTIONS: so_pernr FOR pernr.

TYPES: ty_it_screen TYPE STANDARD TABLE OF screen WITH DEFAULT KEY.
DATA: it_screen TYPE ty_it_screen.

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.

  title = 'Testblock'.

* SCREEN-Felder auslesen
  LOOP AT SCREEN INTO DATA(lv_screen).
    APPEND lv_screen TO it_screen.
  ENDLOOP.

  %_pa_bukrs_%_app_%-text = 'Par'.
  %_so_pernr_%_app_%-text = 'SelOpt'.

START-OF-SELECTION.
*SSCRFIELDS-UCOMM
*TITLE
*%_PA_BUKRS_%_APP_%-TEXT
*PA_BUKRS
*%_SO_PERNR_%_APP_%-TEXT
*%_SO_PERNR_%_APP_%-OPTI_PUSH
*SO_PERNR-LOW
*%_SO_PERNR_%_APP_%-TO_TEXT
*SO_PERNR-HIGH
*%_SO_PERNR_%_APP_%-VALU_PUSH
*%_17SNS0000194656_%_%_%_%_%_%_

* SCREEN-Felder ausgeben
  cl_demo_output=>display_data( it_screen ).

[ABAP] Klasse für die Anzeige von Funktionbuttons im Selektionsbild

* Quelle: https://abapblog.com/articles/tricks/127-selection-screen-function-key-in-form-function-module-or-method

* Klasse greift auf Systemprogramm RSDBRUNT im Paket SLDBV zu
CLASS zcl_sel_button DEFINITION FINAL.
  PUBLIC SECTION.
    CLASS-METHODS: activate
      IMPORTING i_btn_no TYPE i.

    CLASS-METHODS: deactivate
      IMPORTING i_btn_no TYPE i.

    CLASS-METHODS: set_info
      IMPORTING i_btn_no    TYPE i
                i_text      TYPE gui_text OPTIONAL
                i_icon      TYPE icon_d OPTIONAL
                i_icon_text TYPE gui_ictext OPTIONAL
                i_quickinfo TYPE gui_info OPTIONAL.

  PRIVATE SECTION.
    CONSTANTS: co_current_screen TYPE string VALUE '(RSDBRUNT)CURRENT_SCREEN'.
    CONSTANTS: co_current_scr TYPE string VALUE '(RSDBRUNT)CURRENT_SCR'.

    CLASS-METHODS: set_visible
      IMPORTING i_btn_no  TYPE i
                i_visible TYPE abap_bool.
ENDCLASS.

CLASS zcl_sel_button IMPLEMENTATION.

* Button aktivieren
  METHOD activate.
    set_visible( i_btn_no  = i_btn_no
                 i_visible = abap_true  ).
  ENDMETHOD.

* Button deaktivieren
  METHOD deactivate.
    set_visible( i_btn_no  = i_btn_no
                 i_visible = abap_false ).
  ENDMETHOD.

* Button-Infos setzen
  METHOD set_info.

    IF i_btn_no BETWEEN 1 AND 5 AND NOT i_text IS INITIAL AND NOT i_icon IS INITIAL.

      DATA(sscr) = CONV string( |({ sy-cprog })SSCRFIELDS| ).

      ASSIGN (sscr) TO FIELD-SYMBOL(<sscr>).
      IF <sscr> IS ASSIGNED.
        ASSIGN COMPONENT |FUNCTXT_0{ i_btn_no }| OF STRUCTURE <sscr> TO FIELD-SYMBOL(<btn_text>).
        IF <btn_text> IS ASSIGNED.
          <btn_text> = VALUE smp_dyntxt( icon_id   = i_icon
                                         icon_text = i_icon_text
                                         text      = i_text
                                         quickinfo = i_quickinfo
                                       ).
        ENDIF.
      ENDIF.
    ENDIF.

  ENDMETHOD.

* Button Sichtbarkeit setzen
  METHOD set_visible.

    IF i_btn_no BETWEEN 1 AND 5.
* Funktionsbutton aktivieren/deaktivieren
      FIELD-SYMBOLS: <screen> TYPE sydb0_screen.

      ASSIGN (co_current_screen) TO <screen>.
      IF <screen> IS ASSIGNED.

        DATA(idx) = i_btn_no - 1.
        <screen>-func_keys+idx(1) = i_visible.

      ENDIF.

* Funktionsbutton anzeigen/verbergen
      FIELD-SYMBOLS: <scr> TYPE sydb0_scr_stack_line.

      ASSIGN (co_current_scr) TO <scr>.
      IF <scr> IS ASSIGNED.

        DATA(button) = |FC0{ i_btn_no }|.

        IF i_visible EQ abap_true.
          DELETE <scr>-excl WHERE fcode EQ button.
        ELSE.
          IF NOT line_exists( <scr>-excl[ fcode = button ] ).
            APPEND VALUE #( fcode = button ) TO <scr>-excl.
          ENDIF.
        ENDIF.

      ENDIF.

    ENDIF.

  ENDMETHOD.
ENDCLASS.

PARAMETERS: p_active AS CHECKBOX USER-COMMAND cba.

INITIALIZATION.
* zwei Funktions-Buttons einfügen
  zcl_sel_button=>set_info( EXPORTING
                              i_btn_no    = 1
                              i_text      = 'Text1'
                              i_icon      =  icon_abc
                              i_icon_text = 'Text1'
                              i_quickinfo = 'Info1'
                          ).
  zcl_sel_button=>activate( 1 ).

  zcl_sel_button=>set_info( EXPORTING
                              i_btn_no    = 2
                              i_text      = 'Text2'
                              i_icon      =  icon_activate
                              i_icon_text = 'Text2'
                              i_quickinfo = 'Info2'
                          ).
  zcl_sel_button=>activate( 2 ).

AT SELECTION-SCREEN OUTPUT.
* je nach Status der Checkbox p_active Funktionsbutton 3 ein- oder ausblenden
  IF p_active EQ abap_true.
    zcl_sel_button=>set_info( EXPORTING
                                i_btn_no    = 3
                                i_text      = 'Text3'
                                i_icon      =  icon_add_row
                                i_icon_text = 'Text3'
                                i_quickinfo = 'Info3'
                            ).

    zcl_sel_button=>activate( 3 ).
  ELSE.
    zcl_sel_button=>deactivate( 3 ).
  ENDIF.

AT SELECTION-SCREEN.
* Kommando abfangen (Nummerierung 'FC01' ... 'FC05')
  CASE sy-ucomm.
* wenn Funktionstaste 1 gedrückt
    WHEN 'FC01'.
      MESSAGE sy-ucomm TYPE 'S'.
* wenn Funktionstaste 2 gedrückt
    WHEN 'FC02'.
      MESSAGE sy-ucomm TYPE 'S'.
* wenn Funktionstaste 3 gedrückt
    WHEN 'FC03'.
      MESSAGE sy-ucomm TYPE 'S'.
  ENDCASE.

[ABAP] Selektionsbild – Funktionstasten einfügen

* im Standard-GUI-Status eines Selektionsbildes sind in der Anwendungsfunktionsleiste (Drucktastenleiste) fünf inaktive Drucktasten definiert
* Schnittstellen-Arbeitsbereich der Struktur SSCRFIELDS aus dem ABAP Dictionary definieren (für Dynpro)
TABLES sscrfields.

* Funktionstaste 1 anlegen
SELECTION-SCREEN: FUNCTION KEY 1.
* Funktionstaste 2 anlegen
SELECTION-SCREEN: FUNCTION KEY 2.
  
INITIALIZATION.

* Funktionstaste 1
  sscrfields-functxt_01 = VALUE smp_dyntxt( icon_id = icon_htm
                                            quickinfo = 'HTML'
                                            icon_text = 'HTML' ).

* Funktionstaste 2
  sscrfields-functxt_02 = VALUE smp_dyntxt( icon_id = icon_payment
                                            quickinfo = 'Verarbeitung'
                                            icon_text = 'Verarbeitung' ).
                                            
AT SELECTION-SCREEN.
* Kommando abfangen (Nummerierung 'FC01' ... 'FC05')
  CASE sscrfields-ucomm.
* wenn Funktionstaste 1 gedrückt
     WHEN 'FC01'.
       MESSAGE sscrfields-ucomm TYPE 'I'.
* wenn Funktionstaste 2 gedrückt
     WHEN 'FC02'.
       MESSAGE sscrfields-ucomm TYPE 'I'.
  ENDCASE.

[ABAP] Oberflächenelemente per Button ausblenden

TABLES: sscrfields.

CONSTANTS: BEGIN OF e_status,
             open  TYPE i VALUE 0,
             close TYPE i VALUE 1,
           END OF e_status.

DATA: status_blk2 TYPE i.

SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE title1.
PARAMETERS: p1 TYPE string.
SELECTION-SCREEN: END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (4) btn_oc USER-COMMAND btn_cmd_oc.
SELECTION-SCREEN COMMENT 6(25) lbl_oc.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: BEGIN OF BLOCK blk2 WITH FRAME TITLE title2.
PARAMETERS: s1 TYPE string MODIF ID b2.
PARAMETERS: s2 TYPE string MODIF ID b2.
SELECTION-SCREEN: END OF BLOCK blk2.

INITIALIZATION.
  title1 = 'Kundennummer'.
  title2 = 'Eingabe'.

  lbl_oc  = 'Eingabe'.

  status_blk2 = e_status-close.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN INTO DATA(wa).
    CASE wa-group1.       " Name der Modifikationsgruppe
      WHEN 'B2'.          " wenn in Modifikationsgruppe 'B2'
        IF status_blk2 = e_status-open.
          wa-active = '1'.
        ELSE.
          wa-active = '0'.
        ENDIF.
    ENDCASE.

    MODIFY SCREEN FROM wa.
  ENDLOOP.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'BTN_CMD_OC'.
      IF status_blk2 = e_status-open.
        status_blk2 = e_status-close.
      ELSE.
        status_blk2 = e_status-open.
      ENDIF.
  ENDCASE.

FORM set_btn_icon USING iv_status TYPE i CHANGING btn_icon TYPE any.
  CASE iv_status.
    WHEN e_status-close.
      btn_icon = icon_data_area_expand.
    WHEN e_status-open.
      btn_icon = icon_data_area_collapse.
  ENDCASE.
ENDFORM.