Egy dinamikus adatbázis megvalósítása egy megrendelő-raktározó alkalmazáson keresztül.



Hasonló dokumentumok
NEPTUN_TÖRZS. (Funkcionális leírás)

Év zárása és nyitása 2015-ről 2016-ra

9. Entitás modulok. Nagy Gusztáv: Drupal 7 alapismeretek Fejlesztői verzió: október 6.

Access adatbázis elérése OLE DB-n keresztül

Diákigazolvány Elektronikus Igénylési Rendszer Oktatási Hivatal által biztosított igénylő felület. Felhasználói kézikönyv. v 4.1

Bevezetés. A WebAccess használatának bemutatása előtt néhány új funkció felsorolása következik:

GroupWise 5.2 használói jegyzet

(a 23/2014 (VI.30) NGM és az azt módosító 2/2015. (II. 3.) NGM rendeletek alapján)

Kari Adminisztrátor. Funkcionális leírás

ETELKA Szolgáltatói Dokumentáció v1.0 RITEK ZRt. 2009

Pozíció épp hol vagyunk Az E-építési napló lépésről lépésre

Készítette: Citynform Informatikai Zrt.

HomeManager - leírás. advix software solutions.

Felhasználói kézikönyv

GroupWise 5.2 használói jegyzet

Szerviz modul felhasználói leírása

MUNKAANYAG. Angyal Krisztián. Szövegszerkesztés. A követelménymodul megnevezése: Korszerű munkaszervezés

NeoCMS tartalommenedzselő szoftver leírása

Általános funkciók partitúrái. Felhasználói dokumentáció verzió 2.0.

Készlet és Számla Kézikönyv

Alkalmazási segédlet a MiniCheck-RA-H festékrétegmérő készülékhez és az ezt támogató MiniCheckForKiv szoftverhez.

MS Access Feladatgyűjtemény

UniPoll Feedback. Intézményi integrált kérdőívkészítő rendszer vélemény és visszajelzés gyűjtéshez.

Poszeidon (EKEIDR) Irat és Dokumentumkezelő rendszer webes felület

Karbantartás. Az ESZR Karbantartás menüjébentudjuk elvégezni az alábbiakat:

NMS közösségi tér a hallgatói weben

Feltételes formázás az Excel 2007-ben

Helpdesk for ArchiCAD felhasználói kézikönyv

Budapest, oldal

ECP. Site Administration System. Felhasználói kézikönyv. v (1. kiadás a és újabb verziójú ECP SAS rendszerekhez)

Szövegszerkesztés Verzió: 0.051


Szövegszerkesztő programok: Jegyzettömb, WordPad, Microsoft Word

Egészségügyi szolgáltatásra való jogosultság ESZJ

ProAnt Felhasználói Útmutató

Markers stratégia építő program leírása

VÁLLALATI ÖNKISZOLGÁLÓ ÜGYFÉLSZOLGÁLAT VERZIÓSZÁM: BEVEZETŐ SZOLGÁLTATÁSOK ÁLTALÁNOS ISMERTETŐ MENÜRENDSZER FOLYAMATOK SZÓTÁR

TANSZÉKI ADMINISZTRÁTOR

E-Fedezetkezelő. felhasználói kézikönyv. Fővállalkozói adminisztrátorok számára

CellCom. Szoftver leírás

Kitöltési Útmutató a évi HOP monitoring adatszolgáltatás elektronikus kitöltéséhez január 21. verziószám: 01

EPeR 1. RENDSZERKÖVETELMÉNYEK. Egészségpénztári E számla kezelő Rendszer Felhasználói leírás

CONDOR. Felhasználói Leírás

Az anyagdefiníciók szerepe és használata az Architectural Desktop programban

I. WEB GIT 2 használata. II. Keresés Modell szerint

AXEL Számlázó és készletnyilvántartó program

Használati útmutató gyi és gyb állományok importálásához

14.Cellaformátum. XVII. Az Excel XP Igazítás Igazítás ikonokkal

Közoktatási Statisztika Tájékoztató 2012/2013. Használati útmutató

ORPHEUS. Felhasználói kézikönyv. C o p y r i g h t : V a r g a B a l á z s Oldal: 1

Technikai segédlet a Domus elektronikus pályázati rendszer felhasználói részére

A program els indítása Mikor el ször futtatjuk a nyilvántartó programot, az alábbi párbeszédablakkal találkozunk.

2.0 verzió. vényíró és gyógyszerinformációs szoftver szakrendelők, kórházi ambulanciák részére. Felhasználói kézikönyv

Borkereskedő. Dokumentáció a Programozási módszertan elmélete című tárgy beadandó programjához. Magyar Attila mattila@inf.elte.hu

Első Magyarországi Szoftvertesztelő Verseny Döntő feladatsor

Digitális terepmodell modul

WEBEC FELHASZNÁLÓI KÉZIKÖNYV

Vizuális programozás gyakorlat

Tanulmányi eredmények kommunikációs rendszere

Horgász Napló V Bemutató Verzió. Felhasználói Kézikönyv. Intelligens Fogási Napló Program

Kötegelt nyomtatványok kezelése a java-s nyomtatványkitöltő programban (pl.: 1044 kötegelt nyomtatvány - HIPA; 10ELEKAFA - Elekáfa)

Készítette:

Aronic Road Útnyilvántartó program

NETFIT modul Tanári felület Felhasználói útmutató. Magyar Diáksport Szövetség

OptiJUS. Opten, Tartalomjegyzék

ETR Hallgatói webes alkalmazás

Spike Trade napló_1.1 használati útmutató

SEGÉDLET ELEKTRONIKUS FELÜLET HASZNÁLATÁHOZ. EMVA Monitoring adatszolgáltatás

ÓRAREND SZERKESZTÉS. Felhasználói dokumentáció verzió 2.1. Budapest, 2009.

FELHASZNÁLÓI KÉZIKÖNYV MAGYARORSZÁGI ADDIKTOLÓGIAI ELLÁTÁSOK PORTÁLJA

edia 2.2 Kézikönyv feladatfelvitelhez Diagnosztikus mérések fejlesztése Készítette: Molnár Gyöngyvér Papp Zoltán Makay Géza Ancsin Gábor

BAUSFT. Pécsvárad Kft Pécsvárad, Pécsi út 49. Tel/Fax: 72/ ISO-bau. Szigetelés kiválasztó verzió.

Felhasználói kézikönyv HostLogic SAP EKAER 1.0 megoldáshoz

Adatbázisok* tulajdonságai

Közzététel és Adatszolgáltatás IT tudatosság projekt

1.) A költségvetési bértámogatás megállapítása, számfejtése

Rovás segéd 1.8. Segédalkalmazás szövegek (át)rovásához

Blonde. Szépségszalon, Szolárium, Spa, Fitness. Ügyviteli Rendszer. Funkcionális Specifikáció. Verzió 1.1

Az Egálnet Honlapvarázsló használati útmutatója

Kezdeti Útmutató a Szolgáltatáselemző Rendszer használatához. vezetők számára. Tartalom

Számlázás: - Számlázás/Számlakészítés: xml importtal fogadható adatok bővítése.

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

BMX-W ver. 1.0 Kezelői útmutató

elektronikus kitöltés és benyújtás

Részvételi regisztráció támogatása a tanfolyamszervező saját weboldalán

KR TITKOSÍTÓ PROGRAM. Felhasználói leírás. v március 12.

Tisztelt Ügyfelünk! Cégek / Cég törzsadatai / Cég törzsadatainak módosítása / TB fül

TANSZÉKI ADMINISZTRÁTOR

7. gyakorlat Tervlapok készítése, a terv elektronikus publikálása

7. Előadás. Makrók alkalmazása. Salamon Júlia. Előadás I. éves mérnök hallgatók számára

DIÁKIGAZOLVÁNY. Felhasználói dokumentáció verzió 3.7. Budapest, 2015.

OPTEN Online használati útmutató

4. Gyakorlat ellenőrzött osztályozás

Nógrádi PC Suli tanfolyami jegyzete! Kinyomtatni, másolni, sokszorosítani tilos! Kereskedelmi forgalomba nem hozható! TANFOLYAMI JEGYZET

MaBe-Szoft Számítástechnikai Kft Nyíregyháza, Ér utca 13.sz. Tel.: (42) Kezelői leírás a Windows-os.

Gyermektartásdíj megelőlegezése GYT

KID verzióváltás Felhasználói kézikönyv

Informatikai tevékenység 2234 Maglód, Széchenyi u Mérnöki, tanácsadói tevékenység Iroda: Mobil: Telefon:

FELHASZNÁLÓI LEÍRÁS a DIMSQL Integrált Számviteli Rendszer Mérleg moduljának használatához

Welcome3 Bele pteto rendszer

Átírás:

Eötvös Lóránt Tudományegyetem Informatikai kar Egy dinamikus adatbázis megvalósítása egy megrendelő-raktározó alkalmazáson keresztül. szerző: Nemes András Programtervező Informatikus nappali tagozat. témavezető: dr. Hajas Csilla Budapest, 2008.

Tartalomjegyzék 1. Bevezető...3 2. Felhasználói dokumentáció...4 2.1 Bevezetés...4 2.2 Menürendszer...4 2.3 Alkalmazás funkcióinak bemutatása...6 2.3.1 Dolgozók megadása....6 2.3.2 Új megrendelés létrehozása....7 2.3.3 Megrendelések szerkesztése....11 2.3.4 Adminisztrációs adatok lekérése....12 2.3.5 Alkalmazás beállításai....13 2.3.6 Táblakarbantartások:...14 2.3.6.1 Raktárállapot frissítés:...14 2.3.6.2 Termékek tábla karbantartása:...15 2.3.6.3 Termék csoportok tábla karbantartása:...16 2.3.6.4 Összetevők tábla karbantartása:...17 2.3.6.5 Dolgozók tábla karbantartása:...18 2.3.6.6 Helyiségek tábla karbantartása:...19 2.3.6.7 Utcanevek megadása:...20 2.3.6.8 Felhasználók tábla karbantartása:...21 2.3.6.9 Beállítások:...22 3. Fejlesztői dokumentáció...23 3.1 Feladat specifikációja...23 3.1.1 Követelmények...23 3.2 Felhasznált módszerek...24 3.2.1 SQLite...24 3.2.2 System.Data.SQLite.dll...24 3.3 Felhasznált adatbázis leírása....24 3.3.1 Táblák neve és leírása:...26 3.4 Saját osztályok:...27 3.4.1 MyTableAdapter : Ienumerable...28 3.4.2 MyOrderListItem...31 3.4.3 MyNumericUpdown saját vezérlő elem...31 3.5 Az alkalmázás által használt ablakok....32 3.5.1 MainForm ablak...32 3.5.2 DarabszamValaszto ablak...40 3.5.3 CostumizeOrder ablak...41 3.5.4 HalfProductForm ablak...43 3.5.5 OrderDetails ablak...44 3.5.6 VirtualQWERTZ ablak...46 3.5.7 SelectForm ablak...48 3.5.8 OptionsForm ablak...49 3.5.9 WarningForm ablak...51 3.5.10 LoginForm ablak...52 3.5.11 TableManageForm ablak...53 3.6 Tesztelések...58 4 Összefoglalás...59 5 Irodalomjegyzék...59 3

