#ifdef CAD // 22-05-1998 KTH /* CAD_VIE.SRC * $Revision$ * $Id$ */ CREATE_VIEW(cad_v_cad_aanwezigtekening,0) AS SELECT * FROM cad_tekening C_T WHERE cad_tekening_verwijder IS NULL AND (C_T.ins_discipline_key IN (SELECT ins_discipline_key FROM ins_discipline) OR C_T.ins_discipline_key IS NULL); /* mapping van labels in tekening met ruimtenr in database * let op: de applicatie kan van een specifieke variant gebruikmaken * deze heet dan XXXX_V_SYNC.. */ CREATE_VIEW(cad_v_sync_alg_ruimte,0) (alg_ruimte_key, alg_verdieping_key, cadlabel ) AS SELECT R.alg_ruimte_key, R.alg_verdieping_key, R.alg_ruimte_nr FROM alg_v_aanwezigruimte R; CREATE_VIEW(cad_v_sync_alg_terrein,0) (alg_terreinsector_key, alg_locatie_key, cadlabel ) AS SELECT t.alg_terreinsector_key, t.alg_locatie_key, t.alg_terreinsector_code FROM alg_v_aanwezigterreinsector t; /* Standard thema/label views */ // Zowel label-views als thema-views hebben de kolommen alg_ruimte_key en waarde // Feature: Sommige thema views kunnen updatable zijn! // In dat geval moet de kolom waarde_key ook aanwezig zijn, en zal de code met // een UPDATE (drop) of een INSERT (shift-drop) opereren. Om die te ondersteunen // zal meestal een INSTEAD OF trigger moeten worden gedefinieerd, dat moet // dan ook hier gebeuren. Let op de naamgevingsconventies: cad_v_thema_x // heeft trigger cad_t_thema_x_i_iu (of _i_i resp _i_u) -- FSN#14942: afdelingen zijn geen bewoners meer CREATE_VIEW(cad_v_label_bewoner, 0) (alg_ruimte_key, waarde) AS SELECT prs_w.prs_alg_ruimte_key, prs_p.prs_perslid_naam_friendly FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p WHERE prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key AND prs_pw.prs_perslid_key IS NOT NULL AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key AND prs_w.prs_werkplek_virtueel = 0 UNION SELECT prs_w.prs_alg_ruimte_key, '['||lcl.l('lcl_free')||']' FROM prs_werkplek prs_w, prs_v_werkplek_bezetting prs_wb WHERE prs_w.prs_werkplek_key = prs_wb.prs_werkplek_key AND prs_w.prs_werkplek_virtueel = 0 AND prs_wb.prs_werkplek_bezetting < 100; -- Toont alle afdelingen die aan een ruimte gekoppeld zijn CREATE_VIEW(cad_v_label_afdelingen, 0) (alg_ruimte_key, waarde) AS SELECT alg_ruimte_key, prs_afdeling_naam FROM prs_ruimteafdeling ra, prs_v_afdeling d WHERE ra.prs_afdeling_key = d.prs_afdeling_key; -- Toont de afdeling die aan een ruimte gekoppeld is, en Meerdere! indien meerdere. CREATE_VIEW(cad_v_thema_afdelingen, 0) (alg_ruimte_key, waarde, waarde_key) AS SELECT x.alg_ruimte_key, DECODE (x.aantal, 1, SUBSTR (x.sp, 1, 60), 'Meerdere!'), DECODE (x.aantal, 1, x.sp_key, NULL) FROM (SELECT ra.alg_ruimte_key, MIN (d.prs_afdeling_naam) sp, MIN (d.prs_afdeling_key) sp_key, COUNT (ra.prs_afdeling_key) aantal FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling d WHERE ra.prs_afdeling_key = d.prs_afdeling_key GROUP BY ra.alg_ruimte_key) x; -- Update is: oude situatie weg, nieuwe wordt gedefinieerd. -- Insert is: toevoegen aan oude situatie CREATE_TRIGGER(cad_t_thema_afdelingen_i_iu) INSTEAD OF INSERT OR UPDATE ON cad_v_thema_afdelingen BEGIN IF UPDATING -- oude weggooien THEN DELETE FROM prs_ruimteafdeling WHERE alg_ruimte_key = :new.alg_ruimte_key AND prs_afdeling_key <> :new.waarde_key; END IF; BEGIN INSERT INTO prs_ruimteafdeling (alg_ruimte_key, prs_afdeling_key) VALUES (:new.alg_ruimte_key, :new.waarde_key); EXCEPTION WHEN DUP_VAL_ON_INDEX -- Hij was al aanwezig THEN NULL; END; END; / -- Toont de huidige afdeling die aan een ruimte gekoppeld is, en Meerdere! indien meerdere. -- Ondersteunt dus (wel) bezettingsintervallen/historie. Niet sleepbaar want geen triviaal antwoord op -- welke periode je dan moet doen (nu tot onbepaald zou kunnen, en dan moet je dus de huidige periode sluiten) -- Gebruik prs_afdeling_naam6 formattering (ongeacht S(prs_dep_string)) CREATE_VIEW(cad_v_thema_huidigeafdelingen, 0) ( alg_ruimte_key , waarde ) AS SELECT x.alg_ruimte_key, DECODE (x.aantal, 1, SUBSTR (x.sp, 1, 60), 'Meerdere!') FROM (SELECT ra.alg_ruimte_key, MIN (d.prs_afdeling_naam || '-' || d.prs_afdeling_omschrijving) sp, MIN (d.prs_afdeling_key) sp_key, COUNT (ra.prs_afdeling_key) aantal FROM prs_v_aanwezigruimteafdeling ra, prs_v_aanwezigafdeling d WHERE ra.prs_afdeling_key = d.prs_afdeling_key AND SYSDATE BETWEEN ra.prs_ruimteafdeling_ingangsdatum AND COALESCE (ra.prs_ruimteafdeling_einddatum, TRUNC (SYSDATE) + 1) GROUP BY ra.alg_ruimte_key) x; // De afdelingsbezetting maar dan gebaseerd op de afdelingen // van de de personen die op de werkplekken zitten CREATE_VIEW(cad_v_thema_prsafdelingen, 0) (alg_ruimte_key, waarde) AS SELECT wp.prs_alg_ruimte_key, d.prs_afdeling_naam FROM prs_werkplek wp, prs_perslidwerkplek pwp, prs_perslid p, prs_afdeling d WHERE d.prs_afdeling_key = p.prs_afdeling_key AND pwp.prs_perslid_key = p.prs_perslid_key AND pwp.prs_werkplek_key = wp.prs_werkplek_key; CREATE_VIEW(cad_v_label_bewonerwp, 0) (alg_ruimte_key,waarde) AS SELECT DISTINCT prs_alg_ruimte_key, waarde FROM (SELECT prs_w.prs_alg_ruimte_key, CHR (1) || prs_w.prs_werkplek_volgnr || ' ' || prs_p.prs_perslid_naam_friendly || ' ' || TO_CHAR (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0)) || '%' waarde FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p WHERE prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key AND prs_pw.prs_perslid_key IS NOT NULL AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key UNION SELECT prs_w.prs_alg_ruimte_key, CHR (1) || prs_w.prs_werkplek_volgnr || ' '|| initcap(lcl.l('lcl_free'))||' ' || TO_CHAR (100 - NVL (SUM (prs_wb.prs_perslidwerkplek_bezetting), 0)) || '%' FROM prs_werkplek prs_w, prs_perslidwerkplek prs_wb WHERE prs_w.prs_werkplek_key = prs_wb.prs_werkplek_key(+) GROUP BY prs_w.prs_alg_ruimte_key, prs_w.prs_werkplek_key, prs_w.prs_werkplek_volgnr HAVING SUM (NVL (prs_wb.prs_perslidwerkplek_bezetting, 0)) < 100) data; CREATE_VIEW(CAD_V_THEMA_AANTALWP, 0) (ALG_RUIMTE_KEY, WAARDE) AS SELECT wp.prs_alg_ruimte_key, COUNT (*) FROM PRS_WERKPLEK wp GROUP BY prs_alg_ruimte_key; / CREATE_VIEW(cad_v_label_werkplekken,0) (alg_ruimte_key, waarde, highlight) AS SELECT prs_alg_ruimte_key, CHR (1) || prs_werkplek_volgnr || ' (' || TO_CHAR (wpopp, 'FM9990.0') || ' m2' || DECODE (bez, 100, '', ' '||TO_CHAR (bez) || '%') || ')' waarde, DECODE (SIGN (bez - 100), 1, 2, 0) highlight FROM ( SELECT prs_w.prs_alg_ruimte_key, prs_w.prs_werkplek_volgnr, SUM (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0)) bez, wpopp FROM prs_werkplek prs_w, prs_v_werkplek_oppervlakte pwo, prs_perslidwerkplek prs_pw WHERE prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key(+) AND pwo.prs_werkplek_key(+) = prs_w.prs_werkplek_key GROUP BY prs_w.prs_alg_ruimte_key, prs_w.prs_werkplek_volgnr, 'prs_werkplek', prs_w.prs_werkplek_key, wpopp); CREATE_VIEW(CAD_V_THEMA_WPOPP, 0) (alg_ruimte_key, waarde) AS SELECT wp.prs_alg_ruimte_key, r.alg_ruimte_bruto_vloeropp / COUNT (prs_werkplek_key) FROM PRS_WERKPLEK wp, ALG_RUIMTE r WHERE wp.prs_alg_ruimte_key = r.alg_ruimte_key GROUP BY wp.prs_alg_ruimte_key, r.alg_ruimte_bruto_vloeropp / CREATE_VIEW(cad_v_thema_bezetmismatch, 0) (alg_ruimte_key, waarde) AS SELECT ra.alg_ruimte_key, 'mismatch' FROM prs_ruimteafdeling ra, prs_werkplek wp, prs_perslidwerkplek pwp, prs_perslid p WHERE pwp.prs_perslid_key = p.prs_perslid_key AND pwp.prs_werkplek_key = wp.prs_werkplek_key AND wp.prs_alg_ruimte_key = ra.alg_ruimte_key AND ra.prs_afdeling_key <> p.prs_afdeling_key; CREATE_VIEW(cad_v_label_srtruimteopp,0) (alg_ruimte_key, waarde) AS SELECT r.alg_ruimte_key, lcl.x ('alg_srtruimte_omschrijving', sr.alg_srtruimte_key, sr.alg_srtruimte_omschrijving) || DECODE (r.alg_ruimte_bruto_vloeropp, NULL, '', ' (' || r.alg_ruimte_bruto_vloeropp || ' m2)') FROM alg_v_aanwezigruimte r, alg_srtruimte sr WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key; -- Ruimtesoort CREATE_VIEW(cad_v_thema_srtruimte, 0) (alg_ruimte_key, waarde, waarde_key) AS SELECT r.alg_ruimte_key, sr.alg_srtruimte_omschrijving, // deze moet niet vertaald worden, dat regelt de programmatuur r.alg_srtruimte_key FROM alg_v_aanwezigruimte r, alg_srtruimte sr WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+); CREATE_TRIGGER(cad_t_thema_srtruimte_i_iu) INSTEAD OF INSERT OR UPDATE ON cad_v_thema_srtruimte FOR EACH ROW BEGIN UPDATE alg_ruimte SET alg_srtruimte_key = :new.waarde_key WHERE alg_ruimte_key = :new.alg_ruimte_key; END; / --Meldingen CREATE_VIEW(cad_v_thema_openmeldingen,0) (alg_ruimte_key, waarde) AS SELECT r.alg_ruimte_key, COUNT (mld_melding_key) FROM alg_ruimte r, mld_melding m WHERE m.mld_alg_onroerendgoed_keys = r.alg_ruimte_key AND m.mld_melding_status IN (2, 3, 4, 7) GROUP BY r.alg_ruimte_key; CREATE_VIEW(cad_v_label_bewoner2,0) (alg_ruimte_key, waarde) AS SELECT alg_ruimte_key, pf.prs_perslid_naam_friendly || '-' || CASE WHEN aantalwp > 1 AND norm_verband IS NOT NULL THEN norm_verband || '/' ELSE '' END || CASE WHEN p.prs_perslid_dienstverband IS NOT NULL THEN p.prs_perslid_dienstverband || '%' ELSE '' END FROM prs_v_perslid_fullnames pf, prs_perslid p, prs_v_norm_verband pnv WHERE pf.prs_perslid_key = p.prs_perslid_key AND pnv.prs_perslid_key = p.prs_perslid_key AND p.prs_perslid_verwijder IS NULL; CREATE OR REPLACE FORCE VIEW PRJ_V_CAD_LABEL_BEWONERWPE ( PRJ_WERKPLEK_KEY, WAARDE, HIGHLIGHT ) AS SELECT DISTINCT prj_werkplek_key, waarde, DECODE (prj_selectie_key, NULL, 0, 1) FROM (SELECT prj_r.prj_scenario_key, prs_w.prj_werkplek_key, prs_p.prs_perslid_naam_friendly || ': ' || TO_CHAR (NVL (prs_pw.prj_perslidwerkplek_bezetting, 0)) || '%' waarde, 'PRJ_WERKPLEK' label_soort, prs_pw.prj_werkplek_key label_key FROM prj_ruimte prj_r, prj_werkplek prs_w, (SELECT * FROM prj_perslidwerkplek WHERE prj_perslidwerkplek_verwijder IS NULL) prs_pw, prs_v_perslid_fullnames prs_p WHERE prs_w.prj_werkplek_key = prs_pw.prj_werkplek_key AND prs_pw.prs_perslid_key IS NOT NULL AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key AND prs_w.prj_ruimte_key = prj_r.prj_ruimte_key UNION SELECT -1, prs_w.prj_werkplek_key, ' Vrij: ' || TO_CHAR (100 - NVL (SUM (prs_wb.prj_perslidwerkplek_bezetting), 0)) || '%', 'PRJ_WERKPLEK', prs_w.prj_werkplek_key FROM prj_werkplek prs_w, (SELECT * FROM prj_perslidwerkplek WHERE prj_perslidwerkplek_verwijder IS NULL) prs_wb WHERE prs_w.prj_werkplek_key = prs_wb.prj_werkplek_key(+) AND prj_werkplek_verwijder IS NULL GROUP BY prs_w.prj_werkplek_key, prs_w.prj_werkplek_key, prs_w.prj_werkplek_volgnr HAVING SUM (NVL (prs_wb.prj_perslidwerkplek_bezetting, 0)) < 100) data, prj_selectie ps WHERE ps.prj_scenario_key(+) = data.prj_scenario_key AND ps.prj_selectie_tabelnaam(+) = label_soort AND ps.prj_selectie_tabelkey(+) = label_key; /* Lijstje met (ALGCAD) wijzigingen op een ruimte Kolom FAC_TRACKING_DATUM om een klantspecifieke beperking mogelijk te maken */ CREATE_VIEW(cad_v_label_track_algcad, 0) ( ALG_RUIMTE_KEY, WAARDE, FAC_TRACKING_DATUM ) AS SELECT fac_tracking_refkey, TO_CHAR (fac_tracking_datum, 'YYYY-MM') || ' ' || fac_tracking_oms || CHR (10) || '[s10][i][cd0d0d0]' || TO_CHAR (fac_tracking_datum, 'YYYY-MM-DD HH24:MI:SS') || ' ' || PP.PRS_PERSLID_NAAM_FULL, fac_tracking_datum FROM fac_srtnotificatie fs, fac_tracking fn, prs_v_perslid_fullnames_all pp WHERE fac_srtnotificatie_code = 'ALGCAD' AND fs.fac_srtnotificatie_key = fn.fac_srtnotificatie_key AND fn.prs_perslid_key = pp.prs_perslid_key(+) ORDER BY fac_tracking_refkey, fac_tracking_datum DESC; -- Nog wat basis views voor flexplekthemas CREATE_VIEW(cad_v_thema_flexplekken_totaal, 0) AS select alg_ruimte_key, vrij+bezet waarde from prs_v_flexplekken; CREATE_VIEW(cad_v_thema_flexplekken_bezet, 0) AS select alg_ruimte_key, bezet waarde from prs_v_flexplekken; -- met -1=ruimte zonder wp en -2=ruimte met wp en n=aantal beschikbare flexplekken CREATE_VIEW(cad_v_thema_flexplekken_vrij, 0) AS SELECT alg_ruimte_key, vrij waarde FROM prs_v_flexplekken UNION SELECT alg_ruimte_key, -1 FROM alg_ruimte WHERE NOT EXISTS (SELECT '' FROM prs_werkplek WHERE prs_alg_ruimte_key = alg_ruimte_key) UNION SELECT DISTINCT prs_alg_ruimte_key, -2 FROM prs_werkplek; CREATE_VIEW(cad_v_label_flexwerkers, 0) ( alg_ruimte_key, waarde ) AS SELECT prs_alg_ruimte_key alg_ruimte_key, prs_perslid_naam_full waarde FROM prs_werkplek wp, prs_perslidwerkplek pwp, prs_v_perslid_fullnames pf WHERE pwp.prs_perslid_key = pf.prs_perslid_key AND wp.prs_werkplek_key = pwp.prs_werkplek_key AND wp.prs_werkplek_type = 1; -- Een werkplekkleurenthema, flex/vast/vrij/bezet CREATE_VIEW(cad_v_thema_flexwp, 0) ( prs_werkplek_key, waarde ) AS SELECT wp.prs_werkplek_key prs_werkplek_key, MAX (CASE WHEN wp.prs_werkplek_type = 1 AND pwp.prs_perslid_key IS NULL THEN 0 WHEN wp.prs_werkplek_type = 1 AND pwp.prs_perslid_key IS NOT NULL THEN 1 WHEN wp.prs_werkplek_type = 0 AND pwp.prs_perslid_key IS NOT NULL THEN 2 WHEN wp.prs_werkplek_type = 0 AND pwp.prs_perslid_key IS NULL THEN 3 END) status FROM prs_werkplek wp, prs_perslidwerkplek pwp WHERE wp.prs_werkplek_virtueel = 0 AND pwp.prs_werkplek_key(+) = wp.prs_werkplek_key GROUP BY wp.prs_werkplek_key; -- Werkplekthema met de bezetter(s) ervan CREATE_VIEW(cad_v_label_wp_bewoner, 0) ( prs_werkplek_key, waarde ) AS SELECT DISTINCT prs_w.prs_werkplek_key, prs_p.prs_perslid_naam_friendly || CASE WHEN prs_pw.prs_perslidwerkplek_bezetting < 100 THEN ' (' || TO_CHAR (NVL (prs_pw.prs_perslidwerkplek_bezetting, 0)) || '%)' END waarde FROM prs_werkplek prs_w, prs_perslidwerkplek prs_pw, prs_v_perslid_fullnames prs_p WHERE prs_w.prs_werkplek_key = prs_pw.prs_werkplek_key AND prs_pw.prs_perslid_key IS NOT NULL AND prs_pw.prs_perslid_key = prs_p.prs_perslid_key; -- Reserveerbare ruimtes kleurenthema (waarde = aantal minuten nog vrij) CREATE_VIEW(cad_v_thema_ruimte_reservering,0) (ALG_RUIMTE_KEY, WAARDE) AS SELECT alg_ruimte_key alg_ruimte_key, COALESCE (MIN (TRUNC ( (tijdvrij) * 24 * 60) - 1), 999999) waarde -- MIN want pessimistisch FROM (SELECT rar.alg_ruimte_key, res_rsv_ruimte_van - SYSDATE tijdvrij FROM res_ruimte_opstelling rro, res_ruimte rr, res_alg_ruimte rar, res_opstelling ro, (SELECT res_ruimte_opstel_key, res_rsv_ruimte_van FROM res_v_aanwezigrsv_ruimte rrr WHERE SYSDATE BETWEEN TRUNC (res_rsv_ruimte_van) AND res_rsv_ruimte_tot) blokkerend -- vandaag en nog niet afgelopen WHERE rro.res_ruimte_key = rr.res_ruimte_key AND rro.res_opstelling_key = ro.res_opstelling_key AND rar.res_alg_ruimte_verwijder IS NULL AND rar.res_ruimte_key = rr.res_ruimte_key AND rro.res_ruimte_opstel_key = blokkerend.res_ruimte_opstel_key(+)) GROUP BY alg_ruimte_key; -- Reserveerbare ruimtes label thema, toont de ruimtenaam van -- ruimtes die reserveerbaar zijn, hetzij door een reservering, -- hetzij door een sensor -- DEZE VIEW WORDT STANDAARD GEBRUIKT ALS DEFAULT THEMA VOOR HET INFOBORD CREATE_VIEW(cad_v_label_bezetbareruimtes, 0) ( alg_ruimte_key, waarde ) AS SELECT rar.alg_ruimte_key, MIN (COALESCE(res_ruimte_friendlyname, res_ruimte_nr)) waarde FROM res_ruimte_opstelling rro, res_ruimte rr, res_alg_ruimte rar WHERE rro.res_ruimte_key = rr.res_ruimte_key AND rar.res_ruimte_key = rr.res_ruimte_key AND rar.res_alg_ruimte_verwijder IS NULL GROUP BY rar.alg_ruimte_key UNION SELECT alg_ruimte_key, alg_ruimte_nr FROM alg_ruimte r, ins_deel d, ins_srtdeel sd WHERE d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_alg_ruimte_type = 'R' AND d.ins_deel_state IS NOT NULL AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key') AND NOT EXISTS (SELECT '' FROM res_alg_ruimte WHERE alg_ruimte_key = r.alg_ruimte_key); -- Reserveerbare ruimtes label thema -- Let op: Toont *eerstvolgende* reservering als die binnen een uur begint CREATE_VIEW(cad_v_label_ruimte_reservering,0) (ALG_RUIMTE_KEY, WAARDE) AS SELECT rar.alg_ruimte_key, MAX (COALESCE(res_ruimte_friendlyname, res_ruimte_nr) || res_info.tekst) waarde FROM res_ruimte_opstelling rro, res_ruimte rr, res_alg_ruimte rar, res_opstelling ro, ( SELECT res_ruimte_opstel_key, MAX( '[br]' || TO_CHAR (res_rsv_ruimte_van, 'HH24:MI') || '-' || TO_CHAR (res_rsv_ruimte_tot, 'HH24:MI') || '[br][s50]' || prs_perslid_naam_full || '[br][s80][b]' || res_rsv_ruimte_omschrijving) tekst FROM res_v_aanwezigrsv_ruimte rrr, prs_v_perslid_fullnames pp WHERE pp.prs_perslid_key = res_rsv_ruimte_host_key AND SYSDATE BETWEEN res_rsv_ruimte_van - (1 / 24) AND res_rsv_ruimte_tot GROUP BY res_ruimte_opstel_key) res_info WHERE res_info.res_ruimte_opstel_key(+) = rro.res_ruimte_opstel_key AND rro.res_ruimte_key = rr.res_ruimte_key AND rro.res_opstelling_key = ro.res_opstelling_key AND rar.res_ruimte_key = rr.res_ruimte_key AND rar.res_alg_ruimte_verwijder IS NULL GROUP BY rar.alg_ruimte_key; -- Reserveerbare delen kleurenthema (waarde = aantal minuten nog vrij) CREATE_VIEW(cad_v_thema_deel_reservering,0) ( INS_DEEL_KEY, WAARDE ) AS SELECT ins_deel_key, COALESCE (MIN (TRUNC (tijdvrij * 24 * 60)-1), 999999) waarde -- MIN want perssimistisch FROM (SELECT res_ins_deel_key ins_deel_key, res_rsv_deel_van - SYSDATE tijdvrij FROM res_v_aanwezigdeel r, (SELECT res_deel_key, res_rsv_deel_van, res_rsv_deel_tot FROM res_v_aanwezigrsv_deel rrd WHERE SYSDATE BETWEEN TRUNC (res_rsv_deel_van) AND res_rsv_deel_tot) blokkerend -- vandaag en nog niet afgelopen WHERE r.res_deel_key = blokkerend.res_deel_key(+)) GROUP BY ins_deel_key; -- Reserveerbare delen label thema CREATE_VIEW(cad_v_label_deel_reservering,0) ( INS_DEEL_KEY, WAARDE ) AS SELECT ins_deel_key, prs_perslid_naam_full FROM ins_v_aanwezigdeel isd, (SELECT res_ins_deel_key, prs_perslid_naam_full FROM res_v_aanwezigdeel r, res_v_aanwezigrsv_deel rrd, res_rsv_ruimte rrr, prs_v_perslid_fullnames p WHERE r.res_deel_key = rrd.res_deel_key AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key AND SYSDATE BETWEEN res_rsv_deel_van - 1 / 24 / 60 AND res_rsv_deel_tot - 1 / 24 / 60) res -- NU bezig WHERE isd.ins_deel_key = res.res_ins_deel_key(+); -- Deze core-view wordt direct als label-thema (13) gebruikt, maar kan ook als basis voor een alternatief via -- create view myview (fclt_f_datum, ins_deel_key, waarde) as select fclt_f_datum, ins_deel_key, waarde3 from cad_v_label_deel_res_datum. -- Kijkt nu hard maximaal 42 dagen tov van nu vooruit, wat hopelijk even genoeg is voor alle situaties -- De verschillende waardevarianten zijn presentatie alternatieven, evt meerdere regels onder elkaar -- Merk op dat waarde_html ook een class meeneemt, waarmee in CSS gestyld kan worden -- Voor 2d -- waarde1: Naam (van-tot) -- waarde: van Naam [default] -- waarde3: Naam -- Voor 3d -- waarde_html: van Naam [default] -- waarde_html2: Naam CREATE_VIEW(cad_v_label_deel_res_datum, 0) ( fclt_f_datum, ins_deel_key, res_deel_omschrijving, waarde1, waarde, waarde3, waarde_html, waarde_html2 ) AS WITH datums AS ( SELECT TRUNC (SYSDATE) + LEVEL - 1 datum FROM DUAL CONNECT BY LEVEL <= 42) SELECT datums.datum fclt_f_datum, isd.res_ins_deel_key ins_deel_key, res_deel_omschrijving, CHR (10) || LISTAGG ( DECODE ( naam, NULL, '', '[s40]' || naam || ' (' || TO_CHAR (res_rsv_deel_van, 'HH24:MI') || '-' || DECODE (TRUNC (res_rsv_deel_tot), TRUNC (res_rsv_deel_van), TO_CHAR (res_rsv_deel_tot, 'HH24:MI'), TO_CHAR (res_rsv_deel_tot, 'DD-MM-YYYY HH24:MI')) || ')'), CHR (10)) WITHIN GROUP (ORDER BY res_rsv_deel_van) waarde1, CHR (10) || LISTAGG ( DECODE (naam, NULL, '', '[s40]' || TO_CHAR (res_rsv_deel_van, 'HH24:MI') || ' ' || naam), CHR (10)) WITHIN GROUP (ORDER BY res_rsv_deel_van) waarde2, CHR (10) || LISTAGG (DECODE (naam, NULL, '', '[s40]' || naam), CHR (10)) WITHIN GROUP (ORDER BY res_rsv_deel_van) waarde3, LISTAGG ( DECODE ( naam, NULL, '', '' || TO_CHAR (res_rsv_deel_van, 'HH24:MI') || ' ' || naam || ''), '
') WITHIN GROUP (ORDER BY res_rsv_deel_van) waarde_html, LISTAGG (DECODE (naam, NULL, '', '' || naam || ''), '
') WITHIN GROUP (ORDER BY res_rsv_deel_van) waarde_html2 FROM res_v_aanwezigdeel isd, datums, (SELECT datum, res_ins_deel_key, DECODE (p.prs_perslid_visibility, 1, pf.prs_perslid_naam_friendly, a.prs_afdeling_omschrijving) naam, res_rsv_deel_van, res_rsv_deel_tot FROM res_v_aanwezigdeel r, res_v_aanwezigrsv_deel rrd, res_rsv_ruimte rrr, prs_v_perslid_fullnames pf, prs_perslid p, prs_afdeling a, datums WHERE r.res_deel_key = rrd.res_deel_key AND rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key AND rrr.res_rsv_ruimte_host_key = pf.prs_perslid_key AND pf.prs_perslid_key = p.prs_perslid_key AND p.prs_afdeling_key = a.prs_afdeling_key AND datum + 1 >= res_rsv_deel_van AND datum < res_rsv_deel_tot ) res -- Bezet WHERE isd.res_ins_deel_key = res.res_ins_deel_key(+) AND datums.datum = res.datum(+) GROUP BY datums.datum, isd.res_ins_deel_key, res_deel_omschrijving; -- -- Thema's gebaseerd op objectstatus van objecten binnen ruimte/werkplek (typisch sensoren) -- CREATE_VIEW(cad_v_thema_ruimtesensor,0) ( alg_ruimte_key, waarde ) AS SELECT r.alg_ruimte_key alg_ruimte_key, initcap(d.ins_deel_state) status FROM alg_ruimte r, ins_deel d, ins_srtdeel sd WHERE r.alg_ruimte_verwijder IS NULL AND d.ins_deel_verwijder IS NULL AND d.ins_alg_ruimte_type = 'R' AND d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key') AND d.ins_deel_state IS NOT NULL; -- Kleurenthema dat reserveringen en actuele bezetting weergeeft -- Geeft van de overige ruimte de ruimtesoort terug -- DEZE VIEW WORDT STANDAARD GEBRUIKT ALS DEFAULT THEMA VOOR HET INFOBORD CREATE_VIEW(cad_v_thema_srtruimtesensor, 0) ( alg_ruimte_key, waarde ) AS -- zalen met een sensor SELECT alg_ruimte_key, DECODE (MAX (status), 0, 'Uit', 2, 'Aan', 'NoShow') FROM ( SELECT r.alg_ruimte_key, DECODE ( INITCAP (d.ins_deel_state), '0', -- als de sensor uit is kijken we naar de reservering DECODE (r2a.res_reservering_key, NULL, 0, -- als er geen reservering gescheduled staat is de status uit DECODE (eerste10min, 1, 2, 1)), -- in de eerste 10 minuten v/d reservering melden we nog geen noshow(1) aan(2) 2) status FROM alg_ruimte r, ins_deel d, ins_srtdeel sd, (SELECT rr2a.res_reservering_key, rr2a.alg_ruimte_key, CASE WHEN (SYSDATE - res_rsv_ruimte_van > 10 / 1440) THEN 0 ELSE 1 END eerste10min FROM res_v_rsv_ruimte_2_alg_ruimte rr2a WHERE res_rsv_ruimte_dirtlevel = 0 AND rr2a.res_alg_ruimte_verwijder IS NULL AND rr2a.res_rsv_ruimte_van BETWEEN TRUNC(SYSDATE) AND SYSDATE -- Voorkennis: geen meerdaagse ruimtereserveringen AND rr2a.res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC(SYSDATE + 1)) r2a WHERE r.alg_ruimte_verwijder IS NULL AND d.ins_deel_verwijder IS NULL AND d.ins_alg_ruimte_type = 'R' AND d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key') AND d.ins_deel_state IS NOT NULL AND r.alg_ruimte_key = r2a.alg_ruimte_key(+)) GROUP BY alg_ruimte_key UNION ALL -- en dan de ruimten zonder sensor SELECT r.alg_ruimte_key, DECODE (rr.res_ruimte_key, -- is dit een vergaderruimte? NULL, '*' || sr.alg_srtruimte_omschrijving, DECODE (r2a.res_reservering_key, NULL, 'Uit', 'Aan')) -- 0 uit / 1 noshow / 2 aan FROM alg_v_aanwezigruimte r, alg_srtruimte sr, (SELECT rr2a.res_reservering_key, rr2a.alg_ruimte_key FROM res_v_rsv_ruimte_2_alg_ruimte rr2a WHERE res_rsv_ruimte_dirtlevel = 0 AND rr2a.res_alg_ruimte_verwijder IS NULL AND rr2a.res_rsv_ruimte_van BETWEEN TRUNC(SYSDATE) AND SYSDATE AND rr2a.res_rsv_ruimte_tot BETWEEN SYSDATE AND TRUNC(SYSDATE + 1)) r2a, ( SELECT alg_ruimte_key, MAX (res_ruimte_key) res_ruimte_key FROM res_alg_ruimte WHERE res_alg_ruimte_verwijder IS NULL GROUP BY alg_ruimte_key) rr WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key(+) AND r.alg_ruimte_key = r2a.alg_ruimte_key(+) AND r.alg_ruimte_key = rr.alg_ruimte_key(+) AND NOT EXISTS (SELECT r.alg_ruimte_key FROM ins_deel d, ins_srtdeel sd WHERE d.ins_deel_verwijder IS NULL AND d.ins_alg_ruimte_type = 'R' AND d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key') AND d.ins_deel_state IS NOT NULL); CREATE_VIEW(cad_v_thema_wpsensor,0) ( prs_werkplek_key, waarde ) AS SELECT wp.prs_werkplek_key prs_werkplek_key, initcap(d.ins_deel_state) status FROM prs_werkplek wp, ins_deel d, ins_srtdeel sd WHERE d.ins_deel_verwijder IS NULL AND wp.prs_werkplek_virtueel = 0 AND d.ins_alg_ruimte_type = 'W' AND d.ins_alg_ruimte_key = wp.prs_werkplek_key AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = fac.getSetting('ins_occupationsensors_srtgroep_key') AND d.ins_deel_state IS NOT NULL; -- View voor reserveerbare (werkplek)OBJECTEN, het default thema met key 13 -- Deze core-view wordt direct als kleur-objecten-thema gebruikt, maar kan ook als basis voor een alternatief via worden gebruikt -- Kijkt nu hard maximaal 42 dagen tov van nu vooruit, wat hopelijk even genoeg is voor alle situaties -- De verschillende waardevarianten zijn presentatie alternatieven, evt meerdere regels onder elkaar -- waarde1: Voor hele dagen: Vrij(0) of Bezet (3) -- waarde: Voor halve dagen: Vrij(0), Ochtendbezet(1), MiddagBezet(2), Helemaalbezet(3) -- waarde3: Voor tellen: Het aantal reservering op de dag, met 0 is dus Vrij CREATE_VIEW(cad_v_thema_deel_res_datum,0) ( fclt_f_datum, ins_deel_key, min_van, max_tot, waarde1, waarde, waarde3 ) AS WITH datums AS ( SELECT TRUNC (SYSDATE) + LEVEL - 1 datum FROM DUAL CONNECT BY LEVEL <= 42) SELECT datum fclt_f_datum, ins_deel_key, MIN (res_rsv_deel_van) min_van, MAX (res_rsv_deel_tot) max_tot, CASE WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0 ELSE 3 -- hele dag END waarde1, CASE WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0 WHEN TO_CHAR (MAX (res_rsv_deel_tot), 'HH24') <= 13 THEN 1 -- ochtend WHEN TO_CHAR (MIN (res_rsv_deel_van), 'HH24') >= 12 THEN 2 -- middag ELSE 3 -- hele dag END waarde, COUNT (res_rsv_deel_tot) -- aantal reservering deze dag waarde3 FROM (SELECT datums.datum, res_ins_deel_key ins_deel_key, res_rsv_deel_van, res_rsv_deel_tot FROM res_v_aanwezigdeel r, ins_deel d, datums, (SELECT datum, res_deel_key, res_rsv_deel_van, res_rsv_deel_tot FROM datums, res_v_aanwezigrsv_deel rrd WHERE res_rsv_deel_van > TRUNC(SYSDATE) - 1 -- negeer alle irrelevante historie sowieso AND datum + 1 >= res_rsv_deel_van AND datum < res_rsv_deel_tot) blokkerend -- vandaag en nog niet afgelopen WHERE r.res_deel_key = blokkerend.res_deel_key(+) AND datums.datum = blokkerend.datum(+) AND (r.res_deel_vervaldatum IS NULL or r.res_deel_vervaldatum > datums.datum) AND d.ins_deel_key = r.res_ins_deel_key) GROUP BY datum, ins_deel_key ORDER BY datum, ins_deel_key; -- Paar views om de populariteit van reserveerbare objecten te kunnen illustreren -- Basisview, met aantal per datum CREATE_VIEW(cad_v_thema_deel_gereserveerd,0) AS SELECT TRUNC (rrd.res_rsv_deel_van) datum, rd.res_ins_deel_key ins_deel_key, rd.res_deel_omschrijving, COUNT (*) aantal FROM res_rsv_deel rrd, res_deel rd WHERE rrd.res_deel_key = rd.res_deel_key GROUP BY TRUNC (rrd.res_rsv_deel_van), rd.res_ins_deel_key, rd.res_deel_omschrijving; -- Totaal gereserveerde dagen of delen daarvan in de afgelopen 1, 4 resp 8 wkn CREATE_VIEW(cad_v_thema_deel_populair_1wkn,0) AS SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde FROM cad_v_thema_deel_gereserveerd WHERE datum BETWEEN SYSDATE - 8 AND SYSDATE GROUP BY ins_deel_key, res_deel_omschrijving; CREATE_VIEW(cad_v_thema_deel_populair_4wkn,0) AS SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde FROM cad_v_thema_deel_gereserveerd WHERE datum BETWEEN SYSDATE - 29 AND SYSDATE GROUP BY ins_deel_key, res_deel_omschrijving; CREATE_VIEW(cad_v_thema_deel_populair_8wkn,0) AS SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde FROM cad_v_thema_deel_gereserveerd WHERE datum BETWEEN SYSDATE - 57 AND SYSDATE GROUP BY ins_deel_key, res_deel_omschrijving; -- Toekomstig populair CREATE_VIEW(cad_v_thema_deel_populair_futu,0) AS SELECT ins_deel_key, res_deel_omschrijving, COUNT (*) waarde FROM cad_v_thema_deel_gereserveerd WHERE datum > SYSDATE GROUP BY ins_deel_key, res_deel_omschrijving; REGISTERRUN('$Id$') #endif // CAD