OData Filter Referentie
De Ultimo REST API ondersteunt OData versie 4 query opties voor het filteren, sorteren, selecteren en pagineren van data. Dit artikel beschrijft alle beschikbare operators, functies en query opties met concrete voorbeelden per use case.
Beschikbaarheid: Professional, Premium, Enterprise
Query opties overzichtbewerken
| Optie | Beschrijving | Voorbeeld |
|---|---|---|
$filter |
Filter resultaten op voorwaarden | $filter=Status eq 2 |
$select |
Selecteer specifieke properties | $select=Id,Description |
$expand |
Voeg gerelateerde entiteiten toe | $expand=Department |
$orderby |
Sorteer resultaten | $orderby=Description asc |
$top |
Beperk aantal resultaten | $top=10 |
$skip |
Sla records over | $skip=20 |
$count |
Voeg totaal aantal toe aan response | $count=true |
$filter - Vergelijkingsoperatorenbewerken
| Operator | Beschrijving | Voorbeeld |
|---|---|---|
eq |
Gelijk aan | $filter=Status eq 2 |
ne |
Niet gelijk aan | $filter=Status ne 0 |
gt |
Groter dan | $filter=Id gt '100' |
ge |
Groter dan of gelijk aan | $filter=Id ge '100' |
lt |
Kleiner dan | $filter=Id lt '200' |
le |
Kleiner dan of gelijk aan | $filter=Id le '200' |
like |
Patroon match | $filter=Description like '%pomp%' |
in |
In een lijst van waarden | $filter=Status in (1, 2, 3) |
like operatorbewerken
De like operator ondersteunt twee wildcards:
%-- nul of meer willekeurige tekens_-- precies een willekeurig teken
$filter=Description like '%pomp%' # Bevat "pomp"
$filter=Description like 'Koel%' # Begint met "Koel"
$filter=Description like '%installatie' # Eindigt met "installatie"
$filter=Id like '000__' # Id begint met "000" gevolgd door 2 tekens
in operatorbewerken
Filter op meerdere waarden tegelijk:
$filter=Status in (1, 2, 3)
$filter=Department/Id in ('01', '02', '03')
De in-operator heeft een praktische limiet van circa 100 waarden per filter. Voor grotere sets split de query in meerdere calls of gebruik een range-filter (Id ge 'X' and Id lt 'Y').
$filter - Logische operatorenbewerken
| Operator | Beschrijving | Voorbeeld |
|---|---|---|
and |
Logische EN | $filter=Status eq 2 and Context eq 1 |
or |
Logische OF | $filter=Status eq 2 or Status eq 3 |
not |
Logische NIET | $filter=not (Status eq 0) |
() |
Groepering | $filter=(Status eq 2 or Status eq 3) and Context eq 1 |
Gecombineerde filtersbewerken
# Actieve equipment van afdeling 01
$filter=Status eq 2 and Department/Id eq '01'
# Jobs met status 1 of 2, van context Technical Service
$filter=(Status eq 1 or Status eq 2) and Context eq 1
# Equipment die NIET inactief is
$filter=not (Status eq 0)
Ondersteunde datatypesbewerken
| Datatype | Voorbeeld filter |
|---|---|
Null |
$filter=Description eq null |
Boolean |
$filter=IsActive eq true |
Integer |
$filter=Status eq 2 |
Decimal |
$filter=Amount gt 100.50 |
String |
$filter=Id eq '00001' |
Date |
$filter=InstallDate eq 2022-04-07 |
DateTimeOffset |
$filter=ModifiedOn gt 2025-01-01T00:00:00Z |
TimeOfDay |
$filter=StartTime ge 08:00:00 |
Let op: Stringwaarden moeten tussen enkele aanhalingstekens staan. Numerieke waarden en datums niet.
Filteren op relatiesbewerken
Filter op gerelateerde entiteiten door /Id toe te voegen aan het attribuutpad:
# Equipment van afdeling 01
$filter=Department/Id eq '01'
# Jobs voor een specifiek equipment
$filter=Equipment/Id eq '00001'
# Equipment op een specifieke locatie
$filter=Site/Id eq 'HOOFD'
$select - Properties selecterenbewerken
Beperk de response tot specifieke properties:
GET .../object/Equipment?$select=Id,Description,Status
# Response bevat alleen:
# { "Id": "00001", "Description": "Koelinstallatie", "Status": 2 }
Meerdere properties scheiden met komma's:
$select=Id,Description,Status,InstallDate,Department
$select op relatie-properties vereist $expandbewerken
Een veelvoorkomende valkuil: om een property van een gerelateerde entiteit te selecteren (bijv. ProcessFunction/Id) moet die relatie eerst worden geëxpandeerd. Alleen $select met het slash-pad geeft een syntax-error.
# Werkt NIET — geeft SelectSyntaxError:
$select=Id,ProcessFunction/Id
# Werkt WEL:
$expand=ProcessFunction&$select=Id,ProcessFunction/Id
Dit is efficiënt voor grote analyses: de response bevat dan alleen de parent-ID zonder het volledige relatie-object.
$expand - Gerelateerde entiteitenbewerken
Voeg gerelateerde entiteiten toe aan de response. Maximaal 3 niveaus diep.
Basis expandbewerken
GET .../object/Equipment?$expand=Department,CostCenter
Geneste expandbewerken
GET .../object/Equipment?$expand=Department($expand=Site)
Expand met selectbewerken
GET .../object/Equipment?$expand=Department($select=Id,Description)
Expand met filterbewerken
GET .../object/Department('01')?$expand=Jobs($filter=Status eq 1)
$orderby - Sorterenbewerken
Sorteer resultaten oplopend (asc) of aflopend (desc):
# Oplopend op beschrijving (standaard)
$orderby=Description asc
# Aflopend op aanmaakdatum
$orderby=CreatedOn desc
# Meervoudige sortering
$orderby=Department asc,Description asc
$top en $skip - Pagineringbewerken
$top - Beperk resultatenbewerken
# Eerste 10 records
$top=10
$skip - Offsetbewerken
# Sla de eerste 20 records over
$skip=20
Combinatie voor pagineringbewerken
# Pagina 1 (records 1-25)
$top=25&$skip=0
# Pagina 2 (records 26-50)
$top=25&$skip=25
# Pagina 3 (records 51-75)
$top=25&$skip=50
Aanbeveling: Gebruik bij voorkeur de
nextPageLinkuit de server response in plaats van handmatige paginering met$topen$skip.
Praktische $top-limietbewerken
Voor entiteiten met beperkt aantal velden en met $select actief kan $top=1000 in één request slagen zonder nextPageLink. Voor zwaardere queries (veel $expand, grote payloads) legt de server eerder een lagere pagina-limiet op, ook als $top=1000 wordt meegegeven. Detecteer dit aan de aanwezigheid van nextPageLink in de response en volg die altijd.
Valkuil: handmatige keyset-paginatie op string-IDsbewerken
Een alternatief voor $skip is keyset-paginatie op het ID-veld:
# Eerste batch
$filter=Id ge ''&$orderby=Id asc&$top=100
# Volgende batch
$filter=Id gt '<laatste Id uit vorige batch>'&$orderby=Id asc&$top=100
Dit werkt correct voor numerieke IDs en voor strikt-alfabetische IDs met vaste lengte. Voor alfanumerieke IDs met variabele lengte kan dit records missen. Voorbeeld:
Id = '08LEID1' — string-vergelijking: '08LEID1' < '08LEID10'
Id = '08LEID10' — alfabetisch na '08LEID1', maar '08LEID2' zit daartussen
Als de eerste batch eindigt op 08LEID9 en de volgende start met Id gt '08LEID9', worden 08LEID10 tot 08LEID99 overgeslagen omdat ze lexicografisch vóór 08LEID9 komen. Altijd nextPageLink gebruiken; die hanteert server-side de correcte sortering.
$top - Beperk resultatenbewerken
# Eerste 10 records
$top=10
$skip - Offsetbewerken
# Sla de eerste 20 records over
$skip=20
Combinatie voor pagineringbewerken
# Pagina 1 (records 1-25)
$top=25&$skip=0
# Pagina 2 (records 26-50)
$top=25&$skip=25
# Pagina 3 (records 51-75)
$top=25&$skip=50
Aanbeveling: Gebruik bij voorkeur de
nextPageLinkuit de server response in plaats van handmatige paginering met$topen$skip.
$count - Totaal aantalbewerken
Voeg het totaal aantal records toe aan de response:
GET .../object/Equipment?$count=true
# Response bevat:
# { "count": 1542, "items": [...] }
Combineer met filters:
GET .../object/Equipment?$filter=Status eq 2&$count=true
Count-only pattern (efficiënt tellen)bewerken
Voor dashboards en KPI's heb je vaak alleen het aantal records nodig, niet de records zelf. De combinatie $top=0&$count=true geeft alleen de count terug zonder data:
GET .../object/Job?$filter=Status in (1, 2, 4)&$top=0&$count=true
# Response:
# { "count": 894, "items": [] }
Dit is significant goedkoper dan records ophalen en lokaal tellen, vooral bij grote datasets. Gebruik dit patroon voor alle aantallen-in-een-widget.
Voorbeelden per use casebewerken
Equipment managementbewerken
# Alle actieve equipment ophalen
GET .../object/Equipment?$filter=Status eq 2&$select=Id,Description,EquipmentType
# Equipment met vervallen onderhoudsdatum
GET .../object/Equipment?$filter=NextPmMaintenanceDate lt 2025-04-01&$orderby=NextPmMaintenanceDate asc
# Equipment zoeken op beschrijving
GET .../object/Equipment?$filter=Description like '%koeling%'
# Equipment per afdeling met type-informatie
GET .../object/Equipment?$filter=Department/Id eq '01'&$expand=EquipmentType($select=Id,Description)
Job managementbewerken
# Open jobs (status 1 = nieuw, 2 = in behandeling)
GET .../object/Job?$filter=Status in (1, 2)&$orderby=CreatedOn desc
# Jobs voor een specifiek equipment
GET .../object/Job?$filter=Equipment/Id eq '00001'&$select=Id,Description,Status
# Jobs aangemaakt in de afgelopen week
GET .../object/Job?$filter=CreatedOn ge 2025-03-28&$top=50
# Afgemelde jobs met equipment details
GET .../object/Job?$filter=Status eq 3&$expand=Equipment($select=Id,Description)
# Achterstallige jobs (TargetDate-valkuil: sluit null expliciet uit)
GET .../object/Job?$filter=Status in (1, 2, 4) and TargetDate lt 2026-04-23T00:00:00Z and TargetDate ne null
TargetDate-valkuil: niet elke open job heeft een
TargetDate. Zonderand TargetDate ne nullkunnen records zonder streefdatum — afhankelijk van de null-sort-order — onterecht als achterstallig worden geteld of juist worden gemist. Voeg altijdne nulltoe bij overdue-filters om het filter robuust te maken. Dezelfde regel geldt voor andere datumvelden (ScheduledStartDate,ScheduledFinishDate) bij vergelijkbare queries.
Artikelen en voorraadbewerken
# Alle actieve artikelen
GET .../object/Article?$filter=Status eq 2&$select=Id,Description,StockLevel
# Artikelen met voorraad onder minimum
GET .../object/Article?$filter=StockLevel lt MinimumStockLevel
# Artikelen van een specifieke leverancier
GET .../object/Article?$filter=Vendor/Id eq 'LEV001'
Medewerkers en afdelingenbewerken
# Alle medewerkers van een afdeling
GET .../object/Employee?$filter=Department/Id eq '01'&$select=Id,Name,Email
# Alle afdelingen met hun medewerkers
GET .../object/Department?$expand=Employees($select=Id,Name)
# Zoek medewerker op naam
GET .../object/Employee?$filter=Name like '%Janssen%'
Speciale tekens in filtersbewerken
Aanhalingstekensbewerken
Enkele aanhalingstekens in stringwaarden moeten verdubbeld worden:
$filter=Description eq 'O''Brien'
URL encodingbewerken
Bepaalde tekens vereisen URL encoding:
| Teken | Encoded |
|---|---|
| Spatie | %20 of + |
< |
%3C |
> |
%3E |
% |
%25 |
& |
%26 |
" |
%22 |
Forward slashes in IDsbewerken
Forward slashes werken niet in ID-paden maar wel in filters:
# Werkt NIET:
GET .../object/Building('01/02')
# Werkt WEL:
GET .../object/Building?$filter=Id eq '01/02'
Combinatievoorbeeldenbewerken
Complexe querybewerken
GET .../object/Equipment
?$filter=Status eq 2 and Department/Id eq '01' and InstallDate ge 2020-01-01
&$select=Id,Description,InstallDate,SerialNumber
&$expand=Department($select=Description)
&$orderby=InstallDate desc
&$top=25
&$count=true
Paginering met filtering en sorteringbewerken
# Eerste pagina
GET .../object/Job?$filter=Status eq 1&$orderby=CreatedOn desc&$top=50&$skip=0&$count=true
# Volgende pagina (gebruik bij voorkeur nextPageLink)
GET .../object/Job?$filter=Status eq 1&$orderby=CreatedOn desc&$top=50&$skip=50
Beperkingenbewerken
$expandwerkt tot maximaal 3 niveaus diep- Niet alle properties zijn filterbaar -- raadpleeg de Swagger documentatie van de API key
- De
likeoperator is Ultimo-specifiek en geen standaard OData operator - Server-side paginering kan het aantal resultaten per pagina beperken, ongeacht
$top $selectop relatie-properties (bijv.ProcessFunction/Id) vereist expliciete$expandvan die relatie- Handmatige keyset-paginatie op alfanumerieke string-IDs kan records missen — gebruik
nextPageLink - De
in-operator heeft een praktische limiet van circa 100 waarden per filter - Overdue-filters op datumvelden moeten expliciet
ne nulltoevoegen om records zonder datum correct te behandelen
Gerelateerde artikelenbewerken
- rest-api -- REST API documentatie
- api-keys -- API keys configuratie
- hierarchische-scoping -- Hiërarchische scope bepalen via boom-aggregatie (ProcessFunction, Equipment)
Brondatabewerken
Dit artikel is consultant-synthese. Voor ground-truth data over specifieke Ultimo-objecten gebruik de onderstaande tools.
- Entiteit-data —
lookup_entity("<Name>")·lookup_table_schema("<Name>")Alle properties, DB-kolomnamen, triggers en computed columns. Bronnen:Entities.xml,database-schema.json. - Workflows per entiteit —
find_workflows("", entity="<Name>")Alle Before/After Save events en andere ActionFields voor een entiteit. Bron:workflows.xml. - Schermen —
lookup_screen("<ScreenName>")· Schermen index Schermdefinities incl. tabel, autorisatielevel, screen-level. Bron:ultimo_screens_names.xml. - AET-settings / feature toggles —
find_aet_settings(query)· AET index Feature toggles en systeem-configuratie. Bron:ApplicationElementTreeData.json. - Kennisbank-breed zoeken —
search(query)Doorzoekt alle wiki-artikelen, entities, workflows, schermen, templates en ActionFields tegelijk.