1. Bevezető Mint a címben is látszik egy dinamikus adatbázist használó alkalmazás megvalósítását írja le a dolgozat. De mi lehet egy adatbázisban dinamikus, amikor az összes adatbázis dinamikus? Jelen esetben az, hogy az alkalmazás futásidőben módosítja a maga alatt lévő adatbázis sémáját. Ez kicsit olyan mintha magunk alatt vágnánk a fát és a megvalósítás során gyakran kiderült, hogy ez tényleg így van. Emiatt a adatséma változtatás miatt nem használhattam a C# nyelv beépített DataSet és TableAdapter osztályát ezért saját TableAdapter-t készítettem és SQLite alapú adatbázist használok a megvalósítás során. Nem sikerült megvalósítani egy funkciót, nevezetesen a táblakarbantartás ablakban az összetevő résztelek törlését, mert mint utólag kiderült az SQLite3-ba még nincs implementálva az oszloptörlés. Mivel ha egy összetevőt törlünk, akkor egy oszlopot is törölnünk kell a termék összetevők táblából. Ezért ott a törlésgomb megnyomásával egy üzenetet kapunk amit az SQLite fejlesztői oldaláról másoltam be, melynek lényeg, hogy nincs jelenleg implementálva a kért művelet. 4

2. Felhasználói dokumentáció 2. Bevezetés A programhoz szükséges egy SzakdogaSettings.settings fájl megléte, amit a beállításokat tartalmazza. Továbbá egy.db kiterjesztésű fájl ami SQLite típusú adatbázis. Valamint az első használathoz létre kell hoznunk.street kiterjesztésű fájlokat amik sima karakteres fájlok, aminek a felépítése: minden sorban egy utcanév. A program egy pizzéria megrendeléseit kezeli, valamit vezeti az aktuális raktárállapotot. A program lehetőséget ad az adatbázis karbantartására, így bármikor változtathatunk az árakon, a neveken az összetevőkön és sok minden máson. Ez a dokumentáció leírja ennek a programnak a lehetőségeit, működtetését és esetleges magyarázatot adhat arra, hogy miért teszi azt amit tesz. 2.2 Menürendszer Ha elindítjuk a programot akkor egy ablakot kapunk, melyen a menürendszert piros téglalappal ábrázolt területen van. Ezekkel a gombokkal navigálhatunk a programban: gombot megnyomva kapjuk meg azt a kezelőfelületet ahol az aktuális megrendeléshez tudunk termékeket adni. 5

gombot megnyomva kapjuk meg azt a kezelőfelületet ahol az aznap bevitt megrendeléseket nézhetjük, szerkeszthetjük, törölhetjük. gombot megnyomva nézhetjük meg az összetevők aktuális mennyiségét és egyúttal látjuk azt is, hogy még hány adagra lehet szétosztani az adott összetevőt. gombot megnyomva statisztikákat érhetünk el az aktuálisan kiválasztott szakács és futár teljesítményéről. gombot megnyomva kapjuk meg azt a kezelőfelületet ahol megadhatjuk az éppen dolgozók nevét egy listából. gombot megnyomva kapjuk meg azt a kezelőfelületet ahol beállíthatjuk az alkalmazás külalakját. gombot megnyomva kapjuk meg azt a kezelőfelületet ahol az adatbázisban eszközölhetünk változtatásokat. Ezt a menüpontot csak felhasználói név és jelszó megadása után érhetjük el! 6

2.3 Alkalmazás funkcióinak bemutatása 2.3.1 Dolgozók megadása. A program napi első indítását érdemes ezzel kezdeni, nehogy az előzőnap dolgozók adatai legyenek rögzítve a megrendelésekben. Ezt a következőképp tehetjük meg. A gombra kattintva a következő felületet kapjuk.: A pirossal jelölt gombokkal adhatjuk meg értelemszerűen a szakácsot és a futárt. A gombokra kattintva egy ablakot kapunk a választási lehetőségekkel. Például egy ilyen ablakot: Az itt megadott névvel kicseréli a főablakon a nevet, hogy bármikor lássuk, hogy ki az aktuális szakács és futár. Ezt az opciót akármikor használhatjuk, ezért ha munkaidő közben történik a váltás csak itt kell átállítanunk a dolgozót és folytathatjuk a megrendelés felvételt. 7

2.3.2 Új megrendelés létrehozása. Új megrendelésnél először a termékeket kell megadnunk. Ezt a képen látható felületen tehetjük meg. Először válasszuk ki a csoportok közül a termék csoportját (piros négyzet), majd a termékek közül adjuk meg a kért terméket (zöld négyzet). Amit megnyomtunk egy termék gombot egy darabszám választó ablakot fogunk kapni, ahol megadhatjuk a darabszámot (piros négyzet) majd a Ok gombbal (zöld négyzet) berakjuk az aktuális megrendelések listába. Ha később egy már megadott termékből többet akarunk rendelni egy megrendelésen beül azt a listából kiválasztva újra megkapjuk a darabszámválasztó ablakot és ott beállíthatjuk az új darabszámot. Esetleg kikereshetjük a termékek között és az újra feljövő ablakban megadott darabszámot hozzáadja a listában lévőhöz. 8

Ha törölni szeretnénk valamit a listából akkor válasszuk ki a listaelemet és a feljövő darabszámválasztó ablakon nyomjuk meg a törlés gombot. Ekkor a termék kikerül a listából. Ha esetleg véletlenül nyomjuk választunk ki egy listaelemet akkor a mégsem gombbal bezárhatjuk a feljövő ablakot. Ha egy pizzára mondjuk dupla feltétet kérnek akkor ezt a darabszámválasztó ablak egyedivé tétel gombjával állíthatjuk be. A feljövő ablakban a plusz/mínusz gombokkal adhatunk rá vagy vehetünk le róla egy-egy adagot az összetevőkből. Ezt az ablakot az OK gomb megnyomásával zárhatjuk be. Ha felezett pizzát szeretnénk rendelni akkor a megrendelő felületen a Fél pizza gombra kattintva megadhatjuk a kétféle pizzát. Először az egyik fél gombra kattintva válasszuk ki az egyik pizzát, majd a másik fél gombra kattintva a másikféle pizzát ha ezzel megvagyunk az OK gombbal kattintva már be is raktuk az egyedi pizzát az aktuális megrendelések listába. Ha esetleg rossz felet választunk elsőre akkor a gomb újra megnyomásával lehetőségünk van újra megadni az elrontott felet. Ha minden terméket felvettünk akkor a Megrendel gombbal megadhatjuk a megrendelő adatait és a megrendelés módját. A következő ablakot kapjuk: 9

Az első sorban lévő gombokkal adhatjuk meg a megrendelés módját. Az időpont megadása gombra kattintva megjelenik a 3 időpont beállító elem. Ezeken gyorsan beállíthatjuk az órát és a percet. A többi 3 sor csak a kiszállítás mód kiválasztásánál látható. A helyiség megadása egy ablakot fog megjeleníteni ahol a helyiséget választhatjuk ki. A kíván helyiség megadás után bezáródik az ablak. Ezután az utca megadás gombot megnyomva a következő virtuális billentyűzetet kapjuk. 10

Itt kezdjük el gépelni a megfelelő betűgombok megnyomásával az utca nevét. Látni fogjuk, hogy a gombok alatt lévő listában megjelennek a begépelt szöveggel kezdődő utcanevek. Addig írjuk az utca nevét amíg az meg nem jelenik a listában, ekkor kattintsunk a listában a kívánt utcára, mert különben nem enged tovább az alkalmazás. Ezután a házszámot egy hasonló ablakban adhatjuk meg. A gyorsabb megadást e / az Emelet: és a Szoba gombok segítik. OK gombbal véglegesíthetjük a megadott házszámot. A megrendelés leadása gombbal zárhatjuk be az ablakot és kezdhetjük meg egy újabb megrendelés felvételét. A mégsem gombbal visszatérünk a megrendelés felvevő kezelőfelülethez. Természetesen, ha elrontunk valamit a gombok újra megnyomásával újra megadhatjuk az értékeket. 11

2.3.3 Megrendelések szerkesztése. A megrendelések szerkesztését a következő felületen tehetjük meg. Itt két listát találunk, az egyikben az aktuális napon leadott megrendelések ideje, megrendelés módja és ha kiszállítás akkor a szállítási cím látható. A másikban a kiválasztott megrendeléshez tartozó termékek. Ha a termékek alatti szerkesztés gombra kattintunk akkor az új megrendelés felvevő felületet fogjuk megkapni, azzal a különbséggel, hogy most az aktuális megrendelés lista fel lesz töltve a kiválasztott megrendeléshez tartozó adatokkal. Ezeken változtathatunk ugyan azon a módon ahogy mit ha egy új megrendelést adnánk le. A Leadás gombra kattintva viszont a napi megrendelések felülethez térünk vissza ahol egyből meg is nézhetjük a módosításokat. Ha a megrendelés adatai alatt lévő szerkesztés gombra kattintunk akkor az az ablak jön fel ahol a kiválasztott megrendelés adatait adtuk meg, csak most ki lesznek töltve az adatok a kiválasztott megrendelés alapján. Ha itt a megrendelés leadása gombra kattintunk akkor visszatérünk a napi megrendelésekhez és máris látjuk a módosított adatokat. A törlés gomb megnyomásával egy figyelmeztető ablakot kapunk: Ha az OK gombra kattintunk akkor a megrendelés VÉGLEGESEN törlődni fog! A mégsem gombbal visszavonhatjuk a törlés kérését. 12

2.3.4 Adminisztrációs adatok lekérése. A következő ablakon egyszerűen kaphatunk statisztikai adatokat: Válasszuk ki a kért dátumot a naptárból, eztán az OK gombot megnyomva máris leolvashatjuk a statisztikai és fizetéskiszámítást segítő adatokat. 13

