Táblakezelés: Open SQL Internal table Tarcsi Ádám: Az SAP programozása 1.
OPEN SQL Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 2
Open SQL Az Open SQL kulcsszavai: SELECT INSERT UPDATE MODIFY ~ INSERT és UPDATE DELETE OPEN CURSOR FETCH CLOSE CURSOR COMMIT WORK ROLLBACK WORK Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 3
Open SQL SELECT SELECT <* / mezők / aggregátor fv-ek> FROM <tábla> INTO <cél> WHERE <feltétel> GROUP BY <mező csoportosításhoz> HAVING <csoport feltétel> ORDER BY <mező rendezéshez> Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 4
SELECT Több rekord szelektálása: SELECT * FROM customers. ENDSELECT. Egy rekord kiválasztása: SELECT SINGLE * FROM customers WHERE id = 1. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 5
Select Into Table Structure TABLES spfli. SELECT * FROM spfli INTO spfli. WRITE: / spfli-carrid, spfli-connid, spfli-cityfrom, spfli-cityto. ENDSELECT. IF sy-subrc <> 0. WRITE: / Üres a tábla. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 6
Select Into Work Area DATA wa LIKE spfli. SELECT * FROM spfli INTO wa. WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto. ENDSELECT. IF sy-subrc <> 0. WRITE: / Üres a tábla. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 7
Select Into variable DATA: id like customers-id, name like customers-name, city like customers-city. SELECT id name city INTO (id, name, city) FROM customers. WRITE: / id, name, city. ENDSELECT. IF sy-subrc <> 0. write / Üres a tábla. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 8
Select Into Corresponding fields of TABLES: customers. SELECT id name city INTO CORRESPONDING FIELDS OF customers FROM customers. WRITE: / customers-id, customers-name, customers-city. ENSELECT. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 9
Sorszám, DB TABLES customers. SELECT * FROM customers. WRITE: / sy-dbcnt, customers-id, customers-name. ENDSELECT. IF sy-subrc <> 0. WRITE: / Üres a tábla. ELSE. WRITE: / sy-dbcnt, db rekordot találtam. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 10
Kurzor Egy utasítás végrehajtására lefoglalt memóriaterület. Kurzor készítése: OPEN CURSOR [WITH HOLD] <c> FOR SELECT <result> FROM <source> [WHERE <condition>] [GROUP BY <fields>] [HAVING <cond>] [ORDER BY <fields>]. Olvasás: FETCH NEXT CURSOR <c> INTO <target>. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 11
Kurzor példa DATA: c1 TYPE cursor. DATA: wa1 TYPE spfli. OPEN CURSOR: c1 FOR SELECT carrid connid FROM spfli WHERE carrid = 'LH'. DO. FETCH NEXT CURSOR c1 INTO CORRESPONDING FIELDS OF wa1. IF sy-subrc <> 0. CLOSE CURSOR c1. EXIT. ELSE. WRITE: / wa1-carrid, wa1-connid. ENDIF. ENDDO. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 12
COMMIT, ROLLBACK és SAP DB LUW COMMIT WORK: DB Logical Unit of Work (LUW) lezárása, kommittálás ROLLBACK WORK: DB LUW lezárása, visszagörgetés Az SAP DB LUW élettartalma: Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 13
Natív SQL (vs. Open SQL) Adatbázisfüggő SQL utasítás futtatása. Végrehajtás közvetlenül az adatbázisban történik. Előnyei Nem ABAP Dictionary-ban deklarált táblák is 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ánya EXDEC és ENDEXEC között a szintaktikai ellenőrző nem fut le. 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. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 14
Natív SQL példa 1. 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. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 15
Natív SQL példa 2. DATA: F1(3), F2(3), F3(3). EXEC SQL. CREATE TABLE NATIVE_SQL_TST ( CLIENT CHAR(3) NOT NULL, ARG1 CHAR(3) NOT NULL, ARG2 CHAR(3) NOT NULL, FUNCTION CHAR(10) NOT NULL, PRIMARY KEY (CLIENT)) ENDEXEC. EXEC SQL. INSERT INTO NATIVE_SQL_TST VALUES ('800','ar1','ar2','funkció') ENDEXEC. F3 = '800'. EXEC SQL. SELECT CLIENT, ARG1 INTO :F1, :F2 FROM NATIVE_SQL_TST WHERE CLIENT = :F3 ENDEXEC. WRITE: / F1, F2. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 16
INTERNAL TABLE Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 17
Adat objektumok ABAP-ban Változó Struktúra Tábla struktúra Internal Table Internal Table Flight (Internal Table) Carrid Connid Date Price Header Line Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 18
Belső tábla Ideiglenes tábla, mely az alkalmazás szerver memóriájában tárolódik (nem a GUI-t futtató gépen) A program futásakor jön létre, csak akkor használható. Részei: Törzs: A rekordokat tartalmazza. Definíciója: occurs n. Header line: Az éppen visszaadott vagy a táblához adott sort tartalmazza, implicit munkaterület, puffer. Nem minden belső táblához létezik. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 19
Belső tábla létrehozása Data dictonary (SE11) / Adatelem / Táblatípus Más táblára / struktúrára való hivatkozással: DATA <f> <type/like> [OCCURS <n>] [WITH HEADER LINE] Új struktúrával: DATA: BEGIN OF <f> OCCURS <n>, <komponens deklaráció>, END OF <f>. TYPES: BEGIN OF t_ekpo, ebeln TYPE ekpo-ebeln, ebelp TYPE ekpo-ebelp, END OF t_ekpo. DATA: it_ekpo TYPE STANDARD TABLE OF t_ekpo INITIAL SIZE 0, wa_ekpo TYPE t_ekpo. "work area (header line) BEGIN OF: header line-t készít LIKE / TYPE nem készít header line-t, csak WITH HEADER LINE kitétellel! Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 20
Internal table új struktúrával DATA: BEGIN OF tab OCCURS 10, carrid like sflight-carrid, connid like sflight-connid, fldate like sflight-fldate, price like sflight-price, END OF tab. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 21
Internal table ABAP Dictionary struktúrával DATA: BEGIN OF tab OCCURS 0. INCLUDE STRUCTURE sflight, END OF tab. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 22
Internal table like DATA tab LIKE sflight OCCURS 0 WITH HEADER LINE. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 23
Internal table table of DATA tab TYPE TABLE OF customers. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 24
Belső tábla létrehozása OCCURS <n>: Allokálandó memória, (létrejövő sorok száma létrehozáskor). Kiterjeszthető, bővíthető. DATA: wa_itab like itab. " explicit work area itab-hoz (OCCURS nélkül). Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 25
Munka a belső táblákon Munkaterület <wa> - APPEND - COLLECT - INSERT - MODIFY - DELETE Belső tábla <itab> - SORT - CLEAR - REFRESH - LOOP AT - READ TABLE Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 26
Belső táblák feltöltése APPEND [<wa> TO INITIAL LINE TO] <itab>. Header line-nal rendelkező tábla esetén a <wa> TO opció elhagyható. COLLECT [<wa> TO] <itab>. Kulcsegyezés figyelésével. Ha létezik azonos kulccsal bejegyzés, akkor nem történik új sor beszúrása, különben ugyanúgy működik, mint az append INSERT [<wa> TO INITIAL LINE TO] <itab> [INDEX <idx>]. Index megadása kötelező, ha nem LOOP ciklusban dolgozzuk fel a táblát. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 27
Internal tábla feltöltése - APPEND TABLES sflight. DATA flight LIKE sflight OCCURS 0 WITH HEADER LINE. SELECT * FROM sflight. MOVE sflight TO flight. APPEND flight. ENDSELECT. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 28
Rendezés - SORT Sort flight. Sort flight by price fldate. Sort flight by price ascending fldate descending. DATA flight LIKE sflight OCCURS 0 WITH HEADER LINE. SELECT * FROM sflight INTO TABLE tab. SORT tab BY cityfrom. LOOP AT tab. WRITE: / tab-carrid, tab-price. ENDLOOP. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 29
Olvasás - LOOP LOOP AT <itab> [INTO <wa>] [FROM <n1>] [TO <n2>] [WHERE <feltétel>]... ENDLOOP. A FROM opcióval meghatározhatjuk az első olvasandó sornak az indexét. A TO opcióval meghatározhatjuk az utolsó olvasandó sornak az indexét. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 30
Olvasás belső táblából DATA flight LIKE sflight OCCURS 0 WITH HEADER LINE. SELECT * FROM sflight INTO TABLE tab. IF sy-subrc = 0. LOOP AT tab. WRITE: / sy-tabix, tab-carrid, tab-price. ENDLOOP. ELSE. WRITE: / Üres. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 31
Olvasás - READ READ TABLE <itab> [INTO <wa>] INDEX <idx>. Index-edik elem kiolvasása READ TABLE <itab> [INTO <wa>] WITH KEY <key>. Kulcs alapján történő kiolvasás READ TABLE flight WITH KEY carrid = LH Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 32
Sorok módosítása MODIFY <itab> [FROM <wa>] [INDEX <idx>]. TABLES customers. customers-id = 1. customers-name = Teszt.. MODIFY customers. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 33
Sorok törlése - DELETE LOOP ciklusban: DELETE <itab>. Index használatával: DELETE <itab> INDEX <idx>. Feltételtől függően: DELETE <itab> WHERE <feltétel> Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 34
Describe rekordok száma DATA: line_count TYPE i. DATA flight LIKE sflight OCCURS 0 WITH HEADER LINE. SELECT * FROM sflight INTO TABLE tab. DESCRIBE TABLE tab LINES line_count. WRITE: / line_count. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 35
PÉLDÁK Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 36
Belső tábla feltöltése adatbázis táblából * Munkaterület létrehozása adatbázis táblához TABLES CUSTOMERS. * Belső tábla létrehozása header line-al DATA ALL_CUSTOMERS LIKE CUSTOMERS OCCURS 100 WITH HEADER LINE. * Belső tábla feltöltése (korábbi tartalom felülírásával) SELECT * FROM CUSTOMERS INTO TABLE ALL_CUSTOMERS. * Belső tábla feltöltése (korábbi tartalom megtartásával) SELECT * FROM CUSTOMERS APPENDING TABLE ALL_CUSTOMERS. * Eredmény megjelenítése LOOP AT ALL_CUSTOMERS. WRITE / ALL_CUSTOMERS-NAME. ENDLOOP. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 37
Sor / sorok hozzáfűzése belső táblához TABLES CUSTOMERS. * Típus létrehozása a belső táblához TYPES: BEGIN OF T_CUSTOMER_CITY, ID LIKE CUSTOMERS-ID, CITY LIKE CUSTOMERS-CITY, END OF T_CUSTOMER_CITY. * Belső tábla létrehozása DATA CUSTOMER_CITIES TYPE T_CUSTOMER_CITY OCCURS 100 WITH HEADER LINE. * Belső tábla feltöltése SELECT * FROM CUSTOMERS. MOVE-CORRESPONDING CUSTOMERS TO CUSTOMER_CITIES. APPEND CUSTOMER_CITIES. ENDSELECT. * SELECT * INTO CORRESPONDING FIELDS OF TABLE CUSTOMER_CITIES FROM CUSTOMERS. LOOP AT CUSTOMER_CITIES. WRITE / CUSTOMER_CITIES-CITY. ENDLOOP. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 38
Sorok beszúrása adott pozícióba TABLES CUSTOMERS. TYPES: BEGIN OF T_CUSTOMER_CITY, ID LIKE CUSTOMERS-ID, CITY LIKE CUSTOMERS-CITY, END OF T_CUSTOMER_CITY. DATA CUSTOMER_CITIES TYPE T_CUSTOMER_CITY OCCURS 100 WITH HEADER LINE. SELECT * FROM CUSTOMERS. MOVE-CORRESPONDING CUSTOMERS TO CUSTOMER_CITIES. APPEND CUSTOMER_CITIES. ENDSELECT. * Sor beszúrása adott pozícióba CUSTOMER_CITIES-ID = '00000015'. CUSTOMER_CITIES-CITY = 'Szeged'. INSERT CUSTOMER_CITIES INDEX 3. LOOP AT CUSTOMER_CITIES. WRITE / CUSTOMER_CITIES-CITY. ENDLOOP. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 39
Rekord beszúrása adatbázis táblába TABLES CUSTOMERS. * Munkaterület létrehozása DATA VEVOK LIKE CUSTOMERS. * Bejegyzés beillesztése a tábla munkaterületére CUSTOMERS-ID = '12345678'. CUSTOMERS-NAME = 'Kovacs'. INSERT CUSTOMERS. IF SY-SUBRC <> 0. WRITE: / 'A bejegyzés már létezik:', CUSTOMERS-ID. ENDIF. * Beillesztés a munkaterületről VEVOK-ID = '11111111'. VEVOK-NAME = 'Nagy'. INSERT INTO CUSTOMERS VALUES VEVOK. IF SY-SUBRC <> 0. WRITE: / ' A bejegyzés már létezik :', VEVOK-ID. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 40
Rekordok beillesztése adatbázis táblába TABLES CUSTOMERS. DATA UJ_VEVOK LIKE CUSTOMERS OCCURS 100 WITH HEADER LINE. * Belső tábla feltöltése UJ_VEVOK-ID = '12345678'. UJ_VEVOK-NAME = 'Kovács'. APPEND UJ_VEVOK. UJ_VEVOK-ID = '11111111'. UJ_VEVOK-NAME = 'Nagy'. APPEND UJ_VEVOK. UJ_VEVOK-ID = '12121212'. UJ_VEVOK-NAME = 'Kis'. APPEND UJ_VEVOK. * Tábla feltöltése a belső táblában lévő adatokkal INSERT CUSTOMERS FROM TABLE UJ_VEVOK. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 41
Adatbázis tábla módosítása (UPDATE / MODIFY) TABLES CUSTOMERS. * Tábla módosítása (munkaterület alapján) CUSTOMERS-ID = '12345678'. CUSTOMERS-CITY = 'Pécs'. UPDATE CUSTOMERS. * MODIFY CUSTOMERS. IF SY-SUBRC <> 0. WRITE: 'Bejegyzés nem létezik:', CUSTOMERS- ID. ENDIF. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 42
Adatbázis tábla módosítása - több rekord TABLES CUSTOMERS. * Belső tábla a módosításhoz DATA MOD_CUSTOMERS LIKE CUSTOMERS OCCURS 50 WITH HEADER LINE. SELECT * FROM CUSTOMERS INTO TABLE MOD_CUSTOMERS WHERE CITY = SPACE. LOOP AT MOD_CUSTOMERS. MOD_CUSTOMERS-CITY = 'Ismeretlen'. MODIFY MOD_CUSTOMERS. ENDLOOP. * Adatbázis-tábla módosítása UPDATE CUSTOMERS FROM TABLE MOD_CUSTOMERS. * Adatbázis-tábla módosítása WHERE klauzúrával UPDATE CUSTOMERS SET CITY = 'Ismeretlen' WHERE CITY = SPACE. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 43
Törlés adatbázis táblából TABLES CUSTOMERS. * Egy rekord törlése CUSTOMERS-ID = '12345678'. DELETE CUSTOMERS. * Belső tábla a törléshez DATA TOROLT_VEVOK LIKE CUSTOMERS OCCURS 50 WITH HEADER LINE. * Belső tábla feltöltése SELECT * FROM CUSTOMERS INTO TABLE TOROLT_VEVOK WHERE CITY = SPACE. * Törlés adatbázis táblából belső tábla alapján DELETE CUSTOMERS FROM TABLE TOROLT_VEVOK. * Törlés adatbázis táblából WHERE feltétel használatával. DELETE FROM CUSTOMERS WHERE ID LIKE '1%'. Tarcsi Ádám, ELTE SAP Excellence Center: SAP programozás oktatóanyag 44