Versnellen rapport voorraadanalyse Exact Online

De volgende query op een Exact Online Handel administratie duurt momenteel 131 seconden bij het real-time opbouwen en toont per batch de beschikbare hoeveelheid, de voorraadwaarde en de gemiddelde kostprijs volgens de Exact Online administratie van het artikel:

use all
;
create or replace view Voorraadanalyse_r
as
select bnr.batchnumber nummer
,      itm.code itemcode
,      act.name leverancier
,      bnr.availablequantity
,      bnr.availablequantity * itm.averagecost voorwaardwaarde
,      bnr.Remarks
,      itm.averagecost
from   ExactOnlineREST.Inventory.BatchNumbers@eol bnr
join   ItemsIncremental@eol itm
on     itm.id = bnr.item
and    itm.IsStockItem = true
left
outer
join   GoodsReceiptLineBatchNumbers glr
on     glr.bnrbatchnumberid = bnr.id
left
outer
join   exactonlinerest..PurchaseOrderLines@eol pol
on     pol.Id = glr.PurchaseOrderLineID
left
outer
join   exactonlinerest..PurchaseOrders@eol por
on     por.PurchaseOrderID = pol.PurchaseOrderID
left
outer
join   AccountsIncremental@eol act
on     act.id = por.Supplier
where  bnr.Division = DIVISIECODE

Uiteindelijk wil de gebruiker bijvoorbeeld 4 maal per dag een actuele Power BI lijst van alle voorraden voor alle betrokken medewerkers.

Kan dit nog sneller gemaakt worden?

Door het gebruik van PurchaseOrderLinesIncremental kan de looptijd beperkt worden tot circa 72 seconden:

create or replace view Voorraadanalyse_r
as
select bnr.batchnumber nummer
,      itm.code itemcode
,      act.name leverancier
,      bnr.availablequantity
,      bnr.availablequantity * itm.averagecost voorwaardwaarde
,      bnr.Remarks
,      itm.averagecost
from   ExactOnlineREST.Inventory.BatchNumbers@eol bnr
join   ItemsIncremental@eol itm
on     itm.division = bnr.division
and    itm.id = bnr.item
and    itm.IsStockItem = true
left
outer
join   GoodsReceiptLineBatchNumbers glr
on     glr.division         = bnr.division
and    glr.bnrbatchnumberid = bnr.id
left
outer
join   PurchaseOrderLinesIncremental@eol pol
on     pol.division   = glr.division
and    pol.Id         = glr.PurchaseOrderLineID
and    pol.LineNumber != 0
left
outer
join   PurchaseOrderLinesIncremental@eol por
on     por.division        = pol.division
and    por.PurchaseOrderID = pol.PurchaseOrderID
and    por.LineNumber      = 0
left
outer
join   AccountsIncremental@eol act
on     act.division = por.division
and    act.id       = por.Supplier
where  bnr.Division = GETAL

Al met al worden er dan nog 70 API calls op Exact Online uitgevoerd.

Een kleine besparing is het doorgeven van de Exact Online administratie vanaf bnr naar elke onderliggende tabel met de bijbehorende gedetailleerde informatie.

De query kan als view vastgelegd worden bij de database definitie indien deze real-time versie gebruikt moet worden voor een Power BI dashboard. Zie Eigen database-views gebruiken voor SQL en BI-tools voor hoe een view op Exact Online vastgelegd kan worden.

Voor real-time Exact Online voorraadcijfers in Power BI is het nodig om het cachegedrag ook juist in te stellen zoals beschreven in Differentieer OData4 cachegedrag met Power BI.

Het rapport heeft enige gelijkenis met het inkoopanalyse rapport uit Get My Report: Versnellen rapport voorraadanalyse Exact Online.

Er zit nog een fout in bovenstaande query. We houden namelijk geen rekening met aankoopretourorders. Dus op vandaag zitten artikels er soms dubbel in.
We moeten de aankoopretourorders eruit filteren.

Hoe kan ik de query wijzigen zodat de aankoopretourorders eruit worden gehaald?