Real-time KPI dashboard qua verkooporders Exact Online

Voor een klant heb ik de volgende applicatiemodule gebruikt om een dashboard te maken dat honderden keren per dag vlot bijgewerkt kan worden (verversing duurt minder dan 10 seconden). Op dit dashboard staan:

  • aantal verkooporders vandaag
  • waarde verkooporders vandaag
  • aantal verkooporders week-to-date
  • waarde verkooporders week-to-date

Module:

declare
  l_json                varchar2;
  --
  -- Circumvent performance bug in Invantive UniversalSQL
  -- which does not consider trunc(sysdateutc) a constant.
  --
  l_start_date_today    datetime := trunc(sysdateutc);
  l_start_date_wtd      datetime := trunc(sysdateutc) - (to_number(to_char(sysdateutc, 'D')) - 1);
begin
  cloud_http.set_response_content_type('application/json');
  cloud_http.set_response_status_code(200);
  for r
  in
  ( select round(today.amountdc, 2)
           today_amountdc
    ,      today.cnt
           today_cnt
    ,      round(wtd.amountdc, 2)
           wtd_amountdc
    ,      wtd.cnt
           wtd_cnt
    from   ( select 'TODAY' category
             ,      sum(amountdc) amountdc
             ,      count(*) cnt
             from   exactonlinerest..salesorders@eol sor
             where  sor.orderdate >= l_start_date_today    
           ) today
    join   ( select 'WTD' category
             ,      sum(amountdc) amountdc
             ,      count(*) cnt
             from   exactonlinerest..salesorders@eol sor
             where  sor.orderdate >= l_start_date_wtd      
           ) wtd
  )
  loop    
    l_json :=    '{' || jsonelement("today_amountdc", r.today_amountdc, false)
              || ',' || jsonelement("today_cnt", r.today_cnt, false)
              || ',' || jsonelement("wtd_amountdc", r.wtd_amountdc, false)
              || ',' || jsonelement("wtd_cnt", r.wtd_cnt, false)
              || '}'
              ;
    cloud_http.append_to_response_body_text(l_json);
  end loop;
end;

De Power Query-code is:

let
    Bron = Json.Document(Web.Contents("https://app-online.cloud/apps/GUID/databases/acme-exact-online/modules/GUID/")),
    #"Geconverteerd naar tabel" = Table.FromRecords({Bron}),
    #"Type gewijzigd" = Table.TransformColumnTypes(#"Geconverteerd naar tabel",{{"today_amountdc", type number}, {"today_cnt", Int64.Type}, {"wtd_amountdc", Int64.Type}, {"wtd_cnt", Int64.Type}})
in
    #"Type gewijzigd"

Het zou fijn zijn als de workaround voor de performancebug niet meer nodig is (zie commentaar in PSQL).

Er zit inderdaad een performancebug in de evaluatie van de trunc(sysdateutc) qua performance.

Wel Server-side Filtering vanuit SQL

Voer de volgende queries uit:

select /*+ http_disk_cache(false) http_memory_cache(false) */ *
from   exactonlinerest..salesorders
where  orderdate >= trunc(sysdateutc)

select id
,      url
from   sessionios@datadictionary
order 
by     id desc
limit  1

met als resultaat:

https://start.exactonline.nl/api/v1/868043/salesorder/SalesOrders?$select=*&$filter=OrderDate%20ge%20datetime'2024-03-22T00:00:00'

Hierin wordt de datum doorgegeven als filter naar Exact Online.

Geen Server-side Filtering vanuit PSQL

Voer de volgende queries uit:

declare
  l_cnt number;
begin
  select /*+ http_disk_cache(false) http_memory_cache(false) */ count(*)
  into   l_cnt
  from   exactonlinerest..salesorders
  where  orderdate >= trunc(sysdateutc)
  ;
end;

select id
,      url
from   sessionios@datadictionary
order 
by     id desc
limit  1

met als resultaat:

https://start.exactonline.nl/api/v1/868043/salesorder/SalesOrders?$select=*&$filter=OrderID+ne+null

Hierbij wordt de datum niet doorgegeven als filter, hetgeen veel meer API-calls kan veroorzaken.

Deze vraag is automatisch gesloten na 2 weken inactiviteit. Het laatste gegeven antwoord is gemarkeerd als oplossing.

Gelieve een nieuwe vraag te stellen via een apart topic als het probleem opnieuw optreedt. Gelieve in de nieuwe vraag een link naar dit topic op te nemen door de URL er van in de tekst te plakken.