Az ABAP programozási nyelv

Beépített adattípusok, absztrakt adattípusok

Általános leírás

A legfontosabb összetevői az ABAP/4 típuskoncepciójának az adattípusok és az adatobjektumok.

Egy adatobjektum deklarálásakor meghatározott attribútumokat kell megadni, melyek közül a legfontosabb az adattípus. Ez lehet előre definiált, vagy felhasználó által definiált adattípus. A felhasználó által definiált adattípus lehet egyszerű, vagy összetett (akár tábla is). Láthatóság szempontjából háromféleképpen osztályozhatjuk a adattípusokat és az adatobjketumokat:

Adattípusok

Adattípusokat a struktúrájuk és definíciójuk szerint osztályozhatjuk:

  Előre definiált Felhasználó által definiált
Elemi Az ABAP/4 nyolc előre definiált típussal rendelkezik: C, D, F, I, N, P, T, X A felhasználó által definiált adattípusok az elemi adattípusokra épülnek
Struktúrált Táblák: csak a formális paraméterek tipizálásánál és a mezőszinbolumoknál használható Rekord kezeléshez és belső táblákhoz


A fent említett nyolc elemi adattípus a következő táblázatban látható:

Adattípus Leírás Kezdőérték Iniciális hossz
P pakolt decimális 0 8
I integer 0 platform függő
F lebegő pontos 0.000... platform függő
N numerikus szöveg 000... 1
C szöveg (karakter) space 1
D dátum YYYYMMDD 00000000 8
T idő HHMMSS 000000 6
X hexadecimális X'00' 1


Az integer általában a $[-2^{31};2^{31}-1]$, míg a lebegőpontos típus a $[10^{-307};10^{308}]$ intervallumot öleli fel. A nyelv támogatja a fenti adattípusoknál az automatikus típuskonverziót kivéve a D (dátum) és a T (idő) típusok esetében, melyek nem konvertálhatóak egymásba. A konzerziós szabályok a mindenkori R/3 dokumentációkban fellelhetőek.
A nyelv továbbá rendelkezik olyan előre definiált típusokkal is, amiknek a hossza egészen a futás időig nem adott. Ezek a típusok a STRING, ami karakterek sorozata és a XSTRING, ami hexadecimális karakterek sorozatának tárolására használható.

Adatobjektumok

Az adatobjektumoknak több fajtáját különböztetjük meg:



példa kód:
*az alapvető típusokat mutatja be

*típus definíciók:
*name = max 10 hosszú karakter sorozat
*zip_code = 5 db [0..9] közötti szám egymás mellé írva
TYPES: name(10) TYPE c,
street(20) TYPE c,
zip_code(5) TYPE n.

*egy egyszerű rekord típus: 5 db mezővel
TYPES: BEGIN of address,
firstname TYPE name,
lastname TYPE name,
code TYPE zip_code,
town(30) TYPE c,
str TYPE street,
END OF address.

*változók deklarációja és automatikus inicializálása
*pl a myInteger iniciális értéke automatikusan 0 kezdetben
*egyébkt a VALUE kulcsszó után adhatjuk meg az kezdőértéket
DATA: myInteger TYPE i,
myChar TYPE c VALUE 'alma',
myString(3) TYPE c VALUE 'narancs',
myString2 TYPE string,
myAddress TYPE address,
myDate LIKE sy-datum.

*a rekord típusú változónak adunk értéket
*a szelekor jelen esetben a '-' jel és nem a '.' jel myAddress-firstname = 'Jakab'.
myAddress-lastname = 'Gipsz'.
myAddress-code = 1234.
myAddress-town = ' Tokió'.
myAddress-str = 'Piros utca 10'.

myString2 = 'szilva'.
*a rendszeridő lekérdezése ilyen egyszerűen is történhet
myDate = sy-datum.

*a változók kiírása, itt sem kell a WRITE metódust felül/átírni,
*automatikusan "példányosul" a rekordtípus kiíratáshoz is
WRITE: / myInteger,
/ myChar,
/ myString,
/ myString2,
/ myString2(3),
/ myAddress,
/ myDate.

Belső táblák

