diff --git a/data/ddl/package/UNICAEN_TBL/body.sql b/data/ddl/package/UNICAEN_TBL/body.sql
index 71aca3b1374c0a5feb6b739d75997189e3fe40cc..3f3c18e4fe17313714fd7d6078d29998a510b5a2 100644
--- a/data/ddl/package/UNICAEN_TBL/body.sql
+++ b/data/ddl/package/UNICAEN_TBL/body.sql
@@ -1,169 +1,165 @@
 CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS
+  TYPE t_dems_values IS TABLE OF BOOLEAN INDEX BY VARCHAR2(80);
+  TYPE t_dems_params IS TABLE OF t_dems_values INDEX BY VARCHAR2(30);
+  TYPE t_dems IS TABLE OF t_dems_params INDEX BY VARCHAR2(30);
 
-    FUNCTION MAKE_WHERE(param VARCHAR2 DEFAULT NULL, value VARCHAR2 DEFAULT NULL,
-                        alias VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
-        res VARCHAR2(120) DEFAULT '';
-    BEGIN
-        IF param IS NULL THEN
-            RETURN '1=1';
-        END IF;
+  dems t_dems;
 
-        IF alias IS NOT NULL THEN
-            res := alias || '.';
-        END IF;
 
-        IF value IS NULL THEN
-            RETURN res || param || ' IS NULL';
-        END IF;
 
-        RETURN res || param || ' = q''[' || value || ']''';
-    END;
+  FUNCTION MAKE_WHERE(param VARCHAR2 DEFAULT NULL, value VARCHAR2 DEFAULT NULL,
+                      alias VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
+    res VARCHAR2(120) DEFAULT '';
+  BEGIN
+    IF param IS NULL THEN
+      RETURN '1=1';
+    END IF;
+    IF alias IS NOT NULL THEN
+      res := alias || '.';
+    END IF;
+    IF value IS NULL THEN
+      RETURN res || param || ' IS NULL';
+    END IF;
+   RETURN res || param || ' = q''[' || value || ']''';
+  END;
 
 
-    FUNCTION QUERY_APPLY_PARAM(sqlQuery VARCHAR2, param VARCHAR2, value VARCHAR2) RETURN CLOB IS
-        pos       NUMERIC;
-        paramLen  NUMERIC;
-        paramComm VARCHAR2(200);
-        debComm   NUMERIC;
-        endComm   NUMERIC;
-        debReal   NUMERIC;
-        realParam VARCHAR2(80);
-        realValue VARCHAR2(120);
-        q         CLOB;
-    BEGIN
-        q := sqlQuery;
 
-        IF param IS NULL THEN
-            RETURN q;
-        END IF;
+  FUNCTION QUERY_APPLY_PARAM(sqlQuery VARCHAR2, param VARCHAR2, value VARCHAR2) RETURN CLOB IS
+    pos       NUMERIC;
+    paramLen  NUMERIC;
+    paramComm VARCHAR2(200);
+    debComm   NUMERIC;
+    endComm   NUMERIC;
+    debReal   NUMERIC;
+    realParam VARCHAR2(80);
+    realValue VARCHAR2(120);
+    q         CLOB;
+  BEGIN
+    q := sqlQuery;
+    IF param IS NULL THEN
+      RETURN q;
+    END IF;
 
-        paramlen := length(param);
+    paramlen := length(param);
+    IF value IS NULL THEN
+      realValue := ' IS NULL';
+    ELSE
+      BEGIN
+        realValue := TO_NUMBER(value);
+      EXCEPTION
+        WHEN VALUE_ERROR THEN
+          realValue := 'q''[' || value || ']''';
+      END;
+     realValue := '=' || realValue;
+    END IF;
 
-        IF value IS NULL THEN
-            realValue := ' IS NULL';
-        ELSE
-            BEGIN
-                realValue := TO_NUMBER(value);
-            EXCEPTION
-                WHEN VALUE_ERROR THEN
-                    realValue := 'q''[' || value || ']''';
-            END;
+    LOOP
+      pos := instr(q, '/*@' || param, 1, 1);
+      EXIT WHEN pos = 0;
+     debComm := pos - 1;
+      endComm := instr(q, '*/', pos, 1);
+      paramComm := substr(q, debComm, endComm - debComm);
+     debReal := instr(paramComm, '=', 1, 1);
+     realParam := trim(substr(paramComm, debReal + 1));
+     --realParam := 'AND ' || substr(q,pos + paramLen + 4,endComm-pos - paramLen - 4);
+      realParam := 'AND ' || realParam || realValue;
+     q := substr(q, 1, debComm) || realParam || substr(q, endComm + 2);
+    END LOOP;
 
-            realValue := '=' || realValue;
-        END IF;
+    RETURN q;
+  END;
 
-        LOOP
-            pos := instr(q, '/*@' || param, 1, 1);
-            EXIT WHEN pos = 0;
 
-            debComm := pos - 1;
-            endComm := instr(q, '*/', pos, 1);
-            paramComm := substr(q, debComm, endComm - debComm);
 
-            debReal := instr(paramComm, '=', 1, 1);
+  PROCEDURE CALCULER(TBL_NAME VARCHAR2) IS
+  BEGIN
+    ANNULER_DEMANDES(TBL_NAME);
+    CALCULER(TBL_NAME, null, null);
+  END;
 
-            realParam := trim(substr(paramComm, debReal + 1));
 
-            --realParam := 'AND ' || substr(q,pos + paramLen + 4,endComm-pos - paramLen - 4);
-            realParam := 'AND ' || realParam || realValue;
 
+  PROCEDURE CALCULER(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS
+    calcul_proc varchar2(30);
+  BEGIN
+    IF NOT UNICAEN_TBL.ACTIV_CALCULS THEN RETURN; END IF;
 
-            q := substr(q, 1, debComm) || realParam || substr(q, endComm + 2);
-        END LOOP;
-        RETURN q;
-    END;
-
-
-    PROCEDURE CALCULER(TBL_NAME VARCHAR2) IS
-    BEGIN
-        ANNULER_DEMANDES(TBL_NAME);
-        CALCULER(TBL_NAME, null, null);
-    END;
-
-
-    PROCEDURE CALCULER(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS
-        calcul_proc varchar2(30);
-    BEGIN
-        IF NOT UNICAEN_TBL.ACTIV_CALCULS THEN RETURN; END IF;
-
-        SELECT custom_calcul_proc INTO calcul_proc FROM tbl WHERE tbl_name = CALCULER.TBL_NAME;
-
-        UNICAEN_TBL.CALCUL_PROC_PARAM := PARAM;
-        UNICAEN_TBL.CALCUL_PROC_VALUE := VALUE;
-        IF calcul_proc IS NOT NULL THEN
-            EXECUTE IMMEDIATE
-                    'BEGIN ' || calcul_proc || '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;';
-        ELSE
-            EXECUTE IMMEDIATE
-                    'BEGIN UNICAEN_TBL.C_' || TBL_NAME ||
-                    '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;';
-        END IF;
-
-    END;
-
-
-    PROCEDURE DEMANDE_CALCUL(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS
-    BEGIN
-        INSERT INTO tbl_dems (ID,
-                              TBL_NAME,
-                              PARAM, VALUE)
-        VALUES (TBL_DEMS_ID_SEQ.NEXTVAL,
-                TBL_NAME,
-                PARAM, VALUE);
-    END;
-
-
-    PROCEDURE ANNULER_DEMANDES IS
-    BEGIN
-        DELETE FROM tbl_dems;
-    END;
-
-
-    PROCEDURE ANNULER_DEMANDES(TBL_NAME VARCHAR2) IS
-    BEGIN
-        DELETE FROM tbl_dems WHERE tbl_name = ANNULER_DEMANDES.tbl_name;
-    END;
-
-
-    FUNCTION HAS_DEMANDES RETURN BOOLEAN IS
-        has_dems NUMERIC;
-    BEGIN
-        SELECT count(*) INTO has_dems from tbl_dems where rownum = 1;
-
-        RETURN has_dems = 1;
-    END;
-
-
-    PROCEDURE CALCULER_DEMANDES IS
-        TYPE t_dems IS TABLE OF tbl_dems%rowtype INDEX BY PLS_INTEGER;
-        dems t_dems;
-        i NUMERIC DEFAULT 0;
-    BEGIN
-        FOR d IN (
-            SELECT DISTINCT tbl_name, param, value FROM tbl_dems
-        ) LOOP
-            i := i + 1;
-            dems(i).tbl_name := d.tbl_name;
-            dems(i).param := d.param;
-            dems(i).value := d.value;
-        END LOOP;
-        DELETE FROM TBL_DEMS;
-        COMMIT;
+    SELECT custom_calcul_proc INTO calcul_proc FROM tbl WHERE tbl_name = CALCULER.TBL_NAME;
 
-        i := dems.FIRST;
-        LOOP EXIT WHEN i IS NULL;
-            calculer(dems(i).tbl_name, dems(i).param, dems(i).value);
+    UNICAEN_TBL.CALCUL_PROC_PARAM := PARAM;
+    UNICAEN_TBL.CALCUL_PROC_VALUE := VALUE;
+    IF calcul_proc IS NOT NULL THEN
+      EXECUTE IMMEDIATE
+              'BEGIN ' || calcul_proc || '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;';
+    ELSE
+      EXECUTE IMMEDIATE
+              'BEGIN UNICAEN_TBL.C_' || TBL_NAME ||
+              '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;';
+    END IF;
+  END;
 
-            i := dems.NEXT(i);
+
+
+  PROCEDURE DEMANDE_CALCUL(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS
+  BEGIN
+    dems(TBL_NAME)(param)(value) := TRUE;
+  END;
+
+
+
+  PROCEDURE ANNULER_DEMANDES IS
+  BEGIN
+    dems.delete;
+  END;
+
+
+
+  PROCEDURE ANNULER_DEMANDES(TBL_NAME VARCHAR2) IS
+  BEGIN
+    dems(tbl_name).delete;
+  END;
+
+
+
+  FUNCTION HAS_DEMANDES RETURN BOOLEAN IS
+  BEGIN
+    RETURN dems.count > 0;
+  END;
+
+
+
+  PROCEDURE CALCULER_DEMANDES IS
+    d t_dems;
+    tbl_name VARCHAR2(30);
+    param VARCHAR2(30);
+    value VARCHAR2(80);
+  BEGIN
+    d := dems;
+    dems.delete;
+
+    tbl_name := d.FIRST;
+    LOOP EXIT WHEN tbl_name IS NULL;
+      param := d(tbl_name).FIRST;
+      LOOP EXIT WHEN param IS NULL;
+        value := d(tbl_name)(param).FIRST;
+        LOOP EXIT WHEN value IS NULL;
+          calculer(tbl_name, param, value);
+          value := d(tbl_name)(param).NEXT(value);
         END LOOP;
+        param := d(tbl_name).NEXT(param);
+      END LOOP;
+      tbl_name := d.NEXT(tbl_name);
+    END LOOP;
+
+    IF HAS_DEMANDES THEN -- pour les boucles !!
+      CALCULER_DEMANDES;
+    END IF;
+  END;
 
-        IF HAS_DEMANDES THEN -- pour les boucles !!
-            CALCULER_DEMANDES;
-        END IF;
-    END;
 
 
-    -- AUTOMATIC GENERATION --
+  -- AUTOMATIC GENERATION --
 
   PROCEDURE C_AGREMENT(param VARCHAR2, value VARCHAR2) IS
   TYPE r_cursor IS REF CURSOR;