[ABAP] SELECT-OPTIONS Auswahldialog anzeigen

Variante 1 (RANGE)

DATA: rg_matnr TYPE RANGE OF matnr.

CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
  EXPORTING
    title             = 'Auswahl'
    text              = 'Materialnummern'
  TABLES
    range             = rg_matnr
  EXCEPTIONS
    no_range_tab      = 1
    cancelled         = 2
    internal_error    = 3
    invalid_fieldname = 4
    OTHERS            = 5.

IF sy-subrc = 0.
  cl_demo_output=>display( rg_matnr ).
ENDIF.

Variante 2 (RSTABFIELD)

DATA(lv_tab_field) = VALUE rstabfield( tablename = 'CSKS' fieldname = 'KOSTL' ).

DATA: rg_test TYPE RANGE OF csks-kostl.

CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
  EXPORTING
    title             = 'Auswahl'
    text              = 'Kostenstelle'
    tab_and_field     = lv_tab_field
    help_field        = 'CSKS-KOSTL'
  TABLES
    range             = rg_test
  EXCEPTIONS
    no_range_tab      = 1
    cancelled         = 2
    internal_error    = 3
    invalid_fieldname = 4
    OTHERS            = 5.

IF sy-subrc = 0.
  cl_demo_output=>display( rg_test ).
ENDIF.

[ABAP] SELECT-OPTIONS: Einschränkung der Mehrfachauswahl

* https://www.consolut.com/s/sap-ides-zugriff/d/e/doc/E-SELECT_OPTIONS_RESTRICT/
* http://saptechnical.com/Tips/ABAP/restrict.htm

DATA: lv_matnr TYPE matnr.
SELECT-OPTIONS: so_matnr FOR lv_matnr.

INITIALIZATION.
* Name einer Optionenliste für SELECT-OPTIONS-Restriktionen
  DATA(lv_opt_list) = 'OPT_LIST'.

* Optionenliste
  DATA(it_options) = VALUE sscr_opt_list_tab( ( name       = lv_opt_list
                                                options-eq = abap_true ) ).

* Zuweisungen
  DATA(it_assignment) = VALUE sscr_ass_tab( ( kind    = 'S'                " A(ll), B(lock), S(elect-Option)
                                              name    = 'SO_MATNR'         " Blockname, maximal 20 Zeichen
                                              sg_main = 'I'                " (only) I, SPACE = both
                                              op_main = lv_opt_list ) ).

* Einschränkungen für die SELECT-OPTIONS
  DATA(it_restrictions) = VALUE sscr_restrict( opt_list_tab = it_options
                                               ass_tab      = it_assignment ).

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = it_restrictions
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

  IF sy-subrc = 0.

  ENDIF.

[ABAP] SELECT-OPTIONS Auswahl vorbelegen

Beispiel 1

DATA: gv_num TYPE i.
 
SELECT-OPTIONS: p_num FOR gv_num.
 
INITIALIZATION.
 
* Zahlenwerte 3 und 9
  p_num[] = VALUE #( ( sign = 'I' option = 'EQ' low = 3 )
                     ( sign = 'I' option = 'EQ' low = 9 ) ).

Beispiel 2

DATA: gv_matnr TYPE mara-matnr.
DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_matnr FOR gv_matnr.
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.

* MATNR von / bis
  so_matnr[] = VALUE #( ( sign = 'I' option = 'BT' low = '000000001000000000' high = '000000002000000000' ) ).
  
* Werk 0001
  so_werks[] = VALUE #( ( sign = 'I' option = 'EQ' low = '0001' ) ).

Beispiel 3

DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.
  
* Ausschluss Werk 0001
  so_werks[] = VALUE #( ( sign = 'E' option = 'EQ' low = '0001' ) ).

[ABAP] Parameter mit Auswahlbereich (SELECT-OPTIONS)

Variante 1 (DATA)

DATA: lv_matnr TYPE matnr.

* Parameterfeld von ... bis mit Dictionary-Type
SELECT-OPTIONS: so_matnr FOR lv_matnr DEFAULT '0000000001' TO '1000000000'.

START-OF-SELECTION.

* so_matnr ist eine itab mit Kopfzeile
  IF lines( so_matnr ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_matnr[ 1 ]-sign, so_matnr[ 1 ]-option, so_matnr[ 1 ]-low, so_matnr[ 1 ]-high.
  ENDIF.

Variante 2 (sy-datum)

* von 01.01.1999 bis Systemdatum
SELECT-OPTIONS: so_date FOR sy-datum DEFAULT '19990101' TO sy-datum.

START-OF-SELECTION.

* so_date ist eine itab mit Kopfzeile
  IF lines( so_date ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_date[ 1 ]-sign, so_date[ 1 ]-option, so_date[ 1 ]-low, so_date[ 1 ]-high.
  ENDIF.

Variante 3 (INITIALIZATION)

SELECT-OPTIONS: so_date FOR sy-datum.

INITIALIZATION.
* Initialwerte für so_date setzen
  so_date[] = VALUE #( ( sign   = 'I'
                         option = 'BT'
                         low    = sy-datum - 5
                         high   = sy-datum
                       )
                     ).

START-OF-SELECTION.
* so_date ist eine itab mit Kopfzeile
  IF lines( so_date ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_date[ 1 ]-sign, so_date[ 1 ]-option, so_date[ 1 ]-low, so_date[ 1 ]-high.
  ENDIF.

Variante 4 (TABLES)

* Zugriff Tabellenobjekt aus dem Dictionary deklarieren,
* automatische Verknüpfung der Suchilfe auch zu and. Objekten des Selektionsbildschirms
* obsolet (sollte nicht mehr verwendet werden)
TABLES: mara.

* Parameterfeld von ... bis mit Dictionary-Type
SELECT-OPTIONS: so_matnr FOR mara-matnr DEFAULT '0000000001' TO '1000000000'.

START-OF-SELECTION.

* so_matnr ist eine itab mit Kopfzeile
  IF lines( so_matnr ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_matnr[ 1 ]-sign, so_matnr[ 1 ]-option, so_matnr[ 1 ]-low, so_matnr[ 1 ]-high.
  ENDIF.