Wiki source code of Pokročilé výstupy

Last modified by Martin Mahr on 2025/02/11 10:25

Show last authors
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 )))