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:

1722591788345-379.PNG

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
         
  • Unikátní název - skládá se z datového typu doplněného o číslo
    • 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>