Filtrování záznamů

Jaké jsou možnosti filtrace přes REST API?

Petr Pech avatar
Autor: Petr Pech
Aktualizováno před více než týdnem

Záznamy v ABRA Flexi je možné filtrovat. Hodnoty ve filtrech mohou být buď přímo – podporované typy proměnných, identifikátory záznamů nebo zástupné (např. now() či me()).

Seznam podporovaných atributů a jejich hodnoty (dle typu) lze získat u každé evidence v seznamu políček.

Podporované operátory:

Operátor

Název

Popis

Ukázka

= nebo == nebo eq

Rovnost

Operátor se rovná hodnotě

a = 1

<> nebo != nebo ne nebo neq

Nerovnost

Operátor se nerovná hodnotě

a != 1

< nebo lt

Menší

a < 1

<= nebo lte

Menší nebo rovno

a <= 1

> nebo gt

Větší

a > 1

>= nebo gte

Větší nebo rovno

a >= 1

like

Obsahuje

Záznam obsahuje řetězec

a like 'inStr'

like similar

Obsahuje bez ohledu na háčky a čárky

Záznam obsahuje řetězec bez ohledu na háčky a čárky

a like similar 'inStr'

between

Je v rozsahu

vek between 18 100

begins

Začíná na

a begins 'Win'

begins similar

Začíná na bez ohledu na háčky a čárky

a begins similar 'Win'

ends

Končí na

a ends 'Strom'

in

Je prvkem výčtu

a in (1, 2, 3)

in subtree

Patří do podstromu

(viz níže)

in subtree 1

is true/false

Porovnání logických hodnot

a is true

is [not] null

Je (není) vyplněno

a is null

is [not] empty

Je (není) prázdné

není vyplněno nebo je nula/false/prázdný řetězec

a is not empty

Operátory ze skupiny similar fungují správně pouze na ABRA Flexi s databází PostgreSQL 9.0 nebo novější. Se starší verzí databáze tyto operátory háčky a čárky rozlišují, či-li chovají se stejně jako operátory bez klíčového slova similar.

Operátor

Název

Popis

Ukázka

and

Logický operátor and

Umožňuje kombinovat podmínky

a = 1 and b = 1

or

Logický operátor or

Umožňuje kombinovat podmínky

a = 1 or b = 1

not

Logický operátor not

Negace podmínky

not a = 1

( )

Závorky

(a = 1 or b = 1) and (c = 2)

Operátory mají obvyklou prioritu: základní operátory v první tabulce nejvyšší, pak not, and a nejnižší prioritu má operátor or. Pokud si nejste jistí, použijte závorky.

Není podporována varianta, která složí is not null or ... například:

/faktura-vydana/(typDokl.typDoklK not like 'typDokladu.dobropis')

Je nutné použít tuto variantu, která vrací požadovaný výsledek:

/faktura-vydana/(not(typDokl.typDoklK eq 'typDokladu.dobropis'))

Proměnná

Název

Popis

Ukázka

now()

Aktuální datum a čas

Umožňuje zobrazovat záznamy s ohledem na aktuální datum.

datSplat < now()

currentYear()

Aktuální rok

Umožňuje zobrazovat záznamy s ohledem na aktuální rok.

platiDo <= currentYear()

me()

Jméno přihlášeného uživatele

Umožňuje zobrazovat záznamy s ohledem na aktuálně přihlášeného uživatele.

uzivatel = me()

Filtry musí být v URL správně zakódovány. Při ruční tvorbě filtru jej stačí napsat nezakódovaný v prohlížeči Firefox. Když jej pak zkopírujete do schránky, Firefox jej překóduje.

Zápis hodnot

Ve výrazech jako a = 1 lze zadat čísla, textové řetězce, logické hodnoty, datum a datum+čas. Kromě toho lze použít funkce uvedené v tabulce výše.

Čísla mohou být celá, -1 nebo 10, a desetinná, 5.8 nebo -10.0.

Textové řetězce mohou být uvedeny v uvozovkách, "abc", nebo apostrofech, 'abc'.

Logické hodnoty jsou pouze true a false.

Datum se zadává ve tvaru YYYY-MM-DD, např. 2011-11-01, datum a čas ve tvaru YYYY-MM-DD'T'HH:MM:SS[.sss], např. 2011-11-01T12:30:00. Nejsou povoleny všechny způsoby zápisu podle ISO 8601, pouze tyto dva (resp. tři) zde uvedené.

Když se uvádí vazba na objekt, lze použít libovolný identifikátor. Interní ID se zapisují jako čísla (firma = 1), ostatní identifikátory jako řetězce (firma = 'code:ABC').

Filtrace podle vnořených hodnot

