/*  $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
                        );
    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 getflexexpression (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
                        )
    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_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_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_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_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_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 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_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);

       -- 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 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_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);

       -- 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 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_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_niveau_val          VARCHAR2 (1)  DEFAULT '';

       CURSOR c_expressions
       IS
          SELECT fac_kenmwaarden_kenmerk_key,
                 fac_kenmwaarden_kenmerktype,
                 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);

       FOR expr IN c_expressions
       LOOP
          l_cursor_exprval := DBMS_SQL.open_cursor;
          -- Expressie opvragen.
          l_expr := flx.getflexexpression(pmodule, expr.fac_kenmwaarden_kenmerk_key, expr.fac_kenmwaarden_niveau);

          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 = '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 éé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);
                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);
          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;

         DBMS_SQL.close_cursor(l_cursor_exprval);
       END LOOP;
    END;

END flx;
/
REGISTERRUN('$Id$')