Talán ez az egyik legfontosabb és legegyedibb típusa az ABAP/4-nek. Mivel a nyelvet alapvetően nagytömegű adatok feldolgozására fejlesztették ki, szükséges volt megoldani az adatbázissal történő kommunikációt anélkül, hogy az túlzottan leterhelné a központi szervert. A lényege az, hogy egyszer, vagy akár többször, a program futása során az adatbázisszerverről beolvassuk a számunkra fontos adatokat egy belső táblába, ott feldolgozzuk őket, majd ha szükséges, ugyancsak a belső táblán keresztül visszaírjuk az adatbázisba a módosításokat. Egy belső táblát létrehozhatunk (DATA utatsítás segítségével) fejléccel vagy anélkül. Ha fejléccel hozzuk létre, akkor az egyik lehetőség a fejléc segítségével kommunikálni a belső táblával, ahol a fejléc neve megegyezik a belső tábla nevével. Ha fejléc nélkül hozzuk létre, akkor egy un. munkaterület (work area) segítségével történik a belső tábla elérése. A fejléc és a munkaterület egy olyan struktúra, mely megegyezik a belső tábla definíciójával (tehát a belső tábla egy sorának felel meg).


A belső táblák fontosabb műveletei:
Művelet Leírás
APPEND Sor(ok) táblához fűzése
COLLECT Hozzáfűzés kulcsegyezés figyelésével
INSERT Megadott helyre sor beszúrása
MODIFY Mezők módosítása (index megadható)
DELETE Sorok törlése (loop ciklusban vagy index vagy feltétel alapján)
SORT Rendezés
CLEAR Visszaállítja a táblát az inicializált értékére (header line esetén azt a sort)
REFRESH Mindenképp visszaállítja a táblát
LOOP AT Tábla olvasása (intervallum megadható)
READ TABLE Olvasás index vagy kulcs alaján
példa kód:
*a belső táblák bemutatása

*egy egyszerű rekord, 3 integer mezővel
TYPES: BEGIN OF Line,
column1 TYPE i,
column2 TYPE i,
column3 TYPE i,
END OF Line.

*az első tábla sorai a rekordok, rendezéshez az első két mezőt használja
TYPES InternalTable TYPE SORTED TABLE OF Line
WITH UNIQUE KEY column1 column2.

*a második tábla sorai szintjén a rekordok, de ez hash-elt tábla,
*a hash számítás az ineteger alapján történik
TYPES Vector TYPE HASHED TABLE OF i WITH UNIQUE KEY TABLE Line.

*második rekord melynek a mezői: karakter és a két előző típusú tábla
TYPES: BEGIN OF deepLine,
field TYPE c,
table1 TYPE Vector,
table2 TYPE InternalTable,
END OF deepLine.

*egy teljesen általános tábla melynek a sorai szintén belső táblák
*több dimenziós tömböket lehet így definiálni
TYPES DeepTable TYPE STANDARD TABLE OF DeepLine.

*a változók deklarálása
DATA: myLine TYPE Line,
myInternalTable TYPE InternalTable,
myVector TYPE Vector,
myDeeptable TYPE DeepTable,
tmp TYPE i.

*az első, rendezett, tábla feltöltése
myLine-column1 = 7.
myLine-column2 = 13.
myLine-column3 = 1.
APPEND myLine TO myInternalTable.

myLine-column1 = 10.
myLine-column2 = 43.
myLine-column3 = 1.
APPEND myLine TO myInternalTable.

myLine-column1 = 8.
myLine-column2 = 44.
myLine-column3 = 1.
INSERT myLine INTO TABLE myInternalTable.

*a tábla végig rendezett marad
*így lehet bejárni egy belső táblát, ekkor minden ciklusmag lefutás elött a következő sor
*értéke a myLine változóba kerül, amit aztán feldolgozhatunk
LOOP AT myInternalTable INTO myLine.
WRITE: / myLine-column1,
myLine-column2,
myLine-column3.
ENDLOOP.
NEW-LINE.
WRITE '-------------------'.
NEW-LINE.

*a COLLECT hatására megkeresi a kulcs alapján a sort, majd a nem kulcs értékkel növeli
*a táblában található (szintén nem kulcs) értéket
myLine-column1 = 8.
myLine-column2 = 44.
myLine-column3 = 3.
COLLECT myLine INTO myInternalTable.

