945 lines
45 KiB
Plaintext
945 lines
45 KiB
Plaintext
/* $Revision$
|
||
* $Id$
|
||
*/
|
||
|
||
/* FAC_PACFLEX
|
||
*
|
||
* Contains all functions for flex values.
|
||
*
|
||
*/
|
||
|
||
CREATE OR REPLACE PACKAGE flx
|
||
AS
|
||
PROCEDURE gettableinf (pmodule IN OUT VARCHAR2,
|
||
o_ktable OUT VARCHAR2, -- Naam kenmerk tabel
|
||
o_ktable_kdefault OUT VARCHAR2,
|
||
o_kvtable OUT VARCHAR2, -- Naam kenmerk waarden tabel
|
||
o_kvtable_refkey OUT VARCHAR2,
|
||
o_kvtable_kniveau OUT VARCHAR2,
|
||
o_kvtable_kwaarde OUT VARCHAR2,
|
||
o_kvtable_kkey OUT VARCHAR2,
|
||
o_kvtable_kdelete OUT VARCHAR2,
|
||
o_ktable_kshowexpr OUT VARCHAR2
|
||
);
|
||
FUNCTION getflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2 DEFAULT NULL,
|
||
p_optional IN NUMBER DEFAULT 0) RETURN VARCHAR2;
|
||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_waarde IN VARCHAR2);
|
||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2,
|
||
p_waarde IN VARCHAR2,
|
||
p_multi IN NUMBER DEFAULT 0);
|
||
PROCEDURE deleteflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2,
|
||
p_waardekey IN NUMBER DEFAULT NULL);
|
||
PROCEDURE setflexbijlage (p_module IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_disk_directory IN VARCHAR2,
|
||
p_disk_filename IN VARCHAR2,
|
||
p_filename IN VARCHAR2,
|
||
p_file_size IN NUMBER,
|
||
p_file_date IN DATE,
|
||
p_digest IN VARCHAR2 DEFAULT NULL,
|
||
p_root_key IN NUMBER DEFAULT NULL);
|
||
PROCEDURE copyflexbijlage ( p_module IN VARCHAR2
|
||
, p_refkey IN NUMBER
|
||
, p_kenmerk_key IN NUMBER
|
||
, p_from_bijlagen_key IN NUMBER
|
||
);
|
||
PROCEDURE deleteflexbijlage (p_bijlagen_key IN NUMBER
|
||
,p_fileisgone IN BOOLEAN DEFAULT FALSE);
|
||
PROCEDURE deleteflexbijlage (p_module IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_disk_directory IN VARCHAR2,
|
||
p_filename IN VARCHAR2);
|
||
FUNCTION getflexexprtype (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2;
|
||
FUNCTION getflexexpression (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2;
|
||
FUNCTION getflexshowexpr (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2;
|
||
FUNCTION getdomeinwaarde (dkey IN NUMBER,
|
||
waarde IN VARCHAR2,
|
||
ignorewhenxmlnode IN NUMBER DEFAULT 0) RETURN VARCHAR2;
|
||
PROCEDURE evaluateflexexpressions (pmodule IN VARCHAR2, prefkey IN NUMBER, puserkey IN NUMBER, psavetodb IN NUMBER);
|
||
END flx;
|
||
/
|
||
|
||
|
||
CREATE OR REPLACE PACKAGE BODY flx
|
||
AS
|
||
PROCEDURE gettableinf (pmodule IN OUT VARCHAR2,
|
||
o_ktable OUT VARCHAR2, -- Naam kenmerk tabel
|
||
o_ktable_kdefault OUT VARCHAR2,
|
||
o_kvtable OUT VARCHAR2, -- Naam kenmerk waarden tabel
|
||
o_kvtable_refkey OUT VARCHAR2,
|
||
o_kvtable_kniveau OUT VARCHAR2,
|
||
o_kvtable_kwaarde OUT VARCHAR2,
|
||
o_kvtable_kkey OUT VARCHAR2,
|
||
o_kvtable_kdelete OUT VARCHAR2,
|
||
o_ktable_kshowexpr OUT VARCHAR2
|
||
)
|
||
AS
|
||
l_module VARCHAR2 (3);
|
||
BEGIN
|
||
l_module := pmodule;
|
||
o_kvtable_kniveau := NULL;
|
||
CASE
|
||
WHEN pmodule = 'ALG'
|
||
THEN o_kvtable := 'alg_onrgoedkenmerk';
|
||
o_kvtable_refkey := 'alg_onrgoed_key';
|
||
o_kvtable_kniveau := 'alg_onrgoed_niveau';
|
||
WHEN pmodule = 'BEZ'
|
||
THEN o_kvtable := 'bez_kenmerkwaarde';
|
||
o_kvtable_refkey := 'bez_bezoekers_key';
|
||
WHEN pmodule = 'BES'
|
||
THEN o_kvtable := 'bes_kenmerkbestell';
|
||
o_kvtable_refkey := 'bes_bestelling_key';
|
||
WHEN pmodule = 'CNT'
|
||
THEN o_kvtable := 'cnt_kenmerkcontract';
|
||
o_kvtable_refkey := 'cnt_contract_key';
|
||
WHEN pmodule = 'FAQ'
|
||
THEN o_kvtable := 'faq_kenmerkwaarde';
|
||
o_kvtable_refkey := 'fac_faq_key';
|
||
WHEN pmodule = 'FIN'
|
||
THEN o_kvtable := 'fin_kenmerkfactuur';
|
||
o_kvtable_refkey := 'fin_factuur_key';
|
||
WHEN pmodule = 'CIL' OR pmodule = 'SLE'
|
||
THEN o_kvtable := 'ins_kenmerkdeel';
|
||
o_kvtable_refkey := 'ins_deel_key';
|
||
WHEN pmodule = 'INS'
|
||
THEN o_kvtable := 'ins_kenmerkdeel';
|
||
o_kvtable_refkey := 'ins_deel_key';
|
||
WHEN pmodule = 'MLD'
|
||
THEN o_kvtable := 'mld_kenmerkmelding';
|
||
o_kvtable_refkey := 'mld_melding_key';
|
||
WHEN pmodule = 'OPD'
|
||
THEN o_kvtable := 'mld_kenmerkopdr';
|
||
o_kvtable_refkey := 'mld_opdr_key';
|
||
l_module := 'MLD';
|
||
WHEN pmodule = 'PRS'
|
||
THEN o_kvtable := 'prs_kenmerklink';
|
||
o_kvtable_refkey := 'prs_link_key';
|
||
o_kvtable_kniveau := 'prs_kenmerklink_niveau';
|
||
WHEN pmodule = 'RES'
|
||
THEN o_kvtable := 'res_kenmerkwaarde';
|
||
o_kvtable_refkey := 'res_rsv_ruimte_key';
|
||
END CASE;
|
||
IF l_module = 'RES'
|
||
THEN o_kvtable_kwaarde := 'res_kenmerkreservering_waarde'; -- RES is uitzondering
|
||
ELSE o_kvtable_kwaarde := o_kvtable || '_waarde';
|
||
END IF;
|
||
o_ktable := l_module || '_kenmerk';
|
||
o_ktable_kdefault := l_module || '_kenmerk_default';
|
||
o_ktable_kshowexpr := l_module || '_kenmerk_show_expr';
|
||
o_kvtable_kkey := l_module || '_kenmerk_key';
|
||
o_kvtable_kdelete := o_kvtable || '_verwijder';
|
||
END;
|
||
|
||
|
||
FUNCTION getflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2 DEFAULT NULL,
|
||
p_optional IN NUMBER DEFAULT 0) RETURN VARCHAR2
|
||
IS
|
||
l_sql_kenm VARCHAR2 (4500);
|
||
l_waarde VARCHAR2 (4000);
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_module VARCHAR2 (3);
|
||
BEGIN
|
||
IF p_optional = 1 AND p_ref_key IS NULL
|
||
THEN
|
||
return NULL;
|
||
END IF;
|
||
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
l_sql_kenm := 'SELECT ' || l_kcolumnname_waarde ||
|
||
' FROM ' || l_kenmval_tablename ||
|
||
' WHERE ' || l_kcolumnname_refkey || ' = ' || p_ref_key ||
|
||
' AND ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key ||
|
||
' AND ' || l_kcolumnname_delete || ' IS NULL';
|
||
-- Merk op dat p_kenmerk_key uniek genoeg is, eigenlijk we hoeven p_niveau niet mee te nemen
|
||
-- Toch controleren we hem gewoon wel voor de tabellen die er mee werken
|
||
IF l_kcolumnname_niveau IS NOT NULL
|
||
THEN
|
||
l_sql_kenm := l_sql_kenm || ' AND ' || l_kcolumnname_niveau || ' = ''' || p_niveau || '''';
|
||
END IF;
|
||
BEGIN
|
||
EXECUTE IMMEDIATE l_sql_kenm INTO l_waarde;
|
||
RETURN l_waarde;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
RETURN NULL;
|
||
END;
|
||
END;
|
||
|
||
-- Let wel: we doen alleen een insert, nooit een update
|
||
PROCEDURE setflexbijlage (p_module IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_disk_directory IN VARCHAR2,
|
||
p_disk_filename IN VARCHAR2,
|
||
p_filename IN VARCHAR2,
|
||
p_file_size IN NUMBER,
|
||
p_file_date IN DATE,
|
||
p_digest IN VARCHAR2 DEFAULT NULL,
|
||
p_root_key IN NUMBER DEFAULT NULL)
|
||
AS
|
||
l_bijlagen_key fac_bijlagen.fac_bijlagen_key%TYPE;
|
||
l_disk_filename fac_bijlagen.fac_bijlagen_disk_filename%TYPE;
|
||
BEGIN
|
||
IF (p_disk_filename = p_filename) THEN
|
||
l_disk_filename := '';
|
||
ELSE
|
||
l_disk_filename := p_disk_filename;
|
||
END IF;
|
||
|
||
BEGIN
|
||
SELECT fac_bijlagen_key
|
||
INTO l_bijlagen_key
|
||
FROM fac_bijlagen
|
||
WHERE fac_bijlagen_verwijder IS NULL
|
||
AND fac_bijlagen_module = p_module
|
||
AND fac_bijlagen_refkey = p_ref_key
|
||
AND fac_bijlagen_disk_directory = p_disk_directory
|
||
AND fac_bijlagen_filename = p_filename;
|
||
|
||
UPDATE fac_bijlagen
|
||
SET fac_bijlagen_disk_filename = l_disk_filename
|
||
, fac_bijlagen_file_size = p_file_size
|
||
, fac_bijlagen_aanmaak = p_file_date
|
||
, fac_bijlagen_digest = p_digest
|
||
WHERE fac_bijlagen_key = l_bijlagen_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND THEN
|
||
INSERT INTO fac_bijlagen
|
||
( fac_bijlagen_module
|
||
, fac_bijlagen_refkey
|
||
, fac_bijlagen_kenmerk_key
|
||
, fac_bijlagen_disk_directory
|
||
, fac_bijlagen_disk_filename
|
||
, fac_bijlagen_filename
|
||
, fac_bijlagen_file_size
|
||
, fac_bijlagen_aanmaak
|
||
, fac_bijlagen_digest
|
||
, fac_bijlagen_root_key
|
||
) VALUES
|
||
( p_module
|
||
, p_ref_key
|
||
, p_kenmerk_key
|
||
, p_disk_directory
|
||
, l_disk_filename
|
||
, p_filename
|
||
, p_file_size
|
||
, p_file_date
|
||
, p_digest
|
||
, p_root_key
|
||
)
|
||
RETURNING fac_bijlagen_key INTO l_bijlagen_key;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE copyflexbijlage ( p_module IN VARCHAR2
|
||
, p_refkey IN NUMBER
|
||
, p_kenmerk_key IN NUMBER
|
||
, p_from_bijlagen_key IN NUMBER
|
||
)
|
||
AS
|
||
BEGIN
|
||
INSERT INTO fac_bijlagen
|
||
( fac_bijlagen_module
|
||
, fac_bijlagen_refkey
|
||
, fac_bijlagen_kenmerk_key
|
||
, fac_bijlagen_disk_directory
|
||
, fac_bijlagen_filename
|
||
, fac_bijlagen_digest
|
||
, fac_bijlagen_file_size
|
||
, fac_bijlagen_root_key
|
||
, fac_bijlagen_aanmaak
|
||
)
|
||
SELECT p_module
|
||
, p_refkey
|
||
, p_kenmerk_key
|
||
, '*see root*'
|
||
, fac_bijlagen_filename
|
||
, fac_bijlagen_digest
|
||
, fac_bijlagen_file_size
|
||
, fac_bijlagen_root_key
|
||
, fac_bijlagen_aanmaak
|
||
FROM fac_bijlagen
|
||
WHERE fac_bijlagen_key = p_from_bijlagen_key;
|
||
END;
|
||
|
||
PROCEDURE deleteflexbijlage (p_bijlagen_key IN NUMBER
|
||
,p_fileisgone IN BOOLEAN DEFAULT FALSE)
|
||
AS
|
||
v_cur_root_key NUMBER;
|
||
v_new_root_key NUMBER;
|
||
v_cur_disk_dir fac_bijlagen.fac_bijlagen_disk_directory%TYPE;
|
||
BEGIN
|
||
-- Bepaal de nieuwe root_key als het huidige record wordt verwijderd,
|
||
SELECT MIN(n1.fac_bijlagen_root_key)
|
||
, MIN(n1.fac_bijlagen_key)
|
||
, MIN(n2.fac_bijlagen_disk_directory)
|
||
INTO v_cur_root_key
|
||
, v_new_root_key
|
||
, v_cur_disk_dir
|
||
FROM fac_bijlagen n1
|
||
, fac_bijlagen n2
|
||
WHERE n1.fac_bijlagen_root_key = n2.fac_bijlagen_root_key
|
||
AND n1.fac_bijlagen_verwijder IS NULL
|
||
AND n2.fac_bijlagen_verwijder IS NULL
|
||
AND n2.fac_bijlagen_key = p_bijlagen_key
|
||
AND n1.fac_bijlagen_key <> p_bijlagen_key;
|
||
|
||
IF (v_cur_root_key <> v_new_root_key)
|
||
THEN
|
||
-- Wijzig de root_key van alle records die naar het te verwijderen record verwijzen
|
||
UPDATE fac_bijlagen
|
||
SET fac_bijlagen_root_key = v_new_root_key
|
||
WHERE fac_bijlagen_root_key = v_cur_root_key;
|
||
-- Wijzig alleen van de nieuwe root de directory
|
||
UPDATE fac_bijlagen
|
||
SET fac_bijlagen_disk_directory = v_cur_disk_dir
|
||
WHERE fac_bijlagen_key = v_new_root_key;
|
||
END IF;
|
||
--
|
||
-- Nu mag dit record verwijderd worden
|
||
IF (p_fileisgone)
|
||
THEN
|
||
IF (v_cur_root_key IS NULL AND v_new_root_key IS NULL)
|
||
THEN
|
||
-- Query heeft geen andere bijlage gevonden die de nieuwe root_key kan worden.
|
||
-- Er zijn dan geen kopieen van de bijlage, of van alle kopieen is ook de verwijderdatum gezet.
|
||
-- Verwijder eerst de kopieen met verwijderdatum.
|
||
DELETE FROM fac_bijlagen
|
||
WHERE fac_bijlagen_verwijder IS NOT NULL
|
||
AND fac_bijlagen_root_key = p_bijlagen_key;
|
||
END IF;
|
||
|
||
DELETE FROM fac_bijlagen
|
||
WHERE fac_bijlagen_key = p_bijlagen_key;
|
||
ELSE
|
||
UPDATE fac_bijlagen
|
||
SET fac_bijlagen_verwijder = SYSDATE
|
||
WHERE fac_bijlagen_key = p_bijlagen_key;
|
||
END IF;
|
||
END;
|
||
|
||
PROCEDURE deleteflexbijlage (p_module IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_disk_directory IN VARCHAR2,
|
||
p_filename IN VARCHAR2)
|
||
AS
|
||
v_bijlagen_key NUMBER(10);
|
||
|
||
CURSOR c_bijlagen
|
||
IS
|
||
SELECT fac_bijlagen_key
|
||
FROM fac_bijlagen
|
||
WHERE fac_bijlagen_module = p_module
|
||
AND fac_bijlagen_disk_directory = p_disk_directory
|
||
AND fac_bijlagen_refkey = p_ref_key
|
||
AND fac_bijlagen_kenmerk_key = p_kenmerk_key
|
||
AND fac_bijlagen_verwijder IS NULL
|
||
AND fac_bijlagen_filename = p_filename;
|
||
BEGIN
|
||
FOR bijl IN c_bijlagen
|
||
LOOP
|
||
flx.deleteflexbijlage(bijl.fac_bijlagen_key);
|
||
END LOOP;
|
||
END;
|
||
|
||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_waarde IN VARCHAR2)
|
||
AS
|
||
BEGIN
|
||
setflex(pmodule, p_kenmerk_key, p_ref_key, NULL, p_waarde);
|
||
END;
|
||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2,
|
||
p_waarde IN VARCHAR2,
|
||
p_multi IN NUMBER DEFAULT 0)
|
||
AS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_kenm VARCHAR2 (4500);
|
||
l_sql_upsert VARCHAR2 (4500);
|
||
l_rowsprocessed NUMBER DEFAULT 0;
|
||
l_cursor_upsert INTEGER DEFAULT DBMS_SQL.open_cursor;
|
||
l_aantal_kenm NUMBER;
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_niveau_col VARCHAR2 (32) DEFAULT '';
|
||
l_niveau_val VARCHAR2 (7) DEFAULT '';
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
|
||
l_sql_kenm := 'SELECT COUNT(*)' ||
|
||
' FROM ' || l_kenmval_tablename ||
|
||
' WHERE ' || l_kcolumnname_refkey || ' = ' || p_ref_key ||
|
||
' AND ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key ||
|
||
' AND ' || l_kcolumnname_delete || ' IS NULL';
|
||
-- Voor het kenmerktype Map kunnen/mogen meerdere regels met dezelde refkey en kenmerk_key bestaan.
|
||
-- In dat geval dus toevoegen als ook de verwijzing naar fac_bijlagen (in p_waarde) nog niet bestaat.
|
||
IF (p_multi = 1) THEN
|
||
l_sql_kenm := l_sql_kenm || ' AND ' || l_kcolumnname_waarde || ' = ' || p_waarde;
|
||
END IF;
|
||
EXECUTE IMMEDIATE l_sql_kenm INTO l_aantal_kenm;
|
||
|
||
l_sql_upsert := '';
|
||
IF l_aantal_kenm = 0
|
||
THEN
|
||
IF l_kcolumnname_niveau IS NOT NULL AND p_niveau IS NOT NULL
|
||
THEN
|
||
l_niveau_col := ', ' || l_kcolumnname_niveau;
|
||
l_niveau_val := ', ''' || p_niveau || '''';
|
||
END IF;
|
||
l_sql_upsert := 'INSERT INTO ' || l_kenmval_tablename ||
|
||
' (' || l_kcolumnname_refkey ||
|
||
' , ' || l_kcolumnname_kkey ||
|
||
' , ' || l_kcolumnname_waarde ||
|
||
l_niveau_col ||
|
||
' )' ||
|
||
' VALUES (' || p_ref_key ||
|
||
' , ' || p_kenmerk_key ||
|
||
' , :p_waarde'||
|
||
l_niveau_val ||
|
||
' )';
|
||
ELSE
|
||
-- Voor p_multi zijn er geen wijzigingen!
|
||
IF (p_multi = 0) THEN
|
||
l_sql_upsert := 'UPDATE ' || l_kenmval_tablename ||
|
||
' SET ' || l_kcolumnname_waarde || ' = :p_waarde' ||
|
||
' WHERE ' || l_kcolumnname_refkey || ' = ' || p_ref_key ||
|
||
' AND ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key ||
|
||
' AND ' || l_kcolumnname_delete || ' IS NULL';
|
||
END IF;
|
||
END IF;
|
||
|
||
IF (l_sql_upsert IS NOT NULL) THEN
|
||
DBMS_SQL.PARSE (l_cursor_upsert, l_sql_upsert, DBMS_SQL.native);
|
||
DBMS_SQL.BIND_VARIABLE(l_cursor_upsert, ':p_waarde', p_waarde);
|
||
l_rowsprocessed := DBMS_SQL.EXECUTE (l_cursor_upsert);
|
||
DBMS_SQL.CLOSE_CURSOR(l_cursor_upsert);
|
||
END IF;
|
||
END;
|
||
PROCEDURE deleteflex (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER,
|
||
p_ref_key IN NUMBER,
|
||
p_niveau IN VARCHAR2,
|
||
p_waardekey IN NUMBER DEFAULT NULL)
|
||
AS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_delete VARCHAR2 (4500);
|
||
l_rowsprocessed NUMBER DEFAULT 0;
|
||
l_cursor_delete INTEGER DEFAULT DBMS_SQL.open_cursor;
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_niveau VARCHAR2 (40);
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
|
||
-- Merk op dat p_kenmerk_key uniek genoeg is, eigenlijk we hoeven p_niveau niet mee te nemen
|
||
IF l_kcolumnname_niveau IS NOT NULL
|
||
THEN
|
||
l_niveau := ' AND ' || l_kcolumnname_niveau || ' = ''' || p_niveau || '''';
|
||
ELSE
|
||
l_niveau := '';
|
||
END IF;
|
||
|
||
l_sql_delete := 'DELETE FROM ' || l_kenmval_tablename ||
|
||
' WHERE ' || l_kcolumnname_refkey || ' = ' || p_ref_key ||
|
||
' AND ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key ||
|
||
' AND ' || l_kcolumnname_delete || ' IS NULL' ||
|
||
l_niveau;
|
||
|
||
IF (p_waardekey IS NOT NULL) THEN -- Specifieke flex-bijlage
|
||
l_sql_delete := l_sql_delete ||
|
||
' AND ' || l_kcolumnname_waarde || ' = ' || TO_CHAR(p_waardekey);
|
||
END IF;
|
||
|
||
DBMS_SQL.parse (l_cursor_delete, l_sql_delete, DBMS_SQL.native);
|
||
|
||
l_rowsprocessed := DBMS_SQL.execute (l_cursor_delete);
|
||
DBMS_SQL.close_cursor(l_cursor_delete);
|
||
END;
|
||
|
||
FUNCTION getflexexprtype (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2
|
||
IS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_expr VARCHAR2 (4500);
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_expr VARCHAR2 (4);
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
-- Expressie opvragen uit de default waarde uit de kenmerk tabel.
|
||
l_sql_expr := 'SELECT (SUBSTR (' || l_kcolumnname_default || ', 1, 2))' ||
|
||
' FROM ' || l_kenmerk_tablename ||
|
||
' WHERE ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key;
|
||
EXECUTE IMMEDIATE l_sql_expr INTO l_expr;
|
||
IF l_expr = '##'
|
||
THEN
|
||
l_sql_expr := 'SELECT (SUBSTR (' || l_kcolumnname_default || ', 3, 4))' ||
|
||
' FROM ' || l_kenmerk_tablename ||
|
||
' WHERE ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key;
|
||
EXECUTE IMMEDIATE l_sql_expr INTO l_expr;
|
||
ELSE
|
||
l_expr := NULL;
|
||
END IF;
|
||
RETURN l_expr;
|
||
END;
|
||
|
||
FUNCTION getflexexpression (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2
|
||
IS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_expr VARCHAR2 (4500);
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_expr VARCHAR2 (4000);
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
-- Expressie opvragen uit de default waarde uit de kenmerk tabel.
|
||
l_sql_expr := 'SELECT (SUBSTR (' || l_kcolumnname_default || ', 9))' ||
|
||
' FROM ' || l_kenmerk_tablename ||
|
||
' WHERE ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key;
|
||
EXECUTE IMMEDIATE l_sql_expr INTO l_expr;
|
||
RETURN l_expr;
|
||
END;
|
||
|
||
FUNCTION getflexshowexpr (pmodule IN VARCHAR2,
|
||
p_kenmerk_key IN NUMBER) RETURN VARCHAR2
|
||
IS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_expr VARCHAR2 (4500);
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_expr VARCHAR2 (4000);
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
-- Expressie opvragen uit de default waarde uit de kenmerk tabel.
|
||
l_sql_expr := 'SELECT (SUBSTR (' || l_kcolumnname_showexpr || ', 9))' ||
|
||
' FROM ' || l_kenmerk_tablename ||
|
||
' WHERE ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key;
|
||
EXECUTE IMMEDIATE l_sql_expr INTO l_expr;
|
||
RETURN l_expr;
|
||
END;
|
||
|
||
FUNCTION getdomeinwaarde (dkey IN NUMBER, waarde IN VARCHAR2, ignorewhenxmlnode IN NUMBER DEFAULT 0)
|
||
RETURN VARCHAR2
|
||
IS
|
||
sresult VARCHAR2 (255);
|
||
kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
|
||
kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
|
||
objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
|
||
xmlnode fac_kenmerkdomein.fac_kenmerkdomein_xmlnode%TYPE;
|
||
resultvalue VARCHAR2 (1000);
|
||
BEGIN
|
||
IF waarde IS NULL
|
||
THEN
|
||
resultvalue := NULL; -- gauw klaar mee
|
||
ELSE
|
||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||
rsk.fac_kenmerkdomein_kolomtxt,
|
||
rsk.fac_kenmerkdomein_objectnaam,
|
||
rsk.fac_kenmerkdomein_xmlnode
|
||
INTO kolomnaam,
|
||
kolomtxt,
|
||
objectnaam,
|
||
xmlnode
|
||
FROM fac_kenmerkdomein rsk
|
||
WHERE rsk.fac_kenmerkdomein_key = dkey;
|
||
IF (xmlnode IS NOT NULL AND ignorewhenxmlnode = 1)
|
||
THEN
|
||
RETURN waarde;
|
||
END IF;
|
||
-- Optimalisatie: meestal is het dezelfde query op de usrdata-tabel
|
||
-- Dan hoeven we niet te bouwen en steeds te parsen (FSN#25653)
|
||
IF kolomtxt = 'FAC_USRDATA_OMSCHR'
|
||
AND objectnaam = 'FAC_USRDATA'
|
||
AND kolomnaam = 'FAC_USRDATA_KEY'
|
||
THEN
|
||
SELECT fac_usrdata_omschr
|
||
INTO resultvalue
|
||
FROM fac_usrdata
|
||
WHERE fac_usrdata_key = fac.safe_to_number(waarde);
|
||
ELSE
|
||
sresult := 'SELECT MIN(' || kolomtxt || ') FROM ' || objectnaam || ' WHERE ' || kolomnaam || ' = :bd_waarde';
|
||
EXECUTE IMMEDIATE sresult INTO resultvalue USING waarde;
|
||
END IF;
|
||
END IF;
|
||
RETURN resultvalue;
|
||
END;
|
||
PROCEDURE evaluateflexexpressions (pmodule IN VARCHAR2, prefkey IN NUMBER, puserkey IN NUMBER, psavetodb IN NUMBER)
|
||
AS
|
||
l_module VARCHAR2 (3);
|
||
l_sql_exprval VARCHAR2 (4500);
|
||
l_rowsprocessed NUMBER DEFAULT 0;
|
||
l_cursor_exprval NUMBER; -- INTEGER DEFAULT DBMS_SQL.open_cursor;
|
||
l_desctab DBMS_SQL.desc_tab;
|
||
l_colcnt NUMBER;
|
||
l_expr VARCHAR2 (4000);
|
||
l_exprtype VARCHAR2 (4);
|
||
l_exprval VARCHAR2 (4000);
|
||
l_exprval_num NUMBER;
|
||
l_exprval_date DATE;
|
||
l_cntbind NUMBER;
|
||
l_cnt NUMBER;
|
||
l_bvar VARCHAR2 (1000);
|
||
l_rflex VARCHAR2 (1000) DEFAULT '(\:flex[0-9_]+)'; -- supports ':flex111 = ''538'''
|
||
l_kenmerkwaarde fac_kenmwaarden.fac_kenmwaarden_waarde%TYPE;
|
||
l_kenmerkw_date DATE;
|
||
l_kenmerkw_num NUMBER;
|
||
l_kenmerktype fac_kenmwaarden.fac_kenmwaarden_kenmerktype%TYPE;
|
||
l_kenmerk_key fac_kenmwaarden.fac_kenmwaarden_kenmerk_key%TYPE;
|
||
l_kenmerk_tablename VARCHAR2 (30);
|
||
l_kenmval_tablename VARCHAR2 (30);
|
||
l_kcolumnname_refkey VARCHAR2 (30);
|
||
l_kcolumnname_niveau VARCHAR2 (30);
|
||
l_kcolumnname_waarde VARCHAR2 (30);
|
||
l_kcolumnname_default VARCHAR2 (30);
|
||
l_kcolumnname_kkey VARCHAR2 (30);
|
||
l_kcolumnname_delete VARCHAR2 (30);
|
||
l_kcolumnname_showexpr VARCHAR2 (30);
|
||
l_niveau_val VARCHAR2 (1) DEFAULT '';
|
||
CURSOR c_expressions
|
||
IS
|
||
SELECT fac_kenmwaarden_kenmerk_key,
|
||
fac_kenmwaarden_kenmerktype,
|
||
fac_kenmwaarden_kenmerklen,
|
||
fac_kenmwaarden_kenmerkdec,
|
||
fac_kenmwaarden_niveau,
|
||
fac_kenmwaarden_waarde
|
||
FROM fac_kenmwaarden
|
||
WHERE fac_kenmwaarden_module = pmodule
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_isexpr = 1
|
||
ORDER BY fac_kenmwaarden_key;
|
||
BEGIN
|
||
l_module := pmodule;
|
||
flx.gettableinf (l_module, l_kenmerk_tablename, l_kcolumnname_default, l_kenmval_tablename, l_kcolumnname_refkey, l_kcolumnname_niveau, l_kcolumnname_waarde, l_kcolumnname_kkey, l_kcolumnname_delete, l_kcolumnname_showexpr);
|
||
FOR expr IN c_expressions
|
||
LOOP
|
||
l_cursor_exprval := DBMS_SQL.open_cursor;
|
||
-- Expressie opvragen.
|
||
l_exprtype := flx.getflexexprtype(pmodule, expr.fac_kenmwaarden_kenmerk_key);
|
||
l_expr := flx.getflexexpression(pmodule, expr.fac_kenmwaarden_kenmerk_key);
|
||
IF l_exprtype IS NOT NULL AND l_expr IS NOT NULL
|
||
THEN
|
||
l_sql_exprval := 'SELECT ' || '(' || l_expr || ')' || ' FROM DUAL';
|
||
BEGIN
|
||
DBMS_SQL.parse (l_cursor_exprval, l_sql_exprval, DBMS_SQL.native);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
raise_application_error (
|
||
-20001,
|
||
'Error parsing flex-expression ' || pmodule || ' kenmerkkey:' || expr.fac_kenmwaarden_kenmerk_key
|
||
|| CHR(10) || SQLERRM
|
||
|| CHR(10) || l_sql_exprval
|
||
|| CHR(10) || 'Original: ' || l_expr);
|
||
END;
|
||
--DBMS_SQL.describe_columns(l_cursor_exprval, l_colcnt, l_desctab);
|
||
IF expr.fac_kenmwaarden_kenmerktype = 'N'
|
||
THEN
|
||
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval_num);
|
||
ELSIF expr.fac_kenmwaarden_kenmerktype = 'V'
|
||
THEN
|
||
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval_num);
|
||
ELSE
|
||
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval, 4000);
|
||
END IF;
|
||
l_cntbind := REGEXP_COUNT (l_sql_exprval,
|
||
l_rflex,
|
||
1,
|
||
'i');
|
||
FOR l_cnt IN 1 .. l_cntbind
|
||
LOOP
|
||
l_bvar := REGEXP_SUBSTR (l_sql_exprval,
|
||
l_rflex,
|
||
1,
|
||
l_cnt,
|
||
'i');
|
||
l_kenmerk_key := TO_NUMBER (SUBSTR (l_bvar, 6));
|
||
BEGIN
|
||
SELECT fac_kenmwaarden_waarde,
|
||
fac_kenmwaarden_kenmerktype
|
||
INTO l_kenmerkwaarde,
|
||
l_kenmerktype
|
||
FROM fac_kenmwaarden
|
||
WHERE fac_kenmwaarden_module = l_module
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_kenmerk_key = l_kenmerk_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
l_kenmerkwaarde := NULL;
|
||
l_kenmerktype := NULL;
|
||
END;
|
||
BEGIN
|
||
-- Als <20><>n van de flexkenmerken NULL is, dan met die waarde verder rekenen. Waarde kan bewust NULL zijn
|
||
CASE l_kenmerktype
|
||
WHEN 'D'
|
||
THEN
|
||
l_kenmerkw_date := TO_DATE(l_kenmerkwaarde, 'DD-MM-YYYY');
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_date);
|
||
WHEN 'N'
|
||
THEN
|
||
l_kenmerkw_num := TO_NUMBER(l_kenmerkwaarde);
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_num);
|
||
WHEN 'V'
|
||
THEN
|
||
l_kenmerkw_num := TO_NUMBER(l_kenmerkwaarde);
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_num);
|
||
ELSE
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkwaarde);
|
||
END CASE;
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
raise_application_error (
|
||
-20001,
|
||
'Error binding flex-expression ' || pmodule|| ' kkey:' || expr.fac_kenmwaarden_kenmerk_key
|
||
|| ' type: ' || l_kenmerktype || ' val: ' || l_kenmerkwaarde
|
||
|| CHR(10) || SQLERRM
|
||
|| CHR(10) || l_sql_exprval);
|
||
END;
|
||
END LOOP;
|
||
BEGIN
|
||
l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_exprval);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
raise_application_error (
|
||
-20001,
|
||
'Error executing flex-expression ' || pmodule|| ' kkey:' || expr.fac_kenmwaarden_kenmerk_key
|
||
|| CHR(10) || SQLERRM
|
||
|| CHR(10) || l_sql_exprval);
|
||
END;
|
||
IF expr.fac_kenmwaarden_kenmerktype = 'N'
|
||
THEN
|
||
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval_num);
|
||
l_exprval := TO_CHAR(l_exprval_num);
|
||
IF (l_exprval IS NOT NULL AND expr.fac_kenmwaarden_kenmerkdec > 0)
|
||
THEN
|
||
-- Voeg gewenst aantal decimalen toe
|
||
-- en een voorloop nul als het begint met een punt.
|
||
IF (INSTR(l_exprval,'.') = 0)
|
||
THEN
|
||
l_exprval := l_exprval || '.';
|
||
ELSIF (INSTR(l_exprval,'.') = 1)
|
||
THEN
|
||
l_exprval := '0' || l_exprval;
|
||
END IF;
|
||
l_exprval := l_exprval || RPAD('0', expr.fac_kenmwaarden_kenmerkdec, '0');
|
||
l_exprval := SUBSTR(l_exprval, 1, INSTR(l_exprval, '.') + expr.fac_kenmwaarden_kenmerkdec);
|
||
END IF;
|
||
ELSIF expr.fac_kenmwaarden_kenmerktype = 'V'
|
||
THEN
|
||
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval_num);
|
||
l_exprval := TO_CHAR(l_exprval_num);
|
||
ELSE
|
||
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval);
|
||
END IF;
|
||
IF l_kcolumnname_niveau IS NOT NULL
|
||
THEN
|
||
IF psavetodb = 1
|
||
THEN
|
||
-- Waarde opslaan in de database
|
||
flx.setflex (l_module, expr.fac_kenmwaarden_kenmerk_key, prefkey, expr.fac_kenmwaarden_niveau, l_exprval);
|
||
END IF;
|
||
-- Waarde van de expressie flexkenmerk in de tijdelijke kenmerk waarden tabel (fac_kenmwaarden) vullen met de nieuwe waarde.
|
||
-- Expressie flexkenmerken die afhankelijke zijn van andere expressie flexkenmerken worden dan ook goed berekend.
|
||
UPDATE fac_kenmwaarden
|
||
SET fac_kenmwaarden_waarde = l_exprval
|
||
WHERE fac_kenmwaarden_module = pmodule
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND fac_kenmwaarden_kenmerk_key = expr.fac_kenmwaarden_kenmerk_key
|
||
AND fac_kenmwaarden_niveau = expr.fac_kenmwaarden_niveau
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_isexpr = 1;
|
||
ELSE
|
||
IF psavetodb = 1
|
||
THEN
|
||
-- Waarde opslaan in de database
|
||
flx.setflex (l_module, expr.fac_kenmwaarden_kenmerk_key, prefkey, l_exprval);
|
||
END IF;
|
||
-- Waarde van de expressie flexkenmerk in de tijdelijke kenmerk waarden tabel (fac_kenmwaarden) vullen met de nieuwe waarde.
|
||
-- Expressie flexkenmerken die afhankelijke zijn van andere expressie flexkenmerken worden dan ook goed berekend.
|
||
UPDATE fac_kenmwaarden
|
||
SET fac_kenmwaarden_waarde = l_exprval
|
||
WHERE fac_kenmwaarden_module = pmodule
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND fac_kenmwaarden_kenmerk_key = expr.fac_kenmwaarden_kenmerk_key
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_niveau IS NULL
|
||
AND fac_kenmwaarden_isexpr = 1;
|
||
END IF;
|
||
END IF;
|
||
|
||
-- hierboven zijn ##EXPR## berekende kenmerken verwerkt
|
||
-- Nu nog eventuele ##SHOW## om voorwaardelijk zichtbaar te maken
|
||
l_expr := flx.getflexshowexpr(pmodule, expr.fac_kenmwaarden_kenmerk_key);
|
||
IF l_expr IS NOT NULL
|
||
THEN
|
||
DBMS_OUTPUT.PUT_LINE('Berekenen show-expressie voor kenmerk ' || expr.fac_kenmwaarden_kenmerk_key);
|
||
l_sql_exprval := 'SELECT CASE'
|
||
|| ' WHEN NVL (TO_CHAR(' || l_expr || '), ''0'') = ''0'''
|
||
|| ' THEN 0' -- als l_expr NULL, 0 of '0' oplevert
|
||
|| ' ELSE 1' -- alle andere waarden
|
||
|| ' END showexpr'
|
||
|| ' FROM DUAL';
|
||
BEGIN
|
||
DBMS_SQL.parse (l_cursor_exprval, l_sql_exprval, DBMS_SQL.native);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
raise_application_error (
|
||
-20001,
|
||
'Error parsing flex-expression ' || pmodule || ' kenmerkkey:' || expr.fac_kenmwaarden_kenmerk_key
|
||
|| CHR(10) || SQLERRM
|
||
|| CHR(10) || l_sql_exprval
|
||
|| CHR(10) || 'Original: ' || l_expr);
|
||
END;
|
||
--DBMS_SQL.describe_columns(l_cursor_exprval, l_colcnt, l_desctab);
|
||
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval_num); -- onze expressie is altijd numeriek
|
||
l_cntbind := REGEXP_COUNT (l_sql_exprval,
|
||
l_rflex,
|
||
1,
|
||
'i');
|
||
FOR l_cnt IN 1 .. l_cntbind
|
||
LOOP
|
||
l_bvar := REGEXP_SUBSTR (l_sql_exprval,
|
||
l_rflex,
|
||
1,
|
||
l_cnt,
|
||
'i');
|
||
l_kenmerk_key := TO_NUMBER (SUBSTR (l_bvar, 6));
|
||
BEGIN
|
||
SELECT fac_kenmwaarden_waarde,
|
||
fac_kenmwaarden_kenmerktype
|
||
INTO l_kenmerkwaarde,
|
||
l_kenmerktype
|
||
FROM fac_kenmwaarden
|
||
WHERE fac_kenmwaarden_module = l_module
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_kenmerk_key = l_kenmerk_key;
|
||
EXCEPTION
|
||
WHEN NO_DATA_FOUND
|
||
THEN
|
||
l_kenmerkwaarde := NULL;
|
||
l_kenmerktype := NULL;
|
||
END;
|
||
-- Als <20><>n van de flexkenmerken NULL is, dan met die waarde verder rekenen. Waarde kan bewust NULL zijn
|
||
CASE l_kenmerktype
|
||
WHEN 'D'
|
||
THEN
|
||
l_kenmerkw_date := TO_DATE(l_kenmerkwaarde, 'DD-MM-YYYY');
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_date);
|
||
WHEN 'N'
|
||
THEN
|
||
l_kenmerkw_num := TO_NUMBER(l_kenmerkwaarde);
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_num);
|
||
WHEN 'V'
|
||
THEN
|
||
l_kenmerkw_num := TO_NUMBER(l_kenmerkwaarde);
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkw_num);
|
||
ELSE
|
||
DBMS_SQL.bind_variable (l_cursor_exprval, l_bvar, l_kenmerkwaarde);
|
||
END CASE;
|
||
END LOOP;
|
||
BEGIN
|
||
l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_exprval);
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
raise_application_error (
|
||
-20001,
|
||
'Error executing flex-expression ' || pmodule|| ' kkey:' || expr.fac_kenmwaarden_kenmerk_key
|
||
|| CHR(10) || SQLERRM
|
||
|| CHR(10) || l_sql_exprval);
|
||
END;
|
||
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval_num);
|
||
|
||
UPDATE fac_kenmwaarden
|
||
SET fac_kenmwaarden_exprwaarde = TO_CHAR(l_exprval_num) -- '0' of '1'
|
||
WHERE fac_kenmwaarden_module = pmodule
|
||
AND fac_kenmwaarden_refkey = prefkey
|
||
AND fac_kenmwaarden_kenmerk_key = expr.fac_kenmwaarden_kenmerk_key
|
||
AND prs_perslid_key = puserkey
|
||
AND fac_kenmwaarden_isexpr = 1;
|
||
END IF;
|
||
DBMS_SQL.close_cursor(l_cursor_exprval);
|
||
END LOOP;
|
||
END;
|
||
END flx;
|
||
/
|
||
REGISTERRUN('$Id$')
|