02   >   jak   >   Tipy pro MS Access - práce s dotazy
 

Autor: Ji°í MiΦke


Výb∞r pouze urΦitého poΦtu záznam∙
K zobrazení urΦitého poΦtu záznam∙ s nejvyÜÜí Φi nejni₧Üí hodnotou jako p°íklad m∙₧eme uvést seznam 20 prodejc∙ s nejvyÜÜí provizí pou₧ijte následující postup: V návrhovém zobrazení zvolte pole, která mají být zobrazena (nap°. p°íjmení prodejce a provize), dále zvolte ╪adit sestupn∞ podle pole provize, a v okn∞ Vlastnosti dotazu zadejte hodnotu 20 v poli NejvyÜÜí hodnoty (v tomto poli m∙₧ete zadat i údaj v procentech, nap°. 5 %).
Pokud chcete, aby u₧ivatel p°i spuÜt∞ní dotazu k výb∞ru záznam∙ m∞l mo₧nost zvolit parametr, t°eba p°íjmení prodejce, pou₧ijte tento postup: V návrhové m°í₧ce dotazu v políΦku Kritéria u pole prijmeni zapiÜte text (v hranatých závorkách [Zadejte jméno prodejce:]), který se zobrazí v dialogovém okn∞ pro zadání parametru p°ed vlastním provedením dotazu (viz obr. 1).
Access dovoluje vno°ovat dotazy SELECT; nap°. ke zjiÜt∞ní prodejc∙, kte°í vyhovují podmínkám jiného dotazu (Dotaz2), m∙₧ete pou₧ít klíΦové slovo EXISTS SELECT prijmeni, skupina FROM Prodejci WHERE EXISTS
SELECT * FROM dotaz2 WHERE Prodejci.Prijmeni=Prijmeni);
Pou₧ití dotaz∙ v programovém kódu
Dotaz ulo₧ený v databázi (nap°. qryProdejci) m∙₧ete spustit v programu p°íkazem DoCmd.OpenQuery "qryProdejci" nebo dotaz p°ímo zapiÜte DoCmd.RunSQL "DELETE * FROM prodejci WHERE obrat <5000" nebo Dbs.Execute "SELECT * FROM prodejci WHERE obrat>0 ORDER BY obrat DESC" (kde Dbs je prom∞nná typu Database).
Nechcete-li, aby se p°ed provedením dotazu objevilo okno s upozorn∞ním a nutností následného potvrzení (viz obr. 2), pou₧ijte metodu SetWarnings p°íkazu DoCmd. Probíhá-li dotaz delÜí dobu, pou₧ijte k zobrazení hodin metodu Hourglass. Ukázka pou₧ití by mohla vypadat takto:
DoCmd.Hourglass True
DoCmd. SetWarningsFalse
...
DoCmd.OpenQuery"qryProdejci"
...
DoCmd.Set WarningsTrue
DoCmd. Hourglass False
Chcete-li otev°ít mno₧inu záznam∙ na základ∞ dotazu, m∙₧ete pou₧ít metodu OpenRecordset a jako parametr zadat dotaz SQL; nap°.:
Dim dbs As DATABASE, rst As Recordset, dotaz As
String
Set dbs = CurrentDb
dotaz = "SELECT * FROM Smlouvy WHERE ([Vysledek] =
\storno\)"
Set rst = dbs.OpenRecordset(dotaz)
P°i pou₧ití dotazu, který obsahuje údaj typu datum, musíte tento údaj zapsat ve formátu pou₧ívaném v USA (tedy mm/dd/yy). èpatn∞ je tedy p°íkaz SELECT * FROM prodejci WHERE ([Datum_nar] >= # 11.1.1968#), správn∞ pak p°íkaz ([Datum_nar] >= #1/11/1968#\). Pokud v dotazu pou₧íváte prom∞nnou, velmi u₧iteΦné je k p°evodu formátu datumu pou₧ít funkci Format.
K°í₧ové dotazy
NejjednoduÜÜí zp∙sob, jak vytvo°it k°í₧ový dotaz, je pou₧ití pr∙vodce (v okn∞ Nový dotaz zvolíte Pr∙vodce k°í₧ovým dotazem). V jednotlivých krocích zvolíte pot°ebné parametry; definici dotazu m∙₧ete samoz°ejm∞ dodateΦn∞ pozm∞nit v návrhovém zobrazení nebo p°ímo kódu SQL (Access obsahuje p°íkaz TRANSFORM navíc oproti norm∞ ANSI SQL).
AgregaΦní funkce
Velmi u₧iteΦné p°i pou₧ívání dotaz∙ jsou agregaΦní funkce Avg, Count, Min, Max, Sum a statistické funkce pro sm∞rodatnou odchylku a rozptyl StDev a Var (a jejich odhady StDevP a VarP). P°i pou₧ití t∞chto funkcí vÜak nelze pou₧ít klauzuli DISTINCT, nap°. SELECT COUNT(DISTINCT id_prodejce) FROM prodeje pro zjiÜt∞ní poΦtu prodejc∙, kte°í uskuteΦnili alespo≥ jeden obchod.
Zadáte-li jako parametr agregaΦní funkce Count název urΦitého pole (nap°. Count([jmeno])), budou do souΦtu zahrnuty pouze záznamy, jejich₧ pole jmeno není prázdné (tedy neobsahuje hodnotu NULL). Chcete-li zjistit poΦet vÜech záznam∙, pou₧ijte Count(*). PoΦet vÜech záznam∙ s neprázdnými hodnotami v polích jmeno a prijmeni zárove≥ pak zjistíte funkcí Count([jmeno]&([prijmeni]).
Na rozdíl od funkce Count funkce Sum (nap°. Sum([plat])) do výsledného souΦtu zahrne i záznamy s hodnotou NULL.
Funkce na výpoΦet aritmetického pr∙m∞ru Avg do výpoΦtu nezahrne hodnoty NULL. P°i výpoΦtu pr∙m∞rného v∞ku obchodních partner∙ je pou₧ití Avg([vek] v po°ádku, nebo¥ partne°i s neznámým stá°ím prázdnou hodnotou v poli vek nejsou do výpoΦtu zahrnuti. Chybou vÜak je výpoΦet pr∙m∞rného poΦtu objednávek prodejc∙, kdy hodnota NULL "reprezentuje" nulový poΦet objednávek. V tomto p°ípad∞ pou₧ijte funkci Nz; tedy místo Avg([poc_obj]) pou₧ijte Avg(Nz([poc_obj])).
DalÜí
P°idáváte-li záznamy do tabulky, která obsahuje pole typu Automatické Φíslo, budou p°idané záznamy Φíslovány od nejvyÜÜí hodnoty zv∞tÜené o jednu tohoto pole v cílové tabulce (pokud jste ovÜem p°edtím nesmazali záznamy v cílové tabulce s nejvyÜÜími hodnotami bez provedení následné komprimace).
Ke zjiÜt∞ní záznam∙, je₧ existují v jedné tabulce a nejsou v tabulce druhé; nap°. prodejci, kte°í neuzav°eli ani jednu objednávku (tabulky Prodejci a Objednavky, vazba p°es pole ID_prodejce), pou₧ijte bu∩ Pr∙vodce vyhledávacím dotazem (chyb∞jící záznamy), nebo v návrhovém zobrazení vytvo°te dotaz (u pole smlouvy.ID_Prodejce zadejte Zobrazit Ne, Kritéria Null). Jiná mo₧nost je v zobrazení SQL p°ímo zapsat p°íkaz SELECT prodejci.* FROM prodejci LEFT JOIN objednavky ON Prodejci.ID_Prodejce = Smlouvy.ID_Prodejce WHERE ((smlouvy. ID_Prodejce IS NULL)).
Chcete-li zobrazit tzv. vypoΦítávané pole, nap°. cenu s DPH, a v tabulce máte cenu bez DPH (pole Cena), zadejte v m°í₧ce návrhu do políΦka Pole text Cena s DPH: [Cena]*1,22. Text Cena s DPH pak tvo°í název vypoΦítávaného pole.
9 0047/OK