LOOP AT myInternalTable INTO myLine.
WRITE: / myLine-column1,
myLine-column2,
myLine-column3.
ENDLOOP.
NEW-LINE.
WRITE '-------------------'.
NEW-LINE.

*a MODIFY pedig szintén kulcs alapján keres, majd modosít
myLine-column1 = 7.
myLine-column2 = 13.
myLine-column3 = 99.
MODIFY TABLE myInternalTable FROM myLine.

LOOP AT myInternalTable INTO myLine.
WRITE: / myLine-column1,
myLine-column2,
myLine-column3.
ENDLOOP.
NEW-LINE.
WRITE '-------------------'.
NEW-LINE.


*a tábla feltöltése adatokkal
INSERT 1 INTO TABLE myVector.
INSERT 2005 INTO TABLE myVector.
INSERT 13 INTO TABLE myVector.
INSERT 7 INTO TABLE myVector.
INSERT 2000 INTO TABLE myVector.

LOOP AT myVector INTO tmp.
WRITE / tmp.
ENDLOOP.
NEW-LINE.
WRITE '-------------------'.
NEW-LINE.

*ezek utén automatikusan lerendezi a táblát
SORT myVector.

LOOP AT myVector INTO tmp.
WRITE / tmp.
ENDLOOP.

Típuscsoportok

Az ABAP-Dictionary-ban lehetőségünk van un. típuscsoportok létrehozásásra (TYPE POOL), melyek típusokat, konstansokat tartalmazhatnak és egyetlen utasítással (TYPE-POOLS) bevonhatunk a programozói munkába.

String függvények

SPLIT


Egy szeparáló karakter alapján részekre vágja a szövegünket, amelyeket változókba rakhatunk
Használat

DATA STR(30) VALUE 'SAP IS AN ERP'. DATA: S1(5), S2(5), S3(5), S4(5). SPLIT STR AT ' ' INTO S1 S2 S3 S4. WRITE:/ S1, / S2, / S3, / S4. Output: SAP IS AN ERP

SEARCH


A SEARCH függvény egy értéket keres meg egy Stringben és az érték pozicióját sy-fdpos nevű rendszerváltozóban tárolja el.
Használat

DATA STR(30) VALUE 'SAP IS AN ERP'. DATA S1(3) VALUE 'AN'. SEARCH STR FOR S1. WRITE :/ SY-FDPOS. sy-fdpos - egy rendszerváltozó, amely at ’AN’ érték első betűjének a pozicióját adja meg az 'SAP IS AN ERP' szövegben. OUTPUT 7

CONCATENATE


A CONCATENATE függvény segítségével tetszőleges számú szöveget fűzhetünk össze.
Használat

DATA STR(30). DATA: S1(5) VALUE 'INDIA', S2(5) VALUE 'IS', S3(5) VALUE 'GREAT'. CONCATENATE S1 S2 S3 INTO STR SEPARATED BY ' '. WRITE :/ STR. Output: INDIA IS GREAT

SHIFT


A SHIFT függvény elmozgatja a string elemeit (LEFT, RIGHT, CIRCULAR) irányba places paraméterben megadott értékkel.
Használat

DATA: T(10) VALUE 'abcdefghij', STRING LIKE T, STR(2) VALUE 'ef'. STRING = T. WRITE STRING. SHIFT STRING UP TO STR. WRITE / STRING. STRING = T. SHIFT STRING UP TO STR LEFT. WRITE / STRING. STRING = T. SHIFT STRING UP TO STR RIGHT. WRITE / STRING. STRING = T. SHIFT STRING UP TO STR CIRCULAR. WRITE / STRING. Output: ’abcdefghij’ ’efghij ’ ’efghij ’ ’ abcdef ’ ’efghijabcd’

TRANSLATE


Translate függvény segítségével kis -, vagy nagybetűssé alakíthatjuk a szövegünket.
Használat

DATA STR(10) VALUE 'CHENNAI'. TRANSLATE STR TO LOWER CASE. WRITE STR. Output: chennai

