Files
Database/FAC/FAC_PAC.SRC
Bert in het Veld 12b3b3c36a Nextvolgnr van 10 naar 20 posities i.v.m. overflow.
svn path=/Database/trunk/; revision=7301
2000-01-06 12:05:34 +00:00

482 lines
16 KiB
Plaintext

#ifdef FAC
/* FAC_P_FAC_VOLGNR: Tabel en functies voor volgnummers.
*
* Deze tabel is voor het simuleren van sequences die zich kunnen
* resetten om een bepaalde periode.
*
* De periode wordt aangegeven dmv. een TO_CHAR-formaat van een datum,
* bijv. 'YYYY' voor jaar of 'MM' voor maand.
*
* De functies voor deze volgnummers zitten in een package. Het volgnummer
* moet altijd via deze functies opgevraagd worden.
*
* De volgende functies zijn beschikbaar:
* - fac_volgnr_currval(soort) RETURN NUMBER:
* Vraag de huidige waarde van het volgnummer op.
* - fac_volgnr_nextval(soort) RETURN NUMBER:
* Vraag de waarde op van volgende volgnummer op.
* het volgnummer en de laatste opvraagdatum wordt dan aangepast. Als de
* huidige datum over de opgegeven periodegrens komt, dan wordt eerst het
* volgnummer gereset.
* - fac_volgnr_reset(soort):
* Indien nodig reset het volgnr.
*
* In SQL_PLUS kan de source opgevraagd worden uit tabel USER_SOURCE.
* Bij het creeren kan de de volgende error komen:
* DBA-00072: Package body created with compilation errors.
* De errors kunnen bekeken worden dmv. SHOW ERRORS;
*
* FAC_P_FAC_SAVE_RESTORE: Package voor het bewaren en teruggeven van primary keys binnen triggers.
*
* Gebruikt in: De status van de MLD_MELDING is afhankelijk van de minimale status van zijn opdrachten, of als
* er geen opdrachten kan dit door de gebruiker gezet worden. Als er een nieuwe opdrachten aangemaakt
* wordt, of als een opdracht van status veranderd of als een opdracht verwijderd wordt, heeft dit invloed
* op de status van de bijbehorende melding. Dit mechanisme is opgelost via de triggers van MLD_OPDR.
*
* De volgende functies zijn beschikbaar:
* - ResetSelectie(TableName) RETURN BOOLEAN:
* Verwijderd de vorige selectie van de Primary-keys van de tabel. Hou hier rekening met multi-user dmv. de
* huidige SessionId. Retourneerd of het gelukt (TRUE) is of niet (FALSE).
* Deze moet aangeroepen worden in de BEFORE-statement-trigger,
* bijvoorbeeld: BEFORE INSERT OR UPDATE OR DELETE ON mld_opdr.
* - SavePrimaryKey(TableName, PrimaryKey) RETURN BOOLEAN:
* Onthou de PrimaryKey-waarde, hou hiet ook rekening met multi-user dmv. de huidige SessionId. Retourneerd
* of het gelukt (TRUE) is of niet (FALSE).
* Deze moet aangeroepen worden in de BEFORE-row-trigger,
* bijvoorbeeld: BEFORE INSERT OR UPDATE ON mld_opdr FOR EACH ROW
* EN : BEFORE DELETE ON mld_opdr FOR EACH ROW
* - GetPrimaryKey(TableName, IndexNr) RETURN NUMBER:
* Geef de nth onthouden PrimaryKey terug, hou hiet ook rekening met multi-user dmv. de huidige SessionId.
* Het IndexNr begint met 1 en loopt door totdat er geen volgende PrimaryKey onthouden is.
* Retourneerd de gevonden PrimaryKey of NULL (als er geen volgende is).
* Deze moet aangeroepen worden in de AFTER-statement-trigger,
* bijvoorbeeld: AFTER INSERT OR UPDATE OR DELETE ON mld_opdr.
*
* LET OP: FAC_P_FAC_SAVE_RESTORE_UPDATE(Func, TableName)
* Voor het gebruik van GetPrimaryKey() is een #define FAC_P_FAC_SAVE_RESTORE_UPDATE(Func, TableName)
* gemaakt in COMSQL.H: Deze doorloopt alle onthouden PrimaryKeys van TableName en roept voor elk record
* de functie Func aan. Func krijgt 1 argument, nl. PrimaryKey en moet een BOOLEAN retourneren.
*
* Voorbeelden van het gebruik staan in MLD_TRI.SRC in de triggers MLD_T_MLD_OPDR_B_IUD, MLD_T_MLD_OPDR_B_IU,
* MLD_T_MLD_OPDR_B_D en MLD_T_MLD_OPDR_A_IUD.
*
* FAC_P_FAC_GEBRUIKER_OPSCHONEN: Procedure om de entries in FAC_GEBRUIKER-tabel op te schonen
* Er kunnen namelijk entries in blijven bestaan van users die al verwijderd zijn.
*
*
* Revivions:
* 04-10-1999 EGR fac_f_fac_get_description uitgebreidt met LPN_PRS_WERKPLEK.
* --- 01.46 ---
* 19-05-1999 BIV ins_v_aanwezigdeel vervangen door all_v_aanwezigdeel in functie fac_f_fac_get_description.
* 18-05-1999 BIV Functie fac_f_fac_get_description toegevoegd.
* --- 01.45 ---
* --- 01.44 ---
* --- 01.43 ---
* --- 01.42 ---
* --- 01.41 ---
* --- 01.40 ---
* --- 01.39 ---
* --- 01.38 ---
* --- 01.37 ---
* --- 01.36 ---
* --- 01.35 ---
* 15/04/1998 AH GetPrimaryKey() aangepast, SELECT DISTINCT fac_selectie_key ipv SELECT fac_selectie_key
* 08/04/1998 AH #1589, Nieuwe procedure FAC_P_FAC_GEBRUIKER_OPSCHONEN aangemaakt
* 01/04/1998 AH #1540, Nieuwe package FAC_P_FAC_SAVE_RESTORE toegevoegd voor het onthouden en teruggeven
* van primary-keys.
* --- 01.34 ---
* --- 01.33 ---
* --- 01.32 ---
* --- 01.31 ---
* --- 01.30 ---
* --- 01.29 ---
* --- 01.28 ---
* --- 01.27 ---
* --- 01.26 ---
* --- 01.25 ---
* --- 01.24 ---
* --- 01.23 ---
* --- 01.22 ---
* --- 01.21 ---
* --- 01.20 ---
* --- 01.19 ---
* --- 01.18 ---
* --- 01.17 ---
* --- 01.16 ---
* --- 01.15 ---
* 21-05-96 KTH - OR REPLACE toegevoegd aan package en package body
* - file hernoemd van FAC_PACK.SRC naar FAC_PAC.SRC
* 03-05-96 AH Creation.
*/
CREATE OR REPLACE PACKAGE fac_p_fac_volgnr AS
FUNCTION fac_volgnr_currval( soort IN CHAR ) RETURN NUMBER;
FUNCTION fac_volgnr_nextval( soort IN CHAR ) RETURN NUMBER;
PROCEDURE fac_volgnr_reset( soort IN CHAR );
END fac_p_fac_volgnr;
/
CREATE OR REPLACE PACKAGE BODY fac_p_fac_volgnr AS
FUNCTION fac_volgnr_currval( soort IN CHAR ) RETURN NUMBER IS
volgnr NUMBER;
BEGIN
SELECT fac_volgnr
INTO volgnr
FROM fac_volgnrs
WHERE fac_volgnr_srt = soort;
RETURN volgnr;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000, 'alg_m152');
RETURN 0;
END fac_volgnr_currval;
FUNCTION fac_volgnr_nextval( soort IN CHAR ) RETURN NUMBER IS
volgnr NUMBER;
BEGIN
fac_volgnr_reset(soort);
SELECT fac_volgnr + 1
INTO volgnr
FROM fac_volgnrs
WHERE fac_volgnr_srt = soort
FOR UPDATE OF fac_volgnr;
UPDATE fac_volgnrs
SET fac_volgnr = volgnr,
fac_volgnr_laatste_datum = SYSDATE
WHERE fac_volgnr_srt = soort;
RETURN volgnr;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000, 'alg_m152');
RETURN 0;
END fac_volgnr_nextval;
PROCEDURE fac_volgnr_reset( soort IN CHAR ) IS
periode fac_volgnrs.fac_volgnr_periode%TYPE;
laatste_datum fac_volgnrs.fac_volgnr_laatste_datum%TYPE;
BEGIN
SELECT fac_volgnr_periode, fac_volgnr_laatste_datum
INTO periode, laatste_datum
FROM fac_volgnrs
WHERE fac_volgnr_srt = soort;
IF TO_CHAR(laatste_datum, periode) <> TO_CHAR(SYSDATE, periode)
THEN
UPDATE fac_volgnrs
SET fac_volgnr = 0,
fac_volgnr_laatste_datum = SYSDATE
WHERE fac_volgnr_srt = soort;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000, 'alg_m152');
END fac_volgnr_reset;
END fac_p_fac_volgnr;
/
CREATE OR REPLACE PACKAGE fac_p_fac_save_restore AS
-- Maak de vorige selectie van de tabel en de huidige sessie leeg.
FUNCTION ResetSelectie( TableName IN VARCHAR2 ) RETURN BOOLEAN;
-- Onthou de primary key van de tabel en de huidige sessie.
FUNCTION SavePrimaryKey( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN BOOLEAN;
-- Geef de nth primary key van de tabel en de huidige sessie. IndexNr begint met 1.
FUNCTION GetPrimaryKey( TableName IN VARCHAR2, IndexNr IN NUMBER ) RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES (GetPrimaryKey,WNDS, WNPS);
END fac_p_fac_save_restore;
/
CREATE OR REPLACE PACKAGE BODY fac_p_fac_save_restore AS
FUNCTION GetSessionId RETURN VARCHAR2 IS
SessionId VARCHAR2(20);
BEGIN
SELECT USERENV('SESSIONID')
INTO SessionId
FROM DUAL;
RETURN SessionId;
END;
FUNCTION ResetSelectie( TableName IN VARCHAR2 ) RETURN BOOLEAN IS
SessionId VARCHAR2(20);
BEGIN
SessionId := GetSessionId;
DELETE FROM fac_selectie
WHERE fac_selectie_node = SessionId
AND fac_selectie_tabel = TableName;
RETURN TRUE;
EXCEPTION
WHEN OTHERS
THEN RETURN FALSE;
END;
FUNCTION SavePrimaryKey( TableName IN VARCHAR2, PrimaryKey IN NUMBER ) RETURN BOOLEAN IS
SessionId VARCHAR2(20);
BEGIN
SessionId := GetSessionId;
INSERT INTO fac_selectie (fac_selectie_node,
fac_selectie_tabel,
fac_selectie_key)
VALUES (SessionId, TableName, PrimaryKey);
RETURN TRUE;
EXCEPTION
WHEN OTHERS
THEN RETURN FALSE;
END;
-- Geef de nth Fac_Selectie_Key van de geselecteerde records
-- terug. IndexNr begint met 1.
FUNCTION GetPrimaryKey( TableName IN VARCHAR2, IndexNr IN NUMBER ) RETURN NUMBER IS
SessionId VARCHAR2(20);
CURSOR Selectie IS SELECT DISTINCT fac_selectie_key
FROM fac_selectie
WHERE fac_selectie_node = SessionId
AND fac_selectie_tabel = TableName
ORDER BY fac_selectie_key;
SelectieRec Selectie%ROWTYPE;
TmpIndex NUMBER;
ReturnKey NUMBER(10);
BEGIN
SessionId := GetSessionId;
ReturnKey := NULL;
TmpIndex := 1;
FOR SelectieRec IN Selectie
LOOP
IF IndexNr = TmpIndex
THEN
ReturnKey := SelectieRec.fac_selectie_key;
EXIT;
END IF;
TmpIndex := TmpIndex + 1;
END LOOP;
RETURN ReturnKey;
END;
END fac_p_fac_save_restore;
/
CREATE OR REPLACE PROCEDURE FAC_P_FAC_GEBRUIKER_OPSCHONEN IS
BEGIN
DELETE FROM fac_gebruiker
WHERE fac_gebruiker_username NOT IN (SELECT username
FROM all_users);
COMMIT;
END;
/
CREATE OR REPLACE FUNCTION FAC_F_FAC_GET_DESCRIPTION(LPNName IN VARCHAR2
,CondKey IN NUMBER
,Prefix IN VARCHAR2
,PrefixKey IN NUMBER) RETURN VARCHAR2 IS
NextVolgNr VARCHAR2(20);
ReturnString VARCHAR2(30);
BEGIN
IF LPNName = 'LPN_INS_DEEL'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(ins_deel_upper, LENGTH(ins_deel_upper)-(i-1)))+1)), '***')
INTO NextVolgNr
FROM all_v_aanwezigdeel
WHERE LTRIM(SUBSTR(ins_deel_upper, LENGTH(ins_deel_upper)-(i-1))) BETWEEN '0' AND LPAD('9',i,'9')
AND ins_deel_upper LIKE Prefix||'%'
AND LENGTH(ins_deel_upper) <= LENGTH(Prefix)+i
AND ins_alg_locatie_key = CondKey
AND ins_srtdeel_key = PrefixKey;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_INS_ONDERDEEL'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(ins_deel_upper, LENGTH(ins_deel_upper)-(i-1)))+1)), '***')
INTO NextVolgNr
FROM ins_deel
WHERE LTRIM(SUBSTR(ins_deel_upper, LENGTH(ins_deel_upper)-(i-1))) BETWEEN '0' AND LPAD('9',i,'9')
AND ins_alg_locatie_key = CondKey
AND ins_deel_verwijder IS NULL
AND ins_deel_parent_key IS NOT NULL
AND ins_deel_upper LIKE Prefix||'%'
AND LENGTH(ins_deel_upper) <= LENGTH(Prefix)+i
AND ins_srtdeel_key = PrefixKey;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_ALG_TERREINSECTOR'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_terreinsector_code, LENGTH(alg_terreinsector_code)-(i-1)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanwezigterreinsector
WHERE LTRIM(SUBSTR(alg_terreinsector_code, LENGTH(alg_terreinsector_code)-(i-1))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_locatie_key = CondKey
AND LENGTH(alg_terreinsector_code) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_ALG_GEBOUW'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_gebouw_code, LENGTH(alg_gebouw_code)-(i-1)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanweziggebouw
WHERE LTRIM(SUBSTR(alg_gebouw_code, LENGTH(alg_gebouw_code)-(i-1))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_locatie_key = CondKey
AND LENGTH(alg_gebouw_code) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_ALG_RUIMTE'
THEN
FOR i IN 3..10
LOOP
SELECT NVL(TO_CHAR(MAX(TO_NUMBER(SUBSTR(alg_ruimte_nr, LENGTH(alg_ruimte_nr)-(i-1)))+1)), '***')
INTO NextVolgNr
FROM alg_v_aanwezigruimte
WHERE LTRIM(SUBSTR(alg_ruimte_nr, LENGTH(alg_ruimte_nr)-(i-1))) BETWEEN '0' AND LPAD('9',i,'9')
AND alg_verdieping_key = CondKey
AND LENGTH(alg_ruimte_nr) <= i;
IF NextVolgNr = '***'
THEN
IF i = 3
THEN
NextVolgNr := '001';
ELSE
NextVolgNr := POWER(10, (i-1));
END IF;
EXIT;
ELSE
IF LENGTH(NextVolgNr) <= i
THEN
NextVolgNr:= LPAD(NextVolgNr,i,'0');
EXIT;
END IF;
END IF;
END LOOP;
ELSIF LPNName = 'LPN_PRS_WERKPLEK'
THEN
BEGIN
SELECT TO_CHAR(NVL(MAX(prs_werkplek_volgnr),0) +1)
INTO NextVolgNr
FROM prs_werkplek
WHERE prs_alg_ruimte_key = CondKey
AND prs_werkplek_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN NextVolgNr := '1';
END;
/* Omschrijving */
BEGIN
SELECT alg_ruimte_nr ||' - '|| NextVolgNr
INTO NextVolgNr
FROM alg_ruimte
WHERE alg_ruimte_key = CondKey;
EXCEPTION
WHEN OTHERS
THEN NULL;
END;
END IF;
ReturnString := Prefix||NextVolgNr;
RETURN ReturnString;
END;
/
/*
** Licentiecheck kan in form worden gedaan nu elke user leesrechten op systeemtabellen heeft.
CREATE OR REPLACE PACKAGE fac_p_fac_session AS
FUNCTION v_sessions(p_role IN VARCHAR2 ) RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES (v_sessions, WNDS, WNPS);
END fac_p_fac_session;
/
CREATE OR REPLACE PACKAGE BODY fac_p_fac_session AS
FUNCTION v_sessions(p_role IN VARCHAR2) RETURN NUMBER IS
v_machines NUMBER(2);
BEGIN
-- SELECT COUNT(DISTINCT machine)
-- INTO v_machines
-- FROM v$session
-- WHERE username in (SELECT DISTINCT grantee
-- FROM dba_role_privs
-- WHERE INSTR(granted_role,p_role) > 0);
v_machines := 5;
RETURN (v_machines);
EXCEPTION
WHEN OTHERS
THEN RETURN (-1);
END;
END fac_p_fac_session;
/
*/
#endif // FAC