Budowa programu ABAP krok po kroku – REPORT, TYPES, DATA i zdarzenia
W tej części kursu poznamy budowę programu ABAP i zobaczymy, gdzie umieszcza się typy, stałe, zmienne, ekran selekcji oraz właściwą logikę programu.
Uczysz się ABAP? Uczmy się razem!
Sam również uczę się ABAP i systematycznie rozwijam swoje umiejętności, dlatego w tym cyklu pokazuję wszystko krok po kroku i prostym językiem. To praktyczny samouczek ABAP oraz bezpłatny kurs SAP ABAP po polsku, przygotowany z myślą o osobach rozpoczynających naukę ABAP od podstaw. W kolejnych lekcjach wspólnie poznajemy programowanie SAP: od pierwszego programu w SE38, przez budowę raportu i typy danych, aż po tabele wewnętrzne oraz bardziej rozbudowaną logikę.
Nie udaję nieomylnego eksperta — pokazuję rozwiązania, które sam sprawdzam w systemie i porównuję z dokumentacją SAP oraz zasadami Clean ABAP. Jeśli interesuje Cię ABAP dla początkujących, wykonuj przykłady razem ze mną, eksperymentuj z kodem i wracaj do następnych części kursu.
W pierwszej części kursu ABAP utworzyliśmy nasz pierwszy program w transakcji SE38. Poznaliśmy edytor, sprawdziliśmy składnię, aktywowaliśmy program i uruchomiliśmy go bezpośrednio w systemie.
Spis treści
Najważniejsze przyciski w SE38 – zapis, kontrola, aktywacja i uruchomienie
Samo wpisanie kodu nie wystarczy. Aby uruchomić jego aktualną wersję, trzeba ją zapisać, sprawdzić i aktywować. W edytorze ABAP najczęściej korzystamy z następujących funkcji:
| Funkcja | Skrót | Do czego służy? |
|---|---|---|
| Zapisz | Ctrl+S |
Zapisuje wprowadzone zmiany. Sam zapis nie oznacza jeszcze, że nowa wersja programu jest aktywna. |
| Sprawdź składnię | Ctrl+F2 |
Wykrywa błędy składni, na przykład brak kropki, nieznaną zmienną albo niepoprawną konstrukcję instrukcji. |
| Aktywuj | Ctrl+F3 |
Tworzy aktywną wersję programu. To właśnie aktywna wersja jest wykonywana przez system. |
| Wykonaj | F8 |
Uruchamia program. Jeśli raport ma ekran selekcji, najpierw zobaczymy ten ekran. |
| Pretty Printer | Shift+F1 |
Automatycznie porządkuje wygląd kodu, między innymi wcięcia i zapis słów kluczowych zgodnie z ustawieniami edytora. |
Pretty Printer nie naprawia logiki programu. Może uporządkować źle wcięty kod, ale nie sprawdzi, czy program robi to, czego oczekujemy. Do błędów składni służy kontrola składni, a do sprawdzenia zachowania programu – jego uruchomienie i testy.
Najbezpieczniejsza kolejność pracy początkującego wygląda więc tak:
- zapisz program,
- sprawdź składnię,
- użyj Pretty Printera,
- aktywuj program,
- uruchom go klawiszem
F8.

