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