/*  $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,
                                 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,
                       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,
                                 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,
                  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, expr.fac_kenmwaarden_niveau);
           l_expr := flx.getflexexpression(pmodule, expr.fac_kenmwaarden_kenmerk_key, expr.fac_kenmwaarden_niveau);
           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);
               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);
               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;
                  BEGIN
                      -- 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);
                         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);
               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;

            -- hierboven zijn ##EXPR## berekende kenmerken verwerkt
            -- Nu nog eventuele ##SHOW## om voorwaardelijk zichtbaar te maken
            -- (JGL: kan dat eigenlijk niet samengenomen worden? Ik zie veel herhaling)
            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';
              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);
              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);
               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);
                     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;
               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 AND l_exprval IS NOT NULL AND l_exprval <> '0'
                  THEN
                    -- Waarde opslaan in de database
                    flx.setflex (l_module, expr.fac_kenmwaarden_kenmerk_key, prefkey, expr.fac_kenmwaarden_niveau, expr.fac_kenmwaarden_waarde);
                  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 AND l_exprval IS NOT NULL AND l_exprval <> '0'
                  THEN
                    -- Waarde opslaan in de database
                    flx.setflex (l_module, expr.fac_kenmwaarden_kenmerk_key, prefkey, expr.fac_kenmwaarden_waarde);
                  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$')
