Pokročilé výstupy
Last modified by Jan Šimeček on 2024/08/02 11:43
- Umožňují správci knihovny vytvořit libovolný vlastní výstup z dat uložených v databázi.
- 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ů.
- Š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.
- Pokročilé výstupy jsou v tabulce report_template a mají report_type=ADVANCED.
- Ukázková šablona je součástí výchozích dat Tritia s id = -39.
Načtení dat
- Součástí šablony musí být SQL pro načtení dat, která se pak mají ve výstupu zobrazovat.
- V iReportu se vkládá následovně:
- Pravé tlačítko na název šablony -> Edit Query -> Report query -> Query language: SQL.
- Do zobrazeného vstupu se pak zadává SQL.
- Sloupce, které se mají ve výstupu zobrazovat (popř. se s nimi nějak pracovat), musí:
- Být explicitně uvedeny ve výčtu sloupců, které select vrací.
- Mít uvedený alias (select x AS yz).
- Uveden v seznamu polí (field) šablony s odpovídajícím datovým typem.
Příklad zápisu v XML:
<queryString language="SQL"> <![CDATA[ SELECT [id] AS work_type_id, [name] AS work_type_name FROM [work_type] ]]> </queryString> <field name="work_type_id" class="java.lang.Long"/> <field name="work_type_name" class="java.lang.String"/>
- K takto definovaným polím je pak možno přistupovat přes standardní zápis $F{název_pole}
- např. $F{work_type_name}
Více selectů v jedné šabloně bez použití subreportu
- Musí se vytvořit subDataset, který lze pak provolat v komponentě chart, crosstab, table nebo list.
- V této komponentě je potřeba použít datasetRun, který vlastně předává vstupní parametry pro subDataset, který obsahuje samotné SQL.
- 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.
- jr:listContents je analogický k elementu detail band, lze tedy do něj umístit jiné elementy.
- DatasetRun je vlastně podobný subreport elementu. Může mít uvnitř dataSourceExpression nebo connectionExpression, který mění odkud data pochází.
- 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.
Příklad použití na list:
<subDataset name="dataset1" uuid="9fbfd1be-cb5a-476e-940a-afd2e2eb9b1e"> <parameter name="parametr1" class="java.lang.String"/> <queryString> <![CDATA[SELECT work FROM item WHERE id=$P!{parametr1}]]> </queryString> <field name="work" class="java.lang.String"/> </subDataset>
<componentElement> <reportElement x="1" y="76" width="553" height="50" uuid="2968c67b-f548-4c8a-bef3-0df29219b17e"/> <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"> <datasetRun subDataset="dataset1" uuid="abd17d55-84c6-4e37-9426-cb9f5f59c1a6"> <datasetParameter name="parametr1"> <datasetParameterExpression><![CDATA["66407"]]></datasetParameterExpression> </datasetParameter> </datasetRun> <jr:listContents height="50" width="553"> <textField> <reportElement x="167" y="16" width="219" height="20" uuid="79972cb3-82ff-4ae5-be0a-89250b9243b5"/> <textElement verticalAlignment="Middle"> <font fontName="DejaVu Sans" size="11"/> </textElement> <textFieldExpression><![CDATA[$F{work}]]></textFieldExpression> </textField> </jr:listContents> </jr:list> </componentElement>
- 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.
Předání hodnoty z proměnné subDataset do hlavního reportu lze provést přidáním:
<returnValue fromVariable="promenna_subdataset" toVariable="promenna_reportu"/>
- Nastavení parametru/proměnné subDataset, aby měli stejné hodnoty jako parametr/proměnná hlavního reportu lze provést takto:
Parametry výstupu
- Výstupy mohou být parametrizované, tzn. čtenář může omezit data, která se mají načítat.
- Např. načtení výpůjček konkrétního čtenáře za časové období.
- Tyto parametry je nutné v šabloně definovat
- Přidání parametru v iReport:
- Pravým na Parameters -> Add Parameter
- Vhodně parametr pojmenovat a nastavit mu datový typ
Definice v šabloně
- Parametr je poté možno používat v šabloně pomocí zápisu $P{název_parametru}
Je možno použít parametr přímo v SQL pro načítání
<parameter name="l1" class="java.lang.Long"/> <queryString language="SQL"> <![CDATA[ SELECT [name] AS work_type_name FROM [work_type] WHERE [id] = $P{l1} ]]> </queryString> <field name="work_type_name" class="java.lang.String"/>
- Tímto způsobem je ovšem možno vložit parametr pouze bez nějakých dalších úprav
- Funguje pro řetězce, čísla
- Nefunguje pro datum a pokročilé struktury Tritia
- Pokud je parametr potřeba nějakým způsobem zpracovat, tak toto není možné v části s SQL (omezení JasperReports).
- Je nutné si vytvořit nový parametr, nastavit mu požadovanou hodnotu a teprve pak ho použít v šabloně.
- K takto vytvořenému parametru je nutno přistupovat přes $P!{název_parametru} (vykřičník navíc).
- Pro vytvoření hodnoty parametru se dá použít skládání hodnot jako v Javě.
Příklad:
<parameter name="d1" class="java.util.Date"/> <parameter name="d1_sql_condition" class="java.lang.String"> <defaultValueExpression><![CDATA["[work_type].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'"]]></defaultValueExpression> </parameter> <queryString language="SQL"> <![CDATA[ SELECT [name] AS work_type_name FROM [work_type] WHERE $P!{d1_sql_condition} ]]> </queryString> <field name="work_type_name" class="java.lang.String"/>
- 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
Povinné a nepovinné parametry
- Pokud je parametr povinný, není potřeba ho ošetřovat.
- Nepovinný parametr může do šablony přijít jako NULL - je potřeba zajistit vytvoření validního SQL.
- K tomu se používá předzpracování parametru, viz výše.
- Využití ternárního operátoru
- Když je parametr různý od null, použij hodnotu A, jinak hodnotu B
- Podmínka 1=1 - neomezuje výsledky.
Příklad:
<parameter name="d1" class="java.util.Date"/> <parameter name="d1_sql_condition" class="java.lang.String"> <defaultValueExpression><![CDATA[$P{d1} == null ? "1=1" : ("[work].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'"]]></defaultValueExpression> </parameter> <queryString language="SQL"> <![CDATA[ SELECT [name] AS work_type_name FROM [work_type] WHERE $P!{d1_sql_condition} ]]> </queryString> <field name="work_type_name" class="java.lang.String"/>
- 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.
Definice v GUI
- Výše uvedené řeší, jak se mají parametry, které přijdou z Tritia, zpracovávat v šabloně.
- Je ale nutné definovat, že se zadání těchto parametrů má v Tritiu nabízet.
- Definováno v report_template ve sloupci param2.
- Každý parametr je určen:
- 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ý.
Datové typy
- řetězec - s
- celočíselná hodnota - n
- desetinná hodnota - double
- datum včetně času - d
- datum začátek dne (bez časové složky) - ds
- datum konec dne (bez časové složky) - de
- logická hodnota - b
- uživatel - u
- knihovna - l
- webová definice - w
- databázové objekty - zadávají se jako název UJO class (např. Work, Item, ...)
- zobrazují se v comboboxu
- zobrazují se v comboboxu
- Unikátní název - skládá se z datového typu doplněného o číslo
- např. d1, u2, Work3
- např. d1, u2, Work3
- Klíč k překladu - zobrazuje se jako popisek vstupu
- zadává se v hranatých závorkách
- např. [User], [Work_id]
- Nastavení povinnosti
- Povinné parametry je nutno v Tritiu vyplnit, není bez nich umožněno vytvořit výstup.
- Parametry jsou ve výchozím stavu povinné.
- Nepovinnost je možno nastavit přidáním znaku ? (otazník) před název parametru.
- Příklady parametrů:
- n1[Work_id] - povinný celočíselný parametr s názvem n1 v šabloně a překladem Work_id v Tritiu.
- ?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.
- 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.
- Každá šablona může obsahovat více parametrů - navzájem oddělené čárkou nebo středníkem.
- Příklad:
- n1[Work_id],?w2[Web_definition]- šablona s 1 povinným parametrem a jedním nepovinným.
Rozlišení pro různé databáze
- Různé databáze používají jiné escapování tabulek.
- Mysql - `work`
- MSSQL - [work]
- Pokud se vytváří šablona pro jednu konkrétní databázi, není toto nutné řešit.
- V šabloně pro více databází je nutno escapování řešit - nejsou navzájem kompatibilní
- K tomuto se používají speciální párové tagy
- SQL se umístí dovnitř těchto tagů.
- Escapování se upraví pro použitou databázi.
- Je nutno escapovat pro MSSQL
<sql>
- Používá se v části s hlavním SQL šablony.
- Nelze ho používat v parametrech.
- Pro SQL se musí používat MSSQL escapování.
- Musí se vkládat do části ![CDATA[....]] - nejedná se o standardní XML tag, JasperReports by ho nedokázal zpracovat.
Příklad:
<queryString language="SQL"> <![CDATA[ <sql> SELECT [name] AS work_type_name FROM [work_type] </sql> ]]> </queryString>
<sqlp>
- Používá se v části s parametry
- Nelze ho použít v hlavním SQL šablony
- SQL musí mít MSSQL escapování
- Musí se vkládat do ![CDATA[....]]
Příklad:
<parameter name="d1_sql_condition" class="java.lang.String"> <defaultValueExpression><![CDATA[<sqlp>$P{d1} == null ? "1=1" : ("[work].[date_created] > '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format($P{d1}) + "'")</sqlp>]]></defaultValueExpression> </parameter>
Různá SQL pro databáze
- Pro složitější SQL dotazy jen změna escapování nestačí, protože každá databáze používá jinou syntaxi příkazů
- V takovém případě jen nutno mít pro každou databázi jiné SQL
- K tomu se používají párové tagy <mysql> a <mssql>
- Tyto bloky uvozují SQL, která se používá jen pro tuto konkrétní databázi.
- Tzn. pokud jsou v šabloně bloky <mysql> i <mysql> a pracuji nad MSSQL, tak bloky v <mysql> části jsou ze šablony odebrány.
Příklad:
<queryString language="SQL"> <![CDATA[ <mssql> SELECT [name] AS work_type_name FROM [work_type] </mssql> <mysql> SELECT `name` AS work_type_name FROM `work_type` </mysql> ]]> </queryString>