5 cseles Access feladat és leküzdésük

Sokak úgy tartják, hogy az informatika érettségi legnehezebb része az adatbáziskezelés. Hogy ez valóban így van-e, noss... nyilván ez eléggé személyfüggő, de az mindenesetre tény, hogy az utolsó részfeladatokba könnyedén beletörhet az emberek bicskája, ha nem elég felkészült. Íme hát néhány tipp és trükk pár olyan feladathoz, amik jellemzően előfordulhatnak, és amikbe sokaknak beletörhet a bicskája!

1. Számítások a lekérdezésekben

Adott egy tábla, amely diákok adatait tartalmazza (vezetéknév, keresztnév, beiratkozás éve, ballagás éve, osztály). Lekérdezés segítségével adjuk meg, hogy melyik betűjelű osztályba átlagosan hány évig járnak a tanulók.

Ha végigolvassuk a feladatot, észrevehetjük, hogy az két részre osztható. Előszöris, meg kell határoznunk azt, hogy melyik tanuló mennyi ideig járt az iskolába, majd ezt követően ezeket az időtartamokat osztályonként ki kell átlagolnunk. De fókuszáljunk első körben az időtartamra.

Ha megnézzük az adatokat tartalmazó táblát, láthatjuk, hogy az iskolában töltött évek száma könnyen kiszámítható, mindössze csak ki kell vonnunk a ballagás évéből a beiratkozás évét, és már rendben is leszünk. A lekérdezésünkbe szerencsére nem csak kész, a táblában létező mezőket tudunk felvenni, hanem felvehetünk különféle számításokat is. Ráadásul az Access figyel helyettünk a pontos szintaxisra is, így ha egyszerűen beírjuk, hogy elballagott-beiratkozott, majd kikattintunk a mezőből, akkor magától érteni fogja, hogy mégis mit szeretnénk, és elvégzi a szükséges szintaktikai javításokat. Így a kifejezésünk átalakul ilyenné: Kif1: [elballagott]-[beiratkozott].

A két szögletes zárójel azt mutatja, hogy az ezek között található információ egy-egy mezőnek a neve, a kivonás pedig természetesen egy kivonás. Az elé került Kif1: előtag pedig azt mutatja meg, hogy ez az újonnan kiszámított mező milyen néven jelenjen majd meg a lekérdezésben. Nyugodtan átírhatjuk pl. Időtartam-ra, így a kifejezésünk Időtartam: [elballagott]-[beiratkozott] lesz. Vegyük fel gyorsan mellé a nevet, és lessük meg hogy hogy mutat eddig a lekérdezésünk!

Tökéletes! Itt is vannak az időtartamok! A neveket tartalmazó oszlopokat persze most kidobjuk, azokra nem lesz szükség. Már csak egy feladat vár ránk, hogy osztályonként csoportosítva kiátlagoljuk az időtartamokat. Ehhez nincs más dolgunk, mint felvenni az osztályok betűjelét tartalmazó mezőt, bekapcsolni az összesítést, majd beállítani, hogy az osztály mező csoportosítási szempont (Group By), az Időtartam oszlopra pedig az átlag (Avg) összesítőfüggvényt alkalmazzuk. A lekérdezésünk ezzel el is készült!

Persze ehhez hasonló módon más műveleteket is gond nélkül végezhetünk, amit a feladat épp megkíván. Nem csak a kivonás játszik, sőt, Excel-hez hasonló függvényeket is használhatunk, noha ezek nevei itt nincsenek magyarítva. Ha szeretnénk megismerni a teljes potenciált az Access ezen részében, akkor egyszerűen kattintsunk jobbgombbal az egyik mezőnév cellára, majd klikk a Szerkesztés... gombra.

Ne feledd! Ha összesítést használsz, mindig ellenőrizd, hogy minden mező esetén a megfelelő összesítő függvény legyen kiválasztva! 

2. A kapcsolat nélküli rekordok listázása

Adott a fentebb ismertetett, diákokat tartalmazó tábla, valamint egy jelentkezéseket tartalmazó tábla, amely megmutatja, hogy melyik diák milyen sportfoglalkozásra jelentkezett (diákid, sportnév). Egy diák bárhány sportfoglalkozásra jelentkezhet. Listázzuk ki azokat a diákokat, akik nem jelentkeztek egy sportfoglalkozásra sem.

