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) možno získať pri každej evidencii v zozname polí.

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 správajú sa 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ávorky

(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. Ak si nie ste istí, použite závorky.

Nie je podporovaná varianta, ktorá skladá is not null or ... napríklad:

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

Je nutné použiť túto variantu, ktorá vracia požadovaný výsledok:

/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čnom vytváraní filtra stačí napísať ho 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 možno zadať čísla, textové reťazce, logické hodnoty, dátum a dátum+čas. Okrem toho možno 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, možno 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 možno filtrovať podľa odberateľa takto:

firma = 'code:FIRMA'

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

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

Hĺbka zanorenia nie je obmedzená.

Pozor: z technických dôvodov nie je možné používať negatívne operátory (napr. <>). V takom prípade dostanete chybové hlásenie OR logical subselect filter not supported.

Filtrácia podľa štítkov

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

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 možno použiť aj operátor and.

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

Položky cenníka sú radené do stromovej štruktúry (je možné, že v budúcnosti pôjde do stromovej štruktúry radiť aj v iných evidenciách) a podľa tohto zaradenia možno 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é nie sú zaradené do stromu; v ňom filtrovať nemožno)

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) možno zapísať filter na 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 vyzeralo takto:

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

Ak je potrebné získať položky iba z daného uzla a nie z celého podstromu, možno použiť modifikátor nonrecursive; napr. na získanie položiek iba z Kategórie 2, ale nie z Kategórie 2.1 a Kategórie 2.2, možno 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é v momente, keď je potrebné filtrovať iné evidencie podľa zaradenia cenníka do podstromu. Možno 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 umožňuje ľubovoľnú hĺbku zanorenia s výnimkou vlastností, ktoré nemajú jednoznačnú evidenciu. Inými slovami, filtrovať možno 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. pri niektorom 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 možno potlačiť pomocou parametra filtrovat-platnost nastaveného na hodnotu false.

Nasledujúci príklad ukazuje, ako možno 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)

Pozn.: Je nutné použiť interné ID.

Ste s tem dobili odgovor na svoje vprašanje?