Az ABAP programozási nyelv

Példaprogramok

Prímszám kiíró program

Adott értékig felsorolja a prímszámokat.

REPORT zprime . DATA : t_no TYPE i, res TYPE p, pr_no TYPE p, tag TYPE i. SELECTION-SCREEN BEGIN OF BLOCK b1. PARAMETERS : pr_num TYPE i. SELECTION-SCREEN END OF BLOCK b1. pr_no = 1. WHILE pr_no LE pr_num. t_no = 2. tag = 0. WHILE t_no < pr_no. res = pr_no MOD t_no. IF res = 0. WRITE : / pr_no. WRITE : 'is not PRIME Number ' COLOR 3 INTENSIFIED OFF. tag = 1. EXIT. ENDIF. t_no = t_no + 1. ENDWHILE. IF tag = 0. WRITE : / pr_no. WRITE : 'is PRIME Number ' COLOR 6 INTENSIFIED OFF. ENDIF. pr_no = pr_no + 1. ENDWHILE.

Dátum formázás

A program átalakít egy 20050428 formátumú dátumot, ilyenné: 28th Apr 2005.

FORM set_text_date. DATA: month(9), year(4), date(2). CASE p_frd+4(2). WHEN '01'. month = 'January'. WHEN '02'. month = 'February'. WHEN '03'. month = 'March'. WHEN '04'. month = 'April'. WHEN '05'. month = 'May'. WHEN '06'. month = 'June'. WHEN '07'. month = 'July'. WHEN '08'. month = 'August'. WHEN '09'. month = 'September'. WHEN '10'. month = 'October'. WHEN '11'. month = 'November'. WHEN '12'. month = 'December'. WHEN OTHERS. ENDCASE. WRITE p_frd+0(4) TO year. WRITE p_frd+6(2) TO date. CONCATENATE month date ',' year INTO return_date SEPARATED BY space. CONDENSE return_date. ENDFORM.

ASCII kód és a neki megfelelő karakter közötti konvertálás

Hogyan alakítsuk át, az 'A' karaktere a neki megfelelő ASCII kóddá?

data : c value 'A'. field-symbols : type x. data : rn type i. assign c to casting. move to rn. write rn.

Hogyan alakítsuk át, a 66-os ASCII kódot a neki megfeleő karakterré?
data : i type i value 66. data : x type x. field-symbols : type c. move i to x. assign x to casting type c. move to c. write c.

Könyvtár létrehozás

Egy adott könyvtár létrehozása a merevlemez-meghajtón.

REPORT ZGUI_DIR. call function 'GUI_CREATE_DIRECTORY' exporting dirname = 'C:\TEST\' EXCEPTIONS FAILED = 1 OTHERS = 2. if sy-subrc <> 0. WRITE: / 'Error Code ',SY-SUBRC. else. WRITE: / 'Directory Created...'. endif.

Fájlból olvasás

Adatfájlból való olvasás.

REPORT CHAP2602. * Data declarations for later use TABLES CUSTOMERS. PARAMETERS FILENAME(128) DEFAULT '/usr/tmp/testfile.dat' LOWER CASE. DATA: MSG_TEXT(50), ALL_CUSTOMER_NAMES LIKE CUSTOMERS-NAME OCCURS 100 WITH HEADER LINE. * Opening the File OPEN DATASET FILENAME FOR INPUT IN TEXT MODE MESSAGE MSG_TEXT. IF SY-SUBRC NE 0. WRITE: 'File cannot be opened. Reason:', MSG_TEXT. EXIT. ENDIF. * Reading Data DO. READ DATASET FILENAME INTO ALL_CUSTOMER_NAMES. IF SY-SUBRC NE 0. EXIT. ENDIF. APPEND ALL_CUSTOMER_NAMES. ENDDO. * Closing the file CLOSE DATASET FILENAME. * Display the result LOOP AT ALL_CUSTOMER_NAMES. WRITE / ALL_CUSTOMER_NAMES. ENDLOOP.

Felhasználói megerősítés

REPORT ZPOPUPCONFIRM. DATA: X_ANS(1) TYPE C. call function 'POPUP_TO_CONFIRM_STEP' exporting * DEFAULTOPTION = 'Y' textline1 = 'Do you want to continue' * TEXTLINE2 = ' ' titel = 'Please Confirm' * START_COLUMN = 25 * START_ROW = 6 * CANCEL_DISPLAY = 'X' IMPORTING ANSWER = X_ANS. WRITE: / X_ANS.

