Wiki source code of Pokročilé výstupy
Last modified by Martin Mahr on 2025/02/11 10:25
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 | ))) |