Az ABAP programozási nyelv

Alapvető vezérlési szerkezetek

A vezérlésről röviden

Az ABAP/4 megkülönböztet belső és külső vezérlést. A belső vezérlést a programkódunk határozza meg az egyes utasítások egymásutáni leírásával, melyeket az alapvető vezérlési szerkezetekkel módosíthatunk. Így müködnek a dialog programok. A külső vezérlést az időbeli események határozzák meg. Ezek származhatnak vagy ABAP/4-programoktól (rendszer-, vagy felhasználói programok), vagy interaktív felhasználóktól (egér esemény stb.). Ekkor az egyes esemény-kulcsszavakhoz (pl. AT LINE-SELECTION) végrehajtási blokk tartozik, mely a megfelelő esemény bekövetkeztekor fut le. Ezen az elven nyugszik a report programozás és ezért az ABAP/4 egy eseményvezérelt programozási nyelv.

Szekvencia

A programon belül minden szót legalább egy szóköz választ el, az újsort is ennek veszi a rendszer. Utasításokat viszonylag szabadon írhatunk le, az egy utasításba tartozó szavakat több sorba is szétszórhatjuk, vagy több utasítást egy sorba is írhatunk. A kódot rendbeszedhetjük a fejlesztőkörnyezethez tartozó Pretty Printer segítségével, mely betördeli a forrásszöveget a vezérlőutasításoknak megfelelően. Egyik érdekes lehetősége a nyelvnek az utasítások un. láncolási mechanizmusa a forráskódon belül. Ez azt jelenti, hogy ha egymásután ugyanaz az utasítás többször előfordul a kódban ponttal lezárva, akkor lehetőség van az egymásutániságát feloldani láncolással a következőképp:

<Kulcsszó> <Adatobjektum1>.
<Kulcsszó> <Adatobjektum2>.
...
<Kulcsszó> <AdatobjektumN>.

ekvivalens az alábbi láncolt kódrészlettel:

<Kulcsszó>: <Adatobjektum1>, <Adatobjektum2>, ..., <AdatobjektumN>.

Ciklus

Kétféle ismétlési utasítást tartalmaz az ABAP/4 programozási nyelv.

DO [<n> TIMES].
<végrehajtási blokk>
ENDDO.
DO <végrehajtási blokk> IF <kilépési feltétel>.
EXIT.
ENDIF.
ENDDO.


Számláló nélkül használva, a ciklusmagot pl. az EXIT utasítással hagyhatjuk el. Ha n negatív, vagy nulla, akkor a ciklusmag nem hajtódik végre egyszer sem, különben pedig pontosan n-szer. Ez használható a más nyelvekben jól megszokott FOR utasítás helyett.

WHILE <feltétel>.
<végrehajtási blokk>
ENDWHILE.


A ciklusmag egészen addig ismétlődik, míg a feltétel hamissá nem válik, vagy pl. EXIT utasításra nem fut a vezérlés. Minden ciklust megnyitó utasításhoz kell, hogy tartozzon egy lezáró utasítás, különben fordítási időben kapunk hibaüzenetet. Tetszőlegesen sok ciklus egymásbaágyazható.
példa kód:
*az alapvető vezérlési szerkezetek bemutatása

DATA: counter TYPE i,
aChar TYPE c VALUE 'x',
aChar2 TYPE c.

*egy sima elöltesztelő while ciklus
*ugyanúgy müködik mint más nyelvekben

WHILE counter < 5.
WRITE counter.
counter = counter + 1.
ENDWHILE.

WRITE /.

*ez van for ciklus helyett, 4-szer fog lefutni a ciklusmag
*az sy-index a beépített ciklusváltozó, induláskor 1-es értéket kap
*minden lefutás után növelődik az értéke
*és ha épp 2 akkor nem írjuk, azaz a CONTINUE-val ciklusmag végére lehet ugrani

DO 4 TIMES.
IF sy-index = 2.
CONTINUE.
ENDIF.
WRITE sy-index.
ENDDO.

WRITE /.

*végtelen ciklus, amiből az EXIT-el lehet kiszállni
DO.
IF sy-index = 3.
EXIT.
ENDIF.
WRITE sy-index.
ENDDO.

Elágazás

Két lehetőségünk van:

IF <feltétel1>.
<végrehajtási blokk>
ELSEIF <feltétel2>.
<végrehajtási blokk>
ELSEIF <feltétel2>.
<végrehajtási blokk>
...
ELSE.
<végrehajtási blokk>
ENDIF.


Természetesen, mint a legtöbb nyelvnél, az ELSEIF ill. ELSE ágak értelemszerűen elhagyhatóak, mely érvényes a CASE utasítás WHEN ill. WHEN OTHERS kulcsszavaira is. Mindkét esetben az első olyan blokk hajtódik végre, melynek feltétele igaz és a blokk végrehajtása után átadódik a vezérlés az ENDIF ill. ENDCASE utasításra. Minden IF-hez tartozik egy ENDIF, vagyis az egymásbaágyazás egyértelmű kell legyen minden szempontból. Ugyanez érvényes a CASE utasításra:

CASE <mezőnév>.
WHEN <érték1>.
<végrehajtási blokk>
WHEN <érték2>.
<végrehajtási blokk>
...
WHEN OTHERS.
<végrehajtási blokk>
. ENDCASE.
példa kód:
*az alapvető vezérlési szerkezetek bemutatása

DATA: counter TYPE i,
aChar TYPE c VALUE 'x',
aChar2 TYPE c.

*le lehet kérdezni, hogy egy változó iniciális-e,
*azaz adtunk e neki már értéket ezelött
IF aChar2 IS INITIAL.
WRITE 'OK 1'.
ELSE.
WRITE 'ERROR 1'.
ENDIF.

WRITE /.

*le lehet kérdezni, hogy egy szám egy intervallumba esik-e
IF counter BETWEEN 0 AND 4.
WRITE 'ERROR 2'.
ELSEIF counter BETWEEN 5 AND 10.
WRITE 'OK 2'.
ENDIF.

WRITE /.

* "a fordító kitalálja, hogy mit akartunk írni"
* ebből követezik, hogy nincs külön értékadó és összehasonlító
* = operátor szimbolum szinten
* tehát a kontextusból (leírtuk, hogy IF) tudja, hogy ez most
* összehasonlítás lesz és nem értékadás
IF aChar = 'x' AND counter = 5.
WRITE 'OK 3'.
ENDIF.

WRITE /.

*az első igaz ágba bemegy, végrehajtja, majd kiszáll,
*tehát nem hajtja végre az alatta lévők ágakat
counter = 13.
CASE counter.
WHEN 10 OR 12.
WRITE 'ERROR 4'.
WHEN 10 OR 13.
WRITE 'OK 4'.
WHEN 14.
WRITE '+'.
WHEN OTHERS.
WRITE '+'.
ENDCASE.

Egyéb vezérlést befolyásoló utasítások

EXIT.: A legbelső ciklusból, vagy egy modul egységből lép ki a vezérlés.
CONTINUE.: Cikluson belül IF utasítással használva a ciklus elejére adhatjuk a vezérlést.
CHECK <feltétel>.: Ha a feltétel igaz akkor, ciklusban alkalmazva ekvivalens az előzőekben tárgyalt CONTINUE utasítás hatásával, míg modul egységben az EXIT utasítással.
Az ABAP/4 nem tartalmaz GOTO utasítást.