Várakozás 30 másodpercig

FUNCTION Z_WAIT_30_SECS. DATA: ZTIME LIKE SY-UZEIT. GET TIME. ZTIME = SY-UZEIT + 30. DO. GET TIME. IF SY-UZEIT >= ZTIME. EXIT. ENDIF. ENDDO. ENDFUNCTION.

Szelekciós képernyő példaprogram

*&---------------------------------------------------------------------* *& Report Z_VARI_SZELKEP *& *&---------------------------------------------------------------------* *& Példa alapvető szelekciós képernyő kezelésre. *& Néhány alapvető esemény, és képelem felhasználásával *& *&---------------------------------------------------------------------* REPORT Z_VARI_SZELKEP. TABLES sscrfields. *& Több vezérlő egy sorban SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(10) text-001. PARAMETERS: p1(3) TYPE c, p2(5) TYPE c, p3(1) TYPE c. SELECTION-SCREEN END OF LINE. *& Vonalak, Comment, Uline SELECTION-SCREEN SKIP 2. SELECTION-SCREEN COMMENT /10(30) comm1. SELECTION-SCREEN ULINE. *& Radio gombok egy csoportban PARAMETERS: r1 RADIOBUTTON GROUP rad1, r2 RADIOBUTTON GROUP rad1, r3 RADIOBUTTON GROUP rad1. *& Funkció gombok aktiválása, kellett *& hozzá az SSCRFIELDS definíció SELECTION-SCREEN: FUNCTION KEY 1, FUNCTION KEY 2. AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN'FC01'. p2 = 'Egyes'. WHEN 'FC02'. p2 = 'Kettes'. ENDCASE. INITIALIZATION. sscrfields-functxt_01 = 'Egyes'. sscrfields-functxt_02 = 'Kettes'.

Speciálisan megjelenő objektumok a képernyőn

*&---------------------------------------------------------------------* *& Report ZSZVPABI_DATE *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZSZVPABI_DATE. * PARAMETERS p_carr1 TYPE S_CARR_ID. * PARAMETERS p_carr2 LIKE S_CARR_ID. DATA: ev(4) TYPE c, ho(2) TYPE c, nap(2) TYPE c. IF sy-saprl <'45A'. WRITE: sy-saprl, 'ABAP nem OOP-s'. ELSEIF sy-saprl <'46A'. WRITE: sy-saprl, 'ABAP félig OOP-s'. ELSE. WRITE: sy-saprl, 'ABAP teljesen OOP-s'. ENDIF. WRITE: / sy-datum. WRITE: / sy-datum YYMMDD. ev = sy-datum(4). ho = sy-datum+4(2). nap = sy-datum+6(2). WRITE: / 'ev', ev, 'ho', ho, 'nap', nap. CASE sy-datum+4(2). WHEN '12' OR '01' OR '02'. WRITE: / 'Tél'. WHEN '03' OR '04' OR '05'. WRITE: / 'Tavasz'. WHEN '06' OR '07' OR '08'. WRITE: / 'Nyár'. WHEN '09' OR '10' OR '11'. WRITE: / 'Ősz'. WHEN OTHERS. WRITE: / 'Hibás dátum'. ENDCASE. * Üres sor SKIP 10. ULINE. WRITE: 'Egy', / ' ', / 'Kettő'. * Aposztróf kiírása WRITE: / 'Aposztróf kiírása: O''Reilly'. WRITE: /13 text-000. DATA: POS TYPE I, LEN TYPE I. pos = 15. len = 3. WRITE 'A szöveg itt ------- jelenik meg.'. WRITE AT pos(len) text-000. SKIP 2. WRITE: 'Sorszám:' NO-GAP, SY-LINNO LEFT-JUSTIFIED. SKIP 2. WRITE: '00012', / '00012' NO-ZERO. SKIP 2. DATA: g(5) TYPE C VALUE 'Hello', f(5) TYPE C VALUE 'Világ'. WRITE: /10 g, / f UNDER g. FORMAT COLOR COL_HEADING. "vagy = 1 WRITE: / 'Oszlopfejléc formázással van.'. FORMAT COLOR COL_HEADING OFF. WRITE: 'Normál'. FORMAT COLOR = 3. WRITE: 'Más formázással van.'. FORMAT COLOR OFF. WRITE: 'Normál'. * Checkbox DATA flag1 TYPE C VALUE ' '. DATA flag2 TYPE C VALUE 'X'. DATA flag3(5) TYPE C VALUE 'Xenon'. WRITE: / 'Flag 1', flag1 as CHECKBOX, / 'Flag 2', flag2 as CHECKBOX, / 'Flag 3', flag3 as CHECKBOX. SKIP. * Ikonok, szimbólumok INCLUDE . INCLUDE . WRITE: / 'Telefon szimbólum', SYM_PHONE AS SYMBOL. SKIP. WRITE: / 'Alarm ikon', ICON_ALARM AS ICON. SKIP. DATA: time TYPE t VALUE '192133'. WRITE /(8) time USING EDIT MASK '__:__:__'. DATA: ev_start TYPE D, napok TYPE I. ev_start+4(4) ='0101'. napok = sy-datum - ev_start + 1. WRITE: / 'Eltelt napok száma:', napok. DATA: text(25) TYPE C VALUE 'sflsdmgioprh', hossz TYPE I. hossz = strlen( text ). WRITE: / hossz. * Konkatenáció DATA: sor(50) TYPE C. * CONCATENATE text INTO SOR. * MOVE DATA: A(5), B(5), C(5). A = '12345'. B = '67890'. MOVE A+2(2) TO C. WRITE: / C. MOVE A+2(2) TO B+1(2). WRITE: / B. * MOVE-CORRESPONDING mit TO mibe. * Változó értékének törlése CLEAR A. WRITE: / A. * Csere text = 'Érték1, Érték2, Valami3, Ezaz4'. WHILE sy-subrc = 0. REPLACE ', ' WITH ' - ' INTO text. ENDWHILE. WRITE / text. SKIP. * Keresés SEARCH text FOR 'Valami'. WRITE: / sy-subrc, sy-fdpos.

