Preskoči na glavno vsebino

Filtrovanie záznamov

Aké sú možnosti filtrovania cez REST API?

Avtor: Petr Pech

Záznamy v ABRA Flexi je možné filtrovať. Hodnoty vo filtroch môžu byť buď priamo – podporované typy premenných, identifikátory záznamov alebo zástupné (napr. now() či me()).

Zoznam podporovaných atribútov a ich hodnoty (podľa typu) je možné získať pri každej evidencii v zozname políčok.

Podporované operátory

Operátor

Názov

Popis

Ukážka

= alebo == alebo eq

Rovnosť

Operátor sa rovná hodnote

a = 1

<> alebo != alebo ne alebo neq

Nerovnosť

Operátor sa nerovná hodnote

a != 1

< alebo lt

Menší

a < 1

<= alebo lte

Menší alebo rovný

a <= 1

> alebo gt

Väčší

a > 1

>= alebo gte

Väčší alebo rovný

a >= 1

like

Obsahuje

Záznam obsahuje reťazec

a like 'inStr'

like similar

Obsahuje bez ohľadu na diakritiku

Záznam obsahuje reťazec bez ohľadu na diakritiku

a like similar 'inStr'

between

Je v rozsahu

vek between 18 100

begins

Začína na

a begins 'Win'

begins similar

Začína na bez ohľadu na diakritiku

a begins similar 'Win'

ends

Končí na

a ends 'Strom'

in

Je prvkom výčtu

a in (1, 2, 3)

in subtree

Patrí do podstromu

(pozri nižšie)

in subtree 1

is true/false

Porovnanie logických hodnôt

a is true

is [not] null

Je (nie je) vyplnené

a is null

is [not] empty

Je (nie je) prázdne

nie je vyplnené alebo je nula/false/prázdny reťazec

a is not empty

📝 Operátory zo skupiny similar fungujú správne iba na ABRA Flexi s databázou PostgreSQL 9.0 alebo novšou. So staršou verziou databázy tieto operátory diakritiku rozlišujú, čiže sa správajú rovnako ako operátory bez kľúčového slova similar.

Operátor

Názov

Popis

Ukážka

and

Logický operátor and

Umožňuje kombinovať podmienky

a = 1 and b = 1

or

Logický operátor or

Umožňuje kombinovať podmienky

a = 1 or b = 1

not

Logický operátor not

Negácia podmienky

not a = 1

( )

Zátvorky

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

Operátory majú obvyklú prioritu: základné operátory v prvej tabuľke najvyššiu, potom not, and a najnižšiu prioritu má operátor or. Pokiaľ si nie ste istí, použite zátvorky.

ℹ️ Negáciu je možné zapísať dvoma spôsobmi a oba vracajú rovnaký výsledok — buď negatívnym operátorom, alebo obalením podmienky do not(...):

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

Premenná

Názov

Popis

Ukážka

now()

Aktuálny dátum a čas

Umožňuje zobrazovať záznamy s ohľadom na aktuálny dátum.

datSplat < now()

currentYear()

Aktuálny rok

Umožňuje zobrazovať záznamy s ohľadom na aktuálny rok.

platiDo <= currentYear()

me()

Meno prihláseného používateľa

Umožňuje zobrazovať záznamy s ohľadom na aktuálne prihláseného používateľa.

uzivatel = me()

Filtre musia byť v URL správne zakódované. Pri ručnej tvorbe filtra ho stačí napísať nezakódovaný v prehliadači Firefox. Keď ho potom skopírujete do schránky, Firefox ho prekóduje.

Zápis hodnôt

Vo výrazoch ako a = 1 je možné zadať čísla, textové reťazce, logické hodnoty, dátum a dátum+čas. Okrem toho je možné použiť funkcie uvedené v tabuľke vyššie.

Čísla môžu byť celé, -1 alebo 10, a desatinné, 5.8 alebo -10.0.

Textové reťazce môžu byť uvedené v úvodzovkách, "abc", alebo apostrofoch, 'abc'.

Logické hodnoty sú iba true a false.

Dátum sa zadáva v tvare YYYY-MM-DD, napr. 2011-11-01, dátum a čas v tvare YYYY-MM-DD'T'HH:MM:SS[.sss], napr. 2011-11-01T12:30:00. Nie sú povolené všetky spôsoby zápisu podľa ISO 8601, iba tieto dva (resp. tri) tu uvedené.

Keď sa uvádza väzba na objekt, je možné použiť ľubovoľný identifikátor. Interné ID sa zapisujú ako čísla (firma = 1), ostatné identifikátory ako reťazce (firma = 'code:ABC').

Filtrácia podľa vnorených hodnôt

Niektoré atribúty, podľa ktorých sa filtruje, sú v skutočnosti väzby. Napr. vydané faktúry je možné filtrovať podľa odberateľa takto:

firma = 'code:FIRMA'

V prípade týchto väzieb je možné bodkovou notáciou filtrovať aj podľa ich atribútov; napr. je možné filtrovať vydané faktúry podľa skupiny odberateľa:

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

