Tipy pro MS Access

1. 2. 1999

Sdílet

Práce s dotazy Výběr pouze určitého počtu záznamů K zobrazení určitého počtu záznamů s nejvyšší


Práce s dotazy



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);

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])).


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 TrueDoCmd.SetWarnings
False...DoCmd.OpenQuery "qryProdejci"...DoCmd.SetWarnings
TrueDoCmd.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 StringSet 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 .

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ávanho pole.



Autor článku