Repülőjáratok táblában adatkezelés

*&---------------------------------------------------------------------* *& Report ZSZVPABI_FLY *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZSZVPABI_FLY. DATA sv_sflight TYPE sflight. PARAMETERS p_carrid TYPE SPFLI-CARRID MATCHCODE OBJECT H_SCARR. PARAMETERS p_connid TYPE SPFLI-CONNID. DATA: sv_jarat TYPE SPFLI. *A kulcsra szelektáltam ---> egy rekord. DATA: sv_repulesek TYPE SFLIGHT OCCURS 100 WITH HEADER LINE. DATA: DB TYPE I, AR TYPE SFLIGHT-PRICE, HELYEK TYPE SFLIGHT-SEATSOCC, ARBEV TYPE SFLIGHT-PAYMENTSUM, ATLAG TYPE SFLIGHT-PRICE. SELECT SINGLE * FROM SPFLI INTO sv_jarat WHERE CARRID = p_carrid AND CONNID = p_connid. SELECT * FROM SFLIGHT INTO TABLE sv_repulesek WHERE CARRID = p_carrid AND CONNID = p_connid. WRITE: 'Járat adatai:'. WRITE: / 'Indulási város: ', sv_jarat-cityfrom. WRITE: / 'Indulási reptér: ', sv_jarat-airpfrom. WRITE: / 'Érkezési város: ', sv_jarat-cityto. WRITE: / 'Érkezési reptér: ', sv_jarat-airpto. DB = 0. AR = 0. ARBEV = 0. HELYEK = 0. LOOP AT sv_repulesek. DB = DB + 1. AR = AR + sv_repulesek-PRICE. HELYEK = HELYEK + sv_repulesek-SEATSOCC. ARBEV = ARBEV + sv_repulesek-PAYMENTSUM. ENDLOOP. ATLAG = AR / DB. WRITE: /'Repülések száma:',DB. WRITE: /'Repülőjegy átlag ára:',ATLAG. WRITE: /'Foglalt helyek száma: ',HELYEK. WRITE: /'Eladott jegyek bevétele: ',ARBEV. SKIP 2. DATA: SV_REP TYPE ZSZVPABI_JARAT. SV_REP-LEGITARSASAG = p_carrid. SV_REP-JARAT_AZON = p_connid. SV_REP-INDCITY = sv_jarat-cityfrom. SV_REP-INDAIRP = sv_jarat-airpfrom. SV_REP-ERKCITY = sv_jarat-cityto. SV_REP-ERKAIRP = sv_jarat-airpto. SV_REP-DB = DB. SV_REP-ATLAGAR = ATLAG. SV_REP-ARBEV = ARBEV. SV_REP-HELYEK = HELYEK. SV_REP-PENZNEM = sv_repulesek-CURRENCY. INSERT ZSZVPABI_JARAT FROM SV_REP.

