Az ABAP programozási nyelv

Párhuzamosság

Párhuzamosság fogalma az ABAP nyelvben

Az ABAP támogatja a párhuzamosságot, de...

Amikor párhuzamos feldolgozásról és szállakról beszélünk, akkor az SAP körökben általában programok háttérben való indítását jelenti. Azonban van egy másik módja is, programokon belül, több szálra felosztani egy adott funkcióelem futását.

Az ABAP nyelvben a párhuzamosság tulajdonképpen aszinkron funkcióelem hívást jelent.

Általában, amikor meghívunk egy funkcióelemet, akkor az a hívó programot megszakítja, átadja az irányítást egy másik programnak - amely a funkcióelemet futtatja - majd visszaadja az irányítást az eredeti programnak, ami folytatja működését.
Az aszinkron funkcióelem hívással az eredeti program futása nem szakad meg, hanem párhuzamosan egy új szálat indít el, amely a funkcióelem futásának a végéig tart. Az ilyen hívást egy ciklusban elhelyezve több párhuzamos szál indulását eredményezi.

A párhuzamos feldolgozás előfeltételei:

Funkcióelemek és ABAP parancsok a párhozamos feldolgozáshoz

CALL FUNCTION (funkcióelem neve) STARTING NEW TASK (a feldolgozó száll azonosítója) - Ezzel az ABAP paranccsal adjuk meg az SAP rendszernek, hogy a funkcióelemet egy másik szálon szeretnénk futtatni.
DESTINATION - Ezzel a kiegészítéssel jelölhetjük meg a másik rendszert. Ha ugyanazon a rendszeren futtatjuk akkor a kiegészítéshez a 'NONE' paramétert kell adni.
IN GROUP - Ezzel a kiegészítéssel egy előredefiniált csoportot adhatunk meg, amelybe már belehet állítani pár tulajdonságot. A csoportot az RZ12-es tranzakcióban lehet létrehozni.
PERFORMING (alprogram neve) ON END OF TASK - Ezzel a kiegészítéssel a funkcióelem visszatérése után a hívó programban egy alprogramot hívhatunk meg.
CALLING (metódus) ON END OF TASK - Ezzel a kiegészítéssel a funkcióelem visszatérése után egy metódust tudunk meghívni.
WAIT UNTIL (feltétel) - Ezzel a kiegészítéssel várhatunk pl. egészen addig, amíg az összes funkcióelem vissza nem tér.
Aszinkron funkcióelemek esetén bemenő/kimenő paramétereknek csak generikus típusokat adhatunk meg és csak érték szerinti átadás van (SE37 - paraméterek melletti jelölő - Értékátadás ). A WRITE műveletet sem lehet párhuzamos feldolgozásnál használni, így az egyik bevált módszer, hogyha az aszinkron funkcióelem TABLES paraméterében adja át a funkcióelemben kiszámolt értéket/információ. Az IMPORT/TABLES paramétereket úgy tudjuk feldolgozni, hogyha az ON END OF TASK előtt meghívott alprogramban vagy metódusban a RECEIVE RESULTS FROM FUNCTION (az aszinkron funkcióelem) parancsot használjuk.

Példaprogram

A példaprogramban feltételezzük, hogy létre van hozva egy táblatípus a következő struktúrával:
táblatípus: ZTABL_PARALLEL - sortípus: ZSTRUCT_PARALLEL

A funkcióelem csak annyit csinál - a megadott paraméterek alapján -, hogy a kimeneti táblába írja, a futtató szálnak a nevét, és a táblába írásnak az időpontját.
A Z_PARALLEL_TEST_PROG példaprogram meghívja ötször aszinkron módon a Z_PARALLEL_TEST funkcióelemet, a SET_FUNCTION_DONE alprogramban a visszatérési értékek táblájának a tartalmát egy saját globális táblába másolja. Vár egészen addig, amíg minden szál befejezi a futását, majd a tábla tartalmát időpont szerint rendezve kiíratja a felhasználónak.
A program megtekinthető a példaprogramok között, illetve az ELTE - IDES SAP rendszerében.

Számkör kiosztás

Ha egy új mezőt szeretnénk beszúrni a táblába, a tábla kulcsába értéket kell generálnunk. Amennyiben ezt egy SELECT lekérdezéssel tennénk meg, előfordulhat, hogy egyszerre két process is ezt teszi, így a második beszúrás sikertelen lesz, hiszen egy már létező kulccsal akarnánk beszúrni egy új rekordot.

Ez a probléma kiküszöbölhető, úgynevezett számkörök használatával. Egy számkörnek meg lehet adni egy intervallumot, típust és amikor szükség van rá, egy függvény segítségével - NUMBER_GET_NEXT - generálhatunk értéket belőle. Ez garantálja, hogy egy értéket egyszer oszt ki a rendszer. A következő példában ZMOBILSZK a már létrehozott számkörünk, és a z_azon változóba generáltatjuk az új értéket.

call function 'NUMBER_GET_NEXT'
exporting
nr_range_nr = '01'
object = 'ZMOBILSZK'
quantity = '1'
* SUBOBJECT = ' '
* TOYEAR = '0000'
ignore_buffer = 'X'
importing
number = z_azon
* QUANTITY =
* RETURNCODE =
exceptions
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
others = 8
.

SNRO - Számkör karbantartás képernyőkép