2.3.5 Alkalmazás beállításai. Az alkalmazás beállításai a következő ablakon tehetjük meg: Itt értelemszerűen a feltüntetett érték melletti gombra kattintva egy megfelelő szív vagy betűtípus választó felületet kapunk. Az itt beállított értékeket a Változtatások mentése gombbal véglegesíthetjük. Egy-két változtatás csak a KÖVETKEZŐ programindításkor fog érvénybe lépni, ezért ajánlott egyből újraindítani az alkalmazást. 14

2.3.6 Táblakarbantartások: Ez a funkció csak jelszóval érhető el! A kapott felületen a fülek-re kattintva érhetjük el a fülön megnevezett táblát. 2.3.6.1 Raktárállapot frissítés: Ha teljesen módosítani akarjuk egy adott összetevő értékét akkor a bal oldalt lévő Megnevezés feliratú legördülő menüből válasszuk ki a módosítani kíván terméket. Ezután a mennyiség feliratú szám mezőbe gépeljük be az új mennyiséget. A változtatás a módosít gomb megnyomásával fog életbe lépni. Viszont ha egy összetevőből új készlet érkezik a raktárba akkor válasszuk ki a listából az adott összetevőt majd a szám mezőbe írjuk be azt a mennyiséget amivel növelni szeretnénk a raktárkészletet (csökkentés esetén mínusz számot írjunk) Majd a hozzáad gombbal módosíthatjuk az aktuális készletet. A mégsem gombbal az éppen beírt adatokat törölhetjük ki a beviteli mezőkből. 15

2.3.6.2 Termékek tábla karbantartása: A termékek fül kiválasztásával a következő felületet kapjuk: Ha új terméket akarunk az étlapra tenni akkor a termék azonosítóval jelölt mezőbe írjuk be egy addig még nem szereplő maximum 5 karakterből álló azonosítót. Ha itt olyat adunk meg ami már egy létező azonosító akkor a program egy hibaüzenetet fog adni, az ok gombot megnyomva visszakapjuk a vezérlést és lehetőséget kapunk egy új azonosító megadására. Ezután az étlapban szereplő nevét kell beírnunk a termék névvel jelölt szöveg mezőbe. A termékcsoportot egy legördülő menüből választhatjuk ki így nem adhatunk meg olyan csoportot ami nem is létezik. Az itt megadott csoporttól függ, hogy amikor új megrendelést veszünk fel akkor melyik csoport gombot kell megnyomnunk, hogy megtaláljuk a kíván terméket. Ezután az ár számmezőbe adjuk meg a fogyasztási árat. A megjelenik a listában értéket állítsuk igen-re ha azt szeretnénk, hogy a felvett terméket a program megjelenítse a választható termékek közt amikor új megrendelést veszünk fel. Majd az egyedivé tehető mezőt állítsuk igen-re ha olyan a termék aminek az összetevőin lehet módosítani, nem-re ha olyan aminek nem lehet (pl. üdítő, cigaretta). Ezek után nyomjuk meg a termék felvétele gombot. Ha egy mezőt rosszul töltöttünk ki akkor nem fog semmi sem történni, egyébként bekerül a listába. Ha egy meglévő termék adatait akarjuk módosítani akkor válasszuk ki a kívánt terméket a listából, majd oldalt módosíthatjuk az adatait. Ha el akarjuk menteni a változtatásokat akkor a termék módosítása gombara kattintva máris frissül a listánk az új adatokkal. Ha egy terméket le akarunk venni az étlapról, akkor csak ki kell keresünk a listából és a törlés gombot megnyomva tehetjük meg ezt. Előtte kapunk egy figyelmeztetést, hogy biztosan ki akarjuke törölni a terméket. Egy új vagy egy létező termék feltéteinek megadására az összetevők megadása gomb ad lehetőséget. Itt az már ismert módon állíthatjuk be, hogy mely összetevőkből, hány adag szükséges az adott termék előállításához. 16

2.3.6.3 Termék csoportok tábla karbantartása: A termékcsoportokat a következő kezelőfelületen tudjuk karbantartani: Ha új csoportot akarunk létrehozni akkor egy olyan szám azonosítót kell választanunk amihez még nem tartozik egy termék csoport sem, különben hibaüzenetet fogunk kapni. A csoport név megadása után kattintsunk a csoport hozzáadása gombra és máris frissül a listánk az új csoporttal. Ha egy létező csoport nevét akarjuk megváltoztatni, akkor keressük ki a kíván csoport a listából majd változtassuk meg a nevét a szövegmezőben és kattintsunk a csoport módosítása gombra. Ha törölni szeretnénk, akkor válasszuk ki a törlendő csoportot a listából és nyomjuk meg a törlés gombot. VIGYÁZAT! Ha egy csoportot törlünk akkor az összes ilyen csoporttal rendelkező termék is törlődni fog!!! 17

2.3.6.4 Összetevők tábla karbantartása: Az összetevőket a következő felületen tudjuk karbantartani: Ha új összetevőt akarunk felvenni, akkor ki kell töltenünk a megfelelő mezőket. Majd az új összetevők gombra kattintva felvehetjük a listába, ha egy mezőt nem töltünk ki akkor nem történik semmi. Ha viszont olyan összetevőt írunk be ami már létezik akkor hibaüzenetet kapunk. Amikor sikeresen felvesszük a listába akkor automatikusan megjelenik a raktár táblában és a termék összetevők közt is. Ha már vettünk fel termékeket akkor azoknál az új összetevőből felhasznált mennyisége 0 egység lesz. Ha módosítani akarunk akkor válasszuk ki a listából a módosítani kívánt összetevőt és beviteli mezőkbe állítsuk be a módosítani kívánt értékeket, majd nyomjuk meg az összetevők módosítása gombot. A törlés gomb jelenleg nincs megvalósítva (A dolgozat bevezetőjében említett okok miatt). 18

2.3.6.5 Dolgozók tábla karbantartása: Az dolgozók adatait a következő felületen tudjuk karbantartani: Ha új dolgozót akarunk felvenni, akkor ki kell töltenünk a megfelelő mezőket. Majd a felvesz gombra kattintva felvehetjük a listába, ha egy mezőt nem töltünk ki akkor nem történik semmi. Ha viszont olyan azonosítót adunk meg már létezik, akkor hibaüzenetet kapunk. A munkakört egy legördülő listából választhatjuk ki, így kerülve el a nem létező munkakör megadását. Ha módosítani akarunk akkor válasszuk ki a listából a módosítani kívánt dolgozót és a beviteli mezőkbe állítsuk be a módosítani kívánt értékeket, majd nyomjuk meg a módosít gombot. Ha törölni szeretnénk egy dolgozót akkor válasszuk ki a listából a törölni kíván alkalmazott adatait és nyomjuk meg a törlés gombot. Ha tényleg törlés a szándékunk akkor nyomjuk meg az OK gombot a figyelmeztetés ablakában. 19

2.3.6.6 Helyiségek tábla karbantartása: Az helyiségeket a következő felületen tudjuk karbantartani: Ha új helyiséget akarunk felvenni, akkor ki kell töltenünk a megfelelő mezőket. Majd a felvesz gombra kattintva felvehetjük a listába, ha egy mezőt nem töltünk ki akkor nem történik semmi. Ha viszont olyan azonosítót adunk meg már létezik akkor hibaüzenetet kapunk. Ha módosítani akarunk akkor válasszuk ki a listából a módosítani kívánt helyiséget és a beviteli mezőkbe állítsuk be a módosítani kívánt értékeket, majd nyomjuk meg a módosít gombot. Ha törölni szeretnénk egy helyiséget akkor válasszuk ki a listából a törölni kíván helyiséget és nyomjuk meg a törlés gombot. Ha tényleg törlés a szándékunk akkor nyomjuk meg az OK gombot a figyelmeztetés ablakában. FIGYELEM! Egy helyiség törlésével kitörlünk minden olyan utcát ami ehhez a helyiséghez volt rendelve!!! 20

2.3.6.7 Utcanevek megadása: Az utcaneveket a következő felületen tudjuk feltölteni.street kiterjesztésű fájlból: Utcák megadásánál ki kell választani a lenyíló menüből azt a helyiséget amihez az utcák fognak tartozni. Majd meg kell adunk az elérési utat, vagy egyszerűbben a tallóz gombra kattintva egy fájlbekérő ablakot kapunk ami csak a megfelelő kiterjesztésű fájlokat fogja elfogadni. Ha ez megvan akkor az utcanevek felvételének indítása gombra kattintva felvehetjük az adatbázisba az utcákat. A fájl egy egyszerű karakteres fájl amit jegyzet tömbbel is szerkeszthetünk. Példa egy ilyen fájl tartalmára: 21

2.3.6.8 Felhasználók tábla karbantartása: Az felhasználók nevét és jelszavát a következő felületen tudjuk karbantartani: Ha új felhasználót akarunk felvenni, akkor ki kell töltenünk a megfelelő mezőket. Majd a felvesz gombra kattintva felvehetjük a listába, ha egy mezőt nem töltünk ki akkor nem történik semmi. Ha viszont olyan azonosítót adunk meg már létezik akkor hibaüzenetet kapunk. Ha módosítani akarunk akkor válasszuk ki a listából a módosítani kívánt felhasználót és a beviteli mezőkbe állítsuk be a módosítani kívánt értékeket, majd nyomjuk meg a módosít gombot. Ha törölni szeretnénk egy felhasználót akkor válasszuk ki a listából a törölni kíván felhasználót és nyomjuk meg a törlés gombot. Ha tényleg törlés a szándékunk akkor nyomjuk meg az OK gombot a figyelmeztetés ablakában. FIGYELEM! Nem törölhetünk minden felhasználót mert akkor nem léphetnénk be többet a karbantartások menübe. Ezért ha már csak egy falhasználó van a listában a törlés gomb nem lesz engedélyezve. 22

2.3.6.9 Beállítások: A jelszóval fontosabb beállítások itt kaptak helyet, mivel ez a felület jelszóval védett: Itt beállíthatjuk a béreket, és azt, hogy mekkora a még elkészíthető darabszám esetén küldjön figyelmeztetést a fogyóban lévő összetevőkről. A változtatások mentése gombbal lehet ezeket jóváhagyni. 23

