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.