Výrazy, podmínky a placeholdery — kompletní průvodce

Tento dokument popisuje všechny druhy výrazů, podmínek a placeholderů dostupných v JSON šablonách XmlStackBuilder. Funkce jsou společné pro všechny tři typy rendererů (tabulkové sestavy, dokumenty, štítky), pokud není uvedeno jinak.


Obsah

  1. Placeholdery {pole}
  2. Tečková notace {element.pole}
  3. Aliasy
  4. Formátování {pole:formát}
  5. Coalesce {pole1|pole2|'literál'}
  6. Textové modifikátory :UPPER, :LOWER, :PROPER
  7. Textová maska ###.###
  8. Zkrácení textu {pole:50}
  9. Ternární výrazy {podmínka?ano:ne}
  10. Podmínky (visibleWhen, where, when)
  11. Aritmetické výrazy (expr)
  12. Agregační funkce (SUM, AVG, ...)
  13. Funkce v expr a šablonách
  14. Datumové funkce
  15. Funkce v groupExpression
  16. Lookup tabulky
  17. Kde co funguje — přehledová tabulka

1. Placeholdery {pole}

Základní mechanismus pro vložení hodnoty z XML dat do výstupního textu.

{ "label": "Faktura {cislo}" }

XML: <header cislo="FV2600001" /> → výstup: Faktura FV2600001

Placeholder {pole} se nahradí hodnotou atributu pole z aktuálního XML elementu. Pokud atribut neexistuje, placeholder se nahradí prázdným řetězcem.

Kde funguje


2. Tečková notace {element.pole}

Přístup k hodnotám z jiných XML elementů než aktuálního kontextu.

{ "template": "{cena:N2} {parametr.mena}" }

XML:

<root>
  <parametr mena="CZK" />
  <data><row cena="1500" /></data>
</root>

Výstup: 1 500,00 CZK

Pravidla navigace

Zápis Význam
{pole} Atribut na aktuálním elementu
{element.pole} Atribut pole na child elementu element pod rootem
{a.b.pole} Hluboká navigace: root → ab → atribut pole
{lookup.pole} Pole z lookup tabulky (pokud je registrovaná)

Navigace je case-insensitive{Header.Mena} i {header.mena} fungují stejně.

Priorita hledání

  1. Lookup tabulky — pokud element odpovídá registrovanému lookup aliasu
  2. XML root — navigace přes ResolveElementByPath
  3. Aktuální kontext — atribut přímo na aktuálním řádku

Důležité: Pokud je element registrovaný jako lookup alias a lookup nenajde záznam, vrátí se prázdný řetězec. Nikdy se nespadne na XML root — to by vrátilo první řádek místo aktuálního.


3. Aliasy

Zkratky pro opakované hluboké cesty. Definují se na úrovni celé šablony:

{
  "aliases": {
    "pol": "objednavka.polozky",
    "hlav": "objednavka.hlavicka"
  },
  "sections": [{
    "element": "pol",
    "columns": {
      "cena": { "label": "Cena {hlav.mena}", "format": "N2" }
    }
  }]
}

Aliasy se substituují před renderováním ve všech relevantních vlastnostech: element, visibleWhen, where, template placeholdery, expr.


4. Formátování {pole:formát}

Za dvojtečkou lze uvést formátovací řetězec:

{ "label": "Datum: {datum:dd.MM.yyyy}", "template": "Celkem: {castka:N2}" }

Číselné formáty

Formát Příklad vstupu Výstup (cs-CZ)
N0 1234567 1 234 567
N2 1234.5 1 234,50
N4 0.12345 0,1235
F2 1234.5 1234,50
#,##0.00 1234.5 1 234,50
P0 0.156 16 %

Datumové formáty

Formát Příklad vstupu Výstup
dd.MM.yyyy 2026-01-15 15.01.2026
dd.MM.yyyy HH:mm 2026-01-15T14:30:00 15.01.2026 14:30
MMMM yyyy 2026-03-01 březen 2026
d 2026-01-15 15.01.2026

Textová maska

Viz sekce 7.

Zkrácení textu

Viz sekce 8.


5. Coalesce {pole1|pole2|'literál'}