A feladat izgalmas! Olyan lekérdezést kell tehát alkotnunk, amelyik kilistázza azokat a diákokat, akikhez nincs rekord a jelentkezett táblában. Az első gondolat bizonyára az, hogy létrehozunk egy lekérdezést, és beledobáljuk mindkét táblát - természetesen a szükséges kapcsolat beállításával. Ha azonban most felveszünk pár mezőt, és lefuttatjuk a lekérdezésünket, azon kapjuk magunkat, hogy minden diák megjelenik a kimenetben.... csak azok nem, akiket keresünk.

Lejöttek az emberek, kivétel 2 embert. A gond az, hogy nekünk éppen erre a két emberre volna szükségünk! Szerencsére a baj közelt sem olyan nagy. Mindössze át kell állítanunk a két tábla közötti kapcsolatot. Kattintsunk duplán a táblák közötti vékony vonalra! Ekkor megjelenik egy párbeszédpanel, amelyikben három új lehetőség tárul elénk:

  1. Csak olyan sorok kerüljenek bele, amelyeknél az illesztett mezők mindkét táblában egyenlőek.
  2. "diakok" MINDEN rekordja, és "jelentkezes" azon rekordjai, ahol az illesztett mezők azonosak.
  3. "jelentkezes" MINDEN rekordja, és "diakok" azon rekordjai, ahol az illesztett mezők azonosak.

Ezek közül alapból az első van kiválasztva. Gondoljuk át, hogy mit szeretnénk. Ahhoz, hogy kiírhassuk azokat a diákokat, akikhez nem tartozik rekord a jelentkezes táblában, szükségünk van a diakok minden rekordjára. Válasszuk tehát ki a kettes opciót, okézzuk le az ablakot, és futtassuk le újra a lekérdezést.

Mintegy varázsütésre megjelentek a hiányzó diákok! Sőt, azt is láthatjuk, hogy mivel hozzájuk nem tartozik jelentkezés, így az ő soraikban a sportnév üres. Utóbbi pedig könnyen előnyünkre válhat, hiszen az üres mezőkre könnyedén tudunk szűrni az Is Null kifejezéssel. A sportnev mező feltételének adjuk tehát meg hogy Is Null, és igazából el is rejthetjük. Ha most futtatjuk a lekérdezést, láthatjuk, hogy az tökéletes!

Az ilyen feladatok megoldásának tehát két kulcsa van. Az egyik, hogy a kapcsolat a táblák között megfelelően legyen beállítva, a másik pedig ezt követően az Is Null kulcsszó helyes használata a párral nem rendelkező rekordok leszűréséhez.

3. Tartalmazza a...

Adott a fentebb ismertetett két tábla. Írassuk ki azoknak a diákoknak a nevét, akik a röplabda valamelyik ágazatát űzik (azaz akik jelentkeztek olyan sportfoglalkozásra, amelynek a neve tartalmazza a röplabda szót).

Ha vetünk egy pillantást az adatainkra, amit az eggyel fentebbi feladatrésznél található táblázatban is láthatunk, akkor azon kapjuk magunkat, hogy strandröplabda, valamint teremröplabda is van az adataink között. Természetesen ezek neveit nem írhatjuk be kézzel fixen a lekérdezésben, mert mi van, ha később valaki hóröplabdára jelentkezik például, vagy bármi egyéb olyan dologra, ami nincs még a táblában? Muszáj valami olyan megoldást találnunk a problémára, ami minden ilyen eshetőséget is lefed.

Szerencsére a megoldás nem bonyolult, mindössze a Like kulcsszót kell segítségül hívnunk. Dobjuk be a két táblát, vegyük fel a vnev, knev, és a sportnev mezőket, majd gondoljuk át, hogy miként tovább. Az egészen biztos, hogy a sportnev mezőre kell feltételt tennünk, a kérdés inkább ott lapul, hogy mit. Ismerkedjünk meg egy kicsit azzal, hogy hogyan működik a Like kulcsszó.

A likeot mindig szöveges adatok szűrésére használjuk, és bár megadhatunk neki sima egyszerű szöveget is, használhatjuk vele a * helyettesítőkaraktert is, ami a kulcsa ezen feladatoknak! A * korlátlan számú (tehát akár 0), akármilyen karaktert jelöl. Ez gyakorlatban azt jelenti, hogy a Like "*röplabda" feltétel minden röplabdára végződő információt kiliszáz, míg a Like "*röplabda*" minden olyan rekord esetén teljesül, ahol az adott mező tartalma bárhol tartalmazza a röplabda szót.