Grafikon készítése

REPORT ZNETQAAI_GRAF. ********************************************************************* * Grafikon adatait egy belső táblában tároljuk (ITAB_DATA). * Az grafikon(ok) tulajdonságait egy másik belső táblában * tároljuk (ITAB-OPTIONS). * Bővebb információért lásd GRAPH_MATRIX_3D dokumentációját! ********************************************************************* DATA: BEGIN OF ITAB_DATA OCCURS 0, ADATNEV(32) TYPE C, MENNYISEG1 TYPE I, MENNYISEG2 TYPE I, MENNYISEG3 TYPE I, END OF ITAB_DATA, BEGIN OF ITAB_OPTIONS OCCURS 0, OPTION(32) TYPE C, END OF ITAB_OPTIONS. ITAB_DATA-ADATNEV = 'Élelmiszerek'. ITAB_DATA-MENNYISEG1 = 150435. ITAB_DATA-MENNYISEG2 = 156619. ITAB_DATA-MENNYISEG3 = 154704. APPEND ITAB_DATA. ITAB_DATA-ADATNEV = 'Ruházkodás'. ITAB_DATA-MENNYISEG1 = 31170. ITAB_DATA-MENNYISEG2 = 32827. ITAB_DATA-MENNYISEG3 = 32786. APPEND ITAB_DATA. ITAB_DATA-ADATNEV = 'Közlekedés, Hírközlés'. ITAB_DATA-MENNYISEG1 = 104836. ITAB_DATA-MENNYISEG2 = 117471. ITAB_DATA-MENNYISEG3 = 140273. APPEND ITAB_DATA. ITAB_OPTIONS-OPTION = 'P3TYPE = TO'. ITAB_OPTIONS-OPTION = 'P2TYPE = VB'. ITAB_OPTIONS-OPTION = 'TISIZE = 1'. APPEND ITAB_OPTIONS. CALL FUNCTION 'GRAPH_MATRIX_3D' EXPORTING COL1 = '2003' COL2 = '2004' COL3 = '2005' TITL = 'Egy főre jutó évi kiadások Magyarországon, FT' TABLES DATA = ITAB_DATA OPTS = ITAB_OPTIONS EXCEPTIONS OTHERS = 1.

Tábla tartalmának Excel fájlba exportálása

REPORT ZNETQAAI_EXCEL. TABLES: ZNETQAAI_NYILV. DATA: BEGIN OF ITAB OCCURS 100. INCLUDE STRUCTURE ZNETQAAI_NYILV. DATA: END OF ITAB. * Az itab belső táblába másolja a znetqaai_nyilv tábla tartalmát SELECT * FROM ZNETQAAI_NYILV INTO TABLE ITAB. * A DOWNLOAD egy lokális fájlba másolja egy belső tábla tartalmát CALL FUNCTION 'DOWNLOAD' EXPORTING FILENAME = 'c:\temp\sap.xls' FILETYPE = 'DAT' " a létrehozandó fájl struktúrája (típusa) MODE = ' ' " felülíró mód TABLES DATA_TAB = ITAB. ******************************************************************** * WS_EXECUTE egy lokális programot futtat a megadott paraméterekkel. * Ez esetben az excel.exe-vel megnyitja az exportált fájlt ******************************************************************** CALL FUNCTION 'WS_EXECUTE' EXPORTING COMMANDLINE = 'c:\temp\sap.xls' PROGRAM = 'C:\Program Files\Microsoft Office\Office14\EXCEL.EXE'.

Lokális (ASCII) fájlból táblába írás

