Content extract
Adatbázis k ezelése az Access 9 7 segítségével 2. oldal Tartalomjegyzék Alapfogalmak 3 Adatmodellek 5 Relációs adatbázis 5 Ismerkedés az Access-szel 7 Szűrés 8 Tábla tervezése 10 Lekérdezés 14 Jelentés 23 Űrlap 32 Makró 36 Kapcsolatok 38 Segédűrlap 45 Három tábla kapcsolata 46 Normálformák, tervezés 48 A Cikkek adatbázis 51 A Kölcsönzés adatbázis
65 Az Stb Bt adatbázis 71 Az SQL alapjai 74 Néhány menüpontról 84 3. oldal "Csak a kisember tart rendet, A zseni átlátja a káoszt." Alapfogalmak Ha Ön egyetért a fenti mottóval, akkor Önnek nincs szüksége erre a könyvre. Hisz az adatbázis-kezelés éppen a rendet, az adatok rendezettségét, a jól átgondolt, megtervezett szerkezetet követeli meg Mi az adat, mi az adatbázis? A pontos definíció előtt járjuk körbe ezeket a fogalmakat! Adaton valamilyen rögzített információt értünk, melyet fel tudunk dolgozni. Ilyenek: 512, 65 Ft, Géza, ABC123, kék. A sok adat azonban nem adatbázis. Figyelje meg a két ábrát! Az egyik a káosz, a másik a rend: 8 Kifli 50 60 45 105 Kenyér 8,5 Zsemlye Áru neve Ára Darab Kenyér 105,0 60 Kifli 8,5 50 Zsemlye 8,0 40 A jobboldali ábrán egyértelmű,
hogy kenyérből van 60 darab. Az első sor megmagyarázza hogy melyik adat mit jelent. Az áttekinthetőséget növeli, hogy a megfelelő helyiértékek egymás alatt szerepelnek Azaz fogalmazhatunk úgy első közelítésben, hogy adatbázis = adat + struktúra (szerkezet). Bizonyára hallotta már a tökéletesen rugalmas ütközés, ideális gáz, pontszerű test kifejezéseket. Ezekkel dolgozik a fizika De ugye ilyenek a valóságban nincsenek! Ez csak egy absztrakció (elvonatkoztatás) eredménye Hogy mi az amitől eltekinthetünk és mi az ami fontos? Nos, ez a vizsgálat szempontjától függ. Ha én egy vonaton utazok, számomra fontos, hogy melyik részében ülök - azaz számomra nem pontszerű. A menetrendben viszont nem - ott ugyanis nem azt adják meg, hogy a szerelvény melyik kocsijának melyik pontja érkezik 920kor Budapestre. Elhanyagolható-e egy autó színe? A vásárló szemszögéből valószínűleg nem, de ha a légellenállását vizsgálják egy
szélcsatornában, akkor a színnek nincs szerepe. Adatmodellezésnek nevezzük azt az eljárást, melynek során a valós világ tényeit és összefüggéseit tükröző adatok számunkra lényeges összefüggéseit emeljük ki. E folyamat eredménye az adatmodell Tehát adatbázis = adat + tulajdonság + összefüggés (kapcsolat). Az alábbiakban e fogalmakat pontosítjuk és részletezzük. 4. oldal Objektum: minden olyan dolog (személy, tárgy, fogalom), amit adatokkal tudunk jellemezni. Alapfogalom Minden az adatbázisban szereplő, a többitől megkülönböztethető "egység". Egyed(típus): azok az objektumok, amiket adatokkal szeretnénk leírni. Konkrét dolgok elvont halmaza - absztrakció. Pl áru, személy Egyedelőfordulás: az egyedtípus egy konkrét eleme. Pl Kenyér, 105, 60 illetve Nagy Pál, 72 kg. Tulajdonság(típus): az egyedtípusok jellemzői. Konkrét jellemzők elvont halmaza absztrakció Pl Név, ár, súly, magasság
Tulajdonságelőfordulás: egy konkrét egyed konkrét tulajdonságai. Pl Kenyér, 72 kg Az egyértelműség miatt szükséges, hogy minden egyedelőfordulást meg tudjunk különböztetni, tudjunk egyértelműen azonosítani. Azonosító vagy (elsődleges) kulcs: egy vagy több tulajdonság(típus), amely minden egyedelőfordulásban különböző. Pl személyi szám, rendszám, árukód vagy lehet összetett: név, osztály, anyja neve. Kapcsoló mező vagy külső (idegen) kulcs: olyan tulajdonság, amelyik az egyik egyedtípusban azonosító, a másikban nem. Kapcsolat: két egyedtípus egyedelőfordulásai közötti viszony. Tehát Adatbázis = Egyed + Tulajdonság + Kapcsolat Vegyük egy egyed két egyedtípusát és lássunk néhány példát! Személyek Kód H254 A002 D222 Név Kovács Kiss Kovács Fizetés Ir. szám 95 000 8900 85 500 8800 8800 Települések kapcsolat Ir. szám 5540 8800 8900 1021 Helységnév Szarvas Nagykanizsa Zalaegerszeg Budapest II. Két
egyedelőfordulás: H254, Kovács, 95000, 8900 illetve 1021, Budapest II. Három tulajdonság: Kód, Fizetés illetve Helységnév. Négy tulajdonságelőfordulás: D222, 95000, (üres) illetve Szarvas. Kulcs: Kód illetve Ir. szám Kapcsoló: Ir. szám (a Településekben kulcs, míg a Személyekben nem) 5. oldal Adatmodellek Relációs: az adatokat kétdimenziós táblákban tárolja, a hangsúly a tulajdonságokon van. A kapcsolatot a kapcsoló tulajdonság dupla (mindkét táblában történő) tárolásával oldja meg kapcsoló mező. A tábla egy sora egy reláció (egy "összefüggés") Lásd fentebb! Célszerű kapcsolómezőként rövid típusokat választani - helyfoglalás. Hierarchikus: az adatokat faszerkezetben tárolja. A kapcsolat beépül Jól kezeli az alá- és fölérendeltségi viszonyokat. Hálós: gráffal írható le. A kapcsolatokon van a hangsúly Hierarchikus Hálós Főnök Kati Csop. vez Beosztott Csop. vez Beosztott Klári Ági
Beosztott Anikó Éva A három modell közül a legelterjedtebbel, a relációssal foglalkozunk a továbbiakban. Nézzük a megfeleltetéseket! Milyen feltételeknek kell eleget tennie egy ilyen modellnek Relációs adatbázis Egy egyedtípus több egyedelőfordulásának több tulajdonságát tároljuk tábla rekord - sor mező - oszlop Nem lehet két minden mezőben megegyező rekord - kulcs Rendezés logikailag is lehetséges - indexelés A mezőknek típusa van Tábla Kód H254 A002 D222 Név Kovács Kiss Kovács mező Fizetés Ir. szám 95 000 8900 85 500 8800 8800 mezőnév rekord 6. oldal Vagyis a táblák rekordokból, a rekordok pedig mezőkből épülnek föl. Mit is jelent az indexelés, logikai rendezés? Az adatbázisban sokszor kell keresni. Meg kell keresni a módosítandó rekordot, új rekord felvitele előtt meg kell keresni, hogy nincs-e már ilyen (mert akkor nem új), törlés előtt meg kell keresni a törlendőt. Nagyobb
(adat)tábla esetén ez hosszadalmas lehet, ha az nem rendezett a kívánt keresési szempont szerint. Vegyünk alapul egy 10 000 rekordos táblát! Ha rendezetlen, akkor átlagosan az 5 000-dik lépésben találom meg a keresett rekordot. Bezzeg, ha rendezett! Először megnézem, hogy az 5 000-dik előtt vagy mögött van-e. Most már tudom melyik 5 000 közt van, megnézem, hogy ezek közül az első 2 500 között van-e és így tovább. Pl: 5000 1 6250 7500 10000 Azaz az intervallumok hossza mindig feleződik. Így legrosszabb esetben a 14-dik lépésben megtalálom a keresett elemet (vagy tudom, hogy nincs ilyen). Ez minőségi ugrás az 5 000-hez képest. (Logaritmikus keresésként szokás ezt az eljárást emlegetni, mert a lépések száma = log210000.) Ez így nagyon szép, de szinte lehetetlen olyan adatbázist találni (az életben), amelyik ne változna. Ha mindig újra rendezgetjük, akkor hatékonyságunk erősen lecsökken Van azonban nagyobb baj is! Egy
adatbázis csak egyféleképpen lehet fizikailag rendezett. A megoldás a logikai rendezés, az indexelés. Így ugyanazon adatbázis logikailag többféle szempont szerint lehet rendezve. Az erre fordított plusz adattárolás pedig nem kezelhetetlenül nagy Lássunk egy példát! 1 2 3 Kód H254 A002 D222 Név Fizetés Ir. szám Kovács 95 000 8900 Kiss 85 500 8800 Kovács 8800 KódPoz NévPoz FizPoz 2 2 1 3 1 2 1 3 3 Kiírás KódPoz(íció) szerint: a KódPoz első eleme azt mutatja meg, hogy az eredeti tábla 2. rekordját kell kiírni, azaz A002, Kiss, 85500, 8800. A KódPoz második eleme azt mutatja, hogy az adattábla 3. rekordját kell kiírni, azaz D222, Kovács, , 8800 Majd az elsőt, azaz H254, Kovács, 95000, 8900. KódPoz szerint NévPoz szerint FizPoz szerint (csökkenő) A002, Kiss, 85500, 8800 A002, Kiss, 85500, 8800 H254, Kovács, 95000, 8900 D222, Kovács, , 8800 H254, Kovács, 95000, 8900 A002, Kiss, 85500, 8800 H254, Kovács, 95000, 8900 D222,
Kovács, , 8800 D222, Kovács, , 8800 Természetesen az indexeket karban kell tartani, azaz módosítás, törlés, új adat felvitele esetén újra kell őket számolni. Szerencsére (vagy inkább természetesen) erről az adatbáziskezelő programnak illik gondoskodnia Nekünk csak azt kell jelezni, hogy mely tulajdonságokra kérjük az indexelést 7. oldal A relációs adatbázis-kezelők által használt főbb mezőtípusok: Numerikus: számok tárolása - egész és valós Karakteres: szöveg tárolása Dátum: fix hosszon Logikai: Igen/Nem típusú adatok tárolásához Megjegyzés: változó hosszúságú adat Amivel nem végzünk számítási műveletet, azt célszerű karakteresen (szövegként) tárolni. Például a telefonszámot. Hisz nincs értelme ezek átlagának, viszont pontosan és nem kerekítve kell elraktároznunk Foglaljuk össze, mit kell tudnunk a kulcsról (azonosítóról)! Kulcs (azonosító): Tulajdonság(ok olyan halmaza), mely minden rekordot
(sort) egyértelműen meghatároz és nincs nála szűkebb ilyen tulajdonságú. Mindig van kulcs (legrosszabb esetben az összes mező, hisz minden rekord különböző kell hogy legyen). Több kulcs is lehet. Ha egyetlen tulajdonság (mező) a kulcs, akkor egyszerű kulcsról beszélünk, ha több tulajdonság közösen alkot kulcsot, azt összetett kulcsnak nevezzük. Egyszerű kulcs: rendszám, összetett: neve, anyja neve, születési dátum, születési hely. Ismerkedés az Access-szel Nézzük most, hogy megy ez a gyakorlatban! Mi az Access 97 adatbázis-kezelő programot választottuk. Ismerkedjünk meg az Office 97 család tagjával! Kezdetben csak egy táblával foglalkozunk (azaz csak adatkezelést végzünk). Ezek begyakorlása után térünk rá a kapcsolatok elméletére és a több tábla használatára. A kapcsolatokkal, adatbázisunk táblákra bontásával később foglalkozunk. A program indításakor megnyíló ablak tartalmazza az utoljára használt néhány
fájlt. Az Access az egy adatbázis egy fájl elvet követi. Minden az adott adatbázishoz tartozó táblát, lekérdezést, jelentést, űrlapot egyetlen fájlban tárol. Mint ahogy az Excel (50-tól) egy fájlban több munkalapot raktároz. 8. oldal Nézzünk körül! Válasszunk, vagy keressünk egy adatbázist! Egyelőre csak tájékozódgatunk, ne módosítsunk semmit! Tiszteljük mások munkáját! Célszerű, ha a vizsgálandó adatbázist "semleges" helyre másoljuk és onnan nyitjuk meg. Figyelem: itt nincs mentés másként! Ha belenézünk a Cikk táblába (dupla kattintás, vagy kijelölés és megnyitás), akkor az adatokat kétdimenziós táblázatban tárolva látjuk. Ha lekérdezésbe kukkantunk bele, lehet, hogy nem is jelenik meg minden rekord. Az űrlapokon "szebben" láthatjuk viszont adatainkat, a jelentésekben többnyire valamilyen csoportosítás is jelen van. Azaz a táblák feladata az adatok tárolása, az űrlapok a képernyőn, míg
a jelentések a papíron való megjelenítésért felelősek. A lekérdezések az adatbázissal való dolgozás, az információ kinyerésének eszközei. Lássunk először néhány egyszerű lehetőséget arra, hogy adatainkból információt nyerjünk! Szűrés Ezen egyszerűbb műveleteket a legtöbb táblázatkezelő program is nyújtja szolgáltatásként. Nyissuk meg a Dolgozók adatbázis Személy tábláját! 9. oldal Áttekinthetőbbek lesznek adataink rendezés után. Álljunk abba az oszlopba (mezőbe), amely szerint rendezni akarjuk táblánkat és használjuk értelemszerűen a és gombokat! Így már valamelyest könnyebb tájékozódni, de ha csak bizonyos feltételeknek eleget tevő rekordokra vagyunk kíváncsiak, akkor azokat a többi közül ki kell válogatni, szűrni. Két lehetőségünk van. Az egyik a szűrés kijelöléssel Jelöljük ki a Nagykanizsa szót, majd alkalmazzuk a gombot! Így csak a Nagykanizsán születettek adatait látjuk.
Visszakapcsolni a gombbal tudunk, mely váltógombként működik (szűrés - szűrő eltávolítása). Ha csak az agy karaktereket jelöljük ki, akkor persze az előzőek mellett a Nagykőrösön világot látottak rekordjai is megjelennek. Észrevehetjük, hogy az Igen -1-ként, a Nem 0-ként tárolódik Kísérletezzünk bátran! Nem arról van szó, hogy a számunkra éppen érdektelen rekordokat kitöröljük, hanem csak kiszűrjük, elrejtjük. Másik lehetőségünk a szűrés űrlappal. Használjuk a válasszunk! gombot! Majd a lenyíló listából Így azokat szűrtük ki, akik Nagykanizsán születtek ÉS férfiak. Ha a *agy kitételt írjuk a szülhely alá, akkor az Enter után átíródik Like "agy"-ra és minden olyan rekord megjelenik, ahol a szülhely mezőben valahol előfordul ez a három karakter egymás mellett. Vigyázat más a *a és a a feltétel! (Valahol van benne a, illetve ara végződik.) Szűrjük a neve mezőt a Like "[KN]*"
feltétellel - a név N-nel vagy K-val kezdődik. A 40 ezer fölötti fizetésűek: >40000. Próbáljuk ki a *[f-t] feltételt is! (f és t közötti betűre végződők.) Gondoljuk végig a Ková[c,t]s, illetve Győrf[y,i] keresési kód jelentését, hasznosságát. 10. oldal Tájékozódásra természetesen használhatjuk a Szerkesztés menü Keresés pontját is (avagy a keresés gombot). Tábla tervezése Ennyi bemelegítés után kezdjük a mérkőzést! Hozzuk létre az alábbi táblát! Azaz tervezzük meg és töltsük fel adatokkal! Egy adatbázis (adattábla) hatékony használhatósága már a tervezéskor eldől. Ha nincs két egyforma nevű egyén, akkor a kód fölösleges, lehetne a (teljes) név kulcs. De biztosak lehetünk-e benne, hogy nem lesz még egy Kiss János? Ha a nevet egyetlen mezőben tároljuk, akkor lehetetlen, vagy nehéz lesz kiszűrni az összes Nagy-ot. Klasszikus eset a tanuló osztálya Ha az évfolyamot és osztály-jelet egy mezőben
tároljuk (pl. 10 D), akkor izzasztó feladat kiszűrni az iskola összes D-sét Ha azonban külön évfolyam és osztály mezőket alkalmazunk, akkor ez a szűrés gyerekjáték. Legyen most ez a nyolc darab mezőnk! Határozzuk meg a típusukat! Az első három szöveges, a következő három numerikus, aztán dátum típusú. Az utolsó kicsit fura, feljegyzés típus Szöveges típus esetén rengeteg helyet pazarolnánk, mert elég hosszú a mező, de csak néhány rekord esetén tartalmaz adatot. A megoldás: a mezőben csak egy utalás tárolódik, a valódi adatok másutt, tömören raktározódnak el. (Hívják memo mezőnek is) Indítsuk el újra az Access-t és válasszuk az Üres adatbázis pontot! Most meg kell adnunk, hogy hová, milyen néven kívánjuk tárolni a létrehozandó adatbázisunkat. A létrehozás gomb után egy üres adatbázis-ablak fogad bennünket. Ha az Access már fut, akkor választhatjuk a Fájl menü Új adatbázis pontját is. Válasszunk mappát
és adjuk névként: Egyéb. Ekkor létrejön az EgyébMDB fájl Ha nem hálózati környezetben dolgozik és nem ír modulokat (programokat), akkor csak az MDB kiterjesztésű állományra lesz szüksége. Új adatbázis létrehozásakor kérhetjük a varázslót is és a megfelelő kattintások után kényelmesen hátradőlve szemlélhetjük, ahogy az Access ügyködik. Próbáljunk ki egyet Én személyes indíttatásból a Borok adatbázist választottam. Legyen most nyitva az Egyéb adatbázisunk. Emlékezzünk vissza! Az adatok a táblákban tárolódnak. Először tehát a táblák létrehozása a feladat. Most még csak egy táblánk lesz 11. oldal Válasszuk az új tábla, majd a tervezés gombot! Milyen mezőtípusokat ismer az Access? Figyeljük az ablak jobb alsó részében felbukkanó kék színű üzeneteket! Az adattípus mezőben állva és F1-et nyomva választ kapunk: Szöveg: Szöveg vagy szöveg és számok kombinációja, valamint számítást nem igénylő
számok, mint például a telefonszámok. Maximum 255 Feljegyzés: Hosszabb szöveg vagy szöveg és számok kombinációja. Maximum 65535 karakter Szám: Matematikai számításokban használt numerikus adatok. A Szám típus bővebb leírását a Mezőméret tulajdonság témakörnél találjuk meg 1, 2, 4 vagy 8 bájt. Bájt 0 és 255 közötti számokat tárol (tizedeseket nem). 1 bájt Egész –32768 és 32767 közötti számokat tárol (tizedeseket nem). 2 bájt Hosszú egész: –2147483648 és 2147483647 közötti számokat tárol (tizedeseket nem). 4 bájt Egyszeres: Negatív értékek esetében –3,402823E38 és –1,401298E–45 közé eső számokat, pozitív értékek esetében 1,401298E–45 és 3,402823E38 közé eső számokat tárol. 4 bájt Dupla: 8 bájt Dátum/Idő: Dátum és idő értékek a 100 és 9999 közé eső években. 8 bájt Pénznem: Pénznemek és matematikai számításokban használt, maximum négy tizedesjegy pontosságú numerikus
adatok. A tizedesjeltől balra 15, a tizedesjeltől jobbra 4 számjegy állhat 8 bájt Számláló: Egyedi, egymást egyesével követő számok vagy a Microsoft Access által megadott véletlen szám, amelynek megadása akkor történik, amikor egy új rekord kerül hozzáadásra a táblához. Igen/Nem: Igen és Nem értékek valamint olyan mezők, amelyek két érték közül csak egyet tartalmaznak (Igen/Nem, Igaz/Hamis vagy Be/Ki). 1 bit OLE objektum: Egy Microsoft Access táblához csatolt, vagy abba beágyazott objektum (mint például egy Microsoft Excel adatlap, egy Microsoft Word dokumentum, grafika, hang vagy más bináris adat). Maximum 1 gigabájt (a rendelkezésre álló szabad lemezhely korlátozza). Hiperhivatkozás: Szöveg vagy szöveg és számok kombinációja, amelyek tárolása szövegként történik, és amely hiperhivatkozás-címként kerül alkalmazásra Keresés Varázsló: Létrehoz egy olyan mezőt, amely lehetővé teszi, hogy egy másik táblából vagy
listából válasszunk egy értéket, utóbbi esetben egy lista vagy kombinált lista segítségével. Kezdjük el a kitöltést! Alkalmazza a lista ▼ gombot! Figyeljük meg, hogy mennyire segítőkész a súgó! A csnév legyen szöveg, >L<??????????????????? 20 hosszúságú és Beviteli maszkjába írjuk be: Ennek hatására az első betű biztos, hogy nagy lesz, a többi biztos, hogy kicsi, akárhogy írtuk is be. Nagyon hasznos ez a szolgáltatás, hisz ha valaki más viszi be az adatokat akkor is 12. oldal bizton tudjuk, hogy a nevek hogy kerültek tárolásra. Az F1 itt is segít A "?" hatására csak betű vihető be. A cím tulajdonság legyen Családnév Indexelését állítsuk: Igen (lehet azonos)ra! Vagyis arra készülünk föl, hogy ezen mező szerint gyakran kell keresést végezni. A knév 15 hosszúságú, Beviteli maszkja és indexelése, mint az előzőnél, címe Keresztnév. Az órabér mező típusa: pénznem (és azon belül is
pénznem). Érdekes, hogy itt találjuk a százalék típust is!? E mezőnél 0 a tizedeshely és 000 a beviteli maszk tulajdonság. Azaz csak a tízes számrendszer számjegyei írhatók be. Az érvényességi szabály >150 And <1000 vagyis az órabér értékeit ésszerű (?) határok között tartjuk. Ennek ellentmondó bevitel esetén az érvényesítési szöveg tulajdonsághoz írt "Csak 150 ÉS 1000 közötti érték lehet!" üzenet jelenik meg és a helytelen adat nem tárolódik. 13. oldal A pótlék szám típusú, egyszeres, százalék, 1 tizedes. Mivel arra készülünk föl, hogy a többség nem kap pótlékot, ezért az alapértelmezett érték legyen 0. Így új rekord esetén ez az érték automatikusan beíródik, elég "Enterezni", csak néha kell átírni. Az utolsó két tulajdonság legyen: Nem Az óra legyen: szám, bájt, általános szám, 0 tizedes! Alsó két tulajdonság: Nem. A belép mező: dátum/idő, rövid dátum, a
beviteli maszkot a (varázsló)gombbal állíthatjuk rövid dátumra! Érvényességi szabály: <#1981.0101# , alá a megfelelő szöveget írjuk be! Utolsó kettő itt is: Nem. Mi a <1981-1-1 szöveget írtuk be és Enter után írta át a fenti formára az Access. A jellemzés utolsó két tulajdonsága: Nem. Figyeljük meg, hogy e fura mező esetén az Access fel sem ajánlja az indexelést! A kód elé a kis kulcsot az őt jelképező ikonnal (Elsődleges kulcs) helyeztük el. Álljunk a kód mezőre, majd kattintsunk az említett gombra! Ez lesz táblánkban a kulcs(mező). Így már érthető, hogy a három utolsó mezőtulajdonságot miért így választottuk (A kulcs minden rekordot egyértelműen kell, hogy azonosítson.) Ezzel elkészítettük tárolandó adataink szerkezetét, struktúráját. Már tettünk néhány intézkedést annak érdekében, hogy irreális adatok ne kerülhessenek tárolásra, hogy könnyebb, egyértelműbb legyen a keresés (indexelés,
nevek írásmódja). Ahhoz, hogy egy tábla mezőinek indexelését együtt lássuk, válassuk a Nézet menü Indexek pontját vagy a megfelelő ikont! Mentsük el a tábla szerkezetét Csapat néven! Megtehetjük ezt a Fájl menü Mentés pontjával vagy a floppy ikonra kattintva (avagy, ha le akarjuk zárni mentés nélkül az ablakot, akkor az Access felajánlja a mentést). 14. oldal Hangsúlyozzuk, hogy nem jön létre Csapat nevű fájl. Marad "csak" az EgyébMDB Vigye fel az adatokat! Próbáljon értelmetlen vagy nem megfelelő értéket beírni a különböző mezőkbe! Használja az Enter, Tab, , Esc billentyűket! (Utóbbit érvénytelenítésre.) A Nézet menüben tud átváltani a tervező és az adatlap nézet között (vagy a megfelelő ikonnal). Figyelje meg a Pótlékban beállított alapértelmezett érték hatását! Az adatbázis-kezelők "nem a memóriában, hanem a háttértárolón" dolgoznak. Tehát az Access is automatikusan menti a
rekordot, ha új rekordra állunk vagy bezárjuk a táblát, űrlapot. Lekérdezés Az adatbázissal való tényleges munkavégzés, információ-kinyerés fő eszköze a lekérdezés. Térjük rá most erre! Bizonyos feltétel(ek)nek eleget tevő rekordok kiválasztott mezőit jelenítjük meg. Leggyakrabban a választó lekérdezést használjuk. Itt nem újabb tábla jön létre, hanem csak a megfogalmazott feltételek tárolódnak a megadott néven. Kevéssel növeli az EgyébMdb fájl méretét. Beszédes információt kap a lekérdezésről a Súgó - Tárgymutató - lekérdezés, áttekintés mindkét pontjában. 15. oldal Említettük, hogy az adatbázisban nem tárolunk olyan adatot, amely a meglévőkből kiszámítható - számított mező. Első lekérdezésünkben írassuk ki a tagok fizetését is! Fizetés = (órabér + órabér * pótlék) óra = órabér (1 + pótlék) óra. Járjunk el így: Lekérdezések fül Új gomb Tervező nézet Csapat
Hozzáadás Bezárás. Az ablak alsó felében a QBE rácsot látjuk. Query By Example - Lekérdezés Példa Alapján Jelenítsük meg mindenkinek a nevét, az órabérét, a pótlékát, hogy hány órát dolgozott és a fizetését, de más adatot ne! A megfelelő mezőneveket húzzuk a rácsra vagy használjuk a ▼ listaikont! A számított mező esetén írjuk be a fizetés: órabér*(1+pótlék)óra képletet, majd Enter után ezt fogjuk látni: fizetés: [órabér]*(1+[pótlék])[óra]. A mezőneveket az Access tette [ és ] jelek közé. Nekünk csak akkor szükséges kitennünk, ha a mezőnév nem egy szó. A kis- és nagybetűket programunk csak ékezetes karakterek esetén különbözteti meg. A ikonnal futtathatjuk (hajthatjuk végre) a lekérdezést. A rendezés családnév, azon belül keresztnév szerint történt. Próbálja ki más mezőkkel is! Ha csak a Nagy családnevűek fenti adataira vagyunk kíváncsiak, akkor írjuk be a csnév mező Feltétel sorába,
hogy Nagy, Enter után átíródik "Nagy"-ra. Másik lehetőség, hogy új lekérdezést készítünk, de most nem a Csapat táblához, hanem az Egy lekérdezéshez, és itt írjuk be a Nagy feltételt. Ez utóbbi adja a Kettő nevű lekérdezést A Leóra pedig csak azokról szolgáltat információt, akiknek van pótléka (de azt nem jeleníti meg). A család- és keresztnév a képen látható módon "hozható össze" (A két idézőjel között szóköz van.) A név kiírása így szebb, emberibb Alkalmazzuk most a Vagy (Or) illetve És (And) műveleteket! 16. oldal Azaz egy sorba írva a feltételek ÉS művelettel kötődnek össze. Csak azon adatsorok jelennek meg, melyek mezői mindegyik feltételnek eleget tesznek. Ha a VAGY-gyal kapcsolt feltételek közül valamelyiknek eleget tesz egy mező, akkor az a rekord már megjelenik. Az 5 és 50 óra közöttiek kiszűrésére két megoldási lehetőség: Nézzük most mindazokat, akikre az igaz, hogy
Jani vagy János keresztnevűk és 250 az órabérük. Azaz (Jani VAGY 250) ÉS (János VAGY 250). Az 1970. után belépett Jánosok (és Janik) kiszűrésénél írjuk be a J[a,á]n* illetve a >1970-1-1 feltételeket! Emlékezzen vissza a szűrőgomboknál leírtakra! Próbáljon ki néhány azokhoz hasonlót ezen a táblán! Itt az alábbiakban a februárban belépetteket illetve a három legjobban fizetett adataiból íratunk ki. Az Access sok függvényt ismer, ízelítőül a Month()-ot mutatjuk be Egy dátum típusú mezőből a hónap sorszámát adja - lásd a Súgót. 17. oldal Utóbbinál álljunk a lekérdezés tervező nézetében a panel rész "szürke" részébe és kattintsunk a tulajdonságok gombra (vagy a jobb egérgomb után válasszuk a tulajdonságokat)! Tehát most nem egy mező, hanem a lekérdezés tulajdonságait látjuk és ezen tulajdonságok közül a csúcsértéket állítjuk be. A csúcsérték mezőbe írjuk be: 3 ! Általánosan is
igaz, hogy minden Access objektumnak (mezők, táblák, lekérdezések) vannak tulajdonságai, melyeket lehet állítani, változtatni. Az ábrán egy lekérdezés mezőjének tulajdonságai láthatóak. Jól gondoljuk át táblaneveinket, mert ha változtatunk, akkor a lekérdezésekben az Access nem javítja ki, így nem fogja megtalálni. Értesülésünk szerint az Access 2000-ben az automatikus névjavítás már beállítható. Kikről van feljegyzés? A jellemzés mező feltétel sorát így töltsük ki: Is Not Null (nem üres)! Hasznos szolgáltatás, hogy lekérdezéseinket paraméterezhetjük. Írjuk be a csnév mező feltétel sorába a [Kérem a családnevet] szöveget! (Most a [, ] jeleket is beírtuk! A szöveg mezőnév nem lehet. Ha egy mező nevét a QBE rácson elírjuk, akkor az Access paraméterként kezeli. Vagyis, ha egy lekérdezés futtatásakor olyan paramétert is kér rendszerünk, melyet mi nem terveztünk, akkor valószínűleg elírtuk egyik mezőnk
nevét.) Tehát futtatáskor egy nevet beírva a Paraméter megadása ablakba, azok a rekordok jelennek meg, melyek csnév mezője épp ez a név. A párbeszédablakba írt név helyettesítődik a QBE rácson a csnév mező Feltétel sorába. Futtatáskor adjuk a Kiss (kiss), illetve Nagy értékeket a felszólításra és figyeljük meg a hatást! Nem szükséges tehát külön Nagy, Kiss nevű lekérdezéseket gyártani (és tárolni), mint ahogy nincs külön DIR C: és DIR C:Windows stb. parancs sem 18. oldal Még sokoldalúbb lekérdezést kapunk a Like [Kérem a családnevet] hatására. Most futtatáskor használhatjuk a joker karaktereket is. A ? egy, míg a * tetszőleges számú karaktert helyettesít. Például ?i* Kiss és Pici, minden rekord. Nem csak egyetlen paramétert használhatunk. A Fölött, illetve Alatt szavakat [, ] jelek között írtuk be. Töltsük ki a Feltétel és a Megjelenítés sort is! Ha valamely mezőre vonatkozóan szeretnénk
számításokat végezni, tegyük a következőket! A Tervezés Nézet menü Összesítés pontját alkalmazva (vagy a ikont), használhatjuk az úgynevezett aggregáló (csoportosító, összegző) függvényeket. A megjelenő Összesítés sor kell kitölteni. Általános fülnél a Címhez írjuk be, Álljunk a pótlék mezőre, majd a tulajdonságok hogy Össz. pótlék Hasonlóan a belépnél a Legrégebbi jelzőt A jellemzés mező felirata jól látszik a tervező nézet ábráján. Válasszunk ízlésünk szerint! Az eredmény: Szebb kiíratást is el lehet érni, ha a mezők tulajdonságait átállítjuk: Az órabérnél az ábrán látható módon, a pótléknál pedig a Formátum Százalék. 19. oldal A függvények jelentése: AVG - Átlag SUM - Összeg MIN - Minimum COUNT - Darab Térjünk rá a csoportosításra! Az összesítést kapcsoljuk be ( )! Ha a csnév mező Összesítését Group By-ra állítjuk, akkor minden családnév pontosan egyszer jelenik
meg. Ha e mellé (jobbra!) az órabér mezőnél is Group By az Összesítés, akkor kicsinyke táblánkból 5 sort látunk, hisz kettő olyan rekordunk van, melyet a Nagy 200 adatok jellemeznek. Tehát családnév, azon belül órabér szerint végeztünk csoportosítást Vigyázat, nem mindegy, hogy melyik mező van jobbról! Próbálja ki! A csoportosítás és összegzés lehetőségét össze is vonhatjuk. Családonként az órák összege: A következő két ábrán a CsopÖssz2 lekérdezés tervező illetve adatlap nézete látható. A harmadik oszlopban "saját" függvényt alkalmaztunk, ezért szerepel a Group By sorában az Expression beállítás. Születési hely szerinti csoportosításban írassuk ki a fizetések összegét, de csak azok vegyenek részt e műveletben, akiknek 100% feletti a teljesítményük! Alkalmazzuk a Where záradékot! Egy egyszerűnek tűnő feladat: írassuk ki az átlag-órabér alattiak nevét és órabérét! Hát igen!
Belátható, hogy itt "kétszer kell végigmenni" a tála rekordjain. Első menetben kapjuk meg az átlagot, aztán az ennél kisebbeket kell megjeleníteni. Jelenlegi ismereteink 20. oldal szerint először az előbbiekben említett Avg függvénnyel kiszámolhatjuk az átlagot, ezt feljegyezzük, majd az órabér mezőben ez alapján szűrünk. Az elegánsabb megoldás csak a későbbiekben tárgyalandó SQL után lesz érthető. Íme az allekérdezés: Eddig csak a lekérdezések egy fajtájával, a választó lekérdezéssel foglalkoztunk. Lássunk egy-egy példát a többire is! A táblakészítő lekérdezés fizikailag (!) új táblát hoz létre. Alkalmazhatjuk például arra, hogy egy cég minden telephelyére eljuttassuk a rájuk (csak rájuk) vonatkozó publikus adatokat. A típust a nyíllal jelölt ikonnal (is) beállíthatjuk. Példánkban az Egy nevű lekérdezéshez hoztuk létre az Újat nevű táblakészítő lekérdezést. Az új tábla neve
értelemszerűen Nagy. Futtatáskor tájékoztat, hogy a létrehozandó táblában hány rekord lesz. Figyeljük meg, hogy ennek a táblának olyan mezője is van, ami az eredeti táblában nem szerepelt. Kapjon minden Nagy nevű 1000 forinttal többet. Ezt egy frissítő (módosító) lekérdezéssel valósíthatjuk meg. Hogy ne rontsuk el az eredeti Csapat táblát, a Nagy táblára alkalmazzuk, így nem kell szűrőfeltétel sem. Kérjünk új lekérdezést és a típust állítsuk most frissítőre, ekkor megjelenik a Módosítás sor. Itt a fizetés mezőbe írjuk be, hogy [fizetés]+1000 ! Ellenőrizzük, nyissuk meg a Nagy táblát! 21. oldal Fűzzük a Nagy-okhoz Elek Edét! Ahhoz a táblához készítjük el a hozzáfűző lekérdezést, amelyikből rekordo(ka)t akarunk fűzni egy másik táblához. Mivel a Csapatban nincs fizetés mező, annak tartalma a Nagy táblában üres marad. Ellenőrizze! A Hozzáfűzés sor egyes elemei akkor térnek el a Mező sorétól, ha a
két tábla mezőnevei nem ugyanazok. Töröljük ki a Nagy tábla Elek Ede rekordját egy törlő lekérdezéssel! Csak a csnév és Elek szavakat írtuk be. Futtassuk és ellenőrizzük a tábláknál! Ha nyitva vannak zárjuk be tábláinkat! Futtassuk az Újat lekérdezést és válasszuk a felülírást! Így visszakapjuk az "eredeti új" táblát. A kereszttáblás lekérdezés elkészítéséhez hívjuk segítségül a varázslót! A Csapat táblához készítjük el, a családnevek kerülnek a sorokba és az órabérek az oszlopokba. Az alkalmazott függvény pedig a darabszám (Count). 22. oldal A mezők átrakásához használhatjuk a > és >> gombokat! (A táblázatkezelők kimutatásához hasonlóan jelennek meg adataink:) A következő feladat ábráján látszik, hogy nem csak arra vagyunk kíváncsiak, hogy családonként mennyi az összes óra, hanem a részletek is szükségesek. Ezt lekérdezéssel nem tudjuk megoldani. 23. oldal
Ismerkedjünk meg a jelentésekkel! Jelentés Mikor használjunk jelentést? Ha adatainkat rendezetten szeretnénk megjeleníteni, kinyomtatni, ha csoportosításokat akarunk, ha összegző, összesítő műveleteket (is) szeretnénk végezni. Keresse a Súgó - Tárgymutató jelentés, áttekintés menüpontjait! Legyen nyitva az Egyéb adatbázis és az adatbázis-ablak Jelentések fül Új gombját válasszuk! Most a varázslókkal dolgozunk. Ha rekordjainkat rendezetten szeretnénk kiíratni, használjuk az Auto jelentés varázslókat! Jelentést (report-ot) mind táblához, mind lekérdezéshez 24. oldal készíthetünk. Az Oszlopos–t táblához (Csapat), a Táblázatos–t lekérdezéshez (Egy) készítettük el (Auto Jelentés). A diagram (Diagram néven) méretét tervező nézetben módosítottuk. A címke esetében pedig tervező nézetben állítottuk a nevet félkövérre és nagyobb méretűre, valamint itt végeztünk középre illetve jobbra igazítást.
Visszaváltani "kimenetre" a nyomtatási képpel lehet. Általában javasoljuk a varázsló használatát. Egyéni igényeinket tervező nézetben beállíthatjuk. 25. oldal Készítsük el a korábban említett családnév, keresztnév, óra jelentést, ahol is az egyes családnevek szerint összegezzük az órákat! Válasszuk most a Jelentés Varázsló menüpontot! A családnevek alkotnak csoportot. Rendezést (most) nem állítunk be Összesítési beállítások: 26. oldal A többi kérdésre válaszoljunk így: Az elrendezés: léptetett, a cím: félkövér, a jelentés címe Család. A nyomtatási kép után tervező nézetre váltunk. Töröljük ki a következő mezőt: "Összegzés: " & "csnév = " & " " & [csnév] & " (" & Count(*) & " " & IIf(Count(*)=1;"törzsrekord";"törzsrekord") & ")" ! Jelöljük ki (kattintsunk rá a bal
egérgombbal) és töröljük a Delete gombbal! Így készült el a lekérdezések végén közölt jelentés. Ezen a terven keresztül nézzük meg, mit is jelentenek a varázsló által elkészített jelentés részletei. Ismerkedjünk meg a jelentés szakaszaival! 27. oldal A Jelentésfej csak egyszer, a jelentés elején jelenik meg. Címek, dátumokstb helye Az Oldalfej minden oldal tetején jelenik meg. Oszlopfejek (mezőnevek) stb helye Minden olyan mezőnek, amely szerint csoportosítást végeztünk lesz fejléce. Ez a Csoportfej. Minden csoport elején jelenik meg A csoportra vonatkozó jellemzők helye Például a csoport neve. A Törzs a jelentés alapjául szolgáló rekordforrásból szolgáltatja az adatokat. A "fejekhez" hasonlóan tárgyalhatók a "lábak". Lásd az említett súgóhelyet! Ha a "részletek" nem érdekelnek bennünket, akkor az Összesítési beállításoknál válasszuk a Csak Összesítés pontot (Család2)! Tervező
nézetben a szakaszokon belül vezérlőelemeket (grafikus objektumokat) találunk. Ezek a formai kialakításban segítenek (pl. vonal), illetve ezeken keresztül kapcsolódik a jelentés az adatforráshoz (pl. beviteli mező). Itt és űrlapon használhatók A vezérlőelemeket a Nézet menü vagy az ikon segítségével tehetjük Eszközkészlet láthatóvá. Csak néhányat fogunk megemlíteni, bővebb információt a súgóból meríthet A Nézet menü Rendezés és csoportosítás pontjával, vagy a módosíthatjuk csoportosításunk tulajdonságait. ikonnal ellenőrizhetjük és Az egyes elemekre alkalmazhatunk különböző színeket (betű, kitöltés, szegély), de tartsuk mindig szem előtt, hogy az adatok a lényegesek és gondoljunk nyomtatónk képességeire is! Segítenek bennünket ebben a Tulajdonságok és az ikonok. Készítsünk most olyan jelentést, mely a belépési dátum szerinti csoportosításban az órabérek átlagát számolja ki! Csak az órabér és
belép mezőket vesszük föl. Összegzéshez átlagot (Avg) állítunk be. A Csoportosítási beállítások-nál a Csoportosítási intervallum (belép-re) legyen Év! Habár mi 10 évenkénti csoportokat szeretnénk 28. oldal A 10 éves csoportosítás: 10-es. ikon, majd az Év-nél a Szabjuk át céljainknak, ízlésünknek megfelelően a varázsló munkáját! Csökkentsük a jelentésfej magasságát! Vigyük a kurzort az Oldalfej szürke sávjának felső vonalára és amikor alakja megváltozik, nyomjuk le az egér bal gombját, majd (így lenyomva tartva) mozgassuk a kellő mértékben. Tüntessük el az Összegzés kezdetű "sort"! Szakaszaink legyenek minimális magasságúak. Több vezérlőelemet a Shift + egér bal gombja kombinációval jelölhetünk ki. Ha a kurzor tenyér alakú, akkor mozgatni lehet a (kijelölt) eleme(ke)t. 29. oldal (Ha a jelentésre (űrlapra) felrakunk egy mezőt, akkor megjelenik a neki megfelelő beviteli mező és a címke
is. Bármelyikre kattintva mindkettő kijelölődik és a tenyér alakú kurzorral együtt mozgathatók. Ha csak az egyiket szeretnénk mozgatni, akkor vigyük a kurzort a mezőt jelképező téglalap bal felső sarkának tömör négyzete fölé, ekkor a kurzor alakja kinyújtott mutatóujj lesz, ezzel vonszolva csak az aktuális mező mozdul el.) Kapcsoljuk be a Rendezés és csoportosítás ikont és a Csoportintervallumot állítsuk 10-re! A belép láblécében a címke mezőben az Avg szót írjuk át Átlag-ra. Kattintsunk duplát az Avg szóra (nem az =Avg(órabér)-re!) és írjuk át! (Tehetjük ezt úgy is, hogy a mezőre állva bekapcsoljuk a tulajdonságokat, majd ott a Formátum fül Cím sorába írjuk be az Átlag szót; vagy dupla kattintás az átírandó szóra.) Az Avg egy címke mező (magyarázó szöveg, felirat ez jelenik meg nyomtatáskor), az =Avg(órabér) pedig egy beviteli mező (képletet tartalmaz, annak értéke fog megjelenni nyomtatáskor). Csináljunk
jelentésláb szakaszt (azaz növeljük méretét 0-ról)! Az egérrel úgy dolgozhatunk, mint a fenti esetben a jelentésfej magasságának csökkentésekor. Kapcsoljuk be a vezérlőelemeket és helyezzünk el a szakaszban egy feliratot (címkét), majd egy beviteli mezőt! Utóbbinak töröljük a "szöveg részét"! E beviteli mezőbe írjuk be az =avg(órabér) számítási módot (képletet)! Azaz az összes rekordra vonatkozó átlagot is megjelenítjük. E mező tulajdonságaiból a formátumot állítsuk pénznemre, 0 tizedesre, a betűvastagságot kövérre, a kitöltő színt (világos) szürkére! A beállítások egy része a Formázás eszköztáron található ikonokkal is elvégezhető. És lám: 30. oldal Készítsük el a keresztnevek kezdőbetűi szerint csoportosítva az órák összegét! Ehhez a csoportosítási intervallumot állítsuk: Első betű-re! Vegyük észre, hogy az Access az első karaktert a =Left$([knév];1) függvénnyel "oldja
meg". Ha ügyesek és tapasztaltak (vagy legalább ezek egyike) vagyunk mi is felhasználhatjuk adatbázis-kezelőnk függvényeit. Ehhez segítségül hívhatjuk a szerkesztés ikont, majd ott a Kifejezésszerkesztő-t választva, de elérhetjük ezt a . alkalmazásával is, a Tulajdonságok, Adat mezőben. Néhány módosítást most is eszközöltünk varázslónk munkáján. Következő jelentésünk az Egy lekérdezéshez készült. Fizetések szerint csoportosítunk, 5 ezres intervallumokban. Most semmilyen összesítést nem végeztünk 31. oldal Végül lássunk egy kétszintű csoportosítást, az Egy lekérdezéshez! A csoportosítás csnév, azon belül órabér szerint történjen! Csak a csnév, órabér és fizetés mezők fognak szerepelni jelentésünkben. A családnév normál, az órabér 50-es csoportosítású. Csak a csnév, órabér és fizetés mezők szerepelnek a jelentésben. Utóbbira összegzést írunk elő. 32. oldal A Blokk stílust
átalakítva: Űrlap Mint említettük, az űrlapok a képernyőn való megjelenítés, a ki- és bevitel barátságosabbá tételének eszközei. Adatainkat eddig az adattáblába írtuk be, ami ugyan megfelelő, de nem szép, nehézkes és minden adat látható, hozzáférhető. Az előző fejezethez hasonlóan, itt is fokozottan támaszkodunk a varázslóra. A kimutatás varázsló az "Excel-be visz bennünket" (amennyiben telepítve van) és a kereszttáblás lekérdezéshez hasonló környezetben találjuk magunkat. A diagram varázslót a jelentéseknél már említettük. A tervező nézet lehetőséget választva egy üres űrlapot kapunk, melyet mi tölthetünk ki tetszésünk szerint - ha tudunk. A legjobban hasznosítható lehetőségeket vesszük most sorra: Első lépésben készítsünk egy olyan űrlapot, ahol a rekordjaink közül egyszerre csak egy jelenik meg. Mint egy kartonozóban Az Űrlapok fülön az Új gombot, majd az AutoŰrlap: Oszlopos varázslót
választjuk például az Egyéb adatbázis Csapat táblájához. 33. oldal Néhány másodperc múltán előttünk is az eredmény. Egy űrlap, űrlap nézetben Próbálja ki a másik két nézeteket is! Bevisz néven mentettük el. A mezők és rekordok között mozoghatunk a kurzorvezérlő, tabulátor, Page, Home, End billentyűkkel, illetve alkalmazhatjuk ezeket a Ctrl-lal együtt. Avagy "egerészhetünk" a ► és ►| illetve ►* gombok fölött. Utóbbi az új rekord gomb, az eddig felvitt utolsó rekord utáni helyre áll és felkínálja mezőit adatbevitelre. A legjobban fizetettek kiíratásához az AutoŰrlap: Táblázatos varázslót hívtuk segítségül. Az ábrán épp a varázsló munkájának kiegészítésén fáradozunk tervező nézetben. Bekapcsoltuk az Eszközkészlet és a Tulajdonságok gombot. A 3max lekérdezéshez készítettük és Lóvé néven mentettük el. Használtuk az előző fejezetben említett eszközkészlet felirat (címke)
gombját is Legjobban fizetettek. A Képes adatbázisban az OLE mezőt próbáltuk ki. Objektumok beágyazását és csatolását teszi lehetővé ez a mezőtípus. A tábla terve egyszerű Az objektumokat a Beszúrás - Objektum - Kép dokumentum (Bitkép alakzat illetve MIDI hangsorozat) lépésekkel vittük be. Mindig a Létrehozás fájlból lehetőséget választottuk és a Tallózás gombbal kerestük meg a megfelelő adatot. A csatolást nem kapcsoltuk be (beágyaztuk). Vigyázzon! Ha a kép mérete majdnem teljes képernyő, akkor ez a négy rekord néhány MB-os 34. oldal adatbázis! Próbálja a képeket csatolni. Ekkor kb kétharmadára "zsugorodik" az adatbázis, de így az objektumok nem szállítódnak az adatbázissal együtt. Adatlap nézetben persze csak ezt látjuk. Azaz csak egy utalást látunk a beszúrt objektumra vonatkozóan. Hogy lesz ezekből kép és hang? Dupla kattintásra természetesen megelevenednek objektumaink, ha telepítve van
gépünkön a megfelelő képnéző, lejátszó szoftver. És, ha nincs? Készítsünk űrlapot! Új - Tervező nézet az egyetlen táblához - mezők fölrakása, a kép mező méretének növelése után már az lapozgathatunk is űrlapunkon a képek között. Magától értetődő, hogy objektumot űrlap-nézetben is beszúrhatunk. Ha nem akarunk minden mezőt megjeleníteni, akkor vagy lekérdezéshez készítünk űrlapot, vagy az űrlapra nem rakunk rá minden mezőt. Jól használható e célra az űrlap varázsló, melyet a Csapat táblához készítettünk el és ezen a néven is mentettünk. A varázsló által felkínált mezők között a jelentéseknél megszokott módon válogathatunk, hogy melyek kerüljenek fel az űrlapra. Akinek az a feladata, hogy a ledolgozott órákat rögzítse, nem biztos, hogy átírhat más adatot. Olyan űrlapot hozunk létre, melyen olvasható (és csak olvasható) az illetőt azonosító, jellemző egy-két mező, de csakis a ledolgozott
órák számát lehet megváltoztatni. Kapcsoljuk be a tulajdonságok ablakot! A kód, csnév, knév mezők tulajdonságát az Adat fül, Engedélyezve sorában Nem-re állítottuk és ÓraBe néven tároltuk. Így mindenkinek látjuk a megengedett adatait, de csak a ledolgozott órák számát tudjuk módosítani. Az óra-t (mint címet) tervező nézetben írtuk át Ledogozott óra-ra. Kössük ki, hogy az óra*órabér nem mehet 100 ezer Ft fölé! (Mezők közötti érvényességi szabály.) Az óra (beviteli) mező tulajdonságát állítottuk be. ábrán látható Ekkor Elek Edénél az órabérhez 900-at, az órához 200-at írva ezt az üzenetet kaptuk. A parancsgombok illusztrálásához válasszuk a tervező nézetet új űrlap létrehozásakor! Kapcsoljuk be a vezérlőelemeket! A vezérlőelem varázsló legyen bekapcsolva! Válasszuk az eszközkészletből a parancsgomb lehetőséget. Az egér bal 35. oldal gombjának nyomvatartása mellett rajzoljunk az űrlap
törzsébe egy téglalapot. Majd válasszuk az űrlapműveletek, űrlap megnyitása pontokat. A jobb szemléltetés végett készítettünk három 2-re végződő nevű űrlapot melyek csak abban térnek el az azonos nevű nem 2-re végződőktől, hogy van rajtuk egy-egy parancsikon űrlap bezárására. Ezeket is az eszközkészlet varázslójával "raktuk fel". Tehát először válasszuk a Bevisz2-t, majd két Tovább gomb után a Szöveg rádiógombot választva, írjuk mögé: Bevitel! Majd Tovább és Befejezés. Járjunk el hasonlóképpen Lóvé2 és ÓraBe2 esetén is! A három gombot kijelölve az egér jobb gombja után az igazítás fel lehetőséggel éltünk és még egy űrlap bezárása parancsgombot, valamint egy feliratot is feltettünk az űrlapra. Űrlap nézetre váltva kedvünkre kattintgathatunk parancsgombjainkra! Űrlapunk hasonlóan működik, mint bármely más windows alkalmazás. Olvassa el figyelmesen a parancsgomb-varázsló által felkínált
többi lehetőséget is, lehet hogy szüksége lesz rá egykoron! Ha ennél többre, bővebbre van igényünk, akkor meg kell ismerkednünk a makrókkal. 36. oldal Makró Ha valamely feladatokat meghatározott sorrendben kell elvégeznünk, akkor ennek automatizálására makrót készíthetünk. Itt megadhatjuk, hogy mely menüpontokat, milyen parancsokat akarunk elvégezni egymás után. Azaz a makró néhány Access utasítás (menüpont) listája, melyet valamilyen néven el lehet tárolni az adatbázisban. Készítsünk egy parancsgombot, amelyre kattintva a következő feladatok kerülnek végrehajtásra: Nyissuk meg a Lóvé űrlapot és a Fizetés jelentést, majd az ablakokat rendezzük el lépcsőzetesen! Előbbit úgy, hogy ne lehessen módosítani adatot, utóbbit pedig nyomtatási kép nézetben. Válasszuk a Makrók fül Új gombját! Készítsük el első makrónkat (Első néven)! Először válasszuk ki a megfelelő műveletet a felkínált listáról, majd
töltsük ki az argumentumokat! A makrót (mentés után) futtathatjuk a gombbal. Próbálja ki! Most egy új (üres) űrlapot kérünk - Tervező nézet-ben. Az eszközkészlet varázsló gombját kikapcsolva helyezzük el a parancsgombot jelképező téglalapot! Majd a jobb egérgomb, Tulajdonságok menüpont Események fülre kattintva a Kattintásra pontnál állítsuk be az Első nevű makrónkat. Azaz a parancsgombra kattintva fusson le az Első nevű makró. Elvégeztük tehát a gomb és esemény összerendelést. 37. oldal Az űrlapot azért mentettük Elsohöz néven, mert Elsőhöz-ként az alábbi eljárásnál hibaüzenetet kaptunk. A parancsgombnak a Tulajdonságok, Formátum fül Kép pontjának segítségével válasszunk képet! Mégpedig az Emlékeztető-t. Mentsünk és űrlap nézetre váltva kattintsunk a kis csengőre! Egy másik - kevésbé komoly - példát talál a Hűha makró és a Makrós űrlap futtatásával, tanulmányozásával. Most a
parancsgombhoz nem képet rendeltünk, hanem a Tulajdonságok fül Cím sorába írtuk be a REJT szöveget. A makrókészítés lépéseit az ábrák mutatják. A parancsgomb-makró hozzárendelés az előzőhöz hasonlóan történhet. A modulok részt nem tárgyaljuk. (Visual Basic-ben jártas olvasó a Súgón keresztül tájékozódhat.) Emlékszik még az adatbázis = egyedek + tulajdonságok + kapcsolatok definícióra? Egyedekkel (táblákkal) dolgoztunk, tulajdonságokat elemeztünk, kapcsolatokkal azonban még nem foglalkoztunk. Ahhoz, hogy ezt megtegyük egynél több táblára lesz szükségünk. Először két táblával mutatjuk be a kapcsolatokat, azok tulajdonságait. 38. oldal Kapcsolatok A Dolgozók adatbázis Személy táblája már ismerős. Bővítsük most az adatbázist úgy, hogy a születési helyekről (azaz az egyes településekről) tárolunk bizonyos információkat! Lesznek amelyekről sokat, másokról kevesebbet, esetleg nincs említésre méltó
nevezetessége az illető településnek. Tehát a feljegyzés típust választjuk Eljárhatunk így is: Célunkat elértük, de adatbázisunk karbantartása így meglehetősen körülményes lenne. Nem is beszélve arról, hogy vannak adatok, melyeket sokszor tárolunk. Nézzük, milyen problémákkal kerülhetünk szembe! Például a Nagykanizsáról szóló leírás (ami lehetne több oldal is) annyiszor kerül tárolásra, ahányan ott születtek. Ha adatbázisunk e város környékének dolgozóit tárolja, bizony sokszor fog szerepelni ugyanaz a leírás. (Redundáns adat) Ha változtatni akarunk e település jellemzésén, akkor annyi helyen kell ezt megtennünk, ahány helyen szerepel adattáblánkban. És vajon mindenütt megtettük a változtatást? Ha csak egyetlen helyen tárolnánk, akkor elegendő lenne egyszer elvégezni a módosítást. Amit csak egy helyen tárolunk az az, az annyi - amit több helyen is, ott vagy elvégeztük jól az adatok
szinkronizálását (egyeztetését), vagy nem. Utóbbi esetben adataink egyértelműsége bizonytalan, mint a kutya vacsorája sötétedés után. Ha Kovács Pál kilép a cégtől (nyilvántartásunkban csak ő született Pápán), akkor erről a városról szóló leírásunk is törlődik. Ha aztán két hét múlva újra egy pápai születésűt alkalmazunk, akkor írhatjuk újra patinás városunk jellemzőit. Bizonyos települések adatait előre elkészíthetjük (pl. amerre toborozni megyünk dolgozókat). De ezeket hogyan tároljuk, ha még nincs kihez "kötni" Az adatbázis tervezésének elméletét a következő fejezetben tárgyaljuk részletesen. Most csak a lehetséges problémákból villantottunk föl. Ebben a szakaszban a kapcsolatok fontosságával, létrehozásával, tulajdonságaival foglalkozunk. 39. oldal Vágjuk szét ezt a sok aggodalmat okozó táblát két részre - két táblára! Legyen a nevük: Személy és Település! Kapcsoljuk
össze tábláinkat a Személy tábla szülhely és a Település tábla helység mezőjén keresztül! Emlékezzen! A relációs adatbáziskezelők a kapcsolatot úgy tuják megoldani, hogy a kapcsoló tulajdonságot (mezőt) mindkét táblában fizikailag tárolják. Tehát fontos, hogy a két táblában a helységek neve betűről-betűre megegyezzen. Figyeljük meg: A két mező nevének nem kell megegyeznie. A helység mező a Település táblában kulcs(mező). Hogyan hozható létre ez a kapcsolat az Access-szel? Hozzuk létre a két táblát a Dolgozók adatbázisban! Válasszuk az Eszközök menü Kapcsolatok pontját, vagy alkalmazzuk a Kapcsolatok ikont! Most válasszuk a Kapcsolatok menü Tábla hozzáadása pontot, vagy használjuk a hozzáadása ikont! Tábla Mindkét tábla hozzáadása után a helyiség mezőt (az egér bal gombjának nyomvatartása mellett) húzzuk rá a szülhely mezőre! Ezzel a kapcsolat létrejött, amint a grafikus kapcsolati ábra
mutatja. Válasszuk most a bezárás, majd az Igen gombot. a kapcsolat eltárolódott. Erről meggyőződhet, a Kapcsolatok gomb segítségével. Egyáltalán milyen kapcsolatok létezhetnek? Járjuk körbe ezt a témát! Ha a kapcsolatot szimbolizáló vonalra duplát kattintunk (vagy jobb gomb és szerkesztés), akkor ezt a tájékoztatást kapjuk: Vizsgáljuk meg a felkínált lehetőségeket! 40. oldal Ha másik mezők közötti kapcsolatot akarunk, akkor az ablak felső részében megtehetjük módosításainkat. Az utolsó sorban a kapcsolat típusa olvasható. Mit is jelent ez, milyen típusok vannak? A kapcsolatoknak típusa ismeretes. három Egy-az-egyhez (1:1). Ez esetben az egyik táblában kijelölve egy elemet (sort) a másik táblában is pontosan egy (neki megfelelő) elem jelölődik ki és igaz ez a másik irányban is. Például a személyi szám-TAJ szám kapcsolat ilyen Ekkor persze a két tábla összevonható egy nagyobbá ("szélesebbé"). De
ez nem mindig kivitelezhető: adatvédelmi törvény, tábla mérete túl nagy, tábla hordozhatósága Egy-a többhöz (1:N). A Személy táblában kijelölve egy elemet a Településben pontosan egy elem rendelődik hozzá (hisz csak egy helyen születhetett), fordítva azonban nem így áll a dolog (hisz ugyanott többen is születhettek). Több-a-többhöz (N:M). Gondoljunk a diákok-tanárok kapcsolatra! A relációs adatbázis-kezelők ezt a típusú kapcsolatot nem támogatják. Egy "közbenső" tábla "beiktatásával" oldják meg. Mielőtt a többi lehetőséget sorra vennénk készítsük el első lekérdezésünket, melyben mindkét tábla részt vesz. Szerepeltessük mindenkinek a nevét, születési helyét és annak leírását! E három tulajdonság nem egy táblában tárolódott. Egy lekérdezéssel tudjuk "egyesíteni" őket. Készítsünk új lekérdezést! A Személy és Település táblát adjuk hozzá a lekérdezés
tervéhez. A kapcsolatot az előbb elmentettük, így azt most (újra) nem kell létrehozni. A Személy tábla szülhely mezője helyett a Település tábla helység mezője is választható. Az eredmény látható. itt 41. oldal Milyen lehetőségeket kínál az illesztés típusa? Zárjuk le a lekérdezést és menjünk vissza a kapcsolatokra, álljunk a kapcsolatot jelképező vonalra, kattintsunk duplát és nyomjuk meg az Illesztés típusa gombot! A feltáruló ablak nyújtotta információt tanulmányozzuk alaposan! Magától értetődő. Nyissa meg az előző lekérdezést tervező nézetben és a kapcsolatot jelképező vonalra duplát kattintva állítsa az illesztési tulajdonságot 2-re! Ekkor a vonal nyíl formát vesz fel és a lekérdezést futtatva valóban megkapjuk minden település leírását. Térjünk rá a hivatkozási integritásra! Olyan szabályok rendszere, amelyet a kapcsolódó táblákban lévő rekordok közötti kapcsolatok érvényességének
biztosítására használhatunk. 42. oldal Próbáljuk beállítani adatbázisunk Kapcsolatok ablakában a Hivatkozási integritás megőrzése pontot. Ezt a hibaüzenetet kapjunk (Most célszerű lezárni az adatbázist és átmásolni más helyre. Aztán innen megnyitni Így ki tudjuk próbálni az alábbi - törléssel járó lehetőségeket és eredeti adatbázisunk sértetlen marad.) Jelöljük ki a Település tábla Liszó sorát, majd a Del billentyűvel töröljük! Tegyük ugyanezt a Pécs és Zalaegerszeg kezdetű sorokkal is, illetve a Személy tábla Nagy Pál, Zeg, . rekordjával! (Programunk nem tudja, hogy Zalaegerszeg környékén a város nevét sokszor rövidítve Zeg-ként írják!) Próbálkozzunk újra az integritással! És lám, sikerült! Figyelje meg a jelölést! 1 ∞ Ha most akarom törölni a Település-ből a Nagykőrös-ös rekordot, vagy Pápa-t írnám át Papa-ra a másik táblában, akkor a rendszer ezt nem engedélyezi. Ha a kaszkádolt
frissítést is bekapcsoljuk és a Település táblában átírjuk Nagykanizsa-t Kanizsa-ra, akkor a módosítás a Személy táblában is érvényre jut. 43. oldal Ha pedig a kaszkádolt törlést állítjuk be és a Településben törlünk egy Rekordot (olyan helységet, amelyik szerepel a Személy-ben), akkor figyelmeztetés után a #Törölt üzenet jelenik meg az utóbbi tábla törölt rekordjainak minden mezőjében. Következő feladatunk egy jelentés elkészítése. Helységenkénti csoportosításban a dolgozók nevét és fizetését kell megjeleníteni. Csoportonként átlagoljuk fizetésüket és minden csoport elején a neki megfelelő leírást jelenítjük meg. Látható, hogy az adatok nem egyetlen táblából származnak. A jelentést tehát egy lekérdezéshez készítjük el. A lekérdezés (most) csak azért kell, hogy "összehozzuk" a különböző táblákban tárolt adatokat. A lekérdezés és a riport neve is Kettős lesz. A Jelentés
Varázslót a Kettős lekérdezéshez választjuk. 44. oldal A varázsló munkáján néhány változtatást eszközöltünk (törlés, Avg felirat helyett Átlag, mező áthelyezése). 45. oldal Hogy adatainkat jobban át tudjuk tekinteni, készítsünk a Településhez űrlapot és ahhoz egy segéd űrlapot! Lássuk hol kik születtek! Segédűrlap Fontos! Ahhoz a táblához készítünk segédűrlapot, amelyiknek egy rekordjához a másik táblában több rekord is tartozik, vagy tartozhat. Tehát az egy-a-többhöz kapcsolat esetén vehetjük hasznát ezen szolgáltatásnak. A Településhez a Varázslótól oszlopos formátumát kértük. Majd tervező nézetben az eszköztárak gombjával rakjuk fel a segédűrlapot. Sorrend: Tábla/lekérdezés, Tovább, Tábla: Személy, neve, neme, fizetés, Személy megjelenítése, Tovább, Befejezés. Figyeljük meg, hogy létrejött egy Személy segédűrlap nevű űrlap is! Azaz a segédűrlap egy teljes értékű űrlap.
Űrlap nézetre váltva nézegethetjük rekordjainkat. 46. oldal Értesüléseink szerint megvalósították. ezt a lehetőséget az Office 2000-ben a táblák szintjén Három tábla kapcsolata Kapcsoljunk össze három táblát! A táblák tervezésekor a mezők tulajdonságai közül csak az elsőt és az utolsókat állítjuk, a többinél nem változtatunk az alapértelmezett értéken. Osztály (Osztály, Szakma) egy osztály egy szakmát tanul Tanár (TAZ, Név) Hol (TAZ, Osztály, Óraszám) - ki melyik osztályban, hány órában tanít. Hogyan készítsük el az összetett kulcsot? Jelöljük ki a TAZ és Osztály sorokat, majd ezután alkalmazzuk az Elsődleges kulcs ikont! 47. oldal Az Indexek ikonnal nézhetjük vagy módosíthatjuk az összetett kulcs beállításait. Ezekkel az adatokkal töltöttük fel a Tanár Diák adatbázist: Alakítsuk ki a kapcsolatokat! A Tanár TAZ mezőjét húzzuk a Hol TAZ mezőjére, az Osztály tábla Osztály
mezőjét pedig a Hol Osztály mezője fölé! Válasszuk a létrehozást, majd zárjuk le a kapcsolatokat, mentéssel! Írassuk ki, hogy ki, hol tanít! A lekérdezés tervezete: És annak eredménye Név szerinti rendezés után: 48. oldal Figyelje meg! A Tanár és Osztály táblák több-a-többhöz kapcsolata, két egy-a-többhöz kapcsolattal valósul meg. Normálformák, tervezés Hasznosítható kapcsolat csak megfelelően átgondolt, megtervezett táblák esetén építhető ki. A következőkben megint egy kis elmélet következik. Az adatbázis tervezése optimalizálása. Ezen azt a folyamatot értjük, melynek során igyekszünk elkerülni a kapcsolatok tárgyalásakor felsorolt () négy problémát. Következzenek a definíciók! (Emlékezzen! A tulajdonság, attribútum, mező szinonim fogalmak.) Funkcionális függőség: Legyen A és B két attribútum(halmaz). B funkcionálisan függ Atól, ha két sor A szerint megegyezik, akkor B szerint is Mondhatjuk úgy
is, hogy A funkcionálisan meghatározza B-t. Ha az előző adatbázist tekintjük, ott a Tanár táblában a TAZ meghatározza a Név tulajdonságot (attribútumot). Vagyis a Név funkcionálisan függ a TAZ tulajdonságtól (mezőtől). A Hol táblájában a TAZ és Osztály (együttesen) meghatározzák az Óraszám-ot, azaz az Óraszám funkcionálisan függ a {TAZ, Osztály} attribútumhalmaztól. Elsődleges attribútum: eleme valamelyik kulcsnak. Egyszerű kulcs (csak egy mező) esetén maga a kulcs. Például a Tanár táblában a TAZ mező. A Hol táblájában a TAZ és az Osztály. Másodlagos attribútum: nem eleme egyetlen kulcsnak sem. Például a Szakma és az Óraszám. Tranzitív függőség: Másodlagos attribútum határoz meg valamely tulajdonságot. 49. oldal Azaz az adott tulajdonsághoz a kulcson kívül "másik tulajdonságon át is eljuthatunk". Például a személy kódja meghatározza születési helyének nevét is és irányítószámát is. De
a település nevét az irányítószám is meghatározza. Hogyan találhatjuk meg az optimális adatbázishoz vezető utat? Szerencsére van "kitaposott" út. Mint ahogy egy matematika feladat megoldása során sem kell újra feltalálnunk a Pitagorász-tételt, elég ha tudjuk alkalmazni. Alkalmazni persze tudni kell! Hogy adatbázisunk mennyire optimális, azt normálformákkal jellemezzük. 1. Normál Forma: adataink elhelyezhetők egy táblában és minden mezőben max egy érték van, minden sor egyértelműen azonosítható 2. NF: 1 NF + a másodlagos tulajdonságok nem függhetnek a kulcs egy részétől 3. NF: 2 NF + nincs tranzitív függőség Ha nincs 1. NF-ben, akkor azt mondjuk, hogy nincs normálformában, vagy 0 NF-ben van Gondoljuk meg! Ha a szakma mezőbe beírnánk Kala Pál mindkét szakmáját (pék, sofőr), akkor hogyan találnánk meg őt, amikor sofőröket keresünk. Vegyünk egy fiktív adatbázist! Az egyes mezőket nagybetűkkel, a kulcsot vastag
betűkkel, a funkcionális függőséget nyilakkal jelöltük. A H-val jelölt tulajdonságot úgy értelmezzük, hogy csak az összetett A, C kulcs határozza meg. A B E C D F H G 1. NF Néhány példa: Elsődleges attribútum: A, C Másodlagos attribútum: B, E, H Funkcionális függőség: B az A-tól, E a D-től. Tranzitív függőség: D a C-től és E a D-től, de E a C-től is. 50. oldal Adatbázisunk azonban nincs 2. NF-ben, mert van olyan másodlagos tulajdonság (például D, E), amelyik a kulcs egy részétől függ. Szemléletesen vannak nyilak, melyek csak az A-ból, vagy csak a B-ből indulnak ki. Második normálformára úgy térhetünk át, hogy (ebben az esetben) három részre vágjuk eredeti táblánkat. Kell, hogy legyen egy A, C kulcsú, mert H-t csak ezek közösen határozták meg. A másik kettőt pedig úgy választjuk, hogy az legyen a kulcs, ahonnan nyíl(ak) indul(nak) ki - kulcsjelölt mező - és hozzávesszük az általa funcionálisan
meghatározott tulajdonságokat. Mivel H-t csak az A,C kulcs határozza meg, így H nem függhet a kulcs egy részétől, a másik két táblában pedig egyszerű kulcs van. Egyszerű kulcs (egy mező) esetén viszont, ha a tábla 1. NF-ben van, akkor 2 NF-ben is van Már csak a tranzitív függőséget kell megszüntetnünk. Most a D a kulcsjelölt mező (Belőle indulnak ki nyilak.) Van(nak) mező(k), melyeket D határoz meg E A A C D C F G B H 2. NF Újfent a kettévágás műveletét alkalmazzuk az egyik táblára. A kapcsolatokat "kettős" nyilakkal szemléltetjük. A A D C C B H G D 3. NF E F 51. oldal A Cikkek adatbázis Vegyünk egy konkrétabb példát! A rendelések így érkeznek be: Rendelési szám Dátum Vevő adatai (szám, név, cím, tel.) Cikkszám név -”-”-”- ár darab Összeg (=ár * darab) Összesen Tervezzük meg az adatbázist! Milyen mezőink lesznek, lehetnek? Rendsz - rendelési szám. Egy rendelést azonosít: ki,
mikor miket rendelt Mikor - a rendelés dátuma. Vevősz - vevőszám, a vevő azonosítója Csnév - a vevő családneve. Úgy gondoljuk könnyebb lesz ilyen tervezés mellett keresni, mint ha a teljes nevet egy Név mezőben tárolnánk. Knév - a vevő keresztneve. Hely - a vevő melyik helységben lakik. Megint arról van szó, hogy ne tároljuk az egész címet egyetlen mezőben, mert így romolhat keresési hatékonyságunk, lehetőségünk. Cím - az előzőhöz tartozó utca, házszám. Tel - a vevő telefonszáma. Cikksz - az áru azonosítója, a név nem elegendő (más gyártó, más ár). Név - az áru megnevezése, neve. Ár - az áru ára. Db - a rendelt darabszám. Összeg = Ár * Db számított mező, ezért nem tároljuk. Össesen számítható, ezért nem tároljuk. 52. oldal Név Cikksz Rendsz Ár Csnév Knév Mikor Hely Vevősz Cím Db Tel Megállapodunk abban, hogy egy cikkszámú árunak csak egy neve van, egy vevőszámhoz csak egyetlen név,
cím tartozik. Azaz úgy értelmezzük, elegendő minden mezőben egy értéket tárolnunk. Adatbázisunk tehát első normálformában van. Mint az ábráról látható nincs (még) másodikban (sem). Ugyanis az Ár függ a kulcs egy részétől (Cikksz-től) és van tranzitív függőség is (Csnév Rendsz-től és Vevősz-től is). Ekkor táblánk még így nézne ki: Mi is a "rossz" ebben? Néhányat említünk: 53. oldal Vannak adataink, melyeket többszörösen tárolunk, például a Hely, Tel mezőkben. Ezektől adatbázisunk csak nagyobb, de nem több(et mondó). Ha Nagy Ili telefonszáma megváltozik, akkor sok helyütt kell elvégeznünk a módosítást. Ha az első rendelést valamiért törölni kell, akkor elvész a Video minden adata is. Hogyan tudunk felvenni adatbázisunkba olyan árut, amiből még nincs rendelés? Hozzuk 2. NF-re! Adjunk nevet Tábláinknak! CIKK TÉTEL Név Cikksz Rendsz Ár Cikksz Db RENDELÉS Csnév Knév Rendsz
Mikor Hely Vevősz Cím Tel Így már (a CIKK táblába) tudunk felvenni új árut. Ha egy árunak az ára változik, akkor csak egyetlen helyen kell kijavítanunk. A RENDELÉS táblában viszont még maradtak problémák. Ezért ezt a táblát kettévágjuk VEVŐ RENDEL Rendsz Mikor Csnév Knév Vevősz Hely Vevősz Cím Tel 54. oldal Négy táblánk lett (Cikk, Tétel, Rendel, Vevő) és adatbázisunk 3. NF-ben van Tartsa szem előtt mindig ezt az idézetet! Legyen az adatbázis neve: Cikkek és alakítsuk ki a kapcsolatokat! A hivatkozási integritást bekapcsoltuk. Lássuk mindezt néhány adattal: ". nem akkor alkottál tökéleteset, ha már nem tudsz mit hozzátenni, hanem ha már nem tudsz mit elvenni belõle." (Saint-Exupéry) Milyen problémáink is voltak normalizálás előtt? Megoldódtak ezek? Jól látható, hogy Nagy Ili telefonszáma, a 2d cikkszámú áru ára csak egyetlen helyen szerepel adatbázisunkban, így az esetleges módosítást
csak egyszer kell megtenni. A Cikk táblába felvehetünk olyan árut is, amelyből még senki nem rendelt. A Rendel tábla első sorát törölve nem vesznek el a d8-as vevő adatai. Készítettünk itt is néhány lekérdezést. Az Egy kezdetűek egy táblához készültek, az Össz kezdetűekben összesítés szerepel, a Több kezdetűek több táblához készített lekérdezések. Az S-sel kezdődők pedig az SQL tárgyalását fogják segíteni. Haladóknak szól az alábbi két allekérdezés (lásd SQL). A többi az eddigiek alapján adódik, gyakorlásnak szánjuk. Akik a 7x cikkszámú aruból rendeltek, mit rendeltek még? 55. oldal Az átlagárnál drágább termékek: A Cikktétel segéd űrlapon egy segédűrlap található (Tétel segédűrlap), amely azt mutatja, hogy az adott cikkszámú áruból milyen darabszámú rendelések voltak. Az új rekord ( * ) sorban az 1 azért jelenik meg, mert ez az alapértelmezett érték. Hogy is készíthetünk ilyen űrlapot?
Készítettünk már ilyet a Település-Személy táblák esetén. Válasszuk az AutóŰrlap: Oszlopos-t a Cikk-hez. Tervező nézet, a Törzs mezőt növeljük, majd az eszközkészlet Segédűrlap gombjával (varázsló bekapcsolva!) egy télalapot rajzolunk. A Tábla/lekérdezés választása után a Tábla: Tétel Db mezőjét rakjuk át. Vegyük észre, hogy létrejött a Tétel segédűrlap nevű űrlap is! (Mely "közönséges" űrlapként is használható.) A számított mező felvitele az űrlapra: Eszközkészlet Beviteli mező gombja (varázsló bekapcsolva), rajzolunk egy téglalapot, majd beírjuk 56. oldal az =1,25*Ár képletet és a címkét átírjuk erre a szövegre: ÁFA-val. A feladatot megoldhatjuk a tulajdonságok ablak segítségével is. Eljárhatunk így is: lekérdezést készítünk, ott számított mezőt alkalmazunk, majd ezen lekérdezéshez "varázsolunk" űrlapot. A Beviteli mezőnél: Hívhatjuk a Kifejezésszerkesztőt is a
gombbal. A Címkénél pedig: Vigyünk fel egy új rendelést! A Rendel táblával kezdjük. A rendelési számot mi adjuk. Ha már van ilyen a Rendel táblában, a rendszer figyelmeztet, hisz ott ez a mező a kulcs. De hogyan írjuk be ebbe a táblába a vevőszámot? Embertelen dolog "kívülről" tudni ezeket a kódokat. A vevő nevét, címét szokás kérdezni, ismerni Segítsünk magunkon! Készítsünk a Rendel táblához egy (üres) űrlapot és helyezzük el rá a mezőket a mezőlista gombbal. Most egy Vevőnéző makrót írunk: 57. oldal Vegyük elő a vezérlőelemeket. Az űrlapra egy Parancsgombot helyezünk (varázsló nélkül!). Aztán a tulajdonságainál elvégezzük a parancsgomb-makró összerendelést A megfelelő képet a parancsgobra így helyezhetjük: Parancsgomb, tulajdonságok, formátum, kép és itt a gomb kínálja a lehetőségeket. A szeművegre kattintva feltárulnak előttünk vevőink adatai. Így már könnyebb kikeresni és
beírni a vevőszámot. Azaz az egyik ablakban megnézem és beírom a másikba. "Válámi ván, de nem áz igázi!" A könnyebb, emberibb felhasználásért persze meg kell küzdenünk. Készítsünk még jobb űrlapot a bevitelhez, egy "profi" felületet! 58. oldal Az elkövetkező űrlapkészítés nem a "csak ismerkedőknek" szól! Készítsük el először az Újcikk űrlapot (a Cikk táblához), amellyel új cikket lehet felvenni adatbázisunkba. A parancsgombot a varázsló segített létrehozni: Űrlap bezárása Hasonlóan jártunk el az Újvevő esetében is (a Vevő táblához). Az "alapűrlapon" (új űrlap, tervező nézet, nincs kiválasztott objektum) egy címke és négy parancsgomb látható. Az Új cikk gombot most is a varázsló segítségével raktuk fel: Űrlapműveletek, űrlap megnyitása, Újcikk űrlap, a kép helyett a szöveget választottuk és a felajánlott feliratot átírtuk Újcikk-re. A Bevitel gomb és
a hozzárendelt Be makró 59. oldal hasonlóan készíthető el, mint az előző eset vevőnézője. A Be makró a Bevisz1 űrlapot nyitja meg és a végére ugrik, az eddigi utolsó után (új rekord). A Bevisz1 űrlap (a Rendel táblához) tervezete: A vevőszámot listával kerestettük ki a Vevő táblából. Az eszközkészlet varázslóval így működik: Honnan keresse ki: ikonja a 60. oldal Mi kerüljön föl a listára? Azaz: Természetesen a Vevősz-ot kell választanunk: 61. oldal És azt a vevőszámot amit a Vevő táblából kikeres, eltárolja a Rendel tábla vevőszámában. Név, cím alapján kattinthatok és a kód (Vevősz) kiválasztódik! Még egy cím és kész is: A "pipa" gombhoz eseményvezérelt eljárás tartozik kattintásra (rekord mentése). A varázslóval hoztuk létre (vezérlőelemek!), de a felajánlott kép helyett a pipa opciót választottuk. Majd az Egérgomb felengedésére eseményhez a Be1 makrót rendeltük. A
Be1 makró csak abban tér el a Be makrótól, hogy a Bevisz1 helyett a Bevisz2-vel végzi el mindkét műveletet. Tehát, ha a Bevisz1-en a "pipára" kattintok, megtörténik a rekord mentése a Rendel-ben, majd a gombot felengedve megnyílik a Bevisz2 űrlap új rekord felvitelére. Gyakorlatilag a kattintás (lenyomom-felengedem) hatására mindkét esemény végbemegy. A Bevisz2 űrlap tervezete: 62. oldal Itt a cikkszámot kerestettük ki egy listával a Cikk táblából. A pipához most a Be2 makró tartozik: Van egy nagyon lényeges kérdés. Honnan tudja a Bevisz2 Rendsz mezője, hogy mit írtunk be a Bevisz1 Rendsz mezőjébe? Hisz az egyik a Rendel, míg a másik a Tétel táblába dolgozik?! A probléma megoldása: a Bevisz2 Rendsz mezőjének Adat tulajdonságainál az Alapértelmezett érték legyen =[Űrlapok]![Bevisz1]![Rendsz]. (Ennek beírásában segít a kifejezésszerkesztő.) Így érjük el, hogy a Bevisz2 Rendsz mezőjében megnyílásakor ott
van az előző (Bevisz1) űrlapon beírt érték. Hát ez bizony nem volt könnyű! De látva a "program" működését, lehet némi elégtételünk. És ne feledjük, mindig az elsőt a legnehezebb megcsinálni. 63. oldal Végezetül az Összes lekérdezéshez Rendsz szerint csoportosítva készítsük el jelentésünket, mely olyan formában mutatja rendeléseinket, ahogy azok beérkeztek. A csoportosítás: Összesítést pedig csak az Összeg-re írunk elő: Sum. Átrendezve a varázsló munkáját: A kimenet egy részlete: 64. oldal Térjünk vissza a Dolgozók adatbázishoz! Nézzük most "tervező szemmel"! Ha nem az AZ kulcsot választjuk, akkor nekünk kellene adni valamilyen kódot dolgozóinknak, vagy a jelenlegi 2., 3 és 4 mező lehetne a Személy tábla kulcsa. De ez utóbbi egyértelműsége bizonytalan A másik tábla felépítése egyértelmű. Mi lehetne jobb? Tételezzük fel, hogy 500 ember és 80 település adatait vittük fel. Ez
reális A szülhely (illetve helységnév) mező karakteres és legalább 20 a szélessége. Ez 500 ⋅ 20 + 80 ⋅ 20 = 11 600 egység. (A többi mező változatlan) A Személy táblában a szülhely helyett az irsz mezőt tároljuk, amely a születési hely irányítószáma. Ez szöveges mező és 4 egységen elfér Természetesen ekkor a Település táblában három mező lesz. Ide is fel kell venni az irsz mezőt. Ez lesz itt a kulcs Úgy tűnik így több hely kell. De nem, hisz most 500 ⋅ 4 + 80 ⋅ 4 + 80 ⋅ 20 = 3 920 egység csak Kicsinyke adatbázisunkban ez 7 680 egység eltérést jelent. Ez nem kevés! Igaza van a Tisztelt Olvasónak, ha úgy érzi: itt valami gyanús. Neve Irsz Szüldát AZ Helység Irsz Leírás Neme Teljesítmény Szocjuttatás Fizetés Igen! A Település táblában tranzitív függőség van. Azaz egy kis jóakaratú belepiszkálással elértük, hogy már nincs 3. normálformában adatbázisunk Tervezzünk újra! Vágjuk ketté ezt a
táblát! Két lehetőségünk van: Irsz Helység Helység Leírás Vagy pedig: Irsz Helység Irsz Leírás 65. oldal Az első esetben 80 ⋅ (4 + 20) + 80 ⋅ 20 = 3 520 , a második esetben 80 ⋅ (4 + 20) + 80 ⋅ 4 = 2 240 a vizsgált mezők helyigénye. Az utóbbi mellett szól az a meggondolás is, hogy az Irsz - Helység alkotta tábla jól hordozható, másutt is felhasználható. A Kölcsönzés adatbázis Utolsó előtti példánk egy kölcsönző (nagyon leegyszerűsített) nyilvántartása. Tárolnunk kell az alábbiakat: Lsz az eszköz (amit kölcsönözni lehet) leltári száma Megnev az eszköz megnevezése Leírás az eszköz leírása Díj a kölcsönzés díja Ki a kikölcsönzés dátuma Vissza mikor kell visszahozni TagNév a kölcsönző neve TagCím a kölcsönző címe Egy problémát említünk csak. Mi van, ha Nagy Sándor fiát is ugyanígy hívják, egy (nagy) házban laknak, de különböző vállalkozásuk folytán mást
kölcsönöznek? Célszerűnek látszik egy TagKód azonosító bevezetése. Kínálja magát a két kulcsjelölt mező: Lsz és TagKód. Megegyezünk abban, hogy csak egyféle kölcsönzési díja van minden eszköznek és csak egy neve, valamint címe tárolandó minden kölcsönzést végző tagnak. (Pl nem tároljuk három mezőben a Galántai Fekete Attila nevet.) Ezen megállapodások biztosítják, hogy elértük az 1. normálformát 66. oldal Megnev Leírás Díj Lsz Ki TagKód Vissza TagNév TagCím Figyeljük meg az ábrát! Pl. a Megnev, Leírás, TagNév (funkcionálisan) függ a kulcs egy részétől. Az előbbi kettő az Lsz-től, utóbbi a TagKód-tól Hogy 2. normálformára hozzuk adatbázisunkat, szét kell vágni a táblát Lesz egy Lsz és egy TagKód "központú" tábla. De kell lennie egy olyannak is, ahol az Lsz-TagKód kettős a kulcs, hisz a kölcsönzés dátumait ezek csak közösen határozzák meg. (Melyik tag, mit mikor kölcsönzött.)
Kölcsönzés Tag Lsz TagKód TagKód Ki TagCím TagNév Vissza Eszköz Lsz Leírás Megnev Díj Mivel tranzitív függőség egyik táblában sincs, így egyúttal 3. NF-be jutottunk Tábláink tervezete: 67. oldal A kapcsolatokat így alakítottuk ki: Lekérdezések: Ki (melyik tag), mit, mikor kölcsönzött? Adott időpontig vissza nem hozottak. Vissza: üres mező vagy az adott időpontig nem hozták vissza, de (és) Ki: nem üres valamikor kikölcsönözték. Paramétereztük. Melyik (nevű) eszközt hányszor kölcsönözték? 68. oldal Készítünk egy űrlapot a kölcsönöz táblához (Űrlap varázsló: Oszlopos, Len). A listákat a varázslóval raktuk fel. (Eszközkészlet) Az egyik a Tag táblából keresi ki a TagKód-ot és a Kölcsönöz tábla TagKód mezőjében tárolja, a másik az Eszköz táblából hozza a leltári számot és helyezi el a Kölcsönöz Lsz mezőjében. (A kulcsmezőt az ajánlat ellenére, nem rejtettük el.) Az
alábbi űrlapot is a varázslóval készítettük a Minden nevű lekérdezéshez. (A lekérdezésben minden mező szerepel.) Az űrlapot Fő, a segédűrlapot Segéd néven mentettük. 69. oldal Éltünk a felajánlott, Űrlap segédűrlappal lehetőséggel. (Természetesen ezt a lehetőséget csak akkor kínálja fel az Access, ha egy-a-többhöz kapcsolathoz kérünk űrlapot és több táblából rakunk fel mezőket.) A Karton vezérlőelemről a súgóban tájékozódhat. Miket néven készült egy lekérdezés az Eszközök és Kölcsönöz táblákhoz. Majd ehhez egy jelentés, amely arról tájékoztat bennünket, hogy melyik eszközt hányszor kölcsönözték és ezeknek mennyi az volt összdíja. Mindezt negyedéves bontásban 70. oldal A csoportosítás: Kicsit átalakítva a varázsló munkáját (leszedtük a Ki mezőt): 71. oldal Lekérdezés nélkül is megoldhattuk volna a feladatot: Jelentés varázsló a Kölcsönöz-höz, ebből átrakjuk a
szükséges mezőket (Lsz, Ki), majd az Eszköz táblából is (Megnev, Díj). Végezetül egy oktatással foglalkozó cég adminisztrációját modellezzük. Az Stb Bt adatbázis Tárolni kell a tanfolyamról: Elnev mi az elnevezése Óraszám hány órás Tandíj mennyi a tandíja Indul az indulás dátuma Fizetve befizették-e már a díjat Név a hallgató neve Cím a hallgató címe Végzettség a hallgató végzettsége Tételezzük föl, hogy egy tanfolyamhoz, emberhez csak egyféle név, elnevezés, díj tartozhat. Így 1 NF-ben van adatbázisunk Legyen a neve Stb Bt A tanfolyamot a (pontos) elnevezése még nem azonosítja. Az óraszámmal és az indulás dátumával együtt sem! Hiszen indulhat két egyforma egyszerre. Felveszünk hát egy TanfKód azonosítót. Hasonló okok vezetnek a HallgKód mező felvételéhez. 72. oldal Vegyük észre, hogy a Fizetve tulajdonságot csak az összetett kulcs határozza meg. Ugyanazon hallgató több tanfolyamra is
járhat és lehet hogy az egyiket befizette, míg a másikat (még) nem. Elnev Óraszám Tandíj TanfKód Típus Indul HallgKód Név Cím Fizetve Végzettség Azonos típusú kurzusok esetén az elnevezés, óraszám és tandíj megegyezik. Eddigi tervezésünk alapján lehet, hogy sokszor fog szerepelni a Számítógép-használó, 250, 60 ezer "sor", más-más indulási dátummal. Ezen segíthetünk, ha felveszünk egy Típus tulajdonságot A TanfKód és HallgKód kivételével a többi tulajdonság másodlagos és csak a fizetve nem függ a kulcs egy részétől, a többi igen. Ezt kell megszüntetni, hogy 2 Normálformára hozzuk adatainkat. Lesz egy Tanfolyam és egy Hallgató táblánk, a nekik megfelelő kulccsal, valamint lennie kell - Fizetve miatt - egy olyan táblának is, ahol csak TanfKód és HallgKód együtt kulcs (Jelentkezés). Jelentkezés Hallgató TanfKód HallgKód Név HallgKód Cím Végzettség Fizetve Tanfolyam Elnev Óraszám TanfKód
Tandíj Típus Indul 73. oldal Az első két tábla már 3. normálformában van A Tanfolyam-ot a tranzitív függőség miatt ketté kell vágni. Adódik egy TanfKód kulcsú Tanfolyamok és egy Típus kulcsú Típusok tábla. Tanfolyamok Típusok Elnev Típus Típus TanfKód Indul Óraszám Tandíj E négy tábla már 3. NF-ben van Gondolja meg! Ha a Fizetve tulajdonságot nem tároljuk, akkor a Jelentkezés táblában nincs másodlagos tulajdonság. Csak a több-a-többhöz kapcsolat megvalósítását szolgálja Készítsük el Access tábláinkat és töltsük fel őket néhány adattal! A Fizetve mező Igen/Nem (logikai) típus. Alapértelmezett értékéhez a -1 (Igaz) értéket írtuk be. De használhattuk volna a True, vagy Yes értékeket is. Figyeljük meg, mit jelent ez adatbevitelnél! Milyen tanfolyamok indulnak? Futtassa a lekérdezést így is: sz*, illetve e ! 74. oldal Írassuk ki végzettségenként csoportosítva, hogy eddig mennyit fizettek be
tandíjként. Jelenítsük meg ezen csoportosításban a tandíj/óraszám átlagát is! Az ábrák a lekérdezés tervezetét, majd az ahhoz készült jelentést mutatják, amikor *e-gal indítjuk. ("Paraméteres" jelentés) (A név láblécet "leszedtük".) Az SQL alapjai Az SQL neve a Structured Query Language kifejezésből származik, ami Strukturált Lekérdező Nyelvet jelent. Szabványai a 80-as évek közepétől alakultak ki Egyfajta programozási nyelv. Ha egy „butuska”, de precíz, szorgalmas "gépet" arra akarunk rábírni, hogy valamit megcsináljon, elvégezzen, akkor kétféle megközelítés adódik. Lépésről lépésre leírjuk neki a teendőket, fölkészülve a felmerülő lehetőségekre (szekvencia, elágazás, ciklus). Ez egy tipikusan programozói szemlélet De a legtöbb felhasználó nem programozó! 75. oldal Másik lehetőség, hogy nagyon pontosan leírjuk: milyen adatforrásokból, milyen feltételeknek
eleget tevő, milyen adatokra van szükségünk. Ilyen az SQL Az SQL mindig ott van a háttérben, amikor az Access-szel információt nyerünk ki adatbázisunkból. Ha előfordult már Önnel, hogy tévedésből (még jobb, ha kíváncsiságból) a lekérdezések harmadik nézetére váltott, akkor valami hasonlót láthatott a Dolgozók adatbázis, Számított mező lekérdezésénél: SELECT DISTINCTROW Személy.neve, Személyfizetés, [fizetés]+[szocjuttatás] AS Összesen FROM Személy ORDER BY Személy.neve; Amit valahogy így lehetne megfogalmazni magyarul: A Személy táblából válogasd ki a neve és fizetés mezőket, valamint a fizetés és szocjuttatás mezők összegét és ez utóbbit Összesen-nek nevezd! Ha vannak azonos rekordok, akkor csak egyet jeleníts meg közülük! Írj ki minden adatsort (növekvő) névsorban! Tehát egy lekérdezés ezen a nyelven egy-két felszólító mondat ";"-vel a végén. Az Access szemet huny, ha nincs ";", de
nem mindegyik SQL verzió teszi ugyanezt. Nézzünk egy másik példát ugyanebből az adatbázisból: Kapcsolatos: SELECT DISTINCTROW Személy.neve, Településhelység, Településleírás FROM Település INNER JOIN Személy ON Település.helység = Személy.szülhely ORDER BY Személyneve; A középső sor jelentése: Kapcsold a Település táblához a személy táblát szoros illesztéssel! Azaz egyesíti a két tábla rekordjait a helység és szülhely mezők azonos értékeire. A Kapcsolatos2 a Település tábla minden rekordját megjeleníti (laza illesztés), azokat is, melyekhez nem tartozik adat a Személy táblában. SELECT Személy.neve, Településhelység, Településleírás FROM Település LEFT JOIN Személy ON Település.helység = Személy.szülhely; Az alábbi lekérdezés futtatatásakor pedig a Személy táblának jelenik meg minden sora: SELECT Személy.neve, Településhelység, Településleírás FROM Település RIGHT JOIN Személy ON
Település.helység = Személy.szülhely; Emlékezzen vissza az illesztés három típusára! (41. oldal) Ezek a kulcsszavak nem minden SQL-ben találhatók meg. Ezért inkább az általánosabb leírást használjuk. 76. oldal Az SQL mondatainkat írhatnánk egy sorba is, de az áttekinthetőbb tagolt írásmódot követjük. Elsőként ismerkedjünk meg a Select utasítással. Arra utasíthatjuk vele rendszerünket, hogy egy adatbázis előírt értékeit megjelenítse. SELECT mezőnév1, mezőnév2, milyen mezőket jelenítsen meg FROM tábla1, tábla2, melyik táblákból WHERE milyen feltételek szerint GROUP BY milyen csoportosítás szerint HAVING a csoportosítás feltétele ORDER milyen rendezési szempont szerint Maradjunk a Dolgozók adatbázisnál és tekintsünk meg néhány példát! S 1 a Település tábla minden adata: SELECT * FROM Település; S 2 minden mező mindenkinek a neve és fizetése: SELECT neve, fizetés FROM Személy; S 3
dolgozóink milyen településeken születtek: SELECT DISTINCT szülhely FROM Személy; S 4 minden szülhely csak egyszer jelenjen meg 50 ezer fölötti fizetésűek: SELECT neve, fizetés FROM Személy WHERE fizetés>50000; kérem a neve és fizetés mezőket a Személy táblából ahol a fizetés 50 ezer fölötti Nézze meg a lekérdezést adatlap, majd tervező nézetben is! S 5 akik nem kaptak szocjuttatást, azok neve és fizetése: SELECT neve, fizetés FROM Személy WHERE szocjuttatás Is Null; 77. oldal S 6 csak a férfiak adatai: SELECT neve, fizetés FROM Személy WHERE neme=Yes; S 7 lehetne Yes helyett -1 is. a 80 ezer alatti fizetésű férfiak (férfi ÉS 80 ezer alatti): SELECT neve, fizetés FROM Személy WHERE neme=-1 And fizetés<80000; S 8 ÉS azok, akiknek 80 ezer fölötti a fizetése vagy 1970. január 31 után születtek: SELECT neve, fizetés FROM Személy WHERE fizetés>80000 Or szüldát>#01/31/1970#; S 9 VAGY a férfiak neve
és fizetése a névsor N-jétől (hátrafelé): SELECT neve, fizetés FROM Személy WHERE neme=-1 And neve>"N"; S 10 a Pál keresztnevűek: SELECT neve, fizetés FROM Személy WHERE neve Like "*Pál"; Vigyázat! A "*Pál" mást eredményez! Próbálja ki! S 11 akik vagy kaptak szocjuttatást vagy a születési helyük nem a-ra végződik: SELECT neve, fizetés FROM Személy WHERE szocjuttatás>0 Or szülhely Not Like "*a"; S 12 az 1970. január 1 után született, 40 és 80 ezer közötti fizetésűek: SELECT neve, fizetés FROM Személy WHERE szüldát>#01/01/1970# And (fizetés Between 40000 And 80000); 78. oldal S 13 rendezve: a nevük 2. betűje a és k között van, fizetés szerint (növekvő sorrendbe) SELECT neve, fizetés FROM Személy WHERE neve Like "?[a-k]*" ORDER BY fizetés; lehetne ORDER BY 2 A Select utáni 2. mező szerint S 14 a férfiak adatai születési hely szerint növekvő, ezen belül
fizetés szerint csökkenő sorrendbe rendezve: SELECT szülhely, neve, fizetés FROM Személy WHERE neme=-1 ORDER BY szülhely, fizetés DESC; S 15 növekvő az alapértelmezett DESC a csökkenő a Személy táblában szereplők fizetésének átlaga, Átlagfizetés néven: SELECT Avg(Fizetés) AS Átlagfizetés FROM Személy; Avg(Fizetés) AS Átlagfizetés - Avg(Fizetés), MINT Átlagfizetés. Ha kitöröljük a AS Átlagfizetés kitételt, akkor meglehetősen csúnya elnevezést kapunk. Próbálja ki! S 17 összege: a Pápán, Nagykőrösön vagy Zeg-en születettek fizetésének minimuma, SELECT Min(fizetés) AS Minimum, Sum(fizetés) AS Összes FROM Személy WHERE szülhely In ("Pápa", "Nagykőrös", "Zeg"); Az In jelentése: eleme, közte van, benne van. S 19 a Személy táblából a férfiak neve (mint Név) és Összeg néven az az értéket, amit a fizetés és teljesítmény összeszorzásával kapunk, név szerint rendezve: SELECT neve
AS Név, fizetés*teljesítmény AS Összeg FROM Személy számított mező, elnevezéssel WHERE neme=-1 ORDER BY neve; S 20 a fizetések összegét kérem Össz néven, születési hely szerint csoportosítva: SELECT szülhely, Sum(fizetés) AS Össz FROM Személy GROUP BY szülhely; 79. oldal S 21 a fizetések átlagát kérem, Átlag néven születési hely szerint csoportosítva és az Átlag szerint rendezve: SELECT szülhely, Avg(fizetés) AS Átlag FROM Személy GROUP BY szülhely ORDER BY 2; ide Átlag-ot nem írhatok rendezd a 2. mező alapján S 22 mint az előbb, csak most nem kérek rendezést, viszont csak azok a csoportok kellenek, melyeknél az Átlag 70 ezer alatt van: SELECT szülhely, Avg(fizetés) AS Átlag FROM Személy GROUP BY szülhely HAVING Avg(fizetés) <70000; Feltételes csoportosítás Figyelem! A HAVING hatására először kiszámítja minden csoport átlagát, majd ha ez megfelel a feltételnek, csak akkor jeleníti meg. Tehát a HAVING a GROUP
BY után adható meg és a csoportokra írható elő vele szűkítő, korlátozó feltétel. A következő lekérdezésnél a csoportosításban csak a 100 ezer alattiak vesznek részt. Azaz először kiszűri a 100 ezer alattiakat és ezeket csoportosítja. S 22 1 a 100 ezer alatti fizetésűek átlagfizetése, születési hely szerint csoportosítva: SELECT szülhely, Avg(fizetés) AS Átlag FROM Személy WHERE fizetés<100000 GROUP BY szülhely; Ez pedig az előző kettő "együtt". S 22 2 a 100 ezer alatti fizetésűek átlagfizetése, amennyiben a csoport átlaga 70 ezer alatt van, születési hely szerint csoportosítva: SELECT szülhely, Avg(fizetés) AS Átlag FROM Személy WHERE fizetés<100000 GROUP BY szülhely HAVING Avg(fizetés)<70000; Hogyan lehet SQL-ben két táblát összekapcsolni? Egyik lehetőség az INNER művelet. A másik: (A két táblát a szülhely és helység mezők azonos értékei alapján egyesíteni.) S 23 a dolgozók neve és
születési helyük jellemzői: 80. oldal SELECT neve, leírás FROM Személy, Település miket kell összekapcsolni WHERE Személy.szülhely=Településhelység; hogyan Vigyázat! Ha csak a SELECT neve, leírás FROM Személy, Település; Parancsok szerepelnek, akkor a két tábla Descartes- (direkt) szorzatát kapjuk. (A két tábla rekordjainak összes lehetséges rendezett párja.) Ez jelen esetben 6 * 8 = 48 rekord-pár: Használhatjuk az AS kulcsszót arra is, hogy táblaneveink helyett rövid neveket írjunk. S 24 van: a dolgozók neve, születési helyük jellemzői és szocjuttatásuk, ha ezen utóbbi SELECT neve, leírás, szocjuttatás FROM Személy AS Sz, Település AS T WHERE Sz.szülhely=Thelység And szocjuttatás >0; Emlékszik még az allekérdezésre? Az átlagfizetés alatti fizetésűeket kerestük. Lássuk ezt SQL-ben! Ez lesz a Select a Select-ben. 81. oldal S 26 az átlagfizetés alattiak neve és fizetése: SELECT neve, fizetés FROM Személy
WHERE fizetés<(SELECT Avg(fizetés) FROM Személy); A belső Select Avg(fizetés) From Személy kiszámolja az átlagfizetést és a külső Select csak az ennél kisebbeket jeleníti meg. Amint látja, a belső Select-et zárójelbe kell tenni S 27 azon férfiak neve és fizetése, akiknek a fizetése kevesebb a Nagykanizsán születettek (férfi és nő) átlagfizetésénél: SELECT neve, fizetés FROM Személy WHERE neme=Yes férfi és a And fizetés<(SELECT Avg(fizetés) fizetése kisebb FROM Személy a "kanizsaiakénál" WHERE szülhely="Nagykanizsa"); S 31 azok a "Nagykőrösiek", akik a "Nagykanizsaiak" átlaga fölött vannak: SELECT neve, fizetés FROM Személy WHERE szülhely="Nagykőrös" And fizetés>(SELECT Avg(fizetés) FROM Személy WHERE szülhely="Nagykanizsa"); Milyen más parancsok, lehetőségek vannak még? Néhányat említünk, a többiről a súgóban tájékozódhat. Új tábla
létrehozása: SELECT - INTO. S 18 hozd létre az ÚjNevek táblát. Akik kaptak szocjuttatást, azok nevét (Név mezőként), fizetésük és a szocjuttatás összegét (Összeg mezőként) másold át. Rendezd név szerint: SELECT neve AS Név, fizetés+szocjuttatás AS Összeg INTO ÚjNevek FROM Személy WHERE szocjuttatás>0 ORDER BY neve; Az új tábla neve ÚjNevek. Két mezője van: a Név és az Összeg Ez utóbbit a Személy tábla mezőiből számítjuk ki. Az új tábla létrejön, vagy ha már volt (és úgy akarjuk), felülíródik. Hozzáfűzés létező táblához: INSERT - INTO 82. oldal S 18 2 fűzzük az új táblánkhoz a nőket, csak a nevüket: INSERT INTO ÚjNevek SELECT neve AS Név FROM Személy WHERE neme=No; a kimeneti táblában Név mező van honnan No - Nem Frissítő (módosító) lekérdezés: UPDATE - SET S 25 emeljük az ÚjNevek-ben az 50 ezer alatti Összegeket 500-zal: UPDATE ÚjNevek SET Összeg = Összeg+500 WHERE Összeg<50000;
Figyelje meg! Az üres mezők (nők esetén) értéke továbbra is üres! Törlő lekérdezés: DELETE S 32 hogy Pál: töröljük az ÚjNevek-ből azokat, akik nevében szerepel az a karaktersorozat, DELETE * FROM ÚjNevek WHERE Név Like "*Pál"; 3 sor törlődik Használható még: CREATE (tábla vagy index létrehozása), ALTER TABLE (tábla módosítása), DROP (törlés). Csúcsérték: TOP S 28 a 4 legnagyobb fizetésű: SELECT TOP 4 neve, fizetés FROM Személy ORDER BY fizetés DESC; Paraméteres: S 30 a dolgozó neve a paraméter: SELECT neve, fizetés FROM Személy WHERE neve Like [Mi a Neve?]; az első 4 jelenik meg csökkenő sorrend 83. oldal És most a Cikkek adatbázis néhány példája: S 1 a minimális darabszámú cikkek cikkszáma, neve, darabszáma: SELECT cikk.Cikksz, Név, Db FROM cikk, tétel WHERE cikk.Cikksz = tételCikksz And Db=(SELECT Min(DB) FROM tétel); S 2 Cikksz a Cikk-ből, Név és Db egyértelmű Kapcsolat Minimális
darabszám számolása vevőnkénti csoportosítás a rendelt áruk összegéről: SELECT V.Vevősz, Csnév&" "&Knév AS Vásárló, Sum(Db) AS Összdarab FROM Tétel AS T, Rendel AS R, Vevő AS V WHERE R.Rendsz = TRendsz And RVevősz=VVevősz GROUP BY V.Vevősz, Csnév&" "&Knév; Egy kis magyarázat: Van két elnevezés: Összdarab és Vásárló, hogy szebb legyen. Emberibb a név kiírása így összefűzve. A vevőszámon belüli csoportosítás "semmit sem jelent", hisz a vevőszám egyedi. Azért szerepeltetjük, mert a vevők neveit látni szeretnénk, de a Select mögött felsorolt mezőknek vagy összegzésben, vagy csoportosításban szerepelni kell. Figyelje meg! A Rendel táblából nem kértünk semmilyen adatot sem. Csak azért kell szerepeltetni, hogy a kapcsolatok kiépüljenek. A Vevő tábla ugyanis a Rendel táblán keresztül kapcsolódik a Db-t tartalmazó Tétel-hez. S 3 vevőnként csoportosítva a rendelt darabok
összértéke, csökkenő sorrendben: SELECT vevő.Vevősz, Csnév&" "&Knév AS Vásárló, Sum(Db*Ár) AS Összérték FROM tétel, rendel, vevő, cikk WHERE rendel.Rendsz = tételRendsz And rendel.Vevősz=vevőVevősz And cikkCikksz=tételCikksz GROUP BY vevő.Vevősz, Csnév&" "&Knév ORDER BY 3 DESC; Most a Cikk táblára is szükség volt az Ár miatt. A 3 mező szerint csökkenő sorrendet írtunk elő. A következő két lekérdezés egy kis ismétlés: S 4 hozd létre a Próba táblát a Cikk-ből úgy, hogy minden olyan rekord minden mezőjét másold át, amelynek nevében szerepel d betű: 84. oldal SELECT * INTO Próba FROM Cikk WHERE Név Like "*d"; S 5 töröld a Próba azon rekordjait, ahol az Ár 22 és 50 közötti: DELETE * FROM Próba WHERE Ár Between 22 And 50; Két "dátumos" példával zárjuk a fejezetet: S 6 a 97-es összérték: SELECT Sum(Db*Ár) AS Össz97 FROM Cikk AS C, Tétel AS T, Rendel AS
R WHERE C.Cikksz=TCikksz And RRendsz=TRendsz And Mikor Between #1-1-97# And #12-31-97#; S 7 a januári összérték: SELECT Sum(Db*Ár) AS ÖsszJanuár FROM Cikk AS C, Tétel AS T, Rendel AS R WHERE C.Cikksz=TCikksz And RRendsz=TRendsz And Month(Mikor)=1; Még néhány hasznosnak ítélt lehetőséget említünk meg. Néhány menüpontról Eszközök - Office Links - Analizálás MS Exellel: Kiválasztva egy táblát az adatbázisban és alkalmazva a fenti menüpontot elindul az Excel (amennyiben telepítve van) és kapunk egy munkalapot, az adott táblanévvel, valamint a tábla adatait táblázatba foglalva. Eszközök - Office Links - MS Word körlevél: Egy varázslót indít, mellyel körlevelet készíthetünk, ahol táblánk lesz az adatforrás. Fájl - Külső lekérdezés - Importálás: Szintén egy varázsló kalauzol. Például Excel táblázat importálása: Válasszuk az Microsoft Excel lehetőséget, adjuk meg az importálandó táblázat vagy a tartomány nevét,
választhatunk, hogy az első sorból vegye-e a mezőneveket, új vagy régi táblába kérjük az adatokat, mezők jellemzőit beállíthatjuk, meghatározhatjuk a kulcsot. 85. oldal Fájl - Mentés/Exportálás: Hasonlóan vihetjük át adatainkat (például) Excel-be, mint az analizálásnál, csak most nem indul el az Excel. Az eszközök alábbi két menüpontja akkor is elérhető, amikor nincs nyitva adatbázis. Eszközök - Adatbázis segédeszközök - Adatbázis tömörítése: Töredékmentesítést végez az adatbázison. Jelentős méretcsökkenés érhető el vele Eszközök - Adatbázis segédeszközök - Adatbázis helyreállítása: Sérült adatbázis esetén használhatja. Eszközök - Adatvédelem - Adatbázisjelszó beállítása: Nyissa meg az adatbázist Kizárólagos módban. Töltse ki a megerősítés rubrikát is. A jelszót meg kell ismételni Ügyeljen a kis- és nagybetűkre. Nem tudja megnyitni az adatbázist, ha elfelejti a jelszót JEGYEZZE FEL
biztos helyre! Ha most lezárja az adatbázist, akkor az újbóli megnyitás már csak a helyes jelszó beírása esetén hajtódik végre. A sikeresen megnyitott adatbázisról "leveheti" a jelszót. Kövesse a beállításnál leírt sorrendet. Többrétű védelem létesítéséről a súgó tájékoztat. 86. oldal Tárgymutató & & 83 A,Á absztrakció . 3 Adat . 3 adatbázis . 3 Adatbázis . 4 Adatbázis helyreállítása . 85 Adatbázis tömörítése . 85 Adatbázisjelszó beállítása . 85 adatmodell . 3 Adatmodellezés . 3 aggregáló . 18 alapértelmezett érték . 13 Alapértelmezett érték . 62 allekérdezés . 20 Analizálás . 84 And. 77 AS .78, 80 attribútum . 48 AVG. 19 azonosító . 7 Azonosító . 4 B Bájt . 11 belső Select . 81 betűvastagság . 29 Between . 77 Beviteli maszk . 11 Beviteli mező . 56 C COUNT . 19 Cs Csoport . 43 Csoportfej . 27 csoportosítás .19, 30, 31, 70 csúcsérték . 17 D dátum/idő . 13 Dátum/Idő . 11 DELETE .
82 DESC . 82 E,É Egérgomb felengedésére . 61 Egész . 11 Egy-a többhöz . 40 Egy-az-egyhez . 40 Egyedelőfordulás . 4 Egyszeres . 11 Egyszerű kulcs .7 Elsődleges attribútum .48 Engedélyezve .34 érvényesítési szöveg.12 érvényességi szabály .12, 34 És .15 Eszközkészlet .27 Exportálás .85 Expression .19 F Feljegyzés .11 feljegyzés típus .10, 38 frissítő .20 FROM .76 Funkcionális függőség .48 funkcionálisan függ .66 funkcionálisan meghatározza .48 G Group By.19 GROUP BY .76, 79 H Hálós.5 HAVING .76, 79 Hierarchikus .5 hivatkozási integritás .41 Hosszú egész .11 Hozzáfűzés .21 I,Í igazítás .35 Igen/Nem .11, 73 Illesztés típusa .41 Importálás.84 In 78 Indexek.13, 47 indexelés .6 Indexelés .12 INNER .75 INSERT INTO .82 INTO .81 Is Not Null .17 J jelentés szakaszai .26 Jelentés varázsló.71 Jelentésfej.27 jelentést .23 joker .18 K kapcsolat . 37, 39, 67 Kapcsolat .4, 38, 39 Kapcsoló mező .4 87. oldal kaszkádolt . 42 kép . 37
kereszttáblás . 21 Kifejezésszerkesztő .30, 56 körlevél . 84 között . 16 Kulcs . 7 kulcsjelölt mező . 50 kurzor . 28 L Left$ . 30 lekérdezés . 14 Like .9, 18, 77, 84 lista . 59 Logaritmikus keresés . 6 M makró .36, 57 makrókészítés . 37 Másodlagos attribútum. 48 memo . 10 Mentés . 85 mezőtípusok . 7 N normálforma .49, 66 Normálforma . 48 Ny nyomtatási kép . 26 O,Ó Objektum . 4 Oldalfej . 27 OLE . 33 Or 77 ORDER .76, 78 R Redundáns .38 Relációs .5 Relációs adatbázis .5 rendezés .15 Rendezés és csoportosítás .27 S segédűrlap . 45, 55, 68 SELECT .75, 76 SET .82 SQL .54, 74 SUM .19 Sz Szám .11 számított mező . 15, 51, 55 Számláló.11 százalék típus .12 Szöveg.11 szűrés kijelöléssel .9 szűrés űrlappal .9 T tábla.5 táblakészítő .20 tervezés .10, 48 tizedeshely .12 TOP .82 Több-a-többhöz .40 törlő .21 Törzs .27 tranzitív függőség.66 Tranzitív függőség .48 tulajdonságok .17, 56 U,Ú UPDATE.82 Ö,Ő Ü,Ű
összegzés . 31 összerendelés.36, 57 Összesítés . 18 Összesítési beállítások. 25 összetett kulcs . 7 űrlap .32 űrlap nézet .33 Űrlap segédűrlappal .69 P Vagy .15 választó.20 vezérlőelemek .27 paraméter.17, 82 Paraméter .67, 74 parancsgomb . 35 Pénznem . 11 Q QBE rács . 15 V W Where .19 WHERE .76