Az alábbi táblázat tetején 4 kifejezést találtok, a táblázat bal oldalán pedig néhány like kulcsszóra épülő feltételt. A táblázat egyes celláiban pedig pipát, vagy x-et láthatunk annak függvényében, hogy az adott szűrőfeltételnek megfelel-e az adott kifejezés.

A Like-os kifejezések működésének összefoglalása

Most, hogy az elmélet megvan, gondoljuk át, hogy mit szeretnénk. Szeretnénk megkapni azokat a sorokat, amelyekben a sportnev tartalmazza a röplabda szót, bárhol. Bárhol, azaz előtte is, és utána is bármi lehet. Akkor használhatjuk a Like "*röplabda*" kifejezést! Az oszlopot megjeleníteni természetesen nem szükséges. Így el is készült a lekérdezésünk:


Tudtad? A Like más ún. wildcard karaktereket is támogat a *-on kívül! Pontosan egy darab számot helyettesíthet a #, vagy pontosan egy betűt a ?, de használhatunk speciálisabb szabályokat is, ezekről ide kattintva olvashatsz az Access súgójában. Persze érettségin ezek nem kellenek - de lehet, hogy valamire épp jól fognak jönni, ki tudja!

4. Az első... utolsó... legrégebbi... legújabb... stb.

Adott a fentebb ismertetett két tábla. Jelenítsük meg a legkorábban beiratkozott, focira jelentkező diák nevét, és a beiratkozásának évét!

Ez a feladat nem tűnik olyan kiemelkedően nehéznek. Sőt, az igazat megvallva, nem is az. Pusztán csak egy apró kis szikrára van szükség ahhoz, hogy megoldjuk. Első körben listázzuk ki azokat a diákokat, akik focira jelentkeztek. Ez nem nehéz feladat, bedobjuk a két táblát, a kapcsolatot remélhetőleg korábban már beállítottuk (ha nem, akkor pótoljuk), vegyük fel a vnev, knev, beiratkozott, illetve a sportnev mezőket, majd a sportnev-re tegyük rá feltételnek hogy foci. Ezzel az első lépés meg is van, ha lefuttatjuk a lekérdezést, megkapjuk a focisták neveit.

De van egy kis bibi... nekünk csak a legrégebben beiratkozottra van szükségünk. De ezt könnyen orvosolhatjuk! Két dolgot kell tenni: állítsunk be növekvő rendezést a beiratkozott oszlopra, így elérjük, hogy az általunk keresett, legrégebben beiratkozott diák a kimenet első rekordja legyen, majd a szalagon a Tervezés fülön a Lekérdezés beállítása dobozban a Visszatérés melletti szövegmezőbe írjunk be egy 1-est. (Figyeljünk rá, hogy az az 1-es tényleg 1-es legyen, még akkor is, ha az Access-nek jobb ötlete támadna...) Ezzel beállítottuk, hogy a lekérdezés futtatásakor csak az első 1 darab rekord jelenjen meg a kimeneten - ami a rendezésnek hála, éppen az, amelyikre szükségünk van!

Az ilyen leg-es feladatoknál viszonylag gyakran szükséges a visszatérés beállítása. Ne feledkezzünk el róla, mint lehetőség! És persze arról se, hogy a visszatérés mindig az első n darab rekordot fogja visszaadni, így ahhoz, hogy megfelelően működhessen, gondoskodnunk kell róla, hogy a keresett adat legyen a legelső. Ezt többnyire egy kis rendezéssel meg lehet oldani.

5. Akik ugyanoda járnak

Adott a fentebb ismertetett két tábla. Lekérdezés segítségével jelenítsük meg, hogy kik járnak ugyanarra a sportra, mint Csatári Gyuri. Ügyeljünk rá, hogy az ő nevét ne jelenítsük meg!

Tipikusan az a fajta feladat, amire a többség segédlekérdezéseket használ. Fontos megjegyezni, hogy ezzel nincs semmi gond! A pontszámot nem befolyásolja, ha működik, akkor hajrá! Viszont egy kis kreativitással könnyedén megoldhatjuk ezeket a feladatokat segédlekérdezés nélkül is, ha ehelyett egy kicsit más trükköt alkalmazunk. Előszöris derítsük ki, hogy milyen sportfoglalkozásra jár Csatári Gyuri. Ehhez felvesszük a két táblát, (a kapcsolatot már rég beállítottuk, ugye?) majd a vnev mezőre a "Csatári", a knev mezőre pedig a "Gyuri" kifejezést állítjuk be feltételnek. Ezeket a mezőket el is rejthetjük! Felvesszük továbbá a sportnev mezőt, és már futtathatjuk is!

