FLEX#64726 Archiveren status historie sensoren

svn path=/Database/trunk/; revision=50818
This commit is contained in:
Erik Groener
2021-04-14 11:54:56 +00:00
parent cf4be8381d
commit f7d362ed11
5 changed files with 185 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ CREATE OR REPLACE PACKAGE ins AS
FUNCTION nextcyclusdate (p_insdeel IN NUMBER, p_srtcontrole IN NUMBER, p_scenario IN NUMBER, p_steps IN NUMBER DEFAULT 0) RETURN DATE;
FUNCTION nextcyclusdatesteps (p_insdeel IN NUMBER, p_srtcontrole IN NUMBER, p_steps IN NUMBER DEFAULT 1) RETURN NUMBER;
PROCEDURE setinspectstatus (pdlsrtcontrkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER);
PROCEDURE ins_daily(today IN DATE DEFAULT SYSDATE);
END ins;
/
@@ -348,6 +349,144 @@ CREATE OR REPLACE PACKAGE BODY ins AS
END IF;
END;
PROCEDURE ins_daily(today IN DATE DEFAULT SYSDATE)
AS
CURSOR c_days(eerste_dag IN DATE, laatste_dag IN DATE)
IS
SELECT DISTINCT TRUNC(h.ins_deel_statedate) uitvoer_dag
FROM ins_deel_state_history h
, ins_deel d
, ins_srtdeel s
WHERE h.ins_deel_key = d.ins_deel_key
AND d.ins_srtdeel_key = s.ins_srtdeel_key
AND BITAND(s.ins_srtdeel_sensortype, 1) = 1
AND h.ins_deel_statedate BETWEEN eerste_dag AND (laatste_dag + 1)
ORDER BY 1;
CURSOR c_sensors(dag IN DATE)
IS
SELECT DISTINCT h.ins_deel_key
FROM ins_deel_state_history h
, ins_deel d
, ins_srtdeel s
WHERE h.ins_deel_key = d.ins_deel_key
AND d.ins_srtdeel_key = s.ins_srtdeel_key
AND BITAND(s.ins_srtdeel_sensortype, 1) = 1
AND h.ins_deel_statedate BETWEEN (dag) AND (dag + 1);
-- Haal de statuswijzigingen van een dag op.
-- De laatste status loopt tot middernacht.
-- Ook de status van middernacht tot de eerste statuswijziging deze dag moet worden opgehaald.
-- Deze kan meerdere dagen voor deze dag voor het laatst gezet zijn!
CURSOR c_states ( deel_key IN NUMBER
, dag IN DATE)
IS
SELECT x.status
, SUM(x.eindtijd - x.starttijd) totaaltijd
FROM (
( SELECT a.ins_deel_state status
, dag starttijd
, min(c.ins_deel_statedate) eindtijd
, a.ins_deel_key
FROM ins_deel_state_history a
, ins_deel_state_history c
WHERE a.ins_deel_key = c.ins_deel_key
AND c.ins_deel_statedate BETWEEN dag AND dag+1
AND a.ins_deel_statedate = (SELECT MAX(b.ins_deel_statedate)
FROM ins_deel_state_history b
WHERE b.ins_deel_key = a.ins_deel_key
AND b.ins_deel_statedate < dag
)
GROUP BY a.ins_deel_key
, a.ins_deel_state
)
UNION
( SELECT a.ins_deel_state status
, a.ins_deel_statedate starttijd
, least(MIN(b.ins_deel_statedate), dag+1) eindtijd
, a.ins_deel_key
FROM ins_deel_state_history a
, ins_deel_state_history b
WHERE a.ins_deel_key = deel_key
AND a.ins_deel_statedate BETWEEN dag AND dag+1
AND a.ins_deel_key = b.ins_deel_key
AND a.ins_deel_state <> b.ins_deel_state
AND a.ins_deel_statedate < b.ins_deel_statedate
GROUP BY a.ins_deel_statedate
, a.ins_deel_state
, a.ins_deel_key
)
) x
WHERE x.ins_deel_key = deel_key
GROUP BY x.status;
keep_days NUMBER(3);
first_day_available DATE;
last_day_compressed DATE;
start_day_compress DATE;
end_day_compress DATE;
BEGIN
-- Setting aantal dagen history ophalen.
SELECT COALESCE(fac_setting_default, fac_setting_pvalue)
INTO keep_days
FROM fac_setting
WHERE fac_setting_name = 'ins_state_history';
-- dbms_output.put_line('today: '||to_char(today,'dd-mm-yyyy'));
-- Vandaag comprimeren mag niet want je weet niet of je alle meetwaarden al hebt.
end_day_compress := TRUNC(today);
IF (end_day_compress = TRUNC(sysdate))
THEN
end_day_compress := end_day_compress -1;
END IF;
-- Voor welke dagen moet ins_deel_state_history gecomprimeerd worden?
-- (voor het geval ins_daily een aantal dagen niet heeft gewerkt.)
SELECT TRUNC(COALESCE(MIN(ins_deel_statedate), end_day_compress))
INTO first_day_available
FROM ins_deel_state_history;
-- dbms_output.put_line('first_day_available: ' ||to_char(first_day_available,'dd-mm-yyyy'));
SELECT COALESCE(TRUNC(MAX(ins_deel_statedate)), first_day_available)
INTO last_day_compressed
FROM ins_deel_state_history_all;
-- dbms_output.put_line('last_day_compressed: ' ||to_char(last_day_compressed,'dd-mm-yyyy'));
SELECT GREATEST(first_day_available, (last_day_compressed + 1))
INTO start_day_compress
FROM DUAL;
-- dbms_output.put_line('Compress from '||to_char(start_day_compress,'dd-mm-yyyy')||' to '||to_char(end_day_compress,'dd-mm-yyyy'));
FOR r_day IN c_days(start_day_compress, end_day_compress)
LOOP
-- dbms_output.put_line('Compress '||to_char(r_day.uitvoer_dag,'dd-mm-yyyy'));
FOR r_sensor IN c_sensors(r_day.uitvoer_dag)
LOOP
-- dbms_output.put_line('sensor: '||r_sensor.ins_deel_key);
FOR r_state IN c_states(r_sensor.ins_deel_key, r_day.uitvoer_dag)
LOOP
-- dbms_output.put_line('- '||to_char(r_sensor.ins_deel_key)||' '||r_state.status||' '||to_char(r_state.totaaltijd));
INSERT INTO ins_deel_state_history_all
( ins_deel_key
, ins_deel_statedate
, ins_deel_state
, ins_deel_statetime
) VALUES
( r_sensor.ins_deel_key
, r_day.uitvoer_dag
, r_state.status
, r_state.totaaltijd
);
END LOOP;
END LOOP;
COMMIT;
END LOOP;
--
-- Verwijder alle records uit ins_deel_state_history ouder dan x dagen.
DELETE FROM ins_deel_state_history
WHERE TRUNC(ins_deel_statedate) <= TRUNC(SYSDATE - keep_days);
END;
END ins;
/

