Wiki source code of Pokročilé výstupy
Version 1.1 by Jan Šimeček on 2024/08/02 11:43
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | * Umožňují správci knihovny vytvořit libovolný vlastní výstup z dat uložených v databázi. | ||
| 4 | * Součástí šablony je SQL pro přímé načtení dat - data nejsou předpřipravena v Tritiu jako je tomu u základních (jednoduchých) výstupů. | ||
| 5 | * Šablona je parametrizovaná, tzn. po výběru šablony je před samotným exportem zobrazen dialog s parametry, které se následně předají do šablony. | ||
| 6 | * Pokročilé výstupy jsou v tabulce report_template a mají report_type=ADVANCED. | ||
| 7 | * Ukázková šablona je součástí výchozích dat Tritia s id = -39. | ||
| 8 | |||
| 9 | = Načtení dat = | ||
| 10 | |||
| 11 | * Součástí šablony musí být SQL pro načtení dat, která se pak mají ve výstupu zobrazovat. | ||
| 12 | * V iReportu se vkládá následovně: | ||
| 13 | ** Pravé tlačítko na název šablony -> Edit Query -> Report query -> Query language: SQL. | ||
| 14 | ** Do zobrazeného vstupu se pak zadává SQL. | ||
| 15 | |||
| 16 | * Sloupce, které se mají ve výstupu zobrazovat (popř. se s nimi nějak pracovat), musí: | ||
| 17 | ** Být explicitně uvedeny ve výčtu sloupců, které select vrací. | ||
| 18 | ** Mít uvedený alias (select x AS yz). | ||
| 19 | ** Uveden v seznamu polí (field) šablony s odpovídajícím datovým typem. | ||
| 20 | |||
| 21 | * ((( | ||
| 22 | Příklad zápisu v XML: | ||
| 23 | |||
| 24 | | | ||
| 25 | |||
| 26 | {{{<queryString language="SQL"> | ||
| 27 | <![CDATA[ | ||
| 28 | SELECT [id] AS work_type_id, | ||
| 29 | [name] AS work_type_name | ||
| 30 | FROM [work_type] | ||
| 31 | ]]> | ||
| 32 | </queryString> | ||
| 33 | <field name="work_type_id" class="java.lang.Long"/> | ||
| 34 | <field name="work_type_name" class="java.lang.String"/>}}} | ||
| 35 | |||
| 36 | |||
| 37 | ))) | ||
| 38 | * K takto definovaným polím je pak možno přistupovat přes standardní zápis $F{název_pole} | ||
| 39 | ** např. $F{work_type_name} | ||
| 40 | |||
| 41 | == Více selectů v jedné šabloně bez použití subreportu == | ||
| 42 | |||
| 43 | * Musí se vytvořit subDataset, který lze pak provolat v komponentě chart, crosstab, table nebo list. | ||
| 44 | * V této komponentě je potřeba použít datasetRun, který vlastně předává vstupní parametry pro subDataset, který obsahuje samotné SQL. | ||
| 45 | * SubDataset může mít parametr, field, variable a group stejně jako samotný report. Každý subDataset má vlastní query, report může mít neomezeně subDataset. | ||
| 46 | * jr:listContents je analogický k elementu detail band, lze tedy do něj umístit jiné elementy. | ||
| 47 | * DatasetRun je vlastně podobný subreport elementu. Může mít uvnitř dataSourceExpression nebo connectionExpression, který mění odkud data pochází. | ||
| 48 | * Stejný subDataset může být použit pro více datasetRun, takže lze lehce použít stejnou query s různými parametry. | ||
| 49 | |||
| 50 | Příklad použití na list: | ||
| 51 | |||
| 52 | | | ||
| 53 | |||
| 54 | {{{ <subDataset name="dataset1" uuid="9fbfd1be-cb5a-476e-940a-afd2e2eb9b1e"> | ||
| 55 | <parameter name="parametr1" class="java.lang.String"/> | ||
| 56 | <queryString> | ||
| 57 | <![CDATA[SELECT work FROM item WHERE id=$P!{parametr1}]]> | ||
| 58 | </queryString> | ||
| 59 | <field name="work" class="java.lang.String"/> | ||
| 60 | </subDataset>}}} | ||
| 61 | |||
| 62 | |||
| 63 | | | ||
| 64 | |||
| 65 | {{{ <componentElement> | ||
| 66 | <reportElement x="1" y="76" width="553" height="50" uuid="2968c67b-f548-4c8a-bef3-0df29219b17e"/> | ||
| 67 | <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical"> | ||
| 68 | <datasetRun subDataset="dataset1" uuid="abd17d55-84c6-4e37-9426-cb9f5f59c1a6"> | ||
| 69 | <datasetParameter name="parametr1"> | ||
| 70 | <datasetParameterExpression><![CDATA["66407"]]></datasetParameterExpression> | ||
| 71 | </datasetParameter> | ||
| 72 | </datasetRun> | ||
| 73 | <jr:listContents height="50" width="553"> | ||
| 74 | <textField> | ||
| 75 | <reportElement x="167" y="16" width="219" height="20" uuid="79972cb3-82ff-4ae5-be0a-89250b9243b5"/> | ||
| 76 | <textElement verticalAlignment="Middle"> | ||
| 77 | <font fontName="DejaVu Sans" size="11"/> | ||
| 78 | </textElement> | ||
| 79 | <textFieldExpression><![CDATA[$F{work}]]></textFieldExpression> | ||
| 80 | </textField> | ||
| 81 | </jr:listContents> | ||
| 82 | </jr:list> | ||
| 83 | </componentElement>}}} | ||
| 84 | |||
| 85 | * Výsledkem je, že textField v listu zobrazí ID work uložený v filed work pro ID item zaslaného subDataset pomocí jeho parametr "parametr1", který hodnotu uložil do field work. | ||
| 86 | |||
| 87 | Předání hodnoty z proměnné subDataset do hlavního reportu lze provést přidáním: | ||
| 88 | |||
| 89 | | | ||
| 90 | |||
| 91 | {{{<returnValue fromVariable="promenna_subdataset" toVariable="promenna_reportu"/>}}} | ||
| 92 | |||
| 93 | * Nastavení parametru/proměnné subDataset, aby měli stejné hodnoty jako parametr/proměnná hlavního reportu lze provést takto: | ||
| 94 | |||
| 95 | [[image:1722591788345-379.PNG||height="284" width="609"]] | ||
| 96 | |||
| 97 | = Parametry výstupu = | ||
| 98 | |||
| 99 | * Výstupy mohou být parametrizované, tzn. čtenář může omezit data, která se mají načítat. | ||
| 100 | * Např. načtení výpůjček konkrétního čtenáře za časové období. | ||
| 101 | |||
| 102 | * Tyto parametry je nutné v šabloně definovat | ||
| 103 | * Přidání parametru v iReport: | ||
| 104 | ** Pravým na Parameters -> Add Parameter | ||
| 105 | ** Vhodně parametr pojmenovat a nastavit mu datový typ | ||
| 106 | |||
| 107 | == Definice v šabloně == | ||
| 108 | |||
| 109 | * Parametr je poté možno používat v šabloně pomocí zápisu $P{název_parametru} | ||
| 110 | * ((( | ||
| 111 | Je možno použít parametr přímo v SQL pro načítání | ||
| 112 | |||
| 113 | | | ||
| 114 | |||
| 115 | {{{<parameter name="l1" class="java.lang.Long"/> | ||
| 116 | <queryString language="SQL"> | ||
| 117 | <![CDATA[ | ||
| 118 | SELECT [name] AS work_type_name | ||
| 119 | FROM [work_type] | ||
| 120 | WHERE [id] = $P{l1} | ||
| 121 | ]]> | ||
| 122 | </queryString> | ||
| 123 | <field name="work_type_name" class="java.lang.String"/>}}} | ||
| 124 | |||
| 125 | |||
| 126 | ))) | ||
| 127 | * Tímto způsobem je ovšem možno vložit parametr pouze bez nějakých dalších úprav | ||
| 128 | ** Funguje pro řetězce, čísla | ||
| 129 | ** Nefunguje pro datum a pokročilé struktury Tritia | ||
| 130 | * Pokud je parametr potřeba nějakým způsobem zpracovat, tak toto není možné v části s SQL (omezení JasperReports). | ||
| 131 | * Je nutné si vytvořit nový parametr, nastavit mu požadovanou hodnotu a teprve pak ho použít v šabloně. | ||
| 132 | * K takto vytvořenému parametru je nutno přistupovat přes $P!{název_parametru} (vykřičník navíc). | ||
| 133 | * Pro vytvoření hodnoty parametru se dá použít skládání hodnot jako v Javě. | ||
| 134 | * ((( | ||
| 135 | Příklad: | ||
| 136 | |||
| 137 | | | ||
| 138 | |||
| 139 | {{{<parameter name="d1" class="java.util.Date"/> | ||
| 140 | <parameter name="d1_sql_condition" class="java.lang.String"> | ||
| 141 | <defaultValueExpression><![CDATA["[work_type].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'"]]></defaultValueExpression> | ||
| 142 | </parameter> | ||
| 143 | <queryString language="SQL"> | ||
| 144 | <![CDATA[ | ||
| 145 | SELECT [name] AS work_type_name | ||
| 146 | FROM [work_type] | ||
| 147 | WHERE $P!{d1_sql_condition} | ||
| 148 | ]]> | ||
| 149 | </queryString> | ||
| 150 | <field name="work_type_name" class="java.lang.String"/>}}} | ||
| 151 | |||
| 152 | |||
| 153 | ))) | ||
| 154 | * Pro datum 1.2.2015 10:00:00 bude v parametru d1_sql_condition nastavena hodnota "[work_type].[date_created] > '2015-02-01 10:00:00' ", což odpovídá SQL zápisu | ||
| 155 | |||
| 156 | == Povinné a nepovinné parametry == | ||
| 157 | |||
| 158 | * Pokud je parametr povinný, není potřeba ho ošetřovat. | ||
| 159 | * Nepovinný parametr může do šablony přijít jako NULL - je potřeba zajistit vytvoření validního SQL. | ||
| 160 | * K tomu se používá předzpracování parametru, viz výše. | ||
| 161 | * Využití ternárního operátoru | ||
| 162 | ** Když je parametr různý od null, použij hodnotu A, jinak hodnotu B | ||
| 163 | * Podmínka 1=1 - neomezuje výsledky. | ||
| 164 | |||
| 165 | * ((( | ||
| 166 | Příklad: | ||
| 167 | |||
| 168 | | | ||
| 169 | |||
| 170 | {{{<parameter name="d1" class="java.util.Date"/> | ||
| 171 | <parameter name="d1_sql_condition" class="java.lang.String"> | ||
| 172 | <defaultValueExpression><![CDATA[$P{d1} == null ? "1=1" : ("[work].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'"]]></defaultValueExpression> | ||
| 173 | </parameter> | ||
| 174 | <queryString language="SQL"> | ||
| 175 | <![CDATA[ | ||
| 176 | SELECT [name] AS work_type_name | ||
| 177 | FROM [work_type] | ||
| 178 | WHERE $P!{d1_sql_condition} | ||
| 179 | ]]> | ||
| 180 | </queryString> | ||
| 181 | <field name="work_type_name" class="java.lang.String"/>}}} | ||
| 182 | |||
| 183 | |||
| 184 | ))) | ||
| 185 | * Pokud je parametr NULL, použije se podmínka 1=1 (načtou se všechny záznamy). Jinak použije standardní SQL podmínku pro zadanou hodnotu. | ||
| 186 | |||
| 187 | == Definice v GUI == | ||
| 188 | |||
| 189 | * | ||
| 190 | ** Výše uvedené řeší, jak se mají parametry, které přijdou z Tritia, zpracovávat v šabloně. | ||
| 191 | ** Je ale nutné definovat, že se zadání těchto parametrů má v Tritiu nabízet. | ||
| 192 | ** Definováno v report_template ve sloupci param2. | ||
| 193 | ** Každý parametr je určen: | ||
| 194 | *** unikátním názvem - pod tímto názvem se pak zpracová v šabloně, musí být stejné,datovým typem - aby se v Tritiu zobrazila odpovídající komponenta pro vstup,klíčem k překladu popisku,určením, zda je parametr nepovinný. | ||
| 195 | |||
| 196 | |||
| 197 | \\**Datové typy** | ||
| 198 | |||
| 199 | * | ||
| 200 | ** řetězec - s | ||
| 201 | ** celočíselná hodnota - n | ||
| 202 | ** desetinná hodnota - double | ||
| 203 | ** datum včetně času - d | ||
| 204 | ** datum začátek dne (bez časové složky) - ds | ||
| 205 | ** datum konec dne (bez časové složky) - de | ||
| 206 | ** logická hodnota - b | ||
| 207 | ** uživatel - u | ||
| 208 | ** knihovna - l | ||
| 209 | ** webová definice - w | ||
| 210 | ** databázové objekty - zadávají se jako název UJO class (např. Work, Item, ...) | ||
| 211 | *** zobrazují se v comboboxu | ||
| 212 | |||
| 213 | * **Unikátní název** - skládá se z datového typu doplněného o číslo | ||
| 214 | ** např. d1, u2, Work3 | ||
| 215 | |||
| 216 | * **Klíč k překladu** - zobrazuje se jako popisek vstupu | ||
| 217 | ** zadává se v hranatých závorkách | ||
| 218 | ** např. [User], [Work_id] | ||
| 219 | |||
| 220 | * **Nastavení povinnosti** | ||
| 221 | ** Povinné parametry je nutno v Tritiu vyplnit, není bez nich umožněno vytvořit výstup. | ||
| 222 | ** Parametry jsou ve výchozím stavu povinné. | ||
| 223 | ** Nepovinnost je možno nastavit přidáním znaku ? (otazník) před název parametru. | ||
| 224 | |||
| 225 | * Příklady parametrů: | ||
| 226 | ** n1[Work_id] - povinný celočíselný parametr s názvem n1 v šabloně a překladem Work_id v Tritiu. | ||
| 227 | ** ?w2[Web_definition] - nepovinný parametr, zobrazuje se combobox s webovými definicemi, název v šabloně je w2, popiskem v Tritiu je překlad Web_definition. | ||
| 228 | ** Work3[My_work] - povinný parametr, nabízí se jako combobox s díly, v šabloně pod názvem Work3, popisek je překlad My_work. | ||
| 229 | |||
| 230 | * Každá šablona může obsahovat více parametrů - navzájem oddělené čárkou nebo středníkem. | ||
| 231 | * Příklad: | ||
| 232 | ** n1[Work_id],?w2[Web_definition]- šablona s 1 povinným parametrem a jedním nepovinným. | ||
| 233 | |||
| 234 | = Rozlišení pro různé databáze = | ||
| 235 | |||
| 236 | * Různé databáze používají jiné escapování tabulek. | ||
| 237 | ** Mysql - `work` | ||
| 238 | ** MSSQL - [work] | ||
| 239 | * Pokud se vytváří šablona pro jednu konkrétní databázi, není toto nutné řešit. | ||
| 240 | * V šabloně pro více databází je nutno escapování řešit - nejsou navzájem kompatibilní | ||
| 241 | * K tomuto se používají speciální párové tagy | ||
| 242 | ** SQL se umístí dovnitř těchto tagů. | ||
| 243 | ** Escapování se upraví pro použitou databázi. | ||
| 244 | ** Je nutno escapovat pro MSSQL | ||
| 245 | |||
| 246 | == <sql> == | ||
| 247 | |||
| 248 | * Používá se v části s hlavním SQL šablony. | ||
| 249 | * Nelze ho používat v parametrech. | ||
| 250 | * Pro SQL se musí používat MSSQL escapování. | ||
| 251 | * Musí se vkládat do části ![CDATA[....]] - nejedná se o standardní XML tag, JasperReports by ho nedokázal zpracovat. | ||
| 252 | * ((( | ||
| 253 | Příklad: | ||
| 254 | |||
| 255 | | | ||
| 256 | |||
| 257 | {{{<queryString language="SQL"> | ||
| 258 | <![CDATA[ | ||
| 259 | <sql> | ||
| 260 | SELECT [name] AS work_type_name | ||
| 261 | FROM [work_type] | ||
| 262 | </sql> | ||
| 263 | ]]> | ||
| 264 | </queryString>}}} | ||
| 265 | |||
| 266 | |||
| 267 | ))) | ||
| 268 | |||
| 269 | == <sqlp> == | ||
| 270 | |||
| 271 | * Používá se v části s parametry | ||
| 272 | * Nelze ho použít v hlavním SQL šablony | ||
| 273 | * SQL musí mít MSSQL escapování | ||
| 274 | * Musí se vkládat do ![CDATA[....]] | ||
| 275 | * ((( | ||
| 276 | Příklad: | ||
| 277 | |||
| 278 | | | ||
| 279 | |||
| 280 | {{{<parameter name="d1_sql_condition" class="java.lang.String"> | ||
| 281 | <defaultValueExpression><![CDATA[<sqlp>$P{d1} == null ? "1=1" : ("[work].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'")</sqlp>]]></defaultValueExpression> | ||
| 282 | </parameter>}}} | ||
| 283 | |||
| 284 | |||
| 285 | ))) | ||
| 286 | |||
| 287 | == Různá SQL pro databáze == | ||
| 288 | |||
| 289 | * Pro složitější SQL dotazy jen změna escapování nestačí, protože každá databáze používá jinou syntaxi příkazů | ||
| 290 | * V takovém případě jen nutno mít pro každou databázi jiné SQL | ||
| 291 | * K tomu se používají párové tagy <mysql> a <mssql> | ||
| 292 | * Tyto bloky uvozují SQL, která se používá jen pro tuto konkrétní databázi. | ||
| 293 | * Tzn. pokud jsou v šabloně bloky <mysql> i <mysql> a pracuji nad MSSQL, tak bloky v <mysql> části jsou ze šablony odebrány. | ||
| 294 | * ((( | ||
| 295 | Příklad: | ||
| 296 | |||
| 297 | | | ||
| 298 | |||
| 299 | {{{<queryString language="SQL"> | ||
| 300 | <![CDATA[ | ||
| 301 | <mssql> | ||
| 302 | SELECT [name] AS work_type_name | ||
| 303 | FROM [work_type] | ||
| 304 | </mssql> | ||
| 305 | <mysql> | ||
| 306 | SELECT `name` AS work_type_name | ||
| 307 | FROM `work_type` | ||
| 308 | </mysql> | ||
| 309 | ]]> | ||
| 310 | </queryString>}}} | ||
| 311 | |||
| 312 | |||
| 313 | ))) |