HMOD#87864 Probleem met Workflow Spendcloud: automatische afmelding
svn path=/Database/trunk/; revision=68359
This commit is contained in:
188
MLD/MLD_PAC.SRC
188
MLD/MLD_PAC.SRC
@@ -2685,7 +2685,7 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
-- and the flexprops of p_melding_key if these match the mld_srtkenmerk_key
|
||||
LOOP
|
||||
|
||||
DBMS_OUTPUT.put_line( 'startkey:'
|
||||
DBMS_OUTPUT.put_line ( 'startkey:'
|
||||
|| l_melding_start_key
|
||||
|| ' step key:'
|
||||
|| r_nextsteps.mld_workflowstep_key);
|
||||
@@ -2696,78 +2696,79 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key;
|
||||
|
||||
DBMS_OUTPUT.put_line (
|
||||
'total nr of possible predecessors for next step: ' || l_nrofpossiblepredecessors);
|
||||
DBMS_OUTPUT.put_line ('total nr of possible predecessors for next step: ' || l_nrofpossiblepredecessors);
|
||||
|
||||
SELECT COUNT ( * )
|
||||
INTO l_nrofactualpredecessors -- disregard status
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key =
|
||||
r_nextsteps.mld_workflowstep_key)
|
||||
SELECT COUNT ( * )
|
||||
INTO l_nrofactualpredecessors -- disregard status
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key
|
||||
)
|
||||
-- the step to be continued
|
||||
AND mld_melding_start_key = l_melding_start_key; -- for this thread
|
||||
AND m.mld_melding_start_key = l_melding_start_key; -- for this thread
|
||||
|
||||
DBMS_OUTPUT.put_line('total nr of actual predecessors for next step: '
|
||||
|| l_nrofactualpredecessors);
|
||||
DBMS_OUTPUT.put_line ('total nr of actual predecessors for next step: '
|
||||
|| l_nrofactualpredecessors);
|
||||
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors;
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors;
|
||||
|
||||
-- If there is a difference between l_nrofpossiblepredecessors and l_nrofactualpredecessors there are
|
||||
-- a few possibilities:
|
||||
-- a. an actual predecessor has not been started yet (workflow branches are unequal length)
|
||||
-- b. an actual predecessor has not been started and will not start due to a condition
|
||||
-- In case a. the predecessor will start eventually and then trigger the next step.
|
||||
-- Then l_nrofreadypredecessors = l_nrofpossiblepredecessors
|
||||
-- In case b. the l_nrofreadypredecessors will never reach l_nrofpossiblepredecessors, the
|
||||
-- next step will be triggered when l_nrofreadypredecessors = l_nrofactualpredecessors
|
||||
-- The question is: how do we distinguish a and b?
|
||||
--
|
||||
-- Suggestion: backtracking the workflow for the step that is not (yet) there?
|
||||
IF l_nrofpossiblepredecessors > l_nrofactualpredecessors
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT wr1.mld_workflowstep_key
|
||||
INTO l_common_ancestor
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key)
|
||||
GROUP BY wr1.mld_workflowstep_key;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND OR TOO_MANY_ROWS
|
||||
THEN
|
||||
-- If there is a difference between l_nrofpossiblepredecessors and l_nrofactualpredecessors there are
|
||||
-- a few possibilities:
|
||||
-- a. an actual predecessor has not been started yet (workflow branches are unequal length)
|
||||
-- b. an actual predecessor has not been started and will not start due to a condition
|
||||
-- In case a. the predecessor will start eventually and then trigger the next step.
|
||||
-- Then l_nrofreadypredecessors = l_nrofpossiblepredecessors
|
||||
-- In case b. the l_nrofreadypredecessors will never reach l_nrofpossiblepredecessors, the
|
||||
-- next step will be triggered when l_nrofreadypredecessors = l_nrofactualpredecessors
|
||||
-- The question is: how do we distinguish a and b?
|
||||
--
|
||||
-- Suggestion: backtracking the workflow for the step that is not (yet) there?
|
||||
IF l_nrofpossiblepredecessors > l_nrofactualpredecessors
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT wr1.mld_workflowstep_key
|
||||
INTO l_common_ancestor
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key
|
||||
)
|
||||
GROUP BY wr1.mld_workflowstep_key;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND OR TOO_MANY_ROWS
|
||||
THEN
|
||||
l_common_ancestor := -1;
|
||||
END;
|
||||
END;
|
||||
|
||||
IF l_common_ancestor <> -1
|
||||
THEN
|
||||
IF l_common_ancestor <> -1
|
||||
THEN
|
||||
DBMS_OUTPUT.put_line ('Common ancestor detected for all previous workflowsteps, so a condition not met (case b)');
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors;
|
||||
ELSE
|
||||
ELSE
|
||||
-- determine case a or case b
|
||||
FOR missingsteps
|
||||
IN (SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key =
|
||||
r_nextsteps.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key
|
||||
MINUS
|
||||
SELECT mld_workflowstep_key
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key =
|
||||
r_nextsteps.mld_workflowstep_key)
|
||||
AND mld_melding_start_key = l_melding_start_key) LOOP
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key
|
||||
)
|
||||
AND mld_melding_start_key = l_melding_start_key
|
||||
)
|
||||
LOOP
|
||||
-- This predecessing step missingsteps.mld_workflowstep_key is possible but not actual. How come?
|
||||
-- Are some of its predecessor(s) not being the root actual in this workflow?
|
||||
-- NOTE THAT THIS NEEDS ATTENTION IF WE NEED TO SUPPORT LONGER, UNBALANCED, CONDITIONAL WORKFLOWS
|
||||
@@ -2776,18 +2777,18 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
INTO l_prepredecessors
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key =
|
||||
missingsteps.mld_workflowstep_key)
|
||||
AND mld_melding_key <> l_melding_start_key
|
||||
AND mld_melding_start_key = l_melding_start_key;
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = missingsteps.mld_workflowstep_key
|
||||
)
|
||||
AND mld_melding_key <> l_melding_start_key
|
||||
AND mld_melding_start_key = l_melding_start_key;
|
||||
|
||||
DBMS_OUTPUT.put_line('Complex case! Total nr of actual prepredecessors for predecessor-step '
|
||||
|| missingsteps.mld_workflowstep_key
|
||||
|| ': '
|
||||
|| l_prepredecessors);
|
||||
DBMS_OUTPUT.put_line ('Complex case! Total nr of actual prepredecessors for predecessor-step '
|
||||
|| missingsteps.mld_workflowstep_key
|
||||
|| ': '
|
||||
|| l_prepredecessors);
|
||||
|
||||
IF l_prepredecessors = 0
|
||||
THEN
|
||||
@@ -2806,30 +2807,30 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
THEN
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors + nrcase_a; --l_nrofpossiblepredecessors;
|
||||
END IF;
|
||||
END IF;
|
||||
ELSE
|
||||
-- both are the same, just pick one to test against later
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors;
|
||||
END IF;
|
||||
END IF;
|
||||
ELSE
|
||||
-- both are the same, just pick one to test against later
|
||||
l_nrofrequiredpredecessors := l_nrofactualpredecessors;
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.put_line('total nr of required predecessors for next step: '
|
||||
|| l_nrofrequiredpredecessors);
|
||||
DBMS_OUTPUT.put_line ('total nr of required predecessors for next step: '
|
||||
|| l_nrofrequiredpredecessors);
|
||||
|
||||
SELECT COUNT ( * )
|
||||
INTO l_nrofreadypredecessors
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key =
|
||||
r_nextsteps.mld_workflowstep_key)
|
||||
-- the step to be continued
|
||||
AND mld_melding_status IN (1, 5, 6) -- predecessor has been handled, no matter how
|
||||
AND mld_melding_start_key = l_melding_start_key; -- for this thread
|
||||
SELECT COUNT ( * )
|
||||
INTO l_nrofreadypredecessors
|
||||
FROM mld_melding m
|
||||
WHERE m.mld_workflowstep_key IN
|
||||
(SELECT wr1.mld_workflowstep_key
|
||||
FROM mld_workflowrule wr1, mld_workflowstep ws1
|
||||
WHERE wr1.mld_workflowstep_key = ws1.mld_workflowstep_key
|
||||
AND wr1.mld_workflowstep_next_key = r_nextsteps.mld_workflowstep_key
|
||||
)
|
||||
-- the step to be continued
|
||||
AND mld_melding_status IN (1, 5, 6) -- predecessor has been handled, no matter how
|
||||
AND mld_melding_start_key = l_melding_start_key; -- for this thread
|
||||
|
||||
DBMS_OUTPUT.put_line (
|
||||
'total nr of READY predecessors for next step: ' || l_nrofreadypredecessors);
|
||||
DBMS_OUTPUT.put_line ('total nr of READY predecessors for next step: '
|
||||
|| l_nrofreadypredecessors);
|
||||
createthisnextstep := FALSE;
|
||||
|
||||
-- What we do next depends on the jointype. We are one predecessor ourselves. Options are:
|
||||
@@ -2849,12 +2850,11 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
CASE r_nextsteps.mld_workflowstep_jointype
|
||||
WHEN 0
|
||||
THEN -- AND
|
||||
createthisnextstep :=
|
||||
l_nrofreadypredecessors >= l_nrofrequiredpredecessors OR p_success = -1;
|
||||
createthisnextstep := l_nrofreadypredecessors >= l_nrofrequiredpredecessors OR p_success = -1;
|
||||
WHEN 1
|
||||
THEN -- OR
|
||||
createthisnextstep := l_nrofreadypredecessors = 1;
|
||||
-- if l_nrofreadypredecessors > 1 the creation has already taken place :-)
|
||||
createthisnextstep := l_nrofreadypredecessors = 1 OR p_success = -1;
|
||||
-- if l_nrofreadypredecessors > 1 the creation has already taken place :-)
|
||||
WHEN 2
|
||||
THEN -- SYNC
|
||||
-- Wel nog een beetje raar in onze <20>naar mijn groeiende overtuiging slimmere- implementatie:
|
||||
@@ -2865,8 +2865,7 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
|
||||
IF createthisnextstep
|
||||
THEN
|
||||
DBMS_OUTPUT.put_line (
|
||||
'We GO for the next step ' || r_nextsteps.mld_workflowstep_key);
|
||||
DBMS_OUTPUT.put_line ('We GO for the next step ' || r_nextsteps.mld_workflowstep_key);
|
||||
|
||||
IF evaluatecondition (p_melding_key, r_nextsteps.mld_workflowrule_condition)
|
||||
THEN
|
||||
@@ -2882,8 +2881,7 @@ CREATE OR REPLACE PACKAGE BODY mld AS
|
||||
rootregistered := TRUE;
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.put_line (
|
||||
'We actually start the next step ' || r_nextsteps.mld_workflowstep_key);
|
||||
DBMS_OUTPUT.put_line ('We actually start the next step ' || r_nextsteps.mld_workflowstep_key);
|
||||
l_nrstepsevaluatedtrue := l_nrstepsevaluatedtrue + 1;
|
||||
|
||||
IF r_nextsteps.mld_directklaar = 2
|
||||
|
||||
Reference in New Issue
Block a user