Files
Database/FAC/FAC_PACFLEX.SRC
Alex Tiehuis 32547f87c7 FCLT#57650 ##show## expressie via een eigen veld
svn path=/Database/trunk/; revision=42822
2019-06-04 09:23:09 +00:00

737 lines
37 KiB
Plaintext
Raw Blame History

/* $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) 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);
PROCEDURE deleteflex (pmodule IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_ref_key IN NUMBER,
p_niveau IN VARCHAR2);
FUNCTION getflexexprtype (pmodule IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_niveau IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
FUNCTION getflexexpression (pmodule IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_niveau IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
FUNCTION getflexshowexpr (pmodule IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_niveau IN VARCHAR2 DEFAULT NULL) 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) 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
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;
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)
AS
l_module VARCHAR2 (3);
l_sql_kenm VARCHAR2 (4500);
l_sql_insert VARCHAR2 (4500);
l_sql_update VARCHAR2 (4500);
l_sql 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';
EXECUTE IMMEDIATE l_sql_kenm INTO l_aantal_kenm;
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_insert := 'INSERT INTO ' || l_kenmval_tablename ||
' (' || l_kcolumnname_refkey ||
' , ' || l_kcolumnname_kkey ||
' , ' || l_kcolumnname_waarde ||
l_niveau_col ||
' )' ||
' VALUES (' || p_ref_key ||
' , ' || p_kenmerk_key ||
' , :pwaarde'||
l_niveau_val ||
' )';
l_sql := l_sql_insert;
ELSE
l_sql_update := 'UPDATE ' || l_kenmval_tablename ||
' SET ' || l_kcolumnname_waarde || ' = :pwaarde' ||
' WHERE ' || l_kcolumnname_refkey || ' = ' || p_ref_key ||
' AND ' || l_kcolumnname_kkey || ' = ' || p_kenmerk_key ||
' AND ' || l_kcolumnname_delete || ' IS NULL';
l_sql := l_sql_update;
END IF;
DBMS_SQL.parse (l_cursor_upsert, l_sql, DBMS_SQL.native);
DBMS_SQL.BIND_VARIABLE(l_cursor_upsert,':pwaarde', p_waarde);
l_rowsprocessed := DBMS_SQL.execute (l_cursor_upsert);
DBMS_SQL.close_cursor(l_cursor_upsert);
END;
PROCEDURE deleteflex (pmodule IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_ref_key IN NUMBER,
p_niveau IN VARCHAR2)
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;
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,
p_niveau IN VARCHAR2 DEFAULT NULL) 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,
p_niveau IN VARCHAR2 DEFAULT NULL) 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,
p_niveau IN VARCHAR2 DEFAULT NULL) 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
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, expr.fac_kenmwaarden_niveau);
l_expr := flx.getflexexpression(pmodule, expr.fac_kenmwaarden_kenmerk_key, expr.fac_kenmwaarden_niveau);
IF l_expr IS NOT NULL
THEN
l_sql_exprval := 'SELECT ' || '(' || l_expr || ')' || ' FROM DUAL';
DBMS_SQL.parse (l_cursor_exprval, l_sql_exprval, DBMS_SQL.native);
--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);
ELSIF expr.fac_kenmwaarden_kenmerktype = 'D'
THEN
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval_date);
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;
-- 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;
l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_exprval);
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);
ELSIF expr.fac_kenmwaarden_kenmerktype = 'D'
THEN
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval_date);
l_exprval := TO_CHAR(l_exprval_date, 'DD-MM-YYYY');
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;
l_expr := flx.getflexshowexpr(pmodule, expr.fac_kenmwaarden_kenmerk_key, expr.fac_kenmwaarden_niveau);
IF l_expr IS NOT NULL
THEN
l_sql_exprval := 'SELECT ' || '(' || l_expr || ')' || ' FROM DUAL';
DBMS_SQL.parse (l_cursor_exprval, l_sql_exprval, DBMS_SQL.native);
--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);
ELSIF expr.fac_kenmwaarden_kenmerktype = 'D'
THEN
DBMS_SQL.define_column(l_cursor_exprval, 1, l_exprval_date);
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;
-- 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;
l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_exprval);
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);
ELSIF expr.fac_kenmwaarden_kenmerktype = 'D'
THEN
DBMS_SQL.column_value (l_cursor_exprval, 1, l_exprval_date);
l_exprval := TO_CHAR(l_exprval_date, 'DD-MM-YYYY');
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_exprwaarde = 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_exprwaarde = 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;
DBMS_SQL.close_cursor(l_cursor_exprval);
END LOOP;
END;
END flx;
/
REGISTERRUN('$Id$')