Nasz pierwszy kod był bardzo krótki:
Taki program łatwo zrozumieć, ponieważ zawiera zaledwie dwie instrukcje. Prawdziwe programy szybko jednak zaczynają rosnąć. Pojawiają się własne typy, stałe, zmienne, struktury, tabele wewnętrzne, field symbole, parametry użytkownika oraz właściwa logika.
Kiedy pierwszy raz otworzyłem większy program ABAP, miałem wrażenie, że wszystkie te deklaracje zostały wrzucone do jednego worka. Dopiero później zrozumiałem, że większość raportów można podzielić na kilka logicznych części.
W tej lekcji nie będziemy jeszcze szczegółowo uczyć się każdej instrukcji. Najpierw zbudujemy sobie mapę programu ABAP i zobaczymy:
- gdzie znajduje się definicja programu,
- gdzie deklaruje się własne typy,
- gdzie umieszcza się stałe i obiekty danych,
- gdzie mogą znajdować się deklaracje field symboli,
- w jaki sposób powstaje ekran selekcji,
- gdzie rozpoczyna się właściwe wykonywanie programu.
Po tej lekcji nie musisz jeszcze umieć samodzielnie napisać całego raportu. Ważne, abyś potrafił spojrzeć na kod i rozpoznać jego najważniejsze części.
Czy każdy program ABAP ma identyczną budowę?
Nie. ABAP nie wymaga, aby każdy program posiadał wszystkie sekcje przedstawione w tej lekcji. Bardzo prosty raport może zawierać tylko instrukcję REPORT i kilka kolejnych poleceń. Bardziej rozbudowany może korzystać z lokalnych klas, metod albo dodatkowych obiektów repozytorium.
Nie istnieje również obowiązkowa sekcja DATA, do której trzeba wrzucić wszystkie zmienne z całego programu. Część deklaracji może znajdować się na poziomie całego raportu, a część lokalnie – możliwie blisko miejsca, w którym dane są używane.
Pokazany niżej układ jest zatem czytelnym szkieletem edukacyjnym, a nie jedyną dozwoloną budową programu.
Jak wygląda budowa programu ABAP?
Na początek spójrzmy na uproszczoną mapę raportu:
REPORT zabap_lekcja_02.
" 1. Definicje własnych typów
TYPES ...
" 2. Stałe
CONSTANTS ...
" 3. Globalne obiekty danych
DATA ...
" 4. Field symbole
FIELD-SYMBOLS ...
" 5. Ekran selekcji
PARAMETERS ...
SELECT-OPTIONS ...
" 6. Zdarzenia programu
INITIALIZATION.
...
AT SELECTION-SCREEN.
...
START-OF-SELECTION.
...
Nie każdy raport wykorzystuje wszystkie te elementy. Ich kolejność pomaga jednak szybko odnaleźć się w kodzie.
Oto przykład na prawdziwym systemie:
1. REPORT – definicja programu wykonywalnego
Program rozpoczynamy instrukcją REPORT:
REPORT zabap_lekcja_02.
Informuje ona system, że mamy do czynienia z programem wykonywalnym. Nazwa podana po REPORT powinna odpowiadać nazwie programu utworzonego w repozytorium.
W naszym przypadku program nazywa się ZABAP_LEKCJA_02. Litera Z oznacza, że jest to obiekt klienta, a nie standardowy program dostarczony przez SAP.

2. TYPES – definiowanie własnych typów
Instrukcja TYPES służy do tworzenia lokalnych typów danych.
Na początek wystarczy nam bardzo prosty przykład:
TYPES ty_user_name TYPE string.
Samo użycie TYPES nie tworzy jeszcze zmiennej i nie zapisuje żadnej wartości. Tworzymy jedynie wzór danych, z którego skorzystamy później.
Można porównać to do projektu formularza. Projekt określa, jak ma wyglądać formularz, ale nie jest jeszcze jego wypełnionym egzemplarzem.
Za pomocą TYPES możemy również definiować bardziej rozbudowane struktury oraz typy tabel wewnętrznych. Na razie wystarczy wiedzieć, że takie definicje również umieszczamy w części deklaracyjnej. Ich budowę poznamy dokładnie w kolejnych lekcjach.
Definicja typu powinna pojawić się przed deklaracją danych, która z niego korzysta. System musi najpierw poznać ty_user_name, abyśmy mogli później zadeklarować obiekt tego typu.
3. CONSTANTS – wartości, które nie powinny się zmieniać
Stałe deklarujemy za pomocą instrukcji CONSTANTS:
CONSTANTS gc_greeting TYPE string VALUE 'Witaj'.
W przeciwieństwie do zwykłej zmiennej wartość stałej nie może zostać później zmieniona podczas wykonywania programu.
Stała przydaje się wtedy, gdy ta sama wartość ma określone znaczenie i jest wykorzystywana w kodzie. Dzięki nazwie gc_greeting od razu widzimy, że wartość będzie używana jako powitanie.
Prefiks gc_ możemy przeczytać jako global constant, czyli stała globalna.
W późniejszych lekcjach porozmawiamy dokładniej o zasięgu danych i o tym, dlaczego nie należy bez potrzeby deklarować wszystkiego globalnie.
4. DATA – tworzenie obiektów danych
Instrukcja DATA tworzy obiekty, w których program może przechowywać wartości.
W tym miejscu warto zauważyć ważną różnicę:
TYPES ty_user_name TYPE string.
DATA gv_user_name TYPE ty_user_name.
TYPESopisuje typ danych,DATAtworzy konkretny obiekt danych.
Mówiąc prościej: TYPES przygotowuje projekt pudełka, natomiast DATA stawia przed nami prawdziwe pudełko, do którego możemy coś włożyć.

