Szakdolgozat
Miskolci Egyetem
Elektronikai alkatrészek logisztikáját segítő alkalmazás
Készítette: Hatvani Gábor 2014. Programtervező Informatikus BSc Témavezető: Smid László mérnöktanár
Miskolc, 2014
Miskolci Egyetem Gépészmérnöki és Informatikai Kar Alkalmazott Matematikai Tanszék
Szám:
Szakdolgozat Feladat Hatvani Gábor (GD7839) programtervező informatikus jelölt részére. A szakdolgozat tárgyköre: Alkalmazásfejlesztés A szakdolgozat címe: Elektronikai alkatrészek logisztikáját segítő alkalmazás A feladat részletezése: Elektronikai alkatrészek raktározása során fellépő problémák részletezése. A jó és rossz raktározási, tárolási módszerek áttekintése. A program elkészítésénél alkalmazott programnyelv általános ismertetése. Az adatmodellek elkészítése az infromációk megfelelő tárolásához. A megfelelő Java alkalmazás elkészítése és dokumentálása, mely segítséget nyújt a raktározási problémák megoldásában.
Témavezető(k): Smid László (mérnöktanár, Miskolci Egyetem) Konzulens(ek): A feladat kiadásának ideje: 2014. szeptember 30.
................................. szakfelelős 2
Eredetiségi Nyilatkozat
Alulírott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; Neptun-kód: . . . . . . . . . . . . . . . . . . . a Miskolci Egyetem Gépészmérnöki és Informatikai Karának végzős Programtervező Informatikus szakos hallgatója ezennel büntetőjogi és fegyelmi felelősségem tudatában nyilatkozom és aláírásommal igazolom, hogy Elektronikai alkatrészek logisztikáját segítő alkalmazás című szakdolgozatom/diplomatervem saját, önálló munkám; az abban hivatkozott szakirodalom felhasználása a forráskezelés szabályai szerint történt. Tudomásul veszem, hogy szakdolgozat esetén plágiumnak számít: • szószerinti idézet közlése idézőjel és hivatkozás megjelölése nélkül; • tartalmi idézet hivatkozás megjelölése nélkül; • más publikált gondolatainak saját gondolatként való feltüntetése. Alulírott kijelentem, hogy a plágium fogalmát megismertem, és tudomásul veszem, hogy plágium esetén szakdolgozatom visszautasításra kerül.
Miskolc, . . . . . . . . . . . .év . . . . . . . . . . . .hó . . . . . . . . . . . .nap
................................. Hallgató
3
1. szükséges (módosítás külön lapon) A szakdolgozat feladat módosítása nem szükséges ......................
...........................
dátum
témavezető(k)
2. A feladat kidolgozását ellenőriztem: témavezető (dátum, aláírás):
konzulens (dátum, aláírás):
..............
.............
..............
.............
..............
.............
3. A szakdolgozat beadható: ......................
...........................
dátum
témavezető(k)
4. A szakdolgozat . . . . . . . . . . . . . . . . . . . szövegoldalt . . . . . . . . . . . . . . . . . . . program protokollt (listát, felhasználói leírást) . . . . . . . . . . . . . . . . . . . elektronikus adathordozót (részletezve) ................... . . . . . . . . . . . . . . . . . . . egyéb mellékletet (részletezve) ................... tartalmaz. ......................
...........................
dátum
témavezető(k)
5. bocsátható A szakdolgozat bírálatra nem bocsátható A bíráló neve: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......................
...........................
dátum
szakfelelős
6. A szakdolgozat osztályzata a témavezető javaslata:
................
a bíráló javaslata:
................
a szakdolgozat végleges eredménye: . . . . . . . . . . . . . . . . Miskolc, . . . . . . . . . . . . . . . . . . . . . . . .
................................. a Záróvizsga Bizottság Elnöke 4
Tartalomjegyzék 1. Bevezetés
6
2. Téma elméleti kifejtése 2.1. Gyártási alapismeretek . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. A felhasználandó alkatrészek mennyisége . . . . . . . . . . . . . 2.1.2. Milyen megoldások léteznek? . . . . . . . . . . . . . . . . . . . . 2.1.3. Helytelen tárolási módszerek . . . . . . . . . . . . . . . . . . . . 2.1.4. Helyes tárolási rendszer . . . . . . . . . . . . . . . . . . . . . . . 2.2. Az alkalmazott programnyelv: A Java . . . . . . . . . . . . . . . . . . . 2.2.1. A Java nyelv története . . . . . . . . . . . . . . . . . . . . . . . 2.2.2. A Java alapelvei . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3. A kiadott verziók . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4. Java technológiák . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5. Java 2 platform . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.6. Mire van szükség egy Java alkalmazás elkészítéséhez? . . . . . . 2.2.7. A Java alkalmazások szerkezete, változók típusai, hozzáférési kategóriák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.8. Vezérlési szerkezetek, elágazások . . . . . . . . . . . . . . . . . . 2.2.9. Ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.10. Osztályok, létrehozásuk . . . . . . . . . . . . . . . . . . . . . . . 2.3. Adatmodellek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. ER (Entity-relationship) modell . . . . . . . . . . . . . . . . . . 2.3.2. Relációs adatmodell . . . . . . . . . . . . . . . . . . . . . . . . .
7 7 7 8 8 9 11 11 11 12 13 13 14
3. Fejlesztői dokumentáció 3.1. A fejlesztési környezetről . . . . . . . . . . . . . . . . . . 3.1.1. A szoftver célja . . . . . . . . . . . . . . . . . . . 3.1.2. A használt fejlesztőkörnyezet, illetve programozási 3.1.3. Az adatbázis létrehozása . . . . . . . . . . . . . . 3.2. A program funkciói . . . . . . . . . . . . . . . . . . . . 3.2.1. Alkatrészek menü . . . . . . . . . . . . . . . . . . 3.2.2. Adatfelvitel . . . . . . . . . . . . . . . . . . . . . 3.2.3. Megrendelések . . . . . . . . . . . . . . . . . . . .
23 23 23 23 24 27 28 32 37
. . . . . . . . nyelv . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
14 15 17 18 20 20 21
4. Összefoglalás
40
Irodalomjegyzék
41
Adathordozó használati útmutató
43 5
1. fejezet Bevezetés Napjainkban a szoftverfejlesztés, illetve üzleti és célszoftverek használata minden iparágban elterjedtté vált. Manapság már a legtöbb kisebb-nagyobb cég saját szoftverfejlesztő csapatot alkalmaz, mely csapat munkája nagyban segíti a cég sikeres és hatékony munkáját. Elektronikai gyártó cégeknél is elengedhetetlenül fontos lett a megfelelő szoftverek fejlesztése és használata, mely az egész gyártási folyamatra nézve meghatározó szerepet tölt be. A tervezőasztaltól kezdve a gyártósori automatizált gépeken át, a logisztikáig mind-mind megtaláljuk a cégek saját fejlesztő csapata által készített szoftvereket, melyek napról-napra hatékonyabbá teszik a termelést. Kiemelkedően fontosnak tartom egy gyártási folyamat esetén a megfelelő alapanyagellátottságot, mely a gyártás egyik alappillére. Elektronikai gyártócégek esetén az alapanyok természetesen elektronikai alkatrészek. A szakdolgozatom keretei közt, egy ezen a területen alkalmazható programot készítettem el, mely alkalmas elektronikai alkatrészek raktárkészleteinek nyilvántartására, illetve kezelésére. Mivel az egyik hobbim az elektronikai barkácsolás, elektronikai áramkörök tervezése és megépítése, így ez a témakör nagyon közel áll hozzám. A szakdolgozatom dokumentum része ismerteti a szoftver funkcióit, lehetséges alkalmazási területeit, továbbá a használt programnyelvekről, illetve a szoftver fejlesztésének menetéről is tartalmaz ismertető leírást. A program elkészítése során az egyetemi évek alatt tanult ismereteket alkalmaztam, melyek közül a Java programnyelv és az adatbáziskezelés, amelyeket leginkább kedveltem.
6
2. fejezet Téma elméleti kifejtése 2.1. Gyártási alapismeretek Napjainkban az elektronikai termékek gyártása automatizált gyártósorokon történik. Legyen az a termék akár egy általánosan elterjedt, hétköznapi használatú eszköz, például egy mobiltelefon, vagy akár egy, az orvostudományban alkalmazott elektronikus eszköz, mindkettő alapvetően, áramköri szinten hasonló alkatrészekből épül fel. Ezért a gyártócégek alkatrész felhasználása nem választható teljesen szét a gyártott terméktől függően. Értem ezalatt, hogy különböző eszközök áramköri paneljainak elkészítésekor igen sok az átfedés a felhasznált alkatrészek tekintetében. Tehát, ha a cég sok különböző terméket gyárt, akkor sok esetben egy adott alapanyag (esetünkben elektronikai alkatrész) több különböző termék gyártásakor is felhasználásra kerül. Ez minden esetben komoly termelési tervezés igényét veti fel, benne foglalva a megfelelő alapanyag ellátottságot. Hogy jobban átlássuk, miként történik a gyártás a valóságban, tegyünk egy kitérést az automatizált elektronikai panelgyártás világába. Alapvetően minden elektronikus termék paneljának alapja egy úgynevezett nyomtatott áramköri lap, melynek angol neve Printed Circuit Board. Ez a lap nem más, mint egy műanyag vagy üvegszálas alapú hordozó lap, melyen a különböző alkatrészek közti kapcsolatokat létrehozzák réz anyagú vezetősávokkal. Az alkatrészeket pedig forrasztásos kapcsolattal rögzítik a panelra. A nyomtatott áramköri lap, a ráültetett és beforrasztott alkatrészekkel együttesen képezi a nyomtatott áramköri panelt.
2.1.1. A felhasználandó alkatrészek mennyisége Itt máris felmerülhet a kérdés, hogy egy adott termék legyártásához milyen, és mekkora mennyiségű alkatrészre van szükség. Általánosságban elmondható, hogy egyazon típusú alkatrészből több darab is kerül egy panelra. Ilyen esetben természetesen a tervezés során figyelembe kell venni, hogy a gyakrabban használt, több termék gyártásakor használatos alkatrészekből mindig nagyobb raktárkészlettel kell rendelkezni, ellenben a ritkán használt alkatrészekből nem szükséges állandó jelleggel feleslegesen nagy készletet raktározni.
7
2.1. Gyártási alapismeretek Továbbá ismert tény, hogy mint bármely egyéb termék esetén, az elektronikai alkatrészeknél is változó mennyiségben és arányban előfordulhatnak gyárilag hibásak, amelyek a gyártás során egyáltalán nem használhatóak fel, vagy ha mégis felhasználásra kerülnek, akkor az elkészült termékben hibás, nem megfelelő működést okoznak. Ezzel szintén számolni kell, ennek megfelelően a raktárkészletnek nagyobbnak kell lennie, mint az elméleti számítások alapján kapott alkatrész darabszámnak. Tehát, például ha egy termékre egy adott alkatrészből 20 darab épül be és ebből a termékből szeretne a cég 100 darabot gyártani, akkor a számított 2000 darab alkatrésznél célszerű némileg nagyobb készletet raktározni.
2.1.2. Milyen megoldások léteznek? Ez eddig rendben is volna, de miképpen tudjuk nyomon követni, hogy valóban rendelkezésre áll-e a megfelelő mennyiség? Nagyobb cégeknél természetesen SAP-t, illetve egyéb professzionális rendszereket használnak ilyen célokra. Ez természetesen remek megoldás, de mi lehetne a megoldás abban az esetben, ha anyagi szempontból nem tudja a cég megengedni magának ilyen rendszerek használatát? Főleg kisebb elektronikával foglalkozó cégeknél és szervízeknél jellemző, hogy ilyen esetekben semmilyen módon, vagy legfeljebb egy Excel táblában van nyilvántartva, hogy milyen alkatrészekből mennyi van raktárkészleten.
2.1.3. Helytelen tárolási módszerek Magam is foglalkozom hobbi szinten kisebb-nagyobb elektronikai kapcsolások tervezésével, megépítésével, így tudom, hogy a hobbi elektronikával foglalkozók alkatrész tároló szekrényében hatalmas káosz uralkodik. Ez alól én sem vagyok kivétel.
2.1. ábra. Alkatrészek ömlesztve Ha a fentihez hasonló kép fogadja az embert, amikor belenéz egy alkatrész tárolóba, akkor nem könnyű, sőt inkább lehetetlen átlátni, hogy a szükséges alkatrészek rendelkezésre állnak-e.
8
2.1. Gyártási alapismeretek A képen látható alkatrészek még típusra sem megegyezőek. Egy ilyen eset azért cégeknél általában nem jellemző. Ami leginkább előfordul, hogy típus szerint rendszerezve vannak az alkatrészek, de nincsenek megfelelően nyilvántartva a mennyiségek.
2.2. ábra. Alkatrészek szétválogatva Egy ilyen látvány már sokkal barátságosabb. Az alakatrészek legalább típus szerint rendszerezve vannak. Viszont továbbra is fenn áll a probléma, hogy az alkatrészeknek nem tudjuk a mennyiségét. Még ilyen kis mennyiségnél sem jó megszámolgatni, nemhogy egy gyártósoron, ahol csak egy-egy típusú alkatrészből is több ezer darab van tárolva. Ezeken a fenti képeken is látszik, hogy legyen szó akár csak saját hobbi célra szánt alkatrészeink tárolásáról, vagy akár egy kisebb elektronikai szervíz alkatrészeinek tárolásáról, elengedhetetlen, hogy valamilyen rendszert vezessünk be. Fontos, hogy gyorsan, keresgélés nélkül megtaláljuk azokat az alkatrészeket, melyekre az adott munkához szükségünk van. Továbbá tudnunk kell, hogy az adott alkatrészből mekkora mennyiségünk van készleten, illetve mely alkatrészeket kell megrendelnünk.
2.1.4. Helyes tárolási rendszer Egy helyes tárolási rendszer alatt én a következőket értem: • Minden alkatrésznek külön tárolási helye van • Nincsen keveredés az alkatrészek között • Mindig tudjuk, hogy az adott alkatrészből milyen mennyiséggel rendelkezünk • Az alkatrészek minden számunkra fontos adata rögzítve legyen • Szükség esetén egyszerűen meg tudjuk rendelni a alkatrészeket
9
2.1. Gyártási alapismeretek Egy jó példa kisebb mennyiségű alkatrész tárolására:
2.3. ábra. Tárolódoboz különböző értékű ellenállásokhoz Természetesen a megfelő fizikális tárolás mellett, az adatokat egy arra alkalmas szoftver segítségével célszerű kezelni. Az Oracle SQL, illetve Java JDBC környezetben például könnyen kezelhető alkalmazásokat lehet létrehozni ilyen célra.
10
2.2. Az alkalmazott programnyelv: A Java
2.2. Az alkalmazott programnyelv: A Java 2.2.1. A Java nyelv története A Java programnyelvet a Sun Microsystems kezdte fejleszteni a 90-es évek elején. Eleinte egy kisebb projektként indult a fejlesztés, mellyel az volt a célja a cégnek, hogy részesedést szerezzen az elektronikai piac úgynevezett "okos" processzorral rendelkező, programozható készülékek ( például kábel-TV társaságok által használt eszközök ) területéből. Az ilyen eszközök programozásához szükség volt egy architektúra-független technológiára, mely lehetővé teszi a programok hálózaton keresztül történő futtatását is. A nyelv fejlesztése során alapul a C++ nyelvet vették, melyből kigyomlálták a nem megbízható szerkezeteket, illetve hozzáadtak hasznosnak tűnő ötleteket, elemeket. A fenn említett elektronikai termékek piaca viszont közel sem nőtt a várakozásnak megfelelően. Gyakorlatilag, ha nem indult volna meg ezzel egy időben az Internet fejlődése, valószínűleg el is tűnt volna a nyelv a süllyesztőben.
2.2.2. A Java alapelvei • Egyszerű Ez alatt azt értjük, hogy a nyelv alapjait a programozók gyorsan elsajátíthassák. Figyelembe vették a nyelv kidolgozása során, hogy a programozók többsége ismeri a C++ nyelvet, így alkalmazták a C++ elemeit, azonban a túlzottan bonyolult vagy nehezen kontrollálható megoldásokat kihagyták. Hatékonyabbá tették a memóriakezelést az automatikus szemétgyűjtés ( garbage collector ) mechanizmussal. Gazdag objektumkészlet áll rendelkezésre, mely egyszerűsíti és gyorsítja a fejlesztés menetét. • Objektum orientált A Java tisztán objektum-orientált nyelv. Elosztott, kiszolgáló-ügyfél típusú rendszerek esetén felmerülő problémákra az objektum-orientált szemlélet adja a megoldást, az egybeépítés és öröklés felhasználásával. • Megbízható és biztonságos A nyelvet nagy megbízhatóságú alkalmazások fejlesztésére hozták létre. Memóriakezelésének köszönhetően (dinamikus helyfoglalású objektumok alkalmazása, a már nem használt tárterület automatikus felszabadítása) sok programozói hiba kiküszöbölhető. A fordítóprogram erősen típusos és szigorú. A Java az elosztott rendszereken futó programok fejlesztését is célozta, így a biztonság kérdése szintén igen fontos szerepet kap. A beépített védelmi eszközöknek köszönhetően az elkészült alkalmazások a külső "támadásoktól" védettek. • Platformfüggetlen és hordozható Mivel a Java-t hálózaton keresztül terjesztett alkalmazások fejlesztésére hozták létre, fontos igény volt, hogy a programkód különböző felépítésű hardvereken és eltérő operációs rendszereken is fusson. Ennek érdekében a Java fordítóprogramja úgynevezett bájtkódot készít, melyet a Java virtuális gép (JVM) tud futtatni.
11
2.2. Az alkalmazott programnyelv: A Java • Többszálú Hálózati alkalmazások esetén további igényként jelentkezik, hogy több művelet legyen képes végrehajtódni egyidejűleg. A Java ezt szemafor mechanizmusokkal és a folyamatok futásának szinkronizálásával oldja meg. A Thread osztály támogatja a szálak kezelését, a Java virtuális gép pedig a szálak futtatásához egy prioritáson alapuló ütemezőt tartalmaz. • Interpretált és dinamikus A memóriakezelés tekintetében, valamint futás közben a hivatkozott osztályok elérésekor egyaránt fontos a dinamikusság. Az objektumok és tömbök dinamikusan jönnek létre, megszüntetésükről azonban a futtatórendszer szemétgyűjtési mechanizmusa gondoskodik. A dinamikus szerkesztés, valamint a bájtkód interpretált végrehajtása gyorsítja a fejlesztés folyamatát, azonban az interpretált végrehajtásnak megvan a hátránya is, ugyanis becslések szerint 5-10-szer lassabban futnak, mint a gépi kódú megfelelőik. Továbbá a memóriagazdálkodással járó szemétgyűjtési mechanizmus futásához szükséges idő is hozzáadódik a teljes futási időhöz. Általánosan viszont elmondható, hogy gyakori felhasználói közreműködést igénylő alkalmazásoknál vagy hálózati kommunikációt igénylő alkalmazásoknál nem a futási sebesség a legfontosabb követelmény. A nyelv fejlesztésének során egyre elterjedtebb lett, hogy a virtuális gép támogatja a "röptében fordítást" ( JIT, just in time). A fordítás ebben az esetben az egyes osztályok betöltésekor, a szükséges ellenőrzések végrehajtása után vagy végrehajtás közben történik meg.
2.2.3. A kiadott verziók • 1996 Január: JDK 1.0 Ez volt a Java feljesztői csomag (Java developement kit) első kiadása. Egyaránt tartalmazza a fejlesztői eszközöket és a futtatási környezetet. Később kiadásra került egy csomag, amely csak a futtatási környezetet tartalmazta (JRE). • 1997 Február: JDK 1.1 Itt már volt lehetőség több osztály egymásba ágyazására ( belső osztály ), valamint adatbázis kezelésre elérhetővé vált a JDBC. • 1998 December: JDK 1.2 API szintű változások, a JAVA része lett a Swing grafikus API, a JVM-be belekerült a JIT-compiler. A JIT-compilation ( Just in time compilation ), azaz futás idejű fordítás futásidőben fordítja a bájtkódot natív kódra. A bájtkód nem egy adott processzorra szóló gépi kód, így különböző számítógép architektúrák közt hordozható. • 2000 Május: JDK 1.3 Csak néhány kisebb változtatás történt, belekerült a Hotspot JVM a rendszerbe, továbbá a Java Sound és a JNDI API is.
12
2.2. Az alkalmazott programnyelv: A Java • 2002 Február: JDK 1.4 Nyelvi bővítés történt: belekerült az "assert" kulcsszó a teszteléshez. Az API-n is változtattak némileg. Bekerült a JAXP XSLT és XML feldolgozáshoz. • 2004 Szeptember: JDK 5 Újdonságai: automatikus végighaladó ciklus a megszámlálható elemeket tartalmazó tömbön, autoboxing (az adattípusok automatikus objektummá alakítása), a metódusok argumentumszáma változó számú lehet, metaadatok kezelése a forrásfájlban. • 2006 December: JDK 6 Kiterjesztett nyomonkövetési és felügyeleti megoldások, Java scripting API. Kiegészítők, melyek támogatják a grafikus tervezést. Megjelent a Java compiler API. A Swing GUI is bővítésen esett át, pl. megjelentek benne a szűrhető, rendezhető táblázatok, valamint optimalizáláson esett át. • 2011 Július: JDK 7 Főbb újdonságai a JVM támogatás a dinamikus nyelvekhez, automatikus erőforrás kezelés, több kivételkezelés egyszerre, GPU-t kihasználni képes Xrender API, a könnyebb párhuzamosításhoz Fork és Join keretrendszer. • 2014 Március: JDK 8 A Lambda kifejezések implemtációját valósították meg, valamint jobb lett a támogatás a párhuzamos feldolgozáshoz is.
2.2.4. Java technológiák Bár a Java elektronikus eszközök programozási nyelveként indult, majd az Internetes böngészők programozási nyelveként terjedt el, elterjedtek a kisalkalmazások, az appletek is. Azonban az is világossá vált, hogy Java-ban teljes értékű alkalmazások is készíthetők. Megjelentek a grafikus felületetek és API-k is, valamint a servletek (szerveren futó kisalkalmazások) és az EJB (Enterprise JavaBeans). Továbbá megjelent a JDBC, amely az adatbázisokkal való együttműködéshez ad megoldásokat. A mobil eszközökre (telefonok, PDA-k) való fejlesztés szintén az egyik fontos területe a Java nyelv alkalmazásának.
2.2.5. Java 2 platform A Java platform alatt a Java nyelven íródott, bájtkóddá fordított program futtató környezetét értjük. Alapvetően két részre bontható: • Java virtuális gép • Java alkalmazás-programozási felület Ezt a platformot a Sun cég Java 2 Platform Standard Edition (J2SE) néven teszi elérhetővé. Két alapvető "készlet" tartozik a J2SE platformhoz, a futtató környezet (JRE) és a fejlesztőkészlet (JDK).
13
2.2. Az alkalmazott programnyelv: A Java A JRE tartalmazza a Java virtuális gépet és a Java API-t, valamint további olyan programelemeket, melyek a Java nyelven íródott programok futtatásához szükségesek. A JDK tartalmazza a JRE-t annak minden funkciójával együtt, továbbá a fejlesztéshez szükséges programokat.
2.2.6. Mire van szükség egy Java alkalmazás elkészítéséhez? Manapság már igen sok Java fejlesztő környezet elérhető, a professzionális, ám igen drága megoldások mellett megtalálhatóak az ingyenes, mégis teljes értékűen használható alternatívák. Alapvetően egy egyszerű Java alkalmazás elkészítéséhez csupán egy Java fordító (compiler), illetve egy szövegszerkesztő szükséges. Természetesen ennél már sokkal kényelmesebben használható eszközök is vannak, például a NetBeans vagy az Eclipse, csak hogy a népszerűbbeket említsük. A JDK és JRE pedig a Sun honlapjáról letölthető ingyenesen.
2.2.7. A Java alkalmazások szerkezete, változók típusai, hozzáférési kategóriák A Java programok osztályokból épülnek fel. Az osztályok pedig adattagokból (változókból) és metódusokból állnak. A metódusok utasításokat tárolnak, melyek különböző feladatokat hajthatnak végre. Az adattagokban pedig változókat definiálunk és értéket adunk nekik. A Java alap változó típusai Logikai érték tárolására: • boolean: értéke true (igaz) vagy false (hamis) lehet Egész számok tárolására: • byte 8 bit • short 16 bit • int 32 bit • long 64 bit Lebegőpontos számok tárolására: • float 32 bit • double 64 bit Karakter tárolására: • char
14
2.2. Az alkalmazott programnyelv: A Java Fontos tudni, hogy először minden esetben deklarálnunk kell a változót, vagyis a változó névhez változótípust kell rendelni. A változónevek használatánál ügyelni kell arra, hogy a Java különbséget tesz a kis- és nagybetűk közt. Hozzáférési kategóriák Változók és metódusok esetén egyaránt adhatunk meg hozzáférési kategóriát is, melyek a következők lehetnek: • public : nyilvános hozzáférésű • static : nem változtatható • void : nincs visszatérési értéke (metódusnak) • private : csak abban a modulban érhetőek el, ahol definiálva lettek Néhány példa változódeklarálásra: private int darabszam; Ezzel az utasítással egy olyan változót hoztunk létre, mely csak a létrehozásával megegyező modulban érhető el, és egy egész szám értéke tárolható benne. Fontos megjegyezni, hogy amikor hivatkozni akarunk erre a változóra, akkor a fentebb már leírt kisnagybetű érzékenységet figyelembe kell venni, tehát pl. Darabszam hivatkozással nem fogjuk elérni a változót. A változóknak adhatunk kezdeti értéket is, amelyet természetesen utána értékadó utasításokkal módosíthatunk. Erre egy példa: private int darabszam=5; Karakter változó értékadása esetén a megadott karaktert aposztróf jelek közé kell tenni: public char karakter1=’s’;
2.2.8. Vezérlési szerkezetek, elágazások Ebbe a kategóriába olyan program szerkezetek tartoznak, melyeknél több irányban, többféle módon folytatódhat a program futása. Elágazások: Elágazásoknak az olyan programszerkezeteket nevezzük, melyek esetén a program, valamilyen feltétel teljesülése vagy éppen nem teljesülése alapján dönti el, hogy mik a további végrehajtandó utasítások. If -es szerkezetek: Ebben az elágazástípusban az if kulcsszó után zárójelben megadunk egy feltételt, és ha az teljesül, akkor lefutnak a szerkezet törzsében lévő utasítások is. Ha nem, akkor a program fut tovább a törzsben lévő utasítások kihagyásával.
15
2.2. Az alkalmazott programnyelv: A Java Példa: if(zsebpenz>=200){ tud_venni_csokit=true; } Az "if" -es szerkezet kiegészülhet egy "else" résszel is, itt olyan utasításokat adhatunk meg, melyek akkor fognak lefutni, ha nem teljesül a feltétel. Példa: if(zsebpenz>=200){ tud_venni_csokit=true; } else{ zsebpenz=zsebpenz+50; } Switch szerkezet Ez a szerkezet arra alkalmas, hogy a zárójelben lévő kifejezést kiértékelje és a kiolvasott értéknek megfelelő "case" ágban lévő utasításokat futtassa le. A következő sorokban egy egyszerű példa látható. Ez a kódrészlet arra alkalmas, hogy az osztályzat nevű változó értéke alapján kiírja az adott érdemjegy szöveges megfelelőjét a képernyőre. switch (osztalyzat){ case 1: System.out.println("Elégtelen"); break; case 2: System.out.println("Elégséges"); break; case 3: System.out.println("Közepes"); break; case 4: System.out.println("Jó"); break; case 5: System.out.println("Példás"); break; default: System.out.println("Hiba"); break; }
16
2.2. Az alkalmazott programnyelv: A Java
2.2.9. Ciklusok A ciklusok olyan szerkezetek, melyek egy adott, egyazon kódrészletet többször futtatnak le egymás után. A ciklus megállásának minden esetben van egy megadott feltétele. Ciklusok közt megkülönböztetünk elől és hátul tesztelőket. Az elől tesztelő ciklus a ciklusmagban lévő utasítások lefutása előtt megvizsgálja a megadott feltételt, és a feltétel alapján dönti el, hogy le kell-e futtatni a ciklusmagot. Hátul tesztelő esetén a ciklusmag lefutása után történik meg a feltétel kiértékelése. Tehát a ciklusmag egy alkalommal mindig lefut. for ciklus (előltesztelő) Ennek a ciklustípusnak a fejléce egy deklarációból, egy feltételből, és egy, a ciklusváltozót módosító (általában előre léptető) utasításból áll. A következő kis programrészlet bemutatja, hogy miként lehet kiíratni a számokat 1-től 10-ig "for" ciklus segítségével. for (int i=1; i<=10; i++){ System.out.println(" Az i aktuális értéke: " +i); } while ciklus (előltesztelő) While ciklus esetén a fejlécben csak a feltétel szerepel, a ciklusváltozót még a ciklus előtt deklarálni kell és kezdő értéket kell neki adni. A ciklusváltozó léptetése pedig a ciklusmagban történik. Az előbbi példa "while" ciklussal: int i=1; while (i<=10){ System.out.println(" Az i aktuális értéke: " +i); i++; } do-while ciklus (hátultesztelő) Az alábbi kódsor ugyanazt a feladatot valósítja meg, mint az előző, azzal a különbséggel, hogy itt a ciklusmag akkor is lefutna egy alkalommal, ha az "i" változó értéke már értékadáskor nem felelne meg a ciklusfeltételnek. int i=1; do{ System.out.println(" Az i aktuális értéke: " +i); i++; }while(i<=10);
17
2.2. Az alkalmazott programnyelv: A Java
2.2.10. Osztályok, létrehozásuk Először is kezdjük azzal, hogy mit is értünk osztály alatt Java programozás esetén. Az osztály, más néven "class" az objektumorientált programnyelvek alapvető építőeleme. Amikor létrehozunk egy osztályt, tulajdonképpen egy sablont készítünk, mely adattagokból és metódusokból áll. Ennek az a célja, hogy az osztály példányosításakor, minden objektum ugyanolyan adatstruktúrával és metódusokkal rendelkezzen. Java nyelvben egy osztály létrehozása a következőképpen történik: class osztalynev { // adattagok definiálása // metódusok definiálása // egyéb } Az osztály felépítése természetesen attól fog függeni, hogy milyen feladatot szánunk neki. Például ha mi létrehozunk egy "téglatest" nevű osztályt, akkor annak adattagjai lehetnek a hosszúság, szélesség és magasság értékeinek tárolására alkalmas változók. Az osztály metódusai pedig legyenek alkalmasak a téglatest felszínének és térfogatának kiszámítására, és ezeket az adatokat írják ki a képernyőre. Amikor példányosítjuk a "téglatest" osztályt, akkor annak egy új objektuma jön létre, a megadott értékekkel. Legyen a "téglatest" osztályunk a következő: public class Teglatest{ int hossz; int szelesseg; int magassag; public Teglatest(int h, int sz, int m){ hossz = h; szelesseg = sz; magassag = m; } public void Terfogat(){ System.out.println("A téglatest térfogata:" +(hossz*szelesseg*magassag)); } } A példányosítás kulcsszava a "new". A következő utasítás létrehoz egy objektumot a téglatest osztályból. Teglatest tegl1 = new Teglatest(100,80,30); A zárójelben megadott számok paraméterek, melyeket megkap az osztály konstruktora. Amennyiben az osztályban létre van hozva a szükséges térfogat számítására alkalmas metódus, akkor a következő módon hívhatjuk meg: tegl1.Terfogat();
18
2.2. Az alkalmazott programnyelv: A Java Ezzel az utasítással a "tegl1" nevű, "Teglatest" osztályból példányosított objektum, "Terfogat( )" metódusát hívjuk meg, melynek lefutási eredménye a monitoron lesz látható. Metódusok paraméterei, visszatérési értékei A metódus paraméterlistáját a fejlécében adjuk meg zárójelben. A zárójelet mindig ki kell tenni, ha üres, akkor az azt jelenti, hogy a metódusnak nincsenek bemenő paraméterei. Legfőbb céljuk az, hogy ha másik osztályból hívjuk meg a metódust, akkor a metódusoknak olyan adatot adjunk át, melyek a másik osztályban lettek definiálva. Visszatérési értéknek azt az adatot, információt nevezzük, melyet a metódus "visszaküld" az őt meghívó objektumnak. A fenti példában olyan metódust adtunk meg, melynek nincs visszatérési értéke. Ezt a metódus fejlécében lévő "void" kulcsszó adja meg. Ha nem void-ként deklarálunk egy metódust, akkor minden esetben meg kell adni egy "return( )" utasítást, ahol a zárójelben a visszatérési értéket adjuk meg. Ez lehet egy konkrét érték, vagy egy változó azonosítója. A paraméterekre és visszatérési értékekre egyaránt igaz, hogy a Java bármelyik változótípusából származhatnak.
19
2.3. Adatmodellek
2.3. Adatmodellek Az adatok szerkezetének, struktúrájának leírására adatmodelleket használunk. A modell megalkotása szempontjából számunkra lényeges az adatok típusa és a közöttük lévő kapcsolatok. Feladata, hogy a rögzíteni kívánt adatok tárolásához megfelelő szerkezetet biztosítson.
2.3.1. ER (Entity-relationship) modell Az ER modell egy egyszerűsített szemantikai adatmodell, mely segítséget nyújt a relációs adatbázis elkészítésében. Három fő komponense van: • egyed • kapcsolat • tulajdonság Egyednek nevezzük az önálló léttel bíró objektumokat, amelyről információt kívánunk letárolni. Két típusa van: normál egyed és gyenge egyed. A normál egyed önmagában azonosítható objektum, míg a gyenge egyed egy másik objektummal való kapcsolatán keresztül azonosítható. Az adatmodellben lévő egyedeket a tulajdonságokkal jellemezhetjük. Ezekről a jellemzőkről tárolhatunk információt az adatbázisban. Az egyedek kapcsolatban állnak egymással. A modell létrehozásakor csak az elsődleges kapcsolatokat adjuk meg. A kapcsolatok kötelező jelleg szerint lehetnek opcionálisak és kötelezőek. Opcionális kapcsolat esetén létezhet olyan egyedelőfordulás, amelyhez nem tartozik egyedpéldány a kapcsolatban. Kötelező jellegű kapcsolatban viszont minden egyedelőforduláshoz kell, hogy tartozzon más egyedpéldány. Az egyedek között fennálló kapcsolatokat más szempont szerint is megkülönböztethetjük. Számosság alapján 1:1, 1:N (egy-több), N:M (több-több) kapcsolatokat különböztethetünk meg. 1:1 kapcsolatban egy egyedpéldányhoz maximum egy egyedelőfordulás tartozhat. 1:N kapcsolatban egy egyedhez több egyedelőfordulás tartozhat, viszont a másik irányban csak egy egyedpéldány társulhat hozzá. N:M kapcsolat esetén több egyedelőfordulás is megengedett minden irányban.
20
2.3. Adatmodellek A feladathoz tartozó adatbázis megalkotásának első lépéseként létrehoztam az ER modellt, mely egyszerű jelölésrendszerével szemlélteti a tárolni kívánt objektumokat, valamint azok jellemzőit.
2.4. ábra. ER modell Az adatbázisban alkatrész és beszállító objektumokat, az azokhoz tartozó jellemzők adatait tároljuk, valamint a megrendelésekkel kapcsolatos információk is helyet kapnak a táblában. Az alkatrész egyedhez tartozó azonosító az id, amely egyértelműen azonosít minden alkatrész objektumot. A beszállító objektum is rendelkezik kulcs tulajdonsággal, mely azonosítja az adatbázisban az egyes beszállítókat. További információk a beszállítókról még az elérhetőségi adatok, a beszállító címe, illetve átlagos szállítási napok száma. Az egyes megrendelésekkel kapcsolatos adatok, mint a megrendelési és teljesítési idő is részét képezik az adatbázisunknak. Az egyedek között N:M (több-több) jellegű kapcsolat áll fenn, vagyis egy adott alkatrész több beszállítótól is érkezhet, továbbá egy beszállító több, különböző típusú alkatrészt is szállíthat a vállalkozásnak.
2.3.2. Relációs adatmodell A szemantikai adatmodellek mellett az adatbázis modellek nyújtanak segítséget a logikai adatbázis tervezésében. Jellemzően gépközeli személettel rendelkezik, a modell a teljességre törekszik. Egyszerűsége és rugalmassága révén ez az egyik legelterjedtebb adatbázis tervező eszköz. A relációs adatmodell az egyedeket és a közöttük fennálló kapcsolatokat adattáblákban tartja nyílván. A táblák tartalmazzák az objektumok tulajdonságait is, ezek a táblák attribútumai. Az egyedeket jellemző tulajdonságok a táblák oszlopaiban kapnak helyet. A tábla egyes sorai rekordként értelmezhetők. A táblában lévő rekordok megkülönböztetése a kulcs attribútummal történik. Ez a mező egyértelműen azonosítja az adott rekordot az adattáblában. 21
2.3. Adatmodellek Két tetszőleges reláció között a kapcsolat az idegen kulcs létrehozásával valósítható meg. Az elsődleges kulcs attribútumtól eltérően, értéke lehet üres is. Referencia, amely egy másik tábla attribútumára hivatkozik. A kapcsolatok típusától függően eltérő ábrázolási módok lehetségesek. Esetünkben a több-több kapcsolat megvalósítása külön kapcsoló relációt igényel, mely tartalmaz idegen kulcsot mindkét relációhoz. A mezőértékekre vonatkozóan a relációk tartalmaznak integritási feltételeket.
2.5. ábra. Relációs modell
22
3. fejezet Fejlesztői dokumentáció 3.1. A fejlesztési környezetről Ebben a fejezetben a szakdolgozat részeként létrehozott szoftverről lesz szó. A következő témakörök lesznek taglalva: • a szoftver létrehozásának célja • az alkalmazott szoftverkörnyezet a fejlesztéshez • a funkciók részletezése
3.1.1. A szoftver célja A szoftver megalkotásának célja, a bevezetésben és az első fejezetben felmerülő problémákra való megoldás keresése volt. Fontosnak tartottam annak a bemutatását, hogy nem feltétlenül szükséges professzionális szoftverek megvásárlása és használata, melyek esetenként túlzottan bonyolultak is. Kisebb cégek számára is hasznos alkalmazást akartam készíteni, ahol nem feltétlenül van szükség összetett termelésirányítási rendszerre, de mégis úgy érezzük, hogy bizonyos raktározási területre hasznos lenne egy megfelelő alkalmazás. A következő elképzeléseim, elvárásaim voltak a szoftverrel szemben a fejlesztés kezdetekor: • egyszerűség • átláthatóság • ne igényeljen túl sok beállítást • a kezelt adatbázis legyen a programtól független
3.1.2. A használt fejlesztőkörnyezet, illetve programozási nyelv A fentieket figyelembe véve a választás a Java-ra esett a programozási nyelv tekintetében, a kezelt adatbázis pedig Oracle SQL rendszerű. A Java mellé telepíteni kell a megfelelő JDBC meghajtót, amely alkalmas az Oracle SQL-lel való együttműködésre.
23
3.1. A fejlesztési környezetről Fejlesztőkörnyezetnek a NetBeans IDE-t választottam. A választás azért erre a környezetre esett, mert könnyen átlátható, hiba esetén jól értelmezhető hibaüzenetet ad, mely nagyon fontos az esetleges problémák kiküszöböléséhez. A fent említett szoftverek otthoni használatra mind ingyenesen letölthetőek az internetről. A szoftver elkészítésének menetére általánosan igaz, hogy leginkább az egyetemi éveim alatt tanultakat alkalmaztam, kiegészítve az egyéb szükséges megoldásokkal.
3.1.3. Az adatbázis létrehozása Az adatbázist a Java szoftvertől függetlenül kell létrehozni. Ehhez le kell tölteni és telepíteni az Oracle Database Express Edition-t. Én a készítés során még a 10g verziót használtam. A telepítés után az alkalmazás könyvtárában el kell indítani a "Start database" futtatható állományt. Ezek után már webes felületen tudunk vele dolgozni, a "Go To Database Home Page" állomány indításával. A következő táblák létrehozására volt szükség: Alkatrész tábla: az adatbázisban tárolt alkarészek jellemzőinek tárolására A tábla mezői: • alk_id : az alkatrész azonosítója, ID-je • alk_nev : az alkatrész neve • alk_tipus : az alkatrész típusa • alk_ertek : az alkatrész értéke (pl. kondenzátornál a kapacitása) • alk_tokozás : az alkatrész tokozása ( mérete és kialakítása ) • alk_raktarkeszlet : azt tárolja, hogy az adott alkatrészből hány darab érhető el a raktárban Az alkatrész táblát létrehozó SQL utasítás a következő: create table alkatresz( alk_id varchar2(10) primary key, alk_nev char(50), alk_tipus char(30), alk_ertek char(20), alk_tokozas char(20), alk_raktarkeszlet number(6));
24
3.1. A fejlesztési környezetről Beszállító tábla: azoknak a cégeknek az adatait tárolja, melyektől meg lehet rendelni az alkatrészeket. A tábla mezői: • besz_id : az adott beszállító azonosítója, ID-je • besz_nev : a beszállító cég neve • besz_tel : a beszállító cég telefonszáma • besz_email : a cég email címe • besz_orszag : ország • besz_irszam : irányítószám • besz_varos : város • besz_utca : út, utca • besz_hazszam : házszám • atlszallido : átlagos szállítási idő A beszálító táblát létrehozó SQL utasítás a következő: create table beszallito( besz_id varchar2(10) primary key, besz_nev char(30), besz_tel char(20), besz_email char(30), besz_orszag char(30), besz_irszam char(10), besz_varos char(30), besz_utca char(30), besz_hazszam char(6), atlszallido number(3)); Megrendelés tábla : a folyamatban lévő és a teljesített megrendelések adatait tárolja. A beszállítókat és az általuk beszállított, illetve tőlük megrendelt alkatrészeket a megrendelés tábla "köti össze". Ebben a táblában van tárolva, hogy mely beszállítótól, milyen alkatrészt, milyen mennyiségben rendeltünk, valamint a megrendelés és a beérkezés dátumát is tárolja. A megrendelés tábla idegen kulcs mezői az alkatrészek tábla, illetve a beszállító tábla kulcsmezőire mutatnak. Természetesen egy beszállítótól többféle alkatrészt is rendelhetünk, illetve egyazon típusú alkatrészt is több különböző beszállítótól is rendelhetünk.
25
3.1. A fejlesztési környezetről A tábla mezői: • order_id : az adott megrendelés azonosítója • alk_id : az adott megrendelésben megrendelt alkatrész azonosítóját tartalmazza • besz_nev : az adott megrendelést beszállító cég azonosítóját tartalmazza • mennyiseg : a megrendelt alkatrészek száma • megrendeles_ideje : az a dátum, amikor a megrendelés el lett indítva • teljesites_ideje : az a dátum, amikor az adott megrendelés megérkezett, bevételezve lett A megrendelés táblát létrehozó SQL utasítás: create table megrendeles( order_id varchar2(10) primary key, alk_id references alkatresz, besz_id references beszallito, mennyiseg number(6), megrendeles_ideje DATE, teljesites_ideje DATE); Gyakorlatilag az adatbázisban csupán ezekre a táblákra lesz szükségünk. A továbbiakban az adatok felvitele is a Java alkalmazásból fog történni, illetve a tesztadatok felvitele természetesen az adatbázis-kezelő parancsfelületén is megoldható, ott egyszerre több mintaadatot sokkal gyorsabban lehet felvinni. Amennyiben az adatbázis szolgáltatás fut, és a JRE telepítve van a számítógépen, a rendszer használható. Fontos továbbá megjegyezni, hogy az adatbázis adminisztrációs felületén létre kell hozni a felhasználót, valamint a szükséges jogokat ki kell osztani neki, mint például írási és olvasási jog a szükséges táblákra. A szoftver belépési képernyőjén az adatbázis hozzáféréshez létrehozott felhasználónév és jelszó párost kell használni. A következő fejezetben megismerkedhetünk a szoftver felületével, az egyes funkciók használatával. A funkciók bemutatása során meg fogom mutatni, hogy milyen módszereket használtam bizonyos problémák megoldására.
26
3.2. A program funkciói
3.2. A program funkciói A .jar fájl elindítása után a belépőképernyő jelenik meg. Itt meg kell adnunk a megfelelő felhasználónevet és jelszót.
3.1. ábra. Belépési képernyő Az azonosítás az adatbáziskezelőben létrehozott felhasználónév és jelszó alapján történik. Amennyiben nem megfelelő felhasználónevet vagy jelszót adunk meg, a program azt hibaüzenetben jelzi.
3.2. ábra. Belépési hiba A csatlakozáshoz szükséges metódus a következő: public void Connect(String user,String pass){ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", user,pass); rendben=true; } catch(Exception ex) { rendben = false; } } 27
3.2. A program funkciói Amennyiben minden rendben van, az alkalmazás főmenüjébe jutunk.
3.3. ábra. Főképernyő Innen érhetőek el a funkciócsoportok. Ha valamely ikonra rákattintunk akkor legördülő menü formájában elérhetőek lesznek az almenüpontok.
3.4. ábra. Legördülő menü
3.2.1. Alkatrészek menü Az alkatrészek menü legördíteskor az egyes almenüpontokban lekérdezéseket valósíthatunk meg, továbbá ebben a menüpontban kapott helyet az ID alapján történő keresés. A lekérdezés eredménye táblázatos formában jelenik meg. A táblázat sorainak száma dinamikus, a lekérdezés eredményének megfelelő számú sorból áll. A lekérdezések PreparedStatement-tel történnek, melyben a szükséges paramétereket már futási időben adhatjuk meg. Az ID alapján történő lekérdezést és az eredmények megjelenítését a következőképpen oldottam meg (csak a lényeges részleteket írom le a forráskódból): A táblázat objektumot a DefaultTableModel osztály példányosításával hozzuk létre. A paraméterek a tárolandó adatsorok, illetve az oszlopok nevei. Az oszlopneveket egy string-ben adtam meg. A tárolt adatok természetesen a lekérdezésből jönnek. String columnNames[] = {"Azonosító","Alkatrésznév","Alkatrésztípus", "Alkatrészérték","Tokozás", "Raktárkészlet"};
28
3.2. A program funkciói
DefaultTableModel listTableModel = new DefaultTableModel(rowData, columnNames); JTable table = new JTable(listTableModel ); Megadjuk a táblázat fejlécében szereplő szöveget, illetve megadjuk a táblázat méretét és a háttér színét. setTitle( "A rendszerben lévő alkatrészek" ); setSize( 900, 400 ); setBackground( Color.gray ); A táblázat oszlopainak szélességét igény szerint egyesével meg lehet adni: table.getColumnModel().getColumn(0).setPreferredWidth(120); table.getColumnModel().getColumn(1).setPreferredWidth(300); table.getColumnModel().getColumn(2).setPreferredWidth(200); table.getColumnModel().getColumn(3).setPreferredWidth(100); table.getColumnModel().getColumn(4).setPreferredWidth(100); table.getColumnModel().getColumn(5).setPreferredWidth(100); table.setCellEditor(null); A lekérdezés lépésben meg kell adni a szükséges SQL utasítást, melyet egy string típusú változóban tárolunk. Az utasítás egy szabványos SQL lekérdző utasítás, a "?" karakter helyére fog kerülni a paraméterben kapott érték. Az utasítás első részében adjuk meg, hogy mely táblából mely mezőket szeretnénk lekérdezni, a "WHERE" kulcsszó utáni feltétel pedig megadja, hogy csak az adott azonosítójú ("alk_id"-vel rendelkező) alkatrész adatait szerenénk megtudni. String utasitas = "SELECT alk_id, alk_nev, alk_tipus, alk_ertek, " + "alk_tokozas, alk_raktarkeszlet FROM alkatresz WHERE alk_id LIKE ?"; A következő paranccsal pedig egy PreparedStatement-et hozunk létre, a string alapján. A setString metódussal az "i" változó értékét behelyettesítjük a lekérdezésben a "?" karakter helyére. PreparedStatement s = conn.prepareStatement(utasitas); s.setString(1, i); A lekérdezés eredményeit egy "resultSet" objektumban tudjuk tárolni. ResultSet rs = pstmt.executeQuery(); Az eredmény egy rekordlista lesz, melyet soronként tudunk feldolgozni. A ciklus addig fut, amíg van további feldolgozatlan sor a listában. A megadott utasítás pedig az eredmény táblázatban minden rekord esetén létrehoz egy új sort, amely az adott rekordnak megfelelő adatokat tartalmazza. while(rs.next()){ listTableModel.addRow(new Object[]{rs.getString(1),rs.getString(2), rs.getString(3),rs.getString(4),rs.getString(5), rs.getInt(6)}); } 29
3.2. A program funkciói A menüben a "Keresés ID alapján" opcióra kattintva egy új ablak jelenik meg, ahova beírhatjuk az alkatrész ID-t, amire keresni akarunk.
3.5. ábra. Keresés ID alapján Amennyiben elírtuk az azonosítót, vagy valóban nincsen az adott ID-vel rendelkező alkatrész az adatbázisban, akkor a program lehetőséget ad, hogy új azonosítót adjunk meg, illetve ki is léphetünk a keresés funkcióból.
3.6. ábra. Nincs találat az ID-re Fontos megjegyezni, hogy elődleges kulcs alapján történő kereséskor csak teljes egyezőség esetén fogunk eredményt kapni. Kisbetű, nagybetű különbségekre szintén figyelni kell. Amennyiben megtaláltuk a keresett azonosítónak megfelelő alkatrészt, akkor egy megerősítő ablak ugrik fel az alkatrész nevével, illetve azzal a kérdéssel, hogy szeretnénk-e megnézni az alkatrész további adatait. Ha az igen-re kattintunk, akkor az eredménytáblázatban megjelennek a kért alkatrész adatai, a nem-re kattintva pedig visszalépünk az előző képernyőre.
3.7. ábra. Megerősítés
30
3.2. A program funkciói Egy ilyen kérdést a következő módon lehet megvalósítani: Meg kell adni a válaszlehetőségeket, ezeket string változókkal célszerű megtenni (valasz1, valasz2). Ezek lehetnek statikusak, ekkor a valasz1, valasz2 helyett megadhatjuk a konkrét szöveget is idézőjelek közt, pl. "Igen", "Nem" vagy "Next", "Cancel" és így tovább. Object[] options = {valasz1,valasz2}; Ezután meg kell adni a dialógusablakot, az ablak típusát, a kérdés szövegét és a kérdés fejlécében szereplő szöveget. Ezek szintén lehetnek statikusak is. Egy változót is meg kell adni (a mintában a "resp") melynek értéke attól függ, hogy melyik válaszlehetőséget választottuk. int resp = JOptionPane.showOptionDialog(this, uzenet+nev,uzenet3, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); Végül meg kell adni, hogy mi történjen egy lehetőség kiválasztása után. Az alábbi példában azt akarjuk, hogy a YES_OPTION (az első válaszlehetőség) választása esetén példányosítsuk az "IdKeres" osztályt és a létrejött "i1" objektumpéldányra hívjuk meg a "Keres()" metódust, továbbá a kérdésablak záródjon be. if(resp == JOptionPane.YES_OPTION){ this.setVisible(false); this.dispose(); IdKeres i1 = new IdKeres(u,p); i1.Keres(id); } A lekérés eredménye a táblázatban látható. Mivel elsődleges kulcs alapján kerestünk, természetesen csak egy eredményt fogunk látni. Az oszlopok fejlécében az alkatrész jellemzői láthatók, a cellákban pedig maguk az adatok.
3.8. ábra. A keresés eredménye
31
3.2. A program funkciói Ha az alkatrészek legördülő menüben egy konkrét alkatrésztípust választunk ki, például az "Ellenállás"-t, akkor az összes, a rendszerben lévő ellenállás kilistázódik az eredménytáblázatba.
3.9. ábra. Az ellenállások listája
3.2.2. Adatfelvitel Ebben a menüben az alkatrész táblára vonatkozó, adatmódosító opciók kaptak helyet. Itt lehet új alkatrészt felvinni az adatbázisba, illetve törölni alkatrészt az adatbázisból. Az egyes alkatrészek raktárkészletének manuális módosítására is itt van lehetőség.
3.10. ábra. Legördülő menü Új alkatrész felvitele Az "Új alkatrész" opció választásával egy űrlap jelenik meg, mely sorra kéri a bevinni kívánt alkatrész azonosítóját, nevét, típusát, értékét, tokozását, illetve a kiindulási raktárkészletet az alkatrészből. Az adatok bevitelénél mindegyik mezőt ki kell tölteni megfelelő adatokkal, a raktárkészlet például csak egész szám lehet, ha nem megfelelő értéket adunk meg, akkor azt hibaüzenettel jelzi a program. Amennyiben minden adatot megfelelően adtunk meg, a program ellenőrzi, hogy esetleg nincs-e már a megadottal megegyező ID-jű alkatrész az adatbázisban, ha van, akkor nem engedi felvinni az új alkatrészt. 32
3.2. A program funkciói
3.11. ábra. Új alkatrész felvitele Az új alkatrész felvitele a következőképp történik. A felvinni kívánt adatokat JTextField mezőkben kérjük be, majd a mezők tartalmát változókba másoljuk, illetve ellenőrizzük, hogy minden mező ki lett-e töltve. A következő lépésben az utasítást letároljuk egy string-ben, majd egy PreparedStatementet példányosítunk. String utasitas="INSERT INTO alkatresz VALUES(?,?,?,?,?,?)"; PreparedStatement s = conn.prepareStatement(utasitas); A feltöltendő adatokat a setString, illetve setInt utasításokkal behelyettesítjük. Ekkor az utasításban a kérdőjelek helyére bekerülnek a változókban tárolt adatok. s.setString(1, id); s.setString(2, nev); s.setString(3, tipus); s.setString(4, ertek); s.setString(5, tokozas); s.setInt(6, raktarkeszlet); A statementet lefuttatjuk. ResultSet rs=s.executeQuery(); Végül a statementet és a kapcsolatot is lezárjuk. s.close(); conn.close(); Ha minden megadott érték megfelelő, akkor az új alkatrész bekerül az adatbázisba. Amennyiben viszont hiányosan adjuk meg az adatokat, hibaüzenetet kapunk.
33
3.2. A program funkciói
3.12. ábra. Hiányos adatok Annak az ellenőrzésére, hogy a szöveg tartalmú mezők mind ki vannak-e töltve, a következő egyszerű vizsgálatot használjuk: if (txtid.getText().equals("")||txtnev.getText().equals("") ||txttipus.getText().equals("")||txtertek.getText().equals("") ||txttokozas.getText().equals("")) { JOptionPane.showMessageDialog(null, "Valamelyik mező nincs kitöltve!" ); } Ha a raktárkészlet mezőbe nem egész szám értéket viszünk be, akkor a következő üzenetet kapjuk:
3.13. ábra. Nem megfelelő az érték Ennek a vizsgálatát kivételkezeléssel oldottam meg. Ha a "try" blokkban kivétel keletkezik, akkor biztosan nem egész szám volt megadva a mezőben. try{ raktarkeszlet = Integer.parseInt(txtraktarkeszlet.getText()); } catch (NumberFormatException ne) { JOptionPane.showMessageDialog(null, "A raktárkészlet csak egész szám lehet" } 34
3.2. A program funkciói Alkatrész törlése Az alkatrészek törlése az adatbázisból szintén ID alapján történhet. Az opció kiválasztásakor egy ablak ugrik fel, amely kéri a törölni kívánt alkatrész azonosítóját.
3.14. ábra. Alkatrész törlése A program természetesen itt is jelzi, ha nem létező ID-t adtunk meg. Ha létezik az ID, akkor egy megerősítést kérő ablak jelenik meg, amely az alkatrész nevét is mutatja.
3.15. ábra. Törlés megerősítése A törlés a keresés funkcióhoz hasonlóan "preparedStatement"-tel történik, a bekérő ablak is hasonló a keresés ablakhoz, de természetesen itt eredménytáblázat megjelenítésére nincs szükség. A törlés esetén a statement utasítása a következő: String utasitas="DELETE FROM alkatresz WHERE alk_id LIKE ?"; Fontos megjegyezni, hogy a program egészében az "alkatrész" kifejezés alatt nem egy konkrét darab alkatrészt (például egy darab kondenzátort) értünk , hanem egy konkrét típusú alkatrész teljes készletét. Tehát törlés esetén nem a raktárkészletből törlünk ki egy alkatrészt, hanem az adott típust, minden adatával és a teljes raktárkészletével együtt. Ezt a funkciót akkor kell használni, ha az adott alkatrész már nem lesz többet használatban, megszüntetjük a raktározását. Amennyiben csupán kiadni szeretnénk alkatrészt a gyártósornak például, akkor a raktárkészlet módosítás funkciót kell használni.
35
3.2. A program funkciói Raktárkészlet módosítása Ezzel a funkcióval az adatbázisban már szereplő alkatrészek raktárkészletét módosíthatjuk manuálisan. Ez a funkció alkatrész felhasználás esetén, illetve készletelemzés esetén használatos, ha esetleg a rendszerben lévő mennyiség és a fizikálisan meglévő mennyiság nem egyezik. Esetleges emberi hibából történő téves adatok rögzítése esetén mindenképpen szükség van módosító funkcióra.
3.16. ábra. Raktárkészlet módosítása A funkció megvalósítása itt is hasonló az előzőekhez. Az azonosítót és az új raktárkészlet számot JTextField-ekből olvassuk be. A statement-ben szereplő utasítás pedig a következő: String utasitas="UPDATE alkatresz SET alk_raktarkeszlet=" + "? WHERE alk_id LIKE ?"; Az ID ellenőrzés ennél a funkciónál is megtörténik. Ha megegyezik az adatbázisban tárolt valamely alkatrész Id-jével, és az új raktárkészlet megfelelően van megadva, akkor egy megerősítő ablak jelenik meg az alkatrész nevével.
3.17. ábra. Módosítás megerősítése Ha a megerősítést elfogadjuk, akkor a változtatás rögzül az adatbázisban. A raktárkészletet természetesen nem csak akkor kell változtatni a rendszerben, ha felhasználunk belőle, hanem ha a megrendelt alkatrészeink megérkeznek. A bevételezés során az adatbázist is frissíteni kell.
36
3.2. A program funkciói
3.2.3. Megrendelések Ebben a menüben kaptak helyet a megrendelésekkel kapcsolatos funkciók. Itt tudjuk megnézni, hogy milyen megrendeléseink vannak folyamatban, mely megrendeléseink lettek már teljesítve. Új megrendelés indítására, valamint a beérkezett alkatrészek bevételezésére is van lehetőség.
3.18. ábra. Megrendelések menü A folyamatban lévő és teljesített megrendelések egyazon táblában tárolódnak az adatbázisban, a teljesítés időpontja viszont a folyamatban lévőknél nincs kitöltve. A listázás is ennek a mezőnek a tartalma alapján történik, ha a mező üres, akkor a folyamatban lévők között fog megjelenni, ha ki van töltve, akkor a teljesítettek között. Az "Összes megrendelés" funkcióval minden rendszerben lévő megrendelésünket ki tudjuk listázni, annak állapotától függetlenül.
3.19. ábra. Folyamatban lévő megrendelések A három lekérdezést ( folyamatban lévő, teljesített, összes ) egyazon metódus valósítja meg, a különbség csak a statement-ben küldött utasításban van. A folyamatban lévők lekérdezése esetében a statement a következő: utasitas = "SELECT order_id, alk_id, besz_id, mennyiseg, " + "TO_CHAR(megrendeles_ideje, ’yyyy-mm-dd’) megrendeles_ideje, " + "TO_CHAR(teljesites_ideje, ’yyyy-mm-dd’) teljesites_ideje FROM " + "megrendeles WHERE teljesites_ideje IS NULL"; 37
3.2. A program funkciói A teljesített megrendelések lekérdezésekor: utasitas = "SELECT order_id, alk_id, besz_id, mennyiseg, " + "TO_CHAR(megrendeles_ideje, ’yyyy-mm-dd’) megrendeles_ideje, " + "TO_CHAR(teljesites_ideje, ’yyyy-mm-dd’) teljesites_ideje FROM " + "megrendeles WHERE teljesites_ideje IS NOT NULL "; Ha az összes megrendelést látni szeretnénk: utasitas = "SELECT order_id, alk_id, besz_id, mennyiseg, " + "TO_CHAR(megrendeles_ideje, ’yyyy-mm-dd’) megrendeles_ideje, " + "TO_CHAR(teljesites_ideje, ’yyyy-mm-dd’) teljesites_ideje FROM" + " megrendeles";
Bevételezés Ez a funkció arra alkalmas, hogy az éppen beérkező megrendeléseket lezárjuk. Bevételezés során a "teljesítés ideje" mezőbe bekerül az aktuális dátum, illetve az alkatrész táblában az adott alkatrész raktárkészlete is módosul, a megrendelésben foglalt mennyiség hozzáadódik. A funkció futtatásakor felugrik a folyamatban lévő megrendeléseink táblázata ( mivel azok közül szeretnénk valamelyiket lezárni ), valamint egy másik ablak is, mely a megrendelés ID-jét kéri be a felhasználótól. A korábbiakban bemutatott ID ellenőrzés, illetve megerősítés kérése itt is működik.
3.20. ábra. Bevételezés
38
3.2. A program funkciói Új megrendelés indítása Ahogy a neve is mutatja, ezzel a funkcióval új megrendelést tudunk indítani. A felugró ablakban kell megadni a megrendelés adatait. Fontos megjegyezni, hogy az "Alkatrész ID" és "beszállító ID" mezőbe létező, a táblákban szereplő alkatrészek és beszállítók azonosítóit adjuk meg. A program természetesen ezeket ellenőrzi és kiírja, hogy melyik mező értékével van probléma.
3.21. ábra. Új megrendelés indítása Súgó A súgóban az egyes menüpontok alatt elérhető funkciókat soroltam fel.
39
4. fejezet Összefoglalás A szakdolozatom elméleti részében igyekeztem megismertetni az olvasóval a problémakört, továbbá azt, hogy miképpen lehet egy egyszerű, de jól kezelhető rendszert létrehozni, amely megoldásként szolgálhat. A probléma megértéséhez fontosnak tartottam, hogy az elektronikai gyártási folyamatokat legalább alapvető szinten ismertessem, így az olyan olvasó számára is könnyen érthetővé válik a téma, aki egyébként kevésbé jártas az elektronika világában. Az alkalmazott programnyelv ismertetése szintén fontos szerepet kapott, a dokumentáció részben pedig forráskódrészleteket is adtam meg magyarázattal, mely segíti az egyes funkciók működésének megértését. Az adatmodellek ismertetése szintén fontos egy adatbáziskezelő rendszer működésének megértéséhez. A program létrehozásakor elsősorban az egyetemi évek alatt tanultakra támaszkodtam, de természetesen új ismeretekre is szert kellett tennem. A későbbiekben szeretném a programot továbbfejleszteni, esetlegesen új funkciókkal kibővíteni. A szakdolgozatom kapcsán megismerkedtem raktározási és logiszikai folyamatokkal is, valamint az ezen területeken felmerülő problémákkal, melyek szintén hasznos, új ismeretek voltak számomra. Bízom benne, hogy a szakdolgozatommal felkeltettem a témakör iránt érdeklődő olvasó figyelmét, és segítséget nyújtottam a tárgyalt problémakör átlátásában.
40
Irodalomjegyzék [1] Benkő Tiborné, Tóth Bertalan: Együtt könnyebb a programozás, JAVA, Computerbooks Kiadó, 2007. [2] A Java nyelv története, http://hu.wikibooks.org/wiki/Java_programozás/A_Java_nyelv_története [3] Elek Tibor: A JAVA nyelv, http://www.iit.uni-miskolc.hu/iitweb/opencms/ users/smidl/oktatas/oop/elek_java.pdf [4] Java Database Connectivity (JDBC), https://www.db.bme.hu/sites/default/files/mssql-m3-segedlet.pdf [5] Antal Margit: Java technológiák, http://www.ms.sapientia.ro/ manyi/teaching/java/eloadas10.pdf [6] Java utikalauz, http://java.inf.elte.hu/java-5.0/doc/index.html?elte/ java2_utikalauz5/jdbc/package-summary.html [7] Barabás Péter: Adatbázis rendszerek II., http://www.iit.uni-miskolc.hu/iitweb/export/sites/default/users/ barabas/Targyak/db2/ea5.pdf [8] Java programozási nyelv, http://hu.wikipedia.org/wiki/Java_programozási_nyelv [9] Free Java Course: If-else statements, http://www.homeandlearn.co.uk/java/java_if_else_statements.html [10] Free Java Course: Switch statements, http://www.homeandlearn.co.uk/java/java_switch_statements.html [11] Java loops, http://www.tutorialspoint.com/java/java_loop_control.htm [12] Elöl tesztelő logikai ciklusok, http://tudasbazis.sulinet.hu/hu/informatika/informatika/ informatika-9-12-evfolyam/utasitasok/elol-tesztelo-logikai-ciklusok [13] Nagy Gusztáv: Java programozás, http://nagygusztav.hu/sites/default/files/ csatol/java_programozas_1.3.pdf 41
[14] Java Database Connectivity, http://hu.wikipedia.org/wiki/Java_Database_Connectivity [15] A rendszertől az adatmodellekig, http://tanulnijo.uw.hu/adatbazis/ab_harmadik.html [16] Dr. Kovács László: Adatbázis rendszerek I., http://www.iit.uni-miskolc.hu/iitweb/export/sites/default/ department/labs/iit-szolgaltatasok/www-db/Tantargyak/ AB1/Eloadas-2008-1/ab1-2.pdf [17] The Java Tutorials, http://docs.oracle.com/javase/ tutorial/uiswing/components/dialog.html [18] Alkatrészek ömlesztve ábra, http://www.bercklimited.co.uk/images/ electronic_component_manufacturer_copy.jpg [19] Alkatrészek szétválogatva ábra, http://pimg.tradeindia.com/01784005/b/2/Electrical-Components.jpg [20] Tárolódoboz ellenállásokhoz ábra, http://hackadaycom.files.wordpress.com/2014/02/click-and-see1.jpg
42
Adathordozó használati útmutató Az adathordozón megtalálható a Java program, illetve minden egyéb állomány, ami a szoftver használatához szükséges, valamint a szakdolgozat dokumentum pdf formátumban. A programot 64-bites angol nyelvű Windows 7 operációs rendszer alatt készítettem valamint teszteltem. A gépen telepítve kell lennie a JRE-nek. A program tesztelésekor az 1.7.0_51-b13 verziót telepítettem. Továbbá az Oracle Express Edition-t is fel kell telepíteni, melyből a 10.2.0.1.0 verziószámút használtam. Az Oracle Express telepítésekor kéri, hogy adjunk meg egy jelszót. Ezzel a jelszóval fogjuk elérni a SYSTEM accountot. Ha a telepítés befejeződött, indítsuk el az adatbázis szolgáltatást, az "Oracle Express/Start Database" állomány futtatásával. Ezután indítsuk el a "Go To Database Home Page"-t amivel a webes kezelőfelületre kerülünk. A SYSTEM felhasználónevet és a telepítéskor megadott jelszót írjuk be. Miután beléptünk, az Administration/Database User/Create user funkcióval hozzunk létre egy új felhasználót, és adjunk neki jogokat(CONNECT, RESOURCE, DBA, CREATE TABLE). Ezután lépjünk ki a SYSTEM account-ból és lépjünk be az új felhasználó nevével és jelszavával. A mintaadatok.txt szöveges fájlból az SQL/SQL Commands felületen vigyük be a táblalétrehozó utasításokat, majd a mintaadatok beszúrását is végezzük el. Ezek után a Java alkalmazást indítsuk el, ami a cd melléklet program/dist mappájában található alkatresz_adatbazis.jar néven. Itt szintén az új felhasználó nevével és jelszavával lépjünk be.
43