NYUGAT-MAGYARORSZÁGI EGYETEM FAIPARI MÉRNÖKI KAR Informatikai és Gazdasági Intézet DIPLOMAFELADAT 1. A diplomadolgozat készít jének neve: Fábián Éva Gazdasági informatika (nappali tagozat) 2. A dolgozat címe: Egyedi fejlesztések egy légitársaság számára az SAP vállalatirányítási rendszerben 3. A konzulens neve: Szitás Zoltán munkahelye: NYME FMK Informatikai és Gazdasági Intézet beosztása: egyetemi tanársegéd Az SAP gyakorlórendszerek tartalmaznak egy elképzelt légitársaság üzemeltetését modellez minta-adatbázist. A feladat ennek a kiegészítése a részletes specifikációnak megfelel en. 4. A diploma feladatai: 1.
Egy menükínálat (ételkínálat) tábla elkészítése és beleintegrálása a meglév modellbe, amely a járatokon választható ételeket tartalmazza. A tábla mez inek támogatniuk kell a többnyelv séget, és a keresést is meg kell valósítani az egyes menük között.
2. Járatonként három lehetséges menü definiálása a specifikációnak megfelel en, illetve statisztikai mutatók definiálása az egyes menükhöz kapcsolódóan. 3. A felhasználók számára egy felület készítése, ahol ételt választhatnak a járatokhoz meghatározott menük közül, valamint a betöltött adatokon alapuló lekérdezések létrehozása. 4. Megfelel fájlstruktúra tervezése, hogy a légitársaságok feltölthessék menüinformációikat, ehhez feltölt program készítése. 5. Beadási határid : 2008. május 5. Sopron, 2007 február 1. Jóváhagyom:
Prof. Dr. Jereb László intézetigazgató Szitás Zoltán konzulens
Prof. Dr. Molnár Sándor DSc. dékán
H-9401 Sopron, Bajcsy-Zs. u. 4. Pf.: 132. Tel: +36 (99) 518-101 Fax: +36 (99) 518-259
NYILATKOZAT Alulírott FÁBIÁN ÉVA (neptun kód: B0K7SY) jelen nyilatkozat aláírásával kijelentem, hogy az EGYEDI FEJLESZTÉSEK EGY LÉGITÁRSASÁG SZÁMÁRA AZ SAP VÁLLALATIRÁNYÍTÁSI RENDSZERBEN cím diplomadolgozat (a továbbiakban: dolgozat) önálló munkám, a dolgozat készítése során betartottam a szerz i jogról szóló 1999. évi LXXVI. tv. szabályait, különösen a hivatkozások és idézések tekintetében. Hivatkozások és idézések szabályai: Az 1999. évi LXXVI. tv. a szerz i jogról 34. § (1) és 36. § (1) els két mondata.) Kijelentem továbbá, hogy a dolgozat készítése során az önálló munka kitétel tekintetében a konzulenst illetve a feladatot kiadó oktatót nem tévesztettem meg. Jelen nyilatkozat aláírásával tudomásul veszem, hogy amennyiben bizonyítható, hogy a dolgozatot nem magam készítettem, vagy a dolgozattal kapcsolatban szerz i jogsértés ténye merül fel, a Nyugat-Magyarországi Egyetem megtagadja a dolgozat befogadását és ellenem fegyelmi eljárást indíthat. A dolgozat befogadásának megtagadása és a fegyelmi eljárás indítása nem érinti a szerz i jogsértés miatti egyéb (polgári jogi, szabálysértési jogi, büntet jogi) jogkövetkezményeket. Sopron, 2008. május 12.
Fábián Éva hallgató
Nyugat – Magyarországi Egyetem Faipari Mérnöki Kar Informatikai és Gazdasági Intézet
Egyedi fejlesztések egy légitársaság számára az SAP vállalatirányítási rendszerben
Témavezet :
A diplomadolgozat készít je:
Bels konzulens:
Szitás Zoltán egyetemi tanársegéd
Küls konzulens:
Füri László SAP/ABAP fejleszt SAP Labs Hungary
Fábián Éva V. évf. okl. gazdasági informatikus hallgató
TARTALOMJEGYZÉK
1
BEVEZETÉS......................................................................................................................... 5
2
IRODALMI ÁTTEKINTÉS ................................................................................................ 7
2.1 2.2 2.3 3
SAP, A VÁLLALATIRÁNYÍTÁSI RENDSZER ........................................................................ 7 A FEJLESZT KÖRNYEZET ............................................................................................... 11 ALAPFOGALMAK .............................................................................................................. 12 SAJÁT MUNKA ................................................................................................................. 15
3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.4 3.4.1 3.4.2 3.4.3 3.4.4
FLIGHT MODELL BEMUTATÁSA..................................................................................... 15 MENÜ TÁBLA..................................................................................................................... 17 TÁBLA MEGTERVEZÉSE................................................................................................... 17 TÁBLA LÉTREHOZÁSA ..................................................................................................... 17 TÖBBNYELV SÉG............................................................................................................ 18 TÁBLA FELTÖLTÉSE ........................................................................................................ 19 KERESÉSI SEGÍTSÉGEK LÉTREHOZÁSA ............................................................................ 20 A MENÜK JÁRATOKHOZ RENDELÉSE .............................................................................. 21 ZFLIGHT_MENU TÁBLA .............................................................................................. 22 EGYEDI BEVITELHEZ TARTOZÓ FELÜLET ........................................................................ 23 CSOPORTOS BEVITEL ...................................................................................................... 32 INFORMÁCIÓK ................................................................................................................. 34 EGYSÉGES FELÜLETRE HOZÁS ........................................................................................ 36 FOGLALÁSI FELÜLET........................................................................................................ 38 A FELÜLET MEGTERVEZÉSE ............................................................................................ 38 ZBOOK_MENU TÁBLA ................................................................................................. 39 A FELÜLET MEGVALÓSÍTÁSA .......................................................................................... 40 A FELÜLET FELHASZNÁLÓI SZEMMEL ............................................................................. 41
4
TOVÁBBFEJLESZTÉSI, MÓDOSÍTÁSI LEHET SÉGEK........................................ 43
5
ÖSSZEFOGLALÁS ........................................................................................................... 45
6
KÖSZÖNETNYILVÁNÍTÁS ............................................................................................ 46
7
IRODALOMJEGYZÉK .................................................................................................... 47
8
FÜGGELÉK........................................................................................................................ 48
4
1 Bevezetés Az elmúlt évtizedekben a számítástechnika dinamikus fejl désének lehettünk tanúi. A hetvenes években még csak egy-egy cég készíttetett magának vállalati szoftvert pénzügyi, logisztikai vagy HR részlegeken, ezzel is csökkentve a költségeket, növelve a hatékonyságot, és a folyamatintegrációt. A nyolcvanas években rájöttek arra, hogy ezek a részlegek elég általánosak ahhoz, hogy akár több cégnek is el lehessen adni ugyanazt a szoftvert. Forradalmian új ötletek és megoldások születtek ebben az id szakban. Lassacskán megjelentek a vállalati szoftverek világában az integrált vállalatirányítási rendszerek, melyek standard szoftvereket kínáltak a különböz iparágak vállalatai számára. Ezek a rendszerek már odági fejl dtek, hogy mára már az össze vállalati folyamatot el tudják végezni ezen rendszerek segítségével. A vállalatoknak szükségük van ezekre a számítógépes rendszerekre, hogy hatékonyabban és eredményesebben tudjanak m ködni, tartani tudják piaci részesedésüket, és hogy folyamatosan fejl dni tudjanak. Ezen rendszerek egyik piacvezet megoldása az SAP vállalatirányítási rendszer. A kilencvenes évek környékén szerezte meg ezt a pozíciót, és azóta is töretlenül tarja helyét a piacon. Sikerének kulcsa, hogy az SAP bevételének 20%-át rendszeresen kutatásra és fejlesztésre fordítja. A bevezetést követ karbantartási, tanácsadói, segítségnyújtási szolgáltatásai révén folyamatos kapcsolatot tart fenn a felhasználókkal. Ilyen módon értesül azonnal a hibákról, és rögtön neki is láthat azok kijavításának. Szoftvereihez rendszeresen ad ki javítócsomagokat, melyek az elmúlt id szak hibáinak javítását, vagy egyszer en a gyakori igények kielégítését szolgálják. Leend gazdasági informatikusként igyekeztem olyan területet találni az informatikán belül, amely a számítástechnika világának gazdasági oldalával foglalkozik. Már tanulmányaim elején tudatosult bennem, hogy a gazdaságot és informatikát legjobban valamilyen vállalatirányítási rendszer megismerésével köthetném össze. Körülbelül egy éve kezdtem el ismerkedni az SAP rendszer felhasználói és fejleszt i oldalával. Tettem ezt tudatosan a diplomaírásra és a jöv mre gondolva, mivel a kés bbikben is ezzel a rendszerrel szeretnék foglalkozni. Diplomafeladatul egy komplett fejlesztési feladat megvalósítását kaptam. A fejlesztési folyamat az adatbázistáblák megtervezését l egészen a felületek kialakításáig terjed. A feladat szoros kapcsolatban áll az SAP rendszer beépített légitársaság modelljével. Az SAP ezt a beépített modellt használja oktatásai során gyakorlópéldák készítésére. A modell megfelel en ki van dolgozva, több tábla összekapcsolásaiból épül fel, a légitársaságok adataitól, az egyes foglalásokig megtalálhatók benne az adatok, helyenként akár több száz adattal is feltöltve.
5
Diplomamunkámban el ször a vállalatirányítási rendszerekr l, azok közül is els sorban az SAP rendszerr l adok áttekintést. Majd a félév során használt fejleszt környezetet és az SAP programozási nyelvét, az ABAP-ot mutatom be. Ezután az ABAP nyelv néhány alapvet programozási kifejezését, és technikáját mutatom be, hogy a fejlesztések leírásához érve az olvasó már valamelyest tájékoztatva legyen a nyelvvel kapcsolatban. Dolgozatom hátralév részében pedig a fejlesztés folyamatát mutatom be a feladat konkrét specifikálásáról kezdve, az általam elképzelt kész rendszer megvalósításáig. Mivel a feladatkiírásom lazán specifikált volt, ezért gyakorlatilag az egész feladatot nekem kellett kitalálnom, hogy milyen módon szeretném megvalósítani. Az egyes felületek konkrét megtervezése is az én feladatom volt, egyedül az adatbázistáblák felépítésére kaptam konkrétabb iránymutatást. A feladatkiírásban a következ k szerepeltek: •
Legyen két adatbázistábla, egy az ételek jellemz inek, egy az ételek járatokhoz rendeléséhez.
•
Meg kell valósítanom egy karbantartási felületet az ételek járatokhoz rendeléséhez.
•
Készítenem kell egy felületet, ahol az utasok ételeket tudnak foglalni.
•
Fájlfeltöltés lehet ségét kell kínálnom a nagyobb repül gép társaságok számára. A feltöltés során ételeket tölthetnek fel fájl segítségével.
•
Különböz lekérdezéseket kell végeznem adatkinyerés céljából az általam készített, és már meglév táblákon.
•
Keresési segítségeket kell készítenem.
Diplomadolgozatom irodalmi áttekintését követ en ezen feladatok konkrét megvalósítási tervét, majd SAP környezetben való megvalósítását mutatom be.
6
2 Irodalmi áttekintés Ebben a fejezetben a munkám során használt rendszert, a fejlesztési nyelvet és környezetet mutatom be. Ezen ismeretek megléte szükséges ahhoz, hogy a feladatom jobban érthet legyen az olvasó közönség számára.
2.1 SAP, a vállalatirányítási rendszer A vállalatirányítási rendszerek els sorban azon vállalatok számára el nyösek, akik integrálni szeretnék a különböz részlegek munkáját, naprakész adatokat kívánnak kinyerni rendszerükb l, illetve jobban akarják kiszolgálni vev iket. Az integrált vállalatirányítási rendszerek legfontosabb jellemz i: - Integráltság: Az integráltság több szempontból is fontos. Az adatokat csak egyszer kell felvinni a rendszerbe, ezáltal csökken a feladat átfutási ideje, és hibalehet sége. Az integráltság azt is jelenti, hogy egy adat módosításakor a kapcsolódó adatok is automatikusan frissülnek. Tehát az alrendszerek szorosan együttm ködnek. Így a különböz területeken dolgozó munkatársak össze tudják hangolni tevékenységüket és döntéseiket [2]. A bevitt adatokat központi adattáblák tartalmazzák, ami biztosítja az adatok konzisztenciáját és valósidej ségét, illetve megteremti annak lehet ségét, hogy minden olyan adat, amire a többi modulnak szüksége van, hozzáférhet legyen akár megtekintés vagy felülírás céljából. - Moduláris felépítés: Az egyes részterületeket lefed szoftvercsomagok elkülöníthet k modulokra (pl. HR, beszerzés), melyek önállóan is képesek m ködni, így lehet ség van a rendszer fokozatos bevezetésére, illetve b vítése. - Felhasználóbarát kezelési mód: a rendszerek programjainak egységes menüfelépítése és képerny -kialakítása van, így a számítástechnikailag kevésbé képzett dolgozók is "betaníthatók”, és a távoli segítségnyújtás is egyszer bb. - Kapcsolódó szolgáltatások: tanácsadás, projekttervezés és megvalósítás, a felhasználók betanítása a rendszer bevezetésekor. - Nemzetköziség: a rendszerek többnyelv ek, minden országban bevezethet k a nemzeti sajátosságok (pl. pénznem, számviteli szabályok) figyelembevételével. A megfelel en kiválasztott vállalatirányítási rendszer már fél siker. A jó rendszer növeli a termelékenységet, segíti az üzleti folyamatokat, szinkronizálja a vállalati m ködés mozzanatait, egyszóval hatékonyabbá teszi a m ködést.
7
Miután a vállalat kiválasztott egy standard vállaltirányítási rendszert, azt a vállalat adottságainak, tulajdonságainak megfelel en „testre kell szabnia”. A testreszabás során meg kell határozni, hogy milyen adatokat, adatszerkezeteket tároljon a rendszer, illetve az üzleti folyamatokat hogyan, miképp kezelje. [3] Az SAP AG jelenleg a világ harmadik legnagyobb szoftvercége, melynek több mint 50 országban van leányvállalata, 1998 óta Magyarországon is. Az SAP megoldásait több mint 120 országban hozzávet leg 30000 vállalat használja, kis- és közép-, nagyvállalatok egyaránt. Szerte a világban 1500 partnercég értékesít SAP licenceket, végzi a rendszerek bevezetését és látja el azok támogatását. Összességében 12 millió felhasználó használ SAP rendszert, mely az üzletviteli megoldások területén kimagasló szám. Az SAP AG 1972-ben alakult Németországban. Az igazi áttörés a vállalat életben 1993-at követ en történt, amikor az R/2 nagyszámítógépes, karakteres felülettel rendelkez rendszert felváltott az R/3 kliens-szerver, grafikus felület vállalatirányítás rendszer. Az SAP sikere folyamatos fejl désének köszönhet , hiszen évente áll el új szolgáltatásokkal és megoldásokkal. Az 1. ábra talán a legalkalmasabb az SAP jelenlegi termékkínálatának ismertetésére.
1. ábra. SAP 2004-es termékkínálata
Az SAP vállalatirányítási megoldásokat kínál kis- közép és nagyvállalatok számára. Az SAP Business Suite az összes olyan SAP-megoldást tartalmazza, amelyek több iparág 8
számára is fontosak. Megtalálhatók benne a szállítói kapcsolatok menedzsment (mySAP SRM), a termék életciklus menedzsment (mySAP PLM), az ellátási lánc menedzsment (mySAP SCM) és az ügyfélkapcsolati menedzsment (mySAPCRM). Ezek olyan átfogó területeket fednek le, melyeknek minden nagyobb vállalat életében fontos szerepet játszanak. A mySAP Financials a pénzügyi és vállalatirányítási könyvelést, illetve a pénzügyi ellátólánc automatizálását szolgálja. A mySAP HR az emberi er forrás menedzsmenthez tartozó tevékenységeket könnyíti meg. A munkavállalók személyes adatinak nyilvántartásán túl a munkaer toborzás, kiválasztás, elbocsátás folyamatát is segíti, illetve az alkalmazott vállalatnál eltöltött ideje alatt a bér- TB- juttatásokkal kapcsolatos ügyeit is kezeli. Vállalati szinten a teljesítmény menedzselésére, illetve a személyzet fejlesztésére is használható. Az adminisztrációs és az irányítási funkcionalitást a Corporat Services, az egyedi gyári ciklusok létrehozást pedig a Operations csomag segíti. Az SAP kis- és középvállalatoknak szánt megoldásait 2002-ben adta ki. Kétféle rendszert készítettek más-más típusú vállalatok számára: •
Az SAP Business One els sorban azoknak a vállalatoknak hasznos, akik kevésbé összetett üzleti folyamatokkal rendelkeznek. A rendszer a számlázás, logisztika, kereskedelem támogatására, üzleti eredmények gyors összegzésére használható. Gyorsan bevezethet és könnyen elsajátítható megoldás.
•
Az SAP All-in-One-t olyan kis- és középvállalatok számára készült, melyek tevékenysége iparág-specifikus. A SAP All-in-One rendszerének tizenegy változata van, az átlagosnál több egyedi folyamatot tartalmaz, valamint a minden iparág számára fontos folyamatok menedzselésére szolgáló termék életciklus menedzsmentet, ügyfélkapcsolati menedzsmentet, ellátási lánc menedzsmentet és a szállítói kapcsolatok megfelel kialakítását segít menedzsmentet tartalmazza [5 - SAPINFO].
Az SAP 2002-ben mutatta be a NetWeaver integrációs platformot, amely ezt követ en az összes üzleti megoldásának alapja lett. A NetWeaver alapját SAP Web Application Server alkotja, mely ABAP futtatása mellett már .NET és J2EE alapú programok futtatására is alkalmas. [1] A jelenlegi kínálat mellett azonban nem szabad megfeledkeznünk a kilencvenes évekig érvényes „SAP szimbólumról”, az úgy nevezett gyémántdiagramról sem, amely a 2. ábrán látható.
9
2. ábra. SAP moduláris felépítése
Ez a gyémántdiagram négy nagy csoportra osztva tartalmazza a modulokat: •
Logisztikai modulok: logisztikai folyamatok kezelését segíti. Megtalálható benne az értékesítés modul (SD), amely a rendelésfelvétellel, kiszállítással, számlázással kapcsolatos tevékenységeket támogatja. A beszerzés, készletgazdálkodás, számlaellen rzés, anyag-bevételezés szervezése és lebonyolításának támogatatására az anyaggazdálkodás (MM) modul használható. A logisztikai csoport további, talán kevésbé elterjedt moduljai a termeléstervezés (PP), a min ség ellen rzés (QM), valamint a karbantartás (PM) modulok.
•
Emberi er forrás: munkaer funkciók segítése.
•
Számviteli, pénzügyi modulok: feladata az üzleti tranzakciók pénzügyi folyamatainak kezelése. A csoport legnépszer bb modulja a pénzügy modul (FI) valószín leg azért, mert a könyvelés és számvitel terén van szükség a legkevesebb testreszabásra, törvények alapján m ködik, és persze a könyvelés az a terület, ami minden vállalat számára kihagyhatatlan tevékenység. A pénzügyi modulok közé tartozik még a vállalat bels könyveléséért, költséggazdálkodásáért felel s kontrolling (CO) modul, valamint az eszközgazdálkodás (AM) és a projekttervezés (PS).
gazdálkodással kapcsolatos adminisztratív
10
Ezen modulok közül a legnépszer bbek az értékesítési, anyaggazdálkodási, emberi er forrás, pénzügy és kontrolling modulok. •
Átfogó alkalmazások: A negyedik kis csoportba sorolták átfogó alkalmazásként a workflow-kat, és az ágazati megoldásokat. Ezt az utóbbi kett t ma már szétválasztották. Úgynevezett CA alkalmazásokként emlegetik azokat a funkciókat, amelyek nem kapcsolódnak közvetlenül a rendszer egy kitüntetett részéhez sem. Ezek általános célú komponensek, alkalmazások, eszközök, melyek egymástól függetlenek, bármely funkcionális alkalmazás modullal kapcsolatban felhasználhatók. Ilyenek a már akkor is ismert workflow mellett az adatarchiválás az SAP Business Workplace, amely a vállalati bels és küls kommunikációt segít rendszer. Persze ezeken kívül is még sok olyan megoldás, integráció van más rendszerekkel, melyek nagyban segítik a vállalati szoftverek összekapcsolását. Az iparág specifikus szoftverek készítése pedig olyannyira kin tte magát, hogy ma már 27-nél is több ilyen megoldás létezik az olajipartól kezdve a közszféráig.
2.2 A Fejleszt környezet A feladatot egy demo rendszerben kezdtem el, amely a http://www.sdn.sap.comról ingyenesen letölthet . A rendszer neve SAP Netweaver 7.0 ABAP Trial Version. A demo rendszer helyigénye elég nagy, 22 gigabyte-ra volt szükségem a rendszer m ködtetéséhez. A rendszer telepítése során különböz problémákba is ütköztem, mire végül sikerült telepíteni a rendszert. A telepítés során felkerül a számítógépre egy SAP GUI, vagyis a grafikus felület, egy Web Application Server, és egy MaxDB, amely a beépített táblákat tartalmazza. A táblák, többnyelv ség és keresési segítségek elkészítését meg tudtam ebben a rendszerbe oldani, de a felületeknél problémába ütköztem, amire sajnos nem találtam megoldást, így a feladat további részét a Magyar Cukor Rt.-nél lév rendszerben, majd pedig az ELTE Informatikai Igazgatóságán lév IDES rendszerben készítettem el. A fejlesztések során az ABAP nyelvet [4] kellett használnom, amely az SAP saját nyelve. Az SAP a kezdetek óta ezt a nyelvet használja, bár többször átdolgozta. Az elején csak listák el állítására használták, majd üzleti alkalmazásokat is fejlesztettek vele, majd már szinte minden alkalmazást ABAP-ban írtak. Objektum-orientált változata is megjelent. Egy programon belül keverhetjük az objektum-orientált és a hagyományos programozási módszereket. Munkám során egyedül a listák megjelenítésénél használtam az objektum-orientált módszereket. A SAP a webes megoldások megjelenéséhez az ABAP mellett a Java-t is elkezdte használni, de csak a webes felületek készítéséhez, a többi alkalmazást még mindig 11
ABAP-ban fejlesztik. A nyelv több szempontból is el nyös. Adabázis-kezel t l független, Open SQL-t használ, operációs rendszert l független, bels táblákat használ a nagy mennyiség adatok kezelésére. Az ABAP nyelv saját integrált fejleszt eszköze az ABAP Workbench, amely minden SAP szoftver része. Ahogy az egész SAP rendszer, úgy a fejleszt eszköz is integrált, mivel az ABAP kódban duplán kattintva például a tábla nevére, rögtön megkaphatjuk a tábla felépítését, attribútumainak nevét, és tulajdonságait. Az ABAP Workbenchet az úgynevezett Object Navigatorból érhetjük el. A kód megírása során én is ezt a felületet használtam a programok elkészítéséhez.
2.3 Alapfogalmak Ebben a fejezetben néhány ABAP fejlesztésbeli alapfogalmat szeretnék ismertetni, hogy a fejlesztések leírása során használt fogalmak érthet k legyenek az olvasó számára. Az SAP rendszerben legtöbbször adatokat jelenítünk meg. Ezeket listák segítségével tudjuk megtenni. Kétféle listatípus van, amire használok a feladataim során. Kinézetre és megvalósításra is egyszer bb write-os lista, amely abból áll, hogy az egyes adatbázis lekérdezéseket követ en egyszer en kiíratjuk sorokban egymás alatt az adatokat. Amint 3. ábráról is látszik, a write-os listát is lehet formázni, színezni, fejlécet készíteni hozzá.
3. ábra. Write-os lista
A write-os listánál azonban sokkal elegánsabb megoldás a 4. ábrán látható ALV lista, amely a 3. ábrán látható adatokból készült, csak a két lista megjelenítése más.
4. ábra. ALV lista
12
A lista felett láthatunk ikonokat. Ezek közül néhány már a lista generálásakor automatikusan m köd képessé válik. Ilyenek a növekv illetve csökken sorbarendezések, ha a lista egy oszlopát kijelöljük. Sz r t alkalmazhatunk a listára, és így tovább. A listáknak ezen kívül rengeteg beállítási lehet sége van. Be lehet állítani, hogy a lista egy sorára duplán kattintva jelenjen meg az adott sorhoz tartozó részletesebb lista, bár ez a write-os listánál is m ködik. A feladatok elkészítése során mindegyik listánál törekedtem arra, hogy legyen benne valami egyedi. Egyikben a sorokat színeztem bizonyos feltétel teljesülése esetén, a write-os és az ALV listánál is megvalósítottam, hogy dupla kattintással érhessük el a következ felületet, egy másikban pedig a sor elején lév kis gombbal lehet kijelölni a sort, majd gombok segítségével lehet elérni a következ felületet. Ezeket a listákat létrehozhatjuk az aktuális képerny re, de külön képerny t is létrehozhatunk, úgynevezett dynpro-kat. A dynpron rádiógombokat, feliratokat, nyomógombokat, vagy akár listákat jeleníthetünk meg. A programban aztán eseményekhez rendelhetjük ezeket az dynprokat. A képerny k elkészítésére külön Screen Painter áll rendelkezésünkre, ahol kívánságunktól függ en grafikus vagy karakteres felületen készíthetjük el a kívánt képerny t. Ha eseményeket szeretnénk a képerny egyes elemeihez rendelni, akkor azokhoz funkciós kódot kell megadni, amelyet majd kés bb a PAI-ban le fogunk kezelni. A képerny khöz két fontos folyamat tartozik: •
PBO (Process Before Output): Itt kell megírnunk azokat a modulokat, amelyet a képerny kirajzolása el tt szeretnénk lefuttatni. Ilyenek lehetnek paraméter átadások, ellen rzések, ha a képerny n ALV lista van, akkor a lista kirajzolása. Minden képerny höz készíthetünk külön címet, amely a képerny kirajzolásakor megjelenik, illetve külön STATUS-t, amelyben az eszköztár ikonjait állíthatjuk be aktívra, és kés bb ezekhez az ikonokhoz tartozó eseményeket is lekezelhetjük a programban.
•
PAI (Process After Input): Ehhez a folyamathoz kell definiálnunk olyan modulokat, melyek a képerny t ért küls hatás után futnak le. Ilyenek például egy nyomógomb megnyomása, sor kijelölése. Ezeket az eseményeket hagyományosan a USER-COMMAND modulban kezeljük le.
Szinte minden program egy szelekciós képerny vel kezd dik. Ez nem igazi képerny abból a szempontból, hogy nem a Screen Painter segítségével készül, és nincsenek automatikusan lefutó PBO és PAI folyamatok hozzárendelve. Ezen a képerny n általában csak beviteli mez k vannak, és arra használják, hogy a többnyire elég sok adatot tartalmazó adatbázistáblát, amivel dolgozni kell a program során, lesz kítsék egy kisebb bels táblára (A bels tábláról ezen fejezet végén olvashat.). Ez a felhasználók
13
munkáját is segíti, mivel ténylegesen csak a számukra hasznos adatokról kapnak egy listát[6]. Az Object Navigator intelligensen kezeli a program felépítését. Külön mappákba teszi az egy egységbe tartozó részeket, amelyre duplán kattintva, az adott rész kódjához ugrik, ezzel is könnyítve az eligazodást a programunkban. A programban alprogramokat (FORM-okat) hozhatunk létre, hogy átláthatóbb legyen a kódunk. Ezeket az alprogramokat írhatjuk külön fájlba, de az adott programba is. Én a programba helyeztem el az alprogramokat, ilyenkor a kézzel írt kódot követ en helyezi el ezeket az alprogramokat sorban. Még egy fontosabb dolog van, ami meg kell említenem. Ez a bels táblák, és a munkaterületek (inkább használatos a work-area megnevezés) fogalma. Az ABAP-ban az adatbázistáblákat csak a végs esetben módosítjuk, a program során bels táblákkal dolgozunk. Ezek a bels táblák az eredeti adatbázistábla másolatai gyakorlatilag. Tehát a program elején mindig készítünk egy bels táblát az adott adatbázistábláról. Ezt követ en ezen a bels táblán hajtjuk végre a változtatásokat, majd ha úgy érezzük, hogy megfelel kódot írunk, akkor írjuk felül a bels táblánk tartalmával az eredeti adatbázistáblát. Bels táblát hozhatunk létre header line-nal vagy anélkül. A kett között az a különbség, hogy ha header line-nal hozzuk létre, akkor amikor végignézzük a tábla tartalmát, akkor az aktuális sort mindig a header line-ban tárolja, így tudjuk azt vizsgálni. A work-area-t lehet bels táblaként és struktúraként is használni. Leggyakrabban azonban a header line nélküli bels tábla egy adott sorát tudjuk azonosítani vele. Mostanában el szeretettel alkalmazzák ezt az utóbbi fejsor nélküli megoldást. Ebben a esetben ha loopolunk1 a táblán, akkor az aktuális sort mindig a struktúrába másoljuk, és így érhetjük el a loop-on belül[7]. Hogy a feladatok könnyebben többnyelv síthet k üzenetosztályt használtam a feladatok során az információs és hibaüzenetek kiíratására. Ebben az esetben nem a kódban vannak az egyes üzenetek, hanem egy külön felületen írhatjuk be ket, majd a szövegben az üzenet számával hivatkozhatunk rá, és megmondhatjuk, hogy mi legyen az üzenet típusa. A MESSAGE e001. pl. az üzenetosztály els számú sorára vonatkozik, és a típusa hibaüzenet.
1
A loop olyan az SAP-ban, mint a for ciklus a többi nyelvben. Segítségével végig tudunk menni egy tábla sorain, és azokon m veleteket végezhetünk, kiírathatjuk és így tovább.
14
3 Saját munka Ezen fejezet tartalmazza a féléves munkám dokumentálását. A félév elején egy irányadó specifikációt kaptam a megoldandó feladatról. Az, hogy hogyan oldom meg a feladatot, teljesen rám volt bízva. A bevezetés végén említett feladatokból a következ megvalósítás született. •
Készítettem három adatbázistáblát: egyet az ételek nyilvántartásához, egyet az ételek járatokhoz rendeléséhez, és egyet a már meglév foglalásokhoz tartozó ételfoglaláshoz.
•
Összesen két különálló felületet készítettem. Az egyiken lehet a már meglév járatfoglalásokhoz ételeket lefoglalni. A másik felületen az összes többi kiírt feladat megvalósítása megtalálható. A kezd képerny n választhatunk, hogy a kiválasztott légitársasághoz egyedileg, vagy csoportosan akarunk felvinni adatokat. Az egyedi felvitel a zflight_menu tábla karbantartási felületének felel meg, a csoportos pedig a fájlfeltöltésnek. Ugyanezen kezd képerny n lehet a légitársaság kiválasztása után az ’Információk’ gomb alatt a különböz lekérdezések eredményeit megtekinteni.
A fejezet további részében a rendszerbe beépített FLIGHT modell táblákat ismertetem, melyek használata elengedhetetlen volt a feladat elvégzéséhez. Sok esetben használtam fel adatokat feladatomban ezekb l a táblákból. A modell bemutatása után a fejlesztés egyes részeit mutatom be kisebb részegységekre tagolva. A fejlesztések leírása során el ször a feladat elkészítésének tervezését írom le, majd a tényleges megvalósítást, ezt követ en pedig egy felhasználó útmutató során bemutatom képekben az elkészült felületet.
3.1 FLIGHT modell bemutatása A FLIGHT modell egy repül gép társaság adatbázistábláit tartalmazza adatokkal felöltve. Az SAP a saját példáinak bemutatására használja ezt az adatbázist. A modell összesen tíz táblát tartalmaz a társaság különböz járatainak nyilvántartásán túl az utasok és azok járatfoglalási információjának eltárolásig. A feladatom elvégzéséhez nincs szükségem a modell összes táblájára. Az 5. ábra a fontosabb táblákat, és azok összekapcsolását végz kulcsokat tartalmazza.
15
5. ábra. FLIGHT modell fontosabb tábláinak kapcsolatai
A három f tábla az SPFLI, SFLIGHT, és az SBOOK. • Az SPFLI tábla a járatterv. Minden egyes járatról tartalmazza az összes információt. Ilyen információk például a járat indulási és érkezési országa, városa, reptere, az út hossza, id tartama, és a járat közlekedési gyakorisága. •
Az SFLIGHT tábla az egyes járatról tartalmaz konkrét információkat. Tárolja, hogy mennyi az üres hely az egyes járatokon osztályonként, eddig mennyi bevétel van a foglalásokból, mennyibe kerül egy repül jegy a járatra, és pontosan mi a repülés dátuma.
•
Az SBOOK tábla a járatok foglalásait tartalmazza. Tárolva vannak az adott foglalás tulajdonságai, hogy dohányzó helyet kért-e a foglaló, melyik osztályra foglalt helyet, kért-e számlát, és így tovább.
A három tábla összekapcsolását mutatja a 6. ábra. Eszerint az SPFLI tálba minden egyes sorához több SFLIGHT tábla sor tartozik, és hozzá is több SBOOK tábla. Gondoljuk csak végig, hiszen egy járat több id pontban is indul, és egy járatra több utas jelentkezik.
16
6. ábra. SPFLI, SFLIGHT, SBOOK hierarchiája
Diplomamunkám elvégzéséhez meg kellett ismernem az FLIGHT modell ezen tábláival, mivel a feladatok elvégzéséhez a standard táblák adatait is használnom kellett. Ezen rövid áttekintés a FLIGHT modellr l, egy kis adalék ahhoz, hogy az egyes feladatok megvalósításánál, érthet ek legyenek az utalások a meglév táblák használatára.
3.2 Menü tábla A feladat az volt, hogy készítsek egy táblát, amely az egyes járatokhoz rendelhet ételeket tartalmazza, illetve az ételek egyes jellemz it, azok közül is az étel megnevezése legyen nyelvfüggetlen.
3.2.1 Tábla megtervezése A tábla megtervezéséhez a specifikáció tartalmazta az egyes tulajdonságokat, amelyeket az ételekr l nyilván kell tartanom, hogy a kés bbi feladatokat meg tudjuk oldani. A tulajdonságok alapján könny volt meghatározni az adattípusokat, és az esetleges domain-eket. Az étel megnevezésének nyelvfüggetlensége igényelt nagyobb utánanézést. A megoldás azonban itt sem volt bonyolult, ugyanis kiderült, hogy az SAP a többnyelv ségre elég jól fel van készülve. Külön szövegtábla típusú tábla létezik, amely szabványszer en az ID-t, nyelvet, és a szöveget tartlmazza. Ezt a szövegtáblát az eredetihez kapcsolva egyszer en megoldható a többnyelv ség.
3.2.2 Tábla létrehozása A tábla felépítéséhez a specifikáció iránymutató volt, mivel tartalmazta felsorolásként tartalmazta azokat a mez ket, amelyekre a feladatok megoldásához várhatóan szükség lesz. Ennek megfelel en a tábla felépítése a 7. ábra szerinti lett.
17
7. ábra. ZMENU tábla felépítése
A tábla létrehozása el tt az egyes mez köz adatelemeket készítettem. Azért hasznos ezek készítése, mert a többi táblához is felhasználhatjuk a már elkészített típusokat. Illetve, ha létezik az adatelemünk, akkor a tábla készítésekor egyszer en csak megadjuk az adatelemet, és az adattípus, és az egyéb adatokat a rendszer magától kitölti. Az MEALTYPE és a MEALCLASS attribútumokhoz domain-t is készítettem, mivel domain létrehozása esetén értéktartományokat is megadhatunk. Így az étel típusokhoz értéktartománynak beállítottam a VE – vegetáriánus, SZ – szárnyas, MA marha, SE – sertés, HA – hal értékeket. Az ételek osztályához pedig az E, mint els osztályt, és a T, mint turista osztályt. Ha grafikus felületen olyan beviteli mez ket készítünk, melyek domainnal rendelkeznek, és értéktartomány is van megadva hozzájuk, akkor keresési segítség létrehozása nélkül is automatikusan megjelennek az alapértékek, mint keresési segítések. A pénz kezelésére külön típus van az SAP-ban. El ször is a pénz attribútumát CURR típusúra kell állítani. Létre kell hozni egy pénznem mez t is, melynek szintén el re gyártott típusa van, ez a CUKY. Miután ezt is létrehoztuk, a pénz attribútumához be kell állítni referenciatáblaként a pénznem attribútumot, ezáltal, ha változtatjuk a pénznemet, akkor a pénz mez ben az érték is változni fog. Az SAP-ban minden tábla els attribútumának a mandantnak2 kell lenni. A mandanton kívül a tábla egyetlen kulcsa a MEALID, amely az ételt egyértelm en azonosítja.
3.2.3 Többnyelv ség A specifikáció szerint a menü tábla jellemz i közül az étel megnevezését nyelvfüggetlenül kell tárolnunk az adatbázisban. Az SAP-ban erre olyan megoldás van, hogy ilyenkor az alaptáblához egy szövegtáblát kell létrehozni. Ezen szövegtábla tartalmazza az étel megnevezését, a 2
Mandantnak nevezzük az SAP-szoftveren belüli szervezeti egységek azonosítóját.
18
nyelvet, és az étel azonosítóját. Ezt a táblát a rendszer maga tölti fel. Tehát amikor mi töltjük ki a menü tábla adatait, akkor úgy látjuk, mintha az étel megnevezése is a menü tábla attribútuma lenne, de valójában egy másik táblában szerepel. Tehát mondjuk magyar nyelven vagyunk bejelentkezve a rendszerbe, és megadjuk az adott menü azonosítóhoz a tábla megnevezését, akkor a rendszer feltölti a szövegtábla egy sorát a kapott információkkal: A menü azonosítóhoz az azonosítót, a nyelvhez a bejelentkezés nyelvét, amelyet a SY-LANGU változóban tárol, a szöveghez pedig a megadott menü elnevezést. A 8. ábra a ZMENU szövegtábla felépítését tartalmazza.
8. ábra. ZMENU szövegtáblája
A szövegtábla kulcsai a szokásos mandanton kívül a menüazonosító, és s nyelvet beazonosító LANG mez . A szövegtáblát a menü táblával a menü azonosító attribútum segítségével kapcsoljuk össze. A küls kulcs létrehozását is elvégezhetjük grafikus felületen.
3.2.4 Tábla feltöltése A tábla adatokkal való feltöltését karbantartási nézeten keresztül oldottam meg. Ezen nézet segítségével a táblázat adatait grafikus felületen keresztül vihettem fel az adatbázistáblába, és még programozni sem kellett, mivel ez az SAP beépített része, csak néhány beállításra volt szükség. Tábla-karbantartási nézethez el ször készítenünk kell egy funkciós csoportot. Erre azért van szükség, mert az SAP ebbe a funkciós csoportba generálja le a karbantartási nézetünk forráskódját. Ezután ugyanott, ahol a táblát létrehoztuk, be tudjuk állítni, hogy milyen karbantartási nézetet szeretnénk. Akár jogosultságokat is beállíthatunk, hogy ki tarthatja karban a táblánkat. Ezt követ en egy másik tranzakcióban tudjuk feltölteni a táblánkat. A karbantartási nézet a többnyelv séget is támogatja azáltal, hogy a szövegtáblában lév oszlopot mindig beszúrja a ZMENU tábla feltöltend sorai közé, és ha egy másik nyelven jelentkezünk be a rendszerbe, és azon a nyelven próbáljuk meg feltölteni a táblát, akkor csak ezt az egy többnyelv oszlopot tölteti ki velünk, így az többnyelv lesz. A feltöltött tábla a 9. ábrán látható.
19
9. ábra. ZMENU tábla adatokkal
3.2.5 Keresési segítségek létrehozása Az egyes felületekhez szükségünk lesz majd keresési segítségre. Ha egy mez höz tartozik keresési segítség, akkor a mez jobb sarkában a jel látszik. Erre kattintva segítséget kapunk, hogy melyek azok az értékek, amelyek az adott beviteli mez be írhatók. Feladatomhoz több keresési segítséget is létrehoztam. Létrehozásuk menete hasonló, ezért csak egy ilyen segítség létrehozását mutatom be.
10. ábra. Vegetáriánus ételek keresési segítsége
A 10. ábrán látható beállításokat kell elvégeznünk. Tehát be kell állítanunk a táblát, azután a paramétereknél meg kell adnunk azokat a paramétereket, amelyeket meg szeretnénk jeleníteni a keresési segítségben. A képen látható paraméter beállítások azt jelentik, hogy mi jel megnyomásakor az ételek neveit, árát, és a pénznemet látjuk. A beviteli mez ben eltárolva viszont a mez azonosító lesz, ha kiválasztottuk a keresési listából a kívánt ételt. Az étel típus nem bemeneti, és nem kimeneti paraméter. A típus azért szerepel a paraméterek között, mert itt adjuk meg, hogy mi csak a vegetáriánus ételeket (’VE’) akarjuk megjeleníteni a listában az adatbázis adatai közül. Miután elkészítettem az összes keresési segítséget (els osztályú ételek, másod osztályú ételek,
20
vegetáriánus ételek, összes étel), ezeket beállíthatom majd a felületek elkészítésénél az egyes beviteli mez khöz. Az elkészített keresési segítség tesztje a 11. ábrán látható.
11. ábra. Vegetáriánus étel keresési segítségének tesztje
3.3 A menük járatokhoz rendelése Amint már a fejezet elején is említettem a következ ket valósítottam meg ezen a felületen: • • •
Adatbázis kezelési felület készítése olvasási, létrehozási, módosítási, és törlési hozzáféréssel. Lehet ség arra, hogy légitársaságok fájlból tölthessék fel az egyes járatokhoz tartozó menüket. Különböz menüinformációk az egyes járatokról pl. szabad helyek száma els - illetve másodosztályon, összes illetve típus szerinti étel darabszám az adott járaton és így tovább.
Mivel a specifikációhoz nem volt szigorú, próbáltam a feladatot úgy megvalósítani, hogy többféle programozási megoldás is szerepeljen benne. Így készítettem ALV listát, többszint úgynevezett write-os listát, gombokat helyeztem el a képerny különböz részterületeire. Mivel ez egy összetettebb felület, ezért leírás szempontjából is több részre bontom. El ször a felület alapját képez ZFLIGHT_MENU tábla létrehozását mutatom be, majd az egyedi felvitel elkészítését és a csoportos bevitelét, ezután az ’Információk’ gombhoz tartozó felületet, és végül az el z eket egy kezd képerny n való megjelenítését.
21
3.3.1 ZFLIGHT_MENU tábla Ez a tábla fogja tartalmazni a járatokhoz rendelt ételeket. Az ételek azonosítóit a korábban elkészített ZMENU táblából vesszük, de a táblának kapcsolata lesz az SPFLI táblával is a járatok beazonosíthatósága miatt. 3.3.1.1 Tábla megtervezése A specifikációnak megfelel en minden egyes járathoz négy darab menüt rendeltem. Egy els osztályú menüt, egy másodosztályút, egy vegetáriánust és egy szabadon választottat. A járathoz tartozó menüt egyértelm en meghatározza a légitársaság neve, és a járat száma. Tehát az egyes járatok nem minden indulásához rendeltem külön menüket, hanem járatonként mindig ugyanazok a menük vannak rendelve. Bár hozzárendelt menü, a felületek segítségével természetesen módosítható. A járathoz tartozó menüknek csak az azonosítóját tároltam el, az egyéb információkat a járathoz tartozó ételekr l a ZMENU táblából veszem. 3.3.1.2 Tábla létrehozása A ZFLIGHT_MENU tábla létrehozásához nem volt szükségünk új adattípusok, vagy domain-ek létrehozására, mivel azok már léteznek. A beépített típusokon kívül csak a mealid típusát használtam, ezt állítottam be az összes ételtípushoz. A tábla szerkezete a 12. ábrán látható.
12. ábra. ZFIGHT_MENU tábla felépítése
A táblát a járatszám, és a légitársaság kódja mez k esetén az SPFLI táblával, az étel azonosítók esetén pedig a ZMENU táblával kellett összekapcsolni. A tábla néhány adattal feltöltve a 13. ábrán látható.
22
13. ábra. ZFLIGHT_MENU tábla adatokkal
3.3.2 Egyedi bevitelhez tartozó felület Ez a felület a karbantartóknak, vagy olyan légitársaságoknak készült, melyek adott járatokhoz tartozó ételeket akarnak kezelni. 3.3.2.1 A felület megtervezése
14. ábra. Egyedi bevitel programrész folyamatábrája
23
A 14. ábrán látható folyamatábra mutatja az egyedi felület meghívásától a lehetséges események bekövetkezését a programban. Amint a folyamatábrából is láthatjuk, az egyedi bevitelhez el ször meg kell adnunk a légitársaság kódját, amelynek valamelyik járatához tartozó ételeket szeretnénk kezelni, ezt nevezzük szelekciós képerny nek. A légitársaság megadása után egy képerny hívódik meg, amely egy ALV listát és négy gombot tartalmaz. A képerny eszköztárában lév alapvet funkcióbillenty k aktiváláshoz státuszt kell létrehozni, cím megadásához pedig címet. A képerny PBO folyamatában tehát a státusz, cím, és az ALV lista megjelenítése zajlik. A képerny PAI folyamatában a USER COMMAND modul megírása történik. Ezen belül vizsgáljuk, hogy felhasználó jelölt-e ki sort az ALV listából, ha nem, akkor megkérjük rá, hogy tegye meg, ha igen, akkor a megnyomott gomb eseményeinek lekezelése kell, hogy következzen. Az egyes gombok lenyomásakor el ször azt vizsgálom, hogy gombtípustól függ en létezik-e már az étel, vagy sem. Létrehozás esetén, ha már létezik, akkor nem hozhat újra létre, csak módosíthat, törölhet, vagy megjeleníthet, ha nem létezik még étel a járathoz rendelve, akkor pedig csak létrehozhat, a többi gombot csak ezután használhatja. Ha ezen a ponton túljutottunk, akkor egy újabb képerny re érkezünk, ahol rádiógombbal választhatunk az egyes menük közül. Minden gombhoz ugyanazt a képerny t jelenítjük meg, csak különböz képp van paraméterezve. A légitársaság neve és a járatszám mind a négy nyomógomb esetén fixen van megadva, beviteli mez ként van létrehozva, csak a paraméterezésnél inaktívra van állítva. A fix érték azt az értéket tartalmazza, amelyik sorra rákattintottunk. Ezenkívül mindegyik képerny n szerepel a négy ételnév. Itt a beviteli mez kben az ételek kódjának megadásnál, keresési segítséggel tudunk választani, ahol a kiválasztás után enter-t nyomva szövegesen is megjelenik az étel neve. Ezeknek a beviteli mez nek az állapot is attól függ, hogy melyik felületen vagyunk. A következ táblázat tartalmazza az egyes mez k aktív vagy inaktív állapotát. Az 1. táblázatból is látszik, hogy létrehozás és módosítás esetén aktívak a beviteli mez ink, a máik két esetben inaktívak, tehát nem módosíthatók. Az els három felületnél van mentés gomb, a megjelenítés felületnél ez el van rejtve. Esetek Állapotok
Létrehozás aktív
Módosítás aktív
Törlés inaktív
Megjelenítés inaktív
1. táblázat. Beviteli mez k állapota az egyes gomboknál
Miután kiválasztottuk a menüket, a mentés gombra kattintva a képerny t l függ en szintén más-más esemény fut le. Létrehozásánál felvesszük a táblába az adatokat, módosítás esetén módosítjuk, törlés esetén pedig töröljük az adatbázistáblából a megadott adatokat. Ha sikerült, akkor a program információs ablakot küld, hogy sikeres volt a m velet, és visszaugrik az el z ALV listás képerny re.
24
3.3.2.2 A felület megvalósítása A felület egy dynpro, amely a 100-as azonosítót viseli. A képerny létrehozásához a Screen Painter-ben létrehoztam egy Custom control-t az ALV lista megjelenítéséhez ALV_CONTAINER néven, illetve létrehoztam 4 gombot. A létrehozás gombhoz a CREATE, a módosítás gombhoz a MODIFY, törlés gombhoz a DELETE, megjelenítéshez a READ funkciós kódot rendeltem. Végül egy ok_code változót hoztam létre, ez a változó fogja tartalmazni az aktuális funkciós kódot, annak megfelel en, hogy a felhasználó melyik elemre kattintott. Ezután a képerny höz STATUS-t hoztam létre ’STATUS_0100’ néven. A lehetséges ikon közül csak az alapikonokhoz adtam hozzá funkciós kódot, melyet a 2. táblázat tartalmaz. Funkcióbillenty
Funkciós kód
BACK END CANCEL 2. táblázat. Funkcióbillenty khöz rendelt kódok
A képerny khöz címet lehet rendelni, amely ebben a képen a ’Járatok megjelenítése’. Ezen két tulajdonságát a képerny nek a PBO-ban kell beállítani, és a következ kód segítségével meg is tehet : MODULE status_0100 OUTPUT. SET PF-STATUS 'STATUS_0100'. SET TITLEBAR 'TITLE_0100'.
Ezután ugyanitt a státuszon belül el kell végezni az ALV container létrehozását majd a lista kirajzolását is. Az ALV listák készítésére kész formák vannak, nekünk csak ezeket kell átalakítani a változóneveinknek megfelel en. Munkám során két ilyen formát is használtam, egyik a régi típusú forma, másik az új, nagyrészt objektumorientált megoldás. Ebben a feladatrészben az utóbbit alkalmaztam. Mindenekel tt létre kell hoznunk egy - már az alapfogalmaknál is említett – bels táblát. A lista kiíratásakor ezt a bels táblát fogjuk kiíratni, tehát a listának tartalmazni kell azokat az attribútumokat, amelyeket a listában meg akarunk jeleníteni, mint listaoszlopokat. Az ALV lista adatait a már létez SPFLI táblából vesszük, amely az egyes járatokról tartalmaz információt. A lista kirajzolása úgy zajlik, hogy ha még nem létezik konténer, akkor létrehozzuk, fontos, hogy a létrehozáskor a képerny n megadott konténernevet adjuk meg. Mez katalógust is hozhatunk létre, melynek segítségével az oszlopok 25
tulajdonságait állíthatjuk be. A konténeren belül az ALV Grid tartalmazza a listát, amit megjelenítünk. A lista paramétereinek beállításai után a meghívjuk az ALV lista kirajzolását végz SET_TABLE_FO_FIRST_DISPLAY beépített függvényt. A függvény paramétereként meg kell adnunk többek között a struktúrát is, amibe el z leg feltöltöttünk adatokkal. Ezután azt kellett leprogramozni, hogy mi történjen, ha a felhasználó kiválaszt egy sort, és rákattint valamelyik gombra. Ezt a PAI user command moduljában ajánlatos megtenni. A következ forráskód a user commandot tartalmazza, de csak a létrehozás gombra kattintva, a többi gombnál ugyanezt kell írni, ezért ezt nem tartottam szükségesnek, hogy a dokumentációban helyet foglaljon. MODULE user_command_0100 INPUT. CLEAR check_kell. CLEAR wa_itab. CASE ok_code. WHEN 'BACK'. LEAVE TO SCREEN 0. WHEN 'END'. LEAVE TO SCREEN 0. WHEN 'CANCEL'. LEAVE TO SCREEN 0. WHEN 'CREATE'. screen_type = 'CREATE'. CALL METHOD g_grid->get_selected_rows IMPORTING et_index_rows = g_index_sorok. DESCRIBE TABLE g_index_sorok LINES g_db. IF g_db = 0. MESSAGE i000. ELSE. LOOP AT g_index_sorok INTO g_index_sor. ENDLOOP. READ TABLE g_t_itab INDEX g_index_sor-index INTO wa_g_t_itab. check_kell = '1'. ENDIF. ENDCASE. IF check_kell = '1'. PERFORM check_event. ENDIF. ENDMODULE.
Nézzük sorban, hogy mit is csinálunk. Sorban vizsgáljuk az ok_code lehetséges értékeit. Az els három a már említett funkcióbillenty höz tartozó funkciós kód. Ezek mindegyike esetén az el z oldalra akarunk visszalépni, ezt tesszük meg a „LEAVE TO SCREEN 0.” kóddal. Ezután vizsgáljuk, hogy a nyomógombjaink valamelyikét nyomta-e meg a felhasználó. Itt el ször is beállítunk egy változót a nyomógomb funkciós kódja alapján, erre azért lesz szükség, mert ugyanazt az dynpno-t fogjuk meghívni mindegyik nyomógomb megnyomása esetén, csak a dynpro-n található mez k aktivitásában lesz különbség. Tehát miután ezt eltároltuk, a GET_SELECET_ROWS szintén beépített függvény lekérdezhetjük az ALV aktuálisan kiválasztott sorait. Ezután a DESTRIBE
26
TABLE paranccsal megnézzük, hogy van-e kiválasztva sor, ha nincs, akkor kiírjuk, hogy válasszon ki egy sort. Ha választott ki sort, akkor ugye megvan a kiválasztott sor indexe, és a g_t_itab bels táblából a megfelel index sort a wa_g_t_itab struktúrába tudjuk másolni, majd a check_kell változót 1-re állítjuk. Ezen változó értékét l függ en hívódik meg a CHECK_EVENT alprogram. A CHECK_EVENT alprogramban vizsgálom, hogy a ZMENU_FLIGHT ZMENU_FLGIHT táblában (amely a járatokhoz tartozó ételeket tartalmazza) már szerepel-e bejegyzés a kiválasztott sorhoz, ha igen, akkor azt a wa_itab táblába mentjük. Ennél a vizsgálatnál használom fel az el z leg wa_g_t_itab táblába elmentett adatokat a légitársaság és a járatszám azonosítására.. Attól függ en, hogy milyen gombra kattintottunk, történnek az események. Ha a létrehozás gombra, és már létezik az étel, akkor kiírja, hogy már létezik, ha még nem létezik, akkor pedig meghívja a következ 1100-as képerny t, melynek felépítését a következ oldalon ismertetem. Ha a módosítás, törlés, vagy megtekintés gombra kattintottak, és még nem létezik, akkor figyelmeztet üzentet kapunk, ha létezik, akkor pedig meghívja szintén a 1100-as képerny t. Mivel ugyanazt a képerny t hívom meg, ezért a mez k állapotát a meghívás el tt be kell állítani. Bár ez megel zi a képerny meghívását, de megvalósítás sorrendben el bb a képerny t kell létrehoznom, ezért a következ kben el bb az 1100-as képerny elkészítését mutatom be, és csak azután a képerny meghívása el tti paraméterezést. A következ képerny a 1100-as. Mint már említettem ez a felület tartozik mind a négy nyomógombhoz, csak különböz képp van paraméterezve.
15. ábra. Az 1100-as képerny grafikus felülete Screen Painter-ben
27
A 15. ábrán látható felület bal oldali mez inek mindegyike egyszer címke, csak a szöveghez kellett beírni, hogy mit szeretnénk látni a képerny n. A mellette lév fehér kis kockák beviteli mez k. Itt már többféle beállításra volt szükség. A 3. táblázat az egyes beviteli mez k beállításait tartalmazza. Mivel el z leg az kiválasztott sor ZFLIGHT_MENU-beli adatait már belemásoltam a wa_itab táblába, így az egyes beviteli mez knél a névnél megadva, egyb l átadja neki az értékeket. A formátum azért fontos, mert alapértelmezésben mindig CHAR szerepel. Viszont ha a mi átadott értékünk más típusú, akkor nem fogja megjeleníteni. A keresési segítség oszlopban a mez khöz rendelt keresési segítségek vannak feltüntetve. Amint a nevükb l is látszik összesen négy különböz keresési segítséget hoztam létre. A keresési segítségek leírását a 3.2.5 fejezet már tartalmazza, ezért erre nem térnék ismét ki. A mez k típusa lehet kiviteli vagy beviteli. Ha minden gombhoz külön képerny t készítettem volna, akkor például az ételekhez tartozó mez ket képerny nként már itt beállíthattam volna csak kivitelire például a megjelenítésnél. Ebben az esetben viszont, létrehozás esetén az osztálymez k módosíthatók, törlés esetén viszont nem, így a Screen painter-ben beviteli mez ként definiálom ket, aztán majd a PBO-ban állítom be az állapotukat képerny típusonként. A légitársaság neve, és a járat azonosítója, minden esetben csak kiviteli mez , ezért ezeknek a típusát, már itt kivitelire állíthatom.
Név Légitársaság neve Járat azonosító Els osztály Turista osztály Vegetáriánus Szabadon választott
WA_ITABCARRID WA_ITABCONNID WA_ITABMENU_E WA_ITABMENU_T WA_ITABMENU_V WA_ITABMENU_FREE
Formátum
Keresési seg.
Mez típusa
CHAR
Nincs
Kiviteli mez
NUMC
Nincs
Kiviteli mez
NUMC
Z_MEAL_E_SEARCHHELP
Beviteli mez
NUMC
Z_MEAL_T_SEARCHHELP
Beviteli mez
NUMC
Z_MEAL_V_SEARCHHELP
Beviteli mez
NUMC
Z_MEAL_SEARCHHELP
Beviteli mez
3. táblázat. Beviteli mez k tulajdonságai A beviteli mez k mellett soronként kiviteli mez k helyezkednek el. Ezekben a mez kben az ételek neve jelenik meg, ha a mellettük lév beviteli mez ben megadjuk az ételazonosítót majd nyomunk egy ENTER-t. A PBO minden ENTER lenyomásakor vagy gombnyomás esetén lefut, tehát ezen kiviteli mez k értékét is a PBO-ban tudom beállítani. A következ kódrészleteket a PBO SET_PARAM_1100 modul tartalmazza. Az els kódrészlet az els osztályú étel beviteli mez je melletti kiviteli mez t állítja be. IF wa_itab-menu_e IS INITIAL. CLEAR e_input_text. ELSE. SELECT SINGLE text
28
INTO e_input_text FROM zmenut WHERE lang = sy-langu AND mealid = wa_itab-menu_e. ENDIF. ENDIF.
Itt el ször megvizsgáljuk, hogy a beviteli mez tartalmaz-e értéket, ha nem, akkor a kiviteli mez ben sem jelenítünk meg semmit. Ha van étéke a beviteli mez nek, akkor lekérdezzük a ZMENUT szövegtáblából, hogy az adott bejelentkezési nyelvhez és MEALID-hez milyen szöveg tartozik, és ezt az e_input_text nevet adjuk meg a Screen Painter kiviteli mez jénél. A következ kód a létrehozás gomb esetén megjelen képerny beviteli mez inek beállítását tartalmazza. Úgy tudjuk vizsgálni a Screen Painterben létrehozott felület mez it, hogy a screen-en loopolunk. Itt a screen-name tartalmazza a mez típusát. A típuson belül input = 1 a beviteli hozzáférhet séget, output = 1, hogy kimeneti mez . Logikailag mintha ugyanazt állítanánk be, mégis biztonságosabb, ha az inputot és az outputot is megadjuk. Az invisible tulajdonság pedig a láthatóságot jelöli. Ha 0 akkor látható, ha 1, akkor láthatatlan. Miután elvégeztük a beállításokat, módosítjuk a képerny tulajdonságait a modify screen paranccsal. Mint már említettem ez a kódrészlet csak a létrehozás és a módosítás gomb esetén van így. Törlésnél és megjelenítésnél a mez k nem módosíthatók, s t megjelenítés esetén a mentés gomb sem látható. LOOP AT SCREEN.
" beviteli mezõk beállítása az eseménynek megfelelõen
IF screen-name = 'WA_ITAB-CARRID'. "nem módosítható screen-input = 0. " beviteli hozzáférés screen-output = 1. " megjelenítés ENDIF. IF screen-name = 'WA_ITAB-CONNID'. screen-input = 0. screen-output = 1. " megjelenítés ENDIF. IF screen-name = 'WA_ITAB-MENU_E'. "módosítható screen-input = 1. screen-output = 1. ENDIF. ... IF screen-name = 'SAVE'. screen-invisible = 0. "látható ENDIF. MODIFY SCREEN. ENDLOOP.
A PBO-ban beállítottam még azt is, hogy felületenként különböz cím jelenjen meg. Egyszer en a képerny típusától függ en más GUI-címet állítottam be.
29
Eztán következik a PAI megírása. Ez a modul tartalmazza a USER_COMMAND_1100-at. A modul a funkciós billenty k lekezelése után a mentés gomb lekezelésével folytatódik. El ször is formban ellen rzést végzek a mentés gomb megnyomása után, amelyben megvizsgálom, hogy a beviteli mez k esetén a keresési segítség ellenére nem írt-e nem létez vagy más típusnak megfelel MEALID-t az adott mez be. Ez akkor lehetséges, ha a felhasználó nem a keresési segítségb l választ MEALID-t. Ezt úgy tehetem meg, hogy a beírt értéket keresem a zmenu tábla, adott típusú ételei között, és ha nem találtam ilyen id-jú ételt, akkor kiíratom, hogy nem létezik, ha igen, akkor pedig továbbmegyek. A form visszatérési értéke egy segédváltozó, melynek értékét hiba esetén átállítom, visszatéréskor vizsgálom a segédváltozó értékét, és ett l függ en képerny típusonként elvégzem a mentés gombnak megfelel adatbázis m veletet. A mentés gombhoz tartozó forráskódok az 1. számú függelékben találhatók. El ször a ZFLIGHT_MENU típusú bels táblát a WA_FLIGHT_MENU-t töltöm fel adatokkal, majd ezen bels tábla adatait adom át az adatbázis m veletek során. 3.3.2.3 A felület felhasználói szemmel Miután kiválasztottuk az egyedi felvitel rádiógombot, a végrehajtás gombra ( kattintva a 16. ábrán látható felületet kapjuk.
)
16. ábra. Egyedi ételfelviteli felület a járatokhoz
Itt az ALV lista sorainak elején lév kis négyzettel ki tudjuk jelölni a lista egy sorát, majd a gombok valamelyikét igény szerint megnyomhatjuk. Ha elfelejtünk sort kijelölni, akkor figyelmeztet üzenetet kapunk, hogy jelöljünk ki sort. Létrehozás Jelöljük ki azt a sort, amelyik járathoz ételt szeretnénk rendelni, majd nyomjuk meg a létrehozás gombot. Ha olyan járatot jelöltünk ki, amelyhez már létezik étel, akkor információs üzenetet kapunk. Ha még nem létezik, akkor pedig megjelenik a 17. ábrán látható felület, ahol az ételeket tudjuk felvinni. Azonosítás céljából szerepel az oldalon
30
az el z leg kiválasztott Légitársaság és járatszám. A négy mez nél pedig a menük adhatók meg. A beviteli mez k mellett a turista osztály beviteli mez jéhez hasonlóan látszik a keresési segítség gomb. Erre kattintva felkínálja a beírható ételeket. Els osztály esetén csak az els osztályhoz rendelhet eket, turista osztály esetén, csak a turista osztályhoz rendelhet eket, és így tovább. Végül, ha megadtuk az ételeket a mentés gomba kattintva menthetjük el a bevitt ételeket. A mentés sikerességét egy felugró ablak is jelzi, majd a program visszatér oda, ahol választottunk a légitársaság járatai közül.
17. ábra. Ételek létrehozása felület
Módosítás Módosítás esetén ugyanazt a felületet a felületet kapjuk, mint létrehozás esetén, kivéve, hogy a táblában lév eddigi adatokkal fel vannak töltve a mez k, és az id-k mellett az ételek neve is szövegesen megtalálható. Ugyanúgy, ahogy létrehozáskor is, most is kattinthatunk a keresési segítségre, és segít nekünk másik ételt választani. Ha kitöltöttük a mez ket, akkor szintén a mentés gombra kattintva tudjuk elmenteni az újonnan felvitt adatokat. Törlés Törlés esetén a sor kiválasztása, és a törlés gomb megnyomása után a megjelen adatokat már nem módosíthatjuk. A felület csak biztonsági jelleggel jelenik meg, így meg tudjuk tekinteni, hogy mi az a menü összeállítás, amit törlünk. Megjelenítés A listából a sor kijelölése és a megjelenítés gomb megnyomása után tudjuk megtekinteni az egyes járatokhoz tartozó adatokat. Megjelenítésr l levén szó az ételek
31
itt sem módosíthatók. A vissza gombbal tudunk a megtekintés után visszamenni az el z felületre.
3.3.3 Csoportos bevitel A specifikációban annyi szerepelt, hogy a nagyobb légitársaságok számára biztosítsunk menüfeltöltési lehet séget. Úgy gondoltam jó kiegészítése lehet az egyedi bevitelnek, ezért egy felületen helyeztem el ket. Fájlfeltöltés esetén a légitársaság megadás után a csoportos bevitel kiválasztva már fel is tölthetjük fájlunkat.
3.3.3.1 A csoportos bevitel megtervezése A fájlfeltöltéshez a fájlformátum elég egyszer . Szövegfájlt fájlt várok, melyben az adatok TAB-bal vannak elválasztva egymásból. Azért választottam ezt a megoldást, mert a Microsoft Excel programjából az ilyen típusú szövegfájl könnyen készíthet . A fájlnak összesen öt adatot kell tartalmaznia: járatszám, els osztályú menü, turista menü, vegetáriánus menü, és szabadon választott menü. A következ képen egy lehetséges szövegfájl látható. Miután megterveztem a fájl szerkezetét a fájlfeltöltést kellett megvalósítanom. Ebben is sok beépített függvény állt rendelkezésemre, csak a megfelel en kellett tudni alkalmazni ket. Beépített függvények vannak a fájlfeltöltéshez, az tallózás megvalósításához, annak vizsgálatához, hogy valóban létezik-e a feltölteni kívánt fájl. Ennél a résznél a függvények megfelel alkalmazás, megfelel változók létrehozása, és az ellen rzések elvégzése volt a feladatom. Saját fejlesztés eredményeként vizsgáltam a feltöltend fájl tartalmát, hogy az tartalmaz-e érvénytelen mealid-t, és ha igen, akkor kiírattam a képerny egy üzenetében ezeket a hibás mealidket.
3.3.3.2 A csoportos bevitel megvalósítása A csopotos bevitelhez létrehoztunk el ször is egy rádiógombot a bevitelhez tartozó rádiógombbal egy csoportban. Eztután az 1024 hosszúra definált karakter típusú beviteli mez höz tallózási segítséget állítunk be. A tallózás megvalósítását is segíti egy beépített függvény a FILE_OPEN DIALOG. A függvény bemeneti paramétereiként az kell megadnunk, hogy mi legyen a tallózó ablak cím, hogy mit adjon meg az ablakban alapértelmezett fáljnévnek, illetve, hogy a fájlban az egyes adatok mivel vannak elválasztva egymástól. Változó paraméterként a standard filetable típusú gt_fajltabla változót adom meg, valamint egy gd_subrc nev integert, melynek segítéségével az egyes hibákat tudom azonoítani. Ezután a gt_fajltabla tartalmát belemásolom a p_fajlba, amely 1024 karakter méret .
32
Ezt követ en leellen zöm, hogy létezik-e a feltöltött fájl. Erre is létezik egy beépített függvény, a FILE_EXIST. A függvénynek improtként az el z leg feltöltött p_fajl másolatát adom meg. A függvény eredményeképp pedig visszakapok egy változó, amely ha nem egyenl X-szel, akkor nem létezik a fájl. Ezután azt ellen zöm, hogy az adott járathoz történt-e már adatfeltöltés. Ha igen, akkor hibát íratok ki, ha nem, akkor a GUI_UPLOAD függvény segítségével a g_fajl string tatalmát egy g_betabla táblába másoljuk, mely tábla struktúrája megegyezik a feltöltött szövegtábla felépítésével. A g_betabla adatait be is tölthetném a ZFLIGHT_MENU táblába, de el tte még végeztem egy ellen rzést, hogy a MEALID-k, amelyek a szövegfájlban szerepeltek, valóban létez MEALID-e. Ehhez a következ kód tartozik: *mealid ellenõrzése CLEAR: gt_hibas, g_wa_hibas. g_hibas_db = 0. LOOP AT g_betabla INTO gw_betabla. SELECT SINGLE mealid FROM zmenu INTO g_mealid WHERE mealid = gw_betabla-menu_e. IF sy-subrc <> 0. g_wa_hibas-mealid = g_mealid. g_wa_hibas-connid = gw_betabla-connid. INSERT g_wa_hibas INTO TABLE gt_hibas. CLEAR g_wa_hibas. ENDIF. ... ” itt ugyanezt a selectet elvégezzük a menu_t, menu_v és menu_free mez kre ENDLOOP.
El ször is létrehoztam egy táblát, amelybe az esetleges hibás MEALID-kat töltöm, hogy aztán ki tudjam íratni. A hibák számát pedig a g_hibas_db változóban számolom. A hibás MEALID-k megkeresése úgy zajlik, hogy végigmegyek a g_betabla tartalmán, és közben sorban vizsgálom az g_betabla egyes MEALID-it, hogy szerepelnek-e a ZMENU tábla azonosítói között. Ha nem, akkor a MEALID-t és az adott MEALID-hez tartozó CONNID-t beleteszem a g_wa_hibas struktúrába, majd betöltöm a gt_hibas táblába. Ha végigértem a g_betabla táblán, akkor megvizsgálom, hogy hány sora van a táblának. Ha van sora, az azt jelenti, hogy van hibás MEALID a feltöltött fájlban. Ekkor kiíratom a gt_hiba tábla tartalmát, különben pedig betöltöm a g_betabla adatait a ZFLIGHT_MENU táblába.
33
* hibás mealid kiiratása DESCRIBE TABLE gt_hibas LINES g_hibas_db. IF g_hibas_db <> 0. MESSAGE i010 WITH g_hibas_db. ” Az üzenet: N db hiba van a feltöltött fájlban. LOOP AT gt_hibas INTO g_wa_hibas. ” Itt íratjuk ki a hibákat. WRITE:/ g_wa_hibas-mealid, g_wa_hibas-connid. CLEAR g_wa_hibas. ENDLOOP. ELSE. CLEAR g_ok_code.
3.3.4 Információk A légitársaság bet kódjának megadása után, az ’Információk’ gomb segítségével tekinthetjük meg az egyes járatok részletes információit. A megjelenítés kétszint writeos listával történik. Ez annyit jelent, hogy el ször a légitársaság bet kódja alapján a társaság járatait és indulási idejüket jelenítem meg, majd ha itt valamelyik sorra kattintunk, akkor az adott sorhoz kapcsolódóan megjelenik egy részletesebb lista. A 18. képen egy ilyen lista látható.
18. ábra. Write-os lista
A tábla minden egyes oszlopa egy vagy több SQL lekérdezés eredménye. Az egyes lekérdezések eredményét egy bels táblában tároltam el. Majd a végén ezt a bels táblát jelenítettem meg. Az els két oszlop a szabad helyek számát tartalmazza, ezek tárolva voltak a SFIGHT táblában, így ezek lekérdezése nem volt bonyolult. A többi oszlop adatait úgy kellett kiszámolnom. A következ kben ezen lekérdezések logikáját írom le, az ide vonatkozó forráskód pedig a 2. számú függelékben megtalálható. 1. Összes menü darabszámának lekérdezése. Mivel az write-os lista úgynevezett második szintre lépésekor a HIDE parancs segítségével eltároltuk a kiválasztott sor elemeit, ezért könny dolgunk van. Egyszer en össze kell számolnunk a ZBOOK_MENU tábla adott tulajdonságú sorait a COUNT függvény segítségével, és megkapjuk, hogy az adott tulajdonágú járathoz hány bejegyzés található az ételfoglalásokat tartalmazó táblában. 2. Els osztályú, turista, vegetáriánus, és szabadon választott ételek darabszámának lekérdezése. 34
Amikor fajtánként akarjuk összeszámolni az ételek darabszámát, akkor el bb tudnunk kell, hogy mely ételek vannak egyáltalán az adott járathoz rendelve. Ezt a zflight_menu táblából kaphatjuk meg. Ha ez megvan, akkor egyszer en a WHERE feltételbe az el z feladathoz képest hozzávesszük - az els osztályú esetén a járathoz tartozó els osztályú - MEALID-t, és így számoljuk meg a sorok számát. Ugyanezt megtesszük a többi típussal is. Így megkapjuk, hogy típusonként hány darab ételt foglaltak le. 3. Lefoglalt ételek összsúlyának lekérdezése Itt is el bb szükségünk van a járathoz rendelt ételek id-jára, ahhoz, hogy a súlyukat ki tudjuk nyerni a zmenu táblából. Tehát el ször lekérdezzük a ZFLIGHT_MENU táblából a járathoz tartozó ételeket, majd a zmenu táblából az el z leg lekérdezett mealid-khez tartozó súlyt. Végül a második lekérdezés eredményét felhasználva az egyes ételek esetén összeszorzom az ételtípusonkénti darabszámot az adott étel összsúlyával. Végül az összes ételtípusnál az eredményt összeadom, így megkapom az ételek összsúlyát, s t a típusonkénti összsúlyt is tudom. 4. Lefoglalt ételek összárának lekérdezése Az el z höz hasonló módszerrel számolom ki az összárat is, azzal a különbséggel, hogy ebben az esetben a zmenu táblából a mealid-khez tartozó pénzösszeget kérdezem le. Ezt követ en ismét a második lekérdezésben kiszámított ételtípusonkénti darabszámot használom fel a pénzösszeg kiszámítására. Az egyes lekérdezések eredményét folyamatosan töltöttem az el re elkészített listaoszlopoknak megfelel tábla mez kbe. Amikor minden lekérdezést elkészítettem, kiírattam az eredményt.
35
3.3.5 Egységes felületre hozás
19. ábra. Z_FM_LAYOUT karbantartási felülete
A 3.3 alfejezet kezdete óta taglalt felület a 19. képen látható. Amint látható el ször bekérem a légitársaság bet kódját, melynek meghatározásához segítséget nyújt a beviteli mez melletti jel. Ezután választhatunk, hogy egyedi bevitelt szeretnénk, vagy csoportosat, csoportos esetén ugyanezen felületen fel is tudjuk tölteni a fájt. Ha nem kívánunk menü hozzárendelést végezni, hanem csak információkra van szükségünk az egyes járatokról, akkor azokat a légitársaság bet kódjának megadása után, az Információk gombra kattintva kaphatjuk meg. Az egyedi beviteles felületr l a 3.3.2. , a csoportos bevitelr l a 3.3.3 az információkról a 3.3.4 fejezetekben olvashatunk részletesebben. A felület elemei: • Légitársaság kódja, megadás kötelez . • Rádiógombok, ezek egy csoportba vannak rendelve, tehát csak egyiküket választhatjuk ki. Alapértelmezetten az egyedi bevitel van kiválasztva. • Tallózásra alkalmas beviteli mez , ennek megvalósítását má ismertettem a 3.3.2 fejezetben. • Információk gomb. A gomb létrehozása a végrehajtás gomb mellé a következ képp történik: SELECTION-SCREEN: FUNCTION KEY 1. INITIALIZATION. sscrfields-functxt_01 = 'Információk'.
A sscrfields változó a szül je az olyan felületeknek, amelyek igazából nem screen-ek. El ször létre kell hoznunk a gombot, majd felíatot tudunk rendelni hozzzá.
36
Amint a következ forráskódból is látható, ebben az esetben az eseményekhez tatozó funkió kódokat a sscrfields-ucomm tartalmazza. Két eseményt kezelünk, az egyik az információ gomb megnyomásához tartozó ’FC01’ a másik a végrehajtás gomb megnyomásának funkciókódja az ’ONLI’. A felület user-command-ja következ képp néz ki: AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'FC01'. IF p_carrid IS INITIAL. MESSAGE e011. ELSE. "meg kell hívni a write-os listát az infókkal SUBMIT Z_FE_SQL. ENDIF. WHEN 'ONLI'. IF p_r1 = 'X'. SELECT * INTO CORRESPONDING FIELDS OF TABLE g_t_itab "itt a HEADER-be sort pakol FROM spfli WHERE carrid = p_carrid. CALL SCREEN '0100'. ELSE. "itt jön a fájlfeltöltés vizsgálata ENDIF.
Ha az ’Információk’ gombra kattintottunk, és megadtunk egy légitársaság kódját, akkor meghívódik a Z_FE_SQL program, amely a járatokról tartalmalz információkat. Ha a végrehajtás gombra kattintunk, és az egyedi bevitel rádiógomb van kiválasztva, akkor az egyedi felületet jeleníti meg, ha nem az egyedi bevitel rádiógomb van kiválasztva, akkor pedig tudjuk, hogy fájlfeltöltés van, tehát azt kell lekezelnünk.
37
3.4 Foglalási felület Ez az alfejezet tartalmazza az utasok számára készült felület leírását. A specifikáció szerint egy olyan felületet kellett készítenem, amelyen az utasok a már meglév foglalásaikhoz ételeket tudnak foglalni. Ehhez el ször is szükségem volt egy újabb táblára, amelyben nyilvántartottam az ételfoglalásokat. Ahhoz hogy tudjam, milyen attribútumok kerüljenek a táblába, el bb elterveztem, hogy körülbelül milyen felépítés re szeretném a felületet. Majd ezt meg is valósítottam. Az alfejezet további részében a felület megtervezését, a tábla elkészítését és felhasználói útmutatóját írom le.
3.4.1 A felület megtervezése Az el z felületek leírási logikájától eltér en, ebben az alfejezetben el bb a felület megtervezését írom le, és csak utána a felülethez szükséges tábla elkészítését. Ennek oka, hogy az el z két tábla megvalósítása, és attribútumainak irányadó leírása szerepelt a specifikációban, ezen tábláé viszont nem. Elképzelhet , hogy ennek oka, hogy a feladatot nem így kellett volna megoldani, de az is lehet, hogy egyszer en a felület elkészítéséhez nem akartak segítséget nyújtani még azzal sem, hogy utalnak egy újabb tábla készítésére. Én az utóbbi mellett döntöttem, ezért készítettem egy újabb táblát. Ehhez viszont meg kellett tervezem el ször a felületet, hogy tudjam, hogy milyen tábla attribútumokra lesz szükségem. Bejelentkezést nem akartam készíteni, de valahogy mégis azonosítani akartam a felhasználót, hogy akárki ne módosíthassa az illet foglalásait, ezért a meglév FLGIHT modell táblái között rátaláltam a CUSTOMID-re. Én úgy értelmeztem, hogy a FLIGHT modellben akár minden ügyfél kaphat els egy ilyen azonosítót, és ezt az azonosítót tudomására is hozzák, és ennek segítségével a felületen azonosíthatja magát. Tehát a kezd felület egy szelekciós képerny vel indul, amelyen a légitársaságot és a CUSTOMID-t kell megadni. Ezután az SBOOK táblát használom a légitársaság adott CUSTOMID-j foglalásainak megjelenítéséhez. Mivel elképzelhet , hogy az utas már foglalt az adott légitársaság valamelyik járatához ételt, még a járatok kiíratása el tt vizsgálom, hogy történt-e már el z leg ételfoglalás. Ha igen, akkor a következ kben megjelen ALV lista adott sorát sárga szín re színezem, ezzel is jelezve, hogy ha arra a sorra kattint, akkor módosítani fog, mivel ahhoz már szerepel egy ételfoglalás. A sorok színezéséhez az ALV lista kirajzoláshoz szükséges táblába egy plusz szín oszlopot kellett felvenni. A mez szerkezete el re definiálva van, eszerint kellett feltölteni ezt a mez t. A szín megadás után kirajzolom az ALV listát, most viszont a „régi”, nem objektumorientált módszerrel. Ezután következik az ALV lista egy sorának kiválasztása után a járathoz tartozó ételek megjelenítése. A lista egy sorának kiválasztása az el z felülett l eltér en, most a sor bármelyik mez jére való duplakattintással m ködik.
38
Ehhez egy olyan USER_COMMAND alprogramot kellett írni, amelynek speciális változói vannak. Az SAP-ban egy beépített ún. típus-csoport tartalmazza az ALV lista kattintással kiválasztott mez jét, és annak tulajdonságait. Ezen típus-csoport segítségével meg tudtam határozni, hogy melyik sorra kattintott a felhasználó, és a sor változóinak segítségével a ZFLIGHT_MENU táblából ki tudtam venni azokat az ételeket, amelyeket az el z felülethez hozzárendeltem. Az ételek megjelenítéséhez egy dynpro-t készítettem, melyen rádiógombok segítségével lehet kiválasztani a kívánt menüt, majd a mentés gombra kattintva el lehet menteni a foglalást. Ha a felhasználó egy olyan sorra kattintott, amelyhez már foglalt le ételt, akkor a rádiógombok közül az az étel lesz kiválasztva, amit el z leg lefoglalt, de újat választhat, és a mentés gombbal módosíthatja. Tehát a mentés gomb egyszerre lát el mentési és felülírási funkciót is.
3.4.2 ZBOOK_MENU tábla A tervezés alapján arra jutottam, hogy mivel az SBOOK tábla tartalmazza a foglalásokat, és én ehhez csak az ételfoglalásokat szeretném hozzávenni, ezért a ZBOOK_MENU táblámba az SBOOK tábla kulcsait, és MEALID-t tettem bele. Ez a MEALID fogja tartalmazni a választott ételt. A tábla elkészítése nem volt bonyolult, mivel csupa kulcsmez b l áll, ezért nem kellett létrehoznom adatelemeket, hanem már meglév kulcsokat egy táblába raktam. Ennek megfelel en a tábla felépítése a 20. ábrán látható.
20. ábra. ZBOOK_MENU tábla felépítése
A táblát természetesen össze kellett kapcsolnunk azokkal a táblákkal, amelyeknek kulcsait felhasználjuk, így az SBOOK, SCUSTOM és ZMENU táblával.
39
3.4.3 A felület megvalósítása
21. ábra. Foglalási felület folyamatábrája
A 21. ábrán a felület függvényei, formjai, moduljai láthatók. A vízszintes vonalak azt jelzik, hogy a függvényb l meghívták ket (szaggatott vonal), vagy meghívódtak (sima vonal). A függ leges vonal az id beni egymásutániságot jelzi. Tehát az ábra értelmezése a következ . Az ALV lista létrehozása el tt el ször lefut a REUSE_ALV_FIELDCATALOG_MERGE, az ALV mez katalógusának beállításához, aztán a REUSE_ALV_GRID_DISPLAY megjeleníti az ALV-t. A duplakattintáshoz szükséges USER_COMMAND form mindig az ALV-b l hívódik meg. Az utóbbi függvény ugyanis mindig lefut, ha az ALV-t bármilyen hatás éri. A USER_COMMAND formon belül történik a DYNPRO_1200 form meghívása. Ezen form segítségével állítjuk be, hogy rádiógomb melletti mez kben a járathoz tartozó ételek szövege jelenjen meg a 1200-as képerny n. Ezen mez végén történik a CALL SCREEN hívás, ez ugyan nem tartozik a modul, form, függvény kategóriába, de fontos az id beliség miatt. Mivel a képerny meghívását követ en futnak le a PBO folyamat moduljai, illetve a képerny kirajzolása utáni inputok hatására a PAI moduljai. A kódrészletb l a duplakattintás megvalósítását, a USER_COMMAND formot, valamint az ebb l meghívott DEFAULT_1200 form-ot mutatnám be részletesen, elmagyarázva a forráskódot. A feladathoz tartozó teljes forráskód megjegyzésekkel megtalálható a 3. számú függelékben. A duplakattintás eseményéhez a SLIS típuskönyvtár változóinak vizsgálata szükséges. Ez a típuscsoport tartalmazza az ALV lista elemeir l. Az ’&IC1’ funkciós kód tartozik a duplakattintáshoz. A duplakattintás során az SLIS_SELFIELD tábla változóit vizsgáljuk, mivel ez a SAP standard tábla tartalmaz információkat a kurzor állapotáról az ALV listán belül. A tabindex a kijelölt sor indexét tartalazza. Az index segítségével a T_TABLE tábla kiválasztott sorát a wa_table-be olvashatjuk bele. Ezen struktúra alapján tudjuk kiszedni a ZFLIGHT_MENU táblából az adott sorhoz tartozó ételazonosítókat, majd az azonosítók alapján a ZMENUT szövegtáblából az ételhez tartozó szöveget a bejelentkezés nyelvén.
40
TYPE-POOLS slis. FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm WHEN '&IC1'. "doubleclick IF rs_selfield-tabindex > 0 . READ TABLE t_table INTO wa_table INDEX rs_selfield-tabindex. IF wa_table-color = 'C310'. MESSAGE i014. ENDIF. PERFORM dynpro_1200. ENDIF. ENDCASE. ENDFORM. "user_command
Ha ez megvan, akkor megnézem, hogy a ZBOOK_MENU tábla tartalmaz-e azonosítót az ALV lista kiválasztott sorához. Ha igen, akkor megvizsgálom, hogy pontosan milyen típusú ez a MEALID, és annak megfelel en a felületen az adott rádiógombot beállítom. Így ha olyan sorra kattint az utas, amihez már rendelt ételt, akkor az el z leg megrendelt étel lesz bejelölve.
3.4.4 A felület felhasználói szemmel A felület segítésével az utasok a már lefoglalt járataikhoz tudnak ételeket lefoglalni. A kezd felületen, amely a 22. ábrán is látható, a légitársaságot és az ügyfél azonosítót kell megadni. A légitársaság kiválasztásában segít a gomb, az ügyfél azonosító megadása pedig a felhasználó feladat. Feltételezzük, hogy mindenki tudja a saját azonosítóját.
22. ábra. Ételfoglalási kezd felület
Ezután egy lista jelenik meg, az adott légitársaság megadott utas által lefoglalt járatairól. Ez a lista látható a 23. ábrán.
41
23. ábra. Adott utas foglalt járatainak listája
Módosítás Elképzelhet , hogy az utas már foglalt a légitársaság valamelyik járatához ételt. Ezt jeleztem, hogy a lista adott sora sárga szín hátteret kap, ahogy az a 23. kép els két esetében is átható. Ebb l is azonnal látszik, hogy melyek azok a járatok, amelyekhez már történt foglalás. Ha mégis módosítani szeretne a foglalását, azt is megteheti. Ekkor a sorra kattintva, még egyszer kap figyelmeztetést, hogy ehhez a járathoz már foglalt ételt, és az ételek közül is ki van választva az el z leg lefoglalt étel. Ezt azonban módosíthatja, másik étel választásával. Majd a menté gombra kattintva elmentheti új választását.
Els foglalás
24. ábra. Menükínálat a kiválasztott járathoz
Ha még nem foglaltunk a járathoz ételt, akkor a járat sorának háttérszíne fehér. Duplán kattintva a sor bármely mez jére, megjelenik a járathoz tartozó menükínálat a 23. ábrán látható módon. Az étel neve el tti kis körre kattintva választhatunk ételt, majd a mentés gombbal elmenthetjük választásunkat.
42
4 Továbbfejlesztési, módosítási lehet ségek A félév során egy lazán specifikált fejlesztési feladat egy lehetséges megoldását készítettem el. Habár magam döntöttem az egyes feladatrészek megvalósítási módjával kapcsolatban, igyekeztem egy összességében egységes munkát készíteni a félév végére. Többféle programozási fogást próbáltam az egyes feladatrészeknél használni. A hasonló felületeket különböz módszerekkel elkészíteni. Megint csak a laza feladatkiírásból adódóan a végtelenségig lehetett volna apró részletek leprogramozni. Utólag gondolva az ételekkel kapcsolatban a szabadon választott étel jelenthette volna azt is, hogy az adatbázisban nincs fix étel kiválasztva, hanem a foglaló tényleg szabadon választhat az összes étel közül. Az információs ablaknál lév listát is meg lehet valósítani ALV listával, de mint mondtam többféle listát is szerettem volna bemutatni, ezért alkalmaztam az ALV lista elkészítésénél is kétféle módszert. Az ételeket járatokhoz rendeltem, így az adott járat minden egyes id pontjában ugyanazok az ételek lesznek a járatokon. Az ételek járathoz való rendeléséhez hozzá lehetett volna venni a repülés dátumát is, és így minden egyes dátumhoz más-más ételt lehetett volna rendelni. Fájlfeltöltés esetén a fájl tartalmának ellen rzése során én csak a mealid-k létezését vizsgáltam, de a járatszámok létezését is meg lehetett volna. Akár azt is lehetett volna vizsgálni, hogy a mealid-knél a vegetáriánus ételhez tényleg egy vegetáriánus étel van-e rendelve és így tovább. Mivel a felület szövegeinek nagy részét szövegelemekben tároltam, így könnyedén megvalósítható nem csak az ételek nevének nyelvfüggetlensége, hanem a teljes felületek többnyelv sítése. Egy komplett féléves feladat lehetne, ugyanezen felületek megvalósítása webes felületen. Az SAP két nyelvet is kínál a webdynprok készítéséhez. Megoldható ABAP és java nyelven is. Az ABAP webdynpro fejlesztése megoldható az ABAP Wokbenchben, a java-s megoldáshoz Development Studio szükséges. A webdynpos megvalósítás azét hasznos, mert webdynprok esetén az adott oldalt elérhetjük URL-en keresztül, míg a hagyományos dynpok futtatásához SAP GUI szükséges. A feladathoz workflow is készíthet . Említettem, hogy például az utasok azonosítása nem egészen biztonságos. Megoldható lenne, hogy wokflow segítségével, az ételfoglalás akkor ment djön el a táblában, ha az utas visszaigazolta az e-mailt amit a foglalás pillanatában kapott. Ugyanilyen ellen rz e-mail küldési lehet ség köthet a csoportos fájlfeltöltéshez is. A feltölt vállalat e-mailt kapna, hogy fájlt akar feltölteni, és ezt csak akkor engedélyeznénk, ha visszaigazolta az e-mailt.
43
44
5 Összefoglalás A piaci pozíció meg rzése, er sítése és a versenyel ny növelése ma már elképzelhetetlen informatikai rendszerek nélkül. Az integrált vállalatirányítási rendszerek feldolgozzák a vállalathoz beérkez adatokat, majd oly módon alakítják át ket, hogy azok a megfelel formában legyenek elérhet ek a különböz cég számára. Az SAP vállalatirányítási rendszer piacvezet az integrált vállalatirányítási rendszerek között. Az SAP programozási nyelvének az ABAP-nak az elsajátítására készült az SFLIGHT modell, mely több adatbázistáblából áll. A modell segít jobban elsajátítani az ABAP nyelvet példái segítségével. A félév során én is ezt a modellt használtam. A légitársaságok meglév adatbázisát egészítettem ki három táblával. A specifikáció további része csak felsorolásként tartalmazta, hogy milyen elemeket kell megvalósítanom, és ebb l kellett nekem egy lehet leg egységes felületet és feladatot elkészítnem. Az eredmény két felület lett. Az egyiket az utasok használhatják, ételeket foglalhatnak le rajta, a másik a karbantartóknak készült, ahol egyedileg vagy csoportosan vihetnek fel ételeket a járatokhoz, vagy egyszer en információkat kérhetnek az egyes járatokról. A fejlesztési feladatok elkészítése során törekedtem arra, hogy minél több mindent megmutassak az ABAP nyelvb l, és a fejleszt környezet lehet ségeib l. A feladatok elkészítéséhez nagy segítséget nyújtottak az SAP beépített függvényei, változói. A feladat megoldása tervezéssel kezd dött, amikor még úgy kellett terveznem a felületet, hogy még nem voltam teljesen tisztában azzal, hogy mik is a lehet ségeim. Aztán ahogy haladtam a feladattal, folyamatosan jöttek az ötletek, hogy miket lehetne még megvalósítani. Ilyen volt a fájlfeltöltésnél a fájl ellen rzése, vagy az ALV lista esetén a lista sorinak színezése. Összességében eredményesnek érzem a féléves munkámat. Egy komplett fejlesztési feladatot sikerült elkészítenem. Az addig csak elméleti szinten tanult dolgokat a feladat során alkalmaznom kellett, ami el ször nehézkesen ment, de végül már gyakorlottan mozogtam a fejleszt környezetben. A feladat megoldása során sok új ismeretet szereztem az ABAP nyelvr l. Úgy érzem, hogy a feladat megvalósítása során szerzett tapasztalatot a kés bbiekben kamatoztatni tudom majd a munkám során.
45
6 Köszönetnyilvánítás Mivel az ABAP nem egy olyan programozási nyelv, melyet minden informatikai egyetemen tanítanak, mint a C-t, C#-ot vagy a Java-t, ezért küls segítségre is szükségem volt. A fejlesztési feladatok megvalósítása során a felmerül kérdéseimre több helyr l is kaptam segítséget, úgy ahogy félév során a használt rendszerek is változtak, helyileg is. Ezúton szeretnék köszönetet mondani a Magyar Cukor Rt. pet házi gyárában dolgozó SAP fejleszt knek. Barcsik Attilának, valamint az ELTE SAP fejlesztéssel foglalkozó Információs Rendszerek Fejlesztése és Üzemeltetése Osztály dolgozóinak a rendszer biztosításáért, és a segítségnyújtásért. A feladat kiadásáért és munkám segítéséért, valamint dolgozatom formai ellen rzéséért konzulenseimnek Szitás Zoltánnak és Füri Lászlónak.
46
7 Irodalomjegyzék [1] Hernández, Keogh, Martinez: SAP R/3 kézikönyv (Könnyen is lehet) Panem Kft., 2007 [2] Szikora Béla: Vállalatirányítási rendszerek jegyzet Budapesti M szaki és Gazdaságtudományi Egyetem 2004. [3] Hetyei József: Vállalatirányítási információs rendszerek Magyarországon I. ComputerBooks, Budapest 1999. [4] ABAP – wikipédia http://hu.wikipedia.org/wiki/ABAP Utolsó megtekintés dátuma: 2008. április 2. [5] SAPINFO.HU – az SAP Hungary Kft. Hivatalos hírlevele 2002/3. 2002/4. 2002/5. [6] BC400 SAP tanfolyam el adásanyaga SAP AG, 2007 [7] ABAP/4 User’s Guide Basics SAP AG, 1996
47
8 Függelék 1. MODULE user_command_1100 INPUT. CASE ok_code. WHEN 'BACK'. LEAVE TO SCREEN 0. WHEN 'END'. LEAVE TO SCREEN 0. WHEN 'CANCEL'. LEAVE TO SCREEN 0. WHEN 'SAVE'. PERFORM ell. IF g_seged2 = 0. CASE screen_type. WHEN 'CREATE'. PERFORM save_create. WHEN 'DELETE'. PERFORM save_delete. WHEN 'MODIFY'. PERFORM save_modify. ENDCASE. ENDIF. ENDCASE. ENDMODULE.
" USER_COMMAND_1100
INPUT
FORM save_create . wa_zflight_menu-connid = wa_itab-connid. wa_zflight_menu-carrid = wa_itab-carrid. wa_zflight_menu-menu_e = wa_itab-menu_e. wa_zflight_menu-menu_t = wa_itab-menu_t. wa_zflight_menu-menu_v = wa_itab-menu_v. wa_zflight_menu-menu_free = wa_itab-menu_free. INSERT INTO zflight_menu VALUES wa_zflight_menu. IF sy-subrc EQ '0'. MESSAGE i004. LEAVE TO SCREEN 0. ENDIF. ENDFORM.
" save_create
FORM save_delete . DELETE FROM zflight_menu WHERE connid = wa_itab-connid AND carrid = wa_itab-carrid.
48
IF sy-subrc EQ '0'. MESSAGE i003. LEAVE TO SCREEN 0. ENDIF. ENDFORM.
" save_delete
FORM save_modify . UPDATE zflight_menu SET menu_e = wa_itab-menu_e menu_t = wa_itab-menu_t menu_v = wa_itab-menu_v menu_free = wa_itab-menu_free WHERE connid = wa_itab-connid AND carrid = wa_itab-carrid. IF sy-subrc EQ '0'. MESSAGE i005. LEAVE TO SCREEN 0. ENDIF. ENDFORM.
" save_modify
49
2. *járatonként a szabad helyek száma els és másodosztályon SELECT seatsocc_f seatsocc_b FROM sflight INTO (tabla-szhely_e, tabla-szhely_t) WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate. ENDSELECT. *menük száma összesen SELECT COUNT(*) INTO tabla-menu_db FROM zbook_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate. *menük száma fajtánként SELECT menu_e menu_t menu_v menu_free FROM zflight_menu INTO w_zflight_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid. ENDSELECT. SELECT COUNT(*) INTO tabla-menue_db FROM zbook_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate AND mealid = w_zflight_menu-menu_e. SELECT COUNT(*) INTO tabla-menut_db FROM zbook_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate AND mealid = w_zflight_menu-menu_t. SELECT COUNT(*) INTO tabla-menuv_db FROM zbook_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate AND mealid = w_zflight_menu-menu_v.
50
SELECT COUNT(*) INTO tabla-menusz_db FROM zbook_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid AND fldate = wa_sbook-fldate AND mealid = w_zflight_menu-menu_free. *
menük összsúlya SELECT menu_e menu_t menu_v menu_free FROM zflight_menu INTO w_zflight_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid. ENDSELECT. SELECT mealweight FROM zmenu INTO osszg_e WHERE mealid = w_zflight_menu-menu_e. ENDSELECT. COMPUTE osszg_e = osszg_e * tabla-menue_db. SELECT mealweight FROM zmenu INTO osszg_t WHERE mealid = w_zflight_menu-menu_t. ENDSELECT. COMPUTE osszg_t = osszg_t * tabla-menut_db.
SELECT mealweight FROM zmenu INTO osszg_v WHERE mealid = w_zflight_menu-menu_v. ENDSELECT. COMPUTE osszg_v = osszg_v * tabla-menuv_db.
SELECT mealweight FROM zmenu INTO osszg_sz WHERE mealid = w_zflight_menu-menu_free. ENDSELECT. COMPUTE osszg_sz = osszg_sz * tabla-menusz_db. COMPUTE tabla-ossz_g = osszg_e + osszg_t + osszg_v + osszg_sz.
51
*menük pénzösszege SELECT menu_e menu_t menu_v menu_free FROM zflight_menu INTO w_zflight_menu WHERE carrid = wa_sbook-carrid AND connid = wa_sbook-connid. ENDSELECT.
SELECT mealcost FROM zmenu INTO osszp_e WHERE mealid = w_zflight_menu-menu_e. ENDSELECT. COMPUTE osszp_e = osszp_e * tabla-menue_db. SELECT mealcost FROM zmenu INTO osszp_t WHERE mealid = w_zflight_menu-menu_t. ENDSELECT. COMPUTE osszp_t = osszp_t * tabla-menut_db.
SELECT mealcost FROM zmenu INTO osszp_v WHERE mealid = w_zflight_menu-menu_v. ENDSELECT. COMPUTE osszp_v = osszp_v * tabla-menuv_db.
52
3. REPORT
z_book MESSAGE-ID
z_fmmessage_fe.
TYPE-POOLS slis. TABLES: zbook_menu. DATA: t_table TYPE TABLE OF zbook_alv1. "a belso tablad. DATA: wa_table LIKE LINE OF t_table. DATA: r1(1) TYPE c, r2(1) TYPE c, r3(1) TYPE c, r4(1) TYPE c, ok_code LIKE sy-ucomm, wa_zflight_menu LIKE zstrukt_fm, x_mealid like zbook_menu-mealid. *szelekciós képerny PARAMETERS p_carrid TYPE scarr-carrid. PARAMETERS p_cid TYPE scustom-id. START-OF-SELECTION. SELECT * INTO CORRESPONDING FIELDS OF TABLE t_table FROM sbook WHERE carrid EQ p_carrid AND customid EQ p_cid. LOOP AT t_table INTO wa_table. ENDLOOP. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_structure_name = 'ZBOOK_ALV1' i_callback_program = sy-repid i_callback_user_command = 'USER_COMMAND' TABLES t_outtab = t_table. FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN '&IC1'. "doubleclick IF rs_selfield-tabindex > 0 AND rs_selfield-sumindex LE 0. READ TABLE t_table INTO wa_table INDEX rs_selfield-tabindex. PERFORM dynpro_1200. ENDIF. ENDCASE. ENDFORM. "user_command2
53
MODULE user_command_1200 INPUT. CASE ok_code. WHEN 'BACK'. LEAVE TO SCREEN 0. WHEN 'END'. LEAVE TO SCREEN 0. WHEN 'CANCEL'. LEAVE TO SCREEN 0. WHEN 'SAVE'. IF r1 = 'X'. PERFORM save_r1. ENDIF. IF r2 = 'X'. PERFORM save_r2. ENDIF. IF r3 = 'X'. PERFORM save_r3. ENDIF. IF r4 = 'X'. PERFORM save_r4. ENDIF. ENDCASE. ENDMODULE.
" USER_COMMAND_1200
INPUT
FORM dynpro_1200 . SELECT connid carrid menu_e menu_t menu_v menu_free FROM zflight_menu INTO wa_zflight_menu WHERE carrid = wa_table-carrid AND connid = wa_table-connid. SELECT text FROM zmenut INTO wa_zflight_menu-text_e WHERE mealid = wa_zflight_menu-menu_e AND lang = sy-langu. ENDSELECT. SELECT text FROM zmenut INTO wa_zflight_menu-text_t WHERE mealid = wa_zflight_menu-menu_t AND lang = sy-langu. ENDSELECT. SELECT text FROM zmenut INTO wa_zflight_menu-text_v WHERE mealid = wa_zflight_menu-menu_v AND lang = sy-langu. ENDSELECT. SELECT text FROM zmenut INTO wa_zflight_menu-text_free WHERE mealid = wa_zflight_menu-menu_free AND lang = sy-langu. ENDSELECT. ENDSELECT.
54
CALL SCREEN 1200. ENDFORM.
FORM save_r1 . zbook_menu-carrid = zbook_menu-connid = zbook_menu-fldate = zbook_menu-bookid = zbook_menu-customid zbook_menu-mealid =
" dynpro_1200
wa_zflight_menu-carrid. wa_zflight_menu-connid. wa_table-fldate. wa_table-bookid. = wa_table-customid. wa_zflight_menu-menu_e.
MODIFY zbook_menu. ENDFORM.
" SAVE_R1
FORM save_r2 . zbook_menu-carrid = zbook_menu-connid = zbook_menu-fldate = zbook_menu-bookid = zbook_menu-customid zbook_menu-mealid =
wa_zflight_menu-carrid. wa_zflight_menu-connid. wa_table-fldate. wa_table-bookid. = wa_table-customid. wa_zflight_menu-menu_t.
MODIFY zbook_menu. IF sy-subrc EQ '0'. LEAVE TO SCREEN 0. MESSAGE i006. ENDIF. ENDFORM.
" SAVE_R2
FORM save_r3 . zbook_menu-carrid = zbook_menu-connid = zbook_menu-fldate = zbook_menu-bookid = zbook_menu-customid zbook_menu-mealid =
wa_zflight_menu-carrid. wa_zflight_menu-connid. wa_table-fldate. wa_table-bookid. = wa_table-customid. wa_zflight_menu-menu_v.
MODIFY zbook_menu. IF sy-subrc EQ '0'. LEAVE TO SCREEN 0. MESSAGE i006. ENDIF. ENDFORM.
" SAVE_R3
55
FORM save_r4 . zbook_menu-carrid = zbook_menu-connid = zbook_menu-fldate = zbook_menu-bookid = zbook_menu-customid zbook_menu-mealid =
wa_zflight_menu-carrid. wa_zflight_menu-connid. wa_table-fldate. wa_table-bookid. = wa_table-customid. wa_zflight_menu-menu_free.
MODIFY zbook_menu. IF sy-subrc EQ '0'. LEAVE TO SCREEN 0. MESSAGE i006. ENDIF. ENDFORM. MODULE status_1200 OUTPUT. SET PF-STATUS 'STATUS_1200'. ENDMODULE.
" SAVE_R4
" STATUS_1200
OUTPUT
MODULE check OUTPUT. SELECT mealid into x_mealid FROM zbook_menu WHERE carrid = wa_table-carrid AND connid = wa_table-connid AND fldate = wa_table-fldate AND bookid = wa_table-bookid AND customid = wa_table-customid. ENDSELECT. IF sy-subrc = 0. IF x_mealid r1 = 'X'. ENDIF. IF x_mealid r2 = 'X'. ENDIF. IF x_mealid r3 = 'X'. ENDIF. IF x_mealid r4 = 'X'. ENDIF. ENDIF. ENDMODULE.
= wa_zflight_menu-menu_e.
= wa_zflight_menu-menu_t.
= wa_zflight_menu-menu_v.
= wa_zflight_menu-menu_free.
" CHECK
OUTPUT
56