3. Fejlesztői dokumentáció 3.1 Feladat specifikációja A program egy pizzéria számára készült, ahol lehet helyben fogyasztani, elvitelre kérni és házhoz szállítani a megrendelt termékeket. Mivel ez egy kocsma is egyben ezért a pincér szerepét is a pultos tölti be ezért a pincér bérezésével és nyilvántartásával nem kell foglalkoznunk. A szakács és a futár az alapbéren felül jutalékot kap minden egyes a pizzériában készült termék előállításáért és kiszállításáért. A programot a főleg a telefonon érkezett megrendelések felvételéhez fogják használni párhuzamosan a megrendelés felvételével. Ezért olyan felhasználói interface-t kellett létrehozni ami lehetővé tesz a gyors és roppant egyszerű rendelésfelvételét. Ezt érintőképernyő használatával kívánják megvalósítani ezért az alkalmazást felületét is erre kell kioptimalizálni. Tehát sehol sem alkalmazhatunk szövegmezőket vagy ComboBox-okat az alkalmazás azon felületein amiket gyakran használnak. Ezért például minden egyes választható termék egy nagyobb gombbal tüntessünk fel és a megnyomásával egyből kerüljön be az aktuális megrendelések listájába. Az utcanevek megadása elkerülhetetlen ezért ezt egy virtuális billentyűzettel oldjuk meg, mely a begépelt utcanevet folyamatosan keresi az adatbázisban és az aktuális találatokat egy listába jelenítse meg. Így nem kell csak átlag 2-3 betűt begépelnünk, hogy a listában felkerüljön a keresett utcanév. A programnak továbbá biztosítani kell beállítások menüt ahol a program egyszínűségén változtathat kedve szerint, ezzel barátságosabbá téve a felületet. 3.1.1 Követelmények Az alkalmazás ismerje fel egy esetleges adatbázis helyváltozást vagy frissítést. A programnak többféle termékcsoportot kell kezelni mivel gyakran kérnek a házhoz szállítás mellé nem a pizzériában előállított termékeket, mint például cigarettát és üdítőitalokat. Az alkalmazásnak lehetőséget kell nyújtani a termékek egyedivé tételéhez. Például ha valaki dupla feltétet kér a pizzájára. Az így kialakult egyedi termékeknek ki kell számolni az árát és felvenni az adatbázisba, hogy később nyilván lehessen tartani, esetleg új pizzafajták kitalálásához nyújt segítséget. Az egyedivé tétel során a programnak fel kell ismerni ha a létrehozott egyedi termék már egy létező termék és az így kapott terméket ki kell javítani az aktuális megrendelések listájában. Lehetőséget kell nyújtania fél pizzák definiálására is mivel gyakran kérnek ilyen típusú megrendeléseket, főleg családi pizzák esetén. Ezek egyedivé tételével nem kell foglalkoznunk, mivel erre a pizzéria nem ad lehetőséget. Fél pizzák megrendelésekor figyelembe kell venni, hogy nem minden összetevőt felezik meg. Ezért hiába, hogy elméletileg fél adag kéne egy összetevőből attól még teljes adagot tesznek rá. A tulajdonosnak biztosítani kell egy felületet ahol megváltoztathatja az adatbázisban szereplő adatokat, erre persze a csak megfelelő felhasználó azonosítás után kerülhet sor. Az alkalmazás ne adjon lehetőséget esetleges adatbázis konzisztenciák kialakulására. A programnak lehetőséget kell biztosítani az éppen aktuális napi megrendelések módosítására, ugyanazon a kezelőfelületen ahol az új rendelést veszik fel ezzel segítve a megrendelés felvevőt az eligazodásban. Figyelnie kell az aktuális raktárállapotot és jeleznie kell ha egy összetevőből elkészíthető adagszám az előre megadott szint alá süllyed. Adminisztrációs adatokkal kell hogy segítse a tulajdonost a jutalékok kiszámításánál. Napi, heti és havi bontásban. Az éppen aktuális szakács és futár a munkaidő közben is változtatható legyen. 24

Beállítások elmentése és következő indításkor a való visszatöltése. 3.2 Felhasznált módszerek 3.2.1 SQLite Az SQLite egy adatbázis-motor nélküli adatbázis. Gyakran használják webes alkalmazásokhoz, mivel kompatibilis többek között a PHP, JAVA, C++ és a C# nyelvekkel. Maga az adatbázisunk egy darab.db kiterjesztésű fájl amit egy letölthető sqlite3.exe nevű konzolos alkalmazással menedzselhetünk a megszokott SQL parancsok segítségével. Ereje és népszerűsége az egyszerűségében és hordozhatóságában van. Gép és operációs rendszerfüggetlenségével tökéletes a weboldalak adatbázisához és kisebb alkalmazásokhoz. Én is az egyszerűsége miatt választottam és főleg a MSSQL nehézkes hordozhatósága miatt, és persze azért is mert ha később az alkalmazást kibővítik egy internetes megrendelő-felülettel akkor nagyszerűen használható a már meglévő adatbázisunk és a már meglévő programunkat kiegészítve figyelhetjük a net-es megrendeléseket. 3.2.2 System.Data.SQLite.dll Ezt a dinamikus könyvtárat használtam a fejlesztés során. Ebben a már ismert a.net rendszerben bennlévő System.Data.Sql állomány típusai és függvényei vannak megvalósítva SQLite adatbázisok fejlesztéséhez. Ezt főleg a MyTableAdapter osztályomban használom fel és az adminisztrációs lekérdezésekben. Legtöbbször a SQLiteConnection(string ConnectionString) típust amit egy kapcsolatot teremt a ConnectionString-ben megadott SQLite típusú adatbázissal. Valamint SQLiteCommand típust amiben SQL lekérdezéseket definiálhatunk és hajthatunk vége az adatbázison. Végül a SQLiteDataReader típust ami az SQLiteCommand által végrehajtott parancs eredményén tud soronként végigmenni. 3.3 Felhasznált adatbázis leírása. Mivel az SQLite nem ad lehetőséget az idegenkulcsok alkalmazására ezért nem is használhattam az adatbázis tervezése és megvalósítás során. Ez látszik is az egyedkapcsolati diagramon: 25

26

3.3.1 Táblák neve és leírása: termek_csoport : termék csoportok és a hozzájuk tartozó azonosítók. termekek: étlapon szereplő és később az egyedivé tételből származó termékek. osszetevö_részlet: termékek összeállításában használt összetevők. aktualisraktarkeszlet: Ebben vezetjük a raktár állapotot, ezt mindig módosítanunk kell minden legyártott termék után. dolgozok: dolgozók adatai és beosztása. helyisegek: azoknak a városoknak/településeknek a nevei ahová a pizzéria kiszállít. helyisegek_utcak: az utcák felsorolva a hozzájuk tartozó településekkel. megrendelesek: a rendelések adatai, kiszállításnál a cím és a rendelést végrehajtó dolgozók megr_reszlet: egy megrendelésen belüli termékek és darabszámaik termek_osszetevok: a termékek összetevő az oszlopok és szorzókat tárolunk bennük, ha például valamire dupla sajtot kérnek az 2-es szorzót jelent és az árban is a 2 szeresét számoljuk és a raktárból is a 2 szeres mennyiséget vonjuk le. felhasznalok: felhasználói név és jelszó az azonosításhoz termek_csoport: termek_csoport_id: INT nem lehet NULL ELSŐDLEGES KULCS termek_csoport_nev: VARCHAR max 50 hosszú nem lehet NULL termekek: termek_id: VARCHAR max 5 hosszú ELSŐDLEGES KULCS termek_megnevezés: VARCHAR max 50 hosszú nem lehet NULL termek_ar: INT termek_lathato: VARCHAR max 4 hosszú nem lehet NULL, értéke igen vagy nem termek_lehetegyedi: VARCHAR max 4 hosszú nem lehet NULL, értéke igen vagy nem osszetevo_reszlet: osszetevo_fajta_megnevezes: VARCHAR max 50 hosszú nem lehet NULL ELSŐDLEGES KULCS osszetevo_ar: INT nem lehet osszetevo_egyseg: INT nem lehet osszetevo_fel_egyseg: INT nem lehet aktualisraktarkeszlet: osszetevo_fajta_megnevezes: VARCHAR max 50 hosszú nem lehet NULL ELSŐDLEGES KULCS osszetevo_aktualismennyiseg: INT dolgozok: dolgozo_id: VARCHAR max 5 hosszú ELSŐDLEGES KULCS dolgozo_nev: VARCHAR max 50 hosszú nem lehet NULL dolgozo_munkakor: VARCHAR max 7 értéke szakács vagy futár helyisegek: helyiseg_id: INT nem lehet NULL, ELSŐDLEGES KULCS helyisegek_nev: VARCHAR max 50 hosszú nem lehet NULL 27

helyisegek_utcak: helyisegek_utcak_id: INT nem lehet NULL ELSŐDLEGES KULCS helyisegek_id: INT nem lehet NULL, értéke a helyiség tábla egyik kulcsa helyisegek_utcak_nev: VARCHAR max 50 hosszú nem lehet NULL megrendelesek: megrendeles_id: INT nem lehet NULL ELSŐDLEGES KULCS megrendeles_datuma: DATE nem lehet NULL megrendeles_mod: VARCHAR max 20 nem lehet NULL értéke lehet Kiszállítás, elvitel vagy helyben fogyasztás megrendeles_cim_helyiseg_id: INT a helyisegek tábla egyik kulcsa megrendeles_cim_utca_id: INT a helyisegek_utcak tábla egyik kulcsa megrendeles_cim_hazszam: VARCHAR max 50 hosszú megrendeles_szakacs_azon: VARCHAR max 5 hosszú értéke a dolgozók tábla egyik kulcsa megrendeles_futar_azon: VARCHAR max 5 hosszú értéke a dolgozók tábla egyik kulcsa megrendeles_kert_idopont: VARCHAR max 5 hosszú megr_reszlet: meg_reszlet_id: INT nem lehet NULL ELSŐDLEGES KULCS megrendeles_id: INT nem lehet NULL értéke a megrendelések tábla egyik kulcsa megr_reszlet_termek_id: VARCHAR max 5 hosszú értéke a termekek tábla egyik kulcsa termek_osszetevok: termek_id: VARCHAR max 5 hosszú értéke a termekek tábla egyik kulcsa osszetevo_fajta_megnevezes [1...n] : DOUBLE ahol az oszlopok száma az osszetevo_reszlet tábla sorainak a száma. felhasznalok: felhasznalo_nev: VARCHAR max 50 hosszú ELSŐDLEGES KULCS felhasznalo_jelszo: VARCHAR max 50 hosszú 3.4 Saját osztályok: 28

3.4.1 MyTableAdapter : Ienumerable 29