První neprázdná hodnota ze seznamu. Literální fallback v jednoduchých uvozovkách:

{ "template": "{nazev_cz|nazev_en|'Bez názvu'}" }
XML data Výstup
nazev_cz="Jablko" Jablko
nazev_cz="" nazev_en="Apple" Apple
nazev_cz="" nazev_en="" Bez názvu

Coalesce funguje i s tečkovou notací: {header.firma|parametr.firma|'Neuvedeno'}.


6. Textové modifikátory :UPPER, :LOWER, :PROPER

Transformace velikosti písmen. Uvádí se jako poslední modifikátor za formátem:

{ "format": "UPPER" }
{ "template": "{firma:UPPER}" }
{ "template": "{nazev:N2:PROPER}" }
Modifikátor Vstup Výstup
:UPPER Jan Novák JAN NOVÁK
:LOWER Jan Novák jan novák
:PROPER JAN NOVÁK Jan Novák

Modifikátor se aplikuje po formátování čísla/data. U {cena:N2:UPPER} se nejdřív zformátuje číslo, pak převede na velká písmena (pro čísla nemá efekt, ale pro text-číslo kombinace ano).


7. Textová maska ###.###

Formát obsahující # se interpretuje jako textová maska — každý # představuje jeden znak ze vstupní hodnoty, ostatní znaky jsou literály:

{ "label": "Účet", "format": "###.###" }
Vstup Výstup
311100 311.100
211 211
50101 501.01

Maska se aplikuje na textovou hodnotu (zleva doprava). Pokud je vstup kratší než počet #, přebytečné literály se vynechají.


8. Zkrácení textu {pole:50}

Pokud je formát celé číslo, funguje jako maximální délka textu:

{ "label": "Název", "format": "80" }
{ "template": "{text:50}" }

Hodnota se ořízne na zadaný počet znaků. Zkrácení se kontroluje před numerickým formátováním — {cislo:5} je oříznutí na 5 znaků, ne číselný formát.


9. Ternární výrazy {podmínka?ano:ne}

Inline podmíněný text v libovolné šabloně:

{
  "label": "Účet {ucet} {osnova.ap=A?AKTIVNÍ:PASIVNÍ}",
  "sumLabel": "Celkem {typ=P?příjem:výdej}",
  "template": "{stav=A?Aktivní:stav=P?Pasivní:Zrušený}"
}

Syntaxe

{podmínka?text_true:text_false}

Podmínka používá stejné operátory jako visibleWhen (viz sekce 10).

Apostrofové literály v ternárních výrazech

Výsledkové větve i podmínky mohou obsahovat apostrofové literály. Apostrofy jsou nutné pokud text obsahuje speciální znaky (:, ?, |) nebo když chcete explicitně odlišit literál od názvu pole:

{
  "template": "{stav='A'?'Aktivní: ano':'Neaktivní: ne'}",
  "sumLabel": "{typ='P'?'Příjem (kladný)':'Výdej (záporný)'}",
  "label": "{mena='CZK'?'Částka v Kč':'Amount in {mena}'}"
}

Bez apostrofů {stav=A?Aktivní:Neaktivní} funguje stejně — apostrofy jsou volitelné pro jednoduchý text bez speciálních znaků.

Numerické hodnoty v podmínkách

Čísla v podmínce (pravá strana =, >, < atd.) nemusí být v apostrofech:

{
  "label": "Skupina prodlení — {prodl_skup=0?'Zaplacené':prodl_skup=1?'Před splatností':prodl_skup=2?'1–30 dní':'Po splatnosti'}",
  "template": "{pocet>10?'Hromadná objednávka':'Kusový prodej'}"
}

Podmínka prodl_skup=0 se vyhodnotí jako číselné porovnání, bez apostrofů — XSB si všimne, že 0 není platný XML identifikátor (nezačíná písmenem), a bere ho jako literál.

Historická poznámka: Do XSB 1.1.7 byl parser přísnější a pravou stranu = zkoušel vždy nejdřív resolvovat jako pole → XElement.Attribute("0") padl na XmlException. Oprava v 1.1.8 přidala IsValidXmlName guard.

Nevnořujte {…} do větví ternary

