Każdy system informatyczny wykorzystuje interfejsy umożliwiające komunikację z użytkownikiem. Najprostszym sposobem na taką komunikację w systemach SAP w środowisku języka ABAP jest wykorzystanie ekranów selekcji. Są to ekrany wyświetlane przed uruchomieniem raportów, na których można wprowadzać dane lub wybierać opcję oprogramowane poprzednio przez projektanta. Niniejszy artykuł przedstawia podstawy tworzenia i korzystania z ekranów selekcji.

 

Parameters

Jednym z najbardziej podstawowych elementów ekranów selekcji są parametry. Są to zmienne, dla których utworzone zostaje na ekranie pole wejściowe. Tworzenie ich jest podobne do deklaracji zwykłych zmiennych i wygląda następująco:

 

PARAMETERS p_zmienn TYPE typ.

 

 

Jeśli istnieje taka potrzeba możemy sprawić że wprowadzenie wartości parametru będzie obowiązkowe poprzez dodanie klauzuli OBLIGATORY po definicji typu. Kolejną przydatną opcją jest MODIF ID ‘id’, która umożliwia zebranie obiektów na ekranie selekcji w jedną grupę, którą możemy ukrywać bądź wyświetlać w całości tak aby nie robić tego dla poszczegolnych zmiennych.

 

Dzięki parametrom możemy też tworzyć pola wyboru (checkbox), przyciski opcji (radiobutton) i rozwijane listy (listbox). Aby utworzyć pole wyboru lub przycisk opcji nie podajemy typu parametru – zamiast tego dopisujemy klauzulę AS CHECKBOX lub RADIOBUTTON GROUP gr. W miejscu gr podajemy nazwę grupy do jakiej ma należeć przycisk opcji, dzięki temu możemy mieć kilka grup w których można zaznaczyć tylko jedną wartość.

 

PARAMETERS p_chkbox AS CHECKBOX.

 


PARAMETERS:   p_rad1 RADIOBUTTON GROUP g1,

                       p_rad2 RADIOBUTTON GROUP g1.

 

 

Aby utworzyć listę rozwijaną z możliwymi wpisami (ze słownika) - po deklaracji parametru dodajemy AS LISTBOX VISIBLE LENGTH 10. Gdzie w visible length musimy podać rozmiar naszego pola tekstowego.

 

PARAMETERS: p_lista TYPE spfli-carrid AS LISTBOX VISIBLE LENGTH 10.

 

 

Select-options

Czasami potrzebna jest możliwość podania kilku wartości dla danej zmiennej przez użytkownika, do tego służy polecenie SELECT-OPTIONS, które powoduje powstanie odpowiednich pól na ekranie selekcji a w programie tworzy nam zakres RANGE.

               

RANGE jest to specjalna tabela wewnętrzna służąca do podawania większej ilości wartości dla danego typu. Umożliwia wybranie wielu wartości, przedziałów bądź  wykluczenie konkretnych wartości lub przedziałów. Aby sprawdzić czy wartość zmiennej należy do zakresu należy użyć operatora IN:
 

IF zmienna IN range.
„…
ENDIF.


Uwaga, pusty przedział (RANGE) oznacza wybranie WSZYSTKICH możliwych wartości.

 

Aby utworzyć opcje wyboru należy wprowadzić:

 

SELECT-OPTIONS s_opt FOR pole.

 

 

gdzie pole może być zmienną lub kolumną struktury. Programista ma też możliwość ograniczenia ilości wprowadzanych przez użytkownika danych poprzez dodanie odpowiednich słów kluczowych po deklaracji: NO INTERVALS – na ekranie pojawi się tylko jedno pole wejściowe, przez co nie będzie można wprowadzać przedziałów (po przejściu w dodatkowe wybory/żółty przycisk dalej można podać przedziały).

 

 

NO-EXTENSIONS – na ekranie nie pojawi się żółty przycisk umożliwiający podanie większej ilości wartości. Użytkownik będzie mógł podać pojedynczą wartość lub jeden przedział.

 

 

Można także użyć obu dopisków aby możliwy był tylko jeden pojedynczy wpis.

 

 

Bloki na ekranie selekcji

Elementy na ekranie selekcji możemy pogrupować w celu poprawy czytelności w bloki, które mogą posiadać ramkę i nagłówek. Nagłówek może być literałem lub elementem tekstowym. Przykładowy blok:

 

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECTION-SCREEN END OF BLOCK b1.
Można też umieszczać bloki w blokach.

 

 

Aby umieścić dwa obiekty w jednej linii piszemy:


SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN END OF LINE.


Umożliwia to np. na utworzenie parametru, którego opis będzie wyświetlany obok niego.

 

 

Opisy pól na ekranie

Wszystkim obiektom na ekranie można nadać własny opis za pomocą elementów tekstowych. Każdy taki opis może posiadać tłumaczenia na dowolny język dostępny w systemie SAP. Dzięki temu można dostosować opisy w raporcie w zależności od języka logowania. Aby utworzyć element tekstowy należy wybrać w menu: Skok do > Elementy tekstowe > Teksty wyboru. Wyświetlona zostanie lista obiektów, którym możemy nadać własne nazwy. Tłumaczenia tworzy się przechodząc w menu: Skok do > Tłumaczenia.

 

 

