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.
{pole}{element.pole}{pole:formát}{pole1|pole2|'literál'}:UPPER, :LOWER, :PROPER###.###{pole:50}{podmínka?ano:ne}visibleWhen, where, when)expr)SUM, AVG, ...){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.
label a sumLabel na skupináchtemplate na sloupcíchtitle, filter, company v metadatech sestavytext, label, value, signatureLeft, signatureRight ve footerRowstemplate v info-grid položkách (dokumenty)lines v text-block (dokumenty)watermark v metadatech{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
| 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 → a → b → atribut pole |
{lookup.pole} |
Pole z lookup tabulky (pokud je registrovaná) |
Navigace je case-insensitive — {Header.Mena} i {header.mena} fungují stejně.
element odpovídá registrovanému lookup aliasuResolveElementByPathDůležité: Pokud je
elementregistrovaný 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.
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.
{pole:formát}Za dvojtečkou lze uvést formátovací řetězec:
{ "label": "Datum: {datum:dd.MM.yyyy}", "template": "Celkem: {castka:N2}" }
| 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 % |
| 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 |
Viz sekce 7.
Viz sekce 8.
{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'}.
:UPPER, :LOWER, :PROPERTransformace 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).
###.###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í.
{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.
{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ý}"
}
{podmínka?text_true:text_false}
Podmínka používá stejné operátory jako visibleWhen (viz sekce 10).
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ů.
Čí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 naXmlException. Oprava v 1.1.8 přidalaIsValidXmlNameguard.
{…} 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}" }
{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.
template na sloupcíchlabel a sumLabel na skupináchsumLabel na sumRowsformat na barcode blocích (štítky): "{ean=true?EAN13:Code128}"expr v sumExpressions: "osnova.ap=A?SUM(md)-SUM(d):SUM(d)-SUM(md)""color": "{stav='storno'?red:#000}"visibleWhen, where, when)Logické podmínky pro řízení viditelnosti, filtrování a stylová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" |
NOTNegace 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 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.
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.
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:
ANDuvnitřBETWEENse neparsuje jako logický operátor —castka BETWEEN 1000 AND 5000 AND stav='A'funguje správně (poslední AND je logický).
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.
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.
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.
Test "pole" (neprázdné) a "!pole" (prázdné) považuje za nulové:
"""0", "0,00", "0.00", "0,0000" (různé formáty nuly)| 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ů |
where s placeholderyPodmí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.
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" }
}
}
| 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 -.
Číselné konstanty lze použít přímo ve výrazech: "cena * 1.21", "pocet * 0.5".
Cross-element přístup funguje i v expr:
{ "expr": "cena * header.kurz" }
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 }
running){
"zustatek": {
"label": "Zůstatek",
"expr": "prijem - vydaj",
"running": true,
"runningInitial": "{prnobj.pz}",
"resetAt": "ucet",
"format": "N2"
}
}
running: true — sloupec zobrazuje kumulativní součetrunningInitial — počáteční hodnota (default 0). Číslo ("5987") nebo {element.field} placeholderresetAt: "skupina" — reset při změně dané skupiny (resetuje na runningInitial nebo 0)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" }
]
}
| 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)" |
Agregační funkce lze kombinovat aritmeticky:
{ "expr": "SUM(md) - SUM(d)" }
{ "expr": "SUM(castka) / COUNT()" }
{ "expr": "SUM(cena * pocet)" }
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.
exprPodmí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ě).
Výrazový engine podporuje volání funkcí ve výrazech (expr), v šablonách (template, label, sumLabel) a v podmínkách (levá strana).
| 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" }
| 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.
| 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" }
Funkce lze vnořovat:
{ "expr": "ROUND(ABS(cena - sleva), 2)" }
{ "template": "{UPPER(LEFT(nazev, 3))}" }
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 uvnitř SUM() a dalších agregačních funkcí:
{ "expr": "SUM(ABS(castka))", "format": "N2" }
{ "expr": "SUM(ROUND(cena * 1.21, 2))", "format": "N2" }
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é.
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
}]
}
( ve výrazu se vyhodnotí přes výrazový engine místo čtení atributuLEFT(ucet,3)){LEFT(ucet,3)} v labelu se resolvuje z virtuálního elementu"groupExpression": "LEFT(ucet, 3)"
"groupExpression": "YEAR(datum)"
"groupExpression": "UPPER(stredisko)"
Compound klíče: "groupExpression": ["LEFT(ucet, 3)", "obdobi"] — funkce + prosté pole.
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" }
}]
}
"lookup": { "element": "adresy" }
Při změně skupiny se v elementu adresy dohledá řádek se shodným klíčem (default = groupExpression).
"lookup": [
{ "element": "hlavicky_dokladu" },
{ "element": "adresy", "key": "organizace" }
]
Sekvenční dohledání: nejdřív hlavičku dokladu, z ní organizace, pak adresu.
| 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 |
keyPokud 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"
}
}
{LEFT(ucet,3)} se vyhodnotí per řádek přes výrazový engine → výsledek (např. "343") se použije jako klíč pro dohledání v lookup tabulceforeignKey musí být zadán explicitně — nezdědí se z funkčního výrazukey není zadán a groupExpression obsahuje funkci, auto-key se obalí {…} automaticky{firma}, {den:dd.MM.yyyy}{adresy.firma}"expr": "cena * hlavicky.kurz"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 |
✅ | ✅ | ✅ | ✅ | ✅ | — | — | ✅ |
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 |
— | ✅ | — | — | — |
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 |
✅ | — | — | — | — |
Při renderování jedné buňky/hodnoty je pořadí zpracování:
{pole}, {el.pole}, coalesce, ternární výrazy
'text' → textpole='hodnota'?, :, |) se neparsují jako operátory:UPPER/:LOWER/:PROPERreport.culture (default "cs-CZ")N2 → 1 234,50 (cs-CZ) nebo 1,234.50 (en-US)MMMM → březen (cs-CZ) nebo March (en-US)>, <) je flexibilní — akceptuje , i . jako oddělovač<header firma="Test" />{header.firma} (ne {header/firma})"debug": true) se nezobrazí [MISSING: field] žlutěAND a OR musí být oddělené mezerami: stav=A AND castka>0IN vyžaduje závorky: typ IN (A, B) (ne typ IN A, B)LIKE vyžaduje apostrofy kolem vzoru: nazev LIKE 'Fakt%' (ne nazev LIKE Fakt%)BETWEEN vyžaduje AND mezi hranicemi: castka BETWEEN 1000 AND 5000NOT vyžaduje závorky u složených podmínek: NOT (typ='A' AND stav='B')castka>1000stav='aktivni'LEN(text)>5 — závorky kolem funkce se nesmí zaměnit se závorkami podmínky{stav=A?'Ano: platí':'Ne: neplatí'}{ok?'Hotovo?':'Čeká'}{a='1'?'X':b='2'?'Y':'Z'}:UPPER) musí být poslední: {pole:N2:UPPER} (ne {pole:UPPER:N2})###.### funguje jen na textové hodnoty, ne na čísla s formátem N2