Špatně:

{ "label": "{a=1?X:{b=2?Y:Z}}" }

Vnitřní {b=2?…} se interpretuje jako samostatný placeholder, ne jako vnořený ternary — regex parsovač si s tím neporadí.

Správně (řetězení přes :?):

{ "label": "{a=1?X:b=2?Y:Z}" }

Řetězení (else-if)

{a=1?První:a=2?Druhý:Ostatní}
{a='1'?'Výsledek: první':a='2'?'Výsledek: druhý':'Výsledek: ostatní'}

Ternární výrazy lze vnořovat — vyhodnocují se zleva doprava.

Kde funguje


10. Podmínky (visibleWhen, where, when)

Logické podmínky pro řízení viditelnosti, filtrování a stylování.

Operátory porovnání

Operátor Formát Popis Příklad
(žádný) "pole" Pole má neprázdnou hodnotu "header.mena"
! "!pole" Pole je prázdné nebo nulové "!header.sleva"
= "pole=hodnota" Rovnost (case-insensitive) "stav=A"
!= "pole!=hodnota" Nerovnost "stav!=Z"
> "pole>hodnota" Číslo je větší "castka>1000"
>= "pole>=hodnota" Číslo je větší nebo rovno "castka>=0"
< "pole<hodnota" Číslo je menší "sazba<21"
<= "pole<=hodnota" Číslo je menší nebo rovno "pocet<=100"
IN "pole IN (a, b, c)" Příslušnost k množině "mena IN (EUR, USD, GBP)"
NOT IN "pole NOT IN (a, b)" Nepatří do množiny "typ NOT IN ('X', 'Z')"
LIKE "pole LIKE 'vzor%'" Textový vzor (%=cokoliv, _=1 znak) "nazev LIKE 'Faktura%'"
NOT LIKE "pole NOT LIKE 'vzor'" Negace textového vzoru "kod NOT LIKE '9%'"
BETWEEN "pole BETWEEN a AND b" Číselný rozsah (včetně hranic) "castka BETWEEN 1000 AND 5000"

Operátor NOT

Negace libovolné podmínky v závorkách:

"where": "NOT (stav='Z')"
"visibleWhen": "NOT (typ IN ('X', 'Y'))"
"when": "NOT (poznamka)"

NOT má vyšší prioritu než AND/OR.

Závorky v podmínkách

Závorky mění pořadí vyhodnocování AND/OR:

"where": "(typ='A' OR typ='B') AND stav='novy'"
"visibleWhen": "typ='X' OR (stav='novy' AND castka>1000)"

Bez závorek: A OR B AND C = A OR (B AND C). Se závorkami: (A OR B) AND C.

Závorky lze vnořovat do libovolné hloubky: ((a OR b) AND c) OR d.

Operátor LIKE — vzory

Vzor Význam Příklad
% Libovolný počet znaků (0+) 'Fakt%' = začíná na "Fakt"
_ Právě jeden znak 'A_C' = "ABC", "AXC", ne "AC"
"where": "nazev LIKE 'FV%'"
"where": "kod LIKE '34_'"
"where": "text NOT LIKE '%test%'"

LIKE je case-insensitive.

Operátor BETWEEN

Číselný rozsah včetně obou hranic:

"where": "castka BETWEEN 1000 AND 5000"

Ekvivalent: castka>=1000 AND castka<=5000. Hodnoty se parsují jako čísla.

Poznámka: AND uvnitř BETWEEN se neparsuje jako logický operátor — castka BETWEEN 1000 AND 5000 AND stav='A' funguje správně (poslední AND je logický).

Funkce v levé straně podmínky

Levá strana operátoru může obsahovat funkci:

"where": "LEN(poznamka)>100"
"visibleWhen": "LEFT(ucet, 3)='343'"
"when": "UPPER(typ) IN ('A', 'B')"

