De query is inderdaad efficient en zal vlot gewerkt hebben. De onderliggende foutmelding vanuit Exact Online is:
A GET request for this endpoint must have a $filter parameter with one of the following fields in the url:Account,AccountCode,Asset,CostCenter,CostUnit,Date,Description,Document,EntryID,EntryNumber,GLAccount,GLAccountCode,ID,InvoiceNumber,Item,JournalCode,Modified,OffsetID,OrderNumber,Project,ProjectCode,ShopOrder,Status,Subscription,Type,VATCode,VATType,YourRef.
Exact’s implementatie van mandatory filtering laat ruimte voor verbetering. Een vergelijkbaar probleem is Itgeneor335 Statement caused an error. A required filter is missing.
In deze query wordt netjes gefilterd op EntryNumber
en bovendien ook nog eens op LineNumber
.
De API aanroep is:
https://start.exactonline.nl/api/v1/102673/financialtransaction/TransactionLines?$select=*&$filter=EntryNumber ge 1 and LineNumber eq 0 and EntryNumber le 2
Echter, de implementatie aan zijde van de Exact Online servers herkent niet dat dit zelfs een betere query is dan de Exact Online API aanroep:
https://start.exactonline.nl/api/v1/102673/financialtransaction/TransactionLines?$select=*&$filter=EntryNumber ge 1 and EntryNumber le 2
In plaats daarvan wordt de API call afgekeurd. Het is te overwegen om hiervoor een bug report in te dienen.
Oplossingen
Optimizer Uitschakelen
Een pragmatische oplossing is om er voor te zorgen dat de optimizer van Invantive SQL het filter op LineNumber
niet meer meestuurt:
select 1 c
from transactionlines
where linenumber + 1 = 0 + 1
and entrynumber >= 1
and entrynumber <= 2
Merk echter op dat bij verbeteringen in de Invantive optimizer dit uiteindelijk toch weer kan leiden tot het geschetste probleem.
Het toevoegen van een filter zoals ID is not null
zal niet helpen; de Invantive Optimizer herschrijft dit naar true
omdat ID
een verplicht veld is. Om dezelfde reden zal een query zoals deze nooit een enkele API-call uitvoeren:
select 1 c
from TransactionLines
where ID is null
Overstap sync API’s
Een andere oplossing is om over te stappen op de tabel TransactionLinesIncremental
die gebaseerd is op de Sync API’s. Echter, nadeel hiervan is dat de prestaties vooral bij een grote omgeving serieus kunnen dalen hierdoor omdat de volledige dataset ontsleuteld, bijgewerkt en weer versleuteld moet worden. Voor SQL-queries die meer dan een paar procent van de rijen ophalen is dit echter wel efficiënt.
Wachten
Invantive zal haar SQL-driver voor Exact Online verbeteren om om dit soort problemen heen te werken. De werking van de Invantive Optimizer kan omzeild worden en daardoor kunnen API-calls uitgevoerd worden die anders nooit tot stand komen.