Létrehozására azért volt szükségem mert a C#-által generált TableAdapter osztályokban nincs lehetőség az adat séma változtatására. Az osztály továbbá megvalósítja az Ienumerable iterface-t. Erre főképp azért van szükség, hogy bejárhassuk az osztályunkat foreach ciklussal. Mezői: A mezői mind private láthatóságú adattagok. A columnnames string[] típusú tömb amiben a tábla oszlopneveit tárolom. A Colums int típusú változóban az oszlopok száma még a Rows-ban a sor száma van. A Connection egy SQLiteConnection típusú változó amiben az adatbázis kapcsolódáshoz szükséges értékek vannak. A ConnectionString string típusban az adatbázis elérési útja található. A filter és filter2 opcionálisan adható string típus, az ezekben megadott étkekkel szűkíthetjük a táblánkat a filtercolumn és a filtercolumn2 oszlopokra nézve. Az Items string[, ] típusú 2 dimenziós tömb, melyben a táblában szereplő értékek vannak tárolva. Metódusai: Construktorok: public MyTableAdapter(string TableName, string ConnectionString) Létrehozzuk a kapcsolatot az adatbázissal és azon belül a TableName-ben megadott táblával. Beállítjuk a Colums és Rows változókat, feltöltjük a columnnames és az Items tömböket. public MyTableAdapter(string TableName, string ConnectionString, string Filter, int FilterColumn) Annyi a különbség, hogy a Items tömbben csak azok a sorok kerülnek be amikben a FilterColumnban megadott oszlopban szerepel a Filter. Így egy szűkített táblát kapunk. public MyTableAdapter(string TableName, string ConnectionString, string Filter, int FilterColumn,string Filter2, int FilterColumn2 ) Az előzőhöz hasonlóan, csak itt 2 oszlopra szűkíthetjük az eredményt.. Publikus metódusok: public void AddDoubleTypeColumn(string ColumnName, int DeafultNumber) Ezzel beszúrhatunk egy oszlopot a tábla végére és megadhatjuk az új oszlop értékeit a már létező sorokhoz. public int CountColumn() Visszaadja az oszlopok számát. public int CountRow() Visszaadja a sorok számát. public void Delete(string deleteat, int keycolumn) Megkeresi a keycolumn oszlopban lévő deleteat elemet és kitörli a sort. public void DeleteColumn(int ColumnNumber) Kitörölné a megadott ColumnNumber oszlopot ha az SQLite3 ada rá lehetőséget... public string[] Find(string word, int column) Visszatér egy oszlopok nagyságú többel, azzal a sorral ahol a column oszlopban szerepel a word. public bool FindRow(string[] Row, int primarykeycolumn) Igaz, ha a paraméterben adott Row szerepel a táblában eltekintve a primarykeycolumn oszloptól. 30

public string FindRowAndGetPrimaryKeyValue(string[] Row, int primarykeycolumn) Ugyan azt csinálja mint az előző függvény, csak itt a kulcsoszlop értékével tér vissza. public string GetColumnName(int index) A megadott index-ű oszlop nevével tér vissza. public string GetData(int row, int column) A row-adik sor column-adik elemével tér vissza. public string[] GetDataRow(int rowindex) A rowindey-edik sort adja vissza egy tömbben. public void InsertItem(string Values) Elemek szúr be ahol a Values egy 'elem1', 'elem2',... alakú string. public void InsertRow(string[] Values) Beszúrja a táblába Values-ben tárol értékeket; public void Refresh() Ujra felölti az Items tömböt. public void Update(string updateat, int primarykeycolumn, string[] newrow) Megkeresi a primarykeycolumnoszlopban lévő d updateat elemet és frissíti a sort a newrow értékeivel. public void Update(string updateat, int primarykeycolumn, string[] newrow, int exeptthiscolumn) Megkeresi a primarykeycolumnoszlopban lévő d updateat elemet és frissíti a sort a newrow értékeivel, kivéve az exeptthiscolumn oszlop értékét. Interface megvalósítás Ahhoz, hogy egy olyan osztály készítsünk amit foreach ciklussal végig tudjuk menni ahhoz ezt az interface-t kell megvalósítani az osztályunknak. Vagyis a következő 3 függvényt kell megírnunk: public object Current() Visszaadja az aktuális elemet. public bool MoveNext() A következő elemre lép. public void Reset() Beállít egy-egy extremális elemet, jelen esetben a sorok számát -1 -re állítja. 31

3.4.2 MyOrderListItem Ezt az osztály egy lista elemeiként vannak használva a programban. Megrendelésrészletek definiálására használom. Egy elem a megrendelt termék darabszámát, azonosítóját és megnevezésest tárolja. Az ezekből az elemekből felépülő lista egy teljes megrendelés. Mezői: A mezői mind private láthatóságú adattagok. Az amount int típusú változó tárolja a darabszámot. Az itemid és az itemname string típusú változók tárolják a termék azonosítót és a megnevezését. Metódusai: public MyOrderListItem(string ItemId, string ItemName, int amount) Feltölti a már említett mezőket. public string ItemId, public string ItemName, public int Amount Ezek az úgynevezett propertik, get és set metódusokkal módosítják és lekérdezik a mezőket. 3.4.3 MyNumericUpdown saját vezérlő elem Erre az érintőképernyőre való optimalizálás miatt volt szükségem. Lényegében ugyan azt tudja mint a C# beépített NumericUpDown vezérlő eleme, azzal a különbséggel, hogy ez double alapú érték mezővel dolgozik, hogy ennek van egy felirat mezője, ahová azt tüntethetjük fel, hogy éppen minek az értékét állítjuk vele. Ugyan úgy van Min és Max értéke és el lehet tőle kérni az aktuális értéket (Value) valamit be lehet neki állítani a lépésközt. 32

3.5 Az alkalmázás által használt ablakok. 3.5.1 MainForm ablak 2 főbb panelből áll. Az egyiken a menüvezérlő gombok a másikon pedig egy TabControl van aminek a fülei a különböző menüpontok. Az új megrendelés fül tartalmaz egy listbox-ot ami az éppen aktuális megrendelés részleteit mutatja, továbbá 3 vezérlő gombot: Fél pizza gomb megnyomásával 2 pizzából álló egyedi terméket állíthatunk össze. A Megrendel gomb megnyomásával megadhatjuk a megrendelés módját és egyéb adatokat. A Mégsem gomb megnyomásával töröljük az aktuális megrendelések listáját. Továbbá van még a fülön egy termékcsoport gombokat tartalmazó panel és annyi termék gombot tartalmazó panel ahány csoport van. Ezek egymáson helyezkednek el és a termékcsoport gombok megnyomásával lehet őket előhívni, vagy elrejteni. A beállítások és a táblakarbantartások gombra kattintva egy új ablakot kapunk. 33

A mai megrendelések fül-ön 2 listbox található, az egyikben a megrendelés adatai a másikban az egy megrendeléshez tartozó termékeke vannak listázva. Mind a 2 lista alatt van egy-egy szerkeszt gomb amikkel a fölöttük lévő listából kiválasztott adatokat szerkeszthetjük. Továbbá egy töröl gomb, ha egy megrendelést törölni szeretnénk. 34

A raktár állapot fülön két listbox elem van, az egyikben az összetevők nevei a másikban az éppen aktuális mennyiségük és az ebből a mennyiségből készíthető adagszám található. 35

Az adminisztrációs adatok fülön egy dátumválasztóval megadhatjuk a dátumot és az OK gomb lenyomásával megkapjuk az éppen aktuális szakács és futár napi heti és havi legyártott/kiszállított termékek darabszámát és az értük kapott jutalék összegét. 36

A dolgozók fülön beállíthatjuk az éppen aktuális szakácsot és futárt. 37

Konstruktor: public MainForm() Legelőször meghívva a CheckDatabaseExists() eljárást, majd létrehoz minden táblához egy MyTableAdapter-t majd felbontás függően elrendezi a menüsor és az füleken a vezérlő és megjelenítő elemeket. A felbontást és a színeket is a SzakdogaSettings.settings XML alapú fájlból állítja be. Ezután meghívja a DrawTermekekPanels(TabPage SelectedTabPage), a DrawCsoportokButtons() és a DrawTermekekButtons() eljárásokat. Metódusai: private void CheckDatabaseExists() Ez az eljárás még a MyTableAdapter-ek példányosítása előtt leellenőrzi, hogy az adatbázis az eddigi megadott helyen van-e és, hogy meg lehet-e nyitni. Ha nincs meg, akkor egy fájlbekérő ablakban megadhatjuk az elérési utat. Az ablakban *.db szűrő van beállítva és a C meghajtó gyökere az alapértelmezett kezdőhely. private void DrawTermekekPanels(TabPage SelectedTabPage) Ennek az eljárásnak a segítségével rajzoljuk ki azokat a paneleket, amin a csoport választó gombok és a termék választó gombok helyezkednek el. A méreteket a beállított főablak méretéhez igazítja. public void DrawCsoportokButtons() A termék csoportok táblán végigmegy és a csoportok panelre felrak annyi gombot ahány sora van a táblának. public void DrawTermekekButtons() Végigmegy a termékek táblán és aszerint, hogy egy termék melyik csoportba tartozik, a neki megfelelő panelhez adja a gombot, ügyelve arra, hogy sok gomb esetén legyen sorváltás, és, hogy minden gomb ugyanakkora méretű legyen. private void InitListBoxCurentOrders(List<MyOrderListItem> Orders) Kiüríti az aktuális megrendelések listát, majd a paraméterben megadott Orders listán végigmegy és felölti a megrendelések neveivel és darabszámával. private void InsertIntoDatabaseMegrendelesek(MyTableAdapter AktualisMegrendelesAdapter, string MegrendelesMod, int MegrendeleshelyisegId, int MegrengelesUtcaId, string MegrendelesHazszam, string MegrendelesKertIdo, string Cook, string Courier) Beszúr egy sort a paraméterek értékeivel a megrendelések táblába, majd a megrendelés részletek táblába is beteszi a megrendeléshez tartozó termékeket. private void UpdateDatabaseMegrendelesek(int Index, MyTableAdapter Adapter, string MegrendelesMod, int MegrendeleshelyisegId, int MegrengelesUtcaId, string MegrendelesHazszam, string MegrendelesKertIdo, string Cook, string Courier) Az előző eljáráshoz hasonlóan működik, csak ez a paraméterben megadott index-nél frissíti a táblákat. private void InitDayliOrders() A napi megrendelések-fülön lévő listbox-okat tölti fel. private void FillListBoxOrderDetails(int order_id) Lekérdezi a megrendelés részletek táblából az order_id-hez tartozó termékeket és feltölti a napi megrendelések-fülön lévő listbox-ba. 38