Některé atributy, podle kterých se filtruje, jsou ve skutečnosti vazby. Např. vydané faktury lze filtrovat podle odběratele takto:

firma = 'code:FIRMA'

V případě těchto vazeb lze tečkovou notací filtrovat i podle jejich atributů; např. lze filtrovat vydané faktury podle skupiny odběratele:

firma.skupFir = 'code:ODBĚRATEL-STANDARD'

Hloubka zanoření není omezena.

Pozor: z technických důvodů nelze používat negativní operátory (např. <>). V takovém případě dostanete chybové hlášení OR logical subselect filter not supported.

Filtrace podle štítků

Kromě atributů lze stejným způsobem filtrovat i podle štítků (pokud jsou štítky v dané evidenci podporovány). Např. pokud chcete vyhledat všechny ceníkové položky se štítkem VIP, bude filtr:

stitky='code:VIP'

a celé URL pak

/c/firma/cenik/(stitky='code:VIP').xml

Nebo pokud chcete všechny se štítky VIP nebo DULEZITE, použijete:

stitky='code:VIP' or stitky='code:DULEZITE'

resp.

/c/firma/cenik/(stitky='code:VIP' or stitky='code:DULEZITE').xml

Stejně lze použít i operátor and.

Filtrace podle příslušnosti do podstromu

Položky ceníku jsou řazeny do stromové struktury (je možné, že v budoucnu půjde do stromové struktury řadit i v jiných evidencích) a podle tohoto zařazení lze také filtrovat. Uvažujme tento strom ceníku:

Strom ceníku

  • Připojené položky (id = 2)

    • Kategorie 1 (id = 3)

      • Kategorie 1.1 (id = 4)

      • Kategorie 1.2 (id = 5)

        • Kategorie 1.2.1 (id = 6)

    • Kategorie 2 (id = 7)

      • Kategorie 2.1 (id = 8)

      • Kategorie 2.2 (id = 9)

Nepřipojené položky (virtuální uzel, pod kterým se v aplikaci zobrazují položky, které do stromu nejsou zařazeny; v něm filtrovat nelze)

Takto se strom zobrazuje v aplikaci, ovšem pro účely stromové kategorizace položek považujeme za kořen až Připojené položky. Uvedená ID jsou jen ilustrační; pokud pracujete se stromem přes REST API, je doporučeno použít externí identifikátory.

Nad ceníkem (/c/firma/cenik) lze zapsat filtr pro získání všech položek z Kategorie 1 a všech podkategorií (tedy z uzlů Kategorie 1, Kategorie 1.1, Kategorie 1.2 a Kategorie 1.2.1) takto:

in subtree 3

což je vlastně zkrácený zápis pro

id in subtree 3

Celé URL by vypadalo takto:

/c/firma/cenik/(in subtree 3)

Pokud je potřeba získat položky jen z daného uzlu a ne z celého podstromu, lze použít modifikátor nonrecursive; např. pro získání položek jen z Kategorie 2, ale ne už z Kategorie 2.1 a Kategorie 2.2, lze psát

in subtree 7 nonrecursive /c/firma/cenik/(in subtree 7 nonrecursive)

Výše bylo uvedeno, že zápis in subtree 3 je zkratkou pro id in subtree 3, což je důležité ve chvíli, kdy je potřeba podle zařazení ceníku do podstromu filtrovat jiné evidence. Lze např. vyfiltrovat všechny skladové karty pro ceníkové položky z určitého podstromu, takto:

cenik in subtree 3 /c/firma/skladova-karta/(cenik in subtree 3)

Filtrace přes relační vlastnosti

Filtr dovoluje libovolnou hloubku zanoření s výjimkou vlastností, které nemají jednoznačnou evidenci. Jinými slovy, filtrovat lze pouze v případě relace 1:1.

/udalost/(zakazka.mistUrc.mesto = 'Praha')

V případě potřeby filtrovat v položkách dokladu, je nutné filtorvat přímo v evidenci položek:

 /faktura-vydana-polozka/(doklFak=123 and cenik ="code:AUTO")

Výchozí filtr platnosti

Všechny evidence, které mají properties platiOd a platiDo, jsou ve výchozím stavu filtrovány podle aktuálního účetního období. Pokud máme např. u některého z ceníků nastavené platiDo na hodnotu 2020, tak se tento ceník nezobrazí v evidenci cenik, pokud je aktuální účetní období 2021. Toto chování lze potlačit pomocí parametru filtrovat-platnost nastaveného na hodnotu false.

Následující příklad ukazuje, jak lze v aktuálním účetním období získat ceníky platné do roku 2020.

/c/firma/cenik/(platiDo = 2020).xml?filtrovat-platnost=false
Dostali jste odpověď na svou otázku?