-- -- $Id$ -- -- Script containing customer specific db-configuration for SVRZ. DEFINE thisfile = 'HMOD.SQL' DEFINE dbuser = '^HMOD' SET ECHO ON SET DEFINE ON COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT; WHENEVER SQLERROR EXIT; SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL; WHENEVER SQLERROR CONTINUE; SPOOL &fcltlogfile SET DEFINE OFF ------ payload begin ------ CREATE OR REPLACE PROCEDURE hmod_import_koffer (p_import_key IN NUMBER) AS c_fielddelimitor VARCHAR2 (1) := ';'; v_newline VARCHAR2 (1000); -- Input line v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); header_is_valid NUMBER; v_count NUMBER; v_ongeldig NUMBER (1); v_mode NUMBER (1); v_aanduiding VARCHAR2 (200); -- v_all_null BOOLEAN; v_count_error NUMBER (10); v_count_tot NUMBER (10); v_count_import NUMBER (10); -- De importvelden: v_versiedatum VARCHAR2 (15); v_omschrijving VARCHAR2 (250); v_code VARCHAR2 (30); v_token VARCHAR2 (20); v_mob VARCHAR2 (20); v_hit VARCHAR2 (20); v_lap_en_sim VARCHAR2 (20); v_lapt VARCHAR2 (20); v_tnc VARCHAR2 (20); v_tnc_omschrijving VARCHAR2 (100); v_facilitor VARCHAR2 (20); v_adp VARCHAR2 (20); v_absentiemanager VARCHAR2 (20); v_regas VARCHAR2 (20); v_checks VARCHAR2 (20); v_accountview VARCHAR2 (20); v_elvy VARCHAR2 (20); v_hodnet VARCHAR2 (20); v_proactive VARCHAR2 (20); v_opmerking VARCHAR2 (1000); v_volgnr NUMBER (10); v_lettercode VARCHAR2 (30); CURSOR c IS SELECT * FROM fac_imp_file WHERE fac_import_key = p_import_key ORDER BY fac_imp_file_index; BEGIN -- Vorige inlees eerst verwijderen ---- Voor hmod_koffersysteem geldt dat je inlezen op dezelfde dag mag/kunt overschrijven. Voorgaande versiedatums blijven staan. DELETE FROM hmod_imp_koffersysteem WHERE versiedatum = TO_CHAR(TRUNC (SYSDATE),'DD-MM-YYYY'); COMMIT; header_is_valid := 0; v_ongeldig := 0; v_count_error := 0; header_is_valid := 0; v_count_tot := 0; v_count_import := 0; FOR rec IN c LOOP BEGIN v_newline := rec.fac_imp_file_line; v_errormsg := 'Fout opvragen te importeren rij'; v_aanduiding := ''; -- Lees alle veldwaarden: omschrijving;code;token;mob;hit;lap_en_sim;lapt;tnc;tnc omschrijving;facilitor;adp;absentiemanager;regas;checks;accountview;elvy;hodnet;proactive;opmerking v_errormsg := 'Fout opvragen te importeren kolom/rij 1'; fac.imp_getfield (v_newline, c_fielddelimitor, v_omschrijving); v_errormsg := 'Fout opvragen te importeren kolom/rij 2'; fac.imp_getfield (v_newline, c_fielddelimitor, v_code); fac.imp_getfield (v_newline, c_fielddelimitor, v_lettercode); fac.imp_getfield (v_newline, c_fielddelimitor, v_token); fac.imp_getfield (v_newline, c_fielddelimitor, v_mob); fac.imp_getfield (v_newline, c_fielddelimitor, v_hit); fac.imp_getfield (v_newline, c_fielddelimitor, v_lap_en_sim); fac.imp_getfield (v_newline, c_fielddelimitor, v_lapt); fac.imp_getfield (v_newline, c_fielddelimitor, v_tnc); fac.imp_getfield (v_newline, c_fielddelimitor, v_tnc_omschrijving); fac.imp_getfield (v_newline, c_fielddelimitor, v_facilitor); fac.imp_getfield (v_newline, c_fielddelimitor, v_adp); fac.imp_getfield (v_newline, c_fielddelimitor, v_absentiemanager); fac.imp_getfield (v_newline, c_fielddelimitor, v_regas); fac.imp_getfield (v_newline, c_fielddelimitor, v_checks); fac.imp_getfield (v_newline, c_fielddelimitor, v_accountview); fac.imp_getfield (v_newline, c_fielddelimitor, v_elvy); fac.imp_getfield (v_newline, c_fielddelimitor, v_hodnet); fac.imp_getfield (v_newline, c_fielddelimitor, v_proactive); fac.imp_getfield (v_newline, c_fielddelimitor, v_opmerking); v_aanduiding := v_versiedatum || '|' || v_omschrijving || '|' || v_code; v_count_tot := v_count_tot + 1; -- Skip until the header is found IF header_is_valid = 0 THEN IF v_omschrijving = 'omschrijving' AND v_code = 'code' AND v_lettercode = 'lettercode' AND v_token = 'token' AND v_mob = 'mob' AND v_hit = 'hit' AND v_lap_en_sim = 'lap_en_sim' AND v_lapt = 'lapt' AND v_tnc = 'tnc' AND v_tnc_omschrijving = 'tnc omschrijving' AND v_facilitor = 'facilitor' AND v_adp = 'adp' AND v_absentiemanager = 'absentiemanager' AND v_regas = 'regas' AND v_checks = 'checks' AND v_accountview = 'accountview' AND v_elvy = 'elvy' AND v_hodnet = 'hodnet' AND v_proactive = 'proactive' AND v_opmerking = 'opmerking' THEN header_is_valid := 1; END IF; ELSE -- Header OK. Vanaf hier in de LOOP eventueel variabele vullen. BEGIN v_errormsg := 'Versiedatum wordt sysdatum '; SELECT TO_CHAR (TRUNC (SYSDATE), 'DD-MM-YYYY') INTO v_versiedatum FROM DUAL; -- volgnr vullen - dit numerieke veld gebruiken we voor kenmerkdomein-key.. ---- dit zou ik ook kunnen vullen buiten de LOOP, toch? SELECT COALESCE (MAX (volgnr), 0) INTO v_volgnr FROM hmod_imp_koffersysteem; v_volgnr := v_volgnr + 1 ; END; INSERT INTO hmod_imp_koffersysteem (versiedatum, omschrijving, code, lettercode, token, mob, hit, lap_en_sim, lapt, tnc, tnc_omschrijving, facilitor, adp, absentiemanager, regas, checks, accountview, elvy, hodnet, proactive, volgnr, opmerking) VALUES (v_versiedatum, v_omschrijving, v_code, v_lettercode, v_token, v_mob, v_hit, v_lap_en_sim, v_lapt, v_tnc, v_tnc_omschrijving, v_facilitor, v_adp, v_absentiemanager, v_regas, v_checks, v_accountview, v_elvy, v_hodnet, v_proactive, v_volgnr, v_opmerking); END IF; END; END LOOP; IF header_is_valid = 0 THEN fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!'); ELSE -- Afsluiting: Rollback/Delete tabel als er fouten in csv zitten. Initieel voor import koffersysteem nog zonder foutcheck opgezet, dus ook geen v_ongeldig aan het vullen... IF v_ongeldig > 0 THEN ROLLBACK; -- Met rollback haalt hij ook al mijn errors en waarschuwingen weg!?? Daarom een DELETE -- delete from hmod_imp_contractscope where TRUNC (SYSDATE)) AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND p.prs_perslid_verwijder IS NULL AND p.prs_afdeling_key = v.prs_afdeling_key AND v.prs_bedrijf_key = 41 -- Personen binnen bedrijf Humanitas onder Dak AND p.prs_perslid_key NOT IN (721) -- M.u.v. perslid voor met nr '999001' (bestemd voor objecten nog uit te lenen...) UNION ALL SELECT p.prs_perslid_key, prs_perslid_naam || ' (' || prs_perslid_voornaam || ')' AS Naam_werknemer, sd.ins_srtdeel_omschrijving, dd.ins_deel_upper, d.ins_deel_key Key1, d.ins_deel_aanmaak, dd.ins_deel_key Key2, p.prs_perslid_telefoonnr, p.prs_perslid_mobiel FROM prs_perslid p, ins_deel d, ins_srtdeel sd, prs_v_aanwezigafdeling v, ins_kenmerkdeel kd, ins_deel dd WHERE p.prs_perslid_key = d.ins_alg_ruimte_key AND d.ins_srtdeel_key = 69 -- Mobieltelefoon AND d.ins_alg_ruimte_type = 'P' AND d.ins_deel_verwijder IS NULL AND d.ins_deel_actief = 1 AND ( d.ins_deel_vervaldatum IS NULL OR TRUNC (d.ins_deel_vervaldatum) > TRUNC (SYSDATE)) AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND p.prs_perslid_verwijder IS NULL AND p.prs_afdeling_key = v.prs_afdeling_key AND v.prs_bedrijf_key = 41 -- afdeling binnen bedrijf Humanitas.. AND p.prs_perslid_key NOT IN (721) -- perslid voor met nr '999001' voor objecten nog uit te lenen... AND d.ins_deel_key = kd.ins_deel_key AND kd.ins_kenmerk_key = 152 AND kd.ins_kenmerkdeel_verwijder IS NULL AND fac.safe_to_number (kd.ins_kenmerkdeel_waarde) = dd.ins_deel_key AND dd.ins_srtdeel_key = 341 -- SIM-kaarten en nummers AND dd.ins_deel_verwijder IS NULL AND dd.ins_deel_actief = 1 AND ( dd.ins_deel_vervaldatum IS NULL OR TRUNC (dd.ins_deel_vervaldatum) > TRUNC (SYSDATE)) ; CREATE OR REPLACE PROCEDURE hmod_prs_telefoonnummers ( p_applname IN VARCHAR2, p_applrun IN VARCHAR2 ) AS CURSOR c_vast IS SELECT PRS_PERSLID_KEY, PRS_NAAM, SOORT, NUMMER_OBJECT, INS_DEEL_KEY, INS_DEEL_AANMAAK, INS_DEEL_KEY2, VASTNR_HUIDIG, MOBIELNR_HUIDIG FROM HMOD_V_TELEFOONNR_KLANTOBJECT WHERE SOORT = 'Telefooncentralenummers' AND (VASTNR_HUIDIG<>NUMMER_OBJECT OR VASTNR_HUIDIG is null) ; CURSOR c_mob IS SELECT PRS_PERSLID_KEY, PRS_NAAM, SOORT, NUMMER_OBJECT, INS_DEEL_KEY, INS_DEEL_AANMAAK, INS_DEEL_KEY2, VASTNR_HUIDIG, MOBIELNR_HUIDIG FROM HMOD_V_TELEFOONNR_KLANTOBJECT WHERE SOORT = 'Mobieletelefoon' AND (MOBIELNR_HUIDIG<>NUMMER_OBJECT OR MOBIELNR_HUIDIG is null) ; CURSOR c_delvast IS SELECT p.prs_perslid_key, p.prs_perslid_telefoonnr FROM prs_perslid p WHERE p.prs_perslid_key not in (select v.prs_perslid_key from HMOD_V_TELEFOONNR_KLANTOBJECT v where v.soort = 'Telefooncentralenummers') and p.prs_afdeling_key in (select v.prs_afdeling_key from prs_v_aanwezigafdeling v where v.prs_bedrijf_key = 41 and v.prs_afdeling_verwijder is null) -- Onderdeel bedrijf Humanitas... and p.prs_perslid_telefoonnr is not null ; CURSOR c_delmob IS SELECT p.prs_perslid_key, p.prs_perslid_mobiel FROM prs_perslid p WHERE p.prs_perslid_key not in (select v.prs_perslid_key from HMOD_V_TELEFOONNR_KLANTOBJECT v where v.soort = 'Mobieletelefoon') and p.prs_afdeling_key in (select v.prs_afdeling_key from prs_v_aanwezigafdeling v where v.prs_bedrijf_key = 41 and v.prs_afdeling_verwijder is null) -- Onderdeel bedrijf Humanitas... and p.prs_perslid_mobiel is not null ; v_telefoon_vast VARCHAR2(15); v_telefoon_mobiel VARCHAR2(15); v_errormsg VARCHAR (200); v_errorhint VARCHAR (200); oracle_err_mes VARCHAR2 (150); currentversion fac_module.fac_module_version%TYPE; v_aanduiding VARCHAR (100); v_count NUMBER; BEGIN v_count:=0; FOR rec IN c_vast LOOP v_aanduiding := 'Vast nummer gewijzigd, ' || CHR(10) || 'van ' || COALESCE(rec.vastnr_huidig,'') || ' naar ' || rec.nummer_object ; v_errorhint := 'telefoonnr vast aanpassen'; UPDATE prs_perslid p SET prs_perslid_telefoonnr = rec.nummer_object WHERE p.prs_perslid_key = rec.prs_perslid_key ; fac.trackaction ( 'PRSUPD', rec.prs_perslid_key, 3, SYSDATE, v_aanduiding); END LOOP; FOR rec IN c_mob LOOP v_aanduiding := 'Mobielnummer gewijzigd, ' || CHR(10) || 'van ' || COALESCE(rec.mobielnr_huidig,'') || ' naar ' || rec.nummer_object ; v_errorhint := 'telefoonnr mobiel aanpassen'; UPDATE prs_perslid p SET prs_perslid_mobiel = rec.nummer_object WHERE p.prs_perslid_key = rec.prs_perslid_key ; fac.trackaction ( 'PRSUPD', rec.prs_perslid_key, 3, SYSDATE, v_aanduiding); END LOOP; FOR rec IN c_delvast LOOP v_aanduiding := 'Vast nummer verwijderd ' || CHR(10) || 'Was ' || rec.prs_perslid_telefoonnr ; v_errorhint := 'vast nummer verwijderen'; UPDATE prs_perslid p SET p.prs_perslid_telefoonnr = '' WHERE p.prs_perslid_key = rec.prs_perslid_key ; fac.trackaction ( 'PRSUPD', rec.prs_perslid_key, 3, SYSDATE, v_aanduiding); END LOOP; FOR rec IN c_delmob LOOP v_aanduiding := 'Mobielnummer verwijderd ' || CHR(10) || 'Was ' || rec.prs_perslid_mobiel ; v_errorhint := 'mobielnummer verwijderen'; UPDATE prs_perslid p SET p.prs_perslid_mobiel = '' WHERE p.prs_perslid_key = rec.prs_perslid_key ; fac.trackaction ( 'PRSUPD', rec.prs_perslid_key, 3, SYSDATE, v_aanduiding); END LOOP; END; / -- script om dagelijks terugkerende scripts aan te roepen. CREATE OR REPLACE PROCEDURE hmod_select_daily_task (p_applname IN VARCHAR2, p_applrun IN VARCHAR2) AS BEGIN -- job om de telefoonnummers in persoonkaart te synchroniseren met de eigendommen (gekoppelde telefoonobjecten vast en mobiel) hmod_prs_telefoonnummers (p_applname, p_applrun); END; / -- Rapport van de import-personen ADP. ---- Zowel te gebruiken bij LEZEN als bij VERWERKEN ---- Deze view wordt tevens gebruikt als cursor voor de import-proceduren CREATE OR REPLACE VIEW hmod_v_prsimport ( PRS_PERSLID_KEY, PRS_PERSLID_NR, PRS_PERSLID_NAAM, PRS_PERSLID_VOORNAAM, PRS_PERSLID_OSLOGIN, PRS_DATUM_UITDIENST, PRS_STATUS, FORMATIEPLAATS_HUIDIG, FORMATIEPLAATS_CSV, LETTERCODE, TOKEN, MOB, HIT, LAP_EN_SIM, LAPT, TNC, TNC_OMSCHRIJVING, FACILITOR, ADP, ABSENTIEMANAGER, REGAS, CHECKS, ACCOUNTVIEW, ELVY, HODNET, PROACTIVE, OPMERKING_KOFFERSYSTEEM, DATUM_GELEZEN, DATUM_VERWERKT ) AS -- Bestaande personen die ook weer in deze PRS-import zitten SELECT basis.prs_perslid_key, basis.prs_perslid_nr, basis.prs_perslid_naam, i.prs_perslid_voornaam, basis.prs_perslid_oslogin, basis.DatumUitDienst, CASE WHEN d.datum_verwerkt is not null THEN i.prs_perslid_partner_naam -- Deze vul ik tijdens de import met de prs_status WHEN d.datum_verwerkt is null and k.code is null THEN 'Basis - Fout' ELSE basis.koffersysteem_status END as prs_status, COALESCE(basis.formatieplaats_huidig,'nvt'), COALESCE (k.code, i.prs_kenmerk3 || ' LET OP! formatieplaats uit CSV staat niet in actueel koffersysteem') AS formatieplaats_CSV, k.lettercode, k.token, k.mob, k.hit, k.lap_en_sim, k.lapt, k.tnc, k.tnc_omschrijving, k.facilitor, k.adp, k.absentiemanager, k.regas, k.checks, k.accountview, k.elvy, k.hodnet, k.proactive, k.opmerking, d.datum_gelezen, d.datum_verwerkt FROM (SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam, p.prs_perslid_oslogin, a.prs_bedrijf_key, b.prs_bedrijf_naam, (SELECT prs_kenmerklink_waarde FROM prs_kenmerklink WHERE prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 1025 AND prs_kenmerklink_niveau = 'P' AND prs_kenmerklink_verwijder IS NULL) AS formatieplaats_huidig, (SELECT prs_kenmerklink_waarde FROM prs_kenmerklink WHERE prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 1100 AND prs_kenmerklink_niveau = 'P' AND prs_kenmerklink_verwijder IS NULL) AS DatumUitDienst, (SELECT kd.fac_usrdata_omschr FROM prs_kenmerklink k, fac_usrdata kd WHERE k.prs_link_key = p.prs_perslid_key AND k.prs_kenmerk_key = 1081 -- Kenmerkveld Status AND k.prs_kenmerklink_niveau = 'P' AND k.prs_kenmerklink_verwijder IS NULL AND k.prs_kenmerklink_waarde = kd.fac_usrdata_key AND kd.fac_usrtab_key = 82) as Koffersysteem_status FROM prs_perslid p, prs_v_afdeling a, prs_bedrijf b WHERE p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_bedrijf_key = b.prs_bedrijf_key AND p.prs_perslid_verwijder IS NULL) basis, fac_imp_perslid i, hmod_imp_koffersysteem k, (SELECT i.fac_import_key, MAX (f.fac_import_datum_gelezen) AS datum_gelezen, MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt FROM fac_import f, fac_imp_perslid i WHERE f.fac_import_key = i.fac_import_key AND f.fac_import_app_key = 41 GROUP BY i.fac_import_key, f.fac_import_datum_gelezen, f.fac_import_datum_verwerkt) d WHERE basis.prs_perslid_nr = i.prs_perslid_nr AND i.prs_kenmerk3 = k.code (+) AND basis.prs_bedrijf_key = 41 -- Alleen voor Humanitas onder Dak mensen UNION ALL -- NIEUWE PERSONEN die nog niet in BEDRIJF HUMANITAS zitten en die dus bij import toegevoegd gaan worden en met juiste koffersysteem gevuld moet worden... ---- Nieuwe personen zitten bij INLEZEN aan deze kant (omdat ze nog geen prs_perslid_key hebben). Bij verwerken hebben ze dit wel en dan zitten de NIEUWE personen in bovenstaande union.. SELECT -1 AS prs_perslid_key, i.prs_perslid_nr, i.prs_perslid_naam, i.prs_perslid_voornaam, NULL as prs_perslid_oslogin, -- Nieuwe mensen krijgen handmatig via voorkant een login '' as DatumUitDienst, CASE WHEN k.code is null THEN 'Nieuw - Fout' ELSE 'Nieuw' END as prs_status, 'nvt' AS formatieplaats_huidig, COALESCE (k.code, i.prs_kenmerk3 || ' LET OP! formatieplaats uit CSV staat niet in actueel koffersysteem') AS formatieplaats_CSV, k.lettercode, k.token, k.mob, k.hit, k.lap_en_sim, k.lapt, k.tnc, k.tnc_omschrijving, k.facilitor, k.adp, k.absentiemanager, k.regas, k.checks, k.accountview, k.elvy, k.hodnet, k.proactive, k.opmerking, d.datum_gelezen, d.datum_verwerkt FROM fac_imp_perslid i, hmod_imp_koffersysteem k, (SELECT i.fac_import_key, MAX (f.fac_import_datum_gelezen) AS datum_gelezen, MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt FROM fac_import f, fac_imp_perslid i WHERE f.fac_import_key = i.fac_import_key AND f.fac_import_app_key = 41 GROUP BY i.fac_import_key, f.fac_import_datum_gelezen, f.fac_import_datum_verwerkt) d WHERE i.prs_kenmerk3 = k.code(+) AND i.fac_import_key = d.fac_import_key AND UPPER(i.prs_perslid_nr) NOT IN (SELECT UPPER(p.prs_perslid_nr) FROM prs_perslid p, prs_bedrijf b, prs_v_afdeling a WHERE p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_bedrijf_key = b.prs_bedrijf_key AND p.prs_perslid_nr IS NOT NULL AND p.prs_perslid_verwijder IS NULL AND b.prs_bedrijf_key = 41 -- Humanitas onder Dak ) UNION ALL -- Alle HUMANITAS medewerkers die wel in Facilitor staan, maar niet in CSV-import zitten - Indien nodig handmatig te verwijderen SELECT basis.prs_perslid_key, basis.prs_perslid_nr, basis.prs_perslid_naam, basis.prs_perslid_voornaam, basis.prs_perslid_oslogin, basis.DatumUitDienst, 'Verwijderen' AS prs_status, basis.formatieplaats_huidig, 'nvt' AS formatieplaats_CSV, k.lettercode, k.token, k.mob, k.hit, k.lap_en_sim, k.lapt, k.tnc, k.tnc_omschrijving, k.facilitor, k.adp, k.absentiemanager, k.regas, k.checks, k.accountview, k.elvy, k.hodnet, k.proactive, k.opmerking, d.datum_gelezen, d.datum_verwerkt FROM (SELECT p.prs_perslid_key, COALESCE(p.prs_perslid_nr,'999') as prs_perslid_nr, p.prs_perslid_naam, p.prs_perslid_voornaam, p.prs_perslid_oslogin, a.prs_bedrijf_key, b.prs_bedrijf_naam, (SELECT prs_kenmerklink_waarde FROM prs_kenmerklink WHERE prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 1025 AND prs_kenmerklink_niveau = 'P' AND prs_kenmerklink_verwijder IS NULL) AS formatieplaats_huidig, (SELECT prs_kenmerklink_waarde FROM prs_kenmerklink WHERE prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 1100 AND prs_kenmerklink_niveau = 'P' AND prs_kenmerklink_verwijder IS NULL) AS DatumUitDienst, (SELECT kd.fac_usrdata_omschr FROM prs_kenmerklink k, fac_usrdata kd WHERE k.prs_link_key = p.prs_perslid_key AND k.prs_kenmerk_key = 1081 -- Kenmerkveld Status AND k.prs_kenmerklink_niveau = 'P' AND k.prs_kenmerklink_verwijder IS NULL AND k.prs_kenmerklink_waarde = kd.fac_usrdata_key AND kd.fac_usrtab_key = 82) as Koffersysteem_status FROM prs_perslid p, prs_v_afdeling a, prs_bedrijf b WHERE p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_bedrijf_key = b.prs_bedrijf_key AND b.prs_bedrijf_key = 41 AND p.prs_perslid_verwijder IS NULL) basis, hmod_imp_koffersysteem k, ( SELECT i.fac_import_key, MAX (f.fac_import_datum_gelezen) AS datum_gelezen, MAX (f.fac_import_datum_verwerkt) AS datum_verwerkt FROM fac_import f, fac_imp_perslid i WHERE f.fac_import_key = i.fac_import_key AND f.fac_import_app_key = 41 GROUP BY i.fac_import_key, f.fac_import_datum_gelezen, f.fac_import_datum_verwerkt) d WHERE basis.formatieplaats_huidig = k.code(+) AND basis.Koffersysteem_status != 'Nvt' AND basis.prs_perslid_nr NOT IN (SELECT i.prs_perslid_nr FROM fac_imp_perslid i) ; CREATE OR REPLACE PROCEDURE hmod_import_perslid (p_import_key IN NUMBER) AS v_errormsg VARCHAR2 (1000) := '-'; v_errorhint VARCHAR2 (1000) := '-'; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (1000); v_count NUMBER; v_count_leeg NUMBER; v_count_fout NUMBER; v_count_nieuw NUMBER; v_count_verwijder NUMBER; v_count_codeverschilt NUMBER; CURSOR c -- Alle medewerkers HUMANITAS die in aangeleverde ADP-personen-bestand zitten IS SELECT prs_perslid_key, prs_perslid_nr, prs_perslid_voornaam, prs_perslid_oslogin, prs_status, formatieplaats_huidig, formatieplaats_csv, lettercode, token, mob, hit, lap_en_sim, lapt, tnc, tnc_omschrijving, facilitor, adp, absentiemanager, regas, checks, accountview, elvy, hodnet, proactive FROM hmod_v_prsimport WHERE instr(prs_status,'Verwijderen') = 0 and prs_status is not null ; BEGIN v_errorhint := 'Generieke import'; -- Standaard Import. De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE. prs.import_perslid ( p_import_key, '0;0;0;0;0;0;1;2;0;3;0;0;0;0;0;0;0;5;0;7;6;0;0;4;0;0;8;9;10;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0', 'Afdelingscode;Volbrief;Roepnaam;Geslacht;Zakelijk e-mailadres;Omschrijving verkort;Werknemernummer;Geboortenaam;Aanhef brief;Formatie code%'); -- DEF2: Afdelingscode;Volbrief;Roepnaam;Geslacht;Zakelijk e-mailadres;Omschrijving verkort;Werknemernummer;Geboortenaam;Aanhef brief;Formatie code' ----- 1 2 3 4 5 6 7 8 9 10 COMMIT; FOR rec IN c LOOP BEGIN -- Koffersysteem-kenmerken vullen IF rec.prs_status = 'Basis' or rec.prs_status = 'Nieuw' -- Dan alle koffersysteemvelden naar personenkaart wegschrijven... THEN UPDATE fac_imp_perslid p SET prs_kenmerk6 = rec.token, -- Token prs_kenmerk7 = rec.mob, -- Mobiel prs_kenmerk8 = rec.hit, -- Hit prs_kenmerk9 = rec.lap_en_sim, -- Lap+Sim prs_kenmerk10 = rec.lapt, -- Lapt prs_kenmerk11 = rec.tnc, -- Toegangsniveau prs_kenmerk12 = rec.facilitor, -- Facilitor prs_kenmerk13 = rec.adp, -- ADP prs_kenmerk14 = rec.absentiemanager, -- Absentiemanager prs_kenmerk15 = rec.regas, -- Regas prs_kenmerk16 = rec.checks, -- Checks prs_kenmerk17 = rec.accountview, -- Accountview prs_kenmerk18 = rec.elvy, -- Elvy prs_kenmerk19 = rec.hodnet, -- HodNet prs_kenmerk20 = rec.proactive -- Proactive WHERE p.prs_perslid_nr = rec.prs_perslid_nr; END IF; -- De prs_status (= status voor deze import) ook wegschrijven in fac_imp_perslid. ---- Om updateprocedure mee te sturen... + om rapport import prs goed mee te vullen.. ---- Omdat er voor koffersysteem al 20 kenmerken gevuld worden, moet ik hier ander veld voor (mis)bruiken. UPDATE fac_imp_perslid p SET prs_perslid_partner_naam = rec.prs_status -- Partner_naam voor misbruiken. Wordt in standaard update niet gebruikt (omdat PRS_PERSLID_NAAMGEBRUIK_CODE op 0 meegaat..) WHERE p.prs_perslid_nr = rec.prs_perslid_nr; -- Voorletter vullen vanuit Roepnaam UPDATE fac_imp_perslid p SET prs_perslid_voorletters = substr(rec.prs_perslid_voornaam,1,1) WHERE p.prs_perslid_nr = rec.prs_perslid_nr and rec.prs_perslid_voornaam is not null; -- Basiskoffer - Lettercode vullen - UPDATE fac_imp_perslid p SET prs_kenmerk4 = rec.lettercode WHERE p.prs_perslid_nr = rec.prs_perslid_nr; -- Loginnaam vullen vanuit huidige personenkaart UPDATE fac_imp_perslid p SET prs_perslid_oslogin = rec.prs_perslid_oslogin WHERE p.prs_perslid_nr = rec.prs_perslid_nr ; END; END LOOP; BEGIN v_errormsg := 'Checks op importbestand '; v_aanduiding := 'Raadpleeg rapport en pas csv-bestand aan en lees opnieuw in'; v_count := 0; v_count_leeg:=0; v_count_fout := 0; v_count_nieuw := 0; v_count_verwijder :=0; v_count_codeverschilt := 0; -- Nog even alles tellen. NOG NAGAAN/AFSPREKEN wanneer de import moet doorlopen en wanneer men het eerst wil raadplegen.. SELECT count (*) INTO v_count FROM hmod_v_prsimport; SELECT count (*) INTO v_count_nieuw FROM fac_imp_perslid WHERE (prs_perslid_partner_naam = 'Nieuw' or prs_perslid_partner_naam = 'Nieuw - Fout') ; SELECT count (*) INTO v_count_fout FROM fac_imp_perslid WHERE INSTR (prs_perslid_partner_naam, 'Fout') > 0 ; SELECT count (*) INTO v_count_verwijder FROM hmod_v_prsimport WHERE INSTR (prs_status, 'Verwijderen') > 0 ; SELECT count (*) INTO v_count_leeg FROM fac_imp_perslid WHERE prs_perslid_partner_naam is null ; SELECT count (*) INTO v_count_codeverschilt FROM hmod_v_prsimport WHERE prs_status = 'Basis' and formatieplaats_huidig <> formatieplaats_csv ; IF v_count_leeg > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal personen zonder import-status is: ' || v_count_leeg, 'ACTIE: ' || v_aanduiding); END IF; IF v_count_fout > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal personen zonder gekoppelde formatieplaats is: ' || v_count_fout, 'ACTIE: ' || v_aanduiding); END IF; IF v_count_codeverschilt > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal personen die op BASIS staan, hebben in csv andere formatieplaats dan nu in Facilitor: ' || v_count_codeverschilt, 'ACTIE: ' || v_aanduiding); END IF; IF v_count_verwijder > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal te verwijderen personen is: '|| v_count_verwijder, 'Ter info'); END IF; IF v_count_nieuw > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal nieuw in te lezen personen is: '|| v_count_nieuw, 'Ter info'); END IF; IF v_count > 0 THEN fac.imp_writelog ( p_import_key, 'W', 'Aantal totaal te muteren personen is: '|| v_count, 'Ter info'); END IF; END; -- Nog wat updates uitvoeren op tussentabel... UPDATE fac_imp_perslid SET prs_perslid_geslacht = CASE WHEN prs_perslid_titel = 'Man' THEN 1 WHEN prs_perslid_titel = 'Vrouw' THEN 0 ELSE NULL END, prs_kenmerk1 = -- Meisjesnaam leegmaken indien man CASE WHEN prs_perslid_titel = 'Man' THEN '' ELSE prs_kenmerk1 END ; -- Titel kan nu leeggemaakt worden.. UPDATE fac_imp_perslid SET prs_perslid_titel = '' ; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ') '; fac.imp_writelog (p_import_key, 'E', v_errormsg || v_errorhint, 'Inleesproces personen afgebroken!'); END hmod_import_perslid; / -- DE UPDATE CREATE OR REPLACE PROCEDURE hmod_update_perslid (p_import_key IN NUMBER) IS CURSOR c_flex -- Alle records pakken. O.a. voor updaten van de algemene flex-kenmerkvelden IS SELECT p.prs_perslid_key, p.prs_perslid_nr, i.prs_perslid_partner_naam,i.prs_kenmerk1, i.prs_kenmerk2, i.prs_kenmerk3 FROM prs_v_aanwezigperslid p, fac_imp_perslid i WHERE p.prs_perslid_nr = i.prs_perslid_nr ORDER BY 2; CURSOR c_flex_koffer -- De flexkenmerken koffersysteem - alleen updaten voor die gevuld zijn IS SELECT p.prs_perslid_key, p.prs_perslid_nr, i.prs_perslid_partner_naam, i.prs_kenmerk4, i.prs_kenmerk6,i.prs_kenmerk7,i.prs_kenmerk8,i.prs_kenmerk9,i.prs_kenmerk10,i.prs_kenmerk11,i.prs_kenmerk12,i.prs_kenmerk13,i.prs_kenmerk14,i.prs_kenmerk15,i.prs_kenmerk16,i.prs_kenmerk17,i.prs_kenmerk18,i.prs_kenmerk19,i.prs_kenmerk20 FROM prs_v_aanwezigperslid p, fac_imp_perslid i WHERE p.prs_perslid_nr = i.prs_perslid_nr AND (i.prs_perslid_partner_naam = 'Basis' or i.prs_perslid_partner_naam = 'Nieuw') ORDER BY 2; -- CURSOR DELETE ----- Goed standaard voorbeeld van STANDAARD DELETE bij Vesteda (VEST) ---- Voor HMOD: ---- Indien er clienten in Faciltior zitten, deze sowieso uitsluiten van verwijderactie ---- Handmatig aangemaakte persoon 'Beumer applicatiebeheer' en 'Claudia ten Cate' + ......? ---- Omdat er via HRM-workflow wordt gewerkt, beste om dit via kenmerkveld te laten lopen met CHECK ADP-import CURSOR c_del -- Alle medewerkers van bedrijf HUMANITAS die niet in aangeleverde ADP-personen-bestand zitten IS SELECT prs_perslid_key, prs_perslid_nr, prs_status FROM hmod_v_prsimport WHERE prs_status = 'Verwijderen' ; v_errorhint VARCHAR2 (1000) := ''; v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (1000); v_count NUMBER; v_count_leeg NUMBER; v_count_fout NUMBER; v_count_nieuw NUMBER; v_count_verwijder NUMBER; v_count_codeverschilt NUMBER; BEGIN -- Generieke update. v_errorhint :='Fout in generieke update'; -- Nog even alles tellen. NOG NAGAAN/AFSPREKEN wanneer de import moet doorlopen en wanneer men het eerst wil raadplegen.. v_aanduiding := 'Import afgebroken (conform afspraak) - Zie rapport voor specificaties'; SELECT count (*) INTO v_count FROM hmod_v_prsimport; SELECT count (*) INTO v_count_nieuw FROM fac_imp_perslid WHERE (prs_perslid_partner_naam = 'Nieuw' or prs_perslid_partner_naam = 'Nieuw - Fout'); SELECT count (*) INTO v_count_fout FROM fac_imp_perslid WHERE INSTR (prs_perslid_partner_naam, 'Fout') > 0 ; SELECT count (*) INTO v_count_verwijder FROM hmod_v_prsimport WHERE INSTR (prs_status, 'Verwijderen') > 0 ; SELECT count (*) INTO v_count_leeg FROM fac_imp_perslid WHERE prs_perslid_partner_naam is null ; SELECT count (*) INTO v_count_codeverschilt FROM hmod_v_prsimport WHERE prs_status = 'Basis' and formatieplaats_huidig <> formatieplaats_csv ; IF v_count < 10 THEN fac.imp_writelog (p_import_key, 'E', 'Het aantal te importeren personen is te klein: ' || TO_CHAR (v_count), v_aanduiding); RETURN; END IF; IF v_count_fout > 3 THEN fac.imp_writelog (p_import_key, 'E', 'Er zitten in import teveel medewerkers met prs_status FOUT: ' || TO_CHAR (v_count_fout), v_aanduiding); RETURN; END IF; IF v_count_nieuw > 10 -- Bijvoorbeeld als alle personeelsnr's in csv zonder vooloopnull zijn... (NOG CHECKEN in KPN) THEN fac.imp_writelog (p_import_key, 'E', 'Er zijn teveel NIEUWE medewerkers in import, kan niet kloppen: ' || TO_CHAR (v_count_nieuw), v_aanduiding); RETURN; END IF; IF v_count_leeg > 0 THEN fac.imp_writelog (p_import_key, 'E', 'Er zitten in import medewerkers ZONDER prs_status: ' || TO_CHAR (v_count_leeg), v_aanduiding); RETURN; END IF; IF v_count_codeverschilt > 10 THEN -- Zou 0 moeten zijn straks in praktijk!!!!! fac.imp_writelog (p_import_key, 'E', 'Er zijn (teveel) personen die op BASIS staan, maar in csv andere formatieplaats hebben dan nu in Facilitor: ' || TO_CHAR (v_count_codeverschilt), v_aanduiding); RETURN; END IF; -- Generieke update. NR - key personeelsnr - NULL is geen werkplekken verwijderd prs.update_perslid (p_import_key, 'NR', 'NULL'); -- Update flexvelden algemeen FOR rec IN c_flex LOOP BEGIN v_aanduiding := 'Import prs - ' || TO_CHAR(sysdate, 'dd/mm/yyyy - hh:mi:ss') || ' - status: ' || rec.prs_perslid_partner_naam; v_errorhint:='Fout bijwerken meisjes'; PRS.upsertkenmerk (1023, rec.prs_perslid_key, rec.prs_kenmerk1); -- Meisjesnaam v_errorhint:='Fout bijwerken briefaanhef'; PRS.upsertkenmerk (1024, rec.prs_perslid_key, rec.prs_kenmerk2); -- Brief aanhef v_errorhint:='Fout bijwerken formatieplaats'; PRS.upsertkenmerk (1025, rec.prs_perslid_key, rec.prs_kenmerk3); -- Formatieplaats -- Nog paar kenmerkvelden bijwerken DELETE FROM prs_kenmerklink WHERE prs_link_key = rec.prs_perslid_key AND prs_kenmerk_key = 1082 -- Veld om aan te geven dat persoon verwijderd kan worden. Voor de personen die meekomen in de fac_imp_perslid moet deze leeggemaakt worden... AND prs_kenmerklink_niveau = 'P' AND prs_kenmerklink_verwijder IS NULL; IF rec.prs_perslid_partner_naam = 'Nieuw' or rec.prs_perslid_partner_naam = 'Nieuw - Fout' THEN v_errorhint:='Nieuwe personen krijgen altijd basiskoffer mee'; PRS.upsertkenmerk (1081, rec.prs_perslid_key, '143'); -- Koffersysteem (status) = key 143 -- Toevoegen nieuwe personen aan de autorisatiegroep Werknemer - key 79 INSERT INTO fac_gebruikersgroep (fac_groep_key, fac_gebruikersgroep_aanmaak, prs_perslid_key) VALUES (79, sysdate, rec.prs_perslid_key); END IF; fac.trackaction ('PRSUPD', rec.prs_perslid_key, 3,sysdate, v_aanduiding) ; END; END LOOP; -- Update flexvelden Koffersysteem FOR rec IN c_flex_koffer LOOP BEGIN v_errorhint:='Fout bijwerken Token'; PRS.upsertkenmerk (1068, rec.prs_perslid_key, rec.prs_kenmerk6); -- Token, 6 , 1068 v_errorhint:='Fout bijwerken Mobiel'; PRS.upsertkenmerk (1067, rec.prs_perslid_key, rec.prs_kenmerk7); -- Mobiel 7 , 1067 v_errorhint:='Fout bijwerken Hit'; PRS.upsertkenmerk (1069, rec.prs_perslid_key, rec.prs_kenmerk8); -- Hit 8 , 1069 v_errorhint:='Fout bijwerken Lap+Sim'; PRS.upsertkenmerk (1063, rec.prs_perslid_key, rec.prs_kenmerk9); -- Lap+Sim 9 , 1063 v_errorhint:='Fout bijwerken Lapt'; PRS.upsertkenmerk (1065, rec.prs_perslid_key, rec.prs_kenmerk10); -- Lapt 10, 1065 v_errorhint:='Fout bijwerken Toegangsniveau'; PRS.upsertkenmerk (1061, rec.prs_perslid_key, rec.prs_kenmerk11); -- Toegangsniveau 11, 1061 v_errorhint:='Fout bijwerken Facilitor'; PRS.upsertkenmerk (1072, rec.prs_perslid_key, rec.prs_kenmerk12); -- Facilitor 12 , 1072 v_errorhint:='Fout bijwerken ADP'; PRS.upsertkenmerk (1073, rec.prs_perslid_key, rec.prs_kenmerk13); -- ADP 13 , 1073 v_errorhint:='Fout bijwerken Absentiemanager'; PRS.upsertkenmerk (1074, rec.prs_perslid_key, rec.prs_kenmerk14); -- Absentiemanager 14, 1074 v_errorhint:='Fout bijwerken Regas'; PRS.upsertkenmerk (1075, rec.prs_perslid_key, rec.prs_kenmerk15); -- Regas 15, 1075 v_errorhint:='Fout bijwerken Checks'; PRS.upsertkenmerk (1076, rec.prs_perslid_key, rec.prs_kenmerk16); -- Checks 15, 1076 v_errorhint:='Fout bijwerken Accountview'; PRS.upsertkenmerk (1077, rec.prs_perslid_key, rec.prs_kenmerk17); -- Accountview 17, 1077 v_errorhint:='Fout bijwerken Elvy'; PRS.upsertkenmerk (1078, rec.prs_perslid_key, rec.prs_kenmerk18); -- Elvy 18, 1078 v_errorhint:='Fout bijwerken HodNet'; PRS.upsertkenmerk (1079, rec.prs_perslid_key, rec.prs_kenmerk19); -- HodNet 19, 1079 v_errorhint:='Fout bijwerken Proactive'; PRS.upsertkenmerk (1080, rec.prs_perslid_key, rec.prs_kenmerk20); -- Proactive 20, 1080 v_errorhint:='Fout bijwerken Basiskoffer'; PRS.upsertkenmerk (1028, rec.prs_perslid_key, rec.prs_kenmerk4); -- Basiskoffer END; END LOOP; FOR rec IN c_del LOOP -- prs.delete_perslid (p_import_key, rec.prs_perslid_key); -- Deze niet draaien voor HMOD ivm de workflow HRM die men in Facilitor uitvoert...? -- wel vullen van een kenmerkveld ADP-import 1082 BEGIN v_aanduiding := 'Import prs - ' || TO_CHAR(sysdate, 'dd/mm/yyyy - hh:mi:ss') || ' - status: ' || rec.prs_status; v_errorhint:='Bijwerken veld verwijderen'; PRS.upsertkenmerk (1082, rec.prs_perslid_key,'let op: verwijderen' ); fac.trackaction ('PRSUPD', rec.prs_perslid_key, 3,sysdate, v_aanduiding) ; END; END LOOP; BEGIN -- Telefoongegevens komen niet mee met de ADP-import. Deze velden worden dus bij deze prs-import leeggegooid. -- De telefoonnummers worden gevuld vanuit de aan de persoon gekoppelde telefoonobjecten (vast en mobiel) -- Daarom aan eind van deze prs-import deze telefoonvelden weer vullen door het dagelijks script wat hiervoor 's nachts draait, nogmaals te runnen. hmod_prs_telefoonnummers (null, null); END; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ') '; fac.imp_writelog (p_import_key, 'E', v_errormsg || v_errorhint, 'Importproces personen afgebroken!'); END hmod_update_perslid; / -- Hieronder de standaard import voor Objecten. Vanaf versie 2020.1 komt hier revisie op waardoor er ook direct op organisatie/afdeling ingelezen kan worden. -- Dit inlezen p organsiatie/afdeling is per direct al voor HMOD van toepassing. Daarom deze procedure al via deze cust opgeleverd. -- Indien versie 2020.1 draait op SAAS dan deze procedure verwijderen en droppen. CREATE OR REPLACE PROCEDURE fac_import_ins2 (p_import_key IN NUMBER) IS c_delim VARCHAR2 (1) := ';'; v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line v_errormsg VARCHAR2 (1000); v_errorhint VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); header_is_valid NUMBER; v_count_tot NUMBER (10); v_count_import NUMBER (10); v_ongeldig NUMBER (1); v_aanduiding VARCHAR (400); v_ins_srtkenmerk_key1 VARCHAR2 (255); v_ins_srtkenmerk_key2 VARCHAR2 (255); v_ins_srtkenmerk_key3 VARCHAR2 (255); v_ins_srtkenmerk_key4 VARCHAR2 (255); v_ins_srtkenmerk_key5 VARCHAR2 (255); v_ins_srtkenmerk_key6 VARCHAR2 (255); v_ins_srtkenmerk_key7 VARCHAR2 (255); v_ins_srtkenmerk_key8 VARCHAR2 (255); v_ins_srtkenmerk_key9 VARCHAR2 (255); v_ins_srtkenmerk_key10 VARCHAR2 (255); v_ins_srtkenmerk_key11 VARCHAR2 (255); v_ins_srtkenmerk_key12 VARCHAR2 (255); v_ins_srtkenmerk_key13 VARCHAR2 (255); v_ins_srtkenmerk_key14 VARCHAR2 (255); v_ins_srtkenmerk_key15 VARCHAR2 (255); v_ins_srtkenmerk_key16 VARCHAR2 (255); v_ins_srtkenmerk_key17 VARCHAR2 (255); v_ins_srtkenmerk_key18 VARCHAR2 (255); v_ins_srtkenmerk_key19 VARCHAR2 (255); v_ins_srtkenmerk_key20 VARCHAR2 (255); -- De importvelden v_ins_discipline_omschrijving VARCHAR2 (255); -- C60 v_ins_discipline_kostensoort VARCHAR2 (255); --C60 v_ins_srtgroep_omschrijving VARCHAR2 (255); -- C60 v_ins_srtdeel_code VARCHAR2 (255); -- C10 v_ins_srtdeel_omschrijving VARCHAR2 (255); -- C100 v_ins_deel_omschrijving VARCHAR2 (255); -- C60 v_ins_deel_opmerking VARCHAR2 (1000); -- C320 v_reserveerbaar VARCHAR2 (255); -- C1 v_reserveerbaar_n NUMBER (1); -- N1 v_res_deel_eenheid VARCHAR2 (255); -- C10 v_res_deel_prijs VARCHAR2 (255); -- N7,2 v_res_deel_prijs_n NUMBER (7, 2); -- N7,2 v_alg_locatie_code VARCHAR2 (255); -- C10 v_alg_gebouw_code VARCHAR2 (255); -- C12 v_alg_verdieping_volgnr VARCHAR2 (255); -- N3 v_alg_verdieping_volgnr_n NUMBER (3); -- N3 v_alg_ruimte_nr VARCHAR2 (255); -- C10 v_res_deel_alg_level VARCHAR2 (255); -- C1 (naar -1 t/m 5) v_res_deel_alg_level_n NUMBER (1); -- N1 v_res_discipline_omschrijving VARCHAR2 (255); -- C60 v_res_discipline_kostensoort VARCHAR2 (255); -- C60 v_prs_perslid_matchcode VARCHAR2 (4000); v_prs_perslid_matchwaarde VARCHAR2 (4000); v_ins_kenmerkwaarde1 VARCHAR2 (4000); v_ins_kenmerkwaarde2 VARCHAR2 (4000); v_ins_kenmerkwaarde3 VARCHAR2 (4000); v_ins_kenmerkwaarde4 VARCHAR2 (4000); v_ins_kenmerkwaarde5 VARCHAR2 (4000); v_ins_kenmerkwaarde6 VARCHAR2 (4000); v_ins_kenmerkwaarde7 VARCHAR2 (4000); v_ins_kenmerkwaarde8 VARCHAR2 (4000); v_ins_kenmerkwaarde9 VARCHAR2 (4000); v_ins_kenmerkwaarde10 VARCHAR2 (4000); v_ins_kenmerkwaarde11 VARCHAR2 (4000); v_ins_kenmerkwaarde12 VARCHAR2 (4000); v_ins_kenmerkwaarde13 VARCHAR2 (4000); v_ins_kenmerkwaarde14 VARCHAR2 (4000); v_ins_kenmerkwaarde15 VARCHAR2 (4000); v_ins_kenmerkwaarde16 VARCHAR2 (4000); v_ins_kenmerkwaarde17 VARCHAR2 (4000); v_ins_kenmerkwaarde18 VARCHAR2 (4000); v_ins_kenmerkwaarde19 VARCHAR2 (4000); v_ins_kenmerkwaarde20 VARCHAR2 (4000); v_ins_deel_aanmaak VARCHAR2 (255); -- DATE v_ins_deel_aanmaak_d DATE; v_ins_deel_vervaldatum VARCHAR2 (255); -- DATE v_ins_deel_vervaldatum_d DATE; v_ins_deel_aantal VARCHAR2 (255); -- N8,2 v_ins_deel_aantal_n NUMBER(8, 2); v_file_index NUMBER; -- Overige velden: CURSOR c1 IS SELECT * FROM fac_imp_file WHERE fac_import_key = p_import_key ORDER BY fac_imp_file_index; -- Controleer tijdens import-fase alleen op bestaan van kenmerksoort (of -- deze - via een kenmerk - wel is gedefinieerd voor de betreffende object- -- discipline/groep/soort, volgt pas tijdens de update-fase)! -- -- kw is bijvoorbeeld 'Parkeercode' of 'Parkeercode|3' waarbij de laatste in groep 3 zit -- het resultaat is NULL (als niet gevonden) of 234|3 voor strkenmer_key 234 in groep 3 -- Als geen groep is meegegeven wordt 234|0 opgeleverd (de default groep) FUNCTION bepaal_srtkenmerk_key (p_kw IN VARCHAR) RETURN VARCHAR IS v_srtkenmerk_key NUMBER; v_kenmerk_groep NUMBER; v_kw VARCHAR(250); BEGIN v_kenmerk_groep := 0; v_kw := p_kw; IF INSTR (v_kw, '|') > 1 THEN v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1); v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1); END IF; IF fac.safe_to_number (v_kw) IS NULL THEN -- kenmerkwaarde is alfanumeriek (dus omschrijving)! SELECT ins_srtkenmerk_key INTO v_srtkenmerk_key FROM ins_v_aanwezigsrtkenmerk WHERE ins_srtkenmerk_upper = UPPER (v_kw) AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V'); ELSE -- kenmerkwaarde is numeriek (dus key)! SELECT ins_srtkenmerk_key INTO v_srtkenmerk_key FROM ins_v_aanwezigsrtkenmerk WHERE ins_srtkenmerk_key = fac.safe_to_number (v_kw) AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B', 'V'); END IF; RETURN TO_CHAR(v_srtkenmerk_key) || '|' || TO_CHAR(v_kenmerk_groep); EXCEPTION WHEN NO_DATA_FOUND THEN IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%' THEN RETURN NULL; ELSE fac.imp_writelog (p_import_key, 'W', 'Fout bij bepalen kenmerksoort [' || p_kw || ']', 'Bestaat niet of type ongeldig'); COMMIT; RETURN NULL; END IF; END; BEGIN -- Eerst opruiming DELETE FROM fac_imp_ins; COMMIT; v_count_tot := 0; v_count_import := 0; header_is_valid := 0; v_prs_perslid_matchcode := ''; FOR rec1 IN c1 LOOP BEGIN v_newline := rec1.fac_imp_file_line; v_file_index := rec1.fac_imp_file_index; v_errormsg := 'Fout bij opvragen importregel'; v_aanduiding := ''; v_ongeldig := 0; -- Lees alle veldwaarden fac.imp_getfield (v_newline, c_delim, v_ins_discipline_omschrijving); fac.imp_getfield (v_newline, c_delim, v_ins_discipline_kostensoort); fac.imp_getfield (v_newline, c_delim, v_ins_srtgroep_omschrijving); fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code); fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_omschrijving); fac.imp_getfield (v_newline, c_delim, v_ins_deel_omschrijving); fac.imp_getfield (v_newline, c_delim, v_ins_deel_opmerking); fac.imp_getfield (v_newline, c_delim, v_reserveerbaar); fac.imp_getfield (v_newline, c_delim, v_res_deel_eenheid); fac.imp_getfield (v_newline, c_delim, v_res_deel_prijs); fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code); fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code); fac.imp_getfield (v_newline, c_delim, v_alg_verdieping_volgnr); fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr); fac.imp_getfield (v_newline, c_delim, v_res_deel_alg_level); fac.imp_getfield (v_newline, c_delim, v_res_discipline_omschrijving); fac.imp_getfield (v_newline, c_delim, v_res_discipline_kostensoort); fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchcode); fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchwaarde); fac.imp_getfield (v_newline, c_delim, v_ins_deel_aanmaak); fac.imp_getfield (v_newline, c_delim, v_ins_deel_vervaldatum); fac.imp_getfield (v_newline, c_delim, v_ins_deel_aantal); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde1); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde2); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde3); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde4); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde5); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde6); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde7); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde8); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde9); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde10); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde11); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde12); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde13); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde14); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde15); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde16); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde17); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde18); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde19); fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde20); v_aanduiding := '[' || v_ins_discipline_omschrijving || '|' || v_ins_srtgroep_omschrijving || '|' || v_ins_srtdeel_code || '|' || v_ins_srtdeel_omschrijving || '|' || v_ins_deel_omschrijving || '] '; -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen! -- Ik negeer alles totdat ik een geldige header ben gepasseerd. IF (header_is_valid = 0) THEN IF UPPER (v_ins_discipline_omschrijving) = 'DISCIPLINEOMSCHRIJVING' AND UPPER (v_ins_discipline_kostensoort) = 'DISCIPLINEKOSTENSOORT' AND UPPER (v_ins_srtgroep_omschrijving) = 'GROEPSOORTOMSCHRIJVING' AND UPPER (v_ins_srtdeel_code) = 'OBJECTSOORTCODE' AND UPPER (v_ins_srtdeel_omschrijving) = 'OBJECTSOORTOMSCHRIJVING' AND UPPER (v_ins_deel_omschrijving) = 'OBJECTIDENTIFICATIE' AND UPPER (v_ins_deel_opmerking) = 'OBJECTOPMERKING' AND UPPER (v_reserveerbaar) = 'RESERVEERBAAR' AND UPPER (v_res_deel_eenheid) = 'EENHEID' AND UPPER (v_res_deel_prijs) = 'PRIJS' AND UPPER (v_alg_locatie_code) = 'LOCATIECODE' AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE' AND UPPER (v_alg_verdieping_volgnr) = 'BOUWLAAGVOLGNUMMER' AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER' AND UPPER (v_res_deel_alg_level) = 'RESERVERINGSCOPE' AND UPPER (v_res_discipline_omschrijving) = 'CATALOGUSNAAM' AND UPPER (v_res_discipline_kostensoort) = 'CATALOGUSKOSTENSOORT' AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE' AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE' AND UPPER (v_ins_deel_aanmaak) = 'INGANGSDATUM' AND UPPER (v_ins_deel_vervaldatum) = 'VERVALDATUM' AND UPPER (v_ins_deel_aantal) = 'AANTAL' THEN v_ins_srtkenmerk_key1 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde1); v_ins_srtkenmerk_key2 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde2); v_ins_srtkenmerk_key3 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde3); v_ins_srtkenmerk_key4 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde4); v_ins_srtkenmerk_key5 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde5); v_ins_srtkenmerk_key6 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde6); v_ins_srtkenmerk_key7 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde7); v_ins_srtkenmerk_key8 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde8); v_ins_srtkenmerk_key9 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde9); v_ins_srtkenmerk_key10 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde10); v_ins_srtkenmerk_key11 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde11); v_ins_srtkenmerk_key12 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde12); v_ins_srtkenmerk_key13 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde13); v_ins_srtkenmerk_key14 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde14); v_ins_srtkenmerk_key15 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde15); v_ins_srtkenmerk_key16 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde16); v_ins_srtkenmerk_key17 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde17); v_ins_srtkenmerk_key18 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde18); v_ins_srtkenmerk_key19 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde19); v_ins_srtkenmerk_key20 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde20); header_is_valid := 1; END IF; ELSE v_count_tot := v_count_tot + 1; -- Controleer alle veldwaarden v_errormsg := 'Disciplineomschrijving ongeldig'; v_ins_discipline_omschrijving := TRIM (v_ins_discipline_omschrijving); IF v_ins_discipline_omschrijving IS NULL OR LENGTH (v_ins_discipline_omschrijving) > 60 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen'); v_ongeldig := 1; END IF; -- v_errormsg := 'Kostensoort ongeldig'; v_ins_discipline_kostensoort := TRIM (v_ins_discipline_kostensoort); IF LENGTH (v_ins_discipline_kostensoort) > 60 THEN v_ins_discipline_kostensoort := SUBSTR (v_ins_discipline_kostensoort, 1, 60); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Disciplinekostensoort wordt afgebroken tot [' || v_ins_discipline_kostensoort || ']' ); END IF; -- v_errormsg := 'Groepsoortomschrijving ongeldig'; v_ins_srtgroep_omschrijving := TRIM (v_ins_srtgroep_omschrijving); IF v_ins_srtgroep_omschrijving IS NULL OR LENGTH (v_ins_srtgroep_omschrijving) > 60 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen'); v_ongeldig := 1; END IF; -- v_errormsg := 'Objectsoortcode ongeldig'; v_ins_srtdeel_code := TRIM (v_ins_srtdeel_code); IF v_ins_srtdeel_code IS NULL OR LENGTH (v_ins_srtdeel_code) > 10 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen'); v_ongeldig := 1; END IF; -- v_errormsg := 'Objectsoortomschrijving ongeldig'; v_ins_srtdeel_omschrijving := TRIM (v_ins_srtdeel_omschrijving); IF v_ins_srtdeel_omschrijving IS NULL OR LENGTH (v_ins_srtdeel_omschrijving) > 100 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen'); v_ongeldig := 1; END IF; -- v_errormsg := 'Objectomschrijving ongeldig'; v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving); IF v_ins_deel_omschrijving IS NULL OR LENGTH (v_ins_deel_omschrijving) > 60 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen'); v_ongeldig := 1; END IF; v_errormsg := 'Objectopmerking ongeldig'; v_ins_deel_opmerking := TRIM (v_ins_deel_opmerking); IF LENGTH (v_ins_deel_opmerking) > 320 THEN v_ins_deel_opmerking := SUBSTR (v_ins_deel_opmerking, 1, 320); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Objectopmerking wordt afgebroken tot [' || v_ins_deel_opmerking || ']' ); END IF; -- Verder geen foutdetectie; kan dus stricter? SELECT DECODE (SUBSTR (TRIM (UPPER (v_reserveerbaar)), 1, 1), 'J', 1, 0) INTO v_reserveerbaar_n FROM DUAL; -- v_errormsg := 'Eenheid ongeldig'; v_res_deel_eenheid := TRIM (v_res_deel_eenheid); IF LENGTH (v_res_deel_eenheid) > 10 THEN v_res_deel_eenheid := SUBSTR (v_res_deel_eenheid, 1, 10); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Eenheid wordt afgebroken tot [' || v_res_deel_eenheid || ']' ); END IF; -- v_errormsg := 'Prijs ongeldig; maximale grootte 99999.99'; v_res_deel_prijs := TRIM (v_res_deel_prijs); v_res_deel_prijs_n := NULL; IF (v_res_deel_prijs IS NOT NULL) THEN IF (fac.safe_to_number (v_res_deel_prijs) IS NULL) THEN v_ongeldig := 1; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); ELSE v_res_deel_prijs_n := fac.safe_to_number (v_res_deel_prijs); END IF; END IF; -- v_errormsg := 'Locatiecode ongeldig'; v_alg_locatie_code := TRIM (v_alg_locatie_code); IF LENGTH (v_alg_locatie_code) > 10 THEN v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Locatiecode wordt afgebroken tot [' || v_alg_locatie_code || ']' ); END IF; -- v_errormsg := 'Gebouwcode ongeldig'; v_alg_gebouw_code := TRIM (v_alg_gebouw_code); IF LENGTH (v_alg_gebouw_code) > 12 THEN v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 12); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Gebouwcode wordt afgebroken tot [' || v_alg_gebouw_code || ']' ); END IF; -- v_errormsg := 'Bouwlaagvolgnummer ongeldig'; v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr); v_alg_verdieping_volgnr_n := NULL; IF (v_alg_verdieping_volgnr IS NOT NULL) THEN v_alg_verdieping_volgnr_n := ROUND (fac.safe_to_number (v_alg_verdieping_volgnr)); IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999 THEN v_ongeldig := 1; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); ELSE v_alg_verdieping_volgnr_n := fac.safe_to_number (v_alg_verdieping_volgnr); END IF; END IF; -- v_errormsg := 'Ruimtenummer ongeldig'; v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr); IF LENGTH (v_alg_ruimte_nr) > 10 THEN v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Ruimtenummer wordt afgebroken tot [' || v_alg_ruimte_nr || ']' ); END IF; -- Verder geen foutdetectie; kan dus stricter? SELECT DECODE (SUBSTR (TRIM (v_res_deel_alg_level), 1, 1), 'E', 0, 'D', 1, 'L', 2, 'G', 3, 'V', 4, 'R', 5, -1) INTO v_res_deel_alg_level_n FROM DUAL; -- v_errormsg := 'Catalogusnaam ongeldig'; v_res_discipline_omschrijving := TRIM (v_res_discipline_omschrijving); IF LENGTH (v_res_discipline_omschrijving) > 60 THEN v_res_discipline_omschrijving := SUBSTR (TRIM (v_res_discipline_omschrijving), 1, 60); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Catalogusnaam wordt afgebroken tot [' || v_res_discipline_omschrijving || ']' ); END IF; -- v_errormsg := 'Cataloguskostensoort ongeldig'; v_res_discipline_kostensoort := TRIM (v_res_discipline_kostensoort); IF LENGTH (v_res_discipline_kostensoort) > 60 THEN v_res_discipline_kostensoort := SUBSTR (TRIM (v_res_discipline_kostensoort), 1, 60); fac.imp_writelog ( p_import_key, 'W', v_aanduiding || v_errormsg, 'Cataloguskostensoort wordt afgebroken tot [' || v_res_discipline_kostensoort || ']' ); END IF; -- v_errormsg := 'Aantal ongeldig; maximale grootte 999999.99'; v_ins_deel_aantal := TRIM (v_ins_deel_aantal); v_ins_deel_aantal := REPLACE (v_ins_deel_aantal, ',', '.'); v_ins_deel_aantal_n := NULL; IF (v_ins_deel_aantal IS NOT NULL AND fac.getSetting('ins_explode_objects') = 0) THEN IF (fac.safe_to_number (v_ins_deel_aantal) IS NULL) THEN v_ongeldig := 1; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); ELSE v_ins_deel_aantal_n := fac.safe_to_number (v_ins_deel_aantal); END IF; ELSE v_ins_deel_aantal_n := 1; END IF; -- IF v_ins_deel_aanmaak IS NOT NULL THEN BEGIN v_ins_deel_aanmaak_d := TO_DATE (v_ins_deel_aanmaak, 'dd-mm-yyyy'); EXCEPTION WHEN OTHERS THEN v_ongeldig := 1; oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errorhint || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!' ); COMMIT; END; ELSE v_ins_deel_aanmaak_d := NULL; END IF; -- IF v_ins_deel_vervaldatum IS NOT NULL THEN BEGIN v_ins_deel_vervaldatum_d := TO_DATE (v_ins_deel_vervaldatum, 'dd-mm-yyyy'); EXCEPTION WHEN OTHERS THEN v_ongeldig := 1; oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errorhint || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!' ); COMMIT; END; ELSE v_ins_deel_vervaldatum_d := NULL; END IF; -- De rest alleen ff trimmen. v_prs_perslid_matchcode := TRIM (v_prs_perslid_matchcode); v_prs_perslid_matchwaarde := TRIM (v_prs_perslid_matchwaarde); v_ins_kenmerkwaarde1 := TRIM (v_ins_kenmerkwaarde1); v_ins_kenmerkwaarde2 := TRIM (v_ins_kenmerkwaarde2); v_ins_kenmerkwaarde3 := TRIM (v_ins_kenmerkwaarde3); v_ins_kenmerkwaarde4 := TRIM (v_ins_kenmerkwaarde4); v_ins_kenmerkwaarde5 := TRIM (v_ins_kenmerkwaarde5); v_ins_kenmerkwaarde6 := TRIM (v_ins_kenmerkwaarde6); v_ins_kenmerkwaarde7 := TRIM (v_ins_kenmerkwaarde7); v_ins_kenmerkwaarde8 := TRIM (v_ins_kenmerkwaarde8); v_ins_kenmerkwaarde9 := TRIM (v_ins_kenmerkwaarde9); v_ins_kenmerkwaarde10 := TRIM (v_ins_kenmerkwaarde10); v_ins_kenmerkwaarde11 := TRIM (v_ins_kenmerkwaarde11); v_ins_kenmerkwaarde12 := TRIM (v_ins_kenmerkwaarde12); v_ins_kenmerkwaarde13 := TRIM (v_ins_kenmerkwaarde13); v_ins_kenmerkwaarde14 := TRIM (v_ins_kenmerkwaarde14); v_ins_kenmerkwaarde15 := TRIM (v_ins_kenmerkwaarde15); v_ins_kenmerkwaarde16 := TRIM (v_ins_kenmerkwaarde16); v_ins_kenmerkwaarde17 := TRIM (v_ins_kenmerkwaarde17); v_ins_kenmerkwaarde18 := TRIM (v_ins_kenmerkwaarde18); v_ins_kenmerkwaarde19 := TRIM (v_ins_kenmerkwaarde19); v_ins_kenmerkwaarde20 := TRIM (v_ins_kenmerkwaarde20); -- Insert geformatteerde import record IF v_ongeldig = 0 THEN BEGIN v_errormsg := 'Fout bij wegschrijven importregel'; -- Als uit kenmerkheader een geldige kenmerksoort-key volgt, -- dan is kenmerkwaarde gevuld met =; zoniet, -- dan is kenmerkwaarde gevuld met ! -- NB. Een NULL-waarde resulteert NIET in het wissen van een -- kenmerkveld (bijwerken kan wel, maar wissen dus niet)! INSERT INTO fac_imp_ins ( ins_discipline_omschrijving, ins_discipline_kostensoort, ins_srtgroep_omschrijving, ins_srtdeel_code, ins_srtdeel_omschrijving, ins_deel_omschrijving, ins_deel_opmerking, reserveerbaar, res_deel_eenheid, res_deel_prijs, alg_locatie_code, alg_gebouw_code, alg_verdieping_volgnr, alg_ruimte_nr, res_deel_alg_level, res_discipline_omschrijving, res_discipline_kostensoort, prs_perslid_matchcode, prs_perslid_matchwaarde, ins_kenmerkwaarde1, ins_kenmerkwaarde2, ins_kenmerkwaarde3, ins_kenmerkwaarde4, ins_kenmerkwaarde5, ins_kenmerkwaarde6, ins_kenmerkwaarde7, ins_kenmerkwaarde8, ins_kenmerkwaarde9, ins_kenmerkwaarde10, ins_kenmerkwaarde11, ins_kenmerkwaarde12, ins_kenmerkwaarde13, ins_kenmerkwaarde14, ins_kenmerkwaarde15, ins_kenmerkwaarde16, ins_kenmerkwaarde17, ins_kenmerkwaarde18, ins_kenmerkwaarde19, ins_kenmerkwaarde20, ins_deel_aanmaak, ins_deel_vervaldatum, ins_deel_aantal ) VALUES ( v_ins_discipline_omschrijving, v_ins_discipline_kostensoort, v_ins_srtgroep_omschrijving, v_ins_srtdeel_code, v_ins_srtdeel_omschrijving, v_ins_deel_omschrijving, v_ins_deel_opmerking, v_reserveerbaar_n, v_res_deel_eenheid, v_res_deel_prijs_n, v_alg_locatie_code, v_alg_gebouw_code, v_alg_verdieping_volgnr_n, v_alg_ruimte_nr, v_res_deel_alg_level_n, v_res_discipline_omschrijving, v_res_discipline_kostensoort, v_prs_perslid_matchcode, v_prs_perslid_matchwaarde, DECODE (v_ins_srtkenmerk_key1, NULL, v_ins_kenmerkwaarde1, TO_CHAR (v_ins_srtkenmerk_key1) || '=' || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key2, NULL, v_ins_kenmerkwaarde2, TO_CHAR (v_ins_srtkenmerk_key2) || '=' || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key3, NULL, v_ins_kenmerkwaarde3, TO_CHAR (v_ins_srtkenmerk_key3) || '=' || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key4, NULL, v_ins_kenmerkwaarde4, TO_CHAR (v_ins_srtkenmerk_key4) || '=' || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key5, NULL, v_ins_kenmerkwaarde5, TO_CHAR (v_ins_srtkenmerk_key5) || '=' || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key6, NULL, v_ins_kenmerkwaarde6, TO_CHAR (v_ins_srtkenmerk_key6) || '=' || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key7, NULL, v_ins_kenmerkwaarde7, TO_CHAR (v_ins_srtkenmerk_key7) || '=' || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key8, NULL, v_ins_kenmerkwaarde8, TO_CHAR (v_ins_srtkenmerk_key8) || '=' || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key9, NULL, v_ins_kenmerkwaarde9, TO_CHAR (v_ins_srtkenmerk_key9) || '=' || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key10, NULL, v_ins_kenmerkwaarde10, TO_CHAR (v_ins_srtkenmerk_key10) || '=' || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key11, NULL, v_ins_kenmerkwaarde11, TO_CHAR (v_ins_srtkenmerk_key11) || '=' || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key12, NULL, v_ins_kenmerkwaarde12, TO_CHAR (v_ins_srtkenmerk_key12) || '=' || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key13, NULL, v_ins_kenmerkwaarde13, TO_CHAR (v_ins_srtkenmerk_key13) || '=' || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key14, NULL, v_ins_kenmerkwaarde14, TO_CHAR (v_ins_srtkenmerk_key14) || '=' || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key15, NULL, v_ins_kenmerkwaarde15, TO_CHAR (v_ins_srtkenmerk_key15) || '=' || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key16, NULL, v_ins_kenmerkwaarde16, TO_CHAR (v_ins_srtkenmerk_key16) || '=' || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key17, NULL, v_ins_kenmerkwaarde17, TO_CHAR (v_ins_srtkenmerk_key17) || '=' || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key18, NULL, v_ins_kenmerkwaarde18, TO_CHAR (v_ins_srtkenmerk_key18) || '=' || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key19, NULL, v_ins_kenmerkwaarde19, TO_CHAR (v_ins_srtkenmerk_key19) || '=' || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900) ), DECODE ( v_ins_srtkenmerk_key20, NULL, v_ins_kenmerkwaarde20, TO_CHAR (v_ins_srtkenmerk_key20) || '=' || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900) ), v_ins_deel_aanmaak_d, v_ins_deel_vervaldatum_d, v_ins_deel_aantal_n ); COMMIT; v_count_import := v_count_import + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, ''); COMMIT; END; END IF; END IF; END; END LOOP; IF (header_is_valid = 0) THEN fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!'); ELSE fac.imp_writelog ( p_import_key, 'S', 'Objecten/aantal ingelezen importregels: ' || TO_CHAR (v_count_tot), '' ); fac.imp_writelog ( p_import_key, 'S', 'Objecten/aantal ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_import), '' ); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces objecten afgebroken! regel:' || v_file_index); END fac_import_ins2; / CREATE OR REPLACE PROCEDURE fac_update_ins2 (p_import_key IN NUMBER) AS v_errormsg VARCHAR2 (1000) := '-'; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (200); -- SUBPROC PROCEDURE add_kostensoort (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT prs_kostensoort_upper, MAX (prs_kostensoort_omschrijving) prs_kostensoort_omschrijving FROM ( SELECT UPPER (ins_discipline_kostensoort) prs_kostensoort_upper, MAX (ins_discipline_kostensoort) prs_kostensoort_omschrijving FROM fac_imp_ins WHERE ins_discipline_kostensoort IS NOT NULL GROUP BY UPPER (ins_discipline_kostensoort) UNION ALL SELECT UPPER (res_discipline_kostensoort) prs_kostensoort_upper, MAX (res_discipline_kostensoort) prs_kostensoort_omschrijving FROM fac_imp_ins WHERE reserveerbaar = 1 AND res_discipline_kostensoort IS NOT NULL GROUP BY UPPER (res_discipline_kostensoort)) GROUP BY prs_kostensoort_upper; v_kostensoort_key NUMBER (10); ccount NUMBER (10); v_count_tot NUMBER (10); v_count_update NUMBER (10); BEGIN v_count_tot := 0; v_count_update := 0; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_errormsg := 'Fout bij toevoegen kostensoort [' || rec.prs_kostensoort_omschrijving || ']'; SELECT COUNT ( * ) INTO ccount FROM prs_kostensoort WHERE TRIM (prs_kostensoort_upper) = rec.prs_kostensoort_upper; IF ccount = 0 THEN INSERT INTO prs_kostensoort (prs_kostensoort_oms) VALUES (rec.prs_kostensoort_omschrijving); v_count_update := v_count_update + 1; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Kostensoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'Kostensoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update), ''); COMMIT; END; -- SUBPROC PROCEDURE add_insdiscipline (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper, UPPER (ins_discipline_kostensoort) ins_kostensoort_upper, MAX (ins_discipline_omschrijving) ins_discipline_omschrijving FROM fac_imp_ins GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_discipline_kostensoort); v_discipline_key NUMBER (10); v_kostensoort_key NUMBER (10); ccount NUMBER (10); v_count_tot NUMBER (10); v_count_update NUMBER (10); BEGIN v_count_tot := 0; v_count_update := 0; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_errormsg := 'Fout bij toevoegen INS-discipline [' || rec.ins_discipline_omschrijving || ']'; SELECT COUNT ( * ) INTO ccount FROM ins_tab_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS' AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper; IF ccount = 0 THEN IF rec.ins_kostensoort_upper IS NULL THEN v_kostensoort_key := NULL; ELSE SELECT prs_kostensoort_key INTO v_kostensoort_key FROM prs_kostensoort WHERE TRIM (prs_kostensoort_upper) = rec.ins_kostensoort_upper; END IF; INSERT INTO ins_tab_discipline (ins_discipline_module, ins_discipline_omschrijving, ins_discipline_min_level, ins_discipline_kpnverplicht, prs_kostensoort_key) VALUES ('INS', SUBSTR (rec.ins_discipline_omschrijving, 1, 60), 1, 0, v_kostensoort_key) RETURNING ins_discipline_key INTO v_discipline_key; INSERT INTO ins_disc_params (ins_discipline_key, ins_disc_params_type) VALUES (v_discipline_key, 0); v_count_update := v_count_update + 1; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'INS-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'INS-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update), ''); COMMIT; END; -- SUBPROC PROCEDURE add_resdiscipline (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT UPPER (res_discipline_omschrijving) res_discipline_upper, UPPER (res_discipline_kostensoort) res_kostensoort_upper, MAX (res_discipline_omschrijving) res_discipline_omschrijving FROM fac_imp_ins WHERE reserveerbaar = 1 GROUP BY UPPER (res_discipline_omschrijving), UPPER (res_discipline_kostensoort); v_discipline_key NUMBER (10); v_kostensoort_key NUMBER (10); ccount NUMBER (10); v_count_tot NUMBER (10); v_count_update NUMBER (10); BEGIN v_count_tot := 0; v_count_update := 0; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_errormsg := 'Fout bij toevoegen RES-discipline [' || rec.res_discipline_omschrijving || ']'; SELECT COUNT ( * ) INTO ccount FROM ins_tab_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'RES' AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.res_discipline_upper; IF ccount = 0 THEN IF rec.res_kostensoort_upper IS NULL THEN v_kostensoort_key := NULL; ELSE SELECT prs_kostensoort_key INTO v_kostensoort_key FROM prs_kostensoort WHERE TRIM (prs_kostensoort_upper) = rec.res_kostensoort_upper; END IF; INSERT INTO ins_tab_discipline (ins_discipline_module, ins_discipline_omschrijving, ins_discipline_min_level, ins_discipline_kpnverplicht, prs_kostensoort_key) VALUES ('RES', SUBSTR (rec.res_discipline_omschrijving, 1, 60), 1, 0, v_kostensoort_key) RETURNING ins_discipline_key INTO v_discipline_key; INSERT INTO res_disc_params (res_ins_discipline_key) VALUES (v_discipline_key); v_count_update := v_count_update + 1; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'RES-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'RES-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update), ''); COMMIT; END; -- SUBPROC PROCEDURE add_srtgroep (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper, UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper, MAX (ins_discipline_omschrijving) ins_discipline_omschrijving, MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving FROM fac_imp_ins GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_srtgroep_omschrijving); v_discipline_key NUMBER (10); ccount NUMBER (10); v_count_tot NUMBER (10); v_count_update NUMBER (10); BEGIN v_count_tot := 0; v_count_update := 0; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_errormsg := 'Fout bij bepalen discipline'; SELECT ins_discipline_key INTO v_discipline_key FROM ins_tab_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS' AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper; v_errormsg := 'Fout bij toevoegen groepsoort [' || rec.ins_srtgroep_omschrijving || '] '; SELECT COUNT ( * ) INTO ccount FROM ins_srtgroep WHERE ins_srtgroep_verwijder IS NULL AND ins_srtgroep_module = 'INS' AND ins_discipline_key = v_discipline_key AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper; IF ccount = 0 THEN INSERT INTO ins_srtgroep (ins_discipline_key, ins_srtgroep_module, ins_srtgroep_omschrijving) VALUES (v_discipline_key, 'INS', SUBSTR (TRIM (rec.ins_srtgroep_omschrijving), 1, 60)); v_count_update := v_count_update + 1; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Groepsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'Groepsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update), ''); COMMIT; END; -- SUBPROC PROCEDURE add_srtdeel (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper, UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper, UPPER (ins_srtdeel_code) ins_srtdeel_code_upper, UPPER (ins_srtdeel_omschrijving) ins_srtdeel_upper, MAX (ins_discipline_omschrijving) ins_discipline_omschrijving, MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving, MAX (ins_srtdeel_code) ins_srtdeel_code, MAX (ins_srtdeel_omschrijving) ins_srtdeel_omschrijving FROM fac_imp_ins GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_srtgroep_omschrijving), UPPER (ins_srtdeel_code), UPPER (ins_srtdeel_omschrijving); v_discipline_key NUMBER (10); v_srtgroep_key NUMBER (10); ccount NUMBER (10); v_count_tot NUMBER (10); v_count_update NUMBER (10); BEGIN v_count_tot := 0; v_count_update := 0; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_errormsg := 'Fout bij bepalen discipline'; SELECT ins_discipline_key INTO v_discipline_key FROM ins_tab_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS' AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper; v_errormsg := 'Fout bij bepalen groepsoort'; SELECT ins_srtgroep_key INTO v_srtgroep_key FROM ins_srtgroep WHERE ins_srtgroep_verwijder IS NULL AND ins_srtgroep_module = 'INS' AND ins_discipline_key = v_discipline_key AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper; v_errormsg := 'Fout bij toevoegen objectsoort [' || rec.ins_srtdeel_omschrijving || ']'; SELECT COUNT ( * ) INTO ccount FROM ins_srtdeel WHERE ins_srtdeel_verwijder IS NULL AND ins_srtdeel_module = 'INS' AND ins_srtgroep_key = v_srtgroep_key AND TRIM (ins_srtdeel_upper) = rec.ins_srtdeel_upper; IF ccount = 0 THEN -- binding 17 betekent ruimtegebonden of persoonsgebonden INSERT INTO ins_srtdeel (ins_srtgroep_key, ins_srtdeel_module, ins_srtdeel_code, ins_srtdeel_omschrijving, ins_srtdeel_binding) VALUES (v_srtgroep_key, 'INS', rec.ins_srtdeel_code, rec.ins_srtdeel_omschrijving, 17); v_count_update := v_count_update + 1; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Objectsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'Objectsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update), ''); COMMIT; END; -- SUBPROC -- p_srtkenmerkgroepwaarde = '234|1=37-ZB-DR' -- Ofwel: srtkenmerk_key|groep=waarde PROCEDURE upsert_inskenmerk (p_deel_key IN NUMBER, p_srtkenmerkgroepwaarde IN VARCHAR2) AS v_kenmerk_key NUMBER; v_srtkenmerk_key NUMBER; v_groep NUMBER; v_waarde VARCHAR(4000); v_srtkenmerk_type VARCHAR2 (1); ccount NUMBER; v_objectnaam VARCHAR2 (30); v_kolomnaam VARCHAR2 (30); v_kolomtxt VARCHAR2 (30); sql_stmt VARCHAR2 (1000); v_kenmerkdeel_key NUMBER; l_cursor_1 INTEGER; l_rowsprocessed NUMBER DEFAULT 0; BEGIN IF p_srtkenmerkgroepwaarde IS NOT NULL THEN v_errormsg := 'Fout bij bepalen kenmerk van soort [' || p_srtkenmerkgroepwaarde || ']'; v_srtkenmerk_key := fac.safe_to_number ( SUBSTR (p_srtkenmerkgroepwaarde, 1, INSTR (p_srtkenmerkgroepwaarde, '|') - 1)); v_groep := fac.safe_to_number ( SUBSTR (p_srtkenmerkgroepwaarde, INSTR (p_srtkenmerkgroepwaarde, '|') + 1, INSTR (p_srtkenmerkgroepwaarde, '=') - 1 - INSTR (p_srtkenmerkgroepwaarde, '|'))); v_waarde := SUBSTR (p_srtkenmerkgroepwaarde, INSTR (p_srtkenmerkgroepwaarde, '=') + 1); SELECT k.ins_kenmerk_key, sk.ins_srtkenmerk_kenmerktype INTO v_kenmerk_key, v_srtkenmerk_type FROM ins_deel d, ins_srtdeel sd, ins_srtgroep sg, ins_v_aanwezigkenmerk k, ins_v_aanwezigsrtkenmerk sk WHERE d.ins_deel_key = p_deel_key AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = sg.ins_srtgroep_key AND k.ins_srtkenmerk_key = v_srtkenmerk_key AND k.ins_kenmerk_groep = v_groep AND ( (k.ins_srtinstallatie_key = sd.ins_srtdeel_key AND k.ins_kenmerk_niveau = 'S') OR (k.ins_srtinstallatie_key = sg.ins_srtgroep_key AND k.ins_kenmerk_niveau = 'G') OR (k.ins_srtinstallatie_key = sg.ins_discipline_key AND k.ins_kenmerk_niveau = 'D')) AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key; IF v_waarde IS NOT NULL THEN IF v_srtkenmerk_type IN ('R', 'S') THEN v_errormsg := 'Fout bij bepalen eigen tabel'; SELECT COUNT ( * ) INTO ccount FROM ins_srtkenmerk sk, fac_kenmerkdomein d WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key AND d.fac_usrtab_key IS NOT NULL; v_errormsg := 'Fout bij bepalen nieuwe waarde [' || v_waarde || ']'; IF ccount = 1 THEN -- Eigen tabel SELECT TO_CHAR (ud.fac_usrdata_key) INTO v_waarde FROM ins_srtkenmerk sk, fac_kenmerkdomein d, fac_v_aanwezigusrdata ud WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key AND d.fac_usrtab_key = ud.fac_usrtab_key AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (v_waarde); ELSE -- FACILITOR view/tabel SELECT d.fac_kenmerkdomein_objectnaam, d.fac_kenmerkdomein_kolomnaam, d.fac_kenmerkdomein_kolomtxt INTO v_objectnaam, v_kolomnaam, v_kolomtxt FROM ins_srtkenmerk sk, fac_kenmerkdomein d WHERE sk.ins_srtkenmerk_key = v_srtkenmerk_key AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key AND d.fac_usrtab_key IS NULL; sql_stmt := 'SELECT MAX (' || v_kolomnaam || ') FROM ' || v_objectnaam || ' WHERE UPPER (TRIM (' || v_kolomtxt || ')) = UPPER (:pwaarde)'; l_cursor_1 := DBMS_SQL.open_cursor; DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native); DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', v_waarde); DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255); l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1); DBMS_SQL.column_value (l_cursor_1, 1, v_waarde); DBMS_SQL.close_cursor(l_cursor_1); END IF; ELSE -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam) NULL; -- v_waarde := p_waarde; END IF; v_errormsg := 'Fout bij bepalen huidige waarde'; SELECT COUNT ( * ), MAX (ins_kenmerkdeel_key) INTO ccount, v_kenmerkdeel_key FROM ins_v_aanwezigkenmerkdeel WHERE ins_deel_key = p_deel_key AND ins_kenmerk_key = v_kenmerk_key; IF v_srtkenmerk_type = 'N' -- Alleen voor numerieke waarden de decimale komma vervangen door punt. THEN v_waarde := REPLACE (v_waarde, ',', '.'); END IF; IF ccount = 0 THEN v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']'; INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde) VALUES (p_deel_key, v_kenmerk_key, v_waarde); ELSE v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']'; UPDATE ins_kenmerkdeel SET ins_kenmerkdeel_waarde = v_waarde WHERE ins_kenmerkdeel_key = v_kenmerkdeel_key; END IF; ELSE -- Verwijder kenmerken die als bestaan maar met de nieuwe import leeg zijn. DELETE ins_kenmerkdeel WHERE ins_kenmerk_key = v_kenmerk_key AND ins_deel_key = p_deel_key; END IF; END IF; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'upsert_inskenmerk'); END; -- SUBPROC PROCEDURE add_deel (p_import_key IN NUMBER) AS CURSOR c1 IS SELECT ins_discipline_omschrijving, ins_srtgroep_omschrijving, ins_srtdeel_code, ins_srtdeel_omschrijving, ins_deel_omschrijving, ins_deel_opmerking, alg_locatie_code, alg_gebouw_code, alg_verdieping_volgnr, alg_ruimte_nr, reserveerbaar, res_discipline_omschrijving, res_deel_eenheid, res_deel_prijs, res_deel_alg_level, prs_perslid_matchcode, prs_perslid_matchwaarde, ins_kenmerkwaarde1, ins_kenmerkwaarde2, ins_kenmerkwaarde3, ins_kenmerkwaarde4, ins_kenmerkwaarde5, ins_kenmerkwaarde6, ins_kenmerkwaarde7, ins_kenmerkwaarde8, ins_kenmerkwaarde9, ins_kenmerkwaarde10, ins_kenmerkwaarde11, ins_kenmerkwaarde12, ins_kenmerkwaarde13, ins_kenmerkwaarde14, ins_kenmerkwaarde15, ins_kenmerkwaarde16, ins_kenmerkwaarde17, ins_kenmerkwaarde18, ins_kenmerkwaarde19, ins_kenmerkwaarde20, ins_deel_aanmaak, ins_deel_vervaldatum, ins_deel_aantal FROM fac_imp_ins; v_discipline_key NUMBER (10); v_rdiscipline_key NUMBER (10); v_srtgroep_key NUMBER (10); v_srtdeel_key NUMBER (10); v_locatie_key NUMBER (10); v_gebouw_key NUMBER (10); v_verdieping_key NUMBER (10); v_ruimte_key NUMBER (10); v_matchkolom VARCHAR2 (255); sql_stmt VARCHAR2 (1000); v_ruimte_type VARCHAR2 (10); v_deel_key NUMBER (10); ccount NUMBER (10); pcount NUMBER (10); v_count_tot NUMBER (10); v_count_insnew NUMBER (10); v_count_insupd NUMBER (10); v_count_resnew NUMBER (10); v_srtnoti_code VARCHAR2 (6); l_cursor_1 INTEGER; l_rowsprocessed NUMBER DEFAULT 0; v_ins_deel_aanmaak_d DATE; v_ins_deel_vervaldatum_d DATE; v_ins_deel_aantal_n NUMBER(8,2); BEGIN v_count_tot := 0; v_count_insnew := 0; v_count_insupd := 0; v_count_resnew := 0; v_aanduiding := ''; FOR rec IN c1 LOOP BEGIN v_count_tot := v_count_tot + 1; v_ins_deel_aanmaak_d := rec.ins_deel_aanmaak; v_ins_deel_vervaldatum_d := rec.ins_deel_vervaldatum; v_ins_deel_aantal_n := rec.ins_deel_aantal; v_aanduiding := '[' || rec.ins_discipline_omschrijving || '|' || rec.ins_srtgroep_omschrijving || '|' || rec.ins_srtdeel_code || '|' || rec.ins_srtdeel_omschrijving || '|' || rec.ins_deel_omschrijving || '] '; v_errormsg := 'Fout bij bepalen discipline'; SELECT ins_discipline_key INTO v_discipline_key FROM ins_tab_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS' AND UPPER (TRIM (ins_discipline_omschrijving)) = UPPER (rec.ins_discipline_omschrijving); v_errormsg := 'Fout bij bepalen groepsoort'; SELECT ins_srtgroep_key INTO v_srtgroep_key FROM ins_srtgroep WHERE ins_srtgroep_verwijder IS NULL AND ins_srtgroep_module = 'INS' AND ins_discipline_key = v_discipline_key AND TRIM (ins_srtgroep_upper) = UPPER (rec.ins_srtgroep_omschrijving); v_errormsg := 'Fout bij bepalen objectsoort'; SELECT ins_srtdeel_key INTO v_srtdeel_key FROM ins_srtdeel WHERE ins_srtdeel_verwijder IS NULL AND ins_srtdeel_module = 'INS' AND ins_srtgroep_key = v_srtgroep_key AND TRIM (UPPER(ins_srtdeel_code)) = UPPER (rec.ins_srtdeel_code) AND TRIM (ins_srtdeel_upper) = UPPER (rec.ins_srtdeel_omschrijving); v_locatie_key := NULL; IF rec.alg_locatie_code IS NOT NULL THEN -- ruimtegebonden object v_errormsg := 'Fout bij bepalen locatie [' || rec.alg_locatie_code || ']'; SELECT alg_locatie_key INTO v_locatie_key FROM alg_v_aanweziglocatie WHERE UPPER (TRIM (alg_locatie_code)) = UPPER (rec.alg_locatie_code); v_errormsg := 'Fout bij bepalen gebouw [' || rec.alg_gebouw_code || ']'; SELECT alg_gebouw_key INTO v_gebouw_key FROM alg_v_aanweziggebouw WHERE alg_locatie_key = v_locatie_key AND UPPER (TRIM (alg_gebouw_code)) = UPPER (rec.alg_gebouw_code); v_errormsg := 'Fout bij bepalen verdieping [' || rec.alg_verdieping_volgnr || ']'; SELECT alg_verdieping_key INTO v_verdieping_key FROM alg_v_aanwezigverdieping WHERE alg_gebouw_key = v_gebouw_key AND alg_verdieping_volgnr = rec.alg_verdieping_volgnr; v_errormsg := 'Fout bij bepalen ruimte [' || rec.alg_ruimte_nr || ']'; SELECT alg_ruimte_key INTO v_ruimte_key FROM alg_v_aanwezigruimte WHERE alg_verdieping_key = v_verdieping_key AND TRIM (alg_ruimte_upper_nr) = UPPER (rec.alg_ruimte_nr); v_ruimte_type := 'R'; -- ruimtegebonden objecten hebben een unieke ID binnen locatie SELECT COUNT ( * ) INTO ccount FROM ins_v_aanwezigdeel WHERE ins_deel_module = 'INS' AND ins_srtdeel_key = v_srtdeel_key AND ins_alg_ruimte_type = v_ruimte_type -- R AND ins_alg_locatie_key = v_locatie_key AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving); ELSE -- persoonsgebonden object v_matchkolom := ''; CASE rec.prs_perslid_matchcode WHEN '1' THEN v_matchkolom := 'PRS_PERSLID_EMAIL'; WHEN '10' THEN v_matchkolom := 'PRS_PERSLID_EMAIL'; WHEN '2' THEN v_matchkolom := 'PRS_PERSLID_OSLOGIN'; WHEN '20' THEN v_matchkolom := 'PRS_PERSLID_OSLOGIN'; WHEN '3' THEN v_matchkolom := 'PRS_PERSLID_KEY'; WHEN '30' THEN v_matchkolom := 'PRS_PERSLID_KEY'; WHEN '4' THEN v_matchkolom := 'PRS_PERSLID_NR'; WHEN '40' THEN v_matchkolom := 'PRS_PERSLID_NR'; WHEN '5' THEN v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM'; WHEN '50' THEN v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM'; ELSE -- voor developers only: indien geen code wordt gebruikt, -- kan als persoonmatchcode een kolom uit de perslid-tabel -- worden ingevoerd, bijvoorbeeld: prs_perslid_oslogin2 v_matchkolom := rec.prs_perslid_matchcode; END CASE; v_errormsg := 'Fout bij bepalen persoon [' || rec.prs_perslid_matchwaarde || ']'; sql_stmt := 'SELECT MIN (prs_perslid_key), COUNT (prs_perslid_key) ' || ' FROM prs_v_aanwezigperslid ' || ' WHERE UPPER (' || v_matchkolom || ') = UPPER (:pwaarde) ' || 'GROUP BY prs_perslid_key'; --dbms_output.put_line(rec.prs_perslid_matchwaarde); l_cursor_1 := DBMS_SQL.open_cursor; DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native); DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', rec.prs_perslid_matchwaarde); DBMS_SQL.define_column(l_cursor_1, 1, v_ruimte_key); DBMS_SQL.define_column(l_cursor_1, 2, pcount); l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1); -- Bij no rows gaat-ie naar de exception. Moet daar dan nog een cursor dicht?? DBMS_SQL.column_value (l_cursor_1, 1, v_ruimte_key); DBMS_SQL.column_value (l_cursor_1, 2, pcount); DBMS_SQL.close_cursor(l_cursor_1); --dbms_output.put_line(pcount); IF pcount != 1 THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Kan persoon niet 1-duidig bepalen'); END IF; v_errormsg := 'Fout bij bepalen type koppeling'; IF rec.prs_perslid_matchcode in ('10','20','30','40','50') THEN v_ruimte_type := 'A' ; -- Koppeling aan Afdeling van desbetreffende SELECT prs_afdeling_key INTO v_ruimte_key FROM prs_v_aanwezigperslid WHERE prs_perslid_key = v_ruimte_key; ELSE v_ruimte_type := 'P' ; END IF; -- persoonsgebonden objecten hebben een unieke ID SELECT COUNT ( * ) INTO ccount FROM ins_v_aanwezigdeel WHERE ins_deel_module = 'INS' AND ins_srtdeel_key = v_srtdeel_key AND ins_alg_ruimte_type = v_ruimte_type -- P AND ins_alg_locatie_key IS NULL AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving); END IF; IF ccount = 0 THEN -- toevoegen object! v_errormsg := 'Fout bij toevoegen INS-object'; INSERT INTO ins_deel (ins_discipline_key, ins_srtdeel_key, ins_deel_module, ins_deel_omschrijving, ins_deel_opmerking, ins_alg_ruimte_key, ins_alg_ruimte_type, ins_alg_locatie_key, ins_deel_aanmaak, ins_deel_vervaldatum, ins_deel_aantal) VALUES (v_discipline_key, v_srtdeel_key, 'INS', rec.ins_deel_omschrijving, rec.ins_deel_opmerking, v_ruimte_key, v_ruimte_type, v_locatie_key, v_ins_deel_aanmaak_d, v_ins_deel_vervaldatum_d, v_ins_deel_aantal_n) RETURNING ins_deel_key INTO v_deel_key; -- Overslaan als reserveerbaar en geen RES-discipline of andersom, -- dus verder geen controle op eventuele inconsistentie! IF (rec.reserveerbaar = 1 AND rec.res_discipline_omschrijving IS NOT NULL) THEN v_errormsg := 'Fout bij bepalen RES-discipline [' || rec.res_discipline_omschrijving || ']'; SELECT ins_discipline_key INTO v_rdiscipline_key FROM res_discipline WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'RES' AND UPPER (TRIM (ins_discipline_omschrijving)) = UPPER (rec.res_discipline_omschrijving); v_errormsg := 'Fout bij toevoegen RES-object'; INSERT INTO res_deel (res_ins_deel_key, res_deel_omschrijving, res_deel_opmerking, res_deel_eenheid, res_deel_prijs, res_discipline_key, res_deel_alg_level) VALUES (v_deel_key, rec.ins_deel_omschrijving, rec.ins_deel_opmerking, rec.res_deel_eenheid, rec.res_deel_prijs, v_rdiscipline_key, rec.res_deel_alg_level); v_count_resnew := v_count_resnew + 1; END IF; v_srtnoti_code := 'INSNEW'; v_count_insnew := v_count_insnew + 1; ELSE -- bijwerken object! v_errormsg := 'Fout bij bepalen INS-object'; SELECT ins_deel_key INTO v_deel_key FROM ins_v_aanwezigdeel WHERE ins_deel_module = 'INS' AND ins_srtdeel_key = v_srtdeel_key AND ins_alg_ruimte_type = v_ruimte_type -- R/P AND COALESCE (ins_alg_locatie_key, -1) = COALESCE (v_locatie_key, -1) -- gevuld/NULL AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving); v_srtnoti_code := 'INSUPD'; v_count_insupd := v_count_insupd + 1; END IF; -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden -- (bijwerken kan wel, maar wissen dus niet)! ins_kenmerkwaarde1 upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde1); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde2); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde3); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde4); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde5); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde6); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde7); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde8); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde9); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde10); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde11); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde12); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde13); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde14); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde15); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde16); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde17); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde18); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde19); upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde20); fac.trackaction (v_srtnoti_code, v_deel_key, sys_context('USERENV', 'CLIENT_IDENTIFIER'), NULL, NULL); COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, ''); COMMIT; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'INS-objecten/aantal ingelezen: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'INS-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_insnew), ''); fac.imp_writelog (p_import_key, 'S', 'INS-objecten/aantal bijgewerkt: ' || TO_CHAR (v_count_insupd), ''); fac.imp_writelog (p_import_key, 'S', 'RES-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_resnew), ''); COMMIT; END; -- MAIN BEGIN add_kostensoort (p_import_key); add_insdiscipline (p_import_key); add_resdiscipline (p_import_key); add_srtgroep (p_import_key); add_srtdeel (p_import_key); add_deel (p_import_key); EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Importproces objecten afgebroken!'); END fac_update_ins2; / ------ payload end ------ SET DEFINE OFF BEGIN adm.systrackscriptId ('$Id$', 0); END; / COMMIT; SET ECHO OFF SPOOL OFF SET DEFINE ON PROMPT Logfile of this upgrade is: &fcltlogfile