private void InitialWarhouseState() Feltölti az aktuális raktárállapotot-fülön lévő 2 listbox-ot a megfelelő adatokkal. private void UpdateActualWarhouse(string productid,int db,int incordec) Az inorder paramétertől (1 vagy -1 az értéke) függően növeli vagy csökkenti a productid azonosítójú termék összetevőivel a raktárállapotot. Csökkentés után leellenőrizzük, hogy egy adott termék összetevőiből hány adagot lehet még elkészíteni, és ha ez a szám az előredefiniált érték alatt van, akkor figyelmeztető üzenetet küld az összetevő nevével és a még elkészíthető adagok számával. private int Selecttion1(string workerid, DateTime date, int column) Az adminisztrációs fülön elvégzi a dátumhoz tartozó szelekciókat az adatbázisban. Eseményei: private void TermekeCsoportokButtons_Click(object sender, EventArgs e) Attól függően, hogy melyik csoportra kattintunk, a neki megfelelő panelt láthatóságát és hozzáférhetőségét állítja be. private void TermekekButtons_Click(object sender, EventArgs e) Feldob egy DarabszamValaszto ablakot, aminek átadja a termék azonosítóját és megnevezését. Ebben az ablakban beállíthatjuk a darabszámot és ha a termék egyedivé tehető akkor felajánlja ezt a lehetőséget is. Amikor ezt az ablakot bezárjuk, akkor visszaadja a darabszámot és ha az egyedivé tétel során változott a termék akkor annak az adatait. Ezeket az adatokat betesszük egy MyOrderListItem -ekből álló listába ami globális változója a MainForm-nak. Majd meghívjuk a InitListBoxCurentOrders eljárást, paraméteréül pedig ezt a listát adjuk. private void listboxcurentorders_click(object sender, EventArgs e) A listbox -ból kiválasztott termék adataival megnyitja DarabszamValaszto ablakot aminek az adatait a MyOrderListItem -ekből álló listából tölti fel. private void buttonsendorder_click(object sender, EventArgs e) Megnyomásával egy MegrendelesReszletek ablakot kapunk ahol beállíthatjuk a megrendelés módját, kért idejét, esetleges házhoz szállításnál pedig a címet. Az ablak és a MyOrderListItem -ekből állólista adataival már meg tudjuk hívni a InsertIntoDatabaseMegrendelesek(...) eljárást, majd kiürítjük a listát és meghívjuk a InitListBoxCurentOrders eljárást. Majd frissítjük a raktárat az UpdateActualWarhouse() eljárással, ahol levonjuk a termék összetevőit. private void buttonordercancel_click(object sender, EventArgs e) Kiürítjük a megrendeléseket tartalmazó listánkat és meghívjuk a InitListBoxCurentOrders eljárást, paraméteréül pedig az üres listát adjuk, így üres lesz a listbox. private void listboxdayliorders_click(object sender, EventArgs e) A kiválasztott elemnek lekérdezzük a hozzá tartozó megrendelés azonosítóját, majd a megrendelés részletek között megkeressük azt és meghívjuk a FillListBoxOrderDetails(int order_id) eljárást. private void buttonorderedit_click(object sender, EventArgs e) Megnyomásával egy MegrendelesReszletek ablakot kapunk, amit feltöltünk a megrendelések táblából származó részletekkel. Majd az ablakból visszakapott adatokkal frissítjük a megrendelések táblát. Majd meghívjuk az InitDayliOrders() eljárást, így a listbox is a módosított adatokkal lesz 39

feltöltve. private void buttondeleteselecteditemfromdayliorders_click(object sender, EventArgs e) Törli a megrendelések táblából a kiválasztott megrendelést majd a megrendelés részletek táblából a megrendeléshez tartozó termékeket. Ezután frissíti a raktárat UpdateActualWarhouse(), de itt hozzá kell adnunk az összetevőket, mivel nem készülnek el a termékek. private void buttonpoductedit_click(object sender, EventArgs e) Vissza irányít minket az új megrendelés fülre, akol feltölti a megrendelés listát a kiválasztott megrendelésnek megfelelően. InitListBoxCurentOrders -el feltölti a listbox -ot. Viszont ha most a rendelés lead gombot nyomjuk meg akkor visszairányít a napi megrendelésekhez és frissíti a megrendelés részletek táblát a módosított adatokkal majd InitDayliOrders() -al frissíti a napi megrendelések listáit. private void listboxingredientname_click(object sender, EventArgs e) Ha kiválasztunk egy elemet akkor sorvezetőként a másik listbox-ban is kiválasztjuk a neki megfelelő elemet. private void buttonselectcook_click(object sender, EventArgs e) Egy SelectForm -ban kiválaszthatjuk az aktuális szakácsot. Majd ha ez megtörtént, akkor a módosítja a szöveget a kiválasztott szakács nevére és a SzakdogaSettings.settings -ben eltárolja a kiválasztott szakácsot aktuális szakácsnak. private void buttonselectcourier_click(object sender, EventArgs e) Egy SelectForm -ban kiválaszthatjuk az aktuális futárt. Majd ha ez megtörtént, akkor a módosítja a szöveget a kiválasztott futár nevére és a SzakdogaSettings.settings -ben eltárolja a kiválasztott futárt aktuális futárnak. private void buttonmenuneworder_click(object sender, EventArgs e) A tabcontrol -on aktívvá teszi az új megrendelés fület. private void buttonmenudayliorders_click(object sender, EventArgs e) A tabcontrol -on aktívvá teszi a napi megrendelések fület. private void buttonselectworkers_click(object sender, EventArgs e) A tabcontrol -on aktívvá teszi a dolgozók kiválasztása fület. private void buttonmenuwarhousestate_click(object sender, EventArgs e) A tabcontrol -on aktívvá teszi az aktuális raktárállapot fület. private void buttonmenuselects_click(object sender, EventArgs e) A tabcontrol -on aktívvá teszi az adminisztrációs adatok fület. private void buttonmenuoptions_click(object sender, EventArgs e) Egy OptionsForm -ot jelenít meg amin beállíthatjuk az alkalmazásunk küllemét, betűméreteit, ablakméreteit. Néhány beállítás csak a program következő indításakor fog érvényesülni. private void buttonmenuadminisztration_click(object sender, EventArgs e) Egy LoginForm -ot jelenít meg, amit meg kell adnunk a felhasználói nevet és jelszót, ha az azonosítás nem sikerül akkor bezárul a LoginForm.cs, ha viszont igen akkor egy TableManageForm 40

fog megjelenni amin adatbázis karbantartást végezhetünk. A TableManageForm bezárása után a főablak automatikusan bezárul, az esetleges adatbázis konzisztenciák elkerülése miatt. private void buttonshowselect_click(object sender, EventArgs e) A gomb megnyomásával végrehajtódik a Selection1() függvény a dátumválasztóval megadott dátum paraméterrel. private void buttonhalfproduct_click(object sender, EventArgs e) Egy HalfProductForm -ot fogunk kapni, amin fél pizzákat definiálunk, az ablak számolja ki a definiált termék adatait ( árát, összetevőit) és ellenőrzi, hogy a már definiált termék esetleg benne van-e a termékek táblában. 3.5.2 DarabszamValaszto ablak A darabszámok megadására, esetleges egyedivé tétel lehetőségének felkínálására alkalmazom. Vezérlőelemei: egy MyNumericUpdown amivel a darabszámot lehet megadni, és 4 gomb. Az OK gomb megnyomásával bezáródik az ablak és visszatér a belállított értékekkel. A törlésgomb törli a listából a terméket. A mégsem gomb megnyomására bezáródik az ablak és nem történik semmilyen változtatás. A egyedivé tétel gomb egy CostumizeOrder ablakot nyit meg. Konstruktor: public DarabszamValaszto(string nev, int db, string termek_id) A paraméterben megadott nevet beállítja a szövegnek, a MyNumericUpdown beállítja a db-ra és a növelés mértékét pedig egy-re állítja. A termek_id-t pedig eltárolja. Visszatérési értékei: public string NAME Megadja a termék nevét. public string TERMEKID Megadja a temék azonosítóját. public int DB Visszatér a MyNumericUpdown -ban beállított értékkel. 41

public string CLOSEREASON Lehet OK, CANCEL, vagy DELETE. Azért, hogy a főablak tudja, hogy milyen eseménnyel zárult be ez az ablak; Eseményekei: private void buttonok_click(object sender, EventArgs e) Beállítja a NAME, a TERMEKID, és a DB adatait, a CLOSEREASON -t OK -ra állítja, majd kilép. private void buttoncancel_click(object sender, EventArgs e) A CLOSEREASON -t CANCEL -ra állítja, majd kilép. private void buttonerase_click(object sender, EventArgs e) A CLOSEREASON -t DELETE -re állítja, majd kilép. private void buttoncostumize_click(object sender, EventArgs e) Megnyit egy CostumizeOrder ablakot, majd ha bezáródik beállítja a NAME, a TERMEKID, és a DB adatait, a CostumizeOrder visszatérési adatai alapján. 3.5.3 CostumizeOrder ablak Arra szolgál, hogy könnyen módosíthassunk egy termék összetevőin, majd megnézni, hogy a módosított adatok esetleg léteznek-e már az adatbázisban, és ha igen akkor annak mi az azonosítója. Ha viszont nem szerepel még az adatbázisban akkor generál egy, az összetevőknek megfelelő terméket, kiszámolja az árát az összetevői alapján és azt berakja az adatbázisba. Ezután bezárja az ablakot. Vezérlőelemei: Annyi darab MyNumericUpdown ahány összetevő fel van véve az összetevő részlet táblába, valamit egy OK gomb. 42

