Az ABAP programozási nyelv

Kódoptimalizálás

Kódoptimalizálás

Mint minden nyelvben fontosak bizonyos előre megadott irányok a kód szintaktikailag helyes, és fordítási valamint futási időben optimális implementálásában. ABAP nyelvben sincs ez másként. Elsősorban a nagy mennyiségű adatok kezelésénél lehet alkalmazni az alábbi lehetőségeket annak érdekében, hogy minél kevesebb beolvasást, adatbáziskapcsolatot terheljenek le a programjaink.

Adatbázis


Példakód egy optimális loop szintakszisra:
LOOP AT itab1. LOOP AT itab2 where f1 = itab1-f1. ... ENDLOOP. ENDLOOP.

Natív SQL utasítások

Lehetőség van adatbázisfüggő SQL utasítás megadására és futtatására a nyelvben. Ezeknek az utasításoknak a végrehajtása közvetlenül az adatbázisban történik.
Előnyei:

  • Nem csak az ABAP Dictionary-ban deklarált táblák elérhetőek. (pl.: sys vagy system user táblái Oracle adatbázis esetén.)
  • Adatbázis-függő jellegzetességek kihasználhatósága.
Hátrányai:
  • EXEC és ENDEXEC között a szintaktikai ellenőrző nem fut le, ellenben a nem natív utasításokkal, ahol van szintaktikai ellenőrzés fordításkor.
  • Adatbázis-függő SQL kódok nem hordozhatóak különböző adatbázis-kezelő rendszerek között.
  • Mandant-függő táblák kezelését a programozónak kell megoldania.
  • Adatbázis-migráció esetén a programot karban kell tartani.
Példa:

DATA: P1 TYPE ZELTE_OSZT_AZON,
P2 TYPE ZELTE_OSZT_NEVE,
P3 LIKE SY-MANDT.

WRITE: sy-dbsys.

P3 = SY-MANDT.
P1 = 23.

EXEC SQL.
SELECT OSZT_AZON, OSZT_NEV INTO :P1, :P2
FROM ZELTE_OSZT
WHERE MANDT = :P3 AND OSZT_AZON = :P1
ENDEXEC.

WRITE: / P1, P2, P3.

Tábla buffer

  • Definiáljunk egy táblát bufferként, (SE11-ben) ami segíthet a teljesítményjavításban, de ezt a megoldást nagyon körültekintően alkalmazzuk. A táblák bufferelése a bufferből vezérli az adatok olvasását, és nem a táblából. A tábla buffer szinkronizációja rendszeresen történik, csak valamilyen változást követően módosul. Ha ez a tábla egy tranzakció-tábla akkor kockáztatjuk azt, hogy az adat meg fog változni valamely adott szelekciós kritérium alapján, ezért az alkalmazás táblák nem alkalmasak a tábla bufferelésre. A tábla bufferelése ilyen esetekben nem ajánlott.
  • Tábla bufferelés műveletét alkalmazzuk konfigurációs adatra vagy esetenként Master Data-re. Akkor felmerülhet a kérdés, hogy mikor használjunk egy táblát bufferelésre? Ha a buffer feltétel nem ugyanaz, mint amit a kódban használunk, akkor nem jelent problémát.
  • Ne alkalmazzunk komplex SELECT-t a bufferelt táblákban, mert az SAP nem tudja értelmezni ezt a kérést, továbbítani fogja az igényt az adtabázisnak. A Code Inspector jelezni fog, hogy mely parancsok kerülik ki a buffert.

Belső tábla

  • Gyakran praktikusan válogatott táblákat használunk belső működéshez, ennek következtében az egymásba ágyazott hurkok rendben működnek.
  • Ha kétségeink vannak a táblahasználat helyességéről, akkor az SE30 tranzakcióban ellenőrizni tudjuk a programkódot.
  • Eszközöljünk READ TABLE BINARY SEARCH-t, amely utasítások felgyorsítják az óriási táblákban a keresést.
  • Ügyeljünk arra, hogy a bináris keresés előtt rendezzük a belső táblákat. Ez egy általános szabály, de ha biztosak vagyunk abban, hogy az adat a belső táblában kevesebb, mint ötvenszer a sorok száma, akkor nincs szükségünk SORT-ra és a BINARY SEARCH-re, mivel ezzel még nem érjük el a teljesítőképesség felső határát.

Példakód a bináris keresésre:
SORT itab2 BY f1.LOOP at itab1. * f1 az itab1 tábla akármelyik mezője READ TABLE itab2 WITH KEY f1 = itab1 - BINARY SEARCH. IF SY-SUBRC = 0. idx = SY-TABIX. LOOP AT itab2 FROM idx. IF itab2-f1 <> itab1-f1. EXIT. ENDIF. ... ENDLOOP. ENDIF. ENDLOOP.


Példakód a FOR ALL ENTRIES utasítás alkalmazására:
SELECT A~VBELN A~KUNNR A~KUNAG B~NAME1 INTO TABLE i_likp FROM likp AS A INNER JOIN KNA1 AS B ON A~KUNNR = B~KUNNR. * For with limited data using for all entries. * Minimize entries in i_likp by deleting duplicated KUNNR. LOOP AT i_likp INTO w_likp. w_likp2 - KUNAG = w_likp - KUNAG. APPEND w_likp2 TO i_likp2. ENDLOOP. SORT i_likp2 BY KUNNR. DELETE ADJACENT DUPLICATES FROM i_likp2 COMPARING KUNNR. * GET DATA FROM KNA1 IF NOT i_likp2[] IS INITIAL. SELECT KUNNR name1 INTO TABLE i_kna1 FROM KNA1 FOR ALL ENTRIES IN i_likp2 WHERE KUNNR = i_likp2-KUNNR. ENDIF.