STRLEN


A függvény egy szöveg hosszát adja vissza.
Használat

DATA STR(30) VALUE 'INDIA IS GREAT'. DATA LEN TYPE I. LEN = STRLEN( STR ). WRITE LEN. Output: 14

CONDENSE


A Condense függvény segítségével eltávolíthatjuk a szóközöket a szövegből.
Használat

DATA: STRING(25) TYPE C VALUE ' ONE TWO THREE FOUR', LEN TYPE I. LEN = STRLEN( STRING ). WRITE: / 'LENGTH: ', LEN. CONDENSE STRING. LEN = STRLEN( STRING ). WRITE: / 'LENGTH: ', LEN. CONDENSE STRING NO-GAPS. LEN = STRLEN( STRING ). WRITE: / 'LENGTH: ', LEN. OUTPUT: ONE TWO THREE FOUR LENGTH: 25 ONE TWO THREE FOUR LENGTH: 18 ONETWOTHREEFOUR LENGTH: 15

REPLACE


A Replace egy szövegben a megadott értékeket kicseréli.
Használat

DATA STR(30) VALUE 'INDIA IS GREAT'. DATA S1(10) VALUE 'FRANCE'. REPLACE 'INDIA' IN STR WITH S1. WRITE STR. OUTPUT: FRANCE IS GREAT

Numerikus függvények

Függvény Leírás Szintaxis
ABS Visszadja az argumentum abszolut értékét ABS(n)
CEIL Visszaadja a következő egész számot ami nagyobb vagy egyenlő az argumentummal CEIL(n)
FLOAT Egy szöveget lebegőpontos számmá alakít. FLOAT(str)
FLOOR Visszaadja azt az egész számot, ami kisebb vagy egyenlő az argumentumnál. FLOOR(n)
HEX Egy hexadecimális szöveget decimális szöveggé konvertál HEX(str)
INT Egy szöveget egész számmá alakít INT(str)
LIMIT Korlátozza egy számot a megadott tartományon. LIMIT(lower,n,upper), ha n kissebb, mint lower, akkor a lower értékkel tér vissza, ha n nagyobb, mint upper akkor az upper értékkel egyébként meg n-el
MAX Megkeresi egy számlista maximumát MAX(number list)
MIN Megkeresi egy számlista minimumát MIN(number list)
NSTR Egy maszknak megfelelően fogrmázza a számot és szöveggel tér vissza NSTR(n,mask) a mask értékeit lásd a Maszkok táblázatban
NVAL Egy szöveg numirikus értékét adja vissza NVAL(str)
POS Egy szöveget positive egész számmá konvertál POS(str)
RND Visszad egy vélétlen számo, ami nagyobb 0 tól és kissebb a max értéktől RND(max)
ROUND Kerekít, visszadja a legközellebbi egész számot (0,5 esetén felfelé kerekít) ROUND(n)
SIGN Az ismert előjel függvény (ha a szám negatív -1, pozitív esetén 1 és minden más esetben 0 val tér vissza ) SIGN(n)
TRUNC A szám egész részét adja vissza TRUNC(n)
FRAC A maradékot adja vissza FRAC(n)

Maszkok


Maszk

Leírás

+

+ vagy - jelet rak a számok elé.

-

a pozitivak elé sapce-t, a negatívak elé - jelet rak .

Z

A jelentés nélküli számjegyek nullák. pl('000045')

P

A jelentés nélküli számjegyek space-k.pl (' 45')

B

A nullákat space-re cseréli.

C

Ezres bontásban jeleníti meg a számokat.

N

A tizedesponttól ballra hány szém jelenjen meg.

. M

A tizedesponntól jobbra hány szám jelenjen meg

%

Az adatokat százalékban jeleníti meg.

[CUR]

Beszúrja az adott deviza kódot. A valuta kódot szögletes zárójelben kell megadni (például a [USD] vagy az [EUR]) .

NORMAL

Szabványos formátum.

Néhány példa