Hĺbka zanorenia nie je obmedzená.

⚠️ Negatívne operátory (napr. <>, !=) pri vnorených hodnotách je možné použiť, ale majú jedno obmedzenie: filtru vyhovejú iba záznamy, ktoré majú väzobnú vlastnosť vyplnenú. Napríklad pri filtri /faktura-vydana/(typDokl.radaPrijem.kod!='FAKTURA-STANDARD') je rad nepovinný — vyberú sa teda záznamy, ktoré rad vyplnený majú, ale hodnota kódu sa líši.

Filtrácia podľa štítkov

Okrem atribútov je možné rovnakým spôsobom filtrovať aj podľa štítkov (pokiaľ sú štítky v danej evidencii podporované). Napr. ak chcete vyhľadať všetky cenníkové položky so štítkom VIP, bude filter:

stitky='code:VIP'

a celá URL potom

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

Alebo ak chcete všetky so štítkami VIP alebo DULEZITE, použijete:

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

resp.

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

Rovnako je možné použiť aj operátor and.

Filtrácia podľa príslušnosti do podstromu

Položky cenníka sú zaradené do stromovej štruktúry (je možné, že v budúcnosti pôjde do stromovej štruktúry zaraďovať aj v iných evidenciách) a podľa tohto zaradenia je možné aj filtrovať. Uvažujme tento strom cenníka:

Strom cenníka

  • Pripojené položky (id = 2)

    • Kategória 1 (id = 3)

      • Kategória 1.1 (id = 4)

      • Kategória 1.2 (id = 5)

        • Kategória 1.2.1 (id = 6)

    • Kategória 2 (id = 7)

      • Kategória 2.1 (id = 8)

      • Kategória 2.2 (id = 9)

Nepripojené položky (virtuálny uzol, pod ktorým sa v aplikácii zobrazujú položky, ktoré do stromu nie sú zaradené; v ňom filtrovať nie je možné)

Takto sa strom zobrazuje v aplikácii, avšak na účely stromovej kategorizácie položiek považujeme za koreň až Pripojené položky. Uvedené ID sú len ilustračné; ak pracujete so stromom cez REST API, odporúča sa použiť externé identifikátory.

Nad cenníkom (/c/firma/cenik) je možné zapísať filter pre získanie všetkých položiek z Kategórie 1 a všetkých podkategórií (teda z uzlov Kategória 1, Kategória 1.1, Kategória 1.2 a Kategória 1.2.1) takto:

in subtree 3

čo je vlastne skrátený zápis pre

id in subtree 3

Celá URL by vyzerala takto:

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

Ak je potrebné získať položky len z daného uzla a nie z celého podstromu, je možné použiť modifikátor nonrecursive; napr. pre získanie položiek len z Kategórie 2, ale nie už z Kategórie 2.1 a Kategórie 2.2, je možné písať

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

Vyššie bolo uvedené, že zápis in subtree 3 je skratkou pre id in subtree 3, čo je dôležité vo chvíli, keď je potrebné podľa zaradenia cenníka do podstromu filtrovať iné evidencie. Je možné napr. vyfiltrovať všetky skladové karty pre cenníkové položky z určitého podstromu, takto:

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

Filtrácia cez relačné vlastnosti

Filter dovoľuje ľubovoľnú hĺbku zanorenia s výnimkou vlastností, ktoré nemajú jednoznačnú evidenciu. Inými slovami, filtrovať je možné iba v prípade relácie 1:1.

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

V prípade potreby filtrovať v položkách dokladu je nutné filtrovať priamo v evidencii položiek:

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


Predvolený filter platnosti

Všetky evidencie, ktoré majú properties platiOd a platiDo, sú v predvolenom stave filtrované podľa aktuálneho účtovného obdobia. Ak máme napr. u niektorého z cenníkov nastavené platiDo na hodnotu 2020, tak sa tento cenník nezobrazí v evidencii cenik, ak je aktuálne účtovné obdobie 2021. Toto správanie je možné potlačiť pomocou parametra filtrovat-platnost nastaveného na hodnotu false.

Nasledujúci príklad ukazuje, ako je možné v aktuálnom účtovnom období získať cenníky platné do roku 2020.

/c/firma/cenik/(platiDo = 2020).xml?filtrovat-platnost=false


Používateľské filtre

Na uloženie filtra slúži evidencia Používateľské filtre. Na vytvorenie filtra je potrebné pracovať s poľami evidencie /filtr.

Ukážka vytvorenia filtra s vybranou hodnotou štítku:

<winstrom version="1.0">
<filtr>
<nazev>Stitky filtr</nazev>
<kod>stitky</kod>
<beanKey>cz.winstrom.vo.cen.Cenik</beanKey>
<obsahFiltru>((stitky = 3))</obsahFiltru>
</filtr>
</winstrom>

Ukážka filtrácie evidencie s použitím uloženého filtra:

/c/firma/cenik/(filter:2)

ℹ️ Pri uloženom filtri je nutné použiť interné ID.

Ste s tem dobili odgovor na svoje vprašanje?