SGGR#81078 Sensoren: geldigheid, tolerantie
svn path=/Database/trunk/; revision=70070
This commit is contained in:
@@ -312,6 +312,10 @@ CREATE_TABLE(ins_srtdeel,0)
|
||||
NOT NULL,
|
||||
ins_srtdeel_statethreshold /* drempelwaarde waarboven een melding type mld_stdmelding_key aangemaakt moet worden */
|
||||
VARCHAR2(128),
|
||||
ins_srtdeel_statestepsize /* ondergrens (marge) voor verschil tussen meetwaarden om als verschil te erkennen, bv 0,5 */
|
||||
NUMBER(6,3),
|
||||
ins_srtdeel_stateanchor /* anker voor zgn kwantisatiegrid, bv 10. Werkt in combi met stepsize Q(x) = round((x - q_anchor)/q_step) * q_step + q_anchor */
|
||||
NUMBER(6,3),
|
||||
/* in mld_tab.src:
|
||||
mld_stdmelding_key
|
||||
NUMBER(10)
|
||||
@@ -464,6 +468,8 @@ CREATE_TABLE(ins_deel_state_history, 0)
|
||||
CONSTRAINT ins_r_ins_deel_key2 REFERENCES ins_deel(ins_deel_key),
|
||||
ins_deel_state
|
||||
VARCHAR2(128),
|
||||
ins_deel_state_value
|
||||
NUMBER(16,6),
|
||||
ins_deel_statedate
|
||||
DATE,
|
||||
ins_deel_state_history_opmerk /* je weet het niet he */
|
||||
|
||||
442
INS/INS_TRI.SRC
442
INS/INS_TRI.SRC
@@ -354,240 +354,282 @@ BEGIN
|
||||
END;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE TRIGGER ins_t_ins_deel_A_U
|
||||
AFTER UPDATE ON ins_deel
|
||||
FOR EACH ROW
|
||||
CREATE OR REPLACE TRIGGER ins_t_ins_deel_a_u
|
||||
AFTER UPDATE
|
||||
ON ins_deel
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
lmelder_oslogin CONSTANT VARCHAR2 (10) := '_SYSTEEM';
|
||||
new_date DATE;
|
||||
prev_state ins_deel_state_history.ins_deel_state%TYPE;
|
||||
prev_historystate ins_deel_state_history.ins_deel_state%TYPE;
|
||||
lsensortype ins_srtdeel.ins_srtdeel_sensortype%TYPE;
|
||||
lstate_history_key ins_deel_state_history.ins_deel_state_history_key%TYPE;
|
||||
ins_srtdeel_statethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
|
||||
anchorednewstateval NUMBER;
|
||||
ldubbelcheck_key mld_melding.mld_melding_key%TYPE;
|
||||
lstdmelding_key ins_srtdeel.mld_stdmelding_key%TYPE;
|
||||
ldiscipline_key mld_stdmelding.mld_ins_discipline_key%TYPE;
|
||||
lstatethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
|
||||
lstatestepsize ins_srtdeel.ins_srtdeel_statestepsize%TYPE;
|
||||
lstateanchor ins_srtdeel.ins_srtdeel_stateanchor%TYPE;
|
||||
lmelding_key mld_melding.mld_melding_key%TYPE;
|
||||
lmelder_key mld_melding.prs_perslid_key%TYPE;
|
||||
BEGIN
|
||||
-- archiving chances in state_history
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
|
||||
OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE); -- voorkom dat de update *net* een seconde later kan zijn
|
||||
BEGIN
|
||||
-- archiving changes in state_history, satisfying parameters
|
||||
-- note that archiving is more limited than recording any change
|
||||
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
-- mutatie van state impliceert al dat het een sensortype is
|
||||
-- toch checken we dat en halen ook de benodigde eigenschappen op
|
||||
|
||||
INSERT INTO ins_deel_state_history (ins_deel_key, ins_deel_state, ins_deel_statedate)
|
||||
VALUES (:new.ins_deel_key,
|
||||
:new.ins_deel_state,
|
||||
COALESCE (:new.ins_deel_statedate, new_date))
|
||||
RETURNING ins_deel_state_history_key
|
||||
INTO lstate_history_key;
|
||||
EXCEPTION
|
||||
WHEN DUP_VAL_ON_INDEX
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT ins_deel_state
|
||||
INTO prev_state
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_state_history_key =
|
||||
(SELECT MAX (ins_deel_state_history_key)
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
AND ins_deel_statedate < new_date);
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
NULL;
|
||||
END;
|
||||
SELECT ins_srtdeel_statethreshold
|
||||
, mld_stdmelding_key
|
||||
, ins_srtdeel_statestepsize
|
||||
, ins_srtdeel_stateanchor
|
||||
, ins_srtdeel_sensortype
|
||||
INTO lstatethreshold
|
||||
, lstdmelding_key
|
||||
, lstatestepsize
|
||||
, lstateanchor
|
||||
, lsensortype
|
||||
FROM ins_srtdeel
|
||||
WHERE ins_srtdeel_key = :new.ins_srtdeel_key AND ins_srtdeel_sensortype > 0; -- een sensor; dwingt configuratie af.
|
||||
|
||||
IF (prev_state = :new.ins_deel_state)
|
||||
-- voorkom dat de update *net* een seconde later kan zijn, een atomair tijdstip voor deze activiteit hier
|
||||
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE);
|
||||
|
||||
-- Voor continuwaarden gaan we de waarden 'snappen' op een 'grid' van meetwaarden
|
||||
-- initieel/default de ongesnapte meetwaarde; voor tekstwaarden wordt dit NULL
|
||||
anchorednewstateval := fac.safe_to_number (:new.ins_deel_state);
|
||||
|
||||
-- we bewaren alleen de history als de afwijking met de vorige waarde er is (discreet)
|
||||
-- of groot genoeg is (continu) als dat geconfigureerd is. Merk op dat we hier de gesnapte
|
||||
-- (dus eventueel afgeronde) waarden vergelijken
|
||||
IF BITAND (lsensortype, 1) = 1 OR (lstatestepsize IS NOT NULL AND lstateanchor IS NOT NULL)
|
||||
THEN
|
||||
DELETE ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
|
||||
ELSE -- kan alleen bij tri-stste statussen gebeuren
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state = :new.ins_deel_state
|
||||
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
|
||||
-- potentially trigger dependent actions
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
|
||||
OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT ins_srtdeel_statethreshold, mld_stdmelding_key
|
||||
INTO lstatethreshold, lstdmelding_key
|
||||
FROM ins_srtdeel
|
||||
WHERE ins_srtdeel_key = :new.ins_srtdeel_key;
|
||||
|
||||
IF lstatethreshold IS NOT NULL
|
||||
AND lstdmelding_key IS NOT NULL
|
||||
AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0
|
||||
AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0
|
||||
THEN
|
||||
-- Eerst controleren of er niet al een "heel recente" melding bestaat
|
||||
-- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer
|
||||
-- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen..
|
||||
--
|
||||
BEGIN
|
||||
SELECT prs_perslid_key
|
||||
INTO lmelder_key
|
||||
FROM prs_perslid
|
||||
WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
fac.putsystemnotification ('Invalid configuration: missing _SYSTEEM user',
|
||||
1);
|
||||
END;
|
||||
|
||||
IF lmelder_key IS NOT NULL
|
||||
THEN
|
||||
-- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder
|
||||
-- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen
|
||||
-- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen
|
||||
-- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou
|
||||
-- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker.
|
||||
-- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer)
|
||||
-- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene
|
||||
-- toepassing 1 minuut recent is, en voor een andere misschien een maand.
|
||||
BEGIN
|
||||
SELECT m.mld_melding_key
|
||||
INTO ldubbelcheck_key
|
||||
FROM mld_melding m, mld_melding_object mo
|
||||
WHERE m.mld_melding_key = mo.mld_melding_key
|
||||
AND mo.ins_deel_key = :new.ins_deel_key
|
||||
AND m.mld_stdmelding_key = lstdmelding_key
|
||||
AND m.prs_perslid_key = lmelder_key
|
||||
AND m.mld_melding_status IN (2,
|
||||
0,
|
||||
4,
|
||||
7); -- lopend
|
||||
SELECT ins_deel_state
|
||||
INTO prev_historystate
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
ORDER BY ins_deel_statedate DESC, ins_deel_state_history_key DESC
|
||||
FETCH FIRST 1 ROW ONLY;
|
||||
|
||||
IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder
|
||||
IF BITAND (lsensortype, 2) = 2
|
||||
THEN
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk =
|
||||
REPLACE (
|
||||
REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'),
|
||||
'{0}',
|
||||
lmelding_key),
|
||||
'{1}',
|
||||
lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
-- continuwaarden snappen op grid
|
||||
anchorednewstateval :=
|
||||
ROUND ((anchorednewstateval - TO_NUMBER (lstateanchor)) / TO_NUMBER (lstatestepsize)) * TO_NUMBER (lstatestepsize) + TO_NUMBER (lstateanchor);
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
BEGIN
|
||||
-- dit zou de trigger van mld_melding wel mogen doen..
|
||||
SELECT msm.mld_ins_discipline_key
|
||||
INTO ldiscipline_key
|
||||
FROM mld_stdmelding msm
|
||||
WHERE msm.mld_stdmelding_key = lstdmelding_key;
|
||||
|
||||
INSERT INTO mld_melding (mld_melding_module,
|
||||
mld_meldbron_key,
|
||||
mld_alg_locatie_key,
|
||||
mld_alg_onroerendgoed_keys,
|
||||
mld_melding_datum,
|
||||
mld_melding_onderwerp,
|
||||
mld_melding_omschrijving,
|
||||
mld_stdmelding_key,
|
||||
mld_melding_status,
|
||||
mld_kosten_klant,
|
||||
prs_perslid_key,
|
||||
mld_melding_spoed,
|
||||
mld_ins_discipline_key)
|
||||
VALUES (
|
||||
'MLD',
|
||||
11, -- sensor
|
||||
:new.ins_alg_locatie_key,
|
||||
:new.ins_alg_ruimte_key,
|
||||
SYSDATE,
|
||||
lcl.l ('lcl_mld_state_generated_onderwerp'),
|
||||
REPLACE (
|
||||
REPLACE (
|
||||
lcl.l (
|
||||
'lcl_mld_state_generated_omschrijving'),
|
||||
'{0}',
|
||||
:new.ins_deel_state),
|
||||
'{1}',
|
||||
lstatethreshold),
|
||||
lstdmelding_key,
|
||||
2, -- of afh mld_directklaar
|
||||
NULL,
|
||||
lmelder_key, --TODO!!!!!!! prs_perslid_key,
|
||||
3,
|
||||
ldiscipline_key)
|
||||
RETURNING mld_melding_key
|
||||
INTO lmelding_key;
|
||||
|
||||
--en het sensorobject erbij registreren
|
||||
INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key)
|
||||
VALUES (:new.ins_deel_key, lmelding_key);
|
||||
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk =
|
||||
REPLACE (
|
||||
REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'),
|
||||
'{0}',
|
||||
lmelding_key),
|
||||
'{1}',
|
||||
lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
|
||||
-- If defined kick off the workflow
|
||||
mld.mld_nextworkflowstep (lmelding_key, -1);
|
||||
END;
|
||||
DBMS_OUTPUT.put_line ('No history for deel_state, firstvalue=' || anchorednewstateval);
|
||||
prev_historystate := NULL;
|
||||
END;
|
||||
END IF;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.put_line ('prev_historystate=' || prev_historystate);
|
||||
DBMS_OUTPUT.put_line ('new.ins_deel_state=' || :new.ins_deel_state);
|
||||
DBMS_OUTPUT.put_line ('ins.state_diff (prev_historystate, :new.ins_deel_state)=' || ins.state_diff (prev_historystate, :new.ins_deel_state));
|
||||
-- we gaan er gewoon van uit dat de oude waarde al gealigned is op het grid.
|
||||
-- round((x - q_anchor)/q_step) * q_step + q_anchor
|
||||
DBMS_OUTPUT.put_line ('anchorednewstateval=' || anchorednewstateval);
|
||||
|
||||
-- Waarde opslaan: sowieso voor discrete waarden en
|
||||
-- voor continuwaarden indien de afgeronde afwijking groot genoeg id
|
||||
--
|
||||
-- Note: we introduce the numeric value in ins_deel_state_value, this is for future use
|
||||
-- since at this moment all existing code etc does not use it yet and altering that is out off scope
|
||||
--
|
||||
IF BITAND (lsensortype, 2) <> 2 OR prev_historystate IS NULL OR ABS (ins.state_diff (prev_historystate, :new.ins_deel_state)) >= lstatestepsize
|
||||
THEN
|
||||
BEGIN
|
||||
INSERT INTO ins_deel_state_history (ins_deel_key
|
||||
, ins_deel_state
|
||||
, ins_deel_statedate
|
||||
, ins_deel_state_value)
|
||||
VALUES (:new.ins_deel_key
|
||||
, COALESCE (TO_CHAR (anchorednewstateval), :new.ins_deel_state)
|
||||
, COALESCE (:new.ins_deel_statedate, new_date)
|
||||
, anchorednewstateval)
|
||||
RETURNING ins_deel_state_history_key
|
||||
INTO lstate_history_key;
|
||||
EXCEPTION
|
||||
WHEN DUP_VAL_ON_INDEX
|
||||
THEN
|
||||
-- Er blijkt op/voor/met precies dit tijdstip al een meetwaarde geregistreerd van deze sensor
|
||||
-- Dan kiezen we maar voor: laatste update -dus deze- geldt, alsof het een correctie is.
|
||||
IF (prev_historystate <> :new.ins_deel_state)
|
||||
THEN
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state = COALESCE (TO_CHAR (anchorednewstateval), :new.ins_deel_state), ins_deel_state_value = anchorednewstateval
|
||||
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
|
||||
END IF;
|
||||
-- lstate_history_key blijft hier NULL, dus een dubbele kan nooit een melding triggeren
|
||||
-- wie hier ooit uitkomt bij een probleem: gefeliciteerd
|
||||
END;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
|
||||
-- potentially trigger dependent actions; this is not dependant
|
||||
-- to the snapping of the values, which are for archiving only.
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
IF lstatethreshold IS NOT NULL
|
||||
AND lstdmelding_key IS NOT NULL
|
||||
AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0
|
||||
AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0
|
||||
THEN
|
||||
-- Eerst controleren of er niet al een "heel recente" melding bestaat
|
||||
-- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer
|
||||
-- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen..
|
||||
--
|
||||
BEGIN
|
||||
SELECT prs_perslid_key
|
||||
INTO lmelder_key
|
||||
FROM prs_perslid
|
||||
WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
fac.putsystemnotification ('Invalid configuration: missing _SYSTEEM user', 1);
|
||||
END;
|
||||
|
||||
IF lmelder_key IS NOT NULL
|
||||
THEN
|
||||
-- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder
|
||||
-- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen
|
||||
-- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen
|
||||
-- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou
|
||||
-- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker.
|
||||
-- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer)
|
||||
-- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene
|
||||
-- toepassing 1 minuut recent is, en voor een andere misschien een maand.
|
||||
BEGIN
|
||||
SELECT m.mld_melding_key
|
||||
INTO ldubbelcheck_key
|
||||
FROM mld_melding m, mld_melding_object mo
|
||||
WHERE m.mld_melding_key = mo.mld_melding_key
|
||||
AND mo.ins_deel_key = :new.ins_deel_key
|
||||
AND m.mld_stdmelding_key = lstdmelding_key
|
||||
AND m.prs_perslid_key = lmelder_key
|
||||
AND m.mld_melding_status IN (2
|
||||
, 0
|
||||
, 4
|
||||
, 7); -- lopend
|
||||
|
||||
IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder
|
||||
THEN
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk = REPLACE (REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'), '{0}', lmelding_key), '{1}', lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
BEGIN
|
||||
-- dit zou de trigger van mld_melding wel mogen doen..
|
||||
SELECT msm.mld_ins_discipline_key
|
||||
INTO ldiscipline_key
|
||||
FROM mld_stdmelding msm
|
||||
WHERE msm.mld_stdmelding_key = lstdmelding_key;
|
||||
|
||||
INSERT INTO mld_melding (mld_melding_module
|
||||
, mld_meldbron_key
|
||||
, mld_alg_locatie_key
|
||||
, mld_alg_onroerendgoed_keys
|
||||
, mld_melding_datum
|
||||
, mld_melding_onderwerp
|
||||
, mld_melding_omschrijving
|
||||
, mld_stdmelding_key
|
||||
, mld_melding_status
|
||||
, mld_kosten_klant
|
||||
, prs_perslid_key
|
||||
, mld_melding_spoed
|
||||
, mld_ins_discipline_key)
|
||||
VALUES ('MLD'
|
||||
, 11
|
||||
, -- sensor
|
||||
:new.ins_alg_locatie_key
|
||||
, :new.ins_alg_ruimte_key
|
||||
, SYSDATE
|
||||
, lcl.l ('lcl_mld_state_generated_onderwerp')
|
||||
, REPLACE (REPLACE (lcl.l ('lcl_mld_state_generated_omschrijving'), '{0}', :new.ins_deel_state), '{1}', lstatethreshold)
|
||||
, lstdmelding_key
|
||||
, 2
|
||||
, -- of afh mld_directklaar
|
||||
NULL
|
||||
, lmelder_key
|
||||
, --TODO!!!!!!! prs_perslid_key,
|
||||
3
|
||||
, ldiscipline_key)
|
||||
RETURNING mld_melding_key
|
||||
INTO lmelding_key;
|
||||
|
||||
--en het sensorobject erbij registreren
|
||||
INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key)
|
||||
VALUES (:new.ins_deel_key, lmelding_key);
|
||||
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk =
|
||||
REPLACE (REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'), '{0}', lmelding_key), '{1}', lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
|
||||
-- If defined kick off the workflow
|
||||
mld.mld_nextworkflowstep (lmelding_key, -1);
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
DBMS_OUTPUT.put_line ('Statevalues set for non-sensor: ignored');
|
||||
NULL;
|
||||
END;
|
||||
|
||||
-- Uitlenen object: Uitgifte object toevoegen aan de uitgifte tabel.
|
||||
IF (:old.ins_alg_ruimte_key_org IS NULL AND :new.ins_alg_ruimte_key_org IS NOT NULL)
|
||||
AND (:old.ins_alg_ruimte_type_org IS NULL AND :new.ins_alg_ruimte_type_org IS NOT NULL)
|
||||
AND (:new.ins_alg_ruimte_type = 'C' OR :new.ins_alg_ruimte_type = 'P')
|
||||
IF (:old.ins_alg_ruimte_key_org IS NULL AND :new.ins_alg_ruimte_key_org IS NOT NULL)
|
||||
AND (:old.ins_alg_ruimte_type_org IS NULL AND :new.ins_alg_ruimte_type_org IS NOT NULL)
|
||||
AND (:new.ins_alg_ruimte_type = 'C' OR :new.ins_alg_ruimte_type = 'P')
|
||||
THEN
|
||||
BEGIN
|
||||
INSERT INTO ins_deel_uitgifte (ins_deel_key
|
||||
, ins_deel_uitgifte_begin
|
||||
, ins_deel_uitgifte_eind_plan
|
||||
, prs_perslid_key
|
||||
, prs_contactpersoon_key)
|
||||
VALUES (:new.ins_deel_key
|
||||
, SYSDATE
|
||||
, CASE
|
||||
WHEN :new.res_rsv_deel_key IS NOT NULL
|
||||
THEN (SELECT rrd.res_rsv_deel_tot
|
||||
FROM res_rsv_deel rrd
|
||||
WHERE res_rsv_deel_key = :new.res_rsv_deel_key)
|
||||
ELSE NULL
|
||||
END
|
||||
, CASE
|
||||
WHEN :new.ins_alg_ruimte_type = 'P'
|
||||
THEN :new.ins_alg_ruimte_key
|
||||
ELSE NULL
|
||||
END
|
||||
, CASE
|
||||
WHEN :new.ins_alg_ruimte_type = 'C'
|
||||
THEN :new.ins_alg_ruimte_key
|
||||
ELSE NULL
|
||||
END);
|
||||
, ins_deel_uitgifte_begin
|
||||
, ins_deel_uitgifte_eind_plan
|
||||
, prs_perslid_key
|
||||
, prs_contactpersoon_key)
|
||||
VALUES (:new.ins_deel_key
|
||||
, SYSDATE
|
||||
, CASE
|
||||
WHEN :new.res_rsv_deel_key IS NOT NULL
|
||||
THEN
|
||||
(SELECT rrd.res_rsv_deel_tot
|
||||
FROM res_rsv_deel rrd
|
||||
WHERE res_rsv_deel_key = :new.res_rsv_deel_key)
|
||||
ELSE
|
||||
NULL
|
||||
END
|
||||
, CASE WHEN :new.ins_alg_ruimte_type = 'P' THEN :new.ins_alg_ruimte_key ELSE NULL END
|
||||
, CASE WHEN :new.ins_alg_ruimte_type = 'C' THEN :new.ins_alg_ruimte_key ELSE NULL END);
|
||||
END;
|
||||
END IF;
|
||||
|
||||
-- Innemen object: Inname object aanpassen in de uitgifte tabel.
|
||||
IF (:old.ins_alg_ruimte_key_org IS NOT NULL AND :new.ins_alg_ruimte_key_org IS NULL)
|
||||
AND (:old.ins_alg_ruimte_type_org IS NOT NULL AND :new.ins_alg_ruimte_type_org IS NULL)
|
||||
AND (:old.ins_alg_ruimte_type = 'C' OR :old.ins_alg_ruimte_type = 'P')
|
||||
IF (:old.ins_alg_ruimte_key_org IS NOT NULL AND :new.ins_alg_ruimte_key_org IS NULL)
|
||||
AND (:old.ins_alg_ruimte_type_org IS NOT NULL AND :new.ins_alg_ruimte_type_org IS NULL)
|
||||
AND (:old.ins_alg_ruimte_type = 'C' OR :old.ins_alg_ruimte_type = 'P')
|
||||
THEN
|
||||
BEGIN
|
||||
UPDATE ins_deel_uitgifte
|
||||
|
||||
@@ -2708,7 +2708,7 @@ AS
|
||||
og.alg_terreinsector_code terreinsectorcode,
|
||||
og.alg_terreinsector_naam terreinsector,
|
||||
h.ins_deel_state status,
|
||||
fac.safe_to_number (REPLACE (h.ins_deel_state, ',', '.')) status_numeriek,
|
||||
h.ins_deel_state_value status_numeriek,
|
||||
h.ins_deel_state_history_opmerk opmerking,
|
||||
og.alg_locatie_key fclt_3d_locatie_key,
|
||||
d.ins_discipline_key fclt_3d_discipline_key
|
||||
@@ -2776,26 +2776,26 @@ ORDER BY du.ins_deel_key,
|
||||
du.ins_deel_uitgifte_begin;
|
||||
|
||||
/*
|
||||
-- room_occupancy_buckets:
|
||||
-- ins_v_room_occupancy_buckets:
|
||||
-- Verzamelt 30-min buckets van de afgelopen 90 dagen per ruimte en bezettingssensor.
|
||||
-- Filtert op werkdagen (ma<6D>vr) en sluit feestdagen uit.
|
||||
-- Output-kolommen:
|
||||
-- alg_ruimte_key, bucket_start, sensor_id, state ('true'/'false').
|
||||
--
|
||||
-- room_occupancy_stats:
|
||||
-- ins_v_room_occupancy_stats:
|
||||
-- Agregeert per ruimte en bucket het aantal bezette werkplekken (occupied_desks)
|
||||
-- en het totaal aantal werkpleksensoren (total_desks).
|
||||
-- Output-kolommen:
|
||||
-- room_key, bucket_start, occupied_desks, total_desks.
|
||||
--
|
||||
-- room_occupancy_kpis:
|
||||
-- ins_v_room_occupancy_kpis:
|
||||
-- Berekent per ruimte drie KPI's:
|
||||
-- total_person_hours (som occupied_desks <20> 0.5u)
|
||||
-- avg_utilization_pct (gem. benutting % op 1 decimaal)
|
||||
-- peak_occupied_desks (max gelijktijdige bezetting in <20><>n bucket)
|
||||
*/
|
||||
|
||||
CREATE_VIEW(room_occupancy_buckets, 0)
|
||||
CREATE_VIEW(ins_v_room_occupancy_buckets, 0)
|
||||
AS
|
||||
WITH
|
||||
intervals
|
||||
@@ -2841,7 +2841,7 @@ AS
|
||||
, state
|
||||
FROM bucket_values;
|
||||
|
||||
CREATE_VIEW(room_occupancy_stats, 0)
|
||||
CREATE_VIEW(ins_v_room_occupancy_stats, 0)
|
||||
AS
|
||||
SELECT rob.alg_ruimte_key
|
||||
AS alg_ruimte_key
|
||||
@@ -2877,10 +2877,10 @@ AS
|
||||
0
|
||||
END)
|
||||
AS total_desks
|
||||
FROM room_occupancy_buckets rob
|
||||
FROM ins_v_room_occupancy_buckets rob
|
||||
GROUP BY rob.alg_ruimte_key, rob.bucket_start;
|
||||
|
||||
CREATE_VIEW(room_occupancy_kpis, 0)
|
||||
CREATE_VIEW(ins_v_room_occupancy_kpis, 0)
|
||||
AS
|
||||
SELECT alg_ruimte_key
|
||||
, -- 1) Totaal persoon-uren over de afgelopen 90 dagen tijdens kantoortijden
|
||||
@@ -2889,7 +2889,7 @@ AS
|
||||
ROUND (AVG (occupied_desks / NULLIF (total_desks, 0)) * 100, 1) AS avg_utilization_pct
|
||||
, -- 3) Piek aantal gelijktijdig bezette werkplekken in <20><>n bucket
|
||||
MAX (occupied_desks) AS peak_occupied_desks
|
||||
FROM room_occupancy_stats
|
||||
FROM ins_v_room_occupancy_stats
|
||||
GROUP BY alg_ruimte_key;
|
||||
|
||||
|
||||
|
||||
@@ -71,6 +71,12 @@ UPDATE mld_melding
|
||||
WHERE mld_melding_status = 5
|
||||
AND BITAND(mld_melding_actiecode, 128) = 128;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////// SGGR#81078
|
||||
ALTER TABLE ins_srtdeel ADD ins_srtdeel_statestepsize NUMBER (6, 3);
|
||||
ALTER TABLE ins_srtdeel ADD ins_srtdeel_stateanchor NUMBER (6, 3);
|
||||
|
||||
ALTER TABLE ins_deel_state_history ADD ins_deel_state_value NUMBER(16,6);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#00000
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user