View File

@@ -22,6 +22,7 @@ CREATE SEQUENCE ins_s_ins_deelkoppeling_key MINVALUE 1;
CREATE SEQUENCE ins_s_ins_compositie_key MINVALUE 1;
CREATE SEQUENCE ins_s_ins_srtdeel_comp_key MINVALUE 1;
CREATE SEQUENCE ins_s_ins_deel_state_hist_key MINVALUE 1;
CREATE SEQUENCE ins_s_ins_deel_state_histall_key MINVALUE 1;
CREATE SEQUENCE ins_s_ins_scenario_key MINVALUE 10;
CREATE SEQUENCE ins_s_ins_srtcontrole_key MINVALUE 10;

View File

@@ -447,6 +447,22 @@ CREATE_TABLE(ins_deel_state_history, 0)
VARCHAR2(320)
);
CREATE_TABLE(ins_deel_state_history_all, 0)
(
ins_deel_state_history_all_key
NUMBER(10)
CONSTRAINT ins_k_deel_state_histall_key PRIMARY KEY,
ins_deel_key
NUMBER(10)
CONSTRAINT ins_r_ins_deel_key3 REFERENCES ins_deel(ins_deel_key),
ins_deel_statedate
DATE,
ins_deel_state
VARCHAR2(128),
ins_deel_statetime
NUMBER
);
CREATE_TABLE(ins_scenario, 0)
(
ins_scenario_key

View File

@@ -556,6 +556,14 @@ BEGIN
END;
/
CREATE_TRIGGER(ins_t_ins_deel_state_histall_B_I)
BEFORE INSERT ON ins_deel_state_history_all
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(ins_deel_state_history_all_key,ins_s_ins_deel_state_histall_key);
END;
/
CREATE_TRIGGER(ins_t_ins_import_B_IU)
BEFORE INSERT OR UPDATE ON ins_import

View File

@@ -444,6 +444,27 @@ ALTER TABLE ins_srtdeel ADD ins_srtdeel_acadsymbol_dwgy NUMBER(16,3);
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#65949
ALTER TABLE bes_srtdeel MODIFY bes_srtdeel_veelvoud NUMBER(9,3);
/////////////////////////////////////////////////////////////////////////////////////////// FLEX#64726
CREATE_TABLE(ins_deel_state_history_all, 0)
(
ins_deel_state_history_all_key
NUMBER(10)
CONSTRAINT ins_k_deel_state_histall_key PRIMARY KEY,
ins_deel_key
NUMBER(10)
CONSTRAINT ins_r_ins_deel_key3 REFERENCES ins_deel(ins_deel_key),
ins_deel_statedate
DATE,
ins_deel_state
VARCHAR2(128),
ins_deel_statetime
NUMBER
);
CREATE SEQUENCE ins_s_ins_deel_state_histall_key MINVALUE 1;
//DEFINE_SETTING('INS', 0001, 'WEB_FACTAB', 'ins_state_history, 'number', '7', 'number of days to keep sensor history')
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#*****
///////////////////////////////////////////////////////////////////////////////////////////