Massaal inlezen medewerkers uit ENK Software als Exact Online medewerkers

ENK Software is een systeem voor projectenadministratie. Soms is het nodig om gegevens uit ENK Software eenmalig in te lezen als medewerkers in Exact Online, bijvoorbeeld om daar de projectadministratie te gaan voeren, inclusief urenregistratie.

Een script bestaande uit een beperkt aantal stappen kan gebruikt worden om grote spreadsheets met honderden of duizenden medewerkers uit de ENK Swoftare projectenadministratie in enkele seconden in te lezen in Exact Online.

De eerste stap is het openen en opslaan van het Excel-spreadsheet van *.xls-formaat als *.xlsx-formaat.

Verander daarna de naam van het werkblad met personeelsgegevens in “Personeel”.

Daarna wordt een tabel in het werkgeheugen gemaakt met alle medewerkersgegevens uit de projectenadministratie:

--
-- Transform standard ENK Software spreadsheet with employees and rates into
-- a temporary table.
--
create or replace table EnkEmployees@InMemoryStorage
as
select xlsx.*
from   exceltable
       ( worksheet 'Personeel'
         passing file 'PAD\Personeel Urenregistratie (ENK).xlsx'
         skip empty rows
         skip first 1 rows
         columns Personeelscode            int      not null position next
         ,       Achternaam                varchar2 not null position next
         ,       RecordStatus              varchar2 not null position next
         ,       voornamen                 varchar2     null position next
         ,       Batchnr                   varchar2     null position next
         ,       Sofinummer                varchar2 position next
         ,       GebDatum                  date     position next
         ,       DatumInDienst             date     position next
         ,       IDnr                      varchar2 position next
         ,       IDGeldigTot               varchar2 position next
         ,       VreemdelingenDoc          varchar2 position next
         ,       VreemdelingDocGeldigtot   date     position next
         ,       Personeel_Nationaliteiten varchar2 position next
         ,       E101                      varchar2 position next
         ,       E101geldigtot             date     position next
         ,       Opmerkingen               varchar2 position next
         ,       opmerkingline             varchar2 position next
         ,       Omschrijving              varchar2 position next
         ,       Bedrijf                   varchar2 position next
         ,       Dag                       decimal  position next
         ,       cAvond                    decimal  position next
         ,       cZaAvond                  decimal  position next
         ,       cZoAvond                  decimal  position next
         ,       Nacht                     decimal  position next
         ,       Overtime100               decimal  position next
         ,       Overtime150               decimal  position next
         ,       Overtime200               decimal  position next
         ,       Reisuren                  decimal  position next
         ) xlsx

In de volgende stap worden de medewerkers gegevens uit de projectenadministratie van ENK Software omgezet in het gewenste formaat van de XML upload (vervang 123123 door de divisiecode van de Exact Online doeladministratie):

create or replace table xmlupload@inmemorystorage
as
select 'Employees' topic
,      123123 division
,      'Voorbeeld ENK Software' filename
,      xmlformat
       ( '<?xml version="1.0" encoding="utf-8"?>'
         || '<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-XML.xsd">'
         || '<Employees>'
         || xml
         || '</Employees>'
         || '</eExact>'
       ) filecontents
from   ( select listagg
                ( '<Employee EmployeeHID="' || Personeelscode || '" gender="O">'
                  || xmlelement('Code', Personeelscode)
                  || xmlelement('StartDate', to_char(DatumInDienst, 'YYYY-MM-DD'), false)
                  || '<BusinessPhone />'
                  || '<BusinessPhoneExt />'
                  || '<BusinessFax />'
                  || '<BusinessEmail />'
                  || '<BusinessMobile />'
                  || '<LocationDescription />'
                  || '<PartnerPhone />'
                  || xmlelement('HID', Personeelscode)
                  || xmlelement('LastName', regexp_replace(Achternaam, ',.*', ''), false)
                  || '<MiddleName />'
                  || xmlelement('BirthName', regexp_replace(Achternaam, ',.*', ''), false)
                  || '<BirthNamePrefix />'
                  || xmlelement('PartnerName', null, false)
                  || '<PartnerNamePrefix />'
                  || xmlelement('FirstName', voornamen, false)
                  || '<Initials />'
                  || xmlelement('FullName', Achternaam, false)
                  || '<Title>'
                  || xmlelement('Language', null, false)
                  || xmlelement('Gender', null, false)
                  || '</Title>'
                  || '<Language code="NL" />'
                  || '<Nationality code="' || Personeel_Nationaliteiten || '"/>'
                  || xmlelement('Phone', null, false)
                  || xmlelement('PhoneExt', null, false)
                  || xmlelement('Mobile', null, false)
                  || xmlelement('Email', null, false)
                  || xmlelement('SocialSecurityNumber', Sofinummer, false)
                  || xmlelement('NameComposition', 1, false)
                  || xmlelement('NickName', null, false)
                  || xmlelement('gender', 'O', false)
                  || xmlelement('JobTitleDescription', null, false)
                  || xmlelement('BirthDate', to_char(GebDatum, 'YYYY-MM-DD'), false)
                  || xmlelement('MaritalStatus', null, false)
                  || xmlelement('MaritalDate', null, false)
                  || xmlelement('BirthPlace', null, false)
                  || xmlelement('Municipality', null, false)
                  || xmlelement('BankAccounts', null, false)
                  || '<IsAnonymised>0</IsAnonymised>'
                  || '</Employee>'
                , ''
                ) xml
         from   EnkEmployees@InMemoryStorage
       )

Vervolgens worden de gegevens aangeboden aan Exact Online, netjes opgeknipt in kleine brokjes van circa 25.000 tekens:

--
-- Load into Exact Online. Errors are logged in UploadXMLTopicFragments.
--
insert into UploadXMLTopics
( topic
, payload
, division_code
, orig_system_reference
, fragment_payload_flag
, fragment_max_size_characters
, fail_on_error
)
select topic
,      filecontents
,      division
,      filename
--
-- Try to split into pieces of 25 KB at most.
--
,      true fragment_payload_flag
,      25000 fragment_max_size_characters 
,      true fail_on_error
from   xmlupload@inmemorystorage
order 
by     division
,      filename

De laatste stap is om de uploadresultaten nog te controleren vanuit de uploadmodule en vanuit de administratie op Exact Online:

--
-- Check everything was loaded correctly in Exact Online.
-- There may be NO row with success = false.
--
select *
from   UploadXMLTopicFragments

select /*+ http_disk_cache(false) http_memory_cache(false) */ *
from   ExactOnlineXML..employees