Bijwerken relatiecodes in Exact Online naar specifieke nieuwe relatiecodes

Bij gebruik van de querytool is het mogelijk om deze zonder cache te gebruiken op Exact Online.

Zo kan er een relatielijst worden opgevraagd met bijvoorbeeld de query:

select * 
from   ExactOnlineREST.CRM.Accounts

Nu wil ik de relatiecode wijzigen m.b.v. een conversietabel. Hoe krijg ik dit voor elkaar?

Voorbeeld:
In Exact Online heb ik bijvoorbeeld 3 relaties:

Code Naam
1 Relatie A
2 Relatie B
3 Relatie C

Als ik mijn relatiecodes met 10 zou willen verhogen zou ik de volgende query gebruiken:

update ExactOnlineREST.CRM.Accounts
set code = to_number(code)+10

het resultaat is dan:

Code Naam
11 Relatie A
12 Relatie B
13 Relatie C

Nu wil ik een conversie tabel gebruiken waarbij ik de relatie specifieke nummers wil kunnen toekennen, hoe doe ik dat?

Het volgende script is een voorbeeld om relatiecodes in Exact Online massaal bij te werken. Maak altijd VOORAF een backup en test het uitgebreid op een kopie vooraf.

Looptijd is circa 300 ms per bijgewerkte relatie in Exact Online.

local remark Source file in some arbitrary CSV format.
local remark In this case: human company number, old number, name, some audit, new number.

local define CSV_FILE "c:\temp\omnummeringtabel.csv"

--
-- Create a table mapping old account numbers of an
-- Exact Online company to a new (non-used) account number.
--
create or replace table mapping@inmemorystorage
as
select sdn.code division_code
,      csv.*
from   read_file_text('${CSV_FILE}')@Os rft
join   csvtable
       ( passing rft.file_contents
         column delimiter ';' 
         columns adm_nummer       integer  position 1
         ,       oud_nummer       varchar2 position 2
         ,       naam             varchar2 position 3
         ,       datum_aangemaakt datetime position 4
         ,       aangemaakt_door  varchar2 position 5
         ,       nieuw_nummer     varchar2 position 6
       )
       csv
join   systemdivisions sdn
on     sdn.hid = csv.adm_nummer

begin
  --
  -- Select all companies which have an account to be remapped.
  --
  use select distinct division_code from mapping@inmemorystorage;
  --
  -- One-by-one update the accounts.
  --
  -- Precondition: the new numbers are not in use as an old number.
  --
  for r in
  ( select *
    from   MAPPING@InMemoryStorage mpg
    order
    by     mpg.division_code
    ,      mpg.oud_nummer
  )
  loop
    update ExactOnlineREST..Accounts
    set    code     = to_char(r.nieuw_nummer)
    where  code     = to_char(r.oud_nummer)
    and    division = r.division_code
    ;
    if sqlrowcount = 0
    then
      raise_application_error
      ( -20163
      , 'Could not update account from ' 
        || to_char(r.oud_nummer) 
        || ' to ' 
        || to_char(r.nieuw_nummer) 
        || ' in division ' 
        || to_char(r.division_code) 
        || ' because the old number does not exist.'
      );
    end if;
  end loop;
end;
1 Like