Massaal aanpassen van Exact Online bestelregels

Bij verschillende toepassingen komt het voor dat bestelregels in Exact Online na het aanmaken aangepast moeten worden. Dit artikel illustreert een scenario en de beperkingen die momenteel gelden voor het aanpassen.

Aanpassen Kostenplaats

Een scenario is dat de kostenplaats van een bestelregel gelijk moet worden aan het nummer van de verkooporder waar de bestelling voor geplaatst is. Informatie over de artikelen, artikelen, de omschrijving, etc. moet hetzelfde blijven

De volgende SQL-query haalt uit Exact Online de regels van open verkooporders met de regels van bestellingen die er aan gekoppeld zijn:

set use-http-memory-cache false

create or replace table ple_soll@inmemorystorage
as
select to_char(sle.ordernumber) costcenter_soll
,      sle.ordernumber
       sle_ordernumber
,      por.ordernumber
       por_ordernumber
,      ple.costcenter
       ple_costcenter
,      ple.* prefix with 'ple_'
,      sle.* prefix with 'sle_'
from   exactonlinerest..salesorderlines sle
join   exactonlinerest..purchaseorderlines ple
on     ple.division = sle.division
and    ple.id       = sle.PurchaseOrderLine
and    coalesce(ple.costcenter, '###') != coalesce(to_char(sle.ordernumber), '###')
join   exactonlinerest..purchaseorders por
on     por.division        = ple.division
and    por.purchaseorderid = ple.PurchaseOrderID
--
-- Only consider incomplete sales orders for improved performance.
--
where  sle.orderstatus in (12,20)

De lijst kan ook gebruikt worden als een controlelijst: de uitvoer van de volgende query zal alleen regels van bestellingen in Exact Online laten zien waarvan de kostenplaats afwijkt van de gewenste kostenplaats op basis van de verkooporder:

select *
from   ple_soll@inmemorystorage

Deze lijst kun je exporteren via de knop “Exporteren” in bijvoorbeeld het Invantive Query Tool of met

local export results as "c:\temp\aan-te-passen.xlsx" format xlsx include technical headers

Massaal Wijzigen Bestelregels

Exact Online heeft op een aantal tabellen zoals offertes en verkopen geen mogelijkheid om die te wijzigen achteraf. Verwijderen en toevoegen kan wel. Voor bijvoorbeeld ecotaksen of bovengenoemde scenario kunnen daarom wel de gewenste nieuwe rijen toegevoegd worden en de oude verwijderd.

Dat gaat met code zoals:

declare
  l_ple_id_new guid;
begin
  for r in 
  ( select *
    from   PLE_SOLL@InMemoryStorage 
    order
    by     por_ordernumber
    ,      ple_linenumber
  )
  loop
    insert into exactonlinerest..purchaseorderlines
    ( AmountDC
    , AmountFC
    , CostCenter
    , CostUnit
    , Description
    , Discount
    , Division
    , Expense
    , InStock
    , Item
    , LineNumber
    , NetPrice
    , Notes
    , Project
    , PurchaseOrderID
    , Quantity
    , QuantityInPurchaseUnits
    , Rebill
    , ReceiptDate
    , ReceivedQuantity
    , Unit
    , UnitPrice
    , VATAmount
    , VATCode
    , VATDescription
    , VATPercentage
    )
    values
    ( r.ple_AmountDC
    , r.ple_AmountFC
    , r.costcenter_soll
    , r.ple_CostUnit
    , r.ple_Description
    , r.ple_Discount
    , r.ple_Division
    , r.ple_Expense
    , r.ple_InStock
    , r.ple_Item
    , r.ple_LineNumber
    , r.ple_NetPrice
    , r.ple_Notes
    , r.ple_Project
    , r.ple_PurchaseOrderID
    , r.ple_Quantity
    , r.ple_QuantityInPurchaseUnits
    , r.ple_Rebill
    , r.ple_ReceiptDate
    , r.ple_ReceivedQuantity
    , r.ple_Unit
    , r.ple_UnitPrice
    , r.ple_VATAmount
    , r.ple_VATCode
    , r.ple_VATDescription
    , r.ple_VATPercentage
    );
    delete
    from   exactonlinerest..purchaseorderlines
    where  division = r.ple_division
    and    id = r.ple_id
    ;
  end loop;
end;

Alle velden worden gekopieerd. Een risicofactor is dat Exact Online op de API’s geen transacties kent: er zal logica nodig zijn - al is het maar een werkinstructie voor de gebruiker - om indien Exact Online na het toevoegen maar voor het verwijderen vastloopt een correctie uit te voeren om dubbele bestellingen te vermijden.

Verdwenen Koppeling met Verkooporder

Echter, alle relaties die de oude bestelregel had verdwijnen door het verwijderen. Het insert-statement herstelt alle relaties zoals naar artikel, maar helaas gaat dit niet overal voor op: de koppeling tussen verkoopregel en inkoopregel vervalt.

Een poging om deze relatie te herstellen via:

update exactonlinerest..salesorderlines
set    PurchaseOrderLine = <<NEW PURCHASE LINE ID>>
where  division = r.sle_division
and    id = r.sle_id

leert dat de tabel met verkooporderregels geen mutatie toestaat via de Exact Online API’s op de relatie naar de nieuwe bestelregel.

In dit geval zal dus gekozen moeten worden voor handmatige invoer als de relatie behouden dient te blijven, of voor automatische toevoeging van het nummer van de verkooporder als men bereid is alle logistieke en rapportage consequenties van het vervallen van de relatie tussen die twee te accepteren.