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
- ZTAB_PARALLEL tábla,
- ZSTRUCT_PARALLEL struktúra, és a
- Z_PARALLEL_TEST funkcióelem már készen van.
*&---------------------------------------------------------------------*
*& 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.