HMOD#87864 Probleem met Workflow Spendcloud: automatische afmelding

svn path=/Database/trunk/; revision=68359
This commit is contained in:
Erik Groener
2025-03-11 13:42:13 +00:00
parent d31b144a5f
commit eed7a54398

View File

@@ -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