Zaznaczenie pole referencja sprawi że opis zostanie pobrany ze słownika. Jeśli w słowniku nie ma opisu dla naszego obiektu, pole referencja będzie niedostępne.

 

Innym sposobem na dodanie opisu do pola jest użycie selection-screen comment.

 

SELECTION-SCREEN COMMENT x(y) opis FOR FIELD pole.

 

Gdzie x to pozycja pierwszego znaku opisu w linii, y to długość opisu, opis – opis i pole to pole dla którego wstawiany jest komentarz.

 

Walidacja danych

Aby sprawdzić poprawność danych programista może dodać do parametru/wyboru VALUE CHECK, dzięki czemu wartości w polach zostaną przyrównane do tych z podanymi w domenie lub CHECK TABLE.

Jeśli wymagane jest bardziej szczegółowe lub ręczne sprawdzenie odpowiedni kod należy umieścić w programie w zdarzeniu AT SELECTION-SCREEN ON pole. W razie niepowodzenia walidacji możliwe jest wyświetlenie komunikatu błędu:
MESSAGE ‘Błąd’ TYPE ‘E’.

 

 

 

Dynamiczna modyfikacja ekranu selekcji

 

Modyfikacja ekranu selekcji odbywa się w zdarzeniu AT SELECTION-SCREEN OUTPUT. Tak jak przy zwykłych ekranach zmian należy dokonać w pętli LOOP AT SCREEN sprawdzając czy aktualnie przetwarzany element ekranu ma wymaganą nazwę lub należy do odpowiedniej grupy. Dla każdego elementu ekranowego można zmienić jego właściwości takie jak widoczność (ACTIVE), gotowość do wprowadzania danych (INPUT) czy też obowiązek wprowadzenia wartości (REQUIRED).

Przykład ekranu selekcji zmieniającego się w zależności od wybranego sposobu wyboru danych:

 

 

 

Przykładowy kod programu

*&---------------------------------------------------------------------*
*&  Report  ZSZK_PB_SEL_SCR
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zszk_pb_sel_scr.
DATA: gt_spfli TYPE TABLE OF spfli,
      gs_spfli TYPE spfli.
DATA: gv_flag.
DATA: gr_alv TYPE REF TO cl_salv_table.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
 PARAMETERS: p_il TYPE i." OBLIGATORY.

 SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
  PARAMETERS: p_r_lis RADIOBUTTON GROUP g1,
              p_r_sel RADIOBUTTON GROUP g1.
 SELECTION-SCREEN END OF BLOCK b2.

 PARAMETERS: p_list TYPE spfli-carrid AS LISTBOX VISIBLE LENGTH 10.
 SELECT-OPTIONS: s_carrid FOR gs_spfli-carrid.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
  p_r_sel = 'X'.
  p_il = 100.
AT SELECTION-SCREEN ON p_list.
  IF p_list IS INITIAL AND gv_flag = 'X'.
    MESSAGE 'Wybierz niepustą wartość z listy' TYPE 'E'.
  ENDIF.
AT SELECTION-SCREEN ON p_il.
  IF p_il < 0 OR p_il > 101.
    MESSAGE 'Ilość powinna zawierać się między 0 a 101' TYPE 'E'.
  ENDIF.
AT SELECTION-SCREEN OUTPUT.
  PERFORM modif_sel.
START-OF-SELECTION.
  PERFORM get_data.
END-OF-SELECTION.
  PERFORM initialize_alv.
  PERFORM display_alv.
*&---------------------------------------------------------------------*
*&      Form  modif_sel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM modif_sel.
  IF p_r_lis = 'X'.
    LOOP AT SCREEN.
      IF screen-name CS 'P_LIST'.
        screen-active = 1.
        gv_flag = 'X'.
      ELSEIF screen-name CS 'S_CARRID'.
        screen-active = 0.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ELSEIF p_r_sel = 'X'.
    LOOP AT SCREEN.
      IF screen-name CS 'P_LIST'.
        screen-active = 0.
        gv_flag = ''.
      ELSEIF screen-name CS 'S_CARRID'.
        screen-active = 1.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.
ENDFORM.                    "modif_sel
*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data.
  IF p_r_sel = 'X'.
    SELECT * FROM spfli INTO TABLE gt_spfli UP TO p_il ROWS WHERE carrid IN s_carrid.
  ELSEIF p_r_lis = 'X'.
    SELECT * FROM spfli INTO TABLE gt_spfli UP TO p_il ROWS WHERE carrid = p_list.
  ENDIF.
ENDFORM.                    "get_data
*&---------------------------------------------------------------------*
*&      Form  initialize_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM initialize_alv.
  cl_salv_table=>factory(
  IMPORTING
    r_salv_table = gr_alv
  CHANGING
    t_table      = gt_spfli ).
ENDFORM.                    "initialize_alv
*&---------------------------------------------------------------------*
*&      Form  display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM display_alv.
  gr_alv->display( ).
ENDFORM.                    "display_alv