Itgeneor329 foutmelding bij snelle query op TransactionLines

Bij het uitvoeren van de onderstaande query komt een foutmelding terug:

itgeneor329
A required filter is missing.

Query:

select 1 c 
from   TransactionLines 
where  linenumber = 0 
and    entrynumber >= 1 
and    entrynumber <= 2

Waarom treedt deze fout op?

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.