Za pomocą DATA możemy deklarować różne obiekty:
DATA gv_quantity TYPE i.
W kolejnych lekcjach zobaczymy, że za pomocą DATA deklaruje się nie tylko pojedyncze zmienne, lecz także struktury i tabele wewnętrzne. Tabela wewnętrzna nie wymaga osobnej „sekcji tabel”. Jest obiektem danych i dlatego również deklarujemy ją za pomocą DATA, podając odpowiedni typ.
Najczęściej spotykane prefiksy
| Prefiks | Przykładowe znaczenie |
|---|---|
gv_ |
pojedyncza zmienna globalna |
gs_ |
globalna struktura |
gt_ |
globalna tabela wewnętrzna |
lv_ |
pojedyncza zmienna lokalna |
ls_ |
lokalna struktura |
lt_ |
lokalna tabela wewnętrzna |
Prefiksy nie są obowiązkową częścią języka. Najważniejsza pozostaje czytelna nazwa mówiąca, jakie znaczenie ma dana wartość.
5. Czy wszystkie zmienne deklarujemy na początku programu?
Nie. W starszych programach ABAP często zobaczymy dużą sekcję deklaracji umieszczoną na samej górze. Współczesny ABAP pozwala deklarować dane lokalnie i bezpośrednio w miejscu użycia.
Klasyczna deklaracja może wyglądać tak:
DATA lv_quantity TYPE i.
lv_quantity = 10.
Deklaracja inline pozwala połączyć utworzenie zmiennej z przypisaniem wartości:
DATA(lv_quantity) = 10.
W tej lekcji jedynie zaznaczamy istnienie obu sposobów. Deklaracje DATA, podstawowe typy oraz deklaracje inline będą głównym tematem trzeciej części cyklu.
Zgodnie z podejściem Clean ABAP dane powinny być deklarowane możliwie blisko miejsca użycia, jeżeli nie pogarsza to czytelności. Nie oznacza to jednak, że musimy na siłę przerabiać każdą deklarację na inline.
6. FIELD-SYMBOLS – na razie tylko zapowiedź
W części deklaracyjnej programu możemy spotkać również instrukcję FIELD-SYMBOLS.
Field symbol nie przechowuje własnej kopii danych. Może natomiast wskazywać na dane znajdujące się w innym miejscu – na przykład na aktualnie przetwarzany wiersz tabeli wewnętrznej.
Wyobraź sobie kartkę z zapisaną wartością. Zwykła zmienna przypomina samą kartkę, natomiast field symbol przypomina palec wskazujący konkretną kartkę. Nie tworzy kolejnej kopii informacji, tylko pozwala pracować bezpośrednio ze wskazanymi danymi.
Na tym etapie nie będziemy jeszcze deklarować ani używać field symboli w naszym programie. Wrócimy do nich dopiero wtedy, gdy poznamy tabele wewnętrzne, pętlę LOOP AT oraz różnicę pomiędzy INTO i ASSIGNING.
7. Ekran selekcji – dane podawane przez użytkownika
Program wykonywalny może posiadać ekran selekcji, na którym użytkownik podaje wartości przed jego uruchomieniem.
Najprostsze pole możemy utworzyć za pomocą PARAMETERS:
PARAMETERS p_name TYPE string LOWER CASE.
Po uruchomieniu programu system automatycznie wyświetli pole, w którym użytkownik może wpisać swoje imię.
Do wprowadzania zakresów wartości służy natomiast instrukcja SELECT-OPTIONS. Na razie nie będziemy jej używać ani dokładnie analizować różnicy pomiędzy PARAMETERS i SELECT-OPTIONS. Wrócimy do niej w osobnej lekcji o ekranie selekcji.
Ważne jest teraz to, że deklaracje ekranu selekcji umieszczamy przed blokami odpowiedzialnymi za przetwarzanie programu.
Kolejność instrukcji tworzących ekran ma również wpływ na kolejność wyświetlanych pól.
Oto przykład, jak na ekranie selekcji wygląda parametr (w naszym przypadku p_name):