Ekkor láthatjuk, hogy sikerült megtalálnunk a sportágat, Gyuri strandröplabdázik. A legegyszerűbb mód arra, hogy megtaláljuk a többi strandröpist, pedig nem más, mint... ha felvesszük a két táblát mégegyszer! Ne feledd, egy lekérdezésben egy tábla többször is szerepelhet! Simán bedobhatjuk őket megint, viszont figyeljünk, a kapcsolatot ekkor már kézzel kell beállítanunk, kössük gyorsan össze a megfelelő mezőket. Szükséges továbbá mégegy kapcsolat beállítása: kössük össze az eredetileg, és az újonnan felvett jelentkezes táblák sportnev mezőit egymással! A kapcsolatok beállítása tehát:

Értelmezzük amit látunk. Bal oldalt ott van tehát a diakok és a jelentkezes tábla először. Azt mondtuk, hogy ezt használjuk arra, hogy megkeressük, hogy mit sportol Gyuri. Majd ezt követően ott van jelentkezes_1 néven a jelentkezes tábla mégegyszer, és össze van kapcsolva a jelentkezes táblával, a sportnev a sportnevhez. Amikor két mezőt összekapcsolunk egy adatbázisban, akkor az adatbáziskezelő program az azonos értékeket fogja összepárosítani. Viszont a diakok táblára alkalmazott feltételnek köszönhetően a jelentkezes táblából egyetlen egy sportnév fog csak kijönni eredményként: a strandröplabda. Azzal, hogy ehhez hozzákapcsoltuk a jelentkezes_1 táblát, tulajdonképpen biztosítottuk azt, hogy a jelentkezes_1-ből csak olyan rekordok jelenjenek meg, amelyekben a sportnev strandröplabda. Ezzel tulajdonképpen leszűrtük a jobb oldali két táblánkat.

A jelentkezes_1-ből le fog tehát jönni minden olyan rekord, ahol a sportnev a strandröplabda, ehhez hozzákapcsoljuk ezeknek a diákoknak az adatait a diakok_1 táblával, és már meg is tudhatjuk, hogy kik azok, akik szintén strandröpiztek. Figyeljünk arra, hogy a kimenetre mindenképp a diakok_1 tábla vnev és knev mezőit írjuk ki! Ha az eredeti diakok táblából írjuk ki ezeket, akkor csak Gyurit fogjuk látni. Ezzel a lekérdezésünk már majdnem készen van! Majdnem... Azonban Gyuri is megjelenik a kimeneten. Ennek orvoslására egyszerűen szűrjük le a diakok_1 tábla vnev és knev oszlopát, hogy ezek értéke ne lehessen Csatári, illetve Gyuri. Ehhez bátran használhatjuk a Not Like kifejezést, a vnev mezőre tehát lehet a feltétel Not Like "Csatári", a knev mezőre pedig Not Like "Gyuri". Ezzel el is készült a lekérdezésünk!

Az, ha egy táblát többször is felveszünk egy lekérdezésbe, néha segíthet abban, hogy megoldjunk bonyolultabb feladatokat. Persze mindenképp érdemes megjegyezni, hogy ezekre a célokra mind használhattunk volna segédlekérdezéseket is, és ezek az érettségi vizsgán a pontszámot nem befolyásolják. Így hát hogy ki melyik technika mellett teszi le a voksát, csupán az egyéni preferencián múlik. Itt is igaz azonban az, hogy érdemes minél több módszert ismerni problémák megoldására, így ha az egyik csődöt mond, vagy a vizsgadrukkban kimegy a fejünkből, még mindig akad néhány amikhez nyúlhatunk.

Konklúzió

Előfordulhat, hogy az access egyesek számára ijesztő lehet. Főleg azok számára, akik nem különösebben informatikás irányból érkeznek az érettségire, és esetleg nem is feltétlen ezzel terveznek továbbtanulni. Viszont egy kis munkával könnyedén megszelidíthető! A program maga amúgy számtalan lehetőséget tartogat magában, érdemes lehet megismerkedni az érettségin túl mutató funkcionalitásával is, de ennek a cikknek a célja egyelőre az érettségi problémák lefedése volt. Találkoztál olyan problémával valamelyik feladatsorban, vagy iskolai tanulmányaid során, amivel továbbra is bajban vagy? Keress meg bátran az adatlapomon található elérhetőségek egyikén, és egy kellemes hangulatú óra keretei között pontot tehetünk arra a bizonyos i-re!