Konstruktorai: public CostumizeOrder(string TermekId) beállítja az ablak méretét a SzakdogaSettings.settings alapján, majd az OK gomb helyét és méretét állítja be az ablakmérethez viszonyítva. public CostumizeOrder(string TermekId, bool NewProduct) Ugyan azt csinálja mint a másik konstruktor, azzal a plusz dologgal, hogy ennek a konstruktornak meglehet mondani, hogy a kapott TermekId egy éppen most létrehozott termék vagy egy már létező termék adatait kell betölteni. Metódusai: void DrawOsszetevok(string TermekID) Létrehoz egy MyNumericUpdown -ekből álló tömböt majd kirajzolja és elrendezi őket az ablakon SzakdogaSettings.settings beállításai alapján. void CostumizeItem() Végignézi a MyNumericUpdown értékeit, majd ezeket egy érvényes termek_osszetevok sorba rakja ahol a 0. oszlop értéke a konstruktorban kapott TermekId. Ha AdapterTermekOsszetevo.FindRow(row,0) igaz akkor a TermekId = AdapterTermekOsszetevo.FindRowAndGetPrimaryKeyValue(row, 0); különben: kiszámolja az árat az összetevő árak alapján, generál egy termékazonosítót és berakja a termékek táblába nem látható értékkel. Majd a generált termékazonosítót berakja a már elkészített érvényes termék összetevő sor első oszlopába. Ezután beszúrja ezt a sor a termék összetevők táblába. Végül beállítja a TERMEKID értékét. Visszatérési értékei: public string TERMEKID Visszaadja a változtatott vagy az esetlegesen újonnan kigenerált termék azonosítót. Eseményei: private void buttonok_click(object sender, EventArgs e) Meghívja a CostumizeItem() eljárást, majd bezárja az ablakot. 43

3.5.4 HalfProductForm ablak Ebben az Ablakban tudunk 2 félből álló pizzákat definiálni, a főablak kiszámolja az így keletkezett termék adatait és felveszi a termékek és a termék összetevők táblába az új terméket. Ha viszont már létezett ez a termék akkor annak az azonosítóját adja vissza. Az adatok kiszámolásánál figyelembe kell vennünk azt, hogy nem minden összetevőt feleznek meg, így ebben az esetben az adatok kiszámolásánál a összetevő részletek táblából a osszetevo_fel_egyseg oszlopot kell figyelembe vennünk. Az ár megállapításánál viszont mind a osszetevo_egyseg oszlopra is szükségünk van, mivel ha a 2 oszlop nem egyezik, akkor az árat meg kell felezni, egyébként pedig meghagyni. Vezérlőelemi: 4 gomb. Az egyik fél és a másik fél gombok megnyomására egy-egy SelectForm jelenik meg amiben azok a termékek vannak, amik a pizza csoportban vannak és a láthatóságuk igaz. Az OK gomb OK Closereason -nal tér vissza majd a főablak ellenőrzi, hogy a kiszállított termék létezik-e már ha igen akkor annak az azonosítóját adja vissza, ha nem akkor generál egyet és azt az azonosítót adja vissza. A mégse gomb változtatások nélkül bezárja az ablakot. Konstruktor: public HalfProductForm() Üresre állítja a Half1 és a Half2 properti-ket. Visszatérési értékei: public string Closereason Beállítja vagy visszaadja a Closereason-n ami lehet OK vagy CANLCEL. public string Half1 Beállítja vagy visszaadja a Hafl1-et get és set függvényhívásokkal. public string Half2 Beállítja vagy visszaadja a Hafl2-et get és set függvényhívásokkal. Eseményei: private void buttonhalf1_click(object sender, EventArgs e) Létrehoz egy SelectForm -ot azokkal a pizza csoportú termékekkel amiknek a láthatósága igen. Majd a SelectForm SELECTED_ID visszatérési értékét a Half1-be rakja. private void buttonhalf2_click(object sender, EventArgs e) Létrehoz egy SelectForm -ot azokkal a pizza csoportú termékekkel amiknek a láthatósága igen. Majd a SelectForm SELECTED_ID visszatérési értékét a Half2-be rakja. 44

private void buttonok_click(object sender, EventArgs e) A Closereason -t OK értékre állítja, majd bezárja az ablakot. private void buttoncenel_click(object sender, EventArgs e) A Closereason -t CANCEL értékre állítja, majd bezárja az ablakot. 3.5.5 OrderDetails ablak Ezt az ablakot a a megrendelő címének és kéréseinek rögzítésére használom. Itt is minden gombnyomás alapon működik így téve lehetővé az érintőképernyős megrendelést. Az adatok megadása után visszaküldi a főablaknak az adatokat és az tárolja le az adatbázisba a megfelelő formában. Vezérlőelemei: 3 megrendelésmód választó gomb. Egy opcionálisan megadható kért időpontot vezérlő gomb. A gomb egy panel láthatóságát vezérli amin az időpont 3 MyNumericUpdown segítségével adható meg. Ha a kiszállítás módot választjuk csak a akkor jelenik meg az a panel amin a helyiséget, az utcát és a házszámot adhatjuk meg. A helyiség gomb egy SelecFormon mutatja a választható helyiségek táblában tárolt városokat. Az utca gomb egy beviteliform -ot nyit beviteliform("", "utca", MegrendeleshelyisegId.ToString()) paraméterekkel, így a beviteliform -on szerepelni fog egy lista és benne a virtuális billentyűzeten beírt utcák listájának folyamatos szűkítése. A házszám megadása gomb egy beviteliform("", "hazszam", "") paraméterekkel rendelkező beviteliform -ot nyit ahol a házszámot adhatjuk meg. A megrendelés leadása beállítja a visszatérési értékeket a CLOSEREASON -t OK -ra állítja majd kilép. A Mégsem gomb változtatások nélkül bezárja az ablakot es a CLOSEREASON -t CANCEL -re állítja. 45

Konstruktor: public MegrendelesReszletek(string Mod, string Ido, string Hazszam, string helyiseg, string Utca, int helyisegid, int UtcaId, bool NewOrder) Beállítja a viszatérési értékeket a paraméterben kapott értékekre. Ennek csak akkor van értelme ha már egy létező megrendelést akarunk szerkeszteni, ekkor engedélyezi a gombokat mert egyébként az utca és a házszám megadás addig nem engedélyezett amíg meg nem adjuk a helyiséget. Ha viszont új megrendelést adunk le akkor üres paraméterekkel és extremális értékekkel kell feltöltenünk: MegrendelesReszletek("Kiszállítás", "", "", "", "", -1, -1, true); Metódusai: private void SetTime(string Time) Beállítja a paraméterben megadott hh:mm alakú időt a 3 MyNumericUpdown -on és a MEGIDO értékét is ezzel a paraméterrel teszi egyenlővé. private void SetPanelVisibility(System.Windows.Forms.Panel panel, bool visibility) A paraméterben adott panel láthatóságát állítja be a paraméterben megadott értékre. private void show_hide_panel(system.windows.forms.panel panel) Attól függően, hogy éppen milyen a paraméterben megadott panel láthatósága, ez megcseréli az értékét. Visszatérési értékei: public string MEGIMOD Megrendelés módját adja vissza, értékei lehetnek kiszállítás, elvitel vagy helyben fogyasztás public string MEGIDO Egy hh:mm formátumú szöveg ahol a hh az óra az mm pedig a perc. public string MEGHAZSZAM A beállított házszám értékét tárolja és adja vissza. public int MEGUTCAID A helyiseg utcák táblából a megfelelő azonosítót adja vissza. public int MEGHELYID A helyiseg táblából a megfelelő azonosítót adja vissza. public string CLOSEREASON A bezárás mikéntjét adja vissza aminek az értéke OK vagy CANLCEL. Eseményei: private void buttonmegrendelesmod1_click(object sender, EventArgs e) Beállítja a MEGIMOD -értékét a megfelelőre és a szöveget is megváltoztatjuk erre. A helyiségmegadó panelt láthatóvá teszi a SetPanelVisibility() eljárással. private void buttonmegrendelesmod2_click(object sender, EventArgs e) Beállítja a MEGIMOD -értékét a megfelelőre és a szöveget is megváltoztatjuk erre. A helyiségmegadó panelt nem láthatóra állítja SetPanelVisibility() eljárással. private void buttonmegrendelesmod3_click(object sender, EventArgs e) 46

Beállítja a MEGIMOD -értékét a megfelelőre és a szöveget is megváltoztatjuk erre. A helyiségmegadó panelt nem láthatóra állítja SetPanelVisibility() eljárással. private void buttonidopont_click(object sender, EventArgs e) Meghívja show_hide_panel() eljárást az időpont megadó panelre. private void buttonhelyiseg_click(object sender, EventArgs e) Egy SelectForm -ot rak ki amiben a helyiségek táblában szereplő helyiségnevek vannak. Majd a választot helyiséghez megkeresi az adott helyiség id-t és a MEGHELYID -be tárolja. private void buttonutca_click(object sender, EventArgs e) Egy beviteliform("", "utca", MegrendeleshelyisegId.ToString()) -ot ad aminek a visszatérési értékét berakja a MEGUTCAID-be. private void buttonhazszam_click(object sender, EventArgs e) Egy beviteliform("", "hazszam", "") -ot nyit ahol megadhatjuk a házszámot és a visszatérési értékét berakja a MEGHAZSZAM-ba. private void buttonok_click(object sender, EventArgs e) Beállítja a CLOSEREASON -t OK -ra, majd csinál egy sor ellenőrzést, hogy mely panelek láthatóak és, hogy mely adatok vannak kitöltve, majd ennek megfelelően esetleg még átláthatja a MEGUTCAID -t, MEGHAZSZAM -ot, MEGHELYID -t és a MEGIDO-t. Majd bezárja az ablakot. private void buttoncenel_click(object sender, EventArgs e) Beállítja a CLOSEREASON -t CANCEL -re és bezárja az ablakot. 3.5.6 VirtualQWERTZ ablak Ahogy láttunk érintőképernyős alkalmazásnál egy jó módszer az ha az összes választási lehetőséggel gombokat generálunk és azt valahogy rendezett formában felajánljuk a képernyőn rendezett formában. Sajnos ezt a módszert nem lehet mindig alkalmazni, ha túl sok a választható lehetőség, vagy olyan adatoknál ahol nem tudjuk előre sem a formátumot sem a hosszot. Ez ilyen adatoknál, mint például az utcanév vagy a házszám megadásánál alkalmazom a beviteliform -ot. Többféleképp is megjelenhet, attól függően, hogy: A beírt szöveget folyamatosan illessze egy adott tábla egy oszlopára és a minta alapján a találatokat a listbox-ban sorolja fel. Csak a listbox elemére kattintva tudunk ilyenkor kilépni az ablakból így akadályozva meg a felhasználót, hogy az adatbázisban nem szereplő értéket adjon meg. 47

A beírt szöveg bármi lehet. Például házszámok megadásánál kiegészül a megjelenés egy / egy Emelet: és egy Szoba: gombbal a még kényelmesebb és gyorsabb megadás érdekében. Így akár a képen látható címeket is gyorsan fel tudjuk venni. 48