Pokud levá strana obsahuje (, vyhodnotí se jako funkce přes výrazový engine.

Apostrofové literály v podmínkách

Hodnota na pravé straně operátoru může být v apostrofech — to ji označí jako literál (doslovný text), ne jako název jiného pole:

"where": "stav='A'"
"visibleWhen": "mena!='CZK'"
"when": "typ IN ('P', 'V', 'S')"

Bez apostrofů se pravá strana nejdřív zkusí resolvovat jako název pole (field-to-field porovnání). Pokud pole neexistuje, použije se jako literál. S apostrofy se vždy použije doslovně — bezpečnější a jednoznačnější.

Zápis Chování
"stav=A" Porovná stav s polem A, pokud neexistuje → porovná s textem "A"
"stav='A'" Vždy porovná stav s textem "A"
"cena=zaklad" Porovná pole cena s polem zaklad (field-to-field)
"cena='zaklad'" Porovná pole cena s textem "zaklad"

Tip: Apostrofy doporučujeme pro hodnoty, které by se mohly shodovat s názvem existujícího XML pole.

Logické operátory AND / OR

Podmínky lze kombinovat:

"visibleWhen": "header.je_cizi_mena AND header.kurz>1"
"where": "typ=P OR typ=V"
"when": "stav=A AND castka>0 OR stav=P AND castka>5000"

Precedence: AND váže silněji než OR (stejně jako v SQL).

Výraz A OR B AND C se vyhodnotí jako A OR (B AND C).

Operátory musí být oddělené mezerami: stav=A AND castka>0 — ne stav=AANDcastka>0.

Co se považuje za prázdné/nulové

Test "pole" (neprázdné) a "!pole" (prázdné) považuje za nulové:

Kde se podmínky používají

Vlastnost Na objektu Popis
visibleWhen sloupec Zobrazit sloupec jen když podmínka platí
visibleWhen sekce Zobrazit sekci jen když podmínka platí
visibleWhen sumRow Zobrazit součtový řádek jen když platí
visibleWhen footerRow Zobrazit patičkový blok jen když platí
visibleWhen blok (dokument) Zobrazit blok jen když platí
visibleWhen pole info-gridu Zobrazit položku jen když platí
visibleWhen blok štítku Zobrazit element na štítku jen když platí
where sekce Filtrovat řádky sekce
where sumRow Filtrovat řádky pro výpočet součtu
where data (štítky) Filtrovat řádky pro tisk štítků
when rowStyles Podmíněné stylování řádků

Dynamické where s placeholdery

Podmínka where na sumRow může obsahovat {pole} placeholder:

{
  "sumLabel": "KZ k m.{obdobi}",
  "scope": "ucet",
  "where": "obdobi<={obdobi}"
}

Při zpracování období 3 se {obdobi} resolvuje na 3 → podmínka "obdobi<=3" zahrne řádky za období 1, 2, 3.


11. Aritmetické výrazy (expr)

Počítané sloupce s aritmetickými výrazy vyhodnocovanými per-řádek:

{
  "columns": {
    "celkem": { "label": "Celkem", "expr": "cena * pocet", "format": "N2", "round": 2 },
    "s_dph": { "label": "S DPH", "expr": "cena * pocet * 1.21", "format": "N2" }
  }
}

Podporované operátory

Operátor Popis Příklad
+ Sčítání "cena + poplatek"
- Odčítání "md - d"
* Násobení "cena * pocet"
/ Dělení (dělení nulou = 0) "celkem / pocet"
( ) Závorky "(cena + dph) * pocet"

Precedence: * a / mají vyšší prioritu než + a -.

Konstanty

Číselné konstanty lze použít přímo ve výrazech: "cena * 1.21", "pocet * 0.5".

Tečková notace ve výrazech

Cross-element přístup funguje i v expr:

{ "expr": "cena * header.kurz" }

Zaokrouhlení

Property round (celé číslo) zaokrouhlí výsledek na zadaný počet desetinných míst (matematické zaokrouhlení, AwayFromZero):

{ "expr": "cena * pocet * 1.21", "round": 2 }

Průběžný součet (running)

{
  "zustatek": {
    "label": "Zůstatek",
    "expr": "prijem - vydaj",
    "running": true,
    "runningInitial": "{prnobj.pz}",
    "resetAt": "ucet",
    "format": "N2"
  }
}

12. Agregační funkce (SUM, AVG, ...)

V sumExpressions na skupinách a sekcích:

{
  "sumExpressions": [
    { "field": "castka", "expr": "SUM(castka)", "format": "N2" },
    { "field": "prumer", "expr": "AVG(cena)", "format": "N2" },
    { "field": "pocet", "expr": "COUNT()", "format": "N0" }
  ]
}

Podporované funkce

Funkce Popis Příklad
SUM(výraz) Součet "SUM(castka)", "SUM(cena * pocet)"
AVG(výraz) Průměr "AVG(cena)"
MIN(výraz) Minimum "MIN(castka)"
MAX(výraz) Maximum "MAX(castka)"
COUNT() Počet řádků "COUNT()"
COUNT(pole) Počet neprázdných "COUNT(ean)"
RUNNING(pole) Finální hodnota průběžného součtu "RUNNING(zustatek)"

Složené výrazy

Agregační funkce lze kombinovat aritmeticky:

{ "expr": "SUM(md) - SUM(d)" }
{ "expr": "SUM(castka) / COUNT()" }
{ "expr": "SUM(cena * pocet)" }

Ternární podmínka uvnitř agregace

Per-řádková podmínka uvnitř SUM:

{ "expr": "SUM(kcizi=1?mdcizi:0)" }

Pro každý řádek: pokud kcizi=1, přičte mdcizi, jinak přičte 0.

Ternární výraz na celém expr

Podmíněný výběr celého výpočtu:

{ "expr": "osnova.ap=A?SUM(md)-SUM(d):SUM(d)-SUM(md)" }

Podmínka osnova.ap=A se vyhodnotí z lookup tabulky. Podle výsledku se použije jeden nebo druhý výraz.

SUMBY — per-subgroup agregace

{ "expr": "SUMBY(ucet, osnova.ap=A?SUM(md)-SUM(d):SUM(d)-SUM(md))" }

Rozparticionuje řádky podle ucet, pro každou skupinu vyhodnotí ternární výraz zvlášť a výsledky sečte. Řeší situace kde podřízené položky mají různé vlastnosti (např. DPH syntetika s účty na A i P straně).


13. Funkce v expr a šablonách

Výrazový engine podporuje volání funkcí ve výrazech (expr), v šablonách (template, label, sumLabel) a v podmínkách (levá strana).

Numerické funkce

Funkce Popis Příklad Výsledek
ROUND(expr, n) Zaokrouhlení na n desetin ROUND(123.456, 2) 123.46
ROUND(expr) Zaokrouhlení na celé číslo ROUND(123.456) 123
ABS(expr) Absolutní hodnota ABS(-42.7) 42.7
FLOOR(expr) Zaokrouhlení dolů FLOOR(123.9) 123
CEILING(expr) Zaokrouhlení nahoru CEILING(123.1) 124
LEN(pole) Délka textu LEN('Ahoj') 4
MOD(a, b) Zbytek po dělení MOD(17, 5) 2
{ "expr": "ROUND(cena * 1.21, 2)", "format": "N2" }
{ "expr": "ABS(md - d)", "format": "N2" }

Řetězcové funkce

Funkce Popis Příklad Výsledek
LEFT(pole, n) Prvních n znaků LEFT('Ahoj světe', 4) Ahoj
RIGHT(pole, n) Posledních n znaků RIGHT('ABC123', 3) 123
SUBSTR(pole, start, délka) Podřetězec (1-based) SUBSTR('Ahoj světe', 6, 5) světe
REPLACE(pole, co, čím) Nahrazení textu REPLACE('Ahoj', 'Ahoj', 'Hi') Hi
TRIM(pole) Oříznutí mezer TRIM(' text ') text
UPPER(pole) Velká písmena UPPER('ahoj') AHOJ
LOWER(pole) Malá písmena LOWER('AHOJ') ahoj
PADL(pole, n, znak) Doplnění zleva PADL('42', 6, '0') 000042
PADR(pole, n, znak) Doplnění zprava PADR('Hi', 6, '.') Hi....
CONCAT(a, b, ...) Spojení řetězců CONCAT('Firma', ' — ', 'Praha') Firma — Praha

Řetězcové funkce v aritmetickém kontextu vrací 0 (jako číslo). V šablonovém kontextu vrací text.

Logické/utility funkce

Funkce Popis Příklad
IIF(podmínka, ano, ne) Inline podmínka IIF(stav=A, 'Aktivní', 'Neaktivní')
ICASE(pod1, res1, ..., default) Multi-branch ICASE(typ=A, 'Alpha', typ=B, 'Beta', 'Jiné')
EVL(pole, fallback) Pokud prázdné → fallback EVL(poznamka, 'bez poznámky')
COALESCE(a, b, c) První neprázdná COALESCE('', '0', 'Ano')Ano
EMPTY(pole) Je prázdné? (1/0) EMPTY('')1
NULLIF(a, b) Prázdný pokud a=b NULLIF(mena, 'CZK')'' (pokud CZK)
FORMAT(expr, vzor) Formátování hodnoty FORMAT(cena, 'N0')1 235
CHRTRAN(expr, hledej, nahraď) Per-znakový překlad CHRTRAN('A1B2', '12', '')AB
VAL(expr) Text → číslo VAL('123.45')123.45

NULLIF vrací prázdný řetězec pokud se oba argumenty rovnají (case-insensitive), jinak vrací první argument. Typické použití: potlačení výchozí hodnoty.

FORMAT aplikuje .NET formátovací vzor na číslo nebo datum. Pro čísla: 'N0', 'N2', '#,##0.00'. Pro datumy: 'dd.MM.yyyy', 'MMMM yyyy'.

CHRTRAN překládá po znacích — každý znak v expr nalezený v hledej se nahradí odpovídajícím znakem z nahraď. Pokud je nahraď kratší, znaky bez protějšku se odstraní. Kompatibilní s FoxPro CHRTRAN().

VAL převádí textový řetězec na číslo (decimal). Pokud text není číslo, vrací 0. Kompatibilní s FoxPro VAL().

{ "expr": "IIF(stav=A, cena, 0)", "format": "N2" }
{ "template": "{EVL(poznamka, '—')}" }
{ "template": "{NULLIF(mena, 'CZK')}" }
{ "template": "Cena: {FORMAT(castka, 'N0')} Kč" }
{ "template": "{CHRTRAN(telefon, '-/.', '')}" }
{ "expr": "VAL(pocet_text) * cena", "format": "N2" }

Vnořené funkce

Funkce lze vnořovat:

{ "expr": "ROUND(ABS(cena - sleva), 2)" }
{ "template": "{UPPER(LEFT(nazev, 3))}" }

Funkce v šablonách

V template, label, sumLabel lze použít funkce uvnitř {}:

{
  "template": "{LEFT(nazev, 20)} — {ROUND(cena * 1.21, 2):N2}",
  "label": "Skupina {LEFT(ucet, 3)}",
  "sumLabel": "Celkem za {UPPER(typ)}"
}

Funkce se vyhodnotí jako první krok, poté proběhne standardní formátování a coalesce.

Funkce v agregacích

Funkce uvnitř SUM() a dalších agregačních funkcí:

{ "expr": "SUM(ABS(castka))", "format": "N2" }
{ "expr": "SUM(ROUND(cena * 1.21, 2))", "format": "N2" }

14. Datumové funkce

Funkce pro práci s datumy. Vstupní datum se parsuje automaticky z formátů: yyyy-MM-dd, dd.MM.yyyy, yyyy-MM-ddTHH:mm:ss, ISO 8601.

Funkce Popis Příklad Výsledek
YEAR(pole) Rok jako číslo YEAR('2025-06-15') 2025
MONTH(pole) Měsíc jako číslo MONTH('2025-06-15') 6
DAY(pole) Den jako číslo DAY('2025-06-15') 15
DATEDIFF(pole1, pole2) Rozdíl ve dnech DATEDIFF('2025-06-20', '2025-06-15') 5
DATEADD(pole, n) Přičtení dnů DATEADD('2025-06-15', 10) 2025-06-25
NOW() Aktuální datum a čas NOW() 2026-03-26
TODAY() Dnešní datum TODAY() 2026-03-26
{ "expr": "YEAR(datum)", "format": "N0" }
{ "where": "DATEDIFF(splatnost, TODAY())>30" }
{ "template": "Splatnost: {DATEADD(datum, 14)}" }

NOW() a TODAY() nemají argumenty — závorky musí být prázdné.


15. Funkce v groupExpression

Funkce lze použít přímo v groupExpression pro dynamické seskupování:

{
  "groups": [{
    "groupExpression": "LEFT(ucet, 3)",
    "label": "Syntetika {LEFT(ucet,3)}",
    "headerMode": "external",
    "tableBreak": true
  }]
}

Jak to funguje

  1. GetGroupKey — při detekci ( ve výrazu se vyhodnotí přes výrazový engine místo čtení atributu
  2. Virtuální element — výsledek funkce se uloží jako atribut na virtuální group element (klíč = výraz bez mezer, např. LEFT(ucet,3))
  3. Label template{LEFT(ucet,3)} v labelu se resolvuje z virtuálního elementu

Příklady

"groupExpression": "LEFT(ucet, 3)"
"groupExpression": "YEAR(datum)"
"groupExpression": "UPPER(stredisko)"

Compound klíče: "groupExpression": ["LEFT(ucet, 3)", "obdobi"] — funkce + prosté pole.


16. Lookup tabulky

Přidání doplňkových dat ze samostatných XML elementů ke skupinám:

{
  "groups": [{
    "groupExpression": "organizace",
    "label": "{organizace} — {adresy.firma}",
    "lookup": { "element": "adresy" }
  }]
}

Jednoduchý lookup

"lookup": { "element": "adresy" }

Při změně skupiny se v elementu adresy dohledá řádek se shodným klíčem (default = groupExpression).

Řetězený lookup (chained)

"lookup": [
  { "element": "hlavicky_dokladu" },
  { "element": "adresy", "key": "organizace" }
]

Sekvenční dohledání: nejdřív hlavičku dokladu, z ní organizace, pak adresu.

Vlastnosti lookup

Vlastnost Popis
element Název XML elementu s lookup daty (povinný)
key Pole pro dohledání (default = groupExpression). Může být funkční výraz v {…}
foreignKey Pole v lookup tabulce pokud se jmenuje jinak než key

Funkční výraz v key

Pokud skupinový klíč je funkce (např. LEFT(ucet, 3)), lookup key musí být ve složených závorkách:

{
  "groupExpression": "LEFT(ucet, 3)",
  "lookup": {
    "element": "syn_ucty",
    "key": "{LEFT(ucet,3)}",
    "foreignKey": "syn"
  }
}

Přístup k lookup polím


17. Kde co funguje — přehledová tabulka

Tabulkové sestavy (renderer: "table")

Vlastnost {pole} {el.pole} :formát coalesce ternární AND/OR expr funkce
label na skupině
sumLabel
template na sloupci
label na sloupci
label na sekci
expr na sloupci
expr na sumExpr
groupExpression
visibleWhen lev.str.
where lev.str.
when (rowStyles) lev.str.
report.title
header.filter
watermark
footerRows.text
footerRows.label
footerRows.template

Dokumenty (renderer: "document")

Vlastnost {pole} {el.pole} :formát coalesce ternární
template v info-grid
lines v text-block
template na sloupci tabulky
total-amount.suffix
signature.left/right
visibleWhen

Štítky (renderer: "label")

Vlastnost {pole} {el.pole} :formát coalesce ternární
template na text bloku
field na text/barcode
format na barcode
visibleWhen
where na data

Pořadí vyhodnocování

Při renderování jedné buňky/hodnoty je pořadí zpracování:

  1. Alias substituce — nahrazení aliasů plnými cestami
  2. Placeholder resolvování{pole}, {el.pole}, coalesce, ternární výrazy
  3. Textový modifikátor — detekce a oddělení :UPPER/:LOWER/:PROPER
  4. Formátování — číslo (N2), datum (dd.MM.yyyy), maska (###.###), zkrácení (50)
  5. Aplikace modifikátoru — převod velikosti písmen na výsledný text
  6. hideZero kontrola — skrytí nulových hodnot (pokud aktivní)

Locale a regionální nastavení


Řešení problémů

Placeholder se nezobrazí

Podmínka nefunguje

Ternární výraz se špatně parsuje

Formát se neaplikuje