Invantive Cloud - SQL Editor HTTP 504 fout

Het uitlezen van de ExactOnlineREST.Purchase.PurchaseInvoiceLines endpoint via de SQL Editor op Invantive Cloud resulteert in een HTTP 504 fout:

HTTP 504

Query:

select *
from   ExactOnlineREST.Purchase.PurchaseInvoiceLines

Hetzelfde deed zich voor bij een beperktere query:

select item
from   ExactOnlineREST.Purchase.PurchaseInvoiceLines

Het doel van de query is een export van deze volledige endpoint in Excel.

Hoe kunnen we rond deze fout werken?

Als alternatief zou het ophalen van de data in beperkte hoeveelheid een optie zijn gezien we over de invoiceid's beschikken. Hierbij loop ik tegen volgende aan:

select *
from   ExactOnlineREST.Purchase.PurchaseInvoiceLines
where invoiceid = 'b01b14....' 

=> Dit levert de detaillijnen voor de desbetreffende invoice op

select *
from   ExactOnlineREST.Purchase.PurchaseInvoiceLines
where  (invoiceid = 'b01b14...') OR ( invoiceid = 'b747e3...')

=> Dit levert 0 detaillijnen op

select *
from   ExactOnlineREST.Purchase.PurchaseInvoiceLines
where invoiceid IN ( 'b01b14...', 'b747e3...')

=> Dit levert eveneens 0 detaillijnen op

Kan er een OR / IN voorwaarde meegegeven worden in een Invantive SQL statement om de endpoint te filteren?

De HTTP 504 foutmelding komt doordat de query op Invantive Cloud langer dan 3 minuten duurt. HTTP 504 staat voor “Gateway Timeout”. In een toekomstige versie zal hiervoor een meer correcte foutmelding getoond worden.

Deze limiet is aanwezig door gebruik van een aantal securitycomponenten die niet vervangen kunnen worden.

Queries die langer duren dan 3 minuten worden niet ondersteund op Invantive Cloud. Als alternatief kan gebruik gemaakt worden van bijvoorbeeld Invantive App Online, Invantive Bridge Online, Invantive Query Tool of Get My Report. Daarnaast kan het verstandig zijn om de query te optimaliseren.

De reden dat geen rijen terugkomen is een bug in de 20.2.5 versie van Invantive SQL bij het impliciet converteren van datatype van tekst naar het datatype GUID van de kolom InvoiceID (kenmerk ITGEN-5527).

Advies is om niet te vertrouwen op de impliciete datatype conversie, maar die zelf uit te voeren. De query ziet er dan zo uit:

select *
from   purchaseinvoicelines 
where  invoiceid 
       in 
       ( to_guid('61fd7eff-e0d4-4830-be0d-cf6539b15473')
       , to_guid('ba6d990a-14cd-48d3-b4c4-17d2de550f79')
       )

De impliciete conversie van datatype is verbeterd in de release 20.2.7 die op Invantive Cloud live is gegaan. De volgende query levert dan dezelfde rijen op als met een to_guid:

select *
from   purchaseinvoicelines 
where  invoiceid = '71fd7eff-e0d4-4830-be0d-cf6539b15473'
       or 
       invoiceid = 'ba6d990a-14cd-48d3-b4c4-17d2de550f79'

Een dergelijke OR wordt automatisch herschreven naar de meer efficiente IN:

select *
from   purchaseinvoicelines 
where  invoiceid
       in
       ( '71fd7eff-e0d4-4830-be0d-cf6539b15473'
       , 'ba6d990a-14cd-48d3-b4c4-17d2de550f79'
       )

Bij het zelf schrijven van de query raden we daarom een IN aan.