Konstruktor: public beviteliform(string StartString, string Option, string helyiseg_id) A beírt szöveget jelző címke szövegét a StartSrting paraméter értékére állítja, az Opions paraméter értéke lehet "hazszam", vagy "utca" és a képeken is látható kétféle megjelenítést beállításait alkalmazza. A helyiseg_id paraméter pedig akkor használatos, ha éppen egy létező megrendelést szerkesztünk. Az eseményeit most nem sorolnám fel, ugyanis lényegében minden gomb ugyan azt csinálja. Minden gomb hozzáfűzi a szöveghez saját magát és ha utcaválasztó módban vagyunk akkor akkor meghívja az éppen aktuális szövegre a keresést, ami feltölti a listát a talált elemekkel. 3.5.7 SelectForm ablak Ez egy dinamikus méretezésű ablak ami választási lehetőségeket kínál a felhasználónak. Az ablak maximális méreteit adhatjuk meg a beállítások ablakban, valamit az ablak háttérszínét, és a megjelenített gombok színét és a rajtuk lévő szöveg betűtípusát. Az ablak létrehozáskor lehetőséget ad max 2 filter megadására amivel a fejlesztés során egyszerűbben lehetett meghívni ezt a választó ablakot. Azért csak 2 filter mert ez nem annyira komplex alkalmazás, hogy akármennyi filtert kelljen bele implementálni. Konstruktorai: public SelectForm(string tablename, int columcountainname, int columnreturnvalue) Pédányosít egy MyTableAdapter osztályt a tablename paraméterű táblával, majd kirajzolja a gombokat, annyit amennyi sora a van a táblának. A gombok szövege a columcountainname -edik oszlopban található értékeke, a visszatérési értékeke pedig a columnreturnvalue -edik oszlop értékei. public SelectForm(string tablename, int columcountainname, int columnreturnvalue, string Filter, int FilterColumn) Ugyan az mint az alap konstruktor, kivéve, hogy a példányosítás filterrel történik, így kevesebb lesz a tába sorainak a száma. MyTableAdapter(tableName,SzakdogaSettings.Default.DatabaseConnentionString,Filter,FilterColu mn); public SelectForm(string tablename, int columcountainname, int columnreturnvalue, string Filter, int FilterColumn, string Filter2, int FilterColumn2) Ugyan az mit az előző konstruktor, csak itt 2 filtert használ a példányosításnál. MyTableAdapter(tableName,SzakdogaSettings.Default.DatabaseConnentionString, Filter,FilterColumn,Filter2,FilterColumn2) Metódusai: 49

private void DrawButtons() Végigmegy a példányosított táblán és minden sornak megfelelő gombot hoz létre, ahol a gomb neve a konstruk paraméterében megadott columcountainname oszlop értéke a.tag -je pedig a paraméterben megadott columnreturnvalue oszlop éréke. Kirajzolás közben ügyel az beállítások menüben megadhatott maximális ablakméretre, és ha kell akkor új sort kezd a kirajzolással. Visszatérési értékei: public string SELECTED A megnyomott gomb szövegével tér vissza vagy állítja be. public string SELECTED_ID A megnyomott gomb.tag -jével tér vissza vagy állítja be. public string CLOSEREASON Bezárás módja szerint az értéke lehet OK vagy. Eseményei: private void Buttons_Click(object sender, EventArgs e) A CLOSEREASON -t OK -ra állítja a SELECTED -et a gomb nevére a SELECTED_ID -t a gomb.tag -jére, majd bezárja az ablakot. 3.5.8 OptionsForm ablak Ez az ablak lehetőséget ad a felhasználónak arra, hogy saját ízlésének megfelelően állítsa be az alkalmazás kinézetét és felbontását a saját megjelenítőeszközéhez mérten. Az ablak a SzakdogaSettings.settings XML alapú fájlba menti a változtatásokat, és ahol van rá lehetőség rögtön életbe is lép a változás. A főablakot érintő beállításokhoz viszont újra kell indítani az alkalmazást. A beállítható tulajdonságokat a képen láthatjuk. Konstruktorai: public OptionsForm() A NumericUpDown típusú vezérlőknek beállítja a nekik megfelelő értéket a SzakdogaSettings.settings fájl tartalma alapján. Eseményei: private void buttonsavechanges_click(object sender, EventArgs e) A változtatások mentése gomb kiolvassa az összes beállított beállítást és lementi azokat a SzakdogaSettings.settings fájlba. A szín és a betűtípus feliratú gomb nagyjából ugyanazt csinálja: Ahol szín felirat van a gombon, ott egy ColorDialog -ban állíthatjuk be a színt, majd miután kiválasztottuk a kívánt szint a dialog bezárása után elmenti a neki megfelelő értéket a SzakdogaSettings.settings fájlba Ahol betűtípus van a gombon, ott egy FontDialog -ban állíthatjuk be a betűméretet és a típust, majd miután kiválasztottuk a kívánt betűtípust és méretet a dialog bezárása után elmenti a neki megfelelő értéket a SzakdogaSettings.settings fájlba 3.5.9 WarningForm ablak 50

Ez az ablak figyelmeztetések adására és egy biztos, hogy akarja? kérdés feltétlére alkalmas. Egy érintő képernyős alkalmazásnál, talán még lényegesebb egy ilyen ablak, hiszen fokozottan fennáll a nem szándékos gombnyomás lehetősége. 51

Konstruktor: public WarningForm(string massage) A massage paraméterben megadott üzenetet fogja megjeleníteni az ablak. Visszatérési értékei: public string CLOSEREASON Bezárás módja szerint az értéke lehet OK vagy CANCEL. Eseményei: private void buttonok_click(object sender, EventArgs e) Beállítja a CLOSEREASON -t OK értékre, majd bezárja az ablakot. private void buttoncancel_click(object sender, EventArgs e) Beállítja a CLOSEREASON -t CANCEL értékre, majd bezárja az ablakot. 52

3.5.10 LoginForm ablak Ez az ablak a táblakarbantartáshoz való hozzáférés előtt jelenik meg. Bekéri a felhasználó nevét és jelszavát, majd egy azonosítás után vagy tovább engedi, vagy bezárja az ablakot és visszatér a főablak. Konstruktor: public LoginForm() A ValidationResult -ot hamisra állítja kezdeti értékét. Metódusai: private bool ValidLogin(string username, string userpasword) Megkeresi a felhasználói nevet a felhasználók táblában és a beírt jelszóval összehasonlítja a névhez tartozó értéket, ha nem egyezik akkor hamis a visszatérési értéke, ha viszont egyezik, akkor igaz. Visszatérési értékei: public bool ValidationResult Egy logikai igaz-hamis értékkel tér vissza, attól függően, hogy érvényes volt-e az azonosítás. Eseményei: private void buttonok_click(object sender, EventArgs e) Meghívja a ValidLogin() függvényt majd az eredményét a ValidationResult-ba tesz. Ezután bezárja sz ablakot. private void textbox2_keydown(object sender, KeyEventArgs e) Ez az esemény figyeli a jelszóbekérő szöveg dobozt és ha enter-t ütünk akkor meghívja a textbox2_keydown eseményt. private void buttoncancel_click(object sender, EventArgs e) ValidationResult- ot hamisra állítja és kilép. 53

3.5.11 TableManageForm ablak Az adatbázis módosítására alkalmas ablak. Minden tábla külön fülön módosítható. Új sor felvételénél ellenőrzéseket végzünk, esetleges rossz azonosítónál hibaüzenetet küldünk. Ha olyan érték van a táblában ami más tábla kulcs (pl termekek táblában termek_csoport_id) azokat combobox-okból kell kiválasztani amit az indításkor töltünk fel. Így elkerülhetjük a hibás idegenkulcsok használatát, ezzel azért kell nekünk törődnünk, mert mint említettem az SQLite nem teszi meg. Módosításánál a kulcsot nem módosíthatjuk, így kerülve el a konzisztenciát. Ha egy olyan adatok törlünk aminek a kulcsa máshol idegen kulcsa akkor a többi táblából is nekünk kell kitörölni azokat a sorokat, ahol az a kulcs volt az érték amit ki akarunk törölni. Továbbá ezen az ablakon lehet beállítani a bérezést és azt, hogy hány elkészíthető darab alatt küldjön figyelmeztetést a raktár. Ha végeztünk a módosításokkal akkor az ablak bezárása után a főablak is bezáródik, hogy elkerüljük az összeütközéseket az adatbázisban. Így a program újraindulásakor már nem lesznek gondok a módosított adatokkal, mivel az adatbázisból a program indulásakor szedjük ki az adatokat. Az ablak fülei: Raktár karbantartó fül: Itt módosíthatunk egy összetevőhöz tartozó mennyiséget, vagy az aktuális mennyiséghez hozzáadhatunk, vagy elvehetünk, így frissítve a raktárállapotot. Raktárfeltöltés esetén csak itt tudjuk a plusz mennyiséget hozzávenni a raktárhoz. Mivel itt nincs felvesz és törlés gomb, nem okozhatunk konzisztenciát az adatbázisban. 54

A termékek fülön a termékek táblát tudjuk karbantartani. Itt vehetünk fel új terméket, vagy meglévőket módosíthatunk. Ezen a fülön keresztül tudjuk módosítani egy adott termék összetevőit is a CostumizeOrder ablak segítségével. Termék csoport fülön a felvehetünk, módosíthatunk, vagy törölhetünk csoportokat. Ha törlünk egy csoportot az akkor az olyan termékek, amiknek ez a csoportja, törlődni fognak. 55

Az összetevők fülön felvehetünk, módosíthatunk, vagy törölhetünk összetevőket. A módosítások a termek_osszetevok táblában is jelentkezni fognak. A dolgozók fülön új dolgozót vehetünk fel, módosíthatjuk a meglévőket, vagy törölhetjük őket. Természetesen ha törlünk egy dolgozót attól még az a megrendelés amit ő teljesített nem fog törlődni. 56

A helyiségek fülön felvehetünk, módosíthatunk, vagy törölhetünk településeket/városokat ahová a pizzéria kiszállít, ha törlünk egy települést akkor a hozzá tartozó összes utca is törlődni fog a helyiség_utca táblából! Az utca fülön egy fájlból (*.street kiterjesztésű) töltjük fel a helyiseg_utcak táblát. A combobox-ban megadott helyiséghez. 57

A beállítások fülön a szakács és a futár teljesítménybérét állíthatjuk be, valamint azt, hogy hány elkészíthető darab alatt küldjön figyelmeztetést az alkalmazás. A változtatásokat a SzakdogaSettings.settings fájlba tároljuk. A felhasználók fülön a felhasználók nevét vagy jelszavát módosíthatjuk. 58