DATA n TYPE p DECIMALS 2. DATA m TYPE p DECIMALS 2 VALUE '-5.55'. n = abs( m ). WRITE: 'ABS: ', n. n = sign( m ). WRITE: / 'SIGN: ', n. n = ceil( m ). WRITE: / 'CEIL: ', n. n = floor( m ). WRITE: / 'FLOOR:', n. n = trunc( m ). WRITE: / 'TRUNC:', n. n = frac( m ). WRITE: / 'FRAC: ', n. Output ABS: 5,55 SIGN: 1,00- CEIL: 5,00- FLOOR: 6,00- TRUNC: 5,00- FRAC: 0,55-

Dátum és idő függvények

Függvény

Leírás

Szintaxis

Példák

DATE

Visszaadja a meghatározott időpontig az adott év, hónap, nap értékeket az alapértelmezett formátumban.

DATE(year,month,day)

DATE(2005,4,23)

Összeállítja az alapértelmezett formátumban a dátumot: 23/4/2005

TIME

Visszaadja a meghatározott időben az adott óra, perc, másodperc értéket az alapértelmezett formátumban.

TIME(hour,min,sec)

TIME(14,30,45) == 14:30:45

Összeállítja az aktuális idő szerint az óra, perc és másodperc értékeketet alapértelmezett formátumban. Ebben az esetben, a következő az eredmény: 14:30:45

DADD/

TADD

Növeli / csökkenti a dátum / idő értéket a paraméterben kapott értékkel.

DADD(dt,n,unit)

TADD (t,n,unit)

TADD(@CREATE_TIME,13,'H')

Ebben az esetben 13 órát ad hozzá az értékhez. például ha a CREATE_TIME 10:17:22 akkor az eredmény: 23:17:22 (az alapértelmezett formátum (HH:NN:SS).

DGET

TGET

Egy numerikus értéket ad vissza, a lényege hogy lekérdezhetjük egy dátum bármely részét külön-külön

DGET(dt,part)

TGET(t,part)

Az első paraméter az idő/dátum, a második pedig, hogy minek a numerikus értékét szeretnénk elkérni óra/hónap

DGET(@CREATE_DATE,'M')

Ha a CREATE_DATE 30.05.2002 és a part paraméter 'M'(Hónap) a visszatérési érték 5 lesz, ha 27.02.2004 akkor 2

DSTR/

TSTR

Ennek a függvénynek a segítségével módosíthatjuk az alapértelmezett dátum formátumot

DSTR (dt,mask)

TSTR (t,mask)

A mask paraméter egy speciális string, ami meghatározza a dátu/idő formátumát

DSTR(@DATE_FIELD,'MON DD, YYYY')

Ebben az esetben ha a DATE_FILED 30.05.2002 a következő alakot kapjuk vissza May 30, 2002

DSTR(DADD(@CREATE_DATE,13,'D'),'XML_DATE')

A függvények egybeágyazhatóak. Ebben a példában hozzáadunk 13 napot a CREATE_DATE paraméterhez, majd egy másik formátumba konvertáljuk,ha a paraméter 30.05.2002, a visszatéréris érték : 2002-06-12

DSUB/

TSUB

Visszaadja a két dátum/idő közötti értéket a unit paraméternek megfelelő formátumban.

DSUB(dt1,dt2,unit)

TSUB (t1,t2,unit)

DSUB(NOW(),@CREATE_DATE,'D')

A példában napokban akarjuk megkapni a két dátum közötti időszakot. A NOW() függvény az aktuális dátumot adja vissza. ha az aktuálsis dátum 16.09.2007 és a CREATE_DATE 05.8.2007, akkor a visszatérési érték 39

DVAL/

TVAL

Converts a date or a time string representation – usually in a user input field – to a standard date/time value. The date/time input format is defined by the client platform and user locale settings.

DVAL(str)

TVAL(str)

DVAL(@TIME_FIELD)

A függvény az alapértelmezett formátumra konvertálja a dátumunkat. A példában, ha a TIME_FIELD 30.05.06, akkor az alapértelmezett formátummal tér vissza: 30/05/2006

NOW/

TNOW

Visszadja az aktuális dátumot vagy időt.

NOW()

TNOW()

NOW()

Visszadja az aktuális dátumot az alapértelmezettt formátumban

TNOW()

Visszadja az aktuális időt az alapértelmezett formátumban:08:40:10