8. Zdarzenia programu ABAP – kiedy wykonywany jest kod?
Po części deklaracyjnej dochodzimy do bloków przetwarzania. Nagłówki takie jak INITIALIZATION, AT SELECTION-SCREEN i START-OF-SELECTION nie są zwykłymi etykietami porządkującymi kod. Są to zdarzenia: środowisko uruchomieniowe ABAP wywołuje je automatycznie w określonych momentach pracy raportu.
INITIALIZATION – wartości początkowe ekranu
INITIALIZATION.
p_name = 'Marek'.
Blok INITIALIZATION jest wykonywany przed pierwszym wyświetleniem standardowego ekranu selekcji. Najczęściej służy do nadania polom sensownych wartości początkowych.
W tym przykładzie parametr p_name otrzymuje wartość Marek. Gdy ekran selekcji pojawi się na monitorze, pole nie będzie puste – użytkownik zobaczy już wpisane imię i może je zaakceptować albo zmienić.
Nie umieszczamy tutaj głównego odczytu danych ani właściwej logiki biznesowej. To etap przygotowania ekranu, zanim użytkownik zacznie z nim pracować.
AT SELECTION-SCREEN – kontrola danych użytkownika
AT SELECTION-SCREEN.
IF p_name IS INITIAL.
MESSAGE 'Wpisz imię.' TYPE 'E'.
ENDIF.
AT SELECTION-SCREEN jest wywoływane podczas obsługi ekranu selekcji, między innymi po naciśnięciu F8. To dobre miejsce na sprawdzenie, czy użytkownik podał prawidłowe dane.
W naszym przykładzie program sprawdza, czy p_name jest puste. Jeśli tak, komunikat typu E zatrzymuje dalsze przetwarzanie i pozostawia użytkownika na ekranie selekcji. Dzięki temu blok START-OF-SELECTION nie zostanie wykonany z niepoprawnymi danymi.
W większych raportach można stosować także bardziej precyzyjne warianty zdarzenia, na przykład AT SELECTION-SCREEN ON p_name, aby walidować konkretne pole. Na tym etapie prosty blok ogólny jest jednak czytelniejszy.
START-OF-SELECTION – właściwe przetwarzanie raportu
START-OF-SELECTION.
WRITE |Witaj, { p_name }!|.
Jeśli dane na ekranie selekcji przejdą kontrolę, system rozpoczyna właściwe przetwarzanie raportu i wywołuje START-OF-SELECTION. Tutaj zwykle zaczynamy wykonywać zasadnicze zadanie programu: pobieramy dane, wykonujemy obliczenia albo przygotowujemy wynik.
W naszym prostym przykładzie program wyświetla powitanie. W większym, nowoczesnym raporcie blok zdarzenia nie powinien jednak zawierać setek linii szczegółowej logiki. Najczęściej powinien pozostać krótki i wywoływać odpowiednio nazwaną metodę klasy. Do programowania obiektowego wrócimy w późniejszej części cyklu.
9. W jakiej kolejności wykonywany jest raport?
Dla naszego uproszczonego przykładu przebieg wygląda następująco:
- System zna deklaracje programu, typów, stałych i obiektów danych.
- Wykonywane jest zdarzenie
INITIALIZATION. - Użytkownik widzi ekran selekcji i podaje dane.
- System obsługuje zdarzenia ekranu selekcji, na przykład
AT SELECTION-SCREEN. - Po uruchomieniu przetwarzania wykonywany jest blok
START-OF-SELECTION.
Nie jest to jeszcze pełna lista wszystkich zdarzeń raportu ABAP. Na początku nie potrzebujemy jednak encyklopedii. Chcemy jedynie zrozumieć główny przepływ prostego programu.
10. Kompletny przykład programu ABAP
Poniższy przykład łączy poznane części w jeden raport:
REPORT zabap_lekcja_02.
*--------------------------------------------------------------------*
* Definicje typów
*--------------------------------------------------------------------*
TYPES ty_user_name TYPE string.
*--------------------------------------------------------------------*
* Stałe
*--------------------------------------------------------------------*
CONSTANTS gc_greeting TYPE string VALUE 'Witaj'.
*--------------------------------------------------------------------*
* Globalne obiekty danych
*--------------------------------------------------------------------*
DATA gv_user_name TYPE ty_user_name.
*--------------------------------------------------------------------*
* Ekran selekcji
*--------------------------------------------------------------------*
PARAMETERS p_name TYPE string LOWER CASE.
*--------------------------------------------------------------------*
* Inicjalizacja
*--------------------------------------------------------------------*
INITIALIZATION.
p_name = 'Marek'.
*--------------------------------------------------------------------*
* Walidacja ekranu selekcji
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF p_name IS INITIAL.
MESSAGE 'Wpisz imię.' TYPE 'E'.
ENDIF.
*--------------------------------------------------------------------*
* Główne przetwarzanie
*--------------------------------------------------------------------*
START-OF-SELECTION.
gv_user_name = p_name.
WRITE |{ gc_greeting }, { gv_user_name }!|.
Najważniejsze jest teraz rozpoznanie:
- gdzie rozpoczyna się program,
- gdzie zdefiniowano typy,
- gdzie znajduje się stała,
- gdzie utworzono obiekt danych,
- gdzie zbudowano ekran selekcji,
- gdzie rozpoczyna się logika programu.
Tak wygląda gotowy program: po wpisaniu imienia na ekranie selekcji (1) i wciśnięciu F8 (uruchomieniu programu) pojawia się tekst jak niżej:

