Tato kapitola popisuje tvorbu dotazu (Query). Dotazy nám umoňují skládat informace z několika tabulek do potřebného tvaru, vybírat jen vhodné záznamy a řadu dalích operací. Dotazy umoňují i řadu jiných operací s tabulkami, opravy údajů, ruení záznamů apod. Jsou úzce vázány na jazyk SQL (Structured Query Language). Jsou vlastně jeho zapojením do prostředí programu Microsoft Access. I kdy se autoři uchýlili k některým odchylkám oproti jeho normě ANSI.
Vytváření dotazů probíhá v okně, jeho dolní část připomíná zobrazení výsledku dotazu (Datasheet), do jednotlivých sloupců umisujeme poadované poloky z tabulek, kritéria výběru apod. tento postup je obvykle nazýván Query by Example - tvorba dotazu podle příkladu.
Popisem zobrazení výsledku dotazu se nebudeme zabývat, nebo je stejný jako práce s tabulkou.
Nejprve opět popíeme menu při tvorbě dotazu (vynecháme činnosti Window a Help), pak se budeme věnovat konkrétním příkladům.
New |
vytvoření nového objektu, následně je nabídnut seznam tříd objektů |
Close |
uzavření aktuálního objektu |
Save Ctrl+S |
uloení aktuálního objektu |
Save As... |
uloení aktuálního objektu pod zvoleným jménem |
Output To... |
export dat do souboru ve formátu *.XLS, *.RTF, *.TXT |
Print Definition... |
tisk popisu aktuálního objektu. Je mono nastavit rozsah údajů, zda chceme také vlastnosti poloek, vazby, přístupová práva apod |
Send |
vyslání objektu elektronickou potou ve standardu MAPI |
Run Macro... |
sputění některého z hotových maker (objekt třídy makro) |
Add-ins |
připojení doplňkových programových moností. Jsou definovány v inicializačním souboru .INI |
Exit |
oputění programu Microsoft Access |
Při prvním uloení objektu příkazem Save je uivatel dotázán na jméno objektu, není tedy nutno pouívat příkaz Save As.
Undo Ctrl+Z |
zruení poslední operace |
Undo All |
zruení vech provedených změn |
Cut Ctrl+X |
přesun označené oblasti do pomocné paměti (Clipboard) |
Copy Ctrl+C |
kopie označené oblasti do pomocné paměti |
Paste Ctrl+V |
kopie obsahu pomocné paměti ke kurzoru |
Delete Del |
zruení označené oblasti |
Clear Grid |
zruení definice vech poloek dotazu |
Insert Row |
vloení prázdného řádku do oblasti kritérií (Criteria) |
Delete Row |
zruení aktuálního řádku v oblasti kritérií (Criteria) |
Insert Column |
vloení (přidání) prázdného sloupce před aktuální sloupec |
Delete Column |
zruení aktuálního sloupce |
Query Design |
zobrazí okno pro definici struktury dotazu |
SQL |
zobrazí zápis dotazu v jazyce SQL s moností jeho úprav, viz obr. 28. |
Datasheet |
zobrazí okno s obsahem dotazu |
Totals |
vypíná/zapíná zobrazení řádku Totals pro součty v polokách, tvorbu skupin poloek apod |
Table Names |
vypíná/zapína zobrazení řádku Table pro zobrazení jména tabulky, ze které poloka pochází. Pokud pracujeme s tabulkami obsahujícími stejné názvy poloek, často se tyto poloky pletou |
Properties... |
zobrazí globální vlastnosti dotazu. Jejich skladba se mění podle nastavení v menu Query. Na obr. 25 vpravo jsou zobrazeny vlastnosti při nastavení dotazu typu Select |
Join Properties... |
zobrazí okno pro určení druhu vazby mezi tabulkami |
Toolbars... |
určení, které lity nástrojů (Toolbars) mají být zobrazeny |
Options... |
zobrazí nastavení parametrů programu Access |
Run |
provedení dotazu. U některých typů dotazů (např. Delete) není výsledkem dotazu tabulka (Datasheet). Přesto je mono zobrazit tabulku s výsledkem dotazu. Bude obsahovat záznamy, se kterými bude dotaz pracovat. Takové dotazy se nazývají akční (Action Queries), mají v seznamu dotazů různé ikony podle typu dotazu |
Add Table... |
připojení zdrojových tabulek (nebo dotazů) do dotazu |
Remove Table |
odpojení aktuální tabulky z dotazu |
Select |
zapíná typ dotaz (v SQL SELECT ...) |
Crosstab |
zapíná typ pro sumární zpracování tabulky ve formě spreadsheetu (v SQL TRANSFORM ...) |
Make Table... |
zapíná typ vytvoření nové tabulky (v SQL SELECT poloky INTO jméno nové tabulky ...). Na obr. 31 je zobrazeno zadání jména nové tabulky, na obr. 32 hláení výsledku při sputění dotazu (Run) |
Update |
zapíná typ změny obsahu poloek (v SQL UPDATE ...) |
Append... |
zapíná typ přidání záznamů do tabulky (v SQL INSERT INTO jméno cílové tabulky SELECT zdroj) |
Delete |
zapíná typ ruení záznamů v tabulce (v SQL DELETE ...) |
SQL Specific |
speciální nastavení pro SQL deklaraci dotazu |
Join Tables... |
propojení tabulek. Vypíe text "proveďte propojení tabulek myí" |
Parameters... |
zadání proměnných parametrů, které se zadávají z klávesnice při provedení dodazu, viz obr. 26 (v SQL PARAMETERS jména parametrů SELECT dotaz pouívající parametry) |
Nejčastěji pouívaným dotazem bude bezesporu typ Select. Výsledkem dotazu je virtuální tabulka hodnot (nazývaná Datasheet, v programu také Dynaset). Vytvoří se z jedné nebo více zdrojových tabulek (nebo výsledků jiných dotazů) výběrem poadovaných poloek a záznamů vyhovujících zadaným podmínkám. Tento typ vysvětlíme podrobně, u ostatních typů se na něj budeme odkazovat. Na obr. 25 je zobrazeno prostředí programu při tvorbě dotazu. V horní části obrazovky je zobrazen výsledek dotazu, který má stejný vzhled jako tabulka. V nadpisu okna vidíme také označení jeho typu (Select Query).
Okno pro tvorbu dotazu má dvě části. V horní je seznam tabulek, se kterými dotaz pracuje. Zařadíme je sem činností Query-Add Table z menu. Program nám nabídne seznam pouitelných objektů a z nich postupně vybereme (Add) potřebné.
Obr. 25 Tvorba dotazu typu Select
Tabulky v okně vhodně rozmístíme a nastavíme vazby mezi nimi. Např. z tabulky TOsoby bude poloka ID mít vazbu do tabulky TMísta na poloku Osoba. Tím zajistíme, e výsledkem dotazu můe být seznam osob i s jejich zaměstnáními. Obdobně vazba mezi tabulkami TKalendář a SMěsíce umoní, abychom datum svátku uváděli s českým názvem měsíce.
Vazbu mezi tabulkami nastavíme myí tak, e uchopíme (levým tlačítkem) poloku z nadřízené tabulky a poloíme na příslunou poloku podřízené tabulky. Bez pouití myi nelze vazbu vytvořit. Vytvořená vazba má také přiřazen druh vazby (Join Properties). Nastavení vyvoláme stejnojmennou činností z menu nebo dvojím zmáčknutím myi (Double Click) na vazbě. Jsou moné tři druhy vazeb, jak jsme viděli na konci předchozí kapitoly.
V pravé části obr. 25 je otevřeno okno s globálními vlastnostmi dotazu. Jsou to :
Description popis dotazu. Vypisuje se do stavového řádku na dolním okraji okna.
Output All Fields zda na výstupu budou vechny poloky zdrojových tabulek (Yes) nebo ne (No).
Top Values určuje, kolik záznamů má obsahovat výsledný dotaz, např. jen prvních 5, případně prvních 20%.
Unique Values určuje, zda budou zobrazovány jen unikátní hodnoty poloek.
Unique Records určuje, zda se duplicitní záznamy zobrazí jednou (Yes) nebo vícekrát (No).
Run Permissions sputění s parametry Owner's - autora, User's - uivatele.
Source Database název a cesta ke zdrojové databázi, aktuální databáze se zadává "(current)".
Source Connect Str způsob spojení s externí databází.
Record Locks způsob uzamčení záznamů (No Locks, All Records, Edited Record).
ODBC Timeout čas pro odpojení od ODBC.
V dolní části okna provádíme vlastní tvorbu dotazu. Jednotlivé sloupce přitom odpovídají sloupcům jednotlivých poloek ve výsledku dotazu. Sloupec obsahuje několik řádků s určenými vlastnostmi. Jsou to :
Field název poloky. Zadáme sem název poloky, se kterou budeme v dotazu pracovat. Buď ji přeneseme myí z horní části z přísluné tabulky nebo vybereme z nabídky moných poloek (tlačítko pro její vyvolání se objeví na pravé straně, jakmile se kurzor přesune do tohoto pole). Můeme zadat také znak hvězdička "*", ten zastupuje vechny poloky zvolené tabulky. Pokud jméno poloky není jednoslovné, uzavírá se do hranatých závorek. Jako poloka můe vystupovat také jakákoliv operace s polokami. Jejich výsledkem pak vzniká virtuální poloka, která není uloena v ádné tabulce. Například věk osoby určíme jako výsledek operace Format(Now()-[Datum],"yy"). Tato operace můe obsahovat také funkce definované uivatelem v programu (Module). Pokud s touto polokou chceme dále pracovat (v programu, v jiných dotazech apod.), musíme jí určit jméno. To zapíeme před její definici a oddělíme dvojtečkou, např. : Věk : Format(Now()-[Datum],"yy").
Table jméno tabulky odkud je poloka. Tento řádek se zapojuje/odpojuje činností menu View-Table Names. Doporučujeme ho zapojit, jinak můe docházet k záměnám stejnojmenných poloek. Např. pokud zapisujeme jméno poloky z klávesnice, bude zapsána poloka z tabulky, ve které je v horní části okna kurzor. Pokud v dotazu pouijete poloky stejného názvu pocházející z různých tabulek, bude druhá v pořadí rozířena o název tabulky, nebo identifikátor poloky (název) musí být jednoznačný. Pokud se chcete vyvarovat nejednoznačnosti v názvech poloek, změňte v dotazu jejich název : Jméno : [Jméno].
Total součet. Tento řádek se zapojuje/odpojuje činností menu View-Totals. Vlastnost v poli se vybírá z nabídky moných vlastností. Např. Group By znamená, e výsledek dotazu bude seřazen do skupin stejných hodnot v této poloce, Where znamená, e následující podmínka (Criteria) bude pouita pro výběr záznamů pro zobrazení, pouití funkce (Sum, Avg apod.) znamená, e bude zobrazen pouze výsledek funkce s obsahem poloky. Výsledná poloka dostane implicitně nový název např. součet v poloce Věk bude SumOfVěk. Pokud poloce určíte vlastní nový název, bude akceptován.
Sort setřídění. Určuje, zda výsledek dotazu bude setříděn podle hodnot této poloky. Můeme volit setřídění vzestupné (Ascending) nebo sestupné (Descending). Pokud chceme třídit podle více poloek (např. Příjmení a Jméno), pak pořadí priorit pro třídění je v pořadí zadávání těchto vlastností jednotlivým polokám. Access má tendenci zařadit poloky podle kterých se třídí jako první (vlevo), právě v pořadí jejich priorit. Pokud nemáme jistotu v prioritách řazení, můeme nahlédnout do SQL definice dotazu, jak bude ukázána dále.
Show zobrazení. Určuje, zda poloka bude zobrazena (kříek) nebo nebude zobrazena (prázdné pole). Můeme tak definovat podmínky pro výběr záznamů, které se nebudou zobrazovat.
Criteria kritéria výběru. Sem zadáváme podmínku, kterou musí poloka splňovat, aby byl záznam vybrán pro zobrazení. Tyto podmínky je mono kombinovat. Přitom platí, e podmínky umístěné v jednom řádku, v různých sloupcích jsou spojeny operátorem AND. Podmínky v jednom sloupci jsou spojeny operátorem OR. V podmínkách se mohou objevovat jakékoliv funkce, včetně funkcí vytvořených uivatelem v programu (Module). Mohou se tady objevovat také proměnné parametry, které definujeme v činnosti menu Query-Parameters. Na obr. 26 vidíme okno, které se přitom otevře. Sem zadáme název parametru (je to libovolný text, který bude pouit jako hláení při zadávání hodnoty parametru) a typ proměnné z nabídky, která je na obrázku rozvinuta. Pokud má parametr více slov musíme ho při odkazu uzavřít do hranatých závorek (stejně jako víceslovný název poloky). Při provedení dotazu se objeví poadavek pro zadání hodnoty parametru, viz obr. 27. Podle nastavené hodnoty se pak provede dotaz.
Při porovnávání můeme vyuít řady operátorů, např :
Like "K*" vyhledá vechny záznamy, jejich zvolená poloka začíná hodnotou "K",
"J?rka" vyhledá vechny záznamy, jejich zvolená poloka má hodnotu "Jirka", "Jarka", apod.,
In ("Jan", "Jiří", "Karel") vyhledá vechny záznamy, jejich zvolená poloka má hodnotu uvedenou v seznamu,
In ([TKalendář].[Jméno]) tímto seznamem mohou být také hodnoty poloky.
Kromě uvedeného nastavení mají jednotlivé poloky jetě několik vlastností, které se nastavují v samostatném okně (Field Properties) :
Description popis poloky, zobrazuje se ve stavovém řádku při práci s polokou.
Format formát zobrazení dat v poloce.
Input Mask vstupní maska.
Caption název poloky, který bude vypsán v záhlaví tabulky.
Význam vlastností je stejný, jako u poloek tabulky, kde byly také popsány.
Obr. 26 Okno pro zadání parametrů dotazu
Obr. 27 Okno pro zadání hodnoty parametru dotazu
Celý dotaz má své vyjádření v SQL. Pokud se nám lépe pracuje přímo v SQL, můeme tam také dotazy vytvářet. Činností v menu View-SQL vyvoláme jednoduchý editor příkazu SQL, viz obr. 28.
Obr. 28 Editor příkazů jazyka SQL
Jako příklad uvedeme dotaz, který vytvoří seznam osob z tabulky TOsoby, k nim připojí jejich pracovitě z tabulky TMísta a vypočte počet celých let odpracovaných u jednotlivých zaměstnavatelů.
V SQL bude dotaz vypadat následovně :
SELECT DISTINCTROW TOsoby.Příjmení, TOsoby.Jméno, TOsoby.Titul, TOsoby.Datum, TOsoby.Obor, TOsoby.Stupeň, TMísta.Místo, Val(Format(IIf(IsNull([Odchod]),Date()-[Nástup],[Odchod]-[Nástup]),"yy")) AS Doba
FROM TOsoby LEFT JOIN TMísta ON TOsoby.ID = TMísta.Osoba
ORDER BY TOsoby.Příjmení, TOsoby.Jméno, TOsoby.Obor, TOsoby.Stupeň;
Typ Crosstab umoňuje vytvořit výstup ve tvaru sestavné tabulky. Ve vlastnostech poloek přibude jeden řádek :
Crosstab v nabídce je několik moných hodnot
Row Heading hodnoty poloky určí řádky výsledné tabulky. Alespoň jedna poloka musí být takto označena.
Column Heading hodnota poloky určí sloupce výsledné tabulky. Právě jedna poloka musí být takto označena.
Value hodnoty poloky zaplní vnitřek tabulky. Právě jedna poloka musí být takto označena. Navíc musí mít tato poloka uvedenu výpočetní operaci, která se provede s jejími hodnotami (SUM, AVG apod.). Do pole výstupní tabulky se umístí výsledek operace.
Ukame si pouití tohoto typu na řeeném příkladu. Máme zdrojovou tabulku s údaji o osobách a jejich zaměstnáních. Je nepodstatné, e vznikla dotazem typu Select. Z této tabulky chceme vytvořit sumář údajů, kdo u kterého zaměstnavatele odpracoval kolik let.
zdrojová tabulka [QOsoba místo doba] vzniklá spojením tabulek TOsoby a TMísta dotazem:
Titul |
Jméno |
Příjmení |
Datum |
Místo |
Doba |
---|---|---|---|---|---|
Bc. |
Kamil |
Magnussen |
3.12.1971 |
||
Ing. |
Jan |
Jícha |
1.6.1945 |
Podzemní s. |
2 |
MUc. |
Milada |
Kanyzová |
7.2.1965 |
Kuelkárna |
12 |
MUc. |
Milada |
Kanyzová |
7.2.1965 |
Let Letov |
2 |
RNDr. |
Ignác |
Herman |
16.2.1955 |
Podzemní s. |
11 |
V dotazu nastavíme vlastnost Crosstab pro jednotlivé poloky podle obr. 29.
Obr. 29 Definice dotazu typu Crosstab
V SQL bude mít dotaz tvar :
TRANSFORM Sum([QOsoba místo doba].Doba) AS SumOfDoba
SELECT [QOsoba místo doba].Titul, [QOsoba místo doba].Jméno, [QOsoba místo doba].Příjmení, [QOsoba místo doba].Datum
FROM [QOsoba místo doba]
GROUP BY [QOsoba místo doba].Titul, [QOsoba místo doba].Jméno, [QOsoba místo doba].Příjmení, [QOsoba místo doba].Datum
PIVOT [QOsoba místo doba].Místo;
Výsledkem bude virtuální tabulka následujícího vzhledu. Vimněte si předevím sloupce, který obsahuje hodnoty, které v poloce Místo (pouité jako zdroj sloupců) neměly uvedeny ádné hodnoty.
Obr. 30. Výsledek dotazu typu Crosstab
Dotaz, který vytvoří novou tabulku má stejný vzhled jako dotaz typu Select. Pouze výsledkem dotazu není virtuální tabulka (Dynaset), ale fyzická tabulka (Table). Typ se lií pouze vlastnostmi (Query Properties), které obsahují navíc název cílové tabulky, viz obr. 31. Při provedení dotazu nebude zobrazena výsledná tabulka, ale jen hláení, kolik záznamů bylo zkopírováno do nové tabulky, viz obr. 32. Toto hláení lze vak zablokovat nastavením globálních parametrů (Options).
Obr. 31 Dotaz pro tvorbu nové tabulky
Obr. 32 Hláení při provedení dotazu s vytvořením nové tabulky
V SQL má dotaz tvar :
SELECT DISTINCTROW [QOsoba místo doba].*, * INTO [TCelkový přehled]
FROM [QOsoba místo doba];
Dotaz typu Update slouí ke změně obsahu poloek v tabulce. Ve vlastnostech poloek se objevuje nový řádek :
Update to určuje novou hodnotu, kterou přiřadíme vybraným záznamům.
Např. v tabulce osob chceme změnit titul ze zadané hodnoty na novou zadanou hodnotu. Na obr. 33 vidíme zadání dotazu (je vynechán řádek Totals, který nemá smysl). Při jeho provedení (Run) jsme informováni, kolik záznamů bylo upraveno.
V SQL bude mít dotaz tvar :
UPDATE DISTINCTROW [TCelkový přehled] SET [TCelkový přehled].Titul = [Zadejte nové znění titulu]
WHERE (([TCelkový přehled].Titul=[Zadejte titul, který má být nahrazen]));
Obr. 33 Definice dotazu typu Update
Dotaz typu Append slouí k výběru záznamů z jedné tabulky a jejich uloení do nových záznamů jiné tabulky. Název cílové tabulky se zadává ve vlastnostech dotazu (Query Properties). Ve vlastnostech poloek se objevuje nový řádek :
Append To - určuje název poloky cílové tabulky, do které se má uloit hodnota ze zdrojové tabulky.
Např. v tabulce [TCelkový přehled] chceme doplnit záznamy o osobách, které přibyly do tabulky TOsoby. Na obr. 34 vidíme zadání dotazu (je vynechán řádek Totals, který nemá smysl). Do jednotlivých sloupců dotazu přitom musíme zadat názvy vech poloek zdrojové tabulky, které mají být přeneseny. Není vhodné pouívat hvězdičku "*" pro přenesení vech poloek. Přenáela by se také hodnota počítadla (typu Counter), která by způsobila hláení nekompatibility hodnot. Při provedení dotazu (Run) jsme informováni, kolik záznamů bylo připojeno.
V SQL bude mít dotaz tvar :
INSERT INTO [TCelkový přehled] ( Příjmení, Jméno, Titul, Datum, Obor, Stupeň, Místo, Doba )
SELECT DISTINCTROW [QOsoba místo doba].Příjmení, [QOsoba místo doba].Jméno, [QOsoba místo doba].Titul, [QOsoba místo doba].Datum, [QOsoba místo doba].Obor, [QOsoba místo doba].Stupeň, [QOsoba místo doba].Místo, [QOsoba místo doba].Doba
FROM [QOsoba místo doba] LEFT JOIN [TCelkový přehled] ON [QOsoba místo doba].Příjmení = [TCelkový přehled].Příjmení
WHERE (([TCelkový přehled].Příjmení Is Null))
ORDER BY [QOsoba místo doba].Příjmení, [QOsoba místo doba].Jméno, [QOsoba místo doba].Titul;
Obr. 34 Definice dotazu typu Append
Dotaz typu Delete slouí k ruení záznamů v tabulce. Ve vlastnostech poloek se objevuje nový řádek :
Delete určuje podmínku, podle které se budou vybírat záznamy ke zruení, implicitně WHERE.
Např. v tabulce [TCelkový přehled] chceme zruit vechny záznamy. Na obr. 35 vidíme zadání dotazu (je vynechán řádek Totals, který nemá smysl). Do jednotlivých sloupců dotazu přitom zadáváme jen názvy těch poloek, podle kterých budeme vyhledávat. Při provedení dotazu (Run) jsme informováni, kolik záznamů bylo zrueno.
V SQL bude mít dotaz tvar :
DELETE DISTINCTROW [TCelkový přehled].Příjmení
FROM [TCelkový přehled];
Obr. 35 Definice dotazu typu Delete