REPORT ZNETQAAI_UP. TABLES ZNETQAAI_NYILV. DATA itab LIKE TABLE OF ZNETQAAI_NYILV WITH HEADER LINE. REFRESH itab. * Feltölt egy belső táblát egy lokális fájlból CALL FUNCTION 'GUI_UPLOAD' EXPORTING FILENAME = 'C:\temp\input.txt' FILETYPE = 'ASC' " ASCII kódolású fájlból HAS_FIELD_SEPARATOR = 'X' " mezők tabulátorral elválasztva TABLES DATA_TAB = itab EXCEPTIONS FILE_OPEN_ERROR = 1 FILE_READ_ERROR = 2 NO_BATCH = 3 GUI_REFUSE_FILETRANSFER = 4 INVALID_TYPE = 5 NO_AUTHORITY = 6 UNKNOWN_ERROR = 7 BAD_DATA_FORMAT = 8 HEADER_NOT_ALLOWED = 9 SEPARATOR_NOT_ALLOWED = 10 HEADER_TOO_LONG = 11 UNKNOWN_DP_ERROR = 12 ACCESS_DENIED = 13 DP_OUT_OF_MEMORY = 14 DISK_FULL = 15 DP_TIMEOUT = 16 OTHERS = 17 . * A SY-SUBRC-be kerülnek az esetleges hibakódok (EXCEPTIONS értékei) IF SY-SUBRC <> 0. WRITE: / 'Hiba: ',SY-SUBRC. ENDIF. ********************************************************************* * Végig megy az itab belső táblán, ha már létező törzsszámú * sort talál a znetqaai_nyilv táblában, akkor azokat nem * illeszti be a táblába. ********************************************************************* LOOP AT itab. WRITE: / itab-torzssz, itab-veznev, itab-kernev, itab-szul_ev. SELECT SINGLE * FROM ZNETQAAI_NYILV WHERE TORZSSZ = itab-torzssz. IF SY-SUBRC = 0. WRITE: '***Beillesztés sikertelen! Már létezik!***'. ELSE. CLEAR ZNETQAAI_NYILV. MOVE-CORRESPONDING itab TO ZNETQAAI_NYILV. MODIFY ZNETQAAI_NYILV. WRITE: 'Rögzítve az új érték!'. ENDIF. ENDLOOP.

Szelekció és külső függvény használat

REPORT ZPEBPAAI_KEREKPAR * sv_bringa néven létrehozunk egy belső táblát a zpebpaai_kerekpar mintájára DATA sv_bringa TYPE zpebpaai_kerekpar. * Paraméterek létrehozásánál szintén a már meglévő tábla adatelemeinek típusára hivatkozunk PARAMETERS: min_ar TYPE zpebpaai_kerekpar-beszerz_ar, max_ar TYPE zpebpaai_kerekpar-beszerz_ar. * ZAR egy egyedi típus definíció DATA brutto TYPE ZAR. DATA szin TYPE STRING. * Adatok beolvasása a belső táblába SELECT * FROM zpebpaai_kerekpar INTO sv_bringa WHERE beszerz_ar >= min_ar and beszerz_ar <= max_ar. WRITE: / sv_bringa-gyariszam. WRITE: sv_bringa-tipus. * Külső függvény hívása a színkód és szinek párosításához CALL FUNCTION 'ZPEBPAAI_SZINKOD' EXPORTING szinkod = sv_bringa-szinkod IMPORTING szin = szin. WRITE: szin. WRITE: sv_bringa-beszerz_ar. * Külső függvény hívás a bruttó ár kiszámításához CALL FUNCTION 'ZPEBPAAI_BR' EXPORTING netto = sv_bringa-beszerz_ar IMPORTING brutto = brutto. WRITE: brutto. ENDSELECT. * ---------------------------------------------------------------------- * Külső függvények megvalósítása a Funkciócsoportokon belül: * ---------------------------------------------------------------------- FUNCTION ZPEBPAAI_SZINKOD. *"---------------------------------------------------------------------- *"*"Lokális interfész: *" IMPORTING *" REFERENCE(SZINKOD) TYPE ZPEBPAAI_SZINKODA *" EXPORTING *" REFERENCE(SZIN) TYPE STRING *"---------------------------------------------------------------------- IF szinkod = 1. szin = 'piros'. ELSEIF szinkod = 2. szin = 'narancssárga'. ELSEIF szinkod = 2. szin = 'citromsárga'. ELSEIF szinkod = 4. szin = 'zöld'. ELSEIF szinkod = 5. szin = 'kék'. ENDIF. ENDFUNCTION. * ---------------------------------------------------------------------- FUNCTION ZPEBPAAI_BR. *"---------------------------------------------------------------------- *"*"Lokális interfész: *" IMPORTING *" REFERENCE(NETTO) TYPE ZAR *" EXPORTING *" REFERENCE(BRUTTO) TYPE ZAR *"---------------------------------------------------------------------- * butto = netto * 1.27 * A fenti megoldás máshol menne, de itt nem, * mert a netto és brutto is decimális. * A tizedesjegyes megvalósításhoz, kell az '..' jel. brutto = netto * '1.27'. ENDFUNCTION.

