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.