11. Komentarze w ABAP – co oznacza wykomentowanie kodu?
W naszym programie używamy komentarzy do opisania poszczególnych części kodu:
*--------------------------------------------------------------------*
* Definicje typów
*--------------------------------------------------------------------*
TYPES ty_user_name TYPE string.
Komentarz jest informacją przeznaczoną dla programisty. System ABAP go nie wykonuje, dlatego możemy za jego pomocą wyjaśnić trudniejszy fragment programu albo zaznaczyć przeznaczenie danej sekcji.
W ABAP najczęściej spotkasz dwa sposoby zapisywania komentarzy:
*w pierwszej kolumnie – cała linia jest komentarzem,"– komentarzem staje się wszystko od cudzysłowu do końca linii.
* Cała ta linia jest komentarzem
DATA gv_user_name TYPE string. " Komentarz na końcu instrukcji
Wykomentować kod oznacza zmienić działającą instrukcję w komentarz, aby system chwilowo jej nie wykonywał. Przykładowo:
* WRITE |Witaj, { p_name }!|.
Po dodaniu znaku * instrukcja WRITE pozostaje widoczna w edytorze, ale nie zostanie wykonana. Jest to przydatne podczas krótkiego testu, jednak nie warto pozostawiać w programie dużych fragmentów starego, wykomentowanego kodu. Historię zmian przechowuje system wersji, a martwy kod tylko utrudnia czytanie programu.
Dobry komentarz wyjaśnia przede wszystkim dlaczego zrobiliśmy coś w określony sposób. Nie powinien jedynie powtarzać tego, co jasno wynika z instrukcji i dobrze dobranych nazw.
12. Podział na sekcje a Clean ABAP
Komentarze oddzielające sekcje pomagają na początku zobaczyć budowę raportu. W prawdziwym programie nie warto jednak tworzyć ogromnych nagłówków tylko po to, aby ukryć fakt, że kod stał się zbyt długi.
Czytelność powinniśmy osiągać przede wszystkim dzięki:
- dobrym nazwom,
- krótkim fragmentom logiki,
- deklaracjom umieszczanym blisko miejsca użycia,
- unikaniu niepotrzebnych zmiennych globalnych,
- przenoszeniu większej logiki do odpowiednio nazwanych metod.
Na obecnym etapie korzystamy z jednego raportu, ponieważ łatwo uruchomić go w SE38 i obserwować rezultat. Z czasem zaczniemy stopniowo przechodzić do podejścia obiektowego.
13. Zadanie dla czytelnika
Utwórz program ZABAP_LEKCJA_02 i podziel go na następujące części:
- instrukcja
REPORT, - własny prosty typ danych,
- stała,
- deklaracja zmiennej za pomocą
DATA, - parametr ekranu selekcji,
- blok
INITIALIZATION, - blok
START-OF-SELECTION.
Na początku bloku START-OF-SELECTION możesz umieścić tylko prostą instrukcję:
WRITE |Witaj, { p_name }!|.
Następnie odpowiedz sobie na kilka pytań:
- Czy
TYPESutworzyło już obiekt zawierający wartość? - Jaką instrukcją została zadeklarowana zmienna?
- Która część kodu odpowiada za pole widoczne na ekranie?
- W którym miejscu rozpoczyna się główne przetwarzanie?
Podsumowanie
W tej części poznaliśmy ogólną budowę programu wykonywalnego ABAP.
Wiemy już, że:
-
REPORTdefiniuje program wykonywalny,TYPESpozwala opisywać własne typy danych,CONSTANTSsłuży do deklarowania stałych,DATAtworzy obiekty danych, w tym zmienne, struktury i tabele wewnętrzne,FIELD-SYMBOLSsłuży do deklarowania odwołań do istniejących danych – jego praktyczne zastosowanie poznamy później,PARAMETERSiSELECT-OPTIONSbudują elementy ekranu selekcji,START-OF-SELECTIONrozpoczyna główne przetwarzanie prostego raportu,- komentarze opisują kod, ale nie są wykonywane przez system.
Poznaliśmy również bardzo ważną zasadę: zaprezentowany podział jest czytelnym sposobem organizacji kodu, a nie obowiązkowym formularzem, który każdy program musi wypełnić od góry do dołu.
W następnej części zajmiemy się dokładniej zmiennymi. Porównamy klasyczne deklaracje DATA z deklaracjami inline DATA(...), poznamy podstawowe typy danych i zobaczymy, w jaki sposób przypisywać oraz zmieniać wartości.