Párhuzamos szálkezelés

A Főprogram - feltételezzük, hogy a

*&---------------------------------------------------------------------* *& Report Z_PARALLEL_TEST_PROG *&---------------------------------------------------------------------* *& Szerző: Szatmári Dávid *& Dátum: 2014.05.02. *& Rendszer: ELTE - IDES *& Előadás: Programozási nyelvek és paradigmák összehasonlítása II. *& Oktató: Nyékyné Gaizler Judit *&---------------------------------------------------------------------* *& Leírás: A példaprogram az ABAP nyelvben használható párhuzamos *& futtatást mutatja be. *&---------------------------------------------------------------------* REPORT z_parallel_test_prog. CONSTANTS: c_sec_to_wait TYPE i VALUE 1, " Sec. két írás között c_num_writes TYPE i VALUE 3, " Hányszor írjon egy szál c_num_of_threads TYPE i VALUE 5. " Hány szál legyen DATA: gv_my_number TYPE i VALUE 0, gv_taskname TYPE string, gv_thread_num TYPE string, gv_counter TYPE i. * A futás során mindegyik szál egy belső táblába írja a nevét és az időt, * amikor a futását befejezte. Ezeket a tábla/struktúra típusokat SE11-ben * létre kell hozni. DATA: gt_final_data TYPE ztabl_parallel, gs_final_data TYPE zstruct_parallel. DO c_num_of_threads TIMES. ADD 1 TO gv_my_number. gv_thread_num = gv_my_number. * A szálaknak különböző nevet adunk: Thread 1, stb. CONCATENATE 'Thread' gv_thread_num INTO gv_taskname SEPARATED BY space. * Itt történik a szál indítása, ami a korábban létrehozott Z_PARALLEL_TEST * f/e-t fogja a programon kívül futtatni. * A visszatérési értéket a set_function_done performban kapjuk meg. CALL FUNCTION 'Z_PARALLEL_TEST' STARTING NEW TASK gv_taskname DESTINATION 'NONE' PERFORMING set_function_done ON END OF TASK EXPORTING iv_what_is_my_number = gv_my_number iv_how_many_times = c_num_writes iv_how_long_to_wait = c_sec_to_wait. ENDDO. * Egészen addig várunk, amíg az összes f/e vissza nem tér... WAIT UNTIL gv_counter = c_num_of_threads. * Rendezzük idő szerint a táblát. SORT gt_final_data BY finish_time ASCENDING. * Kiíratjuk az adatokat. LOOP AT gt_final_data INTO gs_final_data. WRITE:/ gs_final_data-name, gs_final_data-finish_time. ENDLOOP.

A visszatérési értéket feldolgozó alprogram
*&---------------------------------------------------------------------* *& Form set_function_done *&---------------------------------------------------------------------* * A Z_PARALLEL_TEST f/e visszatérési értékét dolgozzuk fel. *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM set_function_done USING taskname. DATA: lt_itab TYPE ztabl_parallel, ls_struct TYPE zstruct_parallel. * Itt kapjuk meg a száltól az adatokat RECEIVE RESULTS FROM FUNCTION 'Z_PARALLEL_TEST' TABLES ot_results = lt_itab . * Beleírjuk a globális táblába - végeredmény LOOP AT lt_itab INTO ls_struct. APPEND ls_struct TO gt_final_data. ENDLOOP. * Mivel a szál befejezte a futását ezért növeljük a globális számlálót. ADD 1 TO gv_counter. ENDFORM. " set_function_done

A párhuzamosan meghívott funkcioelem
FUNCTION z_parallel_test. *"---------------------------------------------------------------------- *"*"Lokális interfész: *" IMPORTING *" VALUE(IV_WHAT_IS_MY_NUMBER) TYPE I *" VALUE(IV_HOW_MANY_TIMES) TYPE I *" VALUE(IV_HOW_LONG_TO_WAIT) TYPE I *" TABLES *" OT_RESULTS TYPE ZTABL_PARALLEL *"---------------------------------------------------------------------- DATA: gv_itab TYPE ztabl_parallel, gv_line TYPE zstruct_parallel, gv_thread_name TYPE char10, gv_thread_num TYPE string. * IV_WHAT_IS_MY_NUMBER alapján összeállítjuk a szál nevét gv_thread_num = iv_what_is_my_number. CONCATENATE 'Thread' gv_thread_num INTO gv_thread_name SEPARATED BY space. * IV_HOW_MANY_TIMES alapján írunk a kimeneti táblába. DO iv_how_many_times TIMES. gv_line-name = gv_thread_name. gv_line-finish_time = sy-uzeit. APPEND gv_line TO ot_results. * IV_HOW_LONG_TO_WAIT alapján várunk. WAIT UP TO iv_how_long_to_wait SECONDS. ENDDO. ENDFUNCTION.

