Efficient werken met GLClassifications voor rapportages over veel Exact Online administraties

Het lijkt er op dat de GLClassifications API wat beperkingen kent, doordat hij zowel administratie-specifieke gegevens bevat als systeembrede gegevens, en dat die systeembrede gegevens voor elke administratie weer opgelepeld worden.

Achterliggend ontwerpissue is dat de Exact Online API geen concept kent voor systeembrede API’s, net zoals er maar heel beperkt ondersteuning is voor API’s op abonnementsniveau.

Voordelen van Exact bulk API

Voor GLClassifications geldt dat de niet-bulk versie erg langzaam is als je alle gegevens ophaalt. Normaliter is een bulk-API pakweg 50% tot 100% sneller als je vijf administraties tegelijk opvraagt, maar hier is dat bijna 9x zo snel en dat zal qua serverload ook bij Exact meetbaar moeten zijn. De overstap naar GLClassificationsBulk is daarom zeker nuttig.

Echter, dit beperkt het datavolume niet. In de vervolgtekst zal ik ingaan op het beperken van het datavolume en uiteindelijk blijkt dat focus op het datavolume ook de snelheid nog significant verder zal verhogen.

Beperken datavolume

Volgens de documentatie zou je het GUID veld Type kunnen gebruiken om te filteren:

Division is optional. For taxonomies of Taxonomies.Type = 0 (general taxonomies), the Division is empty. For division specific taxonomies it is mandatory

maar zoals je zelf signaleert is Type altijd leeg. Dat is een code-bug of een documentatie-bug.

Je kunt dus niet sturen op de inhoud van Type om een onderscheid te maken tussen het systeembrede RGS-schema en de administratiespecifieke classificaties.

Echter, volgens de documentatie is er ook een kolom Division met een andere semantiek dan gangbaar. Deze waarde wordt door Exact Online alleen gevuld met de waarde van de divisie uit de URL als het gaat over een administratie-specifieke classificatie. De kolom Division geeft Exact Online tegenwoordig leeg terug als het gaat over een systeembrede classificatie zoals de verschillende RGS-classificaties.

Deze kolom is in de volgende BETA weer toegevoegd, maar dan met de naam SourceDivision omdat de waarde een andere betekenis heeft dan alle andere voorkomens van de kolom Division.

Op GLClassificationsBulk is een filter (where-clause) mogelijk op SourceDivision, maar dit filter kan niet doorgezet worden naar Exact Online API’s omdat het geen “server-side filterable” veld is: die is niet geimplementeerd door Exact.

Op de traditionele GLClassifications tabel kan hier ook op gefilterd worden, maar wordt het filter ook doorgestuurd. Dit duurt voor 1 Exact administratie circa 212 ms.

De metingen zijn ook uitgevoerd met 161 administraties:

use select code, 'eol' from systemdivisions@eol where status = 1

Het ophalen van de administratie-specifieke GLClassifications met:

select *
from   GLClassifications@eol
where  SourceDivision is not null

duurt 12 seconden voor 161 administraties.

Het ophalen via de bulk-API

select *
from   GLClassificationsBulk@eol

duurt 412 seconden voor 161 administraties.

Het advies is dus om in dit specifieke geval de niet-bulk API te gebruiken, dus GLClassifications met het genoemde filter op SourceDivision:

select *
from   GLClassifications@eol
where  SourceDivision is not null

Aanpassing door Exact

Een bericht kwam binnen dat Exact de zorgen ter harte heeft genomen en dat er mogelijk een aanpassing beschikbaar gaat komen waarbij de RGS-classificaties (zoals voorheen) niet meer meekomen in GLClassifications.