Massaal bijwerken relatiecodes in Exact Online naar specifieke nieuwe relatiecodes

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 ';' 
         skip   lines 0 /* There is no header row. Change to 1 when there is a header row. */
         columns adm_nummer       integer  position 1 /* Use "next" instead of 1,2,3 on v20.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
    and    r.nieuw_nummer != r.oud_nummer
    ;
    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;

Een bijpassend CSV-bestand ziet er als volgt uit:

199;300005912;;;;400005912
199;300005911;;;;400005911

waarbij in de eerste kolom het administratienummer staat zoals linksboven in Exact Online getoond wordt. De divisioncode wordt er automatisch bijgezocht door de join op SystemDivisions.

Een bijpassend CSV-bestand met kopregel ziet er als volgt uit:

adm_nummer;oud_nummer;;;;nieuw_nummer
199;300005912;;;;400005912
199;300005911;;;;400005911

Een CSV-bestand met kopregel werkt alleen als de skip lines 0 in skip lines 1 veranderd wordt: de CSV-kopregel voor het omnummeren moet overgeslagen worden.

1 like