Tímto dílem začíná část seriálu, která se bude věnovat uspořádání dat a reportům s komplexnějšími grafickými výstupy. Ukážeme si, jak v SSRS přidat do reportu skupiny, jak vytvářet jejich hierarchická uskupení a jak v rámci skupin provádět výpočty.
Občas je potřeba mít v reportu agregované hodnoty (sumace hodnot, počty prvků atd.) záznamů, které si jsou určitým způsobem podobné (zákazníci ze stejného města, zaměstnanci stejného oddělení, lidé narození v témže roce…), pro tento účel nabízí SSRS možnost vytváření skupin záznamů (groups).
Tato funkcionalita nám umožňuje záznamy v rámci tabulky seskupovat a tato seskupení následně „osadit“ např. společným záhlavím, zápatím, agregovanými hodnotami týkajícími se tohoto uskupení, případně tyto skupiny vzájemně vnořovat, a vytvářet tak hierarchické struktury záznamů.
Přidávání skupin
Seskupování si v této části seriálu vyzkoušíme na reportu, který bude obsahovat hierarchii oddělení společnosti AdventureWorks a zaměstnanců těchto oddělení. Report bude v základní formě obsahovat pouze seznam oddělení nejvyššího stupně hierarchie (v databázi označovaném jako skupina – jde o hrubé rozdělení, jako výroba, výzkum a vývoj, exekutiva apod.) a počet zaměstnanců, kteří v daném oddělení pracují. Uživatel si bude moci rozvinovat vybrané oddělení na podrobnější úroveň (v případě exekutivy tedy např. na oddělení lidských zdrojů, finanční oddělení atd.), případně na informace o jednotlivých zaměstnancích příslušného oddělení.
Příprava datasetu
Nejprve si opět vytvoříme dataset, který bude tvořit tělo reportu (parametry pro tentokrát vynecháme).
SELECT
dep.GroupName AS gr_name
,dep.Name AS dep_name
,per.FirstName + ' ' + (CASE WHEN per.MiddleName IS NULL THEN '' ELSE per.MiddleName + ' ' END) + per.LastName AS name
,em.JobTitle
,em.BirthDate
,edh.StartDate
FROM
HumanResources.Department AS dep
JOIN HumanResources.EmployeeDepartmentHistory AS edh ON dep.DepartmentID = edh.DepartmentID
JOIN HumanResources.Employee AS em ON edh.BusinessEntityID = em.BusinessEntityID
JOIN Person.Person AS per ON em.BusinessEntityID = per.BusinessEntityID
WHERE em.CurrentFlag = 1
AND YEAR(EndDate) IS NULL
Tvorba reportu
- Založíme novou tabulku (v záložce Design přetáhneme z panelu Toolbox na plátno s tělem reportu položku Table).
- Vytvoříme v ní čtyři sloupce (klikneme na záhlaví libovolného sloupce pravým tlačítkem myši, zvolíme Insert column a zvolíme, zda nový sloupec umístíme napravo nebo nalevo).
- Nadpisy a obsah sloupců upravíme tak, jak je tomu na obrázku níže:
- V panelu Row Groups ve spodní části okna klikneme pravým tlačítkem na položku Details a zvolíme volbu Add Group -> Parent Group:
Tím vyvoláme okno s popisem nové skupiny. Seskupování zaměstnanců budeme provádět podle názvu oddělení, u položky Group by tedy zvolíme z nabídky sloupec dep_name – přiřadíme zatím vytvořené sloupce z kroku 2 do nové skupiny. Vytvoření patičky skupiny zajistíme zaškrtnutím položky Add group footer.
- Do tabulky s obsahem reportu se přidal nový sloupec s položkami skupiny a v panelu Row Groups se nám vytvořila nová položka (skupina) dep_name.
Opakujte postup z předchozího kroku s touto skupinou pouze s tím rozdílem, že položce Group by přiřadíte hodnotu gr_name – tím do tabulky opět vložíme nový sloupec příslušející nové skupině (a v panelu Row Groups přibude řádek gr_name).
Report v této fázi bude zobrazovat data v seskupené podobě (bez použití GROUP BY v základním datasetu), s tím se nicméně nespokojíme – po spuštění reportu na nás vyskočí nepřehledné množství záznamů. To změníme tak, že jednotlivé skupiny uspořádáme do rozvinovacích polí. Díky tomu si bude moct uživatel zobrazit informace pouze vybraných skupin a oddělení.
- V panelu Row Groups vyvoláme pravým tlačítkem vlastnosti skupiny Details (položka Group Properties). Objeví se panel s vlastnostmi skupiny. V záložce Visibility zaškrtneme položku Display can be toggled by this report item a zvolíme sloupec dep_name. Skupina Details (sloupce z kroku 2) a položku When the report is initially run nastavíme na Hide. Tak budou součástí rozvinovacího pole položky ze skupiny dep_name – jejich výchozí podoba bude „zabalená“.
- Obdobně budeme postupovat u skupiny dep_name, svinování ale bude řízeno položkami sloupce gr_name.
- Nyní nastala chvíle pro přidání počtu zaměstnanců za jednotlivá oddělení, skupiny a celou firmu. Klikneme na záhlaví posledního řádku tabulky a zvolíme položku Insert Row -> Outside Group – Below. Tím přidáme do tabulky nový řádek, který nebude spadat pod žádnou ze skupin. Podle obrázku popíšeme nový řádek a do polí patiček doplníme následující výrazy (Expression):
Pro patičku skupiny dep_name:
="Zaměstnanců v oddělení: " + CountRows().ToString()
A pro patičku skupiny gr_name:
="Zaměstnanců ve skupině: " + CountRows().ToString()
Do nově přidaného řádku přidáme výraz:
=CountRows()
Funkce CountRows() vrací počet řádků v daném uskupení (v našem případě jde o jednotlivá seskupení a celou tabulku). Funkce ToString() převádí její hodnotu na textový řetězec – bez ní by sloučení s předchozím textem výrazu nebylo možné.
- Barvy pozadí jednotlivých buněk nastavíme dle libosti nebo podle obrázku níže:
Vybereme bílá pole, klikneme pravým tlačítkem na libovolné z nich a vyvoláme nabídku TextBox Properites, kde v záložce Fill nastavíme Fill Color na výraz:
=iif( (RowNumber("DataSet1") Mod 2)=0,"White", "WhiteSmoke")
Funkce iif() má tři parametry – logickou podmínku, akci provedenou při splnění podmínky a akci při nesplnění podmínky. Tento výraz tedy kontroluje, zda je pořadí daného řádku dělitelné dvěma; pokud ano, je pozadí řádku vyplněno bílou barvou, v opačném případě světle šedou (barvy řádků se tedy střídají).
Výsledný report by měl jít rozvinovat tak, jak je tomu na obrázku:
Závěr
Ukázali jsme si jak v SSRS přidat do reportu skupiny, jak vytvářet jejich hierarchická uskupení a jak v rámci skupin provádět výpočty, aniž bychom zasahovali do kódu pro zdrojovou datovou sadu.