A program kimenete
Párhuzamos futtatás teszt program Thread 5 11:11:38 Thread 1 11:11:38 Thread 3 11:11:38 Thread 2 11:11:38 Thread 4 11:11:38 Thread 1 11:11:39 Thread 2 11:11:39 Thread 4 11:11:39 Thread 3 11:11:39 Thread 5 11:11:39 Thread 4 11:11:40 Thread 3 11:11:40 Thread 2 11:11:40 Thread 5 11:11:40 Thread 1 11:11:40


TIC-TACeTOE

INCLUDE fájlok

INCLODE YGLOBALS

*----------------------------------------------------------------------* * GLOBAL VARIABLES * *----------------------------------------------------------------------* DATA: v_turn(1) VALUE 'X'," Melyik játékos jön. v_win(1) VALUE ' '." Melyik játékos nyert.

INCLODE YSELECTIONSCREEN

*&---------------------------------------------------------------------* *& Include YSELECTIONSCREEN *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * SELECTION-SCREEN * *----------------------------------------------------------------------* * A szelekciós képernyo létrehozása SELECTION-SCREEN BEGIN OF BLOCK BOARD. SELECTION-SCREEN BEGIN OF LINE. *PUSHBUTTON - A felületi elem típusa *(4)- Mekkora legyen a felületi elem nagysága *icon1 stb. A felületi elem nevei *UC_ICON1 stb. A gombnyomás eseménye SELECTION-SCREEN PUSHBUTTON (4) icon1 USER-COMMAND uc_icon1."1x1 SELECTION-SCREEN PUSHBUTTON (4) icon2 USER-COMMAND uc_icon2."2x1 SELECTION-SCREEN PUSHBUTTON (4) icon3 USER-COMMAND uc_icon3."3x1 SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP 1. * Egy üres sor SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (4) icon4 USER-COMMAND uc_icon4."1x2 SELECTION-SCREEN PUSHBUTTON (4) icon5 USER-COMMAND uc_icon5."2x2 SELECTION-SCREEN PUSHBUTTON (4) icon6 USER-COMMAND uc_icon6."3x2 SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (4) icon7 USER-COMMAND uc_icon7."1x3 SELECTION-SCREEN PUSHBUTTON (4) icon8 USER-COMMAND uc_icon8."2x3 SELECTION-SCREEN PUSHBUTTON (4) icon9 USER-COMMAND uc_icon9."3x3 SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (12) restart USER-COMMAND uc_restart. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK BOARD. * A SZELEKCIOS KEPERNYO VEGE *----------------------------------------------------------------------* * AT SELECTION-SCREEN * *----------------------------------------------------------------------* *Itt döntjük el, hogy a gombnyomás eseményt milyen gombra hivjuk meg. *SY-UCOMM Rendzserváltozóból lekérjük a meghívott esemény nevét *Majd ez alapján egy CASE utasítással eldöntjük, a push_button eljárás *paraméterét. AT SELECTION-SCREEN. CASE sy-ucomm. WHEN 'UC_ICON1'. PERFORM push_button USING icon1. WHEN 'UC_ICON2'. PERFORM push_button USING icon2. WHEN 'UC_ICON3'. PERFORM push_button USING icon3. WHEN 'UC_ICON4'. PERFORM push_button USING icon4. WHEN 'UC_ICON5'. PERFORM push_button USING icon5. WHEN 'UC_ICON6'. PERFORM push_button USING icon6. WHEN 'UC_ICON7'. PERFORM push_button USING icon7. WHEN 'UC_ICON8'. PERFORM push_button USING icon8. WHEN 'UC_ICON9'. PERFORM push_button USING icon9. WHEN 'UC_RESTART'. PERFORM restart_game.

YTICTACTOE

