Welke API calls heeft Invantive UniversalSQL daadwerkelijk uitgevoerd?

Go to English version

Invantive UniversalSQL vertaalt SQL select-statements naar dataverzoeken naar het achterliggende platform. Ook insert, update en delete statements worden vertaald naar dataverzoeken.

De dataverzoeken vinden plaats in een “native” formaat dat afhankelijk is van de mogelijkheden van het achterliggende platform. Een groot aantal optimalisaties - deels afhankelijk van de mogelijkheden van het platform - worden toegepast voordat de uitvoering van de statement(s) begint.

Naast de hieronder beschreven opties is het ook op veel omgevingen mogelijk om native call logging in te schakelen; zie hiervoor Collect Native Platform Call Data.

PostgreSQL native SQL met where clause

Een query met een where clause met een veldnaam en een constante voor PostgreSQL wordt omgezet in een query volgens PostgreSQL standaarden. De where clause wordt hierin waar mogelijk verwerkt zodat de query zo snel mogelijk verwerkt kan worden en zo weinig mogelijk gegevens transporteert.

Visma net API calls

Een query over meerdere administraties op Visma net wordt vertaald in meerdere API calls naar Visma net (een per administratie). De uitvoering hiervan vindt vaak parallel plaats.

Exact Online XML en REST

Een query met een join tussen een Exact Online XML API en een Exact Online REST API gebeurt voor de XML API op basis van XMLDownload.aspx en voor de Exact Online REST API op basis van REST met bijvoorbeeld een $filter= in de URL.

Analyse met sessionios@datadictionary

Je kunt uiteraard met Invantive Trace de executie volgen, maar dat is erg gedetailleerd. Via de data dictionary view sessionios ben je meestal al goed geholpen als je alleen geinteresseerd bent in de daadwerkelijke dataverzoeken. Dit laat ik aan de hand van een voorbeeld zien.

De API calls van Invantive UniversalSQL kun je als volgt bepalen:

  • Start een Invantive UniversalSQL product zoals Invantive Query Tool.
  • Kies de connector voor Simplicate als voorbeeld en vul de aanmeldgegevens in:
    image
  • Voer een query uit op de uren in Simplicate:
select *
from   hours /* Simplicate hours API */
  • Voer nog een query uit op de uren in Simplicate, maar geef nu een filter op datum door:
select *
from   hours /* Simplicate hours API met filter */
where  start_date >= '2020-10'
  • Terzijde: merk op dat specifiek de Simplicate API bij de uren de datum als een tekst behandelt. Mocht je start_date gebruiken in een vergelijking met een datum zoals trunc(sysdate) dan haal je waarschijnlijk eerst alle rijen op waarna Invantive UniversalSQL lokaal de gegevens filtert. Dat is vele malen trager.
  • Voer tenslotte een query uit om te achterhalen welke API calls Invantive UniversalSQL daadwerkelijk heeft uitgevoerd:
select *
from   sessionios@datadictionary
order
by     id
  • Het eindresultaat laat zien dat bij de eerste query geen filter doorgegeven is naar de Simplicate API server, maar bij de tweede wel:
  • Als je deze resultaten wilt exporteren naar een bestand, gebruik dan de Export knop.
  • Je kunt ook vanuit een script een export maken met:
local export results as "c:\temp\ios.xlsx" format xlsx include technical headers
  • De gemakkelijkste manier om zo’n export statement samen te stellen is om in de query editor een rechtsklik te doen en dan via Scripting, Data transfer, Export results een sjabloon voor het exportstatement te laten toevoegen aan de query editor.

Een luxe versie van het exporteren van de lijst van API calls is het gebruik met een variabele bestandsnaam met daarin bijvoorbeeld de tijd. Dat kan met:

local define OUT_PATH "${system:userdocumentsdirectory}\${database:connection}"

select *
from   SESSIONIOS@DataDictionary

local create directory "${OUT_PATH}"

local export results as "${OUT_PATH}\sessionios.xlsx" format xlsx include technical headers

Wil je de bestandsnaam van de API call dump helemaal flexibel hebben, gebruik dan een stukje SQL met Invantive Script:

select to_char(sysdateutc, 'YYYYMM') folder
,      to_char(sysdateutc, 'YYYYMMDDHH24MISS') fileprefix

local define OUT_PATH "${system:userdocumentsdirectory}\${database:connection}\${outcome:0,0}"

local define FILE_PREFIX "${outcome:0,1}"

select *
from   SESSIONIOS@DataDictionary

local create directory "${OUT_PATH}"

local export results as "${OUT_PATH}\${FILE_PREFIX}sessionios.xlsx" format xlsx include technical headers