1 PACKAGE BODY CZ_REFS AS
2 /* $Header: czrefb.pls 120.5.12010000.2 2009/03/02 14:47:07 vsingava ship $*/
3
4 PRODUCT_TYPE CONSTANT INTEGER:=258;
5 COMPONENT_TYPE CONSTANT INTEGER:=259;
6 FEATURE_TYPE CONSTANT INTEGER:=261;
7 OPTION_TYPE CONSTANT INTEGER:=262;
8 REFERENCE_TYPE CONSTANT INTEGER:=263;
9 CONNECTOR_TYPE CONSTANT INTEGER:=264;
10 BOM_MODEL_TYPE CONSTANT INTEGER:=436;
11
12 CONTRIBUTE_TO_MIN_SUBTYPE CONSTANT INTEGER:=4;
13 CONTRIBUTE_TO_MAX_SUBTYPE CONSTANT INTEGER:=5;
14
15 CONTRIBUTE_TO_MIN CONSTANT INTEGER:=1;
16 CONTRIBUTE_TO_MAX CONSTANT INTEGER:=2;
17 CONTRIBUTE_TO_MINMAX CONSTANT INTEGER:=3;
18
19 MINUS_MODE CONSTANT VARCHAR2(1):='-';
20 PLUS_MODE CONSTANT VARCHAR2(1):='+';
21
22 TYPE IdStructure IS RECORD(new_id INTEGER,
23 parent_id INTEGER,
24 ps_node_id INTEGER,
25 ps_node_type INTEGER,
26 component_id INTEGER,
27 child_model_id INTEGER,
28 current_level INTEGER,
29 expl_node_type INTEGER,
30 virtual_flag VARCHAR2(1),
31 expl_path VARCHAR2(32000));
32
33 TYPE modelArrStructure IS RECORD(model_id INTEGER,
34 parent_model_id INTEGER,
35 connector_loop BOOLEAN:=FALSE);
36
37 TYPE ArrayId IS TABLE OF IdStructure INDEX BY BINARY_INTEGER;
38 TYPE IntArray IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
39 TYPE modelArray IS TABLE OF modelArrStructure INDEX BY BINARY_INTEGER;
40 TYPE Int2Array IS TABLE OF IntArray INDEX BY BINARY_INTEGER;
41 TYPE Varchar2Array IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
42
43 TYPE Int2RecArray IS TABLE OF ArrayId INDEX BY BINARY_INTEGER;
44
45 g_hash_tree_tbl Int2RecArray;
46 g_root_point_tree_tbl IntArray;
47 t_models modelArray;
48 t_chain modelArray;
49 t_projectCache IntArray;
50
51 t_old_expl_ids IntArray;
52 t_new_expl_ids IntArray;
53
54 m_RUN_ID NUMBER;
55
56 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
57 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
58
59 PROCEDURE Initialize IS
60 BEGIN
61 FND_MSG_PUB.initialize;
62 SELECT CZ_XFR_RUN_INFOS_S.NEXTVAL INTO m_RUN_ID FROM dual;
63 END Initialize;
64
65 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
66 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
67
68 PROCEDURE LOG_REPORT
69 (p_caller IN VARCHAR2,
70 p_str IN VARCHAR2) IS
71
72 l_return BOOLEAN;
73
74 BEGIN
75 l_return := cz_utils.log_report(Msg => p_str,
76 Urgency => 1,
77 ByCaller => p_caller,
78 StatusCode => 11276,
79 RunId => m_RUN_ID);
80 END;
81
82 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
83 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
84
85 PROCEDURE DEBUG(p_str IN VARCHAR2) IS
86 BEGIN
87 NULL;
88 --DBMS_OUTPUT.PUT_LINE(p_str);
89 END;
90
91 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
92 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
93
94 PROCEDURE DEBUG(p_str IN VARCHAR2,v_num IN NUMBER) IS
95 BEGIN
96 DEBUG(p_str||'='||TO_CHAR(v_num));
97 END;
98
99 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
100 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
101
102 PROCEDURE DEBUG(p_name IN VARCHAR2,p_arr IN ArrayId) IS
103 v_ind PLS_INTEGER;
104 v_counter PLS_INTEGER:=0;
105 BEGIN
106 IF p_arr.COUNT=0 THEN
107 RETURN;
108 END IF;
109 v_ind:=p_arr.FIRST;
110 LOOP
111 IF v_ind IS NULL THEN
112 EXIT;
113 END IF;
114 v_counter:=v_counter+1;
115 DEBUG('++++++ '||TO_CHAR(v_counter)||' ++++++');
116 DEBUG(p_name||'('||TO_CHAR(v_ind)||').new_id='||TO_CHAR(p_arr(v_ind).new_id));
117 DEBUG(p_name||'('||TO_CHAR(v_ind)||').parent_id='||TO_CHAR(p_arr(v_ind).parent_id));
118 DEBUG(p_name||'('||TO_CHAR(v_ind)||').component_id='||TO_CHAR(p_arr(v_ind).component_id));
119 v_ind:=p_arr.NEXT(v_ind);
120 DEBUG('++++++++++++++++++++++++++++++++++++++');
121 END LOOP;
122 END DEBUG;
123 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
124 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
125
126 -- p_out_flag=0 - it's not nonVirtual --
127 -- p_out_flag=1 - nonVirtual --
128 /* old version
129 PROCEDURE IsNonVirtual
130 (p_ps_node_id IN INTEGER,
131 p_model_id IN INTEGER,
132 p_out_flag OUT NOCOPY INTEGER) IS
133
134 BEGIN
135 p_out_flag:=0;
136 SELECT 1 INTO p_out_flag FROM CZ_PS_NODES
137 WHERE deleted_flag = NO_FLAG
138 AND ps_node_id=p_ps_node_id AND ps_node_type IN(COMPONENT_TYPE,PRODUCT_TYPE,
139 REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE)
140 AND ps_node_id NOT IN
141 (SELECT ps_node_id FROM CZ_PS_NODES nodes
142 WHERE deleted_flag = NO_FLAG
143 AND devl_project_id =p_model_id
144 AND ps_node_type IN(COMPONENT_TYPE,REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE)
145 AND MINIMUM = 1
146 AND MAXIMUM = 1
147 AND NOT EXISTS
148 (SELECT 1 FROM cz_expression_nodes x
149 WHERE deleted_flag = NO_FLAG
150 AND consequent_flag =YES_FLAG
151 AND ps_node_id = nodes.ps_node_id
152 AND EXISTS
153 (SELECT NULL FROM cz_rules WHERE (antecedent_id=x.express_id OR consequent_id=x.express_id
154 OR amount_id=x.express_id) AND disabled_flag=NO_FLAG
155 AND devl_project_id=p_model_id AND deleted_flag=NO_FLAG)));
156 EXCEPTION
157 WHEN NO_DATA_FOUND THEN
158 NULL;
159 WHEN OTHERS THEN
160 LOG_REPORT('IsNonVirtual','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
161 END;
162 */
163
164 PROCEDURE IsNonVirtual
165 (p_ps_node_id IN INTEGER,
166 p_model_id IN INTEGER,
167 p_out_flag OUT NOCOPY INTEGER) IS
168
169 BEGIN
170 p_out_flag:=0;
171 SELECT 1 INTO p_out_flag FROM CZ_PS_NODES
172 WHERE deleted_flag = NO_FLAG
173 AND ps_node_id=p_ps_node_id AND (instantiable_flag IN (OPTIONAL_EXPL_TYPE,OPTIONAL_EXPL_TYPE) OR
174 (ps_node_type IN(COMPONENT_TYPE,PRODUCT_TYPE,REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE) AND NOT(MAXIMUM=1 AND MINIMUM=1)));
175 EXCEPTION
176 WHEN NO_DATA_FOUND THEN
177 NULL;
178 WHEN OTHERS THEN
179 LOG_REPORT('IsNonVirtual','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
180 END;
181
182 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
183 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
184
185 FUNCTION allocate_Expl_Id RETURN NUMBER IS
186 v_next_id NUMBER;
187 BEGIN
188 SELECT CZ_MODEL_REF_EXPLS_S.NEXTVAL INTO v_next_id FROM dual;
189 RETURN v_next_id;
190 END allocate_Expl_Id;
191
192 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
193 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
194
195 FUNCTION get_Root_Expl_Id(p_model_id IN NUMBER) RETURN NUMBER IS
196 v_expl_node_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
197 BEGIN
198 SELECT model_ref_expl_id INTO v_expl_node_id FROM CZ_MODEL_REF_EXPLS
199 WHERE component_id=p_model_id AND model_id=p_model_id AND
200 parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
201 RETURN v_expl_node_id;
202 END get_Root_Expl_Id;
203
204 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
205 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
206
207 FUNCTION circularity_Exists
208 (
209 p_source_model_id IN NUMBER,
210 p_target_model_id IN NUMBER
211 ) RETURN VARCHAR2 IS
212
213 p_circularity_exists VARCHAR2(1):=NO_FLAG;
214
215 BEGIN
216 SELECT YES_FLAG INTO p_circularity_exists FROM dual WHERE
217 EXISTS
218 (SELECT component_id FROM CZ_MODEL_REF_EXPLS
219 WHERE model_id=p_target_model_id AND deleted_flag=NO_FLAG
220 AND ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) AND component_id=p_source_model_id) OR
221 (p_target_model_id=p_source_model_id);
222 RETURN p_circularity_exists;
223 EXCEPTION
224 WHEN OTHERS THEN
225 RETURN p_circularity_exists;
226 END;
227
228 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
229 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
230
231 --
232 -- this procedure is used in temporary fix for the bug #2425995
233 --
234 PROCEDURE update_Node_Depth(p_model_id IN INTEGER) IS
235
236 t_nodes_to_delete_tbl IntArray;
237
238 PROCEDURE update_Node_Depth_
239 (p_model_id IN INTEGER,
240 p_expl_id IN INTEGER DEFAULT NULL,
241 p_node_depth IN INTEGER DEFAULT NULL,
242 p_ps_node_id IN INTEGER DEFAULT NULL,
243 p_ps_node_type IN INTEGER DEFAULT NULL) IS
244
245 v_node_depth INTEGER;
246 v_model_ref_expl_id INTEGER;
247
248 BEGIN
249 IF p_node_depth IS NULL THEN
250 UPDATE CZ_MODEL_REF_EXPLS
251 SET node_depth=0
252 WHERE model_id=p_model_id AND parent_expl_node_id IS NULL
253 AND deleted_flag=NO_FLAG
254 RETURNING model_ref_expl_id INTO v_model_ref_expl_id;
255 update_Node_Depth_(p_model_id,v_model_ref_expl_id,0);
256 ELSE
257 v_node_depth:=p_node_depth+1;
258 FOR i IN(SELECT model_ref_expl_id,referring_node_id,ps_node_type FROM CZ_MODEL_REF_EXPLS
259 WHERE model_id=p_model_id AND parent_expl_node_id=p_expl_id
260 AND deleted_flag=NO_FLAG)
261 LOOP
262 UPDATE CZ_MODEL_REF_EXPLS
263 SET node_depth=v_node_depth
264 WHERE model_ref_expl_id=i.model_ref_expl_id AND node_depth<>v_node_depth;
265
266 --
267 -- temporary workaround to delete possible reference duplicates
268 -- t_nodes_to_delete_tbl stores duplicate nodes
269 -- that need to be deleled later
270 --
271 IF p_ps_node_id=i.referring_node_id
272 AND p_ps_node_type=i.ps_node_type THEN
273 t_nodes_to_delete_tbl(t_nodes_to_delete_tbl.COUNT+1):=i.model_ref_expl_id;
274 END IF;
275
276 update_Node_Depth_(p_model_id,i.model_ref_expl_id,v_node_depth,i.referring_node_id,i.ps_node_type);
277 END LOOP;
278 END IF;
279 END update_Node_Depth_;
280
281 BEGIN
282 t_nodes_to_delete_tbl.DELETE;
283 FOR i IN(SELECT DISTINCT model_id FROM cz_model_ref_expls
284 WHERE ((component_id=p_model_id AND
285 ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE)) OR model_id=p_model_id)
286 AND deleted_flag=NO_FLAG)
287 LOOP
288 update_Node_Depth_(i.model_id);
289 END LOOP;
290
291 --
292 -- temporary workaround to delete possible reference duplicates
293 --
294 IF t_nodes_to_delete_tbl.COUNT>0 THEN
295 FORALL i IN t_nodes_to_delete_tbl.FIRST..t_nodes_to_delete_tbl.LAST
296 UPDATE CZ_MODEL_REF_EXPLS
297 SET deleted_flag=YES_FLAG
298 WHERE model_ref_expl_id IN
299 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
300 START WITH model_id=p_model_id AND model_ref_expl_id=t_nodes_to_delete_tbl(i) AND deleted_flag=NO_FLAG
301 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
302 AND PRIOR deleted_flag=NO_FLAG);
303 END IF;
304
305 END update_Node_Depth;
306
307 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
308 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
309
310 -- p_out_flag=0 - it's not nonVirtual --
311 -- p_out_flag=1 - nonVirtual --
312
313 FUNCTION existContributeRule
314 (p_ps_node_id IN INTEGER,
315 p_model_id IN INTEGER) RETURN BOOLEAN IS
316
317 v_iret INTEGER:=0;
318 v_bret BOOLEAN:=FALSE;
319 v_instantiable_flag CZ_PS_NODES.instantiable_flag%TYPE;
320
321 BEGIN
322 SELECT instantiable_flag INTO v_instantiable_flag
323 FROM CZ_PS_NODES
324 WHERE ps_node_id=p_ps_node_id;
325 IF v_instantiable_flag IN(OPTIONAL_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
326 RETURN TRUE;
327 ELSE
328 RETURN FALSE;
329 END IF;
330 /* old code
331 BEGIN
332 SELECT 1 INTO v_iret FROM dual
333 WHERE
334 EXISTS(SELECT NULL FROM cz_expression_nodes x
335 WHERE deleted_flag = NO_FLAG
336 AND consequent_flag =YES_FLAG
337 AND ps_node_id = p_ps_node_id
338 AND EXISTS
339 (SELECT NULL FROM cz_rules WHERE (antecedent_id=x.express_id OR consequent_id=x.express_id
340 OR amount_id=x.express_id) AND disabled_flag=NO_FLAG
341 AND devl_project_id=p_model_id AND deleted_flag=NO_FLAG));
342 EXCEPTION
343 WHEN NO_DATA_FOUND THEN
344 NULL;
345 WHEN OTHERS THEN
346 LOG_REPORT('existContributeRule','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
347 END;
348
349 IF v_iret=0 THEN
350 v_bret:=FALSE;
351 ELSE
352 v_bret:=TRUE;
353 END IF;
354
355 RETURN v_bret;
356 */
357 END;
358
359 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
360 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
361
362 FUNCTION getExprSubType(p_expr_node_id IN INTEGER) RETURN NUMBER IS
363
364 v_expr_parent CZ_EXPRESSION_NODES.expr_parent_id%TYPE;
365 v_expr_subtype CZ_EXPRESSION_NODES.expr_subtype%TYPE;
366
367 BEGIN
368 SELECT expr_parent_id INTO v_expr_parent
369 FROM CZ_EXPRESSION_NODES WHERE expr_node_id=p_expr_node_id AND
370 deleted_flag=NO_FLAG;
371
372 SELECT expr_subtype INTO v_expr_subtype
373 FROM CZ_EXPRESSION_NODES WHERE expr_parent_id=v_expr_parent AND ps_node_id IS NULL AND
374 deleted_flag=NO_FLAG;
375
376 RETURN v_expr_subtype;
377
378 EXCEPTION
379 WHEN OTHERS THEN
380 RETURN -1;
381 END;
382
383 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
384 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
385
386 -- p_out_flag=0 - it's not nonVirtual --
387 -- p_out_flag=1 - nonVirtual --
388
389 FUNCTION getExplType
390 (p_ps_node_id IN INTEGER,
391 p_model_id IN INTEGER,
392 p_minimum IN INTEGER,
393 p_maximum IN INTEGER,
394 p_ps_node_type IN INTEGER) RETURN NUMBER IS
395
396 v_expr_parent_id CZ_EXPRESSION_NODES.expr_parent_id%TYPE;
397 v_expr_subtype CZ_EXPRESSION_NODES.expr_subtype%TYPE;
398 v_expl_node_type CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
399
400 BEGIN
401 FOR i IN (SELECT rule_id,antecedent_id,consequent_id,NAME FROM CZ_RULES
402 WHERE devl_project_id=p_model_id AND disabled_flag=NO_FLAG
403 AND deleted_flag=NO_FLAG)
404 LOOP
405 BEGIN
409
406 SELECT expr_parent_id INTO v_expr_parent_id FROM CZ_EXPRESSION_NODES
407 WHERE ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
408 rule_id=i.rule_id;
410 SELECT expr_subtype INTO v_expr_subtype
411 FROM CZ_EXPRESSION_NODES WHERE expr_parent_id=v_expr_parent_id AND ps_node_id IS NULL AND
412 deleted_flag=NO_FLAG;
413
414 IF v_expr_subtype=CONTRIBUTE_TO_MIN_SUBTYPE THEN
415 IF (p_minimum=1 AND p_maximum=1) OR (p_minimum=0 AND p_maximum=1) THEN
416 v_expl_node_type:=OPTIONAL_EXPL_TYPE;
417 ELSE
418 RETURN MINMAX_EXPL_TYPE;
419 END IF;
420 END IF;
421
422 IF v_expr_subtype=CONTRIBUTE_TO_MAX_SUBTYPE THEN
423 RETURN MINMAX_EXPL_TYPE;
424 END IF;
425
426 EXCEPTION
427 WHEN OTHERS THEN
428 NULL;
429 END;
430 END LOOP;
431
432 IF p_minimum=1 AND p_maximum=1 AND v_expl_node_type=OPTIONAL_EXPL_TYPE THEN
433 RETURN OPTIONAL_EXPL_TYPE;
434 END IF;
435
436 IF NOT(p_minimum=1 AND p_maximum=1) AND v_expl_node_type=OPTIONAL_EXPL_TYPE THEN
437 IF p_minimum=0 AND p_maximum=1 THEN
438 RETURN OPTIONAL_EXPL_TYPE;
439 ELSE
440 RETURN MINMAX_EXPL_TYPE;
441 END IF;
442 END IF;
443
444 IF NOT(p_minimum=1 AND p_maximum=1) AND NOT(p_minimum=0 AND p_maximum=1) THEN
445 RETURN MINMAX_EXPL_TYPE;
446 END IF;
447
448 IF p_minimum=0 AND p_maximum=1 THEN
449 RETURN OPTIONAL_EXPL_TYPE;
450 END IF;
451
452 IF p_minimum=1 AND p_maximum=1 AND p_ps_node_type=REFERENCE_TYPE THEN
453 RETURN MANDATORY_EXPL_TYPE;
454 END IF;
455
456 IF p_minimum=1 AND p_maximum=1 AND p_ps_node_type=CONNECTOR_TYPE THEN
457 RETURN CONNECTOR_EXPL_TYPE;
458 END IF;
459
460 RETURN 0;
461 END;
462
463
464 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
465 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
466
467 PROCEDURE add_root_Model_record
468 (p_ps_node_id IN INTEGER,
469 p_ps_node_type IN INTEGER) IS
470
471 v_expl_id NUMBER;
472
473 BEGIN
474 v_expl_id:=allocate_Expl_Id;
475
476 INSERT INTO CZ_MODEL_REF_EXPLS
477 (model_ref_expl_id,
478 parent_expl_node_id,
479 referring_node_id,
480 model_id,
481 component_id,
482 ps_node_type,
483 virtual_flag,
484 node_depth,
485 expl_node_type,
486 deleted_flag)
487 VALUES (v_expl_id,
488 NULL,
489 NULL,
490 p_ps_node_id,
491 p_ps_node_id,
492 p_ps_node_type,
493 YES_FLAG,
494 0,
495 MANDATORY_EXPL_TYPE,
496 NO_FLAG);
497
498 END add_root_Model_record;
499
500 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
501 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
502
503 --
504 -- populate chain of connected models starting with model ( p_model_id )
505 -- format of record : model_id/parent_model_id
506 -- Example :
507 -- M3
508 -- |---> M2
509 -- |--->M1
510 -- |--~~~--> M3 ( Circular connector )
511 -- we start with M1 and go up on the tree
512 -- until M3
513 -- so t_chain is { M1/M2, M2/M3, M3/null }
514 -- note that element for M3 must have parent_model_id=null - not M1
515 -- otherwise we will have a VERY BIG PROBLEM because of circularity :
516 -- check_node/move_node/delete_node will go to infinite loop
517 --
518 PROCEDURE populate_chain
519 (p_model_id IN INTEGER) IS
520 TYPE IntArray IS TABLE OF NUMBER INDEX BY VARCHAR2(15);
521 t_models IntArray;
522 v_circularity_exists BOOLEAN:=FALSE;
523
524 PROCEDURE pop(p_id IN NUMBER) IS
525 v_ind NUMBER:=0;
526 BEGIN
527 FOR i IN(SELECT DISTINCT devl_project_id FROM CZ_PS_NODES a
528 WHERE reference_id=p_id AND deleted_flag=NO_FLAG AND
529 devl_project_id IN(SELECT object_id FROM CZ_RP_ENTRIES
530 WHERE object_id=a.devl_project_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
531 LOOP
532 v_ind:=t_chain.COUNT+1;
533 t_chain(v_ind).model_id:=i.devl_project_id;
534 t_chain(v_ind).parent_model_id:=p_id;
535
536 v_circularity_exists:=t_models.EXISTS(i.devl_project_id);
537 t_models(i.devl_project_id):=p_id;
538
539 IF i.devl_project_id <> p_model_id AND
540 NOT(v_circularity_exists) THEN
541 pop(i.devl_project_id);
542 ELSE
543 --t_chain(v_ind).parent_model_id:=NULL;
544 NULL;
545 END IF;
546 END LOOP;
547 END pop;
551 END populate_chain;
548
549 BEGIN
550 pop(p_model_id);
552
553 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
554 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
555
556 PROCEDURE calc_Expl_Paths(p_root_expl_id IN NUMBER,x_paths_tbl OUT NOCOPY Varchar2Array ) IS
557 BEGIN
558
559 FOR m IN(SELECT model_ref_expl_id,parent_expl_node_id,component_id,referring_node_id
560 FROM CZ_MODEL_REF_EXPLS
561 START WITH model_ref_expl_id=p_root_expl_id
562 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag='0' AND PRIOR deleted_flag='0')
563 LOOP
564
565 IF m.referring_node_id IS NULL THEN
566
567 IF x_paths_tbl.EXISTS(m.parent_expl_node_id) THEN
568 IF x_paths_tbl(m.parent_expl_node_id)='.' THEN
569 x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.component_id);
570 ELSE
571 x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.component_id)||'.'||x_paths_tbl(m.parent_expl_node_id);
572 END IF;
573 ELSE
574 x_paths_tbl(m.model_ref_expl_id) := '.';
575 END IF;
576
577 ELSE
578
579 IF x_paths_tbl.EXISTS(m.parent_expl_node_id) THEN
580 IF x_paths_tbl(m.parent_expl_node_id)='.' THEN
581 x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.referring_node_id);
582 ELSE
583 x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.referring_node_id)||'.'||x_paths_tbl(m.parent_expl_node_id);
584 END IF;
585 ELSE
586 x_paths_tbl(m.model_ref_expl_id) := '.';
587 END IF;
588
589 END IF;
590
591 END LOOP;
592
593 END calc_Expl_Paths;
594
595 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
596 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
597
598 --
599 -- populate target subtree = array that contains expl tree of the target model ( p_target_model_id )
600 -- Example :
601 -- M3
602 -- |-->M2
603 -- |--C2
604 -- |------>M1
605 -- |--->C1
606 -- now if we add a circular connector from M4 to M3
607 -- then target subtree will look like :
608 -- M3
609 -- |-->M2
610 -- |--C2
611 -- |------>M1
612 -- |--->C1
613 --
614 PROCEDURE get_Expl_Tree
615 (
616 p_target_model_id IN NUMBER,
617 px_root_expl_id OUT NOCOPY NUMBER,
618 p_target_subtree_tbl IN OUT NOCOPY ArrayId
619 ) IS
620 l_paths_tbl VArchar2Array;
621 l_expl_id NUMBER;
622 BEGIN
623 FOR i IN (SELECT parent_expl_node_id,referring_node_id,ps_node_type,
624 virtual_flag,component_id,expl_node_type,model_ref_expl_id,LEVEL
625 FROM CZ_MODEL_REF_EXPLS
626 START WITH model_id=p_target_model_id AND component_id=p_target_model_id -- this condition specifies root of expl tree
627 AND deleted_flag=NO_FLAG
628 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
629 LOOP
630 IF i.parent_expl_node_id IS NULL THEN
631 px_root_expl_id:=i.model_ref_expl_id;
632 END IF;
633 p_target_subtree_tbl(i.model_ref_expl_id).new_id:=i.model_ref_expl_id;
634 p_target_subtree_tbl(i.model_ref_expl_id).parent_id:=i.parent_expl_node_id;
635 p_target_subtree_tbl(i.model_ref_expl_id).ps_node_id:=i.referring_node_id;
636 p_target_subtree_tbl(i.model_ref_expl_id).ps_node_type:=i.ps_node_type;
637 p_target_subtree_tbl(i.model_ref_expl_id).virtual_flag:=i.virtual_flag;
638 p_target_subtree_tbl(i.model_ref_expl_id).component_id:=i.component_id;
639 p_target_subtree_tbl(i.model_ref_expl_id).expl_node_type:=i.expl_node_type;
640 p_target_subtree_tbl(i.model_ref_expl_id).child_model_id:=i.model_ref_expl_id;
641 p_target_subtree_tbl(i.model_ref_expl_id).current_level:=i.LEVEL;
642 END LOOP;
643
644 calc_Expl_Paths(px_root_expl_id,l_paths_tbl);
645 l_expl_id := p_target_subtree_tbl.First;
646 LOOP
647 IF l_expl_id IS NULL THEN
648 EXIT;
649 END IF;
650 p_target_subtree_tbl(l_expl_id).expl_path := l_paths_tbl(l_expl_id);
651 l_expl_id := p_target_subtree_tbl.NEXT(l_expl_id);
652 END LOOP;
653
654 END get_Expl_Tree;
655
656 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
657 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
658
659 --
660 -- the procedure uses target subtree to construct attached subtree in circular connectors case
661 --
662 PROCEDURE filter_Branches
663 (
664 p_target_model_id IN NUMBER,
665 p_target_subtree_tbl IN OUT NOCOPY ArrayId, -- stores target subtree
666 x_subtree_tbl IN OUT NOCOPY ArrayId -- will store subtree
667 ) IS
668
669 t_model_ref_expl_ids_tbl IntArray;
670
671 BEGIN
672 --
673 -- inialize OUTPUT subtree
674 --
675 x_subtree_tbl:=p_target_subtree_tbl;
676
677 --
678 -- collect expl_ids which belong to subtrees of the references/connectors of excluded branch
679 -- Example :
680 -- suppose p_target_subtree_tbl looks like :
684 -- |-~~~~~~~~->M1 ( CONNECTOR )
681 -- M3
682 -- |---> M2
683 -- |---C2
685 -- | |_C1
686 -- |--------------->M5
687 -- then we need to collect expl_ids of the following subtrees
688 -- M1 and M5
689 -- |--C1
690 -- so in this case t_model_ref_expl_ids_tbl will store 2 elements
691 --
692 FOR i IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
693 WHERE model_id=p_target_model_id AND deleted_flag=NO_FLAG AND
694 ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) )
695 LOOP
696 FOR j IN (SELECT model_ref_expl_id,ps_node_type
697 FROM CZ_MODEL_REF_EXPLS
698 START WITH model_ref_expl_id = i.model_ref_expl_id AND deleted_flag=NO_FLAG
699 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
700 LOOP
701 t_model_ref_expl_ids_tbl(t_model_ref_expl_ids_tbl.COUNT+1):=j.model_ref_expl_id;
702 END LOOP;
703 END LOOP;
704
705 IF t_model_ref_expl_ids_tbl.COUNT=0 THEN
706 RETURN;
707 END IF;
708
709 --
710 -- remove those branches from the target subtree which point to model with model_id=p_exluded_model_id
711 -- <=> remove all expl_ids from ( x_subtree_tbl that was initilized as p_target_subtree_tbl )
712 -- that we collected before
713 --
714 FOR i IN t_model_ref_expl_ids_tbl.FIRST..t_model_ref_expl_ids_tbl.LAST
715 LOOP
716 x_subtree_tbl.DELETE(t_model_ref_expl_ids_tbl(i));
717 END LOOP;
718
719 END filter_Branches;
720
721 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
722 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
723
724 --
725 -- the procedure is used for attaching subtree to the new subtree root node
726 -- of model from the NEXT LEVEL of the chain of connected models
727 -- this means that p_subtree_tbl contains subtree from the PREVIOUS LEVEL
728 -- we need to rekey this subtree and attach it to the new subtree root node identified by p_new_root_expl_id
729 -- of the model from the NEXT LEVEL
730 --
731 PROCEDURE attach_Subtree
732 (
733 p_model_id IN NUMBER, -- model_id of the model to which we are attaching subtree
734 p_new_root_expl_id IN NUMBER, -- expl_id of new root node
735 p_new_root_level IN NUMBER, -- node_depth of new root node
736 p_subtree_root_expl_id IN NUMBER, -- expl_id of the rood node of subtree
737 p_subtree_tbl IN ArrayId) IS -- stores subtree
738
739 t_subtree_tbl ArrayId; -- stores rehashed ( rekeyed ) subtree
740
741 t_next_level_expl_ids_tbl ArrayId;
742
743 v_parent_id CZ_MODEL_REF_EXPLS.parent_expl_node_id%TYPE;
744 v_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
745 v_next_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
746 v_ind CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
747 v_subtree_root_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
748
749 BEGIN
750
751 t_subtree_tbl := p_subtree_tbl;
752
753 ---- FIRST STEP : rehash subtree
754
755 v_ind:=p_subtree_tbl.FIRST;
756 LOOP
757 IF v_ind IS NULL THEN
758 EXIT;
759 END IF;
760
761 IF (v_ind = p_subtree_root_expl_id) THEN
762 v_subtree_root_level := t_subtree_tbl(v_ind).current_level;
763 END IF;
764
765 t_subtree_tbl(v_ind).new_id := allocate_Expl_Id;
766 v_ind:=p_subtree_tbl.NEXT(v_ind);
767 END LOOP;
768
769 ---- NEXT STEP : attach subtree
770
771 v_ind:=t_subtree_tbl.FIRST;
772 LOOP
773 IF v_ind IS NULL THEN
774 EXIT;
775 END IF;
776
777 IF (v_ind = p_subtree_root_expl_id) THEN
778 --
779 -- if this is a root node
780 -- then attach the root node to a new subtree root identified by model_ref_expl_id = p_new_root_expl_id
781 --
782 v_parent_id := p_new_root_expl_id;
783 v_level := p_new_root_level+1;
784 ELSE
785 BEGIN
786 v_level:= p_new_root_level + (t_subtree_tbl(v_ind).current_level-v_subtree_root_level);
787 v_parent_id:=t_subtree_tbl(t_subtree_tbl(v_ind).parent_id).new_id;
788 EXCEPTION
789 WHEN NO_DATA_FOUND THEN
790 v_parent_id:=t_subtree_tbl(p_subtree_root_expl_id).new_id;
791 WHEN OTHERS THEN
792 v_parent_id:=t_subtree_tbl(p_subtree_root_expl_id).new_id;
793 END;
794 END IF;
795
796 IF v_parent_id=p_new_root_expl_id THEN -- this is a root of attached subtree
797 g_root_point_tree_tbl(p_new_root_expl_id) := t_subtree_tbl(v_ind).new_id; -- store maping between attach point and root of attached subtree
798 END IF;
799
800 INSERT INTO CZ_MODEL_REF_EXPLS
801 (model_ref_expl_id,
802 parent_expl_node_id,
803 referring_node_id,
804 model_id,
805 component_id,
806 child_model_expl_id,
807 ps_node_type,
808 virtual_flag,
812 VALUES
809 node_depth,
810 expl_node_type,
811 deleted_flag)
813 (t_subtree_tbl(v_ind).new_id,
814 v_parent_id,
815 t_subtree_tbl(v_ind).ps_node_id,
816 p_model_id,
817 t_subtree_tbl(v_ind).component_id,
818 NULL,
819 t_subtree_tbl(v_ind).ps_node_type,
820 t_subtree_tbl(v_ind).virtual_flag,
821 v_level,
822 t_subtree_tbl(v_ind).expl_node_type,
823 NO_FLAG);
824
825 t_next_level_expl_ids_tbl(v_ind).new_id := t_subtree_tbl(v_ind).new_id;
826 t_next_level_expl_ids_tbl(v_ind).ps_node_id := t_subtree_tbl(v_ind).ps_node_id;
827 t_next_level_expl_ids_tbl(v_ind).component_id := t_subtree_tbl(v_ind).component_id;
828 t_next_level_expl_ids_tbl(v_ind).expl_path := t_subtree_tbl(v_ind).expl_path;
829
830
831 v_ind:=t_subtree_tbl.NEXT(v_ind);
832 END LOOP;
833
834 -- release memory allocated for t_subtree_tbl array
835 t_subtree_tbl.DELETE;
836
837 FOR i IN(SELECT ps_node_id, devl_project_id FROM CZ_PS_NODES a
838 WHERE reference_id=p_model_id AND deleted_flag='0'
839 AND EXISTS (SELECT NULL FROM cz_devl_projects
840 WHERE devl_project_id = a.devl_project_id
841 AND deleted_flag='0'))
842 LOOP
843 FOR h IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
844 WHERE model_id=i.devl_project_id AND
845 child_model_expl_id=p_new_root_expl_id AND deleted_flag='0')
846 LOOP
847 g_hash_tree_tbl(h.model_ref_expl_id) := t_next_level_expl_ids_tbl;
848 END LOOP;
849 END LOOP;
850
851 t_next_level_expl_ids_tbl.DELETE;
852
853 END attach_Subtree;
854
855 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
856 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
857
858 --
859 -- this procedure populates child_model_expl_id's.
860 -- It uses global arrays g_root_point_tree_tbl and g_hash_tree_tbl which are
861 -- populated in attach_Subtree()
862 --
863 PROCEDURE populate_Child_Model_Expl_id IS
864
865 t_attach_subtree_tbl ArrayId;
866 l_expl_paths_tbl Varchar2Array;
867 l_new_expl_id NUMBER;
868
869 v_ind NUMBER;
870 v_expl_id NUMBER;
871 v_root_expl_id NUMBER;
872
873 BEGIN
874
875 v_ind := g_hash_tree_tbl.First;
876 LOOP
877 IF v_ind IS NULL THEN
878 EXIT;
879 END IF;
880
881 v_root_expl_id := g_root_point_tree_tbl(v_ind);
882 t_attach_subtree_tbl := g_hash_tree_tbl(v_ind);
883
884 calc_Expl_Paths(v_root_expl_id, l_expl_paths_tbl);
885
886 l_new_expl_id := l_expl_paths_tbl.First;
887 LOOP
888 IF l_new_expl_id IS NULL THEN
889 EXIT;
890 END IF;
891
892 v_expl_id := t_attach_subtree_tbl.First;
893 LOOP
894 IF v_expl_id IS NULL THEN
895 EXIT;
896 END IF;
897
898 IF l_expl_paths_tbl(l_new_expl_id) = t_attach_subtree_tbl(v_expl_id).expl_path THEN
899
900 UPDATE CZ_MODEL_REF_EXPLS
901 SET child_model_expl_id=t_attach_subtree_tbl(v_expl_id).new_id
902 WHERE model_ref_expl_id=l_new_expl_id;
903
904 END IF;
905 v_expl_id := t_attach_subtree_tbl.NEXT(v_expl_id);
906 END LOOP;
907
908 l_new_expl_id := l_expl_paths_tbl.NEXT(l_new_expl_id);
909 END LOOP;
910 l_expl_paths_tbl.DELETE;
911 v_ind := g_hash_tree_tbl.NEXT(v_ind);
912 END LOOP;
913
914 END populate_Child_Model_Expl_id;
915
916
917 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
918 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
919
920 --
921 -- attach subtree ( presented as array ) to all connected models
922 --
923 PROCEDURE copy_Subtree
924 (p_model_id IN INTEGER, -- current model id
925 p_target_model_id IN INTEGER,
926 p_parent_ps_id IN INTEGER, -- ps_node_id of the node to attach subtree
927 p_target_root_expl_id IN INTEGER, -- expl_id of the root node of subtree ( <=> p_target_subtree_tbl )
928 p_target_subtree_tbl IN OUT NOCOPY ArrayId, -- array which contains subtree
929 p_ps_node_type IN INTEGER
930 ) IS
931 TYPE IntArrayIndexVC2 IS TABLE OF NUMBER INDEX BY VARCHAR2(15);
932 t_temp_tree_tbl IntArray;
933 t_connect_point_tbl IntArray;
934 t_models_level IntArrayIndexVC2; -- is populated by model_ids of the current level ( in a chain of connected models )
935 t_new_models_level IntArrayIndexVC2; -- is populated by model_ids for the next level ( in a chain of connected models )
936 t_hash_models IntArrayIndexVC2; -- stores already handled models
937 t_subtree_tbl ArrayId;
938 v_circularity_exists VARCHAR2(1):=NO_FLAG;
942
939 v_connector_parent_exists VARCHAR2(1):=NO_FLAG;
940 v_ind NUMBER;
941 v_el NUMBER;
943 BEGIN
944 -- initialize global arrays which stores expl_ids
945 g_hash_tree_tbl.DELETE;
946 g_root_point_tree_tbl.DELETE;
947
948 IF p_target_model_id=p_model_id THEN -- this is an obvious circular case
949
950 v_circularity_exists:=YES_FLAG;
951
952 --
953 -- exlude all References/Connectors from the subtree that we are attaching
954 -- to the current model (p_model_id)
955 -- t_subtree_tbl will store the subtree without References/Connectors subtrees
956 --
957 filter_Branches(p_target_model_id => p_model_id,
958 p_target_subtree_tbl => p_target_subtree_tbl,
959 x_subtree_tbl => t_subtree_tbl);
960
961 ELSE
962 --
963 -- check circularity
964 --
965 v_circularity_exists := circularity_Exists(p_model_id,p_target_model_id);
966 IF v_circularity_exists=YES_FLAG AND p_ps_node_type=CONNECTOR_TYPE THEN
967
968 filter_Branches(p_target_model_id => p_target_model_id,
969 p_target_subtree_tbl => p_target_subtree_tbl,
970 x_subtree_tbl => t_subtree_tbl);
971 ELSE
972 t_subtree_tbl:=p_target_subtree_tbl;
973 END IF;
974
975 END IF;
976
977 g_hash_tree_tbl(t_subtree_tbl(p_target_root_expl_id).parent_id) := t_subtree_tbl;
978
979 --
980 -- first - attach the subtree to the current model ( <=> p_model_id )
981 --
982 attach_Subtree(p_model_id => p_model_id, -- specifies model to which we are attaching the subtree
983 p_new_root_expl_id => t_subtree_tbl(p_target_root_expl_id).parent_id, -- expl_id of new subtree root
984 p_new_root_level => t_subtree_tbl(p_target_root_expl_id).current_level, -- node_depth of new subtree root
985 p_subtree_root_expl_id => p_target_root_expl_id, -- expl_id=index of subtree root in subtree array p_subtree_tbl
986 p_subtree_tbl => t_subtree_tbl); -- subtree array
987
988 --
989 -- if there are no any connected models then just exit
990 --
991 IF t_chain.COUNT=0 THEN
992 --
993 -- populate child_model_expl_id's
994 --
995 populate_Child_Model_Expl_id();
996 RETURN;
997 END IF;
998
999 --
1000 -- initilaize hash map of models on the current level
1001 --
1002 t_models_level(p_model_id):=p_model_id;
1003
1004
1005 --
1006 -- initilaize hash map of already handled models
1007 --
1008 t_hash_models(p_model_id):=p_model_id;
1009
1010
1011 --
1012 -- loop through t_models_level array
1013 -- initially t_model_level contains just p_model_id ( source model )
1014 --
1015 LOOP
1016 --
1017 -- go through all connected models
1018 -- in order to find all models connected to the model with model_id = t_models_level(v_ind)
1019 -- Example :
1020 -- M3
1021 -- |--->M2
1022 -- |---->M1
1023 -- ^
1024 -- M10 |
1025 -- |----------
1026 --
1027 -- initially we have t_model_level(M1)=M1
1028 -- and t_chain ( model_id/parent_model_id ) = { M1/M2, M2/M3, M3/null }
1029 -- so in this algorithm we go through all t_chain elements and find
1030 -- those which are parent elements ( elementS because the same model can be referenced from the different models )
1031 -- if we start with M1 then
1032 -- next level will contain t_chain elements for which t_chain(i).parent_model_id = M1
1033 -- => it will contain M2 and M10
1034 -- t_new_models_level will be populated with {M2, M10}
1035 -- at the bottom of the loop we have t_models_level:=lt_new_models_level;
1036 -- so on next itteration we will be using t_models_level = { M2, M10}
1037 --
1038 FOR i IN t_chain.FIRST..t_chain.LAST
1039 LOOP
1040 v_ind:=t_models_level.FIRST;
1041 LOOP
1042 IF v_ind IS NULL THEN
1043 EXIT;
1044 END IF;
1045
1046 --
1047 -- starting with the current model go up to the chain of connected
1048 -- models level by level
1049 --
1050 IF t_chain(i).parent_model_id=t_models_level(v_ind) -- find all models connected to the current one
1051 AND t_chain(i).model_id <> t_chain(i).parent_model_id THEN -- if it's circular connector
1052 -- case then we don't need to attach
1053 -- the target subtree again
1054 --
1055 -- if t_chain has a duplicates of model_ids then
1056 -- we don't need to apply algorithm second time
1057 -- one model must be handled only once
1058 --
1059 IF NOT(t_hash_models.EXISTS(t_chain(i).model_id)) THEN
1060
1061 --
1065 -- |--Ref1--expl_id=1000---->M1
1062 -- t_connect_point_tbl stores already handled branches
1063 -- Example :
1064 -- M2
1066 --
1067 -- |--Ref2--expl_id=2000---->M1
1068 --
1069 -- and we want to attach the target subtree under M1
1070 -- in model M2 we have 2 entries that have component_id = p_parent_ps_id = M1
1071 -- these are references Ref1 and Ref2
1072
1073 FOR m IN(SELECT model_ref_expl_id,component_id,ps_node_type,node_depth
1074 FROM CZ_MODEL_REF_EXPLS
1075 WHERE model_id=t_chain(i).model_id AND component_id=p_parent_ps_id AND
1076 parent_expl_node_id IS NOT NULL AND deleted_flag=NO_FLAG)
1077 LOOP
1078
1079 BEGIN
1080 v_connector_parent_exists:=NO_FLAG;
1081 SELECT YES_FLAG INTO v_connector_parent_exists FROM dual
1082 WHERE EXISTS(SELECT NULL FROM CZ_MODEL_REF_EXPLS
1083 WHERE ps_node_type=CONNECTOR_TYPE
1084 START WITH model_ref_expl_id=m.model_ref_expl_id
1085 CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG AND deleted_flag=NO_FLAG);
1086 EXCEPTION
1087 WHEN NO_DATA_FOUND THEN
1088 NULL;
1089 END;
1090
1091 --
1092 -- t_connect_point_tbl - hash map that stores expl_ids of
1093 -- already handled branches
1094 -- so we need to attach subtree just in case when
1095 -- this given branch is not handled yet
1096 --
1097 IF NOT(t_connect_point_tbl.EXISTS(m.model_ref_expl_id)) AND
1098 NOT( p_ps_node_type=CONNECTOR_TYPE AND v_connector_parent_exists=YES_FLAG) THEN -- not a connector's subtree under connector
1099
1100 IF v_circularity_exists = YES_FLAG THEN
1101
1102 IF p_ps_node_type=CONNECTOR_TYPE THEN
1103
1104 --
1105 -- remove all expl subtrees under References/Connectors which
1106 -- belong to model with model_id=t_chain(i).model_id
1107 -- t_subtree_tbl will store OUTPUT subtree
1108 --
1109 filter_Branches(p_target_model_id => p_target_model_id,
1110 p_target_subtree_tbl => p_target_subtree_tbl,
1111 x_subtree_tbl => t_subtree_tbl);
1112
1113 --
1114 -- attach subtree with removed expl subtrees under References/Connectors which
1115 -- belong to model with model_id=t_chain(i).model_id
1116 -- to expl_id = m.model_ref_expl_id
1117 --
1118 attach_Subtree(p_model_id => t_chain(i).model_id,
1119 p_new_root_expl_id => m.model_ref_expl_id, -- expl_id of the next "attach point"
1120 p_new_root_level => m.node_depth, -- node_depth of the next "attach point"
1121 p_subtree_root_expl_id => p_target_root_expl_id, -- expl_id=index of subtree array associated
1122 -- with a root node
1123 p_subtree_tbl => t_subtree_tbl); -- subtree array
1124 END IF;
1125 ELSE
1126
1127 --
1128 -- attach the target subtree to expl_id = m.model_ref_expl_id
1129 -- here we don't need to change initial target subtree p_target_subtree_tbl
1130 -- we need just attach it to an appropriate expl node
1131 --
1132 attach_Subtree(p_model_id => t_chain(i).model_id,
1133 p_new_root_expl_id => m.model_ref_expl_id, -- expl_id of the next "attach point"
1134 p_new_root_level => m.node_depth, -- node_depth of the next "attach point"
1135 p_subtree_root_expl_id => p_target_root_expl_id, -- expl_id=index of subtree array associated
1136 -- with a root node
1137 p_subtree_tbl => p_target_subtree_tbl); -- subtree array
1138
1139 END IF;
1140
1141 END IF;
1142 --
1143 -- put expl_id of branch that we've just handled
1144 --
1145 t_connect_point_tbl(m.model_ref_expl_id):= t_chain(i).model_id;
1146 END LOOP; -- end of loop through CZ_MODEL_REF_EXPLS table --
1147
1148 --
1149 -- put the current model = t_chain(i).model_id to the hash
1150 -- of models which already hadnled
1154 t_hash_models(t_chain(i).model_id):= t_chain(i).model_id;
1151 -- this hash is used in order to avoid attaching
1152 -- the subtree twice ( or more than twice )
1153 --
1155
1156 --
1157 -- populate array of models for the next level
1158 -- models from the current level will be used as base level
1159 -- on the next itteration
1160 --
1161 t_new_models_level(t_chain(i).model_id):=t_chain(i).model_id;
1162
1163 END IF; -- end of if NOT(t_hash_models.EXISTS(t_chain(i).model_id)) --
1164
1165 END IF; -- end of if t_chain(i).parent_model_id=t_models_level(v_ind)
1166
1167 v_ind:=t_models_level.NEXT(v_ind);
1168
1169 END LOOP; -- end of loop for t_models_level array
1170
1171 END LOOP; -- end of loop for i in t_chain.First..t_chain.Last --
1172
1173 --
1174 -- now we going to the next itteration
1175 -- so we need to set t_models_level to array of the models from the just handled level
1176 --
1177 t_models_level:=t_new_models_level; t_new_models_level.DELETE;
1178
1179 --
1180 -- if there are no connected models to models on the current level then exit
1181 --
1182 IF (t_models_level.COUNT = 0) THEN
1183 EXIT;
1184 END IF;
1185
1186 END LOOP;
1187
1188 --
1189 -- populate child_model_expl_id's
1190 --
1191 populate_Child_Model_Expl_id();
1192
1193 EXCEPTION
1194 WHEN OTHERS THEN
1195 LOG_REPORT('copy_Subtree','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1196 END Copy_Subtree;
1197
1198 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1199 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1200
1201 PROCEDURE add_Reference
1202 (p_ps_node_id IN INTEGER,
1203 p_to_model_id IN INTEGER, -- reference to p_to_model_id
1204 p_containing_model_id IN INTEGER, -- current Model where reference is created
1205 p_virtual_flag IN VARCHAR2,
1206 p_out_err OUT NOCOPY INTEGER,
1207 p_ps_type IN INTEGER DEFAULT NULL,
1208 p_expl_node_type IN INTEGER -- DEFAULT MANDATORY_EXPL_TYPE
1209 ) IS
1210
1211 t_subtree_tbl ArrayId; -- stores subtree array
1212 t_prev_level_expl_ids_tbl IntArray; -- stores expl_ids of the target subtree
1213 -- which will be used as child_expl_ids on the next level
1214 v_parent_ps_node_id CZ_PS_NODES.ps_node_id%TYPE; -- ps_node_id of new subtree root node
1215 v_parent_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE; -- expl_id of new subtree root node
1216 v_parent_level CZ_MODEL_REF_EXPLS.node_depth%TYPE; -- node_depth of new subtree root node
1217 v_target_root_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE; -- root expl_id of the target model
1218 v_next_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE; -- stores expl_id generated by sequence
1219
1220 BEGIN
1221 Initialize;
1222 p_out_err:=0;
1223
1224 --
1225 -- find node in Model Ref Expls which can be used as parent node
1226 -- for Subtree
1227 --
1228 get_Node_Up(p_ps_node_id,p_containing_model_id,
1229 v_parent_ps_node_id,v_parent_expl_id,v_parent_level);
1230
1231 --
1232 -- get the target subtree
1233 --
1234 get_Expl_Tree(p_target_model_id => p_to_model_id,
1235 px_root_expl_id => v_target_root_expl_id,
1236 p_target_subtree_tbl => t_subtree_tbl);
1237
1238 --
1239 -- create array element associated with the Reference ( ps_node_id = p_ps_node_id) itself
1240 --
1241 t_subtree_tbl(v_target_root_expl_id).parent_id := v_parent_expl_id; -- <=> model_ref_expl_id of the node to attach subtree
1242 t_subtree_tbl(v_target_root_expl_id).ps_node_id := p_ps_node_id;
1243 t_subtree_tbl(v_target_root_expl_id).ps_node_type := p_ps_type;
1244 t_subtree_tbl(v_target_root_expl_id).virtual_flag := p_virtual_flag;
1245 t_subtree_tbl(v_target_root_expl_id).current_level := v_parent_level; -- node_depth of the node to attach subtree plus 1
1246 t_subtree_tbl(v_target_root_expl_id).component_id := p_to_model_id; -- referenced model ( <=> target model )
1247 t_subtree_tbl(v_target_root_expl_id).child_model_id := v_target_root_expl_id; -- <=> model_ref_expl_id of the root node of target model
1248 t_subtree_tbl(v_target_root_expl_id).expl_node_type := p_expl_node_type;
1249
1250 --
1251 -- attach Subtree to the containing model --
1252 -- here we assume that root node of subtree is already populated
1253 --
1254 copy_Subtree(p_model_id => p_containing_model_id,
1255 p_target_model_id => p_to_model_id,
1256 p_parent_ps_id => v_parent_ps_node_id,
1257 p_target_root_expl_id => v_target_root_expl_id,
1258 p_target_subtree_tbl => t_subtree_tbl,
1259 p_ps_node_type => p_ps_type);
1260
1261 EXCEPTION
1262 WHEN OTHERS THEN
1263 p_out_err:=m_RUN_ID;
1267
1264 LOG_REPORT('add_Reference',
1265 'Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > :'||SQLERRM);
1266 END add_Reference;
1268 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1269 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1270
1271 PROCEDURE add_Ref
1272 (p_ps_node_id IN INTEGER,
1273 p_to_model_id IN INTEGER,
1274 p_containing_model_id IN INTEGER) IS
1275
1276 v_out_err INTEGER;
1277
1278 BEGIN
1279 add_Reference(p_ps_node_id,p_to_model_id, p_containing_model_id,
1280 NO_FLAG,v_out_err,REFERENCE_TYPE, MANDATORY_EXPL_TYPE);
1281 END;
1282
1283
1284 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1285 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1286
1287 PROCEDURE add_Connector
1288 (p_ps_node_id IN INTEGER,
1289 p_to_model_id IN INTEGER,
1290 p_containing_model_id IN INTEGER) IS
1291
1292 v_out_err INTEGER;
1293
1294 BEGIN
1295 add_Reference(p_ps_node_id,p_to_model_id, p_containing_model_id,
1296 NO_FLAG,v_out_err,CONNECTOR_TYPE, MANDATORY_EXPL_TYPE);
1297
1298 END;
1299
1300 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1301 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1302
1303 PROCEDURE get_Expl_Id
1304 (p_ps_node_id IN INTEGER,
1305 p_project_id IN INTEGER,
1306 p_out_expl_id IN OUT NOCOPY INTEGER,
1307 p_out_level IN OUT NOCOPY INTEGER,
1308 p_ps_node_type IN INTEGER DEFAULT NULL ) IS
1309
1310 ret INTEGER:=NULL_VALUE;
1311
1312 BEGIN
1313 p_out_expl_id:=NULL_VALUE;
1314 p_out_level:=NULL_VALUE;
1315
1316
1317 IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1318 FOR i IN (SELECT model_ref_expl_id,node_depth FROM CZ_MODEL_REF_EXPLS
1319 WHERE model_id=p_project_id AND referring_node_id=p_ps_node_id
1320 AND child_model_expl_id IS NULL AND deleted_flag=NO_FLAG)
1321 LOOP
1322 p_out_expl_id:=i.model_ref_expl_id;
1323 p_out_level:=i.node_depth;
1324 END LOOP;
1325 ELSE
1326 FOR i IN (SELECT model_ref_expl_id,node_depth FROM CZ_MODEL_REF_EXPLS
1327 WHERE model_id=p_project_id AND referring_node_id IS NULL
1328 AND component_id=p_ps_node_id AND child_model_expl_id IS NULL AND
1329 deleted_flag=NO_FLAG)
1330 LOOP
1331 p_out_expl_id:=i.model_ref_expl_id;
1332 p_out_level:=i.node_depth;
1333 END LOOP;
1334 END IF;
1335
1336 EXCEPTION
1337 WHEN OTHERS THEN
1338 LOG_REPORT('get_Expl_Id','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1339 END;
1340
1341 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1342 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1343
1344 PROCEDURE get_Node_Up
1345 (p_ps_node_id IN INTEGER,
1346 p_project_id IN INTEGER,
1347 p_out_ps_node_id IN OUT NOCOPY INTEGER,
1348 p_out_expl_id IN OUT NOCOPY INTEGER,
1349 p_out_level IN OUT NOCOPY INTEGER) IS
1350
1351 v_expl_id INTEGER;
1352 v_temp INTEGER;
1353
1354 BEGIN
1355 p_out_ps_node_id:=NULL_VALUE;
1356 p_out_expl_id:=NULL_VALUE;
1357 p_out_level:=NULL_VALUE;
1358
1359 FOR i IN (SELECT ps_node_id,ps_node_type,parent_id FROM CZ_PS_NODES
1360 WHERE ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1361 LOOP
1362 get_Expl_Id(i.ps_node_id,p_project_id,v_expl_id,p_out_level,i.ps_node_type);
1363
1364 IF v_expl_id<>NULL_VALUE THEN
1365 p_out_ps_node_id:=i.ps_node_id;
1366 p_out_expl_id:=v_expl_id;
1367 EXIT;
1368 END IF;
1369
1370 IF i.ps_node_id<>p_project_id AND v_expl_id=NULL_VALUE THEN
1371 get_Node_Up(i.parent_id,p_project_id,p_out_ps_node_id,
1372 p_out_expl_id,p_out_level);
1373 ELSE
1374 p_out_ps_node_id:=p_project_id;
1375 END IF;
1376 END LOOP;
1377
1378 EXCEPTION
1379 WHEN OTHERS THEN
1380 LOG_REPORT('get_Node_Up','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1381 END;
1382
1383 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1384 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1385
1386 PROCEDURE get_Node_Down
1387 (p_ps_node_id IN INTEGER,
1388 p_project_id IN INTEGER,
1389 p_out_ps_node_id IN OUT NOCOPY INTEGER,
1390 p_out_expl_id IN OUT NOCOPY INTEGER,
1391 p_out_level IN OUT NOCOPY INTEGER) IS
1392
1393 v_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
1394 NODE_FOUND EXCEPTION;
1395
1396 BEGIN
1397 p_out_ps_node_id:=NULL_VALUE;
1398 p_out_expl_id:=NULL_VALUE;
1399 p_out_level:=NULL_VALUE;
1400 get_Expl_Id(p_ps_node_id,p_project_id,v_expl_id,p_out_level);
1401 IF v_expl_id<>NULL_VALUE THEN
1402 p_out_ps_node_id:=p_ps_node_id;
1403 p_out_expl_id:=v_expl_id;
1404 RAISE NODE_FOUND;
1405 END IF;
1406
1410 get_Expl_Id(i.ps_node_id,p_project_id,v_expl_id,p_out_level);
1407 FOR i IN (SELECT ps_node_id,parent_id FROM CZ_PS_NODES
1408 WHERE parent_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1409 LOOP
1411
1412 IF v_expl_id<>NULL_VALUE THEN
1413 p_out_ps_node_id:=i.ps_node_id;
1414 p_out_expl_id:=v_expl_id;
1415 EXIT;
1416 END IF;
1417
1418 IF v_expl_id=NULL_VALUE THEN
1419 get_Node_Down(i.ps_node_id,p_project_id,p_out_ps_node_id,
1420 p_out_expl_id,p_out_level);
1421 ELSE
1422 p_out_ps_node_id:=NULL_VALUE;
1423 END IF;
1424 END LOOP;
1425
1426 EXCEPTION
1427 WHEN NODE_FOUND THEN
1428 NULL;
1429 WHEN OTHERS THEN
1430 LOG_REPORT('get_Node_Down','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1431 END;
1432
1433 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1434 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1435
1436 FUNCTION get_Next_ExplId
1437 (p_expl_id IN INTEGER,
1438 p_child_expl_id IN INTEGER,
1439 p_mode IN VARCHAR2 -- default PLUS_MODE
1440 )
1441 RETURN INTEGER IS
1442
1443 v_ref_id INTEGER;
1444
1445 BEGIN
1446
1447 IF p_mode=PLUS_MODE THEN
1448
1449 --
1450 -- DEBUG ERROR CODE --
1451 --
1452 ERROR_CODE:=300;
1453
1454 SELECT model_ref_expl_id INTO v_ref_id FROM CZ_MODEL_REF_EXPLS
1455 WHERE parent_expl_node_id=p_expl_id
1456 AND (child_model_expl_id=p_child_expl_id OR model_ref_expl_id=p_child_expl_id)
1457 AND deleted_flag=NO_FLAG;
1458
1459 --
1460 -- DEBUG ERROR CODE --
1461 --
1462 ERROR_CODE:=301;
1463
1464 ELSE
1465 --
1466 -- DEBUG ERROR CODE --
1467 --
1468 ERROR_CODE:=302;
1469
1470 SELECT parent_expl_node_id INTO v_ref_id FROM CZ_MODEL_REF_EXPLS
1471 WHERE model_ref_expl_id=p_expl_id;
1472
1473 --
1474 -- DEBUG ERROR CODE --
1475 --
1476 ERROR_CODE:=303;
1477
1478 END IF;
1479
1480 RETURN v_ref_id;
1481
1482 END;
1483
1484 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1485 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1486
1487 PROCEDURE set_Expls
1488 (p_project_id IN INTEGER,
1489 p_ps_node_id IN INTEGER,
1490 p_mode IN VARCHAR2, -- DEFAULT PLUS_MODE
1491 p_deleted_expl_id IN INTEGER DEFAULT NULL) IS
1492
1493 v_model_ref_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE ;
1494 v_project_id CZ_MODEL_REF_EXPLS.model_id%TYPE;
1495 v_ref_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
1496
1497 BEGIN
1498
1499 IF p_mode=PLUS_MODE THEN
1500
1501 --
1502 -- DEBUG ERROR CODE --
1503 --
1504 ERROR_CODE:=400;
1505
1506 SELECT model_ref_expl_id INTO v_model_ref_id FROM
1507 CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id
1508 AND component_id=p_ps_node_id AND child_model_expl_id IS NULL AND deleted_flag=NO_FLAG;
1509
1510 --
1511 -- DEBUG ERROR CODE --
1512 --
1513 ERROR_CODE:=401;
1514
1515 END IF;
1516 IF p_mode=MINUS_MODE THEN
1517 v_model_ref_id:=p_deleted_expl_id;
1518 END IF;
1519
1520 FOR i IN (SELECT ps_node_id,ps_node_type,NAME FROM CZ_PS_NODES
1521 START WITH devl_project_id=p_project_id AND deleted_flag=NO_FLAG AND ps_node_id=p_ps_node_id
1522 CONNECT BY PRIOR ps_node_id=parent_id AND NVL(virtual_flag,'1')='1' AND deleted_flag=NO_FLAG
1523 AND PRIOR deleted_flag=NO_FLAG)
1524 LOOP
1525
1526 --
1527 -- DEBUG ERROR CODE --
1528 --
1529 ERROR_CODE:=402;
1530
1531 FOR m IN(SELECT expr_node_id,rule_id,model_ref_expl_id FROM CZ_EXPRESSION_NODES
1532 WHERE ps_node_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1533 LOOP
1534 BEGIN
1535
1536 --
1537 -- DEBUG ERROR CODE --
1538 --
1539 ERROR_CODE:=403;
1540
1541 v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1542
1543 --
1544 -- DEBUG ERROR CODE --
1545 --
1546 ERROR_CODE:=404;
1547
1548 UPDATE CZ_EXPRESSION_NODES
1549 SET model_ref_expl_id=v_ref_id
1550 WHERE expr_node_id=m.expr_node_id AND rule_id=m.rule_id;
1551
1552 --
1553 -- DEBUG ERROR CODE --
1554 --
1555 ERROR_CODE:=405;
1556
1557 EXCEPTION
1558 WHEN NO_DATA_FOUND THEN
1559 NULL;
1560 WHEN OTHERS THEN
1561 LOG_REPORT('set_Expls','CZ_EXPRESSION_NODES ERROR CODE :'||
1562 ERROR_CODE||' : '||SQLERRM);
1563 END;
1564 END LOOP;
1565
1566 IF i.ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE) THEN
1567
1571 ERROR_CODE:=406;
1568 --
1569 -- DEBUG ERROR CODE --
1570 --
1572
1573 FOR m IN(SELECT func_comp_id,component_id,model_ref_expl_id FROM CZ_FUNC_COMP_SPECS
1574 WHERE component_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1575 LOOP
1576 BEGIN
1577
1578 --
1579 -- DEBUG ERROR CODE --
1580 --
1581 ERROR_CODE:=407;
1582
1583 v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1584
1585 --
1586 -- DEBUG ERROR CODE --
1587 --
1588 ERROR_CODE:=408;
1589
1590 UPDATE CZ_FUNC_COMP_SPECS
1591 SET model_ref_expl_id=v_ref_id
1592 WHERE func_comp_id=m.func_comp_id AND component_id=m.component_id;
1593
1594 --
1595 -- DEBUG ERROR CODE --
1596 --
1597 ERROR_CODE:=409;
1598
1599 EXCEPTION
1600 WHEN OTHERS THEN
1601 LOG_REPORT('set_Expls','CZ_FUNC_COMP_SPECS : func_comp_id='||TO_CHAR(m.func_comp_id));
1602 END;
1603
1604 END LOOP;
1605
1606 END IF;
1607
1608
1609 IF i.ps_node_type IN(FEATURE_TYPE) THEN
1610
1611 --
1612 -- DEBUG ERROR CODE --
1613 --
1614 ERROR_CODE:=410;
1615
1616 FOR m IN(SELECT rule_id,feature_id,model_ref_expl_id FROM CZ_COMBO_FEATURES
1617 WHERE feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1618 LOOP
1619 BEGIN
1620
1621 --
1622 -- DEBUG ERROR CODE --
1623 --
1624 ERROR_CODE:=411;
1625
1626 v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1627
1628 --
1629 -- DEBUG ERROR CODE --
1630 --
1631 ERROR_CODE:=412;
1632
1633 UPDATE CZ_COMBO_FEATURES
1634 SET model_ref_expl_id=v_ref_id
1635 WHERE rule_id=m.rule_id AND feature_id=m.feature_id;
1636
1637 --
1638 -- DEBUG ERROR CODE --
1639 --
1640 ERROR_CODE:=413;
1641
1642
1643 EXCEPTION
1644 WHEN NO_DATA_FOUND THEN
1645 LOG_REPORT('set_Expls','CZ_COMBO_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1646 WHEN OTHERS THEN
1647 LOG_REPORT('set_Expls','CZ_COMBO_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1648 END;
1649
1650 END LOOP;
1651
1652 --
1653 -- DEBUG ERROR CODE --
1654 --
1655 ERROR_CODE:=414;
1656
1657 FOR m IN(SELECT rule_id,feature_id,model_ref_expl_id FROM CZ_DES_CHART_FEATURES
1658 WHERE feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1659 LOOP
1660 BEGIN
1661
1662 --
1663 -- DEBUG ERROR CODE --
1664 --
1665 ERROR_CODE:=415;
1666
1667 v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1668
1669 --
1670 -- DEBUG ERROR CODE --
1671 --
1672 ERROR_CODE:=416;
1673
1674 UPDATE CZ_DES_CHART_FEATURES
1675 SET model_ref_expl_id=v_ref_id
1676 WHERE rule_id=m.rule_id AND feature_id=m.feature_id;
1677
1678 --
1679 -- DEBUG ERROR CODE --
1680 --
1681 ERROR_CODE:=417;
1682
1683 EXCEPTION
1684 WHEN NO_DATA_FOUND THEN
1685 LOG_REPORT('set_Expls','CZ_DES_CHART_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1686 WHEN OTHERS THEN
1687 LOG_REPORT('set_Expls','CZ_DES_CHART_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1688 END;
1689 END LOOP;
1690
1691 FOR m IN(SELECT rule_id,primary_opt_id,secondary_opt_id,secondary_feature_id,
1692 secondary_feat_expl_id FROM CZ_DES_CHART_CELLS
1693 WHERE secondary_feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1694 LOOP
1695 BEGIN
1696 v_ref_id:=get_Next_ExplId(m.secondary_feat_expl_id,v_model_ref_id,p_mode);
1697 UPDATE CZ_DES_CHART_CELLS
1698 SET secondary_feat_expl_id=v_ref_id
1699 WHERE rule_id=m.rule_id AND secondary_feature_id=m.secondary_feature_id AND
1700 primary_opt_id=m.primary_opt_id AND secondary_opt_id=m.secondary_opt_id;
1701
1702 EXCEPTION
1703 WHEN NO_DATA_FOUND THEN
1704 LOG_REPORT('set_Expls','CZ_DES_CHART_CELLS : secondary_feature_id='||TO_CHAR(m.secondary_feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1705 WHEN OTHERS THEN
1706 LOG_REPORT('set_Expls','CZ_DES_CHART_CELLS : secondary_feature_id='||TO_CHAR(m.secondary_feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1707 END;
1708
1709 END LOOP;
1710
1711 END IF;
1712
1713 IF i.ps_node_type=OPTION_TYPE THEN
1714 FOR m IN(SELECT rule_id,option_id,model_ref_expl_id FROM CZ_DES_CHART_COLUMNS
1715 WHERE option_id=i.ps_node_id)
1716 LOOP
1717 BEGIN
1721 SET model_ref_expl_id=v_ref_id
1718 v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1719
1720 UPDATE CZ_DES_CHART_COLUMNS
1722 WHERE rule_id=m.rule_id AND option_id=m.option_id;
1723
1724 EXCEPTION
1725 WHEN NO_DATA_FOUND THEN
1726 LOG_REPORT('set_Expls','CZ_DES_CHART_COLUMNS : option_id='||TO_CHAR(m.option_id)||' rule_id='||TO_CHAR(m.rule_id));
1727 WHEN OTHERS THEN
1728 LOG_REPORT('set_Expls','CZ_DES_CHART_COLUMNS : option_id='||TO_CHAR(m.option_id)||' rule_id='||TO_CHAR(m.rule_id));
1729 END;
1730 END LOOP;
1731 END IF;
1732
1733 END LOOP;
1734
1735 EXCEPTION
1736 WHEN OTHERS THEN
1737 LOG_REPORT('set_Expls','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
1738 END set_Expls;
1739
1740 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1741 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1742
1743 PROCEDURE refresh_UI_Expl_Ids(p_ps_node_id IN NUMBER,
1744 p_component_id IN NUMBER,
1745 p_model_id IN NUMBER,
1746 p_old_expl_id IN NUMBER,
1747 p_new_expl_id IN NUMBER) IS
1748
1749 t_persistent_node_id_tbl IntArray;
1750
1751 PROCEDURE refresh_It_For_Single_UI(p_current_ui_def_id IN NUMBER) IS
1752 BEGIN
1753
1754 FOR k IN t_persistent_node_id_tbl.First..t_persistent_node_id_tbl.Last
1755 LOOP
1756 UPDATE CZ_UI_PAGE_ELEMENTS
1757 SET model_ref_expl_id=p_new_expl_id
1758 WHERE ui_def_id=p_current_ui_def_id AND
1759 persistent_node_id=t_persistent_node_id_tbl(k) AND
1760 model_ref_expl_id=p_old_expl_id AND
1761 deleted_flag='0';
1762
1763 UPDATE CZ_UI_PAGES
1764 SET pagebase_expl_node_id=p_new_expl_id
1765 WHERE ui_def_id=p_current_ui_def_id AND
1766 persistent_node_id=t_persistent_node_id_tbl(k) AND
1767 pagebase_expl_node_id=p_old_expl_id AND
1768 deleted_flag='0';
1769
1770 UPDATE CZ_UI_PAGE_REFS
1771 SET target_expl_node_id=p_new_expl_id
1772 WHERE ui_def_id=p_current_ui_def_id AND
1773 target_persistent_node_id=t_persistent_node_id_tbl(k) AND
1774 target_expl_node_id=p_old_expl_id AND
1775 deleted_flag='0';
1776
1777 UPDATE CZ_UI_PAGE_SETS
1778 SET pagebase_expl_node_id=p_new_expl_id
1779 WHERE ui_def_id=p_current_ui_def_id AND
1780 persistent_node_id=t_persistent_node_id_tbl(k) AND
1781 pagebase_expl_node_id=p_old_expl_id AND
1782 deleted_flag='0';
1783
1784 UPDATE CZ_UI_ACTIONS
1785 SET target_expl_node_id=p_new_expl_id
1786 WHERE ui_def_id=p_current_ui_def_id AND
1787 target_persistent_node_id=t_persistent_node_id_tbl(k) AND
1788 target_expl_node_id=p_old_expl_id AND
1789 deleted_flag='0';
1790
1791 END LOOP;
1792
1793 END refresh_It_For_Single_UI;
1794
1795 PROCEDURE refresh_It_For_Single_Model(p_current_model_id IN NUMBER) IS
1796 BEGIN
1797 FOR i IN (SELECT ui_def_id FROM CZ_UI_DEFS
1798 WHERE devl_project_id=p_current_model_id AND
1799 ui_style='7' AND deleted_flag='0')
1800 LOOP
1801 refresh_It_For_Single_UI(i.ui_def_id);
1802 END LOOP;
1803 END refresh_It_For_Single_Model;
1804
1805 BEGIN
1806
1807 SELECT persistent_node_id
1808 BULK COLLECT INTO t_persistent_node_id_tbl
1809 FROM CZ_PS_NODES
1810 START WITH ps_node_id=p_ps_node_id AND deleted_flag='0' AND
1811 (reference_id IS NULL AND component_id=p_component_id)
1812 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag='0' AND
1813 PRIOR deleted_flag='0' AND (reference_id IS NULL AND component_id=p_component_id);
1814
1815 refresh_It_For_Single_Model(p_model_id);
1816
1817 IF t_chain.COUNT>0 THEN
1818 FOR i IN t_chain.First..t_chain.Last
1819 LOOP
1820 refresh_It_For_Single_Model(t_chain(i).model_id);
1821 END LOOP;
1822 END IF;
1823
1824 END refresh_UI_Expl_Ids;
1825
1826 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1827 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1828
1829 PROCEDURE delete_it
1830 (p_expl_id IN INTEGER,
1831 p_del_logically IN VARCHAR2 -- DEFAULT YES_FLAG
1832 ) IS
1833
1834 BEGIN
1835 IF p_del_logically=YES_FLAG THEN
1836
1837 --
1838 -- DEBUG ERROR CODE --
1839 --
1840 ERROR_CODE:=500;
1841
1842 UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG WHERE model_ref_expl_id IN
1843 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1844 START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1845 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1846
1847 --
1848 -- DEBUG ERROR CODE --
1849 --
1850 ERROR_CODE:=501;
1851
1852 ELSE
1853 --
1854 -- DEBUG ERROR CODE --
1855 --
1856 ERROR_CODE:=502;
1857
1861 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1858 DELETE FROM CZ_MODEL_REF_EXPLS WHERE model_ref_expl_id IN
1859 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1860 START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1862
1863 --
1864 -- DEBUG ERROR CODE --
1865 --
1866 ERROR_CODE:=503;
1867
1868 END IF;
1869 END;
1870
1871
1872 PROCEDURE delete_Node_
1873 (p_ps_node_id IN INTEGER,
1874 p_ps_node_type IN INTEGER,
1875 p_del_logically IN VARCHAR2 -- DEFAULT '1'
1876 ) IS
1877
1878 PROCEDURE delete_it_
1879 (p_expl_id IN INTEGER,
1880 p_del_logically IN VARCHAR2, -- DEFAULT YES_FLAG
1881 p_ps_node_type IN INTEGER DEFAULT NULL) IS
1882
1883 BEGIN
1884 IF p_del_logically=YES_FLAG THEN
1885 UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
1886 WHERE model_ref_expl_id=p_expl_id;
1887 ELSE
1888 DELETE FROM CZ_MODEL_REF_EXPLS WHERE model_ref_expl_id=p_expl_id;
1889 END IF;
1890
1891 IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1892 IF p_del_logically=YES_FLAG THEN
1893 UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
1894 WHERE deleted_flag=NO_FLAG AND model_ref_expl_id IN
1895 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1896 START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1897 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
1898 PRIOR deleted_flag=NO_FLAG);
1899 ELSE
1900 DELETE FROM CZ_MODEL_REF_EXPLS
1901 WHERE model_ref_expl_id IN
1902 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1903 START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1904 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1905 END IF;
1906 END IF;
1907 END delete_it_;
1908
1909 BEGIN
1910 IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1911 FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1912 WHERE referring_node_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1913 LOOP
1914 delete_it_(i.model_ref_expl_id, YES_FLAG);
1915 END LOOP;
1916 ELSE
1917 FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1918 WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1919 LOOP
1920 delete_it_(i.model_ref_expl_id, YES_FLAG);
1921 END LOOP;
1922 END IF;
1923 END delete_Node_;
1924
1925 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1926 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1927
1928 FUNCTION containsBOM(p_model_id IN INTEGER,p_instanciable OUT NOCOPY INTEGER) RETURN NUMBER IS
1929
1930 v_exist_bom_nodes VARCHAR2(1);
1931 v_ret NUMBER:=NULL_VALUE;
1932
1933 BEGIN
1934 p_instanciable:=0;
1935
1936 FOR i IN(SELECT model_ref_expl_id,referring_node_id,component_id,expl_node_type FROM CZ_MODEL_REF_EXPLS
1937 START WITH model_id=p_model_id AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG
1938 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
1939 deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG
1940 AND ps_node_type IN(BOM_MODEL_TYPE,COMPONENT_TYPE,REFERENCE_TYPE)
1941 AND PRIOR ps_node_type IN(BOM_MODEL_TYPE,COMPONENT_TYPE,REFERENCE_TYPE))
1942 LOOP
1943 BEGIN
1944 SELECT '1' INTO v_exist_bom_nodes
1945 FROM dual WHERE
1946 EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE devl_project_id=i.component_id
1947 AND ps_node_type=436 AND deleted_flag=NO_FLAG);
1948
1949 IF i.referring_node_id IS NOT NULL THEN
1950 v_ret:=i.referring_node_id;
1951 ELSE
1952 v_ret:=i.component_id;
1953 END IF;
1954 IF i.expl_node_type=MINMAX_EXPL_TYPE THEN
1955 p_instanciable:=1;
1956 RETURN v_ret;
1957 END IF;
1958 EXCEPTION
1959 WHEN OTHERS THEN
1960 NULL;
1961 END;
1962 END LOOP;
1963 RETURN v_ret;
1964 END containsBOM;
1965
1966 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1967 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1968
1969 PROCEDURE get_from_Node_Up
1970 (p_ps_node_id IN INTEGER,
1971 p_project_id IN INTEGER,
1972 p_out_ps_node_id IN OUT NOCOPY INTEGER,
1973 p_out_expl_id IN OUT NOCOPY INTEGER,
1974 p_out_level IN OUT NOCOPY INTEGER) IS
1975
1976 v_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE:=NULL_VALUE;
1977 v_parent_id CZ_PS_NODES.parent_id%TYPE:=NULL_VALUE;
1978
1979 BEGIN
1980
1981 p_out_ps_node_id:=NULL_VALUE;
1982 p_out_expl_id:=NULL_VALUE;
1983 p_out_level:=NULL_VALUE;
1984
1985 BEGIN
1986 --
1987 -- DEBUG ERROR CODE --
1988 --
1992 FROM CZ_PS_NODES WHERE ps_node_id=p_ps_node_id;
1989 ERROR_CODE:=1001;
1990
1991 SELECT parent_id INTO v_parent_id
1993
1994 IF v_parent_id IS NULL THEN
1995 p_out_ps_node_id:=p_ps_node_id;
1996 --
1997 -- DEBUG ERROR CODE --
1998 --
1999 ERROR_CODE:=1002;
2000
2001 SELECT model_ref_expl_id,node_depth
2002 INTO p_out_expl_id,p_out_level
2003 FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_ps_node_id
2004 AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
2005
2006 RETURN;
2007 END IF;
2008 EXCEPTION
2009 WHEN OTHERS THEN
2010 LOG_REPORT('get_from_Node_Up','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
2011 END;
2012
2013 FOR i IN (SELECT ps_node_id,parent_id,virtual_flag FROM CZ_PS_NODES
2014 WHERE ps_node_id=v_parent_id AND deleted_flag=NO_FLAG)
2015 LOOP
2016
2017 IF i.virtual_flag=NO_FLAG OR i.parent_id IS NULL THEN
2018 p_out_ps_node_id:=i.ps_node_id;
2019
2020 --
2021 -- DEBUG ERROR CODE --
2022 --
2023 ERROR_CODE:=700;
2024
2025 SELECT model_ref_expl_id,node_depth
2026 INTO p_out_expl_id,p_out_level
2027 FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id
2028 AND component_id=i.ps_node_id AND deleted_flag=NO_FLAG;
2029
2030 --
2031 -- DEBUG ERROR CODE --
2032 --
2033 ERROR_CODE:=708;
2034
2035 EXIT;
2036 ELSE
2037 --
2038 -- DEBUG ERROR CODE --
2039 --
2040 ERROR_CODE:=709;
2041
2042 get_from_Node_Up(i.ps_node_id,p_project_id,p_out_ps_node_id,p_out_expl_id,p_out_level);
2043
2044 --
2045 -- DEBUG ERROR CODE --
2046 --
2047 ERROR_CODE:=710;
2048
2049 END IF;
2050 END LOOP;
2051
2052 EXCEPTION
2053 WHEN OTHERS THEN
2054 LOG_REPORT('get_from_Node_Up','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
2055 END;
2056
2057 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2058 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2059
2060 PROCEDURE update_Rules(p_ps_node_id IN INTEGER) IS
2061
2062 v_old_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2063 v_new_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2064
2065 BEGIN
2066 FOR i IN t_old_expl_ids.FIRST..t_old_expl_ids.LAST
2067 LOOP
2068 v_old_expl_id:=t_old_expl_ids(i);
2069 v_new_expl_id:=t_new_expl_ids(i);
2070
2071 IF v_old_expl_id IS NOT NULL AND v_new_expl_id IS NOT NULL THEN
2072 FOR n IN(SELECT ps_node_id FROM CZ_PS_NODES
2073 START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
2074 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
2075 LOOP
2076 UPDATE CZ_EXPRESSION_NODES SET model_ref_expl_id=v_new_expl_id
2077 WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2078 AND ps_node_id=n.ps_node_id;
2079
2080 UPDATE CZ_COMBO_FEATURES
2081 SET model_ref_expl_id=v_new_expl_id
2082 WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2083 AND feature_id=n.ps_node_id;
2084
2085 UPDATE CZ_DES_CHART_FEATURES
2086 SET model_ref_expl_id=v_new_expl_id
2087 WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2088 AND feature_id=n.ps_node_id;
2089
2090 UPDATE CZ_DES_CHART_CELLS
2091 SET secondary_feat_expl_id=v_new_expl_id
2092 WHERE secondary_feat_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2093 AND (secondary_feature_id=n.ps_node_id OR
2094 primary_opt_id=n.ps_node_id OR secondary_opt_id=n.ps_node_id);
2095
2096 UPDATE CZ_FUNC_COMP_SPECS
2097 SET model_ref_expl_id=v_new_expl_id
2098 WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG AND
2099 component_id=n.ps_node_id;
2100
2101 UPDATE CZ_DES_CHART_COLUMNS
2102 SET model_ref_expl_id=v_new_expl_id
2103 WHERE model_ref_expl_id=v_old_expl_id AND
2104 option_id=n.ps_node_id;
2105 END LOOP;
2106 END IF;
2107 END LOOP;
2108 END;
2109
2110 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2111 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2112
2113 PROCEDURE populate_tree
2114 (p_parent_ref_expl_id IN INTEGER, -- model_ref_expl_id of parent node
2115 p_model_ref_expl_id IN INTEGER, -- model_ref_expl_id of current node
2116 p_ps_node_id IN INTEGER, -- ps_node_id of current node
2117 p_ps_node_type IN INTEGER, -- ps_node_type of current node
2118 p_expl_node_type IN INTEGER, -- expl_node_type of current node
2119 p_model_id IN INTEGER, -- model_id of current model
2120 p_child_array IN IntArray -- array of direct childs ( in PS tree )
2121 ) IS
2122
2123 t_child_nodes IntArray;
2127
2124 v_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2125 v_model_id CZ_MODEL_REF_EXPLS.model_id%TYPE;
2126 v_ps_node_id CZ_PS_NODES.ps_node_id%TYPE;
2128 BEGIN
2129 IF t_chain.COUNT=0 THEN
2130 RETURN;
2131 END IF;
2132 FOR i IN t_chain.FIRST..t_chain.LAST
2133 LOOP
2134 IF t_chain(i).parent_model_id=p_model_id THEN
2135 v_model_id:=t_chain(i).model_id;
2136
2137 FOR l IN(SELECT model_ref_expl_id,node_depth
2138 FROM CZ_MODEL_REF_EXPLS
2139 WHERE model_id=t_chain(i).model_id AND
2140 child_model_expl_id=p_parent_ref_expl_id
2141 AND deleted_flag=NO_FLAG)
2142 LOOP
2143
2144 --
2145 -- generate the next PK for CZ_MODEL_REF_EXPLS table
2146 --
2147 v_expl_id:=allocate_Expl_Id;
2148
2149 --
2150 -- DEBUG ERROR CODE --
2151 --
2152 ERROR_CODE:=800;
2153
2154 INSERT INTO CZ_MODEL_REF_EXPLS
2155 (model_ref_expl_id,
2156 parent_expl_node_id,
2157 referring_node_id,
2158 model_id,
2159 component_id,
2160 ps_node_type,
2161 virtual_flag,
2162 node_depth,
2163 expl_node_type,
2164 child_model_expl_id,
2165 deleted_flag)
2166 VALUES
2167 (v_expl_id,
2168 l.model_ref_expl_id,
2169 NULL,
2170 v_model_id,
2171 p_ps_node_id,
2172 p_ps_node_type,
2173 NO_FLAG,
2174 l.node_depth+1,
2175 p_expl_node_type,
2176 p_model_ref_expl_id,
2177 NO_FLAG);
2178
2179 --
2180 -- DEBUG ERROR CODE --
2181 --
2182 ERROR_CODE:=801;
2183
2184 --
2185 -- reset childs nodes
2186 --
2187 IF p_child_array.COUNT>0 THEN
2188 FOR t IN p_child_array.FIRST..p_child_array.LAST
2189 LOOP
2190 t_child_nodes.DELETE;
2191 v_ps_node_id:=p_child_array(t);
2192
2193 --
2194 -- DEBUG ERROR CODE --
2195 --
2196 ERROR_CODE:=802;
2197
2198 UPDATE CZ_MODEL_REF_EXPLS
2199 SET parent_expl_node_id=v_expl_id
2200 WHERE parent_expl_node_id=l.model_ref_expl_id
2201 AND model_id=v_model_id AND
2202 ((ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE,BOM_MODEL_TYPE) AND component_id=v_ps_node_id)
2203 OR (ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND referring_node_id=v_ps_node_id))
2204 AND deleted_flag=NO_FLAG
2205 RETURNING model_ref_expl_id BULK COLLECT INTO t_child_nodes ;
2206
2207 --
2208 -- DEBUG ERROR CODE --
2209 --
2210 ERROR_CODE:=803;
2211
2212 IF t_child_nodes.COUNT>0 THEN
2213
2214 --
2215 -- DEBUG ERROR CODE --
2216 --
2217 ERROR_CODE:=804;
2218
2219 FORALL h IN t_child_nodes.FIRST..t_child_nodes.LAST
2220 UPDATE CZ_MODEL_REF_EXPLS
2221 SET node_depth=node_depth+1
2222 WHERE model_ref_expl_id IN
2223 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2224 START WITH model_ref_expl_id=t_child_nodes(h) AND deleted_flag=NO_FLAG
2225 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
2226 AND PRIOR deleted_flag=NO_FLAG);
2227
2228 --
2229 -- DEBUG ERROR CODE --
2230 --
2231 ERROR_CODE:=805;
2232
2233 END IF;
2234 END LOOP;
2235 END IF;
2236
2237 --
2238 -- DEBUG ERROR CODE --
2239 --
2240 ERROR_CODE:=806;
2241
2242 populate_tree
2243 (l.model_ref_expl_id,v_expl_id,p_ps_node_id,
2244 p_ps_node_type,p_expl_node_type,v_model_id,p_child_array);
2245
2246 --
2247 -- DEBUG ERROR CODE --
2248 --
2249 ERROR_CODE:=807;
2250
2251 END LOOP;
2252
2253 END IF;
2254 END LOOP;
2255
2256 --
2257 -- DEBUG ERROR CODE --
2258 --
2259 ERROR_CODE:=809;
2260
2261 END;
2262
2263 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2264 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2265
2269 p_model_id IN NUMBER
2266 PROCEDURE populate_expl_tree_internal(
2267 p_parent_model_ref_expl_id IN NUMBER,
2268 p_model_ref_expl_id IN NUMBER,
2270 ) IS
2271 v_expl_id NUMBER;
2272 v_model_id NUMBER;
2273 BEGIN
2274
2275 IF t_chain.COUNT=0 THEN
2276 RETURN;
2277 END IF;
2278 FOR i IN t_chain.FIRST..t_chain.LAST
2279 LOOP
2280 IF t_chain(i).parent_model_id=p_model_id THEN
2281 v_model_id:=t_chain(i).model_id;
2282
2283 FOR l IN(SELECT model_ref_expl_id,node_depth
2284 FROM CZ_MODEL_REF_EXPLS
2285 WHERE model_id=t_chain(i).model_id AND
2286 child_model_expl_id=p_parent_model_ref_expl_id
2287 AND deleted_flag=NO_FLAG)
2288 LOOP
2289
2290 FOR m IN(SELECT *
2291 FROM CZ_MODEL_REF_EXPLS
2292 WHERE model_ref_expl_id = p_model_ref_expl_id
2293 AND deleted_flag=NO_FLAG)
2294 LOOP
2295 --
2296 -- generate the next PK for CZ_MODEL_REF_EXPLS table
2297 --
2298 v_expl_id:=allocate_Expl_Id;
2299
2300 INSERT INTO CZ_MODEL_REF_EXPLS
2301 (model_ref_expl_id,
2302 parent_expl_node_id,
2303 referring_node_id,
2304 model_id,
2305 component_id,
2306 ps_node_type,
2307 virtual_flag,
2308 node_depth,
2309 expl_node_type,
2310 child_model_expl_id,
2311 deleted_flag)
2312 VALUES
2313 (v_expl_id,
2314 l.model_ref_expl_id,
2315 m.referring_node_id,
2316 v_model_id,
2317 m.component_id,
2318 m.ps_node_type,
2319 m.virtual_flag,
2320 l.node_depth+1,
2321 m.expl_node_type,
2322 p_model_ref_expl_id,
2323 NO_FLAG);
2324 END LOOP;
2325
2326 populate_expl_tree_internal(l.model_ref_expl_id,v_expl_id,v_model_id);
2327 END LOOP;
2328 END IF;
2329 END LOOP;
2330 END populate_expl_tree_internal;
2331 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2332 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2333 PROCEDURE populate_parent_expl_tree_(
2334 p_model_id IN NUMBER,
2335 p_model_ref_expl_id IN NUMBER,
2336 p_parent_model_ref_expl_id IN NUMBER
2337 ) IS
2338 BEGIN
2339
2340 populate_expl_tree_internal(p_parent_model_ref_expl_id,p_model_ref_expl_id,p_model_id);
2341
2342 FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS WHERE parent_expl_node_id = p_model_ref_expl_id AND deleted_flag = NO_FLAG)
2343 LOOP
2344 populate_parent_expl_tree_(p_model_id => p_model_id, p_model_ref_expl_id => i.model_ref_expl_id, p_parent_model_ref_expl_id => p_model_ref_expl_id);
2345 END LOOP;
2346
2347
2348 END populate_parent_expl_tree_;
2349
2350 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2351 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2352 --
2353 -- vsingava bug7831246 02th Mar '09
2354 -- procedure which populates the set of explosions p_ps_node_id of p_model_id
2355 -- to all model referencing it, up the entire model heirarchy. Usually called when a node
2356 -- in structure is being copied
2357 --
2358 PROCEDURE populate_parent_expl_tree(
2359 p_ps_node_id IN NUMBER, -- ps_node_id of the copied node
2360 p_model_id IN NUMBER
2361 ) IS
2362
2363
2364 l_model_id NUMBER;
2365 l_component_id NUMBER;
2366 l_reference_id NUMBER;
2367 l_expl_id NUMBER;
2368 l_parent_id NUMBER;
2369 v_up_id INTEGER;
2370 v_up_expl_id INTEGER;
2371 v_up_level INTEGER;
2372 l_virtual_flag VARCHAR2(1);
2373 l_curr_node_depth NUMBER;
2374 l_min_node_depth NUMBER;
2375 l_ps_node_type NUMBER;
2376
2377 BEGIN
2378
2379 -- get the info from the node to be copied
2380 SELECT devl_project_id,parent_id,reference_id,component_id,virtual_flag, ps_node_type
2381 INTO l_model_id,l_parent_id,l_reference_id,l_component_id,l_virtual_flag, l_ps_node_type
2382 FROM CZ_PS_NODES
2383 WHERE ps_node_id=p_ps_node_id AND deleted_flag = NO_FLAG;
2384
2385 -- if not a reference node, get the model_refexpl_id record in model ref expls
2386 IF l_reference_id IS NULL THEN
2387 SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
2388 FROM CZ_MODEL_REF_EXPLS
2389 WHERE model_id=l_model_id AND component_id=l_component_id AND
2390 child_model_expl_id IS NULL AND deleted_flag = NO_FLAG;
2391 ELSE
2392 SELECT MIN(node_depth) INTO l_min_node_depth
2393 FROM CZ_MODEL_REF_EXPLS
2394 WHERE model_id=l_model_id AND referring_node_id=p_ps_node_id
2395 AND deleted_flag = NO_FLAG;
2396
2400 node_depth=l_min_node_depth AND deleted_flag = NO_FLAG;
2397 SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
2398 FROM CZ_MODEL_REF_EXPLS
2399 WHERE model_id=l_model_id AND referring_node_id=p_ps_node_id AND
2401 END IF;
2402
2403 t_chain.DELETE;t_projectCache.DELETE;
2404 populate_chain(p_model_id);
2405
2406 --
2407 -- find nearest non-virtual node above the target node --
2408 --
2409 get_Node_Up(p_ps_node_id,p_model_id,v_up_id,
2410 v_up_expl_id,v_up_level);
2411
2412 IF v_up_id = p_ps_node_id THEN
2413 get_Node_Up(l_parent_id,p_model_id,v_up_id,
2414 v_up_expl_id,v_up_level);
2415 END IF;
2416
2417 IF (l_virtual_flag='1' OR l_virtual_flag IS NULL) AND l_parent_id IS NOT NULL THEN
2418
2419 FOR i IN(SELECT model_ref_expl_id, node_depth FROM CZ_MODEL_REF_EXPLS
2420 WHERE parent_expl_node_id=v_up_expl_id AND
2421 deleted_flag = NO_FLAG AND
2422 (referring_node_id IS NULL AND component_id IN
2423 (SELECT ps_node_id FROM CZ_PS_NODES
2424 START WITH ps_node_id=p_ps_node_id
2425 CONNECT BY PRIOR ps_node_id=parent_id AND
2426 deleted_flag = NO_FLAG AND PRIOR deleted_flag = NO_FLAG)) OR
2427 (referring_node_id IS NOT NULL AND referring_node_id IN
2428 (SELECT ps_node_id FROM CZ_PS_NODES
2429 START WITH ps_node_id=p_ps_node_id
2430 CONNECT BY PRIOR ps_node_id=parent_id AND
2431 deleted_flag = NO_FLAG AND PRIOR deleted_flag = NO_FLAG)))
2432 LOOP
2433 populate_parent_expl_tree_(p_model_id => p_model_id,
2434 p_model_ref_expl_id => i.model_ref_expl_id,
2435 p_parent_model_ref_expl_id => v_up_expl_id);
2436 END LOOP;
2437 ELSIF l_virtual_flag='0' -- OR l_parent_id IS NULL
2438 THEN
2439 populate_parent_expl_tree_(p_model_id => p_model_id,
2440 p_model_ref_expl_id => l_expl_id,
2441 p_parent_model_ref_expl_id => v_up_expl_id);
2442 END IF;
2443
2444
2445 END populate_parent_expl_tree;
2446
2447 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2448 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2449
2450 PROCEDURE update_child_nodes(p_model_id IN NUMBER) IS
2451
2452 TYPE t_varchar2_tbl_type IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
2453 TYPE t_indchar2_tbl_type IS TABLE OF NUMBER INDEX BY VARCHAR2(32000);
2454 TYPE IntArrayIndexVC2 IS TABLE OF NUMBER INDEX BY VARCHAR2(15);
2455 l_model_updated_tbl IntArrayIndexVC2;
2456
2457 l_num_updated_records NUMBER := 0;
2458
2459 PROCEDURE update_layer
2460 (
2461 p_current_model_id IN NUMBER
2462 ) IS
2463
2464 l_paths_tbl t_varchar2_tbl_type;
2465 l_new_paths_tbl t_varchar2_tbl_type;
2466 l_expl_path_tbl t_indchar2_tbl_type;
2467 l_new_expl_path_tbl t_indchar2_tbl_type;
2468 t_model_ref_expl_tbl IntArray;
2469 t_component_tbl IntArray;
2470
2471 l_next_model_level_tbl IntArray;
2472 l_child_expl_id NUMBER;
2473 l_path1 VARCHAR2(32000);
2474 l_path2 VARCHAR2(32000);
2475 l_loop_char_id VARCHAR2(32000);
2476 l_ref_expl_id NUMBER;
2477 l_counter NUMBER;
2478 l_loop_ind NUMBER;
2479
2480 BEGIN
2481
2482 IF l_model_updated_tbl.EXISTS(p_current_model_id) THEN
2483 RETURN;
2484 ELSE
2485 l_model_updated_tbl(p_current_model_id) := p_current_model_id;
2486 END IF;
2487
2488 FOR i IN(SELECT model_ref_expl_id, referring_node_id, component_id
2489 FROM CZ_MODEL_REF_EXPLS a
2490 WHERE a.model_id=p_current_model_id AND a.deleted_flag=NO_FLAG)
2491 LOOP
2492
2493 IF i.referring_node_id IS NULL THEN
2494 l_paths_tbl(i.model_ref_expl_id) := TO_CHAR(i.component_id);
2495 ELSE
2496 l_paths_tbl(i.model_ref_expl_id) := TO_CHAR(i.referring_node_id);
2497 END IF;
2498
2499 FOR m IN(SELECT model_ref_expl_id,component_id,referring_node_id
2500 FROM CZ_MODEL_REF_EXPLS
2501 WHERE model_ref_expl_id<>i.model_ref_expl_id
2502 START WITH model_ref_expl_id=i.model_ref_expl_id
2503 CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG)
2504 LOOP
2505
2506 IF m.referring_node_id IS NULL THEN
2507 l_paths_tbl(i.model_ref_expl_id) := l_paths_tbl(i.model_ref_expl_id) || ':' ||TO_CHAR(m.component_id);
2508 ELSE
2509 l_paths_tbl(i.model_ref_expl_id) := l_paths_tbl(i.model_ref_expl_id) || ':' ||TO_CHAR(m.referring_node_id);
2510 END IF;
2511
2512 END LOOP;
2513
2514 END LOOP;
2515
2516 l_loop_ind := l_paths_tbl.FIRST;
2517 LOOP
2518 IF l_loop_ind IS NULL THEN
2519 EXIT;
2520 END IF;
2521
2522 l_expl_path_tbl(l_paths_tbl(l_loop_ind)) := l_loop_ind;
2523
2524 l_loop_ind := l_paths_tbl.NEXT(l_loop_ind);
2525 END LOOP;
2526
2530 devl_project_id IN(SELECT object_id FROM CZ_RP_ENTRIES
2527 FOR n IN (SELECT * FROM CZ_PS_NODES a
2528 WHERE reference_id=p_current_model_id AND
2529 ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG AND
2531 WHERE object_id=a.devl_project_id AND object_type='PRJ' AND deleted_flag=NO_FLAG)
2532 )
2533 LOOP
2534
2535 l_new_expl_path_tbl.DELETE;
2536
2537 SELECT model_ref_expl_id INTO l_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2538 WHERE model_id=n.devl_project_id AND referring_node_id=n.ps_node_id;
2539
2540 l_new_paths_tbl.DELETE;
2541
2542 FOR k IN(SELECT model_ref_expl_id,component_id,
2543 referring_node_id,ps_node_type,child_model_expl_id,model_id
2544 FROM CZ_MODEL_REF_EXPLS
2545 START WITH model_ref_expl_id=l_ref_expl_id AND deleted_flag=NO_FLAG
2546 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
2547 deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
2548 LOOP
2549
2550 IF k.referring_node_id IS NULL THEN
2551 l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.component_id);
2552 ELSE
2553 l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.referring_node_id);
2554
2555 IF k.model_ref_expl_id=l_ref_expl_id THEN
2556 l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.component_id);
2557 END IF;
2558
2559 END IF;
2560
2561 IF k.model_ref_expl_id <> l_ref_expl_id THEN
2562
2563 FOR kk IN(SELECT model_ref_expl_id,component_id,referring_node_id
2564 FROM CZ_MODEL_REF_EXPLS
2565 WHERE model_ref_expl_id<>k.model_ref_expl_id
2566 START WITH model_ref_expl_id=k.model_ref_expl_id
2567 CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG)
2568 LOOP
2569
2570 IF kk.referring_node_id IS NULL THEN
2571 l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' ||TO_CHAR(kk.component_id);
2572
2573 ELSE
2574
2575 IF kk.model_ref_expl_id=l_ref_expl_id THEN
2576 l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' || TO_CHAR(kk.component_id);
2577 EXIT;
2578 ELSE
2579 l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' ||TO_CHAR(kk.referring_node_id);
2580 END IF;
2581
2582 END IF;
2583
2584 END LOOP;
2585
2586 END IF;
2587
2588 END LOOP;
2589
2590 l_loop_ind := l_new_paths_tbl.FIRST;
2591 LOOP
2592 IF l_loop_ind IS NULL THEN
2593 EXIT;
2594 END IF;
2595
2596 IF l_expl_path_tbl.EXISTS(l_new_paths_tbl(l_loop_ind)) THEN
2597
2598 SELECT child_model_expl_id INTO l_child_expl_id FROM CZ_MODEL_REF_EXPLS
2599 WHERE model_ref_expl_id=l_loop_ind;
2600
2601 IF l_expl_path_tbl(l_new_paths_tbl(l_loop_ind)) <> l_child_expl_id THEN
2602
2603 l_num_updated_records := l_num_updated_records + 1;
2604
2605 UPDATE CZ_MODEL_REF_EXPLS
2606 SET child_model_expl_id=l_expl_path_tbl(l_new_paths_tbl(l_loop_ind))
2607 WHERE model_ref_expl_id=l_loop_ind;
2608
2609 END IF;
2610
2611 END IF;
2612
2613 l_loop_ind := l_new_paths_tbl.NEXT(l_loop_ind);
2614 END LOOP;
2615
2616 l_next_model_level_tbl(l_next_model_level_tbl.COUNT+1) := n.devl_project_id;
2617
2618 END LOOP;
2619
2620 IF l_next_model_level_tbl.COUNT > 0 THEN
2621
2622 FOR v IN l_next_model_level_tbl.FIRST..l_next_model_level_tbl.LAST
2623 LOOP
2624 update_layer(l_next_model_level_tbl(v));
2625 END LOOP;
2626
2627 END IF;
2628
2629
2630 END update_layer;
2631
2632 BEGIN
2633
2634 --
2635 -- start with those explosion tree branches which do not have references/connectors to other models
2636 --
2637 FOR i IN(SELECT DISTINCT component_id FROM CZ_MODEL_REF_EXPLS a
2638 WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND
2639 ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND NOT EXISTS
2640 (SELECT NULL FROM CZ_MODEL_REF_EXPLS
2641 WHERE model_id=a.component_id AND ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG))
2642 LOOP
2643 update_layer(i.component_id);
2644 END LOOP;
2645
2646 END update_child_nodes;
2647
2648 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2649 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2650
2651 PROCEDURE delete_duplicates(p_model_id IN NUMBER) IS
2652
2653 BEGIN
2654 FOR i IN (SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS
2655 WHERE component_id=p_model_id AND referring_node_id IS NOT NULL
2656 AND deleted_flag=NO_FLAG)
2657 LOOP
2658 UPDATE CZ_MODEL_REF_EXPLS a
2662 AND parent_expl_node_id IN
2659 SET deleted_flag = '1'
2660 WHERE model_id=i.model_id AND deleted_flag=NO_FLAG
2661 AND referring_node_id IS NOT NULL
2663 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2664 WHERE model_id=i.model_id AND deleted_flag=NO_FLAG
2665 AND referring_node_id=a.referring_node_id);
2666 END LOOP;
2667
2668 FOR i IN (SELECT DISTINCT component_id FROM CZ_MODEL_REF_EXPLS
2669 WHERE model_id=p_model_id AND referring_node_id IS NOT NULL
2670 AND deleted_flag=NO_FLAG)
2671 LOOP
2672 UPDATE CZ_MODEL_REF_EXPLS a
2673 SET deleted_flag = '1'
2674 WHERE model_id=i.component_id AND deleted_flag=NO_FLAG
2675 AND referring_node_id IS NOT NULL
2676 AND parent_expl_node_id IN
2677 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2678 WHERE model_id=i.component_id AND deleted_flag=NO_FLAG
2679 AND referring_node_id=a.referring_node_id);
2680 END LOOP;
2681 END delete_duplicates;
2682
2683 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2684 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2685
2686 PROCEDURE populate_COMPONENT_ID(p_model_id IN NUMBER) IS
2687
2688 v_ps_node_id CZ_PS_NODES.ps_node_id%TYPE;
2689 v_parent_id CZ_PS_NODES.parent_id%TYPE;
2690 v_ps_id CZ_PS_NODES.ps_node_id%TYPE;
2691
2692 BEGIN
2693 FND_MSG_PUB.initialize;
2694
2695 FOR i IN(SELECT ps_node_id,parent_id,ps_node_type,virtual_flag,devl_project_id,reference_id FROM CZ_PS_NODES
2696 START WITH devl_project_id=p_model_id AND parent_id IS NULL and deleted_flag='0'
2697 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag='0' AND PRIOR deleted_flag='0')
2698 LOOP
2699 IF i.ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) THEN
2700 UPDATE CZ_PS_NODES SET component_id=i.reference_id
2701 WHERE ps_node_id=i.ps_node_id AND component_id<>i.reference_id;
2702 GOTO CONTINUE_LOOP;
2703 END IF;
2704 IF i.parent_id IS NULL OR i.virtual_flag='0' THEN
2705 UPDATE CZ_PS_NODES SET component_id=i.ps_node_id
2706 WHERE ps_node_id=i.ps_node_id AND component_id<>i.ps_node_id;
2707 GOTO CONTINUE_LOOP;
2708 END IF;
2709 IF NVL(i.virtual_flag,'1')='1' AND i.ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND i.parent_id IS NOT NULL THEN
2710 SELECT ps_node_id,parent_id INTO v_ps_node_id,v_parent_id FROM CZ_PS_NODES a
2711 WHERE devl_project_id=i.devl_project_id AND
2712 EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE ps_node_id=a.parent_id AND
2713 (virtual_flag='0' OR parent_id IS NULL) AND deleted_flag='0')
2714 START WITH ps_node_id=i.ps_node_id
2715 CONNECT BY PRIOR parent_id=ps_node_id AND deleted_flag='0' AND NVL(virtual_flag,'1')='1';
2716
2717 IF v_parent_id IS NULL THEN
2718 v_ps_id:=v_ps_node_id;
2719 ELSE
2720 v_ps_id:=v_parent_id;
2721 END IF;
2722
2723 UPDATE CZ_PS_NODES SET component_id=v_ps_id
2724 WHERE ps_node_id=i.ps_node_id AND component_id<>v_ps_id;
2725 END IF;
2726
2727 <<CONTINUE_LOOP>>
2728 NULL;
2729 END LOOP;
2730 END populate_COMPONENT_ID;
2731
2732 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2733 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2734
2735 PROCEDURE check_Node
2736 (p_ps_node_id IN INTEGER,
2737 p_model_id IN INTEGER,
2738 p_maximum IN INTEGER,
2739 p_minimum IN INTEGER,
2740 p_reference_id IN INTEGER,
2741 p_out_err OUT NOCOPY INTEGER,
2742 p_out_virtual_flag OUT NOCOPY INTEGER,
2743 p_consequent_flag IN VARCHAR2 , -- DEFAULT NO_FLAG,
2744 p_expr_node_id IN INTEGER DEFAULT NULL,
2745 p_ps_type IN INTEGER DEFAULT NULL,
2746 p_expr_subtype IN INTEGER DEFAULT NULL
2747 ) IS
2748
2749 t_child_nodes IntArray;
2750 t_childs IntArray;
2751
2752 v_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2753 v_model_ref_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2754 v_expl_node_type CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
2755 v_del_ref_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2756 v_up_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2757 v_up_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
2758 v_curr_expl_node_type CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
2759
2760 v_up_id CZ_PS_NODES.ps_node_id%TYPE;
2761 v_virtual_flag CZ_PS_NODES.virtual_flag%TYPE;
2762 v_ps_node_type CZ_PS_NODES.ps_node_type%TYPE;
2763 v_ps_node_id CZ_PS_NODES.ps_node_id%TYPE;
2764 v_minimum CZ_PS_NODES.MINIMUM%TYPE;
2765 v_maximum CZ_PS_NODES.MAXIMUM%TYPE;
2766 v_instantiable_flag CZ_PS_NODES.instantiable_flag%TYPE;
2767 v_parent_expl_node_id NUMBER;
2768 v_component_id NUMBER;
2769 v_comp_expl_id NUMBER;
2770 v_ndebug NUMBER;
2771 v_node_Exist BOOLEAN:=FALSE;
2772
2773 BEGIN
2774
2775 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2776 v_ndebug := 0;
2780 fnd_log.LEVEL_PROCEDURE);
2777 cz_utils.log_report('CZ_REFS', 'check_Node', v_ndebug,
2778 'Starting CZ_REFS.check_Node for model node with ps_node_id='||TO_CHAR(p_ps_node_id)||
2779 ' current time : '||TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'),
2781 cz_utils.log_report('CZ_REFS', 'check_Node', v_ndebug,
2782 'Parameters : '||
2783 'p_ps_node_id = '||TO_CHAR(p_ps_node_id)||
2784 'p_model_id = '||TO_CHAR(p_model_id)||
2785 'p_maximum = '||TO_CHAR(p_maximum)||
2786 'p_minimum = '||TO_CHAR(p_minimum)||
2787 'p_reference_id = '||TO_CHAR(p_reference_id)||
2788 'p_consequent_flag = '||p_consequent_flag||
2789 'p_expr_node_id = '||TO_CHAR(p_expr_node_id)||
2790 'p_ps_type = '||TO_CHAR(p_ps_type)||
2791 'p_ps_type = '||TO_CHAR(p_ps_type)
2792 ,fnd_log.LEVEL_PROCEDURE);
2793 END IF;
2794
2795 BEGIN
2796 Initialize;
2797 p_out_err:=0;
2798 p_out_virtual_flag:=1;
2799
2800 SELECT instantiable_flag,ps_node_type,minimum,maximum,component_id
2801 INTO v_instantiable_flag,v_ps_node_type,v_minimum,v_maximum,v_component_id
2802 FROM CZ_PS_NODES
2803 WHERE ps_node_id=p_ps_node_id;
2804
2805 -- Developer passes max/min
2806 v_minimum := p_minimum;
2807 v_maximum := p_maximum;
2808
2809 IF NOT(v_minimum=1 AND v_maximum=1) AND v_ps_node_type<>BOM_MODEL_TYPE
2810 AND v_instantiable_flag=MANDATORY_EXPL_TYPE THEN
2811 p_out_err:=m_RUN_ID;
2812 LOG_REPORT('check_Node','CZ_PS_NODES.instantiable_flag=2 violates min/max=1/1.');
2813 RETURN;
2814 END IF;
2815
2816
2817 IF v_instantiable_flag NOT IN(OPTIONAL_EXPL_TYPE,MANDATORY_EXPL_TYPE,
2818 CONNECTOR_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
2819
2820 IF v_minimum=1 AND v_maximum=1 AND
2821 v_ps_node_type<>CONNECTOR_TYPE THEN
2822 v_instantiable_flag:=MANDATORY_EXPL_TYPE;
2823 END IF;
2824
2825 IF v_minimum=0 AND v_maximum=1 AND
2826 v_ps_node_type<>CONNECTOR_TYPE THEN
2827 v_instantiable_flag:=OPTIONAL_EXPL_TYPE;
2828 END IF;
2829
2830 IF NOT(v_minimum=1 AND v_maximum=1) AND
2831 v_ps_node_type<>CONNECTOR_TYPE THEN
2832 v_instantiable_flag:=MINMAX_EXPL_TYPE;
2833 END IF;
2834
2835 IF v_ps_node_type=CONNECTOR_TYPE THEN
2836 v_instantiable_flag:=CONNECTOR_EXPL_TYPE;
2837 END IF;
2838
2839 UPDATE CZ_PS_NODES
2840 SET minimum=p_minimum,
2841 maximum=p_maximum,
2842 instantiable_flag=v_instantiable_flag
2843 WHERE ps_node_id=p_ps_node_id;
2844
2845 END IF;
2846
2847 --
2848 -- DEBUG ERROR CODE --
2849 --
2850 ERROR_CODE:=901;
2851
2852 v_expl_node_type := v_instantiable_flag;
2853
2854 --
2855 -- DEBUG ERROR CODE --
2856 --
2857 ERROR_CODE:=902;
2858
2859 --
2860 -- do check :
2861 -- does Node with ps_node_id=p_ps_node_id exist ? --
2862 --
2863 BEGIN
2864 v_node_Exist:=FALSE;
2865 SELECT model_ref_expl_id,parent_expl_node_id,ps_node_type,virtual_flag,expl_node_type
2866 INTO v_model_ref_expl_id,v_parent_expl_node_id,v_ps_node_type,v_virtual_flag,v_curr_expl_node_type
2867 FROM CZ_MODEL_REF_EXPLS
2868 WHERE ((component_id=p_ps_node_id AND referring_node_id IS NULL) OR
2869 referring_node_id=p_ps_node_id)
2870 AND model_id=p_model_id AND deleted_flag=NO_FLAG AND ROWNUM<2;
2871 v_node_Exist:=TRUE;
2872 EXCEPTION
2873 WHEN NO_DATA_FOUND THEN
2874 NULL;
2875 END;
2876
2877 --
2878 -- this is "Root Node" case --
2879 --
2880 IF p_ps_node_id=p_model_id THEN
2881 IF v_node_Exist=FALSE THEN
2882 --
2883 -- DEBUG ERROR CODE --
2884 --
2885 ERROR_CODE:=903;
2886
2887 --
2888 -- add root node
2889 --
2890 add_root_Model_record(p_ps_node_id,v_ps_node_type);
2891
2892 UPDATE CZ_PS_NODES
2893 SET component_id=p_model_id,
2894 minimum=p_minimum,
2895 maximum=p_maximum,
2896 instantiable_flag=MANDATORY_EXPL_TYPE
2897 WHERE devl_project_id=p_model_id AND
2898 parent_id is null AND deleted_flag='0';
2899
2900 --
2901 -- DEBUG ERROR CODE --
2902 --
2903 ERROR_CODE:=904;
2904
2905 END IF;
2906 GOTO FINAL_SECTION;
2907 END IF;
2908
2909 --
2910 -- case when we have Min=1 and Max=1 for not Connectors/References nodes
2911 -- and this node with ps_node_id=p_ps_node_id does not
2912 -- exist in CZ_MODEL_REF_EXPLS table
2913 -- and no Numeric Rules which contribute to Min/Max are specified
2914 -- in this case we just need to exit from program
2915 --
2916 IF (v_expl_node_type=MANDATORY_EXPL_TYPE) AND (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE))
2917 AND v_node_Exist=FALSE THEN
2918 GOTO FINAL_SECTION;
2919 END IF;
2920
2921 IF v_expl_node_type IN(OPTIONAL_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
2922 p_out_virtual_flag:=NO_FLAG;
2926
2923 ELSE
2924 p_out_virtual_flag:=YES_FLAG;
2925 END IF;
2927 UPDATE CZ_PS_NODES
2928 SET virtual_flag=p_out_virtual_flag,
2929 minimum=p_minimum,
2930 maximum=p_maximum
2931 WHERE ps_node_id=p_ps_node_id;
2932
2933 IF SQL%ROWCOUNT>0 THEN
2934
2935 IF (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE)) THEN
2936 UPDATE CZ_MODEL_REF_EXPLS
2937 SET virtual_flag=p_out_virtual_flag,
2938 expl_node_type=v_expl_node_type
2939 WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG;
2940 ELSE
2941 UPDATE CZ_MODEL_REF_EXPLS
2942 SET virtual_flag=p_out_virtual_flag,
2943 expl_node_type=v_expl_node_type
2944 WHERE referring_node_id=p_ps_node_id AND deleted_flag=NO_FLAG;
2945 END IF;
2946
2947 END IF;
2948
2949 IF v_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND v_node_Exist=FALSE THEN
2950 --
2951 -- find "Models Chain" that contains
2952 -- the given model ( CZ_DEVL_PROJECTS.devl_project_id=p_model_id )
2953 -- t_chain array will store Model Ids of this chain
2954 --
2955 t_chain.DELETE;t_projectCache.DELETE;
2956 populate_chain(p_model_id);
2957
2958 add_Reference(p_ps_node_id,p_reference_id,p_model_id,
2959 p_out_virtual_flag,p_out_err,v_ps_node_type,v_expl_node_type);
2960
2961 GOTO FINAL_SECTION;
2962 END IF;
2963
2964 --
2965 -- this means UPDATE from (n,m) to (1,1)
2966 --
2967 IF p_out_virtual_flag=YES_FLAG AND
2968 (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE)) AND v_node_Exist THEN
2969
2970 FOR x IN (SELECT model_ref_expl_id,parent_expl_node_id,model_id FROM CZ_MODEL_REF_EXPLS a
2971 WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
2972 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
2973 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
2974 LOOP
2975 BEGIN
2976 IF x.model_id=p_model_id THEN
2977 v_del_ref_id:=x.model_ref_expl_id;
2978 END IF;
2979
2980 --
2981 -- DEBUG ERROR CODE --
2982 --
2983 ERROR_CODE:=905;
2984
2985 FOR y IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2986 START WITH model_ref_expl_id=x.model_ref_expl_id AND deleted_flag=NO_FLAG
2987 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
2988 PRIOR deleted_flag=NO_FLAG)
2989 LOOP
2990 UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-1
2991 WHERE model_ref_expl_id=y.model_ref_expl_id;
2992 END LOOP;
2993
2994 --
2995 -- DEBUG ERROR CODE --
2996 --
2997 ERROR_CODE:=906;
2998
2999 UPDATE CZ_MODEL_REF_EXPLS SET parent_expl_node_id=x.parent_expl_node_id
3000 WHERE parent_expl_node_id=x.model_ref_expl_id
3001 AND model_id=x.model_id AND deleted_flag=NO_FLAG;
3002
3003 EXCEPTION
3004 WHEN NO_DATA_FOUND THEN
3005 NULL;
3006 END;
3007 END LOOP;
3008
3009 --
3010 -- DEBUG ERROR CODE --
3011 --
3012 ERROR_CODE:=907;
3013
3014 delete_Node_(p_ps_node_id,COMPONENT_TYPE, '1');
3015
3016 --
3017 -- DEBUG ERROR CODE --
3018 --
3019 ERROR_CODE:=908;
3020
3021 set_Expls(p_model_id,p_ps_node_id,MINUS_MODE,v_del_ref_id);
3022
3023 --
3024 -- DEBUG ERROR CODE --
3025 --
3026 ERROR_CODE:=909;
3027
3028 refresh_UI_Expl_Ids(p_ps_node_id => p_ps_node_id,
3029 p_component_id => v_component_id,
3030 p_model_id => p_model_id,
3031 p_old_expl_id => v_model_ref_expl_id,
3032 p_new_expl_id => v_parent_expl_node_id);
3033
3034 GOTO FINAL_SECTION;
3035 END IF;
3036
3037 --
3038 -- this means UPDATE from (1,1) to (n,m)
3039 --
3040 IF p_out_virtual_flag=NO_FLAG AND (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE))
3041 AND v_node_Exist=FALSE THEN
3042
3043 --
3044 -- find nearest non-virtual node above the target node --
3045 --
3046 get_Node_Up(p_ps_node_id,p_model_id,v_up_id,
3047 v_up_expl_id,v_up_level);
3048
3049 v_expl_id:=allocate_Expl_Id;
3050 --
3051 -- DEBUG ERROR CODE --
3052 --
3053 ERROR_CODE:=910;
3054
3055 INSERT INTO CZ_MODEL_REF_EXPLS
3056 (model_ref_expl_id,
3057 parent_expl_node_id,
3058 referring_node_id,
3059 model_id,
3060 component_id,
3061 ps_node_type,
3062 virtual_flag,
3063 node_depth,
3064 expl_node_type,
3065 deleted_flag)
3066 VALUES
3067 (v_expl_id,
3068 v_up_expl_id,
3069 NULL,
3070 p_model_id,
3074 v_up_level+1,
3071 p_ps_node_id,
3072 v_ps_node_type,
3073 p_out_virtual_flag,
3075 v_expl_node_type,
3076 NO_FLAG);
3077
3078 --
3079 -- DEBUG ERROR CODE --
3080 --
3081 ERROR_CODE:=911;
3082
3083 --
3084 -- reset childs nodes
3085 --
3086 t_childs.DELETE;
3087
3088 SELECT ps_node_id BULK COLLECT INTO t_childs FROM CZ_PS_NODES
3089 WHERE devl_project_id=p_model_id AND ps_node_id<>p_ps_node_id AND
3090 (
3091 (ps_node_type in(COMPONENT_TYPE,PRODUCT_TYPE) AND ps_node_id IN ---- fix for bug #3161931
3092 (SELECT component_id FROM CZ_MODEL_REF_EXPLS
3093 WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND parent_expl_node_id=v_up_expl_id AND
3094 component_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3095 START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
3096 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3097 )
3098 )
3099 OR
3100 (ps_node_type in(REFERENCE_TYPE,CONNECTOR_TYPE) AND ps_node_id IN ---- fix for bug #3161931
3101 (SELECT referring_node_id FROM CZ_MODEL_REF_EXPLS
3102 WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND parent_expl_node_id=v_up_expl_id AND
3103 referring_node_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3104 START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
3105 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3106 )
3107 )
3108 ) AND deleted_flag=NO_FLAG;
3109
3110 --
3111 -- DEBUG ERROR CODE --
3112 --
3113 ERROR_CODE:=912;
3114
3115 IF t_childs.COUNT>0 THEN
3116 FOR t IN t_childs.FIRST..t_childs.LAST
3117 LOOP
3118 t_child_nodes.DELETE;
3119 v_ps_node_id:= t_childs(t);
3120 UPDATE CZ_MODEL_REF_EXPLS
3121 SET parent_expl_node_id=v_expl_id
3122 WHERE parent_expl_node_id=v_up_expl_id
3123 AND model_id=p_model_id AND
3124 ((ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE,BOM_MODEL_TYPE) AND component_id=v_ps_node_id)
3125 OR (ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND referring_node_id=v_ps_node_id))
3126 AND deleted_flag=NO_FLAG
3127 RETURNING model_ref_expl_id BULK COLLECT INTO t_child_nodes ;
3128
3129 IF t_child_nodes.COUNT>0 THEN
3130
3131 --
3132 -- DEBUG ERROR CODE --
3133 --
3134 ERROR_CODE:=913;
3135
3136 FORALL h IN t_child_nodes.FIRST..t_child_nodes.LAST
3137 UPDATE CZ_MODEL_REF_EXPLS
3138 SET node_depth=node_depth+1
3139 WHERE model_ref_expl_id IN
3140 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3141 START WITH model_ref_expl_id=t_child_nodes(h) AND deleted_flag=NO_FLAG
3142 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3143 AND PRIOR deleted_flag=NO_FLAG);
3144
3145 --
3146 -- DEBUG ERROR CODE --
3147 --
3148 ERROR_CODE:=914;
3149
3150 END IF;
3151 END LOOP; -- end of loop for t in t_childs.First..t_childs.Last --
3152 END IF; -- end of t_childs.Count>0 case --
3153
3154 --
3155 -- DEBUG ERROR CODE --
3156 --
3157 ERROR_CODE:=915;
3158
3159 --
3160 -- find "Models Chain" that contains
3161 -- the given model ( CZ_DEVL_PROJECTS.devl_project_id=v_ref_model_id )
3162 -- t_chain array will store Model Ids of this chain
3163 --
3164 t_chain.DELETE;t_projectCache.DELETE;
3165 populate_chain(p_model_id);
3166
3167 --
3168 -- DEBUG ERROR CODE --
3169 --
3170 ERROR_CODE:=916;
3171
3172 populate_tree
3173 (v_up_expl_id,v_expl_id,p_ps_node_id,v_ps_node_type,
3174 v_expl_node_type,p_model_id,t_childs);
3175
3176 --
3177 -- DEBUG ERROR CODE --
3178 --
3179 ERROR_CODE:=917;
3180
3181 set_Expls(p_model_id,p_ps_node_id, PLUS_MODE);
3182
3183 SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3184 FROM CZ_MODEL_REF_EXPLS
3185 WHERE model_id=p_model_id AND component_id=v_component_id AND
3186 deleted_flag='0';
3187
3188 refresh_UI_Expl_Ids(p_ps_node_id => p_ps_node_id,
3189 p_component_id => v_component_id,
3190 p_model_id => p_model_id,
3191 p_old_expl_id => v_comp_expl_id,
3192 p_new_expl_id => v_expl_id);
3193
3194 END IF;
3195
3196 EXCEPTION
3197 WHEN OTHERS THEN
3198 p_out_err:=m_RUN_ID;
3199 LOG_REPORT('check_Node','Error : ps_node_id='||
3200 TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > : '||SQLERRM);
3204 <<FINAL_SECTION>>
3201 END;
3202
3203
3205 --
3206 -- fix child_model_expl_id's if they are wrong
3207 -- ( recursion is used )
3208 -- this code was commented out because of
3209 -- perfomance problem
3210 --
3211 --update_child_nodes(p_model_id);
3212
3213 --
3214 -- fix node_depth's if they are wrong
3215 -- ( recursion is used )
3216 --
3217 update_Node_Depth(p_model_id);
3218
3219 --
3220 -- delete duplicates
3221 -- like
3222 -- Reference-n
3223 -- |---------Reference-n
3224 --
3225 --delete_duplicates(p_model_id);
3226
3227 populate_COMPONENT_ID(p_model_id);
3228
3229 NULL;
3230 END check_Node;
3231
3232 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3233 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3234
3235 PROCEDURE delete_Node
3236 (p_ps_node_id IN INTEGER,
3237 p_ps_node_type IN INTEGER,
3238 p_out_err OUT NOCOPY INTEGER,
3239 p_del_logically IN VARCHAR2 -- DEFAULT '1'
3240 ) IS
3241
3242 v_component_id CZ_PS_NODES.component_id%TYPE;
3243 v_virtual_flag CZ_PS_NODES.virtual_flag%TYPE;
3244 v_ps_node_type CZ_PS_NODES.ps_node_type%TYPE;
3245
3246 BEGIN
3247 Initialize;
3248 p_out_err:=0;
3249
3250 IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
3251
3252 FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3253 WHERE referring_node_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
3254 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3255 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3256 LOOP
3257 --
3258 -- DEBUG ERROR CODE --
3259 --
3260 ERROR_CODE:=1001;
3261
3262 delete_it(i.model_ref_expl_id, YES_FLAG);
3263
3264 --
3265 -- DEBUG ERROR CODE --
3266 --
3267 ERROR_CODE:=1002;
3268
3269 END LOOP;
3270 ELSE
3271 SELECT component_id,NVL(virtual_flag,'1') INTO v_component_id,v_virtual_flag FROM CZ_PS_NODES
3272 WHERE ps_node_id=p_ps_node_id;
3273
3274 IF v_virtual_flag='0' THEN
3275 FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3276 WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
3277 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3278 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3279 LOOP
3280 --
3281 -- DEBUG ERROR CODE --
3282 --
3283 ERROR_CODE:=1003;
3284
3285 delete_it(i.model_ref_expl_id, YES_FLAG);
3286
3287 --
3288 -- DEBUG ERROR CODE --
3289 --
3290 ERROR_CODE:=1004;
3291
3292 END LOOP;
3293
3294 ELSE
3295
3296 FOR i IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3297 WHERE parent_expl_node_id IN
3298 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3299 WHERE model_id=a.model_id AND component_id=v_component_id AND deleted_flag='0')
3300 AND (component_id IN
3301 (SELECT ps_node_id FROM CZ_PS_NODES
3302 START WITH ps_node_id=p_ps_node_id
3303 CONNECT BY PRIOR ps_node_id=parent_id)
3304 OR
3305 referring_node_id IN
3306 (SELECT ps_node_id FROM cz_ps_nodes
3307 START WITH ps_node_id=p_ps_node_id
3308 CONNECT BY PRIOR ps_node_id=parent_id)
3309 )
3310 )
3311 LOOP
3312 --
3313 -- DEBUG ERROR CODE --
3314 --
3315 ERROR_CODE:=1005;
3316
3317 delete_it(i.model_ref_expl_id, YES_FLAG);
3318
3319 --
3320 -- DEBUG ERROR CODE --
3321 --
3322 ERROR_CODE:=1006;
3323 END LOOP;
3324
3325 END IF;
3326
3327 END IF;
3328
3329 EXCEPTION
3330 WHEN OTHERS THEN
3331 p_out_err:=m_RUN_ID;
3332 LOG_REPORT('delete_Node',
3333 'Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > : '||SQLERRM);
3334 END delete_Node;
3335
3336 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3337 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3338
3339 PROCEDURE update_levels
3340 (p_expl_id IN INTEGER,
3341 p_level IN INTEGER,
3342 p_tree_level IN INTEGER) IS
3343
3344 BEGIN
3345 FOR i IN(SELECT model_ref_expl_id,parent_expl_node_id FROM CZ_MODEL_REF_EXPLS
3346 WHERE parent_expl_node_id=p_expl_id AND deleted_flag=NO_FLAG)
3347 LOOP
3348 UPDATE CZ_MODEL_REF_EXPLS SET node_depth=p_level+p_tree_level
3352 -- DEBUG ERROR CODE --
3349 WHERE model_ref_expl_id=i.model_ref_expl_id;
3350
3351 --
3353 --
3354 ERROR_CODE:=1100;
3355
3356 update_levels(i.model_ref_expl_id,p_level+p_tree_level,p_tree_level+1);
3357
3358 --
3359 -- DEBUG ERROR CODE --
3360 --
3361 ERROR_CODE:=1101;
3362
3363 END LOOP;
3364 END;
3365
3366 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3367 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3368
3369 --
3370 -- this is general recursive procedure to reconstruct Parent/Childs
3371 --
3372 PROCEDURE reConstruct
3373 (p_project_id IN INTEGER,
3374 p_expl_root_id IN INTEGER,
3375 p_from_expl_id IN INTEGER,
3376 p_up_expl_id IN INTEGER,
3377 p_model_ref_expl IN IntArray,
3378 p_levels IN IntArray) IS
3379
3380 t_levels IntArray;
3381 t_levels_ IntArray;
3382 t_refs IntArray;
3383 t_models IntArray;
3384 t_model_ref_expl IntArray;
3385 t_model_ref_expl_ IntArray;
3386 v_expl_root_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3387 v_from_up_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3388 v_up_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3389 v_from_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3390 v_up_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
3391 STOP_IT EXCEPTION;
3392
3393 BEGIN
3394
3395 --
3396 -- DEBUG ERROR CODE --
3397 --
3398 ERROR_CODE:=1200;
3399
3400 --
3401 -- find nodes of parent Models which corresponds with
3402 -- a moved node in source Model
3403 --
3404 SELECT model_ref_expl_id,model_id
3405 BULK COLLECT INTO t_refs,t_models
3406 FROM CZ_MODEL_REF_EXPLS a
3407 WHERE child_model_expl_id=p_expl_root_id
3408 AND ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG AND
3409 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3410 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3411
3412 --
3413 -- DEBUG ERROR CODE --
3414 --
3415 ERROR_CODE:=1201;
3416
3417 IF t_refs.COUNT=0 THEN
3418 RAISE STOP_IT;
3419 END IF;
3420
3421 FOR i IN t_refs.FIRST..t_refs.LAST
3422 LOOP
3423 --
3424 -- find a root node of subtree in the current parent Model
3425 -- associated with a child referenced Model
3426 --
3427 v_expl_root_id:=t_refs(i);
3428
3429 --
3430 -- DEBUG ERROR CODE --
3431 --
3432 ERROR_CODE:=1202;
3433
3434 SELECT model_ref_expl_id INTO v_from_up_expl_id FROM CZ_MODEL_REF_EXPLS a
3435 WHERE child_model_expl_id=p_from_expl_id AND model_ref_expl_id
3436 IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3437 START WITH model_ref_expl_id=t_refs(i) AND deleted_flag=NO_FLAG
3438 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
3439 deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3440 AND
3441 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3442 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3443
3444 --
3445 -- DEBUG ERROR CODE --
3446 --
3447 ERROR_CODE:=1203;
3448
3449 SELECT model_ref_expl_id,node_depth
3450 INTO v_up_expl_id,v_up_level FROM CZ_MODEL_REF_EXPLS a
3451 WHERE child_model_expl_id=p_up_expl_id AND model_ref_expl_id
3452 IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3453 START WITH model_ref_expl_id=t_refs(i) AND deleted_flag=NO_FLAG
3454 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3455 AND
3456 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3457 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3458
3459 --
3460 -- DEBUG ERROR CODE --
3461 --
3462 ERROR_CODE:=1204;
3463
3464 FOR k IN p_model_ref_expl.FIRST..p_model_ref_expl.LAST
3465 LOOP
3466 UPDATE CZ_MODEL_REF_EXPLS
3467 SET parent_expl_node_id=v_up_expl_id
3468 WHERE model_ref_expl_id
3469 IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3470 WHERE (parent_expl_node_id=v_from_up_expl_id OR model_ref_expl_id=v_from_up_expl_id)
3471 AND child_model_expl_id=p_model_ref_expl(k)
3472 AND deleted_flag=NO_FLAG);
3473
3474 END LOOP;
3475
3476 --
3477 -- DEBUG ERROR CODE --
3478 --
3479 ERROR_CODE:=1205;
3480
3481 t_old_expl_ids(t_old_expl_ids.COUNT+1):=v_from_up_expl_id;
3482 t_new_expl_ids(t_new_expl_ids.COUNT+1):=v_up_expl_id;
3483
3484 FOR k IN p_model_ref_expl.FIRST..p_model_ref_expl.LAST
3485 LOOP
3486
3487 --
3488 -- DEBUG ERROR CODE --
3489 --
3490 ERROR_CODE:=1206;
3491
3492 --
3493 -- recreate array of child_model_expl_id-s --
3494 --
3495 SELECT model_ref_expl_id,node_depth
3499 AND child_model_expl_id=p_model_ref_expl(k)
3496 BULK COLLECT INTO t_model_ref_expl_,t_levels_
3497 FROM CZ_MODEL_REF_EXPLS
3498 WHERE parent_expl_node_id=v_up_expl_id
3500 AND deleted_flag=NO_FLAG;
3501
3502 --
3503 -- DEBUG ERROR CODE --
3504 --
3505 ERROR_CODE:=1207;
3506
3507 END LOOP;
3508
3509
3510 IF t_model_ref_expl_.COUNT>0 THEN
3511 --
3512 -- DEBUG ERROR CODE --
3513 --
3514 ERROR_CODE:=1208;
3515
3516 update_levels(v_up_expl_id,v_up_level,1);
3517 reConstruct(p_project_id =>p_project_id,
3518 p_expl_root_id =>v_expl_root_id,
3519 p_from_expl_id =>v_from_up_expl_id,
3520 p_up_expl_id =>v_up_expl_id,
3521 p_model_ref_expl=>t_model_ref_expl_,
3522 p_levels =>t_levels_ );
3523
3524 --
3525 -- DEBUG ERROR CODE --
3526 --
3527 ERROR_CODE:=1209;
3528
3529 END IF;
3530 END LOOP;
3531
3532 EXCEPTION
3533 WHEN STOP_IT THEN
3534 NULL;
3535 WHEN OTHERS THEN
3536 LOG_REPORT('reConstruct','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3537 END reConstruct;
3538
3539 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3540 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3541
3542 PROCEDURE move_Node
3543 (p_from_ps_node_id IN INTEGER,
3544 p_to_ps_node_id IN INTEGER,
3545 p_project_id IN INTEGER,
3546 p_out_err OUT NOCOPY INTEGER) IS
3547
3548 t_levels IntArray;
3549 t_refs IntArray;
3550 t_models IntArray;
3551 t_model_ref_expl IntArray;
3552 v_up_id INTEGER;
3553 v_down_id INTEGER;
3554 v_up_expl_id INTEGER;
3555 v_expr_node_id INTEGER;
3556 v_down_expl_id INTEGER;
3557 v_level INTEGER;
3558 v_up_level INTEGER;
3559 v_from_up_id INTEGER;
3560 v_from_up_expl_id INTEGER;
3561 v_from_up_level INTEGER;
3562 v_down_level INTEGER;
3563 v_delta_level INTEGER;
3564 v_expl_root_id INTEGER;
3565 var_subroot_id INTEGER;
3566 var_subroot_level INTEGER;
3567 v_temp INTEGER;
3568 err INTEGER;
3569 v_ps_node_type CZ_PS_NODES.ps_node_type%TYPE;
3570 v_virtual_flag CZ_PS_NODES.virtual_flag%TYPE;
3571
3572 v_ref_up_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3573 v_ref_up_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
3574 v_contains_non_virt BOOLEAN:=FALSE;
3575 v_circularity_exists BOOLEAN:=FALSE;
3576 v_comp_expl_id NUMBER;
3577 v_model_ref_expl_id NUMBER;
3578 v_component_id NUMBER;
3579 v_parent_id NUMBER;
3580 v_ndebug NUMBER;
3581
3582 BEGIN
3583
3584 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3585 v_ndebug := 0;
3586 cz_utils.log_report('CZ_REFS', 'move_Node', v_ndebug,
3587 'Starting CZ_REFS.move_Node for model node with ps_node_id='||TO_CHAR(p_from_ps_node_id)||
3588 ' current time : '||TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'),
3589 fnd_log.LEVEL_PROCEDURE);
3590 cz_utils.log_report('CZ_REFS', 'move_Node', v_ndebug,
3591 'Parameters : '||
3592 'p_from_ps_node_id = '||TO_CHAR(p_from_ps_node_id)||
3593 'p_to_ps_node_id = '||TO_CHAR(p_to_ps_node_id)||
3594 'p_project_id = '||TO_CHAR(p_project_id)
3595 ,fnd_log.LEVEL_PROCEDURE);
3596 END IF;
3597
3598 BEGIN -- main try/catch block --
3599 Initialize;
3600 p_out_err:=0;
3601 t_old_expl_ids.DELETE;
3602 t_new_expl_ids.DELETE;
3603
3604 --
3605 -- DEBUG ERROR CODE --
3606 --
3607 ERROR_CODE:=1300;
3608
3609 SELECT ps_node_type,NVL(virtual_flag,YES_FLAG),parent_id,component_id
3610 INTO v_ps_node_type,v_virtual_flag,v_parent_id,v_component_id
3611 FROM CZ_PS_NODES
3612 WHERE ps_node_id=p_from_ps_node_id;
3613
3614 LOG_REPORT('*','p_from_ps_node_id='||to_char(p_from_ps_node_id)||
3615 ' v_parent_id='||to_char(v_parent_id));
3616
3617 --
3618 -- DEBUG ERROR CODE --
3619 --
3620 ERROR_CODE:=1301;
3621
3622 --
3623 -- find nearest non-virtual node above the target node --
3624 --
3625 get_Node_Up(p_to_ps_node_id,p_project_id,v_up_id,
3626 v_up_expl_id,v_up_level);
3627
3628
3629 --
3630 -- DEBUG ERROR CODE --
3631 --
3632 ERROR_CODE:=1302;
3633
3634 IF v_ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) THEN
3635
3636 v_from_up_id:=p_from_ps_node_id;
3637 SELECT model_ref_expl_id,node_depth
3638 INTO v_from_up_expl_id,v_from_up_level
3639 FROM CZ_MODEL_REF_EXPLS
3640 WHERE model_id=p_project_id AND referring_node_id=p_from_ps_node_id
3641 AND deleted_flag=NO_FLAG;
3642
3643 BEGIN
3644 SELECT model_ref_expl_id,node_depth
3648 AND model_id=p_project_id AND deleted_flag=NO_FLAG;
3645 INTO v_ref_up_expl_id,v_ref_up_level
3646 FROM CZ_MODEL_REF_EXPLS
3647 WHERE component_id=v_up_id
3649
3650 UPDATE CZ_MODEL_REF_EXPLS
3651 SET parent_expl_node_id=v_ref_up_expl_id
3652 WHERE model_ref_expl_id=v_from_up_expl_id
3653 AND deleted_flag=NO_FLAG;
3654
3655 UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-v_from_up_level+v_ref_up_level+1
3656 WHERE model_ref_expl_id IN
3657 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3658 START WITH model_ref_expl_id=v_from_up_expl_id AND deleted_flag=NO_FLAG
3659 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3660 AND PRIOR deleted_flag=NO_FLAG);
3661 EXCEPTION
3662 WHEN OTHERS THEN
3663 p_out_err:=m_RUN_ID;
3664 LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3665 GOTO FINAL_SECTION;
3666 END;
3667
3668 t_chain.DELETE;t_projectCache.DELETE;
3669 populate_chain(p_project_id);
3670
3671 IF t_chain.COUNT>0 THEN
3672 FOR i IN t_chain.FIRST..t_chain.LAST
3673 LOOP
3674 FOR k IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS WHERE
3675 model_id=t_chain(i).model_id AND ps_node_type IN(REFERENCE_TYPE,264)
3676 AND component_id=p_project_id AND deleted_flag=NO_FLAG)
3677 LOOP
3678 BEGIN
3679 SELECT model_ref_expl_id,node_depth
3680 INTO v_ref_up_expl_id,v_ref_up_level
3681 FROM CZ_MODEL_REF_EXPLS
3682 WHERE component_id=v_up_id
3683 AND model_ref_expl_id IN
3684 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3685 START WITH model_ref_expl_id=k.model_ref_expl_id AND deleted_flag=NO_FLAG
3686 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3687 AND PRIOR deleted_flag=NO_FLAG);
3688
3689
3690 UPDATE CZ_MODEL_REF_EXPLS
3691 SET parent_expl_node_id=v_ref_up_expl_id
3692 WHERE model_ref_expl_id IN
3693 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3694 WHERE referring_node_id=p_from_ps_node_id
3695 AND model_ref_expl_id IN
3696 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3697 START WITH model_ref_expl_id=k.model_ref_expl_id AND deleted_flag=NO_FLAG
3698 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3699 AND PRIOR deleted_flag=NO_FLAG) AND
3700 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3701 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3702 RETURNING model_ref_expl_id,node_depth INTO var_subroot_id,var_subroot_level ;
3703
3704 UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-var_subroot_level+v_ref_up_level+1
3705 WHERE model_ref_expl_id IN
3706 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3707 START WITH model_ref_expl_id=var_subroot_id AND deleted_flag=NO_FLAG
3708 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
3709 PRIOR deleted_flag=NO_FLAG);
3710
3711 EXCEPTION
3712 WHEN OTHERS THEN
3713 p_out_err:=m_RUN_ID;
3714 LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3715 GOTO FINAL_SECTION;
3716 END;
3717 END LOOP;
3718 END LOOP;
3719 END IF;
3720
3721 GOTO FINAL_SECTION;
3722
3723 ELSE
3724
3725 IF v_virtual_flag='1' THEN
3726
3727 get_from_Node_Up(p_from_ps_node_id,p_project_id,v_from_up_id,
3728 v_from_up_expl_id,v_from_up_level);
3729
3730 --
3731 -- DEBUG ERROR CODE --
3732 --
3733 ERROR_CODE:=1303;
3734
3735 SELECT model_ref_expl_id
3736 BULK COLLECT INTO t_model_ref_expl
3737 FROM CZ_MODEL_REF_EXPLS
3738 WHERE parent_expl_node_id=v_from_up_expl_id AND model_id=p_project_id AND
3739 component_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3740 START WITH ps_node_id=p_from_ps_node_id AND deleted_flag=NO_FLAG
3741 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG
3742 AND PRIOR deleted_flag=NO_FLAG);
3743
3744 --
3745 -- DEBUG ERROR CODE --
3746 --
3747 ERROR_CODE:=1304;
3748
3749 ELSE
3750
3751 --
3752 -- DEBUG ERROR CODE --
3753 --
3754 ERROR_CODE:=1305;
3755
3756 v_from_up_id:=p_from_ps_node_id;
3757 SELECT model_ref_expl_id,node_depth
3758 INTO v_from_up_expl_id,v_from_up_level
3762 deleted_flag=NO_FLAG;
3759 FROM CZ_MODEL_REF_EXPLS
3760 WHERE model_id=p_project_id AND component_id=v_from_up_id
3761 AND ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND child_model_expl_id IS NULL AND
3763 t_model_ref_expl(1):=v_from_up_expl_id;
3764
3765 --
3766 -- DEBUG ERROR CODE --
3767 --
3768 ERROR_CODE:=1306;
3769
3770 END IF;
3771 END IF;
3772
3773 IF t_model_ref_expl.COUNT>0 THEN
3774
3775 FOR i IN t_model_ref_expl.FIRST..t_model_ref_expl.LAST
3776 LOOP
3777
3778 --
3779 -- DEBUG ERROR CODE --
3780 --
3781 ERROR_CODE:=1307;
3782
3783 UPDATE CZ_MODEL_REF_EXPLS SET parent_expl_node_id=v_up_expl_id
3784 WHERE model_ref_expl_id=t_model_ref_expl(i)
3785 AND model_id=p_project_id;
3786
3787 --
3788 -- DEBUG ERROR CODE --
3789 --
3790 ERROR_CODE:=1308;
3791
3792 UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-v_from_up_level+v_up_level+1
3793 WHERE model_ref_expl_id IN
3794 (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3795 START WITH model_ref_expl_id=t_model_ref_expl(i) AND deleted_flag=NO_FLAG
3796 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
3797 PRIOR deleted_flag=NO_FLAG);
3798
3799 --
3800 -- DEBUG ERROR CODE --
3801 --
3802 ERROR_CODE:=1309;
3803
3804 END LOOP;
3805
3806 END IF;
3807
3808 --
3809 -- DEBUG ERROR CODE --
3810 --
3811 ERROR_CODE:=1310;
3812
3813 SELECT model_ref_expl_id INTO v_expl_root_id
3814 FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id AND component_id=p_project_id
3815 AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
3816
3817 --
3818 -- DEBUG ERROR CODE --
3819 --
3820 ERROR_CODE:=1311;
3821
3822 IF t_model_ref_expl.COUNT>0 THEN
3823 FOR t IN t_model_ref_expl.FIRST..t_model_ref_expl.LAST
3824 LOOP
3825
3826 --
3827 -- DEBUG ERROR CODE --
3828 --
3829 ERROR_CODE:=1312;
3830
3831 SELECT node_depth INTO v_temp FROM CZ_MODEL_REF_EXPLS
3832 WHERE model_id=p_project_id AND model_ref_expl_id=t_model_ref_expl(t);
3833 t_levels(t_levels.COUNT+1):=v_temp;
3834
3835 --
3836 -- DEBUG ERROR CODE --
3837 --
3838 ERROR_CODE:=1313;
3839
3840 END LOOP;
3841 END IF;
3842
3843 --
3844 -- DEBUG ERROR CODE --
3845 --
3846 ERROR_CODE:=1314;
3847
3848 t_old_expl_ids(t_old_expl_ids.COUNT+1):=v_from_up_expl_id;
3849
3850 t_new_expl_ids(t_new_expl_ids.COUNT+1):=v_up_expl_id;
3851
3852 reConstruct(p_project_id =>p_project_id,
3853 p_expl_root_id =>v_expl_root_id,
3854 p_from_expl_id =>v_from_up_expl_id,
3855 p_up_expl_id =>v_up_expl_id,
3856 p_model_ref_expl=>t_model_ref_expl,
3857 p_levels =>t_levels);
3858
3859 IF v_virtual_flag=YES_FLAG THEN
3860 update_Rules(p_from_ps_node_id);
3861
3862 SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3863 FROM CZ_MODEL_REF_EXPLS
3864 WHERE model_id=p_project_id AND component_id=v_component_id AND
3865 deleted_flag='0';
3866
3867 SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3868 FROM CZ_MODEL_REF_EXPLS
3869 WHERE model_id=p_project_id AND component_id=
3870 (SELECT component_id FROM CZ_PS_NODES WHERE ps_node_id=p_to_ps_node_id) AND
3871 deleted_flag='0';
3872
3873 refresh_UI_Expl_Ids(p_ps_node_id => p_from_ps_node_id,
3874 p_component_id => v_component_id,
3875 p_model_id => p_project_id,
3876 p_old_expl_id => v_model_ref_expl_id,
3877 p_new_expl_id => v_comp_expl_id);
3878
3879 END IF;
3880
3881 --
3882 -- DEBUG ERROR CODE --
3883 --
3884 ERROR_CODE:=1315;
3885
3886 EXCEPTION
3887 WHEN OTHERS THEN
3888 p_out_err:=m_RUN_ID;
3889 LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3890 END;
3891
3892 <<FINAL_SECTION>>
3893 --
3894 -- fix child_model_expl_id's if they are wrong
3895 -- ( recursion is used )
3896 -- this code was commented out because of
3897 -- perfomance problem
3898 --
3899 update_child_nodes(p_project_id);
3900
3901 --
3902 -- fix node_depth's if they are wrong
3903 -- ( recursion is used )
3904 --
3905 update_Node_Depth(p_project_id);
3906
3907 --
3908 -- delete duplicates
3909 -- like
3910 -- Reference-n
3911 -- |---------Reference-n
3912 --
3913 -- delete_duplicates(p_project_id);
3914
3915 populate_COMPONENT_ID(p_project_id);
3916
3917 END move_Node;
3918
3922 PROCEDURE CHECK_REF_REQUEST
3919 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3920 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3921
3923 (p_refroot_model_id IN INTEGER,
3924 p_ref_parent_node_id IN INTEGER,
3925 p_ref_target_model_id IN INTEGER,
3926 p_out_status_code OUT NOCOPY INTEGER) IS
3927
3928 v_BOM_node1 CZ_PS_NODES.ps_node_id%TYPE;
3929 v_BOM_node2 CZ_PS_NODES.ps_node_id%TYPE;
3930 v_instanciable INTEGER;
3931
3932 BEGIN
3933 p_out_status_code:=0;
3934
3935 --
3936 -- DEBUG ERROR CODE --
3937 --
3938 ERROR_CODE:=1400;
3939
3940 BEGIN
3941 SELECT ps_node_id INTO v_BOM_node1 FROM CZ_PS_NODES
3942 WHERE devl_project_id=p_refroot_model_id AND ps_node_type=BOM_MODEL_TYPE
3943 AND deleted_flag=NO_FLAG AND rownum<2;
3944 EXCEPTION
3945 WHEN NO_DATA_FOUND THEN
3946 v_BOM_node1:=containsBOM(p_refroot_model_id,v_instanciable);
3947 END;
3948
3949 --
3950 -- DEBUG ERROR CODE --
3951 --
3952 ERROR_CODE:=1401;
3953
3954 v_BOM_node2:=containsBOM(p_ref_target_model_id,v_instanciable);
3955
3956 --
3957 -- DEBUG ERROR CODE --
3958 --
3959 ERROR_CODE:=1402;
3960
3961 IF v_BOM_node1>0 AND v_BOM_node2>0 THEN
3962 IF v_instanciable=1 THEN
3963 p_out_status_code:=1;
3964 ELSE
3965 p_out_status_code:=2;
3966 END IF;
3967 RETURN;
3968 END IF;
3969
3970 IF v_BOM_node2>0 THEN
3971 -- check models that reference the current model ( p_refroot_model_id )
3972 FOR n IN(SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS a
3973 WHERE component_id=p_refroot_model_id AND ps_node_type=REFERENCE_TYPE AND
3974 deleted_flag='0' AND
3975 EXISTS(SELECT NULL FROM CZ_RP_ENTRIES WHERE object_id=a.model_id AND
3976 object_type='PRJ' AND deleted_flag='0'))
3977 LOOP
3978 IF containsBOM(n.model_id, v_instanciable) > 0 THEN
3979 p_out_status_code:=1;
3980 RETURN;
3981 END IF;
3982 END LOOP;
3983 END IF;
3984
3985 EXCEPTION
3986 WHEN NO_DATA_FOUND THEN
3987 NULL;
3988 WHEN TOO_MANY_ROWS THEN
3989 p_out_status_code:=1;
3990 LOG_REPORT('CHECK_REF_REQUEST',
3991 'Wrong PS Tree : there are more than one BOM model in PS Tree');
3992 WHEN OTHERS THEN
3993 LOG_REPORT('CHECK_REF_REQUEST','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3994 END CHECK_REF_REQUEST;
3995
3996 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3997 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3998
3999 PROCEDURE SolutionBasedModelcheck
4000 (p_model_id IN INTEGER,
4001 p_instanciable OUT NOCOPY INTEGER) IS
4002
4003 v_bom_node_id CZ_PS_NODES.ps_node_id%TYPE;
4004
4005 BEGIN
4006 p_instanciable:=0;
4007 v_bom_node_id:=containsBOM(p_model_id,p_instanciable);
4008 END SolutionBasedModelcheck;
4009
4010 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4011 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4012
4013 PROCEDURE delete_childs(t_arr IN IntArray) IS
4014 temp_arr IntArray;
4015 v_arr IntArray;
4016 BEGIN
4017 IF t_arr.COUNT>0 THEN
4018 FOR i IN t_arr.FIRST..t_arr.LAST
4019 LOOP
4020 temp_arr.DELETE;
4021
4022 --
4023 -- DEBUG ERROR CODE --
4024 --
4025 ERROR_CODE:=1500;
4026
4027 UPDATE CZ_MODEL_REF_EXPLS a SET deleted_flag=YES_FLAG
4028 WHERE child_model_expl_id=t_arr(i) AND
4029 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4030 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG)
4031 RETURNING model_ref_expl_id BULK COLLECT INTO temp_arr;
4032
4033 --
4034 -- DEBUG ERROR CODE --
4035 --
4036 ERROR_CODE:=1501;
4037
4038 IF temp_arr.COUNT>0 THEN
4039 FOR j IN temp_arr.FIRST..temp_arr.LAST
4040 LOOP
4041 v_arr(v_arr.COUNT+1):=temp_arr(j);
4042 END LOOP;
4043 END IF;
4044 END LOOP;
4045
4046 --
4047 -- DEBUG ERROR CODE --
4048 --
4049 ERROR_CODE:=1502;
4050
4051 delete_childs(v_arr);
4052 END IF;
4053 END;
4054
4055 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4056 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4057
4058 PROCEDURE delete_subtree(p_model_id IN INTEGER,p_model_ref_expl_id IN INTEGER) IS
4059 t_arr IntArray;
4060 BEGIN
4061 FOR j IN(SELECT model_ref_expl_id,ps_node_type,component_id FROM CZ_MODEL_REF_EXPLS
4062 WHERE model_id=p_model_id AND parent_expl_node_id=p_model_ref_expl_id AND deleted_flag=NO_FLAG)
4063 LOOP
4064 IF j.ps_node_type=CONNECTOR_TYPE THEN
4065 t_arr.DELETE;
4066
4067 --
4068 -- DEBUG ERROR CODE --
4069 --
4073 WHERE model_ref_expl_id IN(
4070 ERROR_CODE:=1600;
4071
4072 UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
4074 SELECT model_ref_expl_id FROM cz_model_ref_expls
4075 START WITH model_ref_expl_id=j.model_ref_expl_id AND deleted_flag=NO_FLAG
4076 CONNECT by PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
4077 AND PRIOR deleted_flag=NO_FLAG);
4078
4079 --
4080 -- DEBUG ERROR CODE --
4081 --
4082 ERROR_CODE:=1601;
4083 ELSE
4084 --
4085 -- DEBUG ERROR CODE --
4086 --
4087 ERROR_CODE:=1602;
4088
4089 delete_subtree(p_model_id,j.model_ref_expl_id);
4090
4091 --
4092 -- DEBUG ERROR CODE --
4093 --
4094 ERROR_CODE:=1603;
4095
4096 END IF;
4097 END LOOP;
4098 END;
4099
4100 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4101 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4102
4103
4104 PROCEDURE change_structure_(p_model_id IN INTEGER) IS
4105
4106 BEGIN
4107 FOR i IN(SELECT model_ref_expl_id,ps_node_type FROM CZ_MODEL_REF_EXPLS
4108 WHERE model_id=p_model_id AND component_id=p_model_id AND
4109 ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) AND deleted_flag=NO_FLAG)
4110 LOOP
4111 delete_subtree(p_model_id,i.model_ref_expl_id);
4112 END LOOP;
4113 END;
4114
4115 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4116 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4117
4118 PROCEDURE change_structure(p_model_id IN INTEGER) IS
4119
4120 BEGIN
4121 FOR i IN(SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS
4122 WHERE component_id=p_model_id AND
4123 ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) AND deleted_flag=NO_FLAG)
4124 LOOP
4125 change_structure_(i.model_id);
4126 END LOOP;
4127 END;
4128
4129 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4130 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4131
4132 PROCEDURE set_Trackable_Children_Flag(p_model_id IN NUMBER) IS
4133
4134 t_m_chain_tbl IntArray;
4135 t_trk_tbl IntArray;
4136 t_nontrk_tbl IntArray;
4137 v_ib_trackable CZ_PS_NODES.ib_trackable%TYPE;
4138
4139 BEGIN
4140
4141 SELECT DISTINCT model_id BULK COLLECT INTO t_m_chain_tbl FROM
4142 (SELECT DISTINCT component_id AS model_id
4143 FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_model_id AND ps_node_type=REFERENCE_TYPE
4144 AND deleted_flag=NO_FLAG
4145 UNION
4146 SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS a
4147 WHERE component_id=p_model_id AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4148 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4149 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG));
4150
4151 t_m_chain_tbl(t_m_chain_tbl.COUNT+1):=p_model_id;
4152
4153 FOR i IN t_m_chain_tbl.First..t_m_chain_tbl.Last
4154 LOOP
4155 --
4156 -- set has_trackable_children to '1' for those references in explosion tree of t_m_chain_tbl(i) model
4157 -- which points to models which have CZ_PS_NODES.ib_trackable='1'. So here we assume
4158 -- that CZ_PS_NODES.ib_trackable is populated correctly by Import
4159 --
4160 UPDATE cz_model_ref_expls
4161 SET has_trackable_children='1'
4162 WHERE model_id=t_m_chain_tbl(i) AND component_id=t_m_chain_tbl(i) AND deleted_flag=NO_FLAG AND
4163 EXISTS(SELECT NULL FROM CZ_MODEL_REF_EXPLS m WHERE model_id=t_m_chain_tbl(i) AND ps_node_type=REFERENCE_TYPE
4164 AND deleted_flag=NO_FLAG AND
4165 EXISTS(SELECT NULL FROM CZ_PS_NODES
4166 WHERE devl_project_id = m.component_id AND
4167 ib_trackable = '1' AND deleted_flag = NO_FLAG));
4168
4169 IF SQL%ROWCOUNT=0 THEN
4170 BEGIN
4171 v_ib_trackable:=NO_FLAG;
4172 SELECT '1' INTO v_ib_trackable FROM dual
4173 WHERE EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE devl_project_id=t_m_chain_tbl(i)
4174 AND deleted_flag=NO_FLAG AND ib_trackable='1');
4175 v_ib_trackable:='1';
4176 t_trk_tbl(t_trk_tbl.COUNT+1):=t_m_chain_tbl(i);
4177 EXCEPTION
4178 WHEN NO_DATA_FOUND THEN
4179 NULL;
4180 END;
4181 ELSE
4182 v_ib_trackable:='1';
4183 t_trk_tbl(t_trk_tbl.COUNT+1):=t_m_chain_tbl(i);
4184 END IF;
4185
4186 IF v_ib_trackable=NO_FLAG THEN
4187 t_nontrk_tbl(t_nontrk_tbl.COUNT+1):=t_m_chain_tbl(i);
4188 END IF;
4189
4190 UPDATE CZ_MODEL_REF_EXPLS SET has_trackable_children=v_ib_trackable
4191 WHERE model_id=t_m_chain_tbl(i) AND component_id=t_m_chain_tbl(i) AND deleted_flag=NO_FLAG;
4192
4193 END LOOP;
4194
4195 IF t_trk_tbl.COUNT>0 THEN
4196 FORALL i IN t_trk_tbl.First..t_trk_tbl.Last
4197 UPDATE CZ_MODEL_REF_EXPLS a SET has_trackable_children='1'
4201 END IF;
4198 WHERE component_id=t_trk_tbl(i) AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4199 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4200 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
4202
4203 IF t_nontrk_tbl.COUNT>0 THEN
4204 FORALL i IN t_nontrk_tbl.First..t_nontrk_tbl.Last
4205 UPDATE CZ_MODEL_REF_EXPLS a SET has_trackable_children=NO_FLAG
4206 WHERE component_id=t_nontrk_tbl(i) AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4207 model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4208 WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
4209 END IF;
4210
4211
4212 END set_Trackable_Children_Flag;
4213
4214 FUNCTION check_Rules_For_Ps_Node(p_ps_node_id IN NUMBER)
4215 RETURN NUMBER IS
4216
4217 l_template_id NUMBER;
4218 l_contribute_min_flag VARCHAR2(1);
4219 l_contribute_max_flag VARCHAR2(1);
4220
4221 BEGIN
4222
4223 FND_MSG_PUB.initialize;
4224
4225 FOR i IN(SELECT expr_node_id,rule_id
4226 FROM CZ_EXPRESSION_NODES
4227 WHERE rule_id IN(SELECT rule_id FROM CZ_RULES
4228 WHERE devl_project_id IN(SELECT devl_project_id FROM CZ_PS_NODES
4229 WHERE ps_node_id=p_ps_node_id) AND deleted_flag=NO_FLAG AND disabled_flag=NO_FLAG) AND
4233 SELECT template_id INTO l_template_id
4230 ps_node_id=p_ps_node_id AND expr_type=205 AND deleted_flag=NO_FLAG)
4231 LOOP
4232 BEGIN
4234 FROM CZ_EXPRESSION_NODES
4235 WHERE rule_id=i.rule_id AND expr_parent_id=i.expr_node_id AND
4236 expr_type=210 AND
4237 template_id in(43,44) AND deleted_flag=NO_FLAG;
4238
4239 IF l_template_id=43 THEN
4240 l_contribute_min_flag := YES_FLAG;
4241 END IF;
4242
4243 IF l_template_id=44 THEN
4244 l_contribute_max_flag := YES_FLAG;
4245 END IF;
4246
4247 IF l_contribute_min_flag=YES_FLAG AND l_contribute_max_flag=YES_FLAG THEN
4248 RETURN CONTRIBUTE_TO_MINMAX;
4249 END IF;
4250
4251 EXCEPTION
4252 WHEN OTHERS THEN
4253 NULL;
4254 END;
4255 END LOOP;
4256
4257 IF l_contribute_max_flag=YES_FLAG THEN
4258 RETURN CONTRIBUTE_TO_MAX;
4259 ELSIF l_contribute_min_flag=YES_FLAG THEN
4260 RETURN CONTRIBUTE_TO_MIN;
4261 ELSE
4262 RETURN 0;
4263 END IF;
4264
4265 END check_Rules_For_Ps_Node;
4266
4267
4268 PROCEDURE validate_Inst_Flag
4269 (
4270 p_ps_node_id IN NUMBER,
4271 p_instantiable_flag IN NUMBER,
4272 x_validation_flag OUT NOCOPY VARCHAR2,
4273 x_run_id OUT NOCOPY NUMBER) IS
4274
4275 l_contribute NUMBER;
4276 l_instantiable_flag NUMBER;
4277
4278 BEGIN
4279
4280 FND_MSG_PUB.initialize;
4281
4282 x_run_id := 0; x_validation_flag := NO_FLAG;
4283
4284 SELECT instantiable_flag INTO l_instantiable_flag
4285 FROM CZ_PS_NODES
4286 WHERE ps_node_id=p_ps_node_id;
4287
4288 l_contribute := check_Rules_For_Ps_Node(p_ps_node_id);
4289
4290 IF l_instantiable_flag=MINMAX_EXPL_TYPE AND p_instantiable_flag=MANDATORY_EXPL_TYPE THEN
4291 IF l_contribute IN(CONTRIBUTE_TO_MIN,CONTRIBUTE_TO_MAX,CONTRIBUTE_TO_MINMAX) THEN
4292 x_validation_flag := YES_FLAG;
4293 END IF;
4294 ELSIF l_instantiable_flag=MINMAX_EXPL_TYPE AND p_instantiable_flag=OPTIONAL_EXPL_TYPE THEN
4295 IF l_contribute IN(CONTRIBUTE_TO_MAX) THEN
4296 x_validation_flag := YES_FLAG;
4297 END IF;
4298 ELSIF l_instantiable_flag=OPTIONAL_EXPL_TYPE AND p_instantiable_flag=MANDATORY_EXPL_TYPE THEN
4299 IF l_contribute IN(CONTRIBUTE_TO_MIN) THEN
4300 x_validation_flag := YES_FLAG;
4301 END IF;
4302 ELSE
4303 null;
4304 END IF;
4305
4306 END validate_Inst_Flag;
4307
4308 PROCEDURE check_Inst_Rule
4309 (
4310 p_rule_id IN NUMBER,
4311 x_inst_flag OUT NOCOPY NUMBER,
4312 x_sys_prop OUT NOCOPY NUMBER,
4313 x_validation_flag OUT NOCOPY VARCHAR2) IS
4314
4315 TYPE tExprNodeTbl IS TABLE OF cz_expression_nodes%ROWTYPE INDEX BY BINARY_INTEGER;
4316 TYPE tNumber IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4317 TYPE tExprType IS TABLE OF cz_expression_nodes.expr_type%TYPE INDEX BY BINARY_INTEGER;
4318
4319 l_children_index tNumber;
4320 l_number_of_children tNumber;
4321 l_index_by_expr_node_id tNumber;
4322 l_param_index tNumber;
4323 l_seq_nbr tNumber;
4324 l_expr_node_id tNumber;
4325 l_expr_parent_id tNumber;
4326 l_expr_type tExprType;
4327 l_template_id tNumber;
4328 l_ps_node_id tNumber;
4329
4330 l_children number;
4331
4332 CURSOR C1 IS
4333 SELECT param_index, seq_nbr, expr_type, expr_node_id,
4334 expr_parent_id,template_id, ps_node_id
4335 FROM cz_expression_nodes
4336 WHERE rule_id = p_rule_id
4337 AND deleted_flag = '0'
4338 ORDER BY expr_parent_id, seq_nbr;
4339
4340 BEGIN
4341
4342 FND_MSG_PUB.initialize;
4343
4344 x_inst_flag := NULL;
4345 x_sys_prop := NULL;
4346 x_validation_flag := YES_FLAG;
4347
4348 OPEN C1;
4349 FETCH C1 BULK COLLECT INTO l_param_index, l_seq_nbr,l_expr_type,
4350 l_expr_node_id, l_expr_parent_id, l_template_id, l_ps_node_id;
4351 CLOSE C1;
4352 IF (l_expr_node_id.COUNT = 0) THEN
4353 RETURN;
4354 END IF;
4355
4356 FOR i IN l_expr_parent_id.FIRST..l_expr_parent_id.LAST LOOP
4357 IF(l_expr_parent_id(i) IS NOT NULL) THEN
4358 IF(l_number_of_children.EXISTS(l_expr_parent_id(i))) THEN
4359 l_number_of_children(l_expr_parent_id(i)) := l_number_of_children(l_expr_parent_id(i)) + 1;
4360 ELSE
4361 l_number_of_children(l_expr_parent_id(i)) := 1;
4362 END IF;
4363 IF(NOT l_children_index.EXISTS(l_expr_parent_id(i)))THEN
4364 l_children_index(l_expr_parent_id(i)) := i;
4365 END IF;
4366 END IF;
4367 --Add the indexing option.
4368 l_index_by_expr_node_id(l_expr_node_id(i)) := i;
4369 END LOOP;
4370
4371 IF (l_template_id(l_expr_node_id.COUNT) = 22) THEN /* simple numeric rule */
4372 FOR i IN 1..l_expr_node_id.COUNT lOOP
4373 IF (l_param_index(i)=5) THEN
4374 IF (l_children_index.EXISTS(l_expr_node_id(i))) THEN
4375 l_children := l_number_of_children(l_expr_node_id(i));
4376 FOR j IN l_children_index(l_expr_node_id(i))..l_children_index(l_expr_node_id(i)) + l_children LOOP
4377 IF (l_expr_type(j) IN (207,210) AND l_template_id(j) IN (43,44)) THEN
4378 FOR k IN (SELECT instantiable_flag FROM cz_ps_nodes
4379 WHERE ps_node_id = l_ps_node_id(i)
4380 AND deleted_flag = NO_FLAG) LOOP
4381 IF (k.instantiable_flag = '2') THEN
4382 IF (l_template_id(j) = 43) THEN
4383 x_sys_prop := MIN_RULE;
4384 ELSE
4385 x_sys_prop := MAX_RULE;
4386 END IF;
4387 x_inst_flag := TO_NUMBER(k.instantiable_flag);
4388 x_validation_flag := NO_FLAG;
4389 ELSIF (l_template_id(j) = 44 AND k.instantiable_flag = '1') THEN
4390 x_sys_prop := MAX_RULE;
4391 x_inst_flag := TO_NUMBER(k.instantiable_flag);
4392 x_validation_flag := NO_FLAG;
4396 IF (x_validation_flag = NO_FLAG) THEN
4393 END IF;
4394 END LOOP;
4395 END IF;
4397 EXIT;
4398 END IF;
4399 END LOOP;
4400 END IF;
4401 END IF;
4402 IF (x_validation_flag = NO_FLAG) THEN
4403 EXIT;
4404 END IF;
4405 END LOOP;
4406 ELSIF (l_template_id(l_expr_node_id.COUNT) IS NULL) THEN /* statement rule, Developer must call parser */
4407 x_validation_flag := NULL;
4408 END IF;
4411 END;
4409 END check_Inst_Rule;
4410