REPORT YTICTACTOE. *&---------------------------------------------------------------------* *& Report YTic-tac-toe * *& * *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * INCLUDES - A betölteni kívánt fájlok listája *----------------------------------------------------------------------* INCLUDE CTSICONS."ICONS FOR THE GAME. " Az ikonok listája (A rendszertől kapjuk) INCLUDE YGLOBALS. " Ebben vannak a globális változóink INCLUDE YSELECTIONSCREEN. " A képernyőnek a megvalósítása *----------------------------------------------------------------------* * INITIALIZATION * *----------------------------------------------------------------------* INITIALIZATION. PERFORM clear_buttons. " Indításkor töröljük az ikonokat a gombokról *&---------------------------------------------------------------------* *& Form clear_buttons *&---------------------------------------------------------------------* * Minden gombot üresre állítunk *----------------------------------------------------------------------* FORM clear_buttons . icon1 = '@5F@' . icon2 = '@5F@' . icon3 = '@5F@' . icon4 = '@5F@' . icon5 = '@5F@' . icon6 = '@5F@' . icon7 = '@5F@' . icon8 = '@5F@' . icon9 = '@5F@' . restart = 'Új játék'. " A mezők alatt lévő gomb neve ENDFORM." clear_buttons *&---------------------------------------------------------------------* *& Form push_button *&---------------------------------------------------------------------* * Ez az eljárás hívódik meg a gomb lenyomása után *----------------------------------------------------------------------* * --> p_icon Button pushed *----------------------------------------------------------------------* FORM push_button USING p_icon. " paraméterben megkapjuk a gombot * MEgvizsgáljuk hogy a gombon van-e már icon, ha van nem rakjuk le. IF p_icon <> '@5F@'. EXIT. ENDIF. *Ha még nincs icon akkor lerakunk egyett annak megfelelően hogy melyik játkos jön IF v_turn IS INITIAL. p_icon = '@7C@'. v_turn = 'X'. ELSE. p_icon = '@C9@'. CLEAR v_turn. ENDIF. * Itt vizsgáljuk minden egyes gomb lenyomása után, hogy kialakult-e * mér nyertes állapot IF ( icon1 = icon5 AND icon5 = icon9 AND icon1 <> '@5F@' )"JOBB ATLO OR ( icon3 = icon5 AND icon5 = icon7 AND icon3 <> '@5F@' )"BAL ATLO OR ( icon1 = icon2 AND icon2 = icon3 AND icon1 <> '@5F@' )"1. SOR OR ( icon4 = icon5 AND icon5 = icon6 AND icon4 <> '@5F@' )"2. SOR OR ( icon7 = icon8 AND icon8 = icon9 AND icon7 <> '@5F@' )"3. SOR OR ( icon1 = icon4 AND icon4 = icon7 AND icon1 <> '@5F@' )"1. OSZLOP OR ( icon2 = icon5 AND icon5 = icon8 AND icon2 <> '@5F@' )"2. OSZLOP OR ( icon3 = icon6 AND icon6 = icon9 AND icon3 <> '@5F@' )."3. OSZLOP v_win = 'X'. ENDIF. * Megvizsgálunk minden gombot, ha minden van icon, akkor a játék döntetlen IF v_win IS INITIAL AND icon1 <> '@5F@' AND icon2 <> '@5F@' AND icon3 <> '@5F@' AND icon4 <> '@5F@' AND icon5 <> '@5F@' AND icon6 <> '@5F@' AND icon7 <> '@5F@' AND icon8 <> '@5F@' AND icon9 <> '@5F@'. v_win = '-'. ENDIF. * Az iménti kiértékelés alapján eldöntjük, hogy ki nyert CASE v_win. * NYERTES WHEN 'X'. IF v_turn IS INITIAL. MESSAGE i398(00) WITH 'AZ ELSO JATEKOS NYERT!'. PERFORM restart_game. ELSE. MESSAGE i398(00) WITH 'A MASODIK JATEKOS NYERT!'. PERFORM restart_game. ENDIF. * DONTETLEN WHEN '-'. MESSAGE i398(00) WITH 'DONTETLEN'. PERFORM restart_game. ENDCASE. ENDFORM." push_button *&---------------------------------------------------------------------* *& Form restart_game *&---------------------------------------------------------------------* * Újra indítja a játékot, minden paraméterhez a kezdőértéket rendeli. *----------------------------------------------------------------------* FORM restart_game . v_turn = 'X'. CLEAR v_win. PERFORM clear_buttons. ENDFORM.