[Home] [Help]
PACKAGE BODY: APPS.FEM_HIER_UTILS_PVT
Source
1 PACKAGE BODY FEM_HIER_UTILS_PVT AS
2 /* $Header: FEMVDHUB.pls 120.7.12000000.3 2007/08/08 16:20:50 gdonthir ship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'FEM_HIER_UTILS_PVT';
5
6 -- Global Variables
7 --
8
9 --
10 -- WHO columns variables
11 --
12 g_current_date DATE := sysdate ;
13 g_current_user_id NUMBER := NVL(Fnd_Global.User_Id , 0) ;
14 g_current_login_id NUMBER := NVL(Fnd_Global.Login_Id, 0) ;
15
16 -- Type definition for cursor
17 TYPE dhm_cur_type is REF CURSOR;
18
19 -- Global PL/SQL types
20 TYPE g_member_id_tbl_type is TABLE of FEM_PRODUCTS_HIER.PARENT_ID%TYPE
21 index by BINARY_INTEGER;
22 TYPE g_depth_num_tbl_type is
23 TABLE of FEM_PRODUCTS_HIER.PARENT_DEPTH_NUM%TYPE
24 index by BINARY_INTEGER;
25 TYPE g_value_set_id_tbl_type is
26 TABLE of FEM_PRODUCTS_HIER.PARENT_VALUE_SET_ID%TYPE
27 index by BINARY_INTEGER;
28 TYPE g_single_depth_tbl_type is
29 TABLE of FEM_PRODUCTS_HIER.SINGLE_DEPTH_FLAG%TYPE
30 index by BINARY_INTEGER;
31 TYPE g_disp_ordnum_tbl_type is
32 TABLE of FEM_PRODUCTS_HIER.DISPLAY_ORDER_NUM%TYPE
33 index by BINARY_INTEGER;
34 TYPE g_weight_pct_tbl_type is
35 TABLE of FEM_PRODUCTS_HIER.WEIGHTING_PCT%TYPE
36 index by BINARY_INTEGER;
37
38
39 /*===========================================================================+
40 | PROCEDURE Flatten_Focus_Node |
41 +===========================================================================*/
42
43 --
44 -- The API to flatten the immediate children of the focus node specified.
45 -- This API is being called when nodes are added at the same level to a
46 -- focus node.
47 --
48
49 PROCEDURE Flatten_Focus_Node
50 (
51 p_api_version IN NUMBER ,
52 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
53 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
54 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
55 x_return_status OUT NOCOPY VARCHAR2 ,
56 x_msg_count OUT NOCOPY NUMBER ,
57 x_msg_data OUT NOCOPY VARCHAR2 ,
58 --
59 p_hier_obj_defn_id IN NUMBER,
60 p_hier_table_name IN VARCHAR2,
61 p_focus_node IN NUMBER,
62 p_focus_value_set_id IN NUMBER
63 )
64
65 is
66
67 -- Cursor to find out if the hierarchy corresponding to the
68 -- hierarchy version provided, can be flattened or not.
69
70 Cursor l_hier_csr is
71 Select fh.flattened_rows_flag,
72 fod.display_name
73 from fem_hierarchies fh, fem_object_definition_vl fod
74 where fod.object_definition_id = p_hier_obj_defn_id
75 and fod.object_id = fh.hierarchy_obj_id;
76
77
78 --
79 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Focus_Node' ;
80 l_api_version CONSTANT NUMBER := 1.0;
81 --
82
83 --TYPE dhm_cur_type is REF CURSOR;
84 dhm_chi_cur dhm_cur_type;
85 dhm_par_cur dhm_cur_type;
86
87 -- PL/SQL tables to fetch details from appropriate
88 -- queries.
89 l_parent_ids_tbl g_member_id_tbl_type;
90 l_parent_depthnums_tbl g_depth_num_tbl_type;
91 l_parent_valueset_ids_tbl g_value_set_id_tbl_type;
92 l_child_ids_tbl g_member_id_tbl_type;
93 l_child_depthnums_tbl g_depth_num_tbl_type;
94 l_child_valueset_ids_tbl g_value_set_id_tbl_type;
95 l_single_depth_flag_tbl g_single_depth_tbl_type;
96 l_display_order_num_tbl g_disp_ordnum_tbl_type;
97 l_weighting_pct_tbl g_weight_pct_tbl_type;
98
99 l_flattened_rows_flag varchar2(1);
100 l_hier_defn_name varchar2(150);
101 l_fl_child_stmt varchar2(1500);
102 l_add_merg_stmt varchar2(2500);
103 l_focus_node_stmt varchar2(1500);
104 ins_stmt varchar2(2500);
105 l_stat number := 1;
106
107 l_child_id number;
108 l_child_depth_num number;
109 l_child_valueset_id number;
110 l_display_order_num number;
111 l_weighting_pct number;
112
113 BEGIN
114 --
115 SAVEPOINT Flatten_Focus_Node_Pvt ;
116 --
117 IF NOT FND_API.Compatible_API_Call ( l_api_version,
118 p_api_version,
119 l_api_name,
120 G_PKG_NAME )
121 THEN
122 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
123 END IF;
124 --
125
126 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
127 FND_MSG_PUB.initialize ;
128 END IF;
129 --
130 x_return_status := FND_API.G_RET_STS_SUCCESS ;
131 --
132
133 l_flattened_rows_flag := 'N';
134
135 For l_hier_csr_rec in l_hier_csr
136 Loop
137 l_flattened_rows_flag := l_hier_csr_rec.flattened_rows_flag;
138 l_hier_defn_name := l_hier_csr_rec.display_name;
139 End Loop;
140
141 -- If hierarchy does not require to be flattened
142 -- throws an error message .
143 if (l_flattened_rows_flag = 'N') then
144 FND_MESSAGE.SET_NAME('FEM','FEM_DHM_CANNOT_FLATTEN_HIER');
145 FND_MESSAGE.SET_TOKEN('HIER_DEFN_NAME',l_hier_defn_name );
146 FND_MSG_PUB.Add;
147 RAISE FND_API.G_EXC_ERROR ;
148 end if;
149
150 if (p_focus_value_set_id is not null) then
151
152 l_focus_node_stmt := 'Delete '||p_hier_table_name||
153 ' where hierarchy_obj_def_id = :1 '||
154 ' and parent_id = :2 '||
155 ' and parent_value_set_id = :3 '||
156 ' and child_id = :4 '||
157 ' and child_value_set_id = :5 '||
158 ' and single_depth_flag = ''N''';
159
160 EXECUTE IMMEDIATE l_focus_node_stmt
161 using p_hier_obj_defn_id, p_focus_node, p_focus_value_set_id,
162 p_focus_node, p_focus_value_set_id;
163
164 l_fl_child_stmt := 'Select child_id,'||
165 'child_depth_num, child_value_set_id,'||
166 'single_depth_flag,display_order_num, '||
167 'weighting_pct from '||p_hier_table_name||
168 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
169 ' and parent_id = '||p_focus_node||
170 ' and parent_value_set_id = '||p_focus_value_set_id||
171 ' and single_depth_flag = ''Y''';
172
173 open dhm_chi_cur for l_fl_child_stmt;
174 Loop
175 Fetch dhm_chi_cur bulk collect into l_child_ids_tbl,
176 l_child_depthnums_tbl,l_child_valueset_ids_tbl,
177 l_single_depth_flag_tbl,l_display_order_num_tbl,
178 l_weighting_pct_tbl limit 100;
179
180 if l_child_ids_tbl.count = 0 then
181 exit;
182 else
183 For i in 1..l_child_ids_tbl.count
184 Loop
185
186 l_child_id := l_child_ids_tbl(i);
187 l_child_depth_num := l_child_depthnums_tbl(i);
188 l_child_valueset_id := l_child_valueset_ids_tbl(i);
189 l_display_order_num := l_display_order_num_tbl(i);
190 l_weighting_pct := l_weighting_pct_tbl(i);
191 l_display_order_num := l_display_order_num_tbl(i);
192 l_weighting_pct := l_weighting_pct_tbl(i);
193
194 l_add_merg_stmt := 'Merge into '||p_hier_table_name||
195 ' hierA '||
196 ' using (Select parent_id,parent_depth_num ,'||
197 ' parent_value_set_id , hierarchy_obj_def_id '||
198 ' From '||p_hier_table_name||
199 ' where hierarchy_obj_def_id = :1 '||
200 ' and child_id = :2 '||
201 ' and child_value_set_id = :3 '||
202 ' and not (parent_id = child_id and '||
203 ' parent_value_set_id = child_value_set_id) '||
204 ' union '||
205 ' Select child_id parent_id, '||
206 ' child_depth_num parent_depth_num , '||
207 ' child_value_set_id parent_value_set_id, '||
208 ' hierarchy_obj_def_id '||
209 ' from '||p_hier_table_name||
210 ' where hierarchy_obj_def_id = :A '||
211 ' and child_id = :B '||
212 ' and child_value_set_id = :C '||
213 ' and parent_id = :D '||
214 ' and parent_value_set_id = :E '||
215 ' and not (parent_id = child_id and '||
216 ' parent_value_set_id = child_value_set_id) ' || --) hierB'||
217
218 -- Start Bug#4022561
219 /* Do not insert leaf node flattened entries
220 * for nodes that have children
221 */
222
223 ' and not exists ( select 1 from ' || p_hier_table_name || ' Z ' ||
224 ' where z.hierarchy_obj_def_id = ' || p_hier_obj_defn_id ||
225 ' and z.parent_id = ' || l_child_id ||
226 ' and z.parent_value_set_id = ' || l_child_valueset_id ||
227 ' and z.single_depth_flag = ''Y'' )) hierB '||
228
229 -- End Bug#4022561
230
231 ' on (hierA.parent_id = hierB.parent_id and '||
232 ' hierA.parent_value_set_id = hierB.parent_value_set_id '||
233 ' and hierA.child_id = :4 and '||
234 ' hierA.child_value_set_id = :5 and '||
235 ' hierA.hierarchy_obj_def_id = '||
236 ' hierB.hierarchy_obj_def_id )'||
237 ' when matched then update set parent_depth_num = '||
238 ' hierB.parent_depth_num '||
239 ' when not matched then '||
240 ' Insert ' || --Bug#4240532, Provide column list for insert stmt
241 ' ( '||
242 'HIERARCHY_OBJ_DEF_ID, '||
243 'PARENT_DEPTH_NUM, '||
244 'PARENT_ID, '||
245 'PARENT_VALUE_SET_ID, '||
246 'CHILD_DEPTH_NUM, '||
247 'CHILD_ID, '||
248 'CHILD_VALUE_SET_ID, '||
249 'SINGLE_DEPTH_FLAG,'||
250 'DISPLAY_ORDER_NUM,'||
251 'WEIGHTING_PCT, ' ||
252 'CREATION_DATE,'||
253 'CREATED_BY, '||
254 'LAST_UPDATED_BY,'||
255 'LAST_UPDATE_DATE,'||
256 'LAST_UPDATE_LOGIN, '||
257 'OBJECT_VERSION_NUMBER) ' ||
258 ' values '||
259 ' ( :6, hierB.parent_depth_num, hierB.parent_id, '||
260 ' hierB.parent_value_set_id, :7, :8, :9, :10,'||
261 ' :11, :12, :13, :14, :15, :16, :17,:18) ';
262
263 EXECUTE IMMEDIATE l_add_merg_stmt
264 USING p_hier_obj_defn_id,p_focus_node,p_focus_value_set_id,
265 p_hier_obj_defn_id,l_child_id,l_child_valueset_id,
266 p_focus_node,p_focus_value_set_id,
267 l_child_id,l_child_valueset_id,p_hier_obj_defn_id,
268 l_child_depth_num, l_child_id, l_child_valueset_id,
269 'N',l_display_order_num, l_weighting_pct, g_current_date,
270 g_current_user_id, g_current_user_id, g_current_date,
271 g_current_login_id,l_stat;
272
273 End Loop;
274 end if;
275 End Loop;
276
277
278 else -- if value set id is null
279 l_focus_node_stmt := 'Delete '||p_hier_table_name||
280 ' where hierarchy_obj_def_id = :1 '||
281 ' and parent_id = :2 '||
282 ' and child_id = :4 '||
283 ' and single_depth_flag = ''N''';
284
285 EXECUTE IMMEDIATE l_focus_node_stmt
286 using p_hier_obj_defn_id, p_focus_node, p_focus_node;
287
288 l_fl_child_stmt := 'Select child_id,'||
289 'child_depth_num, '||
290 'single_depth_flag,display_order_num, '||
291 'weighting_pct from '||p_hier_table_name||
292 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
293 ' and parent_id = '||p_focus_node||
294 ' and single_depth_flag = ''Y''';
295
296 open dhm_chi_cur for l_fl_child_stmt;
297 Loop
298 Fetch dhm_chi_cur bulk collect into l_child_ids_tbl,
299 l_child_depthnums_tbl,
300 l_single_depth_flag_tbl,l_display_order_num_tbl,
301 l_weighting_pct_tbl limit 100;
302
303 if l_child_ids_tbl.count = 0 then
304 exit;
305 else
306 For i in 1..l_child_ids_tbl.count
307 Loop
308
309 l_child_id := l_child_ids_tbl(i);
310 l_child_depth_num := l_child_depthnums_tbl(i);
311 l_display_order_num := l_display_order_num_tbl(i);
312 l_weighting_pct := l_weighting_pct_tbl(i);
313 l_display_order_num := l_display_order_num_tbl(i);
314 l_weighting_pct := l_weighting_pct_tbl(i);
315
316 l_add_merg_stmt := 'Merge into '||p_hier_table_name||
317 ' hierA '||
321 ' where hierarchy_obj_def_id = :1 '||
318 ' using (Select parent_id,parent_depth_num ,'||
319 ' hierarchy_obj_def_id '||
320 ' From '||p_hier_table_name||
322 ' and child_id = :2 '||
323 ' and parent_id <> child_id '||
324 ' union '||
325 ' Select child_id parent_id, '||
326 ' child_depth_num parent_depth_num , '||
327 ' hierarchy_obj_def_id '||
328 ' from '||p_hier_table_name||
329 ' where hierarchy_obj_def_id = :A '||
330 ' and child_id = :B '||
331 ' and parent_id <> child_id '||
332 ' and parent_id = : C ' || -- hierB '||
333
334 -- Start Bug#4022561
335 /* Do not insert leaf node flattened entries
336 * for nodes that have children
337 */
338
339 ' and not exists ( select 1 from ' || p_hier_table_name || ' Z ' ||
340 ' where z.hierarchy_obj_def_id = ' || p_hier_obj_defn_id ||
341 ' and z.parent_id = ' || l_child_id ||
342 ' and z.single_depth_flag = ''Y'' )) hierB '||
343
344 -- End Bug#4022561
345
346 ' on (hierA.parent_id = hierB.parent_id and '||
347 ' hierA.child_id = :3 and '||
348 ' hierA.hierarchy_obj_def_id = '||
349 ' hierB.hierarchy_obj_def_id )'||
350 ' when matched then update set parent_depth_num = '||
351 ' hierB.parent_depth_num '||
352 ' when not matched then '||
353 ' Insert '|| --Bug#4240532, Provide column list for insert stmt
354 ' ( '||
355 'HIERARCHY_OBJ_DEF_ID, '||
356 'PARENT_DEPTH_NUM, '||
357 'PARENT_ID, '||
358 'CHILD_DEPTH_NUM, '||
359 'CHILD_ID, '||
360 'SINGLE_DEPTH_FLAG,'||
361 'DISPLAY_ORDER_NUM,'||
362 'WEIGHTING_PCT, ' ||
363 'CREATION_DATE,'||
364 'CREATED_BY, '||
365 'LAST_UPDATED_BY,'||
366 'LAST_UPDATE_DATE,'||
367 'LAST_UPDATE_LOGIN, '||
368 'OBJECT_VERSION_NUMBER) '||
369 ' values( :4, hierB.parent_depth_num, hierB.parent_id, '||
370 ' :5, :6, :7, :8, :9, :10,'||
371 ' :11, :12, :13, :14, :15) ';
372
373
374 EXECUTE IMMEDIATE l_add_merg_stmt
375 USING p_hier_obj_defn_id,p_focus_node,
376 p_hier_obj_defn_id, l_child_id, p_focus_node,
377 l_child_id,p_hier_obj_defn_id,
378 l_child_depth_num, l_child_id,
379 'N',l_display_order_num, l_weighting_pct, g_current_date,
380 g_current_user_id, g_current_user_id, g_current_date,
381 g_current_login_id,l_stat;
382
383
384
385 End Loop;
386 end if;
387 End Loop;
388
389 end if; -- If value set is not applicable.
390
391 --
392 -- End standard API section.
393 --
394
395 --
396 -- Down below are again the standard end and exception sections of the API.
397 --
398
399 --
400 IF FND_API.To_Boolean ( p_commit ) THEN
401 COMMIT WORK;
402 END iF;
403 --
404 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
405 p_data => x_msg_data );
406 --
407 EXCEPTION
408 --
409 WHEN FND_API.G_EXC_ERROR THEN
410 --
411 ROLLBACK TO Flatten_Focus_Node_Pvt ;
412 x_return_status := FND_API.G_RET_STS_ERROR;
413 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
414 p_data => x_msg_data );
415 --
416 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
417 --
418 ROLLBACK TO Flatten_Focus_Node_Pvt ;
419 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
420 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
421 p_data => x_msg_data );
422 --
423 WHEN OTHERS THEN
424 --
425 ROLLBACK TO Flatten_Focus_Node_Pvt ;
426 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
427 --
428 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
429 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
430 l_api_name);
431 END if;
432 --
433 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
434 p_data => x_msg_data );
435 --
436
437 end Flatten_Focus_Node;
438
439 /*===========================================================================+
440 | PROCEDURE Flatten_Whole_Hier_Version |
441 +===========================================================================*/
442
443 --
444 -- The API to flatten a complete hierarchy version.
445 -- This API gines all possible root nodes of a given
446 -- hierarchy version and for each top root node
450
447 -- calls the Flatten_Focus_Node_Tree api to
448 -- flatten all the nodes under the specific root.
449 --
451 PROCEDURE Flatten_Whole_Hier_Version
452 (
453 p_api_version IN NUMBER ,
454 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
455 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
456 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
457 x_return_status OUT NOCOPY VARCHAR2 ,
458 x_msg_count OUT NOCOPY NUMBER ,
459 x_msg_data OUT NOCOPY VARCHAR2 ,
460 --
461 p_hier_obj_defn_id IN NUMBER
462 )
463 is
464
465
466
467 dhm_top_cur dhm_cur_type;
468 dhm_chi_cur dhm_cur_type;
469 dhm_flat_cur dhm_cur_type;
470
471 l_top_nodes_tbl g_member_id_tbl_type;
472 ltopvsids g_value_set_id_tbl_type;
473 l_parent_ids_tbl g_member_id_tbl_type;
474 l_parent_depthnums_tbl g_depth_num_tbl_type;
475 l_parent_valueset_ids_tbl g_value_set_id_tbl_type;
476 l_child_ids_tbl g_member_id_tbl_type;
477 l_child_depthnums_tbl g_depth_num_tbl_type;
478 l_child_valueset_ids_tbl g_value_set_id_tbl_type;
479 l_single_depth_flag_tbl g_single_depth_tbl_type;
480 l_display_order_num_tbl g_disp_ordnum_tbl_type;
481 l_weighting_pct_tbl g_weight_pct_tbl_type;
482 --
483 l_flattened_rows_flag varchar2(1);
484 l_hier_defn_name varchar2(150);
485 l_hier_table_name varchar2(30);
486 l_all_child_stmt varchar2(1500);
487 l_hier_top_stmt varchar2(1500);
488 l_hier_flat_stmt varchar2(1500);
489 l_merg_stmt varchar2(2500);
490 l_stat number := 1;
491 l_flat_count number := 0;
492
493 l_dimension_id number;
494 l_value_set_required_flag varchar2(1);
495 l_child_id number;
496 l_child_depth_num number;
497 l_child_valueset_id number;
498 l_display_order_num number;
499 l_weighting_pct number;
500 l_flattened varchar2(6) := FND_API.G_FALSE;
501 --
502 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Whole_Hier_Version' ;
503 l_api_version CONSTANT NUMBER := 1.0;
504
505 --
506 l_return_status VARCHAR2(1) ;
507 l_msg_count NUMBER ;
508 l_msg_data VARCHAR2(2000) ;
509
510 BEGIN
511
512 -- Bug # 3562336 : Removed Savepoint as the commit is now being
513 -- done in Flatten_Focus_Node_Tree after every merged row
514
515 IF NOT FND_API.Compatible_API_Call ( l_api_version,
516 p_api_version,
517 l_api_name,
518 G_PKG_NAME )
519 THEN
520 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
521 END IF;
522 --
523
524 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
525 FND_MSG_PUB.initialize ;
526 END IF;
527 --
528 x_return_status := FND_API.G_RET_STS_SUCCESS ;
529 --
530
531 l_flattened_rows_flag := 'N';
532
533 -- Cursor to find out if the hierarchy corresponding to the
534 -- hierarchy version provided, can be flattened or not.
535
536 For l_hier_csr_rec in
537 ( Select fh.flattened_rows_flag,
538 fh.dimension_id,
539 fod.display_name
540 from fem_hierarchies fh, fem_object_definition_vl fod
541 where fod.object_definition_id = p_hier_obj_defn_id
542 and fod.object_id = fh.hierarchy_obj_id)
543 Loop
544 l_flattened_rows_flag := l_hier_csr_rec.flattened_rows_flag;
545 l_dimension_id := l_hier_csr_rec.dimension_id;
546 l_hier_defn_name := l_hier_csr_rec.display_name;
547 End Loop;
548
549
550 -- If hierarchy does not require to be flattened
551 -- throws an error message .
552 if (l_flattened_rows_flag = 'N') then
553 FND_MESSAGE.SET_NAME('FEM','FEM_DHM_CANNOT_FLATTEN_HIER');
554 FND_MESSAGE.SET_TOKEN('HIER_DEFN_NAME',l_hier_defn_name );
555 FND_MSG_PUB.Add;
556 RAISE FND_API.G_EXC_ERROR ;
557 end if;
558
559 For l_dim_csr_rec in
560 (
561 Select hierarchy_table_name,
562 value_set_required_flag
563 from fem_xdim_dimensions
564 where dimension_id = l_dimension_id
565 )
566 Loop
567 l_hier_table_name := l_dim_csr_rec.hierarchy_table_name;
568 l_value_set_required_flag := l_dim_csr_rec.value_set_required_flag;
569 End Loop;
570
571 -- Cursor to find if the hierarchy has ever been
572 -- flattened
573
574 l_flat_count := 0;
575 l_hier_flat_stmt := 'Select 1 '||
576 ' from '||l_hier_table_name||
577 ' where hierarchy_obj_def_id = :1 ' ||
578 ' and parent_id <> child_id '||
579 ' and single_depth_flag = ''N''';
583 Loop
580
581 open dhm_flat_cur for l_hier_flat_stmt using p_hier_obj_defn_id;
582
584 Fetch dhm_flat_cur into l_flat_count;
585 if l_flat_count <> 0 then
586 l_flattened := FND_API.G_TRUE;
587 end if;
588 exit;
589 End Loop;
590
591 if (l_value_set_required_flag = 'Y') then
592 -- Cursor to find the top nodes (root nodes)
593 -- of the given hierarchy version.
594 l_hier_top_stmt := 'Select parent_id , parent_value_set_id '||
595 ' from '||l_hier_table_name||
596 ' where hierarchy_obj_def_id = :1 ' ||
597 ' and parent_id = child_id '||
598 ' and parent_value_set_id = child_value_set_id '||
599 ' and single_depth_flag = ''Y''';
600
601
602 open dhm_top_cur for l_hier_top_stmt using p_hier_obj_defn_id;
603 Loop
604 Fetch dhm_top_cur bulk collect into l_top_nodes_tbl, ltopvsids;
605 if l_top_nodes_tbl.count = 0 then
606 exit;
607 end if;
608 For i in 1..l_top_nodes_tbl.count
609 Loop
610
611 -- Bug # 3562336 : Added p_commit to Flatten_Focus_Node_Tree call
612
613 Flatten_Focus_Node_Tree
614 (
615 p_api_version => 1.0,
616 x_return_status => l_return_status,
617 x_msg_count => l_msg_count,
618 x_msg_data => l_msg_data,
619 p_commit => FND_API.G_TRUE,
620 --
621 p_hier_obj_defn_id => p_hier_obj_defn_id,
622 p_hier_table_name => l_hier_table_name,
623 p_focus_node => l_top_nodes_tbl(i),
624 p_focus_value_set_id => ltopvsids(i)
625 ) ;
626
627 -- Bug # 3562336 : Changed the return status check to
628 -- "<> FND_API.G_RET_STS_SUCCESS " from "= FND_API.G_RET_STS_ERROR"
629
630 if l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
631 RAISE FND_API.G_EXC_ERROR ;
632 end if;
633
634 End Loop; -- For Loop Top Nodes
635 End Loop; -- Outer Loop Top Nodes
636
637 else
638 -- Cursor to find the top nodes (root nodes)
639 -- of the given hierarchy version.
640 l_hier_top_stmt := 'Select parent_id '||
641 ' from '||l_hier_table_name||
642 ' where hierarchy_obj_def_id = :1 ' ||
643 ' and parent_id = child_id '||
644 ' and single_depth_flag = ''Y''';
645
646 open dhm_top_cur for l_hier_top_stmt using p_hier_obj_defn_id;
647 Loop
648 Fetch dhm_top_cur bulk collect into l_top_nodes_tbl;
649 if l_top_nodes_tbl.count = 0 then
650 exit;
651 end if;
652 For i in 1..l_top_nodes_tbl.count
653 Loop
654
655 -- Bug # 3562336 : Added p_commit to Flatten_Focus_Node_Tree call
656
657 Flatten_Focus_Node_Tree
658 (
659 p_api_version => 1.0,
660 x_return_status => l_return_status,
661 x_msg_count => l_msg_count,
662 x_msg_data => l_msg_data,
663 p_commit => FND_API.G_TRUE,
664 --
665 p_hier_obj_defn_id => p_hier_obj_defn_id,
666 p_hier_table_name => l_hier_table_name,
667 p_focus_node => l_top_nodes_tbl(i),
668 p_focus_value_set_id => NULL
669 ) ;
670
671 -- Bug # 3562336 : Changed the return status check to
672 -- "<> FND_API.G_RET_STS_SUCCESS " from "= FND_API.G_RET_STS_ERROR"
673
674 if l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
675 RAISE FND_API.G_EXC_ERROR ;
676 end if;
677
678 End Loop; -- For Loop Top Nodes
679 End Loop; -- Outer Loop Top Nodes
680
681 end if;
682 -- To set the completion of the Hierarchy Version explosion.
683 Update fem_hier_definitions
684 set flattened_rows_completion_code = 'COMPLETED',
685 last_updated_by = g_current_user_id,
686 last_update_date = g_current_date,
687 last_update_login = g_current_login_id,
688 object_version_number = object_version_number + 1
689 where hierarchy_obj_def_id = p_hier_obj_defn_id;
690
691 --
692 --
693 -- End standard API section.
694 --
695
696 --
697 -- Down below are again the standard end and exception sections of the API.
698 --
699
700 --
701 IF FND_API.To_Boolean ( p_commit ) THEN
702 COMMIT WORK;
703 END iF;
704 --
705 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
706 p_data => x_msg_data );
707 --
708 EXCEPTION
709
710 -- Bug # 3562336 : Remove exceptions other than 'WHEN OTHERS'
711
712 WHEN OTHERS THEN
713
714 -- Bug # 3562336 : Remove Rollback statement as Savepoint is not
715 -- needed anymore
716
717 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
718 --
719 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
720 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
721 l_api_name);
722 END if;
723 --
724 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
725 p_data => x_msg_data );
729
726 --
727
728 end Flatten_Whole_Hier_Version;
730 /*===========================================================================+
731 | PROCEDURE Flatten_Focus_Node_Tree |
732 +===========================================================================*/
733
734 --
735 -- The API to flatten the tree under a given node with respect to the whole
736 -- hierarchy .This api is normally used during the 'Move' operation, when
737 -- a node along with its children is moved under a focus node. Given the
738 -- focus node and the node added along with descendants, this api aims
739 -- to flatten the new structure with respect to the whole hierarchy.
740 --
741
742 PROCEDURE Flatten_Focus_Node_Tree
743 (
744 p_api_version IN NUMBER ,
745 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
746 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
747 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
748 x_return_status OUT NOCOPY VARCHAR2 ,
749 x_msg_count OUT NOCOPY NUMBER ,
750 x_msg_data OUT NOCOPY VARCHAR2 ,
751 --
752 p_hier_obj_defn_id IN NUMBER,
753 p_hier_table_name IN VARCHAR2,
754 p_focus_node IN NUMBER,
755 p_focus_value_set_id IN NUMBER
756 ) is
757
758 dhm_chi_cur dhm_cur_type;
759 dhm_leaf_cur dhm_cur_type;
760
761 l_top_nodes_tbl g_member_id_tbl_type;
762 l_parent_ids_tbl g_member_id_tbl_type;
763 l_parent_depthnums_tbl g_depth_num_tbl_type;
764 l_parent_valueset_ids_tbl g_value_set_id_tbl_type;
765 l_child_ids_tbl g_member_id_tbl_type;
766 l_child_depthnums_tbl g_depth_num_tbl_type;
767 l_child_valueset_ids_tbl g_value_set_id_tbl_type;
768 l_single_depth_flag_tbl g_single_depth_tbl_type;
769 l_display_order_num_tbl g_disp_ordnum_tbl_type;
770 l_weighting_pct_tbl g_weight_pct_tbl_type;
771 --
772 lnparentids g_member_id_tbl_type;
773 lnparentdepthnums g_depth_num_tbl_type;
774 lnparentvaluesetids g_value_set_id_tbl_type;
775 lnchildids g_member_id_tbl_type;
776 lnchilddepthnums g_depth_num_tbl_type;
777 lnchildvaluesetids g_value_set_id_tbl_type;
778 lndisplayordernum g_disp_ordnum_tbl_type;
779 lnweightingpct g_weight_pct_tbl_type;
780 --
781 l_child_id number;
782 l_leaf_parent_id number;
783 l_parent_id number;
784 l_parent_valueset_id number;
785 l_child_depth_num number;
786 l_child_valueset_id number;
787 l_single_depth_flag varchar2(1);
788 l_display_order_num number;
789 l_weighting_pct number;
790 l_all_child_stmt varchar2(1500);
791 l_leaf_flat_stmt varchar2(1500);
792 l_leaf_child_stmt varchar2(1500);
793 l_merg_stmt varchar2(2500);
794 l_stat number := 1;
795 n number := 1;
796
797 --
798 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Focus_Node_Tree' ;
799 l_api_version CONSTANT NUMBER := 1.0;
800
801 BEGIN
802
803 -- Bug # 3562336 : Removed Savepoint as the commit is now being done
804 -- after every merged row instead of committing rows at the end of the
805 -- procedure
806
807 IF NOT FND_API.Compatible_API_Call ( l_api_version,
808 p_api_version,
809 l_api_name,
810 G_PKG_NAME )
811 THEN
812 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
813 END IF;
814 --
815
816 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
817 FND_MSG_PUB.initialize ;
818 END IF;
819 --
820 x_return_status := FND_API.G_RET_STS_SUCCESS ;
821 --
822
823 if (p_focus_value_set_id is not null) then
824
825 -- Start Bug#4022561
826
827 /* Remove any leaf node flattenned entries
828 * of focus node
829 */
830
831
832 execute immediate 'DELETE FROM ' || p_hier_table_name ||
833 ' WHERE hierarchy_obj_def_id = ' || p_hier_obj_defn_id ||
834 ' AND parent_id = ' || p_focus_node ||
835 ' AND parent_id = child_id ' ||
836 ' AND parent_value_set_id = ' || p_focus_value_set_id ||
837 ' AND child_value_set_id = parent_value_set_id ' ||
838 ' AND single_depth_flag = ''N'' ';
839
840
841 -- End Bug#4022561
842
843
844
845
846 -- Cursor Statement to fetch all the children of the current top node.
847 l_all_child_stmt := 'SELECT h.parent_id, h.parent_value_set_id, '||
848 ' h.child_id , h.child_depth_num, '||
849 ' h.display_order_num ,h.child_value_set_id,' ||
850 ' h.weighting_pct '||
854 ' h.parent_value_set_id = h.child_value_set_id) '||
851 'FROM ' || p_hier_table_name || ' h ' ||
852 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
853 ' NOT ( h.parent_id = h.child_id AND '||
855 'START WITH h.parent_id = :2 AND ' ||
856 ' h.parent_value_set_id = :3 AND ' ||
857 'h.hierarchy_obj_def_id = :4 AND ' ||
858 'h.single_depth_flag = ''Y'' AND ' ||
859 ' NOT ( h.parent_id = h.child_id AND '||
860 ' h.parent_value_set_id = h.child_value_set_id) '||
861 'CONNECT BY PRIOR h.child_id = h.parent_id AND ' ||
862 ' PRIOR h.child_value_set_id = h.parent_value_set_id '||
863 ' AND h.hierarchy_obj_def_id = :5 AND ' ||
864 'h.single_depth_flag = ''Y'' AND ' ||
865 ' NOT ( h.parent_id = h.child_id AND '||
866 ' h.parent_value_set_id = h.child_value_set_id) '||
867 'ORDER BY level ';
868
869 open dhm_chi_cur for l_all_child_stmt
870 using p_hier_obj_defn_id, p_focus_node, p_focus_value_set_id,
871 p_hier_obj_defn_id, p_hier_obj_defn_id;
872 Loop
873
874 -- Bug # 3562336 : Changed bulk fetch statements limit
875 -- from 100 to 500
876
877 Fetch dhm_chi_cur bulk collect into l_parent_ids_tbl,
878 l_parent_valueset_ids_tbl,
879 l_child_ids_tbl,l_child_depthnums_tbl, l_display_order_num_tbl,
880 l_child_valueset_ids_tbl,l_weighting_pct_tbl limit 500;
881
882 if l_child_ids_tbl.count = 0 then
883 exit;
884 end if;
885
886 n := 0;
887 For m in 1..l_child_ids_tbl.count
888 Loop
889 l_child_id := l_child_ids_tbl(m);
890 l_parent_id := l_parent_ids_tbl(m);
891 l_parent_valueset_id := l_parent_valueset_ids_tbl(m);
892 l_child_depth_num := l_child_depthnums_tbl(m);
893 l_child_valueset_id := l_child_valueset_ids_tbl(m);
894 l_display_order_num := l_display_order_num_tbl(m);
895 l_weighting_pct := l_weighting_pct_tbl(m);
896 l_child_depth_num := l_child_depthnums_tbl(m);
897 l_display_order_num := l_display_order_num_tbl(m);
898 l_weighting_pct := l_weighting_pct_tbl(m);
899
900 -- To find if the node has children
901 l_leaf_child_stmt := 'Select child_id '||
902 ' from '||p_hier_table_name||
903 ' where hierarchy_obj_def_id = :1'||
904 ' and parent_id = :2 '||
905 ' and parent_value_set_id = :3 ';
906
907
908 open dhm_leaf_cur for l_leaf_child_stmt
909 using p_hier_obj_defn_id,l_child_id,l_child_valueset_id;
910
911 Loop
912 Fetch dhm_leaf_cur into l_leaf_parent_id;
913 if dhm_leaf_cur%rowcount = 0 then
914 n := n + 1;
915 lnparentdepthnums(n) := l_child_depth_num;
916 lnparentids(n) := l_child_id;
917 lnparentvaluesetids(n) := l_child_valueset_id;
918 lnchildids(n) := l_child_id;
919 lnchilddepthnums(n) := l_child_depth_num;
920 lnchildvaluesetids(n) := l_child_valueset_id;
921 lndisplayordernum(n) := l_display_order_num;
922 lnweightingpct(n) := l_weighting_pct;
923 end if;
924 exit;
925 End Loop;
926
927 l_merg_stmt := 'Merge into '||p_hier_table_name||' hierA '||
928 ' using (Select parent_id,parent_depth_num ,'||
929 ' parent_value_set_id , hierarchy_obj_def_id '||
930 ' From '||p_hier_table_name||
931 ' where hierarchy_obj_def_id = :1 '||
932 ' and child_id = :2 '||
933 ' and child_value_set_id = :3 '||
934 ' and not ( parent_id = child_id and '||
935 ' parent_value_set_id = child_value_set_id)) hierB '||
936 ' on (hierA.parent_id = hierB.parent_id and '||
937 ' hierA.parent_value_set_id = hierB.parent_value_set_id '||
938 ' and hierA.child_id = :4 and '||
939 ' hierA.child_value_set_id = :5 and '||
940 ' hierA.hierarchy_obj_def_id = '||
941 ' hierB.hierarchy_obj_def_id )'||
942 ' when matched then update set parent_depth_num = '||
943 ' hierB.parent_depth_num '||
944 ' when not matched then '||
945 ' Insert ' || --Bug#4240532, Provide column list for insert stmt
946 ' ( '||
947 'HIERARCHY_OBJ_DEF_ID, '||
948 'PARENT_DEPTH_NUM, '||
949 'PARENT_ID, '||
950 'PARENT_VALUE_SET_ID, '||
951 'CHILD_DEPTH_NUM, '||
952 'CHILD_ID, '||
953 'CHILD_VALUE_SET_ID, '||
954 'SINGLE_DEPTH_FLAG,'||
955 'DISPLAY_ORDER_NUM,'||
956 'WEIGHTING_PCT, ' ||
957 'CREATION_DATE,'||
958 'CREATED_BY, '||
959 'LAST_UPDATED_BY,'||
963 ' values '||
960 'LAST_UPDATE_DATE,'||
961 'LAST_UPDATE_LOGIN, '||
962 'OBJECT_VERSION_NUMBER) '||
964 ' ( :6, hierB.parent_depth_num, hierB.parent_id, '||
965 ' hierB.parent_value_set_id, :7, :8, :9, :10,'||
966 ' :11, :12, :13, :14, :15, :16, :17 ,:18) ';
967
968 /*l_merg_stmt := 'Merge into '||p_hier_table_name||' hierA '||
969 ' using (Select parent_id , parent_depth_num , '||
970 ' parent_value_set_id , child_id, hierarchy_obj_def_id '||
971 ' From '|| p_hier_table_name||
972 ' where hierarchy_obj_def_id = :1 '||
973 ' and single_depth_flag = ''Y'''||
974 ' and parent_id <> child_id '||
975 ' and level <> 1 '||
976 ' start with child_id = :2 '||
977 ' and hierarchy_obj_def_id = :3 '||
978 ' and single_depth_flag = ''Y'' '||
979 ' and parent_id <> child_id '||
980 ' connect by prior parent_id = child_id '||
981 ' and hierarchy_obj_def_id = :4 '||
982 ' and single_depth_flag = ''Y'''||
983 ' and parent_id <> child_id ) hierB'||
984 ' on (hierA.parent_id = hierB.parent_id and '||
985 ' hierA.child_id = :x and '||
986 ' hierA.hierarchy_obj_def_id = '||
987 ' hierB.hierarchy_obj_def_id )'||
988 ' when matched then update set parent_depth_num = '||
989 ' hierB.parent_depth_num '||
990 ' when not matched then '||
991 ' Insert values '||
992 ' ( :5,hierB.parent_depth_num,hierB.parent_id,'||
993 ' hierB.parent_value_set_id,:6,:7,:8,:9,:10,'||
994 ' :11,:12,:13,:14,:15, :16,:17 ) '; */
995
996
997 EXECUTE IMMEDIATE l_merg_stmt
998 USING p_hier_obj_defn_id,l_parent_id,l_parent_valueset_id,
999 l_child_id,l_child_valueset_id,p_hier_obj_defn_id,
1000 l_child_depth_num, l_child_id, l_child_valueset_id,
1001 'N',l_display_order_num, l_weighting_pct, g_current_date,
1002 g_current_user_id, g_current_user_id, g_current_date,
1003 g_current_login_id,l_stat;
1004
1005
1006 -- Bug # 3562336 : Commit after every insert/update to avoid
1007 -- rollback segment capacity issues
1008
1009 IF FND_API.To_Boolean ( p_commit ) THEN
1010 COMMIT WORK;
1011 END IF;
1012
1013 End Loop;
1014
1015
1016 --Bug#4240532, Provide column list for insert stmt
1017
1018 l_leaf_flat_stmt := 'Insert into '||p_hier_table_name||
1019 ' ( '||
1020 'HIERARCHY_OBJ_DEF_ID, '||
1021 'PARENT_DEPTH_NUM, '||
1022 'PARENT_ID, '||
1023 'PARENT_VALUE_SET_ID, '||
1024 'CHILD_DEPTH_NUM, '||
1025 'CHILD_ID, '||
1026 'CHILD_VALUE_SET_ID, '||
1027 'SINGLE_DEPTH_FLAG,'||
1028 'DISPLAY_ORDER_NUM,'||
1029 'WEIGHTING_PCT, ' ||
1030 'CREATION_DATE,'||
1031 'CREATED_BY, '||
1032 'LAST_UPDATED_BY,'||
1033 'LAST_UPDATE_DATE,'||
1034 'LAST_UPDATE_LOGIN, '||
1035 'OBJECT_VERSION_NUMBER) '||
1036 ' values '||
1037 '( :1, '||
1038 ' :lparentdepthnum,'||
1039 ' :lparentid,'||
1040 ' :lparentvaluesetid,'||
1041 ' :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)' ;
1042
1043 Forall k in 1..n
1044 EXECUTE immediate l_leaf_flat_stmt
1045 USING p_hier_obj_defn_id,lnparentdepthnums(k),
1046 lnparentids(k), lnparentvaluesetids(k),
1047 lnchilddepthnums(k),lnchildids(k),lnchildvaluesetids(k),
1048 'N',lndisplayordernum(k),
1049 lnweightingpct(k), g_current_date,
1050 g_current_user_id,g_current_user_id,
1051 g_current_date,g_current_login_id,l_stat;
1052
1053
1054 -- Bug # 3562336 : Commit after every insert/update to avoid
1055 -- rollback segment capacity issues
1056
1057 IF FND_API.To_Boolean ( p_commit ) THEN
1058 COMMIT WORK;
1059 END IF;
1060
1061 End Loop;
1062 else -- if p_focus_value_set_id is null
1063
1064
1065 -- Start Bug#4022561
1066
1067 /* Remove any leaf node flattenned entries
1068 * of focus node
1069 */
1070
1071 execute immediate 'DELETE FROM ' || p_hier_table_name ||
1072 ' WHERE hierarchy_obj_def_id = ' || p_hier_obj_defn_id ||
1073 ' AND parent_id = ' || p_focus_node ||
1074 ' AND parent_id = child_id ' ||
1078 -- End Bug#4022561
1075 ' AND single_depth_flag = ''N'' ';
1076
1077
1079
1080 -- Cursor Statement to fetch all the children of the current top node.
1081 l_all_child_stmt := 'SELECT h.parent_id, '||
1082 ' h.child_id , h.child_depth_num, '||
1083 ' h.display_order_num ,'||
1084 ' h.weighting_pct '||
1085 'FROM ' || p_hier_table_name || ' h ' ||
1086 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
1087 ' h.parent_id <> h.child_id '||
1088 'START WITH h.parent_id = :2 AND ' ||
1089 'h.hierarchy_obj_def_id = :4 AND ' ||
1090 'h.single_depth_flag = ''Y'' AND ' ||
1091 ' h.parent_id <> h.child_id '||
1092 'CONNECT BY PRIOR h.child_id = h.parent_id AND ' ||
1093 'h.hierarchy_obj_def_id = :5 AND ' ||
1094 'h.single_depth_flag = ''Y'' AND ' ||
1095 ' h.parent_id <> h.child_id '||
1096 'ORDER BY level ';
1097
1098 open dhm_chi_cur for l_all_child_stmt
1099 using p_hier_obj_defn_id, p_focus_node,
1100 p_hier_obj_defn_id, p_hier_obj_defn_id;
1101 Loop
1102
1103 -- Bug # 3562336 : Changed bulk fetch statements limit from
1104 -- 100 to 500
1105
1106 Fetch dhm_chi_cur bulk collect into l_parent_ids_tbl,
1107 l_child_ids_tbl,l_child_depthnums_tbl, l_display_order_num_tbl,
1108 l_weighting_pct_tbl limit 500;
1109
1110 if l_child_ids_tbl.count = 0 then
1111 exit;
1112 end if;
1113
1114 n := 0;
1115 For m in 1..l_child_ids_tbl.count
1116 Loop
1117 l_child_id := l_child_ids_tbl(m);
1118 l_parent_id := l_parent_ids_tbl(m);
1119 l_child_depth_num := l_child_depthnums_tbl(m);
1120 l_display_order_num := l_display_order_num_tbl(m);
1121 l_weighting_pct := l_weighting_pct_tbl(m);
1122 l_child_depth_num := l_child_depthnums_tbl(m);
1123 l_display_order_num := l_display_order_num_tbl(m);
1124 l_weighting_pct := l_weighting_pct_tbl(m);
1125
1126 -- To find if the node has children
1127 -- To find if the node has children
1128 l_leaf_child_stmt := 'Select child_id '||
1129 ' from '||p_hier_table_name||
1130 ' where hierarchy_obj_def_id = :1'||
1131 ' and parent_id = :2 ';
1132
1133 open dhm_leaf_cur for l_leaf_child_stmt
1134 using p_hier_obj_defn_id,l_child_id;
1135
1136 Loop
1137 Fetch dhm_leaf_cur into l_leaf_parent_id;
1138 if dhm_leaf_cur%rowcount = 0 then
1139 n := n + 1;
1140 lnparentdepthnums(n) := l_child_depth_num;
1141 lnparentids(n) := l_child_id;
1142 lnchildids(n) := l_child_id;
1143 lnchilddepthnums(n) := l_child_depth_num;
1144 lndisplayordernum(n) := l_display_order_num;
1145 lnweightingpct(n) := l_weighting_pct;
1146 end if;
1147 exit;
1148 End Loop;
1149
1150 l_merg_stmt := 'Merge into '||p_hier_table_name||' hierA '||
1151 ' using (Select parent_id,parent_depth_num ,'||
1152 ' hierarchy_obj_def_id '||
1153 ' From '||p_hier_table_name||
1154 ' where hierarchy_obj_def_id = :1 '||
1155 ' and child_id = :2 '||
1156 ' and parent_id <> child_id ) hierB '||
1157 ' on (hierA.parent_id = hierB.parent_id '||
1158 ' and hierA.child_id = :3 and '||
1159 ' hierA.hierarchy_obj_def_id = '||
1160 ' hierB.hierarchy_obj_def_id )'||
1161 ' when matched then update set parent_depth_num = '||
1162 ' hierB.parent_depth_num '||
1163 ' when not matched then '||
1164 ' Insert ' || --Bug#4240532, Provide column list for insert stmt
1165 ' ( '||
1166 'HIERARCHY_OBJ_DEF_ID, '||
1167 'PARENT_DEPTH_NUM, '||
1168 'PARENT_ID, '||
1169 'CHILD_DEPTH_NUM, '||
1170 'CHILD_ID, '||
1171 'SINGLE_DEPTH_FLAG,'||
1172 'DISPLAY_ORDER_NUM,'||
1173 'WEIGHTING_PCT, ' ||
1174 'CREATION_DATE,'||
1175 'CREATED_BY, '||
1176 'LAST_UPDATED_BY,'||
1177 'LAST_UPDATE_DATE,'||
1178 'LAST_UPDATE_LOGIN, '||
1179 'OBJECT_VERSION_NUMBER) '||
1180 ' values '||
1181 ' ( :6, hierB.parent_depth_num, hierB.parent_id, '||
1182 ' :7, :8, :9, :10,'||
1183 ' :11, :12, :13, :14, :15, :16, :17 ) ';
1184
1185 EXECUTE IMMEDIATE l_merg_stmt
1186 USING p_hier_obj_defn_id,l_parent_id,
1187 l_child_id,p_hier_obj_defn_id,
1188 l_child_depth_num, l_child_id,
1189 'N',l_display_order_num, l_weighting_pct,
1190 g_current_date, g_current_user_id,
1194 -- Bug # 3562336 : Commit after every insert/update to avoid
1191 g_current_user_id, g_current_date,
1192 g_current_login_id,l_stat;
1193
1195 -- rollback segment capacity issues
1196
1197 IF FND_API.To_Boolean ( p_commit ) THEN
1198 COMMIT WORK;
1199 END iF;
1200
1201
1202 End Loop;
1203
1204
1205 --Bug#4240532, Provide column list for insert stmt
1206
1207 l_leaf_flat_stmt := 'Insert into '||p_hier_table_name||
1208 ' ( '||
1209 'HIERARCHY_OBJ_DEF_ID, '||
1210 'PARENT_DEPTH_NUM, '||
1211 'PARENT_ID, '||
1212 'CHILD_DEPTH_NUM, '||
1213 'CHILD_ID, '||
1214 'SINGLE_DEPTH_FLAG,'||
1215 'DISPLAY_ORDER_NUM,'||
1216 'WEIGHTING_PCT, ' ||
1217 'CREATION_DATE,'||
1218 'CREATED_BY, '||
1219 'LAST_UPDATED_BY,'||
1220 'LAST_UPDATE_DATE,'||
1221 'LAST_UPDATE_LOGIN, '||
1222 'OBJECT_VERSION_NUMBER) '||
1223 ' values '||
1224 '( :1, '||
1225 ' :lparentdepthnum,'||
1226 ' :lparentid,'||
1227 ' :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12)' ;
1228
1229 Forall k in 1..n
1230 EXECUTE immediate l_leaf_flat_stmt
1231 USING p_hier_obj_defn_id,lnparentdepthnums(k),
1232 lnparentids(k),
1233 lnchilddepthnums(k),lnchildids(k),
1234 'N',lndisplayordernum(k),
1235 lnweightingpct(k), g_current_date,
1236 g_current_user_id,g_current_user_id,
1237 g_current_date,g_current_login_id,l_stat;
1238
1239
1240 -- Bug # 3562336 : Commit after every insert/update to avoid
1241 -- rollback segment capacity issues
1242
1243 IF FND_API.To_Boolean ( p_commit ) THEN
1244 COMMIT WORK;
1245 END IF;
1246
1247
1248 End Loop;
1249 end if;
1250
1251
1252 --
1253 -- End standard API section.
1254 --
1255
1256 --
1257 -- Down below are again the standard end and exception sections of the API.
1258 --
1259
1260 --
1261 IF FND_API.To_Boolean ( p_commit ) THEN
1262 COMMIT WORK;
1263 END iF;
1264 --
1265 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1266 p_data => x_msg_data );
1267 --
1268 EXCEPTION
1269 -- Bug # 3562336 : Remove exceptions other than 'WHEN OTHERS'
1270
1271 WHEN OTHERS THEN
1272
1273 -- Bug # 3562336 : Remove Rollback statement as Savepoint is
1274 -- not needed anymore
1275
1276 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1277 --
1278 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1279 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
1280 l_api_name);
1281 END if;
1282 --
1283 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1284 p_data => x_msg_data );
1285 --
1286
1287 End Flatten_Focus_Node_Tree;
1288
1289 PROCEDURE Unflatten_Focus_Node_Tree
1290 (
1291 p_api_version IN NUMBER ,
1292 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
1293 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
1294 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
1295 x_return_status OUT NOCOPY VARCHAR2 ,
1296 x_msg_count OUT NOCOPY NUMBER ,
1297 x_msg_data OUT NOCOPY VARCHAR2 ,
1298 --
1299 p_hier_obj_defn_id IN NUMBER,
1300 p_hier_table_name IN VARCHAR2,
1301 p_focus_node IN NUMBER ,
1302 p_focus_value_set_id IN NUMBER ,
1303 p_parent_id IN NUMBER ,
1304 p_parent_value_set_id IN NUMBER ,
1305 p_imm_child_id IN NUMBER,
1306 p_imm_child_value_set_id IN NUMBER,
1307 p_operation IN VARCHAR2
1308 ) is
1309 --
1310 l_chi_stmt varchar2(1500);
1311 l_del_stmt varchar2(1500);
1312 l_child_ids_tbl g_member_id_tbl_type;
1313 l_child_valueset_ids_tbl g_value_set_id_tbl_type;
1314
1315 --TYPE dhm_cur_type is REF CURSOR;
1316 dhm_chi_cur dhm_cur_type;
1317
1318
1319 -- Start Bug#4022561
1320
1321 l_imm_parent_csr dhm_cur_type;
1322 l_imm_parent_child_csr dhm_cur_type;
1323 l_imm_child_csr dhm_cur_type;
1324 l_root_csr dhm_cur_type;
1325
1326
1327 l_parent_id NUMBER;
1328 l_parent_value_set_id NUMBER := 0;
1329 l_parent_depth_num NUMBER;
1330 l_child_id NUMBER;
1331 l_child_value_set_id NUMBER;
1332 l_child_depth_num NUMBER := 1;
1333 l_display_order_num NUMBER;
1337 l_weighting_pct NUMBER;
1334 l_imm_child_flag VARCHAR2(1) := 'N';
1335 l_stat NUMBER := 1;
1336 l_leaf_flat_stmt VARCHAR2(1500);
1338 l_select_stmt VARCHAR2(1000);
1339 l_imm_delete_stmt VARCHAR2(1000);
1340
1341
1342 -- End Bug#4022561
1343
1344 --
1345 l_api_name CONSTANT VARCHAR2(30) := 'Unflatten_Focus_Node_Tree' ;
1346 l_api_version CONSTANT NUMBER := 1.0;
1347
1348 BEGIN
1349 --
1350 SAVEPOINT Unflatten_Focus_Node_Tree_Pvt ;
1351 --
1352 IF NOT FND_API.Compatible_API_Call ( l_api_version,
1353 p_api_version,
1354 l_api_name,
1355 G_PKG_NAME )
1356 THEN
1357 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1358 END IF;
1359 --
1360
1361 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
1362 FND_MSG_PUB.initialize ;
1363 END IF;
1364 --
1365 x_return_status := FND_API.G_RET_STS_SUCCESS ;
1366
1367 if (p_focus_value_set_id is not null) then
1368
1369
1370 -- Start Bug#4022561
1371
1372 /* Remove any flattened entries of the immediate
1373 * children of the deleted member
1374 */
1375
1376 IF(p_operation = 'RemoveImmChildren') THEN
1377 l_imm_delete_stmt := 'DELETE FROM ' || p_hier_table_name ||
1378 ' WHERE hierarchy_obj_def_id = :1 ' ||
1379 ' AND child_id = :2 ' ||
1380 ' AND child_value_set_id = :3 ' ||
1381 ' AND single_depth_flag = ''N''';
1382
1383
1384 EXECUTE IMMEDIATE l_imm_delete_stmt
1385 using p_hier_obj_defn_id , p_imm_child_id,
1386 p_imm_child_value_set_id;
1387
1388 RETURN;
1389
1390 END IF;
1391
1392 -- End Bug#4022561
1393
1394 l_chi_stmt := 'Select child_id, child_value_set_id '||
1395 ' from '||p_hier_table_name||
1396 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1397 ' and parent_id = :1 '||
1398 ' and parent_value_set_id = :2 '||
1399 ' and single_depth_flag = ''N''';
1400
1401 l_del_stmt := 'Delete '||p_hier_table_name||
1402 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1403 ' and child_id = :1 '||
1404 ' and child_value_set_id = :2 '||
1405 ' and single_depth_flag = ''N''';
1406
1407 /* Bug#4022561
1408 * Bind the cursor dhm_chi_cur
1409 */
1410
1411 open dhm_chi_cur for l_chi_stmt
1412 using p_focus_node,p_focus_value_set_id;
1413 Loop
1414 Fetch dhm_chi_cur bulk collect into l_child_ids_tbl,
1415 l_child_valueset_ids_tbl limit 500;
1416
1417 if l_child_ids_tbl.count = 0 then
1418 exit;
1419 end if;
1420
1421 Forall i in 1..l_child_ids_tbl.count
1422 EXECUTE IMMEDIATE l_del_stmt
1423 using l_child_ids_tbl(i), l_child_valueset_ids_tbl(i);
1424
1425 commit;
1426 End Loop;
1427
1428 -- Start Bug#4022561
1429
1430 /* Check if the immediate parent of the deleted
1431 * member has any other children. If not,insert a leaf
1432 * entry for the parent node only if it is not a root.
1433 */
1434
1435
1436
1437 l_select_stmt := ' SELECT h.child_depth_num ' ||
1438 ' FROM ' || p_hier_table_name || ' h ' ||
1439 ' WHERE h.hierarchy_obj_def_id = :1 AND ' ||
1440 ' h.child_id = :2 AND h.child_value_set_id = :3 AND ' ||
1441 ' h.single_depth_flag = ''Y'' ';
1442
1443 OPEN l_root_csr for l_select_stmt
1444 USING p_hier_obj_defn_id,p_parent_id, p_parent_value_set_id;
1445 FETCH l_root_csr
1446 into l_child_depth_num;
1447 CLOSE l_root_csr;
1448
1449 IF(l_child_depth_num <> 1) -- Not a root node
1450 THEN
1451
1452 l_select_stmt := ' SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
1453 ' SELECT 1 FROM ' || p_hier_table_name ||
1454 ' WHERE hierarchy_obj_def_id = :1 ' ||
1455 ' AND parent_id = :2 ' ||
1456 ' AND child_id <> :3 ' ||
1457 ' AND parent_value_set_id = :4 ' ||
1458 ' AND single_depth_flag = ''Y'' )';
1459
1460 OPEN l_imm_parent_child_csr for l_select_stmt
1461 USING p_hier_obj_defn_id, p_parent_id,
1462 p_focus_node,p_parent_value_set_id;
1463 FETCH l_imm_parent_child_csr
1464 into l_imm_child_flag;
1465 CLOSE l_imm_parent_child_csr;
1466
1467
1468
1469
1470
1471 IF(l_imm_child_flag <> 'Y') -- No children.Insert leaf row.
1472 THEN
1473
1474 /* Fetch parent's parent data.
1475 * The display_order_number, weighting_pct
1476 * fetched here will be used while
1477 * inserting leaf row.*/
1478
1482 ' display_order_num,weighting_pct ' ||
1479 l_select_stmt := ' SELECT parent_id, parent_depth_num, ' ||
1480 ' child_id, child_depth_num, ' ||
1481 ' parent_value_set_id, child_value_set_id, ' ||
1483 ' FROM ' || p_hier_table_name || ' h ' ||
1484 ' WHERE h.hierarchy_obj_def_id = :1 ' ||
1485 ' AND h.child_id = :2 ' ||
1486 ' AND h.child_value_set_id = :3 ' ||
1487 ' AND h.single_depth_flag = ''Y'' ';
1488
1489 OPEN l_imm_parent_csr for l_select_stmt
1490 USING p_hier_obj_defn_id, p_parent_id,p_parent_value_set_id;
1491 LOOP
1492 FETCH l_imm_parent_csr
1493 into l_parent_id, l_parent_depth_num,l_child_id, l_child_depth_num,
1494 l_parent_value_set_id,l_child_value_set_id,l_display_order_num,l_weighting_pct;
1495 EXIT WHEN l_imm_parent_csr%NOTFOUND;
1496 END LOOP;
1497 CLOSE l_imm_parent_csr;
1498
1499 --Bug#4240532, Provide column list for insert stmt
1500
1501 l_leaf_flat_stmt := ' INSERT INTO '|| p_hier_table_name ||
1502 ' ( '||
1503 'HIERARCHY_OBJ_DEF_ID, '||
1504 'PARENT_DEPTH_NUM, '||
1505 'PARENT_ID, '||
1506 'PARENT_VALUE_SET_ID, '||
1507 'CHILD_DEPTH_NUM, '||
1508 'CHILD_ID, '||
1509 'CHILD_VALUE_SET_ID, '||
1510 'SINGLE_DEPTH_FLAG,'||
1511 'DISPLAY_ORDER_NUM,'||
1512 'WEIGHTING_PCT, ' ||
1513 'CREATION_DATE,'||
1514 'CREATED_BY, '||
1515 'LAST_UPDATED_BY,'||
1516 'LAST_UPDATE_DATE,'||
1517 'LAST_UPDATE_LOGIN, '||
1518 'OBJECT_VERSION_NUMBER) '||
1519 ' values '||
1520 '( :1, '||
1521 ' :lparentdepthnum,'||
1522 ' :lparentid,'||
1523 ' :lparentvaluesetid,'||
1524 ' :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)' ;
1525 EXECUTE immediate l_leaf_flat_stmt
1526 USING p_hier_obj_defn_id,l_child_depth_num,
1527 l_child_id,l_child_value_set_id,
1528 l_child_depth_num ,l_child_id,l_child_value_set_id,
1529 'N',l_display_order_num,
1530 l_weighting_pct, g_current_date,
1531 g_current_user_id,g_current_user_id,
1532 g_current_date,g_current_login_id,l_stat;
1533 END IF;
1534 END IF;
1535
1536
1537
1538
1539 /* Remove flattened entries of the focus node
1540 * where focus node is the child
1541 */
1542
1543 execute immediate 'Delete '||p_hier_table_name||
1544 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1545 ' and child_id = '||p_focus_node ||
1546 ' and child_value_set_id = '||p_focus_value_set_id||
1547 ' and single_depth_flag = ''N''';
1548 -- End Bug#4022561
1549
1550
1551
1552
1553 else
1554
1555 -- Start Bug#4022561
1556
1557 /* Remove any flattened entries of the immediate
1558 * children of the deleted member
1559 */
1560
1561 IF(p_operation = 'RemoveImmChildren') THEN
1562 l_imm_delete_stmt := 'DELETE FROM ' || p_hier_table_name ||
1563 ' WHERE hierarchy_obj_def_id = :1 ' ||
1564 ' AND child_id = :2 ' ||
1565 ' AND single_depth_flag = ''N''';
1566
1567
1568 EXECUTE IMMEDIATE l_imm_delete_stmt
1569 using p_hier_obj_defn_id , p_imm_child_id;
1570
1571 RETURN;
1572
1573 END IF;
1574
1575 -- End Bug#4022561
1576
1577
1578 l_chi_stmt := 'Select child_id '||
1579 ' from '||p_hier_table_name||
1580 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1581 ' and parent_id = :1 '||
1582 ' and single_depth_flag = ''N''';
1583
1584 l_del_stmt := 'Delete '||p_hier_table_name||
1585 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1586 ' and child_id = :1 '||
1587 ' and single_depth_flag = ''N''';
1588
1589 open dhm_chi_cur for l_chi_stmt
1590 using p_focus_node;
1591 Loop
1592 Fetch dhm_chi_cur bulk collect into l_child_ids_tbl limit 500;
1593
1594 if l_child_ids_tbl.count = 0 then
1595 exit;
1596 end if;
1597
1598 Forall i in 1..l_child_ids_tbl.count
1599 EXECUTE IMMEDIATE l_del_stmt
1600 using l_child_ids_tbl(i);
1601
1602 commit;
1603 End Loop;
1604
1605 -- Start Bug#4022561
1606
1610 */
1607 /* Check if the immediate parent of the deleted
1608 * member has any other children. If not,insert a leaf
1609 * entry for the parent node only if it is not a root.
1611
1612
1613
1614 l_select_stmt := ' SELECT h.child_depth_num ' ||
1615 ' FROM ' || p_hier_table_name || ' h ' ||
1616 ' WHERE h.hierarchy_obj_def_id = :1 AND ' ||
1617 ' h.child_id = :2 AND ' ||
1618 ' h.single_depth_flag = ''Y'' ';
1619
1620 OPEN l_root_csr for l_select_stmt
1621 USING p_hier_obj_defn_id,p_parent_id;
1622 FETCH l_root_csr
1623 into l_child_depth_num;
1624 CLOSE l_root_csr;
1625
1626 IF(l_child_depth_num <> 1) -- Not a root node
1627 THEN
1628
1629 l_select_stmt := ' SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
1630 ' SELECT 1 FROM ' || p_hier_table_name ||
1631 ' WHERE hierarchy_obj_def_id = :1 ' ||
1632 ' AND parent_id = :2 ' ||
1633 ' AND child_id <> :3 ' ||
1634 ' AND single_depth_flag = ''Y'' )';
1635
1636 OPEN l_imm_parent_child_csr for l_select_stmt
1637 USING p_hier_obj_defn_id, p_parent_id,
1638 p_focus_node;
1639 FETCH l_imm_parent_child_csr
1640 into l_imm_child_flag;
1641 CLOSE l_imm_parent_child_csr;
1642
1643
1644
1645
1646
1647 IF(l_imm_child_flag <> 'Y') -- No children.Insert leaf row.
1648 THEN
1649
1650 /* Fetch parent's parent data.
1651 * The display_order_number, weighting_pct
1652 * fetched here will be used while
1653 * inserting leaf row.*/
1654
1655 l_select_stmt := ' SELECT parent_id, parent_depth_num, ' ||
1656 ' child_id, child_depth_num, ' ||
1657 ' display_order_num,weighting_pct ' ||
1658 ' FROM ' || p_hier_table_name || ' h ' ||
1659 ' WHERE h.hierarchy_obj_def_id = :1 ' ||
1660 ' AND h.child_id = :2 ' ||
1661 ' AND h.single_depth_flag = ''Y'' ';
1662
1663 OPEN l_imm_parent_csr for l_select_stmt
1664 USING p_hier_obj_defn_id, p_parent_id;
1665 LOOP
1666 FETCH l_imm_parent_csr
1667 into l_parent_id, l_parent_depth_num,l_child_id, l_child_depth_num,
1668 l_display_order_num,l_weighting_pct;
1669 EXIT WHEN l_imm_parent_csr%NOTFOUND;
1670 END LOOP;
1671 CLOSE l_imm_parent_csr;
1672
1673 --Bug#4240532, Provide column list for insert stmt
1674
1675 l_leaf_flat_stmt := 'INSERT INTO '||p_hier_table_name||
1676 ' ( '||
1677 'HIERARCHY_OBJ_DEF_ID, '||
1678 'PARENT_DEPTH_NUM, '||
1679 'PARENT_ID, '||
1680 'CHILD_DEPTH_NUM, '||
1681 'CHILD_ID, '||
1682 'SINGLE_DEPTH_FLAG,'||
1683 'DISPLAY_ORDER_NUM,'||
1684 'WEIGHTING_PCT, ' ||
1685 'CREATION_DATE,'||
1686 'CREATED_BY, '||
1687 'LAST_UPDATED_BY,'||
1688 'LAST_UPDATE_DATE,'||
1689 'LAST_UPDATE_LOGIN, '||
1690 'OBJECT_VERSION_NUMBER) '||
1691 ' values '||
1692 '( :1, '||
1693 ' :lparentdepthnum,'||
1694 ' :lparentid,'||
1695 ' :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12)' ;
1696
1697
1698 EXECUTE immediate l_leaf_flat_stmt
1699 USING p_hier_obj_defn_id,l_child_depth_num,
1700 l_child_id,
1701 l_child_depth_num ,l_child_id,
1702 'N',l_display_order_num,
1703 l_weighting_pct, g_current_date,
1704 g_current_user_id,g_current_user_id,
1705 g_current_date,g_current_login_id,l_stat;
1706 END IF;
1707 END IF;
1708
1709
1710
1711 /* Remove flattened entries of the focus node
1712 * where focus node is the child
1713 */
1714
1715 execute immediate 'Delete '||p_hier_table_name||
1716 ' where hierarchy_obj_def_id = '||p_hier_obj_defn_id||
1717 ' and child_id = '||p_focus_node ||
1718 ' and single_depth_flag = ''N''';
1719 -- End Bug#4022561
1720
1721
1722
1723
1724
1725 end if;
1726
1727 --
1728 -- End standard API section.
1729 --
1730
1731 --
1732 -- Down below are again the standard end and exception sections of the API.
1733 --
1734
1735 --
1736 IF FND_API.To_Boolean ( p_commit ) THEN
1737 COMMIT WORK;
1738 END iF;
1742 --
1739 --
1740 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1741 p_data => x_msg_data );
1743 EXCEPTION
1744 --
1745 WHEN FND_API.G_EXC_ERROR THEN
1746 --
1747 ROLLBACK TO Unflatten_Focus_Node_Tree_Pvt ;
1748 x_return_status := FND_API.G_RET_STS_ERROR;
1749 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1750 p_data => x_msg_data );
1751 --
1752 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1753 --
1754 ROLLBACK TO Unflatten_Focus_Node_Tree_Pvt ;
1755 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1756 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1757 p_data => x_msg_data );
1758 --
1759 WHEN OTHERS THEN
1760 --
1761 ROLLBACK TO Unflatten_Focus_Node_Tree_Pvt ;
1762 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1763 --
1764 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1765 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
1766 l_api_name);
1767 END if;
1768 --
1769 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1770 p_data => x_msg_data );
1771 --
1772
1773 End Unflatten_Focus_Node_Tree;
1774
1775 /*===========================================================================+
1776 | PROCEDURE Flatten_Whole_Hier_Version_CP |
1777 +===========================================================================*/
1778
1779 --
1780 -- The concurrent program to flatten the whole hierarchy version.
1781 --
1782
1783 PROCEDURE Flatten_Whole_Hier_Version_CP
1784 (
1785 errbuf OUT NOCOPY VARCHAR2 ,
1786 retcode OUT NOCOPY VARCHAR2 ,
1787 --
1788 p_hierarchy_id IN NUMBER ,
1789 p_hier_obj_defn_id IN NUMBER
1790 )
1791 IS
1792
1793 --
1794 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Whole_Hier_Version_CP';
1795 l_api_version CONSTANT NUMBER := 1.0 ;
1796 --
1797 l_return_status VARCHAR2(1);
1798 l_msg_count number;
1799 l_msg_data varchar2(2000);
1800
1801 BEGIN
1802
1803 retcode := 0 ;
1804 Flatten_Whole_Hier_Version
1805 (
1806 p_api_version => 1.0,
1807 x_return_status => l_return_status ,
1808 x_msg_count => l_msg_count,
1809 x_msg_data => l_msg_data,
1810 --
1811 p_hier_obj_defn_id => p_hier_obj_defn_id
1812 );
1813
1814 COMMIT WORK;
1815
1816 EXCEPTION
1817
1818 WHEN FND_API.G_EXC_ERROR THEN
1819 --
1820 retcode := 2 ;
1821 COMMIT WORK ;
1822 --
1823 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1824 --
1825 retcode := 2 ;
1826 COMMIT WORK ;
1827 --
1828 WHEN OTHERS THEN
1829
1830 --
1831 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1832 --
1833 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,
1834 l_api_name ) ;
1835 END IF ;
1836 --
1837 retcode := 2 ;
1838 COMMIT WORK ;
1839 --
1840
1841 End Flatten_Whole_Hier_Version_CP;
1842
1843
1844 /*===========================================================================+
1845 | PROCEDURE Flatten_Focus_Node_CP |
1846 +===========================================================================*/
1847
1848 --
1849 -- The concurrent program
1850 -- flattens the immediate children of the
1851 -- focus node specified if the operation is 'Add'
1852 -- flattens all the child nodes under the focus
1853 -- node tree if the operation is 'Move'
1854 -- Unflattens or deletes flattening details
1855 -- of all the child nodes under the given
1856 -- focus node tree if the operation is 'Remove'.
1857 --
1858
1859 PROCEDURE Flatten_Focus_Node_CP
1860 (
1861 errbuf OUT NOCOPY VARCHAR2 ,
1862 retcode OUT NOCOPY VARCHAR2 ,
1863 --
1864 p_hier_obj_defn_id IN NUMBER ,
1865 p_hier_table_name IN VARCHAR2 ,
1866 p_focus_node IN NUMBER ,
1867 p_focus_value_set_id IN NUMBER ,
1868 p_parent_id IN NUMBER ,
1869 p_parent_value_set_id IN NUMBER ,
1870 p_imm_child_id IN NUMBER ,
1871 p_imm_child_value_set_id IN NUMBER ,
1872 p_operation IN VARCHAR2
1873 )
1874 IS
1875
1876 --
1877 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Focus_Node_CP';
1878 l_api_version CONSTANT NUMBER := 1.0 ;
1879 --
1880 l_return_status VARCHAR2(1);
1881 l_msg_count number;
1882 l_msg_data varchar2(2000);
1883
1884 BEGIN
1885
1886 retcode := 0 ;
1887
1888 if (p_operation = 'Add') then
1889 Flatten_Focus_Node
1890 (
1891 p_api_version => 1.0,
1892 x_return_status => l_return_status ,
1893 x_msg_count => l_msg_count,
1897 p_hier_table_name => p_hier_table_name,
1894 x_msg_data => l_msg_data,
1895 --
1896 p_hier_obj_defn_id => p_hier_obj_defn_id,
1898 p_focus_node => p_focus_node,
1899 p_focus_value_set_id => p_focus_value_set_id
1900 );
1901
1902 if l_return_status = FND_API.G_RET_STS_ERROR THEN
1903 RAISE FND_API.G_EXC_ERROR ;
1904 end if;
1905
1906 elsif (p_operation = 'Move') then
1907 Flatten_Focus_Node_Tree
1908 (
1909 p_api_version => 1.0,
1910 x_return_status => l_return_status ,
1911 x_msg_count => l_msg_count,
1912 x_msg_data => l_msg_data,
1913 --
1914 p_hier_obj_defn_id => p_hier_obj_defn_id,
1915 p_hier_table_name => p_hier_table_name,
1916 p_focus_node => p_focus_node,
1917 p_focus_value_set_id => p_focus_value_set_id
1918 );
1919 elsif (p_operation = 'Remove') then
1920 Unflatten_Focus_Node_Tree
1921 (
1922 p_api_version => 1.0,
1923 x_return_status => l_return_status ,
1924 x_msg_count => l_msg_count,
1925 x_msg_data => l_msg_data,
1926 --
1927 p_hier_obj_defn_id => p_hier_obj_defn_id,
1928 p_hier_table_name => p_hier_table_name,
1929 p_focus_node => p_focus_node,
1930 p_focus_value_set_id => p_focus_value_set_id,
1931 p_parent_id => p_parent_id,
1932 p_parent_value_set_id => p_parent_value_set_id,
1933 p_imm_child_id => p_imm_child_id,
1934 p_imm_child_value_set_id => p_imm_child_value_set_id,
1935 p_operation => p_operation
1936 );
1937
1938 -- Start Bug#4022561
1939
1940 elsif (p_operation = 'RemoveImmChildren') then
1941 Unflatten_Focus_Node_Tree
1942 (
1943 p_api_version => 1.0,
1944 x_return_status => l_return_status ,
1945 x_msg_count => l_msg_count,
1946 x_msg_data => l_msg_data,
1947 --
1948 p_hier_obj_defn_id => p_hier_obj_defn_id,
1949 p_hier_table_name => p_hier_table_name,
1950 p_focus_node => p_focus_node,
1951 p_focus_value_set_id => p_focus_value_set_id,
1952 p_parent_id => p_parent_id,
1953 p_parent_value_set_id => p_parent_value_set_id,
1954 p_imm_child_id => p_imm_child_id,
1955 p_imm_child_value_set_id => p_imm_child_value_set_id,
1956 p_operation => p_operation
1957 );
1958
1959 -- End Bug#4022561
1960
1961 end if;
1962
1963 COMMIT WORK;
1964
1965 EXCEPTION
1966
1967 WHEN FND_API.G_EXC_ERROR THEN
1968 --
1969 retcode := 2 ;
1970 COMMIT WORK ;
1971 --
1972 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1973 --
1974 retcode := 2 ;
1975 COMMIT WORK ;
1976 --
1977 WHEN OTHERS THEN
1978
1979 --
1980 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1981 --
1982 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,
1983 l_api_name ) ;
1984 END IF ;
1985 --
1986 retcode := 2 ;
1987 COMMIT WORK ;
1988 --
1989
1990 End Flatten_Focus_Node_CP;
1991
1992 /*===========================================================================+
1993 | PROCEDURE Insert_Root_Node |
1994 +===========================================================================*/
1995 --
1996 -- The API to insert Root Nodes.
1997 --
1998 PROCEDURE Insert_Root_Node (
1999 p_api_version IN NUMBER ,
2000 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
2001 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
2002 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
2003 p_return_status OUT NOCOPY VARCHAR2 ,
2004 p_msg_count OUT NOCOPY NUMBER ,
2005 p_msg_data OUT NOCOPY VARCHAR2 ,
2006 p_rowid IN OUT NOCOPY VARCHAR2,
2007 p_vs_required_flag IN VARCHAR2,
2008 p_hier_table_name IN VARCHAR2,
2009 p_hier_obj_def_id IN NUMBER,
2010 p_parent_depth_num IN NUMBER,
2011 p_parent_id IN NUMBER,
2012 p_parent_value_set_id IN NUMBER,
2013 p_child_depth_num IN NUMBER,
2014 p_child_id IN NUMBER,
2015 p_child_value_set_id IN NUMBER,
2016 p_single_depth_flag IN VARCHAR2,
2017 p_display_order_num IN NUMBER,
2018 p_weighting_pct IN NUMBER ) IS
2019
2020 l_sql_stmt VARCHAR2(2000);
2021 l_creation_date DATE ;
2022 l_created_by NUMBER ;
2023 l_last_update_date DATE ;
2024 l_last_Updated_by NUMBER ;
2025 l_last_update_login NUMBER ;
2026
2027 BEGIN
2028
2029 SAVEPOINT Insert_Root_Node_Pvt ;
2030
2031
2032 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
2033
2034 FND_MSG_PUB.initialize ;
2035
2036 END IF;
2037
2038 p_return_status := FND_API.G_RET_STS_SUCCESS ;
2039 l_creation_date := SYSDATE ;
2040 l_last_update_date := SYSDATE;
2041 l_last_Updated_by := FND_GLOBAL.User_Id;
2042 l_created_by := FND_GLOBAL.User_Id;
2043 l_last_update_login := FND_GLOBAL.Login_Id ;
2044
2045 IF p_vs_required_flag = 'Y' THEN
2046 l_sql_stmt := 'INSERT INTO '||p_hier_table_name||
2047 ' ( '||
2048 'HIERARCHY_OBJ_DEF_ID, '||
2049 'PARENT_DEPTH_NUM, '||
2050 'PARENT_ID, '||
2051 'PARENT_VALUE_SET_ID, '||
2052 'CHILD_DEPTH_NUM, '||
2053 'CHILD_ID, '||
2054 'CHILD_VALUE_SET_ID, '||
2055 'SINGLE_DEPTH_FLAG,'||
2056 'DISPLAY_ORDER_NUM,'||
2057 'CREATION_DATE,'||
2058 'CREATED_BY, '||
2059 'LAST_UPDATED_BY,'||
2060 'LAST_UPDATE_DATE,'||
2061 'LAST_UPDATE_LOGIN, '||
2062 'OBJECT_VERSION_NUMBER) '||
2063 ' VALUES ('||
2064 p_hier_obj_def_id||','||
2065 p_parent_depth_num||','||
2066 p_parent_id||','||
2067 p_parent_value_set_id||','||
2068 p_child_depth_num||','||
2069 p_child_id||','||
2070 p_child_value_set_id||','''||
2071 p_single_depth_flag||''','||
2072 p_display_order_num||','''||
2073 sysdate||''','||
2074 l_created_by||','||
2075 l_last_Updated_by||','''||
2076 sysdate||''','||
2077 l_last_update_login ||','||1||')';
2078 ELSE
2079 l_sql_stmt := 'INSERT INTO '||p_hier_table_name||
2080 ' ( '||
2081 'HIERARCHY_OBJ_DEF_ID, '||
2082 'PARENT_DEPTH_NUM, '||
2083 'PARENT_ID, '||
2084 'CHILD_DEPTH_NUM, '||
2085 'CHILD_ID, '||
2086 'SINGLE_DEPTH_FLAG,'||
2087 'DISPLAY_ORDER_NUM,'||
2088 'CREATION_DATE,'||
2089 'CREATED_BY, '||
2090 'LAST_UPDATED_BY,'||
2091 'LAST_UPDATE_DATE,'||
2092 'LAST_UPDATE_LOGIN, '||
2093 'OBJECT_VERSION_NUMBER) '||
2094 ' VALUES ('||
2095 p_hier_obj_def_id||','||
2096 p_parent_depth_num||','||
2097 p_parent_id||','||
2098 p_child_depth_num||','||
2099 p_child_id||','''||
2100 p_single_depth_flag||''','||
2101 p_display_order_num||','''||
2102 sysdate||''','||
2103 l_created_by||','||
2104 l_last_Updated_by||','''||
2105 sysdate||''','||
2106 l_last_update_login ||','||1||')';
2107 END IF;
2108 execute immediate l_sql_stmt;
2109
2110 IF (sql%notfound) then
2111
2112 RAISE no_data_found;
2113
2114 END IF;
2115
2116 IF FND_API.To_Boolean ( p_commit ) THEN
2117
2118 COMMIT WORK;
2119
2120 END iF;
2121
2122 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2123 p_data => p_msg_data );
2124
2125 EXCEPTION
2126 WHEN FND_API.G_EXC_ERROR THEN
2127
2128 ROLLBACK TO Insert_Root_Node_Pvt ;
2129
2130 p_return_status := FND_API.G_RET_STS_ERROR;
2131
2132 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2133 p_data => p_msg_data );
2134
2135 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2136
2137 ROLLBACK TO Insert_Root_Node_Pvt ;
2138 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2139
2140 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2141 p_data => p_msg_data );
2142
2143 WHEN OTHERS THEN
2144
2145 ROLLBACK TO Insert_Root_Node_Pvt ;
2146 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2147
2148 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2149 p_data => p_msg_data );
2150
2151
2152 END Insert_Root_Node;
2153
2154 /*===========================================================================+
2155 | PROCEDURE Launch_Dup_Hier_Process |
2156 +===========================================================================*/
2157 --
2158 -- The concurrent program to duplicate a Hierarchy.
2159 --
2160
2161 PROCEDURE Launch_Dup_Hier_Process(ERRBUFF IN OUT NOCOPY VARCHAR2,
2162 RETCODE IN OUT NOCOPY VARCHAR2,
2163 p_hier_table_name IN VARCHAR2,
2164 p_src_hier_obj_id IN NUMBER,
2165 p_dest_hier_name IN VARCHAR2,
2166 p_dest_hier_desc in VARCHAR2,
2167 p_dest_hier_folder_id IN NUMBER,
2168 p_src_hier_version_id IN NUMBER,
2169 p_dest_version_name IN VARCHAR2,
2170 p_dest_version_desc IN VARCHAR2,
2171 p_dest_start_date IN VARCHAR2,
2172 p_dest_end_date IN VARCHAR2)
2173 is
2174
2175 l_msg_count NUMBER;
2176 l_return_status VARCHAR2(1);
2177 l_msg_data VARCHAR2(630);
2178 l_dest_start_date DATE;
2179 l_dest_end_date DATE;
2180
2181 begin
2182
2183 l_dest_start_date := fnd_date.canonical_to_date(p_dest_start_date);
2184 l_dest_end_date := fnd_date.canonical_to_date(p_dest_end_date);
2185
2186 duplicate_hierarchy (p_api_version => 1.0,
2187 p_return_status => l_return_status,
2188 p_msg_count => l_msg_count,
2189 p_msg_data => l_msg_data,
2190 p_hier_table_name => p_hier_table_name,
2191 p_src_hier_obj_id => p_src_hier_obj_id,
2192 p_dest_hier_name => p_dest_hier_name,
2193 p_dest_hier_desc => p_dest_hier_desc,
2194 p_dest_hier_folder_id => p_dest_hier_folder_id,
2195 p_src_hier_version_id => p_src_hier_version_id,
2196 p_dest_version_name => p_dest_version_name,
2197 p_dest_version_desc => p_dest_version_desc,
2198 p_dest_start_date => l_dest_start_date,
2199 p_dest_end_date => l_dest_end_date);
2200
2201 if l_return_status in ('U', 'E') then
2202 RETCODE := 2;
2203 ERRBUFF := l_msg_data;
2204 else
2205 RETCODE := 0;
2206 ERRBUFF := l_msg_data;
2207 end if;
2208
2209 end Launch_Dup_Hier_Process;
2210
2211 /*===========================================================================+
2212 | PROCEDURE Duplicate_Hierarchy |
2213 +===========================================================================*/
2214
2215 --
2216 -- The API to duplicate a Hierarchy.
2217 --
2218 PROCEDURE Duplicate_Hierarchy (
2219 p_api_version IN NUMBER ,
2220 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
2221 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
2222 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
2223 p_return_status OUT NOCOPY VARCHAR2 ,
2224 p_msg_count OUT NOCOPY NUMBER ,
2225 p_msg_data OUT NOCOPY VARCHAR2 ,
2226 p_hier_table_name IN VARCHAR2,
2227 p_src_hier_obj_id IN NUMBER,
2228 p_dest_hier_name IN VARCHAR2,
2229 p_dest_hier_desc IN VARCHAR2,
2230 p_dest_hier_folder_id IN NUMBER,
2231 p_src_hier_version_id IN NUMBER,
2232 p_dest_version_name IN VARCHAR2,
2233 p_dest_version_desc IN VARCHAR2,
2234 p_dest_start_date IN DATE,
2235 p_dest_end_date IN DATE) IS
2236
2237 l_creation_date DATE ;
2238 l_created_by NUMBER ;
2239 l_last_update_date DATE ;
2240 l_last_Updated_by NUMBER ;
2241 l_last_update_login NUMBER ;
2242
2243 l_new_object_id NUMBER;
2244 l_row_id ROWID;
2245
2246 l_api_name CONSTANT VARCHAR2(30) := 'Duplicate_Hierarchy' ;
2247 l_api_version CONSTANT NUMBER := 1.0;
2248
2249 l_hier_dim_groups_rec FEM_HIER_DIMENSION_GRPS%rowtype;
2250 l_object_catalog_details_rec FEM_OBJECT_CATALOG_VL%rowtype;
2251 l_hier_details_rec FEM_HIERARCHIES%rowtype;
2252
2253 cursor l_hier_dim_groups_csr (p_hierarchy_obj_id in NUMBER)
2254 is
2255 select *
2256 from fem_hier_dimension_grps
2257 where hierarchy_obj_id = p_hierarchy_obj_id;
2258
2259 cursor l_hier_value_sets_csr (p_hierarchy_obj_id in NUMBER)
2260 is
2261 select *
2262 from fem_hier_value_sets
2263 where hierarchy_obj_id = p_hierarchy_obj_id;
2264
2265 cursor l_hier_details_csr (p_hierarchy_obj_id in NUMBER)
2266 is
2267 select *
2268 from fem_hierarchies
2269 where hierarchy_obj_id = p_hierarchy_obj_id;
2270
2271 cursor l_object_catalog_details_csr (p_object_id in NUMBER)
2272 is
2273 select *
2274 from fem_object_catalog_vl
2275 where object_id = p_object_id;
2276
2277 begin
2278
2279 SAVEPOINT Dup_Hier_Pvt ;
2280
2281 if not FND_API.Compatible_API_Call ( l_api_version,
2282 p_api_version,
2283 l_api_name,
2284 G_PKG_NAME )
2285 then
2286 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2287 end if;
2288
2289 if FND_API.to_Boolean ( p_init_msg_list ) then
2290 FND_MSG_PUB.initialize ;
2291 end if;
2292
2293 p_return_status := FND_API.G_RET_STS_SUCCESS ;
2294
2295 l_creation_date := SYSDATE ;
2296 l_last_update_date := SYSDATE;
2297 l_last_Updated_by := FND_GLOBAL.User_Id;
2298 l_created_by := FND_GLOBAL.User_Id;
2299 l_last_update_login := FND_GLOBAL.Login_Id ;
2300
2301 open l_object_catalog_details_csr (p_object_id => p_src_hier_obj_id);
2302 fetch l_object_catalog_details_csr into l_object_catalog_details_rec;
2303 close l_object_catalog_details_csr;
2304
2305 open l_hier_details_csr (p_hierarchy_obj_id => p_src_hier_obj_id);
2306 fetch l_hier_details_csr into l_hier_details_rec;
2307 close l_hier_details_csr;
2308
2309 select fem_object_id_seq.nextval
2310 into l_new_object_id
2311 from dual;
2312
2313 -- dbms_output.put_line('duplicate_hierarchy: l_new_object_id = '||l_new_object_id);
2314 FEM_OBJECT_CATALOG_PKG.insert_row(
2315 X_ROWID => l_row_id,
2316 X_OBJECT_ID => l_new_object_id,
2317 X_OBJECT_TYPE_CODE => l_object_catalog_details_rec.object_type_code,
2318 X_FOLDER_ID => p_dest_hier_folder_id,
2319 X_LOCAL_VS_COMBO_ID => l_object_catalog_details_rec.local_vs_combo_id,
2320 X_OBJECT_ACCESS_CODE => l_object_catalog_details_rec.object_access_code,
2321 X_OBJECT_ORIGIN_CODE => l_object_catalog_details_rec.object_origin_code,
2322 X_OBJECT_VERSION_NUMBER => 1,
2323 X_OBJECT_NAME => p_dest_hier_name,
2324 X_DESCRIPTION => p_dest_hier_desc,
2325 X_CREATION_DATE => l_creation_date,
2326 X_CREATED_BY => l_created_by,
2327 X_LAST_UPDATE_DATE => l_last_update_date,
2328 X_LAST_UPDATED_BY => l_last_updated_by,
2329 X_LAST_UPDATE_LOGIN => l_last_update_login);
2330
2331 INSERT INTO fem_hierarchies
2332 (hierarchy_obj_id,
2333 dimension_id,
2334 hierarchy_type_code,
2335 group_sequence_enforced_code,
2336 multi_top_flag,
2337 financial_category_flag,
2338 value_set_id, -- ??? may go away
2339 calendar_id,
2340 period_type,
2341 personal_flag,
2342 flattened_rows_flag,
2343 hierarchy_usage_code,
2344
2345 multi_value_set_flag,
2346 object_version_number,
2347 creation_date,
2348 created_by,
2349 last_updated_by,
2350 last_update_date,
2351 last_update_login)
2352 VALUES
2353 (l_new_object_id,
2354 l_hier_details_rec.dimension_id,
2355 l_hier_details_rec.hierarchy_type_code,
2356 l_hier_details_rec.group_sequence_enforced_code,
2357 l_hier_details_rec.multi_top_flag,
2358 l_hier_details_rec.financial_category_flag,
2359 l_hier_details_rec.value_set_id, -- ??? may go away
2360 l_hier_details_rec.calendar_id,
2361 l_hier_details_rec.period_type,
2362 l_hier_details_rec.personal_flag,
2363 l_hier_details_rec.flattened_rows_flag,
2364 l_hier_details_rec.hierarchy_usage_code,
2365 l_hier_details_rec.multi_value_set_flag,
2366 1,
2367 l_creation_date,
2368 l_created_by,
2369 l_last_updated_by,
2370 l_last_update_date,
2371 l_last_update_login);
2372
2373
2374 for l_hier_dim_groups_rec in l_hier_dim_groups_csr (p_hierarchy_obj_id => p_src_hier_obj_id) loop
2375
2376 INSERT INTO fem_hier_dimension_grps
2377 (dimension_group_id,
2378 hierarchy_obj_id,
2379 relative_dimension_group_seq,
2380 creation_date,
2381 created_by,
2382 last_updated_by,
2383 last_update_date,
2384 last_update_login,
2385 object_version_number)
2386 VALUES
2387 (l_hier_dim_groups_rec.dimension_group_id,
2388 l_new_object_id,
2389 l_hier_dim_groups_rec.relative_dimension_group_seq,
2390 l_creation_date,
2391 l_created_by,
2392 l_last_updated_by,
2393 l_last_update_date,
2394 l_last_update_login,
2395 1);
2396
2397 end loop;
2398
2399 for l_hier_value_sets_rec in l_hier_value_sets_csr (p_hierarchy_obj_id => p_src_hier_obj_id) loop
2400
2401 INSERT INTO fem_hier_value_sets
2402 (hierarchy_obj_id,
2403 value_set_id,
2404 creation_date,
2405 created_by,
2406 last_updated_by,
2407 last_update_date,
2408 last_update_login,
2409 object_version_number)
2410 VALUES
2411 (l_new_object_id,
2412 l_hier_value_sets_rec.value_set_id,
2413 l_creation_date,
2414 l_created_by,
2415 l_last_updated_by,
2416 l_last_update_date,
2417 l_last_update_login,
2418 1);
2419
2420 end loop;
2421 -- dbms_output.put_line('duplicate_hierarchy: calling dup_hier_version...');
2422
2423 duplicate_hier_version(p_api_version => 1.0,
2424 p_return_status => p_return_status,
2425 p_msg_count => p_msg_count,
2426 p_msg_data => p_msg_data,
2427 p_hier_table_name => p_hier_table_name,
2428 p_src_hier_obj_id => p_src_hier_obj_id,
2429 p_dest_hier_obj_id => l_new_object_id,
2430 p_src_hier_version_id => p_src_hier_version_id,
2431 p_dest_version_name => p_dest_version_name,
2432 p_dest_version_desc => p_dest_version_desc,
2433 p_dest_start_date => p_dest_start_date,
2434 p_dest_end_date => p_dest_end_date);
2435
2436 if p_return_status <> 'S' then
2437 RAISE FND_API.G_EXC_ERROR;
2438 end if;
2439
2440 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2441 p_data => p_msg_data );
2442
2443 EXCEPTION
2444 WHEN FND_API.G_EXC_ERROR THEN
2445 ROLLBACK TO Dup_Hier_Pvt;
2446 p_return_status := FND_API.G_RET_STS_ERROR;
2447 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2448 p_data => p_msg_data );
2449
2450 p_msg_data := sqlerrm;
2451
2452 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2453 ROLLBACK TO Dup_Hier_Pvt ;
2454 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2455 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2456 p_data => p_msg_data );
2457
2458 p_msg_data := sqlerrm;
2459 WHEN OTHERS THEN
2460 ROLLBACK TO Dup_Hier_Pvt ;
2461 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2462 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
2463 p_data => p_msg_data );
2464
2465 p_msg_data := sqlerrm;
2466 end Duplicate_Hierarchy;
2467
2468
2469 /*===========================================================================+
2470 | PROCEDURE Dup_Cost_Object_Hier_Data |
2471 +===========================================================================*/
2472
2473 --
2474 -- The API to duplicate Cost Object Hier Data from one version to another.
2475 --
2476 PROCEDURE Dup_Cost_Object_Hier_Data(
2477 x_return_status OUT NOCOPY VARCHAR2,
2478 x_msg_count OUT NOCOPY NUMBER,
2479 x_msg_data OUT NOCOPY VARCHAR2,
2480 p_hierarchy_id IN NUMBER,
2481 p_src_version_id IN NUMBER,
2482 p_dest_version_id IN NUMBER)
2483 IS
2484
2485 l_new_relationship_id NUMBER;
2486
2487 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2488 l_msg_count NUMBER;
2489 l_msg_data VARCHAR2(2000);
2490
2491 l_src_version_start_date DATE;
2492 l_dest_version_start_date DATE;
2493
2494 -- Cursor to find out all the relationships that are available in the
2495 -- destination Hier. Version date range but not in source Hier. Version date
2496 -- range. These relationships will be removed from the destination Hier.
2497 -- Version.
2498
2499 CURSOR l_dest_version_hier_data_csr(c_hierarchy_id IN NUMBER,
2500 c_src_version_start_date IN DATE,
2501 c_dest_version_start_date IN DATE)
2502 IS
2503 SELECT parent_id,
2504 child_id,
2505 child_sequence_num
2506 FROM fem_cost_objects_hier
2507 WHERE hierarchy_obj_id = c_hierarchy_id
2508 AND c_dest_version_start_date
2509 BETWEEN effective_start_date AND effective_end_date
2510 MINUS
2511 SELECT parent_id,
2512 child_id,
2513 child_sequence_num
2514 FROM fem_cost_objects_hier
2515 WHERE hierarchy_obj_id = c_hierarchy_id
2516 AND c_src_version_start_date
2517 BETWEEN effective_start_date AND effective_end_date;
2518
2519 -- Cursor to find out all the relationships that are available in the
2520 -- source Hier. Version date range but not in destination Hier. Version date
2521 -- range. These relationships will be added to the destination Hier.
2522 -- Version.
2523
2524 CURSOR l_src_version_hier_data_csr(c_hierarchy_id IN NUMBER,
2525 c_src_version_start_date IN DATE,
2526 c_dest_version_start_date IN DATE)
2527 IS
2528 SELECT parent_id,
2529 child_id,
2530 display_order_num,
2531 bom_reference,
2532 parent_qty,
2533 child_qty,
2534 yield_percentage
2535 FROM fem_cost_objects_hier fcoh,
2536 fem_cost_obj_hier_qty fcohq
2537 WHERE hierarchy_obj_id = c_hierarchy_id
2538 AND fcoh.relationship_id = fcohq.relationship_id
2539 AND c_src_version_start_date
2540 BETWEEN effective_start_date AND effective_end_date
2541 MINUS
2542 SELECT parent_id,
2543 child_id,
2544 display_order_num,
2545 bom_reference,
2546 parent_qty,
2547 child_qty,
2548 yield_percentage
2549 FROM fem_cost_objects_hier fcoh,
2550 fem_cost_obj_hier_qty fcohq
2551 WHERE hierarchy_obj_id = c_hierarchy_id
2552 AND fcoh.relationship_id = fcohq.relationship_id
2553 AND c_dest_version_start_date
2554 BETWEEN effective_start_date AND effective_end_date;
2555
2556 CURSOR l_hier_ver_detail_csr (c_version_id IN NUMBER)
2557 IS
2558 SELECT effective_start_date
2559 FROM fem_object_definition_b
2560 WHERE object_definition_id = c_version_id;
2561
2562 BEGIN
2563
2564 SAVEPOINT Dup_Cost_Object_Hier_Data_Pvt;
2565
2566 OPEN l_hier_ver_detail_csr (c_version_id => p_src_version_id);
2567 FETCH l_hier_ver_detail_csr INTO l_src_version_start_date;
2568 CLOSE l_hier_ver_detail_csr;
2569
2570 OPEN l_hier_ver_detail_csr (c_version_id => p_dest_version_id);
2571 FETCH l_hier_ver_detail_csr INTO l_dest_version_start_date;
2572 CLOSE l_hier_ver_detail_csr;
2573
2574 FOR l_dest_version_hier_data_rec IN l_dest_version_hier_data_csr
2575 (c_hierarchy_id => p_hierarchy_id,
2576 c_src_version_start_date => l_src_version_start_date,
2577 c_dest_version_start_date => l_dest_version_start_date)
2578 LOOP
2579
2580 remove_relation(p_api_version => 1.0,
2581 x_return_status => l_return_status,
2582 x_msg_count => l_msg_count,
2583 x_msg_data => l_msg_data,
2584 p_hierarchy_id => p_hierarchy_id,
2585 p_version_id => p_dest_version_id,
2586 p_parent_id => l_dest_version_hier_data_rec.parent_id,
2587 p_child_id => l_dest_version_hier_data_rec.child_id,
2588 p_child_sequence_num => l_dest_version_hier_data_rec.child_sequence_num,
2589 p_hier_table_name => 'FEM_COST_OBJECTS_HIER',
2590 p_remove_all_children_flag => 'N');
2591
2592 IF l_return_status = FND_API.G_RET_STS_ERROR
2593 THEN
2594 RAISE FND_API.G_EXC_ERROR ;
2595 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
2596 THEN
2597 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2598 END IF;
2599
2600 END LOOP;
2601
2602 FOR l_src_version_hier_data_rec IN l_src_version_hier_data_csr
2603 (c_hierarchy_id => p_hierarchy_id,
2604 c_src_version_start_date => l_src_version_start_date,
2605 c_dest_version_start_date => l_dest_version_start_date)
2606 LOOP
2607
2608 Add_Relation(p_api_version => 1.0,
2609 x_return_status => l_return_status,
2610 x_msg_count => l_msg_count,
2611 x_msg_data => l_msg_data,
2612 p_hierarchy_id => p_hierarchy_id,
2613 p_version_id => p_dest_version_id,
2614 p_parent_id => l_src_version_hier_data_rec.parent_id,
2615 p_parent_qty => l_src_version_hier_data_rec.parent_qty,
2616 p_child_id => l_src_version_hier_data_rec.child_id,
2617 p_child_qty => l_src_version_hier_data_rec.child_qty,
2621 p_hier_table_name => 'FEM_COST_OBJECTS_HIER');
2618 p_yield_pct => l_src_version_hier_data_rec.yield_percentage,
2619 p_bom_reference => l_src_version_hier_data_rec.bom_reference,
2620 p_display_order_num=>l_src_version_hier_data_rec.display_order_num,
2622
2623 IF l_return_status = FND_API.G_RET_STS_ERROR
2624 THEN
2625 RAISE FND_API.G_EXC_ERROR ;
2626 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
2627 THEN
2628 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2629 END IF;
2630
2631 END LOOP;
2632
2633 x_return_status := FND_API.G_RET_STS_SUCCESS ;
2634
2635 EXCEPTION
2636 WHEN FND_API.G_EXC_ERROR THEN
2637
2638 ROLLBACK TO Dup_Cost_Object_Hier_Data_Pvt ;
2639 x_return_status := FND_API.G_RET_STS_ERROR;
2640 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2641 p_data => x_msg_data );
2642
2643 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2644
2645 ROLLBACK TO Dup_Cost_Object_Hier_Data_Pvt ;
2646 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2647 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2648 p_data => x_msg_data );
2649
2650 WHEN OTHERS THEN
2651
2652 ROLLBACK TO Dup_Cost_Object_Hier_Data_Pvt ;
2653 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2654
2655 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2656 p_data => x_msg_data );
2657
2658 END Dup_Cost_Object_Hier_Data;
2659
2660 /*===========================================================================+
2661 | PROCEDURE Copy_Hier_Data |
2662 +===========================================================================*/
2663
2664 --
2665 -- The API to copy Hierarchy Data from one Hierarchy to another.
2666 --
2667 PROCEDURE Copy_Hier_Data( p_return_status OUT NOCOPY VARCHAR2,
2668 p_msg_count OUT NOCOPY NUMBER,
2669 p_msg_data OUT NOCOPY VARCHAR2,
2670 p_hier_table_name IN VARCHAR2,
2671 p_src_hier_obj_id IN NUMBER,
2672
2673 p_dest_hier_obj_id IN NUMBER,
2674 p_src_hier_version_id IN NUMBER,
2675 p_dest_hier_version_id IN NUMBER)
2676 is
2677 TYPE t_rowid is TABLE OF VARCHAR2(50);
2678 TYPE t_parent_depth_num is TABLE OF fem_products_hier.parent_depth_num%TYPE;
2679 TYPE t_parent_id is TABLE OF fem_products_hier.parent_id%TYPE;
2680 TYPE t_parent_value_set_id is TABLE OF fem_products_hier.parent_value_set_id%TYPE;
2681 TYPE t_child_depth_num is TABLE OF fem_products_hier.child_depth_num%TYPE;
2682 TYPE t_child_id is TABLE OF fem_products_hier.child_id%TYPE;
2683 TYPE t_child_value_set_id is TABLE OF fem_products_hier.child_value_set_id%TYPE;
2684 TYPE t_single_depth_flag is TABLE OF fem_products_hier.single_depth_flag%TYPE;
2685 TYPE t_display_order_num is TABLE OF fem_products_hier.display_order_num%TYPE;
2686 TYPE t_weighting_pct is TABLE OF fem_products_hier.weighting_pct%TYPE;
2687
2688 t_row_id t_rowid;
2689 t_prnt_depth_num t_parent_depth_num;
2690 t_prnt_id t_parent_id;
2691 t_prnt_value_set_id t_parent_value_set_id;
2692 t_chld_depth_num t_child_depth_num;
2693 t_chld_id t_child_id;
2694 t_chld_value_set_id t_child_value_set_id;
2695 t_sngle_depth_flag t_single_depth_flag;
2696 t_dspy_order_num t_display_order_num;
2697 t_wt_pct t_weighting_pct;
2698
2699 -- The following is for Cost Object Hierarchy Data.
2700 TYPE t_co_rowid is TABLE OF VARCHAR2(50);
2701 TYPE t_co_relationship_id is TABLE OF fem_cost_objects_hier.relationship_id%TYPE;
2702 TYPE t_co_effective_start_date is TABLE OF fem_cost_objects_hier.effective_start_date%TYPE;
2703 TYPE t_co_hierarchy_obj_id is TABLE OF fem_cost_objects_hier.hierarchy_obj_id%TYPE;
2704 TYPE t_co_parent_id is TABLE OF fem_cost_objects_hier.parent_id%TYPE;
2705 TYPE t_co_child_id is TABLE OF fem_cost_objects_hier.child_id%TYPE;
2706 TYPE t_co_child_sequence_num is TABLE OF fem_cost_objects_hier.child_sequence_num%TYPE;
2707 TYPE t_co_display_order_num is TABLE OF fem_cost_objects_hier.display_order_num%TYPE;
2708 TYPE t_co_effective_end_date is TABLE OF fem_cost_objects_hier.effective_end_date%TYPE;
2709 TYPE t_co_bom_reference is TABLE OF fem_cost_objects_hier.bom_reference%TYPE;
2710
2711 TYPE t_co_dataset_code is TABLE OF fem_cost_obj_hier_qty.dataset_code%TYPE;
2712 TYPE t_co_cal_period_id is TABLE OF fem_cost_obj_hier_qty.cal_period_id%TYPE;
2713 TYPE t_co_parent_qty is TABLE OF fem_cost_obj_hier_qty.parent_qty%TYPE;
2714 TYPE t_co_child_qty is TABLE OF fem_cost_obj_hier_qty.child_qty%TYPE;
2715 TYPE t_co_yield_percentage is TABLE OF fem_cost_obj_hier_qty.yield_percentage%TYPE;
2716
2717 t_co_row_id t_co_rowid;
2718 t_co_rel_id t_co_relationship_id;
2719 t_co_eff_start_date t_co_effective_start_date;
2720 t_co_hier_obj_id t_co_hierarchy_obj_id;
2721 t_co_prnt_id t_co_parent_id;
2722 t_co_chld_id t_co_child_id;
2723 t_co_chld_sequence_num t_co_child_sequence_num;
2724 t_co_disp_order_num t_co_display_order_num;
2725 t_co_eff_end_date t_co_effective_end_date;
2726 t_co_bom_ref t_co_bom_reference;
2727
2728 t_co_ds_code t_co_dataset_code;
2729 t_co_cal_per_id t_co_cal_period_id;
2730 t_co_prnt_qty t_co_parent_qty;
2731 t_co_chld_qty t_co_child_qty;
2732
2736
2733 t_co_yld_percentage t_co_yield_percentage;
2734
2735 l_version_start_date DATE;
2737 l_creation_date DATE := sysdate;
2738 l_created_by NUMBER := fnd_global.user_id;
2739 l_last_update_date DATE := sysdate;
2740 l_last_Updated_by NUMBER := fnd_global.user_id;
2741 l_last_update_login NUMBER := fnd_global.login_id;
2742
2743 BEGIN
2744
2745 -- dbms_output.put_line('copy_hier_data: start ...');
2746
2747 SAVEPOINT Copy_Hier_Data_Pvt;
2748
2749 if p_hier_table_name = 'FEM_PRODUCTS_HIER' then
2750
2751 select rowid,
2752 parent_depth_num,
2753 parent_id,
2754 parent_value_set_id,
2755 child_depth_num,
2756 child_id,
2757 child_value_set_id,
2758 single_depth_flag,
2759 display_order_num,
2760 weighting_pct
2761 bulk collect into
2762 t_row_id,
2763 t_prnt_depth_num,
2764 t_prnt_id,
2765 t_prnt_value_set_id,
2766 t_chld_depth_num,
2767 t_chld_id,
2768 t_chld_value_set_id,
2769 t_sngle_depth_flag,
2770 t_dspy_order_num,
2771 t_wt_pct
2772 from fem_products_hier
2773 where hierarchy_obj_def_id = p_src_hier_version_id;
2774
2775 FORALL rec in t_row_id.FIRST..t_row_id.LAST
2776
2777 INSERT INTO fem_products_hier
2778 ( hierarchy_obj_def_id,
2779 parent_depth_num,
2780 parent_id ,
2781 parent_value_set_id,
2782 child_depth_num,
2783 child_id,
2784 child_value_set_id ,
2785 single_depth_flag,
2786 display_order_num ,
2787 weighting_pct,
2788 creation_date ,
2789 created_by ,
2790 last_updated_by ,
2791 last_update_date ,
2792 last_update_login ,
2793 object_version_number)
2794 VALUES (p_dest_hier_version_id,
2795 t_prnt_depth_num(rec),
2796 t_prnt_id(rec),
2797 t_prnt_value_set_id(rec),
2798 t_chld_depth_num(rec),
2799 t_chld_id(rec),
2800 t_chld_value_set_id(rec),
2801 t_sngle_depth_flag(rec),
2802 t_dspy_order_num(rec),
2803 t_wt_pct(rec),
2804 l_creation_date,
2805 l_created_by,
2806 l_last_updated_by,
2807 l_last_update_date,
2808 l_last_update_login,
2809 1);
2810
2811 elsif p_hier_table_name = 'FEM_CHANNELS_HIER' then
2812
2813 select rowid,
2814 parent_depth_num,
2815 parent_id,
2816 parent_value_set_id,
2817 child_depth_num,
2818 child_id,
2819 child_value_set_id,
2820 single_depth_flag,
2821 display_order_num,
2822 weighting_pct
2823 bulk collect into
2824 t_row_id,
2825 t_prnt_depth_num,
2826 t_prnt_id,
2827 t_prnt_value_set_id,
2828 t_chld_depth_num,
2829 t_chld_id,
2830 t_chld_value_set_id,
2831 t_sngle_depth_flag,
2832 t_dspy_order_num,
2833 t_wt_pct
2834 from fem_channels_hier
2835 where hierarchy_obj_def_id = p_src_hier_version_id;
2836
2837 FORALL rec in t_row_id.FIRST..t_row_id.LAST
2838
2839 INSERT INTO fem_channels_hier
2840 ( hierarchy_obj_def_id,
2841 parent_depth_num,
2842 parent_id ,
2843 parent_value_set_id,
2844 child_depth_num,
2845 child_id,
2846 child_value_set_id ,
2847 single_depth_flag,
2848 display_order_num ,
2849 weighting_pct,
2850 creation_date ,
2851 created_by ,
2852 last_updated_by ,
2853 last_update_date ,
2854 last_update_login ,
2855 object_version_number)
2856 VALUES (p_dest_hier_version_id,
2857 t_prnt_depth_num(rec),
2858 t_prnt_id(rec),
2859 t_prnt_value_set_id(rec),
2860 t_chld_depth_num(rec),
2861 t_chld_id(rec),
2862 t_chld_value_set_id(rec),
2863 t_sngle_depth_flag(rec),
2864 t_dspy_order_num(rec),
2865 t_wt_pct(rec),
2866 l_creation_date,
2867 l_created_by,
2868 l_last_updated_by,
2869 l_last_update_date,
2870 l_last_update_login,
2871 1);
2872
2873 elsif p_hier_table_name = 'FEM_CCTR_ORGS_HIER' then
2874
2875 select rowid,
2876 parent_depth_num,
2877 parent_id,
2878 parent_value_set_id,
2879 child_depth_num,
2880 child_id,
2881 child_value_set_id,
2882 single_depth_flag,
2883 display_order_num,
2884 weighting_pct
2885 bulk collect into
2886 t_row_id,
2887 t_prnt_depth_num,
2888 t_prnt_id,
2889 t_prnt_value_set_id,
2890 t_chld_depth_num,
2891 t_chld_id,
2892 t_chld_value_set_id,
2893 t_sngle_depth_flag,
2894 t_dspy_order_num,
2895 t_wt_pct
2896 from fem_cctr_orgs_hier
2897 where hierarchy_obj_def_id = p_src_hier_version_id;
2898
2899 FORALL rec in t_row_id.FIRST..t_row_id.LAST
2900
2901 INSERT INTO fem_cctr_orgs_hier
2902 ( hierarchy_obj_def_id,
2903 parent_depth_num,
2904 parent_id ,
2905 parent_value_set_id,
2906 child_depth_num,
2907 child_id,
2908 child_value_set_id ,
2909 single_depth_flag,
2910 display_order_num ,
2911 weighting_pct,
2912 creation_date ,
2913 created_by ,
2914 last_updated_by ,
2915 last_update_date ,
2916 last_update_login ,
2917 object_version_number)
2918 VALUES (p_dest_hier_version_id,
2919 t_prnt_depth_num(rec),
2920 t_prnt_id(rec),
2921 t_prnt_value_set_id(rec),
2922 t_chld_depth_num(rec),
2923 t_chld_id(rec),
2924 t_chld_value_set_id(rec),
2925 t_sngle_depth_flag(rec),
2926 t_dspy_order_num(rec),
2927 t_wt_pct(rec),
2928 l_creation_date,
2929 l_created_by,
2930 l_last_updated_by,
2931 l_last_update_date,
2932 l_last_update_login,
2933 1);
2934
2935 elsif p_hier_table_name = 'FEM_CUSTOMERS_HIER' then
2936
2937 select rowid,
2938 parent_depth_num,
2939 parent_id,
2940 parent_value_set_id,
2941 child_depth_num,
2942 child_id,
2943 child_value_set_id,
2944 single_depth_flag,
2945 display_order_num,
2946 weighting_pct
2947 bulk collect into
2948 t_row_id,
2949 t_prnt_depth_num,
2950 t_prnt_id,
2951 t_prnt_value_set_id,
2952 t_chld_depth_num,
2953 t_chld_id,
2954 t_chld_value_set_id,
2955 t_sngle_depth_flag,
2956 t_dspy_order_num,
2957 t_wt_pct
2958 from fem_customers_hier
2959 where hierarchy_obj_def_id = p_src_hier_version_id;
2960
2961 FORALL rec in t_row_id.FIRST..t_row_id.LAST
2962
2963 INSERT INTO fem_customers_hier
2964 ( hierarchy_obj_def_id,
2965 parent_depth_num,
2966 parent_id ,
2967 parent_value_set_id,
2968 child_depth_num,
2969 child_id,
2970 child_value_set_id ,
2971 single_depth_flag,
2972 display_order_num ,
2973 weighting_pct,
2974 creation_date ,
2975 created_by ,
2976 last_updated_by ,
2977 last_update_date ,
2978 last_update_login ,
2979 object_version_number)
2980 VALUES (p_dest_hier_version_id,
2981 t_prnt_depth_num(rec),
2982 t_prnt_id(rec),
2983 t_prnt_value_set_id(rec),
2984 t_chld_depth_num(rec),
2985 t_chld_id(rec),
2986 t_chld_value_set_id(rec),
2987 t_sngle_depth_flag(rec),
2988 t_dspy_order_num(rec),
2989 t_wt_pct(rec),
2990 l_creation_date,
2991 l_created_by,
2992 l_last_updated_by,
2993 l_last_update_date,
2994 l_last_update_login,
2995 1);
2996
2997 elsif p_hier_table_name = 'FEM_ENTITIES_HIER' then
2998
2999 select rowid,
3000 parent_depth_num,
3001 parent_id,
3002 parent_value_set_id,
3003 child_depth_num,
3004 child_id,
3005 child_value_set_id,
3006 single_depth_flag,
3007 display_order_num,
3008 weighting_pct
3009 bulk collect into
3010 t_row_id,
3011 t_prnt_depth_num,
3012 t_prnt_id,
3013 t_prnt_value_set_id,
3014 t_chld_depth_num,
3015 t_chld_id,
3016 t_chld_value_set_id,
3017 t_sngle_depth_flag,
3018 t_dspy_order_num,
3019 t_wt_pct
3020 from fem_entities_hier
3021 where hierarchy_obj_def_id = p_src_hier_version_id;
3022
3023 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3024
3025 INSERT INTO fem_entities_hier
3026 ( hierarchy_obj_def_id,
3027 parent_depth_num,
3028 parent_id ,
3029 parent_value_set_id,
3030 child_depth_num,
3031 child_id,
3032 child_value_set_id ,
3033 single_depth_flag,
3034 display_order_num ,
3035 weighting_pct,
3036 creation_date ,
3037 created_by ,
3038 last_updated_by ,
3039 last_update_date ,
3040 last_update_login ,
3041 object_version_number)
3042 VALUES (p_dest_hier_version_id,
3043 t_prnt_depth_num(rec),
3044 t_prnt_id(rec),
3045 t_prnt_value_set_id(rec),
3046 t_chld_depth_num(rec),
3047 t_chld_id(rec),
3048 t_chld_value_set_id(rec),
3049 t_sngle_depth_flag(rec),
3050 t_dspy_order_num(rec),
3051 t_wt_pct(rec),
3052 l_creation_date,
3053 l_created_by,
3054 l_last_updated_by,
3055 l_last_update_date,
3056 l_last_update_login,
3057 1);
3058
3059 elsif p_hier_table_name = 'FEM_GEOGRAPHY_HIER' then
3060
3061 select rowid,
3062 parent_depth_num,
3063 parent_id,
3064 parent_value_set_id,
3065 child_depth_num,
3066 child_id,
3067 child_value_set_id,
3068 single_depth_flag,
3069 display_order_num,
3070 weighting_pct
3071 bulk collect into
3072 t_row_id,
3073 t_prnt_depth_num,
3074 t_prnt_id,
3075 t_prnt_value_set_id,
3076 t_chld_depth_num,
3077 t_chld_id,
3078 t_chld_value_set_id,
3079 t_sngle_depth_flag,
3080 t_dspy_order_num,
3081 t_wt_pct
3082 from fem_geography_hier
3083 where hierarchy_obj_def_id = p_src_hier_version_id;
3084
3085 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3086
3087 INSERT INTO fem_geography_hier
3088 ( hierarchy_obj_def_id,
3089 parent_depth_num,
3090 parent_id ,
3091 parent_value_set_id,
3092 child_depth_num,
3093 child_id,
3094 child_value_set_id ,
3095 single_depth_flag,
3096 display_order_num ,
3097 weighting_pct,
3098 creation_date ,
3099 created_by ,
3100 last_updated_by ,
3101
3102 last_update_date ,
3103 last_update_login ,
3104 object_version_number)
3105 VALUES (p_dest_hier_version_id,
3106 t_prnt_depth_num(rec),
3107 t_prnt_id(rec),
3108 t_prnt_value_set_id(rec),
3109 t_chld_depth_num(rec),
3110 t_chld_id(rec),
3111 t_chld_value_set_id(rec),
3112 t_sngle_depth_flag(rec),
3113 t_dspy_order_num(rec),
3114 t_wt_pct(rec),
3115 l_creation_date,
3116 l_created_by,
3117 l_last_updated_by,
3118 l_last_update_date,
3119 l_last_update_login,
3120 1);
3121
3122 elsif p_hier_table_name = 'FEM_LN_ITEMS_HIER' then
3123
3124 select rowid,
3125 parent_depth_num,
3126 parent_id,
3127 parent_value_set_id,
3128 child_depth_num,
3129 child_id,
3130 child_value_set_id,
3131 single_depth_flag,
3132 display_order_num,
3133 weighting_pct
3134
3135 bulk collect into
3136 t_row_id,
3137 t_prnt_depth_num,
3138 t_prnt_id,
3139 t_prnt_value_set_id,
3140 t_chld_depth_num,
3141 t_chld_id,
3142 t_chld_value_set_id,
3143 t_sngle_depth_flag,
3144 t_dspy_order_num,
3145 t_wt_pct
3146 from fem_ln_items_hier
3147 where hierarchy_obj_def_id = p_src_hier_version_id;
3148
3149 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3150
3151 INSERT INTO fem_ln_items_hier
3152 ( hierarchy_obj_def_id,
3153 parent_depth_num,
3154 parent_id ,
3155 parent_value_set_id,
3156 child_depth_num,
3157 child_id,
3158 child_value_set_id ,
3159 single_depth_flag,
3160 display_order_num ,
3161 weighting_pct,
3162 creation_date ,
3163 created_by ,
3164 last_updated_by ,
3165 last_update_date ,
3166 last_update_login ,
3167 object_version_number)
3168 VALUES (p_dest_hier_version_id,
3169 t_prnt_depth_num(rec),
3170 t_prnt_id(rec),
3171 t_prnt_value_set_id(rec),
3172 t_chld_depth_num(rec),
3173 t_chld_id(rec),
3174 t_chld_value_set_id(rec),
3175 t_sngle_depth_flag(rec),
3176 t_dspy_order_num(rec),
3177 t_wt_pct(rec),
3178 l_creation_date,
3179 l_created_by,
3180 l_last_updated_by,
3181 l_last_update_date,
3182 l_last_update_login,
3183 1);
3184
3185
3186 elsif p_hier_table_name = 'FEM_NAT_ACCTS_HIER' then
3187
3188 select rowid,
3189 parent_depth_num,
3190 parent_id,
3191 parent_value_set_id,
3192 child_depth_num,
3193 child_id,
3194 child_value_set_id,
3195 single_depth_flag,
3196 display_order_num,
3197 weighting_pct
3198 bulk collect into
3199 t_row_id,
3200 t_prnt_depth_num,
3201 t_prnt_id,
3202 t_prnt_value_set_id,
3203 t_chld_depth_num,
3204 t_chld_id,
3205 t_chld_value_set_id,
3206 t_sngle_depth_flag,
3207 t_dspy_order_num,
3208 t_wt_pct
3209 from fem_nat_accts_hier
3210 where hierarchy_obj_def_id = p_src_hier_version_id;
3211
3215 ( hierarchy_obj_def_id,
3212 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3213
3214 INSERT INTO fem_nat_accts_hier
3216 parent_depth_num,
3217 parent_id ,
3218 parent_value_set_id,
3219 child_depth_num,
3220 child_id,
3221 child_value_set_id ,
3222 single_depth_flag,
3223 display_order_num ,
3224 weighting_pct,
3225 creation_date ,
3226 created_by ,
3227 last_updated_by ,
3228 last_update_date ,
3229 last_update_login ,
3230 object_version_number)
3231 VALUES (p_dest_hier_version_id,
3232 t_prnt_depth_num(rec),
3233 t_prnt_id(rec),
3234 t_prnt_value_set_id(rec),
3235 t_chld_depth_num(rec),
3236 t_chld_id(rec),
3237 t_chld_value_set_id(rec),
3238 t_sngle_depth_flag(rec),
3239 t_dspy_order_num(rec),
3240 t_wt_pct(rec),
3241 l_creation_date,
3242 l_created_by,
3243 l_last_updated_by,
3244 l_last_update_date,
3245 l_last_update_login,
3246 1);
3247
3248 elsif p_hier_table_name = 'FEM_PROJECTS_HIER' then
3249
3250 select rowid,
3251 parent_depth_num,
3252 parent_id,
3253 parent_value_set_id,
3254 child_depth_num,
3255 child_id,
3256 child_value_set_id,
3257 single_depth_flag,
3258 display_order_num,
3259 weighting_pct
3260 bulk collect into
3261 t_row_id,
3262 t_prnt_depth_num,
3263 t_prnt_id,
3264 t_prnt_value_set_id,
3265 t_chld_depth_num,
3266 t_chld_id,
3267 t_chld_value_set_id,
3268 t_sngle_depth_flag,
3269 t_dspy_order_num,
3270 t_wt_pct
3271 from fem_projects_hier
3272 where hierarchy_obj_def_id = p_src_hier_version_id;
3273
3274 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3275
3276 INSERT INTO fem_projects_hier
3277 ( hierarchy_obj_def_id,
3278 parent_depth_num,
3279 parent_id ,
3280 parent_value_set_id,
3281 child_depth_num,
3282 child_id,
3283 child_value_set_id ,
3284 single_depth_flag,
3285 display_order_num ,
3286 weighting_pct,
3287 creation_date ,
3288 created_by ,
3289 last_updated_by ,
3290 last_update_date ,
3291 last_update_login ,
3292 object_version_number)
3293 VALUES (p_dest_hier_version_id,
3294 t_prnt_depth_num(rec),
3295 t_prnt_id(rec),
3296 t_prnt_value_set_id(rec),
3297 t_chld_depth_num(rec),
3298 t_chld_id(rec),
3299 t_chld_value_set_id(rec),
3300 t_sngle_depth_flag(rec),
3301 t_dspy_order_num(rec),
3302 t_wt_pct(rec),
3303 l_creation_date,
3304 l_created_by,
3305 l_last_updated_by,
3306 l_last_update_date,
3307 l_last_update_login,
3308 1);
3309
3310 elsif p_hier_table_name = 'FEM_TASKS_HIER' then
3311
3312 select rowid,
3313 parent_depth_num,
3314 parent_id,
3315 parent_value_set_id,
3316 child_depth_num,
3317 child_id,
3318 child_value_set_id,
3319 single_depth_flag,
3320 display_order_num,
3321 weighting_pct
3322 bulk collect into
3323 t_row_id,
3324 t_prnt_depth_num,
3325 t_prnt_id,
3326 t_prnt_value_set_id,
3327 t_chld_depth_num,
3328 t_chld_id,
3329 t_chld_value_set_id,
3330 t_sngle_depth_flag,
3331 t_dspy_order_num,
3332 t_wt_pct
3333 from fem_tasks_hier
3334 where hierarchy_obj_def_id = p_src_hier_version_id;
3335
3336 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3337
3338 INSERT INTO fem_tasks_hier
3339 ( hierarchy_obj_def_id,
3340 parent_depth_num,
3341 parent_id ,
3342 parent_value_set_id,
3343 child_depth_num,
3344 child_id,
3345 child_value_set_id ,
3346 single_depth_flag,
3347 display_order_num ,
3348 weighting_pct,
3349 creation_date ,
3350 created_by ,
3351 last_updated_by ,
3352 last_update_date ,
3353 last_update_login ,
3354 object_version_number)
3355 VALUES (p_dest_hier_version_id,
3356 t_prnt_depth_num(rec),
3357 t_prnt_id(rec),
3358 t_prnt_value_set_id(rec),
3359 t_chld_depth_num(rec),
3360 t_chld_id(rec),
3361 t_chld_value_set_id(rec),
3362 t_sngle_depth_flag(rec),
3363 t_dspy_order_num(rec),
3364 t_wt_pct(rec),
3365 l_creation_date,
3366 l_created_by,
3367 l_last_updated_by,
3368 l_last_update_date,
3369 l_last_update_login,
3370 1);
3371
3372 elsif p_hier_table_name = 'FEM_PROJECTS_HIER' then
3373
3374 select rowid,
3375 parent_depth_num,
3376 parent_id,
3377 parent_value_set_id,
3378 child_depth_num,
3379 child_id,
3380 child_value_set_id,
3381 single_depth_flag,
3382 display_order_num,
3386 t_prnt_depth_num,
3383 weighting_pct
3384 bulk collect into
3385 t_row_id,
3387 t_prnt_id,
3388 t_prnt_value_set_id,
3389 t_chld_depth_num,
3390 t_chld_id,
3391 t_chld_value_set_id,
3392 t_sngle_depth_flag,
3393 t_dspy_order_num,
3394 t_wt_pct
3395 from fem_projects_hier
3396 where hierarchy_obj_def_id = p_src_hier_version_id;
3397
3398 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3399
3400 INSERT INTO fem_projects_hier
3401 ( hierarchy_obj_def_id,
3402 parent_depth_num,
3403 parent_id ,
3404 parent_value_set_id,
3405 child_depth_num,
3406 child_id,
3407 child_value_set_id ,
3408 single_depth_flag,
3409 display_order_num ,
3410 weighting_pct,
3411 creation_date ,
3412 created_by ,
3413 last_updated_by ,
3414 last_update_date ,
3415 last_update_login ,
3416 object_version_number)
3417 VALUES (p_dest_hier_version_id,
3418 t_prnt_depth_num(rec),
3419 t_prnt_id(rec),
3420 t_prnt_value_set_id(rec),
3421 t_chld_depth_num(rec),
3422 t_chld_id(rec),
3423 t_chld_value_set_id(rec),
3424 t_sngle_depth_flag(rec),
3425 t_dspy_order_num(rec),
3426 t_wt_pct(rec),
3427 l_creation_date,
3428 l_created_by,
3429 l_last_updated_by,
3430 l_last_update_date,
3431 l_last_update_login,
3432 1);
3433
3434 elsif p_hier_table_name = 'FEM_USER_DIM1_HIER' then
3435
3436 select rowid,
3437 parent_depth_num,
3438 parent_id,
3439 parent_value_set_id,
3440 child_depth_num,
3441 child_id,
3442 child_value_set_id,
3443 single_depth_flag,
3444 display_order_num,
3445 weighting_pct
3446 bulk collect into
3447 t_row_id,
3448 t_prnt_depth_num,
3449 t_prnt_id,
3450 t_prnt_value_set_id,
3451 t_chld_depth_num,
3452 t_chld_id,
3453 t_chld_value_set_id,
3454 t_sngle_depth_flag,
3455 t_dspy_order_num,
3456 t_wt_pct
3457 from fem_user_dim1_hier
3458 where hierarchy_obj_def_id = p_src_hier_version_id;
3459
3460 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3461
3462 INSERT INTO fem_user_dim1_hier
3463 ( hierarchy_obj_def_id,
3464 parent_depth_num,
3465 parent_id ,
3466 parent_value_set_id,
3467 child_depth_num,
3468 child_id,
3469 child_value_set_id ,
3470 single_depth_flag,
3471 display_order_num ,
3472 weighting_pct,
3473 creation_date ,
3474 created_by ,
3475 last_updated_by ,
3476 last_update_date ,
3477 last_update_login ,
3478 object_version_number)
3479 VALUES (p_dest_hier_version_id,
3480 t_prnt_depth_num(rec),
3481 t_prnt_id(rec),
3482 t_prnt_value_set_id(rec),
3483 t_chld_depth_num(rec),
3484 t_chld_id(rec),
3485 t_chld_value_set_id(rec),
3486 t_sngle_depth_flag(rec),
3487 t_dspy_order_num(rec),
3488 t_wt_pct(rec),
3489 l_creation_date,
3490 l_created_by,
3491 l_last_updated_by,
3492 l_last_update_date,
3493 l_last_update_login,
3494 1);
3495
3496 elsif p_hier_table_name = 'FEM_USER_DIM2_HIER' then
3497
3498 select rowid,
3499 parent_depth_num,
3500 parent_id,
3501 parent_value_set_id,
3502 child_depth_num,
3503 child_id,
3504 child_value_set_id,
3505 single_depth_flag,
3506 display_order_num,
3507 weighting_pct
3508 bulk collect into
3509 t_row_id,
3510 t_prnt_depth_num,
3511 t_prnt_id,
3512 t_prnt_value_set_id,
3513 t_chld_depth_num,
3514 t_chld_id,
3515 t_chld_value_set_id,
3516 t_sngle_depth_flag,
3517 t_dspy_order_num,
3518 t_wt_pct
3519 from fem_user_dim2_hier
3520 where hierarchy_obj_def_id = p_src_hier_version_id;
3521
3522 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3523
3524 --Bug#5528200: Corrected typo. Should be dim2 not dim3!
3525 INSERT INTO fem_user_dim2_hier
3526 ( hierarchy_obj_def_id,
3527 parent_depth_num,
3528 parent_id ,
3529 parent_value_set_id,
3530 child_depth_num,
3531 child_id,
3532 child_value_set_id ,
3533 single_depth_flag,
3534 display_order_num ,
3535 weighting_pct,
3536 creation_date ,
3537 created_by ,
3538 last_updated_by ,
3539 last_update_date ,
3540 last_update_login ,
3541 object_version_number)
3542 VALUES (p_dest_hier_version_id,
3543 t_prnt_depth_num(rec),
3544 t_prnt_id(rec),
3545 t_prnt_value_set_id(rec),
3546 t_chld_depth_num(rec),
3547 t_chld_id(rec),
3548 t_chld_value_set_id(rec),
3549 t_sngle_depth_flag(rec),
3550 t_dspy_order_num(rec),
3551 t_wt_pct(rec),
3552 l_creation_date,
3556 l_last_update_login,
3553 l_created_by,
3554 l_last_updated_by,
3555 l_last_update_date,
3557 1);
3558
3559 elsif p_hier_table_name = 'FEM_USER_DIM3_HIER' then
3560
3561 select rowid,
3562 parent_depth_num,
3563 parent_id,
3564 parent_value_set_id,
3565 child_depth_num,
3566 child_id,
3567 child_value_set_id,
3568 single_depth_flag,
3569 display_order_num,
3570 weighting_pct
3571 bulk collect into
3572 t_row_id,
3573 t_prnt_depth_num,
3574 t_prnt_id,
3575 t_prnt_value_set_id,
3576 t_chld_depth_num,
3577 t_chld_id,
3578 t_chld_value_set_id,
3579 t_sngle_depth_flag,
3580 t_dspy_order_num,
3581 t_wt_pct
3582 from fem_user_dim3_hier
3583 where hierarchy_obj_def_id = p_src_hier_version_id;
3584
3585 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3586
3587 INSERT INTO fem_user_dim3_hier
3588 ( hierarchy_obj_def_id,
3589 parent_depth_num,
3590 parent_id ,
3591 parent_value_set_id,
3592 child_depth_num,
3593 child_id,
3594 child_value_set_id ,
3595 single_depth_flag,
3596 display_order_num ,
3597 weighting_pct,
3598 creation_date ,
3599 created_by ,
3600 last_updated_by ,
3601 last_update_date ,
3602 last_update_login ,
3603 object_version_number)
3604 VALUES (p_dest_hier_version_id,
3605 t_prnt_depth_num(rec),
3606 t_prnt_id(rec),
3607 t_prnt_value_set_id(rec),
3608 t_chld_depth_num(rec),
3609 t_chld_id(rec),
3610 t_chld_value_set_id(rec),
3611 t_sngle_depth_flag(rec),
3612 t_dspy_order_num(rec),
3613 t_wt_pct(rec),
3614 l_creation_date,
3615 l_created_by,
3616 l_last_updated_by,
3617 l_last_update_date,
3618 l_last_update_login,
3619 1);
3620 elsif p_hier_table_name = 'FEM_USER_DIM4_HIER' then
3621
3622 select rowid,
3623 parent_depth_num,
3624 parent_id,
3625 parent_value_set_id,
3626 child_depth_num,
3627 child_id,
3628 child_value_set_id,
3629 single_depth_flag,
3630 display_order_num,
3631 weighting_pct
3632 bulk collect into
3633 t_row_id,
3634 t_prnt_depth_num,
3635 t_prnt_id,
3636 t_prnt_value_set_id,
3637 t_chld_depth_num,
3638 t_chld_id,
3639 t_chld_value_set_id,
3640 t_sngle_depth_flag,
3641 t_dspy_order_num,
3642 t_wt_pct
3643 from fem_user_dim4_hier
3644 where hierarchy_obj_def_id = p_src_hier_version_id;
3645
3646 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3647
3648 INSERT INTO fem_user_dim4_hier
3649 ( hierarchy_obj_def_id,
3650 parent_depth_num,
3651 parent_id ,
3652 parent_value_set_id,
3653 child_depth_num,
3654 child_id,
3655 child_value_set_id ,
3656 single_depth_flag,
3657 display_order_num ,
3658 weighting_pct,
3659 creation_date ,
3660 created_by ,
3661 last_updated_by ,
3662 last_update_date ,
3663 last_update_login ,
3664 object_version_number)
3665 VALUES (p_dest_hier_version_id,
3666 t_prnt_depth_num(rec),
3667 t_prnt_id(rec),
3668 t_prnt_value_set_id(rec),
3669 t_chld_depth_num(rec),
3670 t_chld_id(rec),
3671 t_chld_value_set_id(rec),
3672 t_sngle_depth_flag(rec),
3673 t_dspy_order_num(rec),
3674 t_wt_pct(rec),
3675 l_creation_date,
3676 l_created_by,
3677 l_last_updated_by,
3678 l_last_update_date,
3679 l_last_update_login,
3680 1);
3681 elsif p_hier_table_name = 'FEM_USER_DIM5_HIER' then
3682
3683 select rowid,
3684 parent_depth_num,
3685 parent_id,
3686 parent_value_set_id,
3687 child_depth_num,
3688 child_id,
3689 child_value_set_id,
3690 single_depth_flag,
3691 display_order_num,
3692 weighting_pct
3693 bulk collect into
3694 t_row_id,
3695 t_prnt_depth_num,
3696 t_prnt_id,
3697 t_prnt_value_set_id,
3698 t_chld_depth_num,
3699 t_chld_id,
3700 t_chld_value_set_id,
3701 t_sngle_depth_flag,
3702 t_dspy_order_num,
3703 t_wt_pct
3704 from fem_user_dim5_hier
3705 where hierarchy_obj_def_id = p_src_hier_version_id;
3706
3707 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3708
3709 INSERT INTO fem_user_dim5_hier
3710 ( hierarchy_obj_def_id,
3711 parent_depth_num,
3712 parent_id ,
3713 parent_value_set_id,
3714 child_depth_num,
3715 child_id,
3716 child_value_set_id ,
3717 single_depth_flag,
3718 display_order_num ,
3719 weighting_pct,
3720 creation_date ,
3721 created_by ,
3722 last_updated_by ,
3723 last_update_date ,
3724 last_update_login ,
3728 t_prnt_id(rec),
3725 object_version_number)
3726 VALUES (p_dest_hier_version_id,
3727 t_prnt_depth_num(rec),
3729 t_prnt_value_set_id(rec),
3730 t_chld_depth_num(rec),
3731 t_chld_id(rec),
3732 t_chld_value_set_id(rec),
3733 t_sngle_depth_flag(rec),
3734 t_dspy_order_num(rec),
3735 t_wt_pct(rec),
3736 l_creation_date,
3737 l_created_by,
3738 l_last_updated_by,
3739 l_last_update_date,
3740 l_last_update_login,
3741 1);
3742 elsif p_hier_table_name = 'FEM_USER_DIM6_HIER' then
3743
3744 select rowid,
3745 parent_depth_num,
3746 parent_id,
3747 parent_value_set_id,
3748 child_depth_num,
3749 child_id,
3750 child_value_set_id,
3751 single_depth_flag,
3752 display_order_num,
3753 weighting_pct
3754 bulk collect into
3755 t_row_id,
3756 t_prnt_depth_num,
3757 t_prnt_id,
3758 t_prnt_value_set_id,
3759 t_chld_depth_num,
3760 t_chld_id,
3761 t_chld_value_set_id,
3762 t_sngle_depth_flag,
3763 t_dspy_order_num,
3764 t_wt_pct
3765 from fem_user_dim6_hier
3766 where hierarchy_obj_def_id = p_src_hier_version_id;
3767
3768 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3769
3770 INSERT INTO fem_user_dim6_hier
3771 ( hierarchy_obj_def_id,
3772 parent_depth_num,
3773 parent_id ,
3774 parent_value_set_id,
3775 child_depth_num,
3776 child_id,
3777 child_value_set_id ,
3778 single_depth_flag,
3779 display_order_num ,
3780 weighting_pct,
3781 creation_date ,
3782 created_by ,
3783 last_updated_by ,
3784 last_update_date ,
3785 last_update_login ,
3786 object_version_number)
3787 VALUES (p_dest_hier_version_id,
3788 t_prnt_depth_num(rec),
3789 t_prnt_id(rec),
3790 t_prnt_value_set_id(rec),
3791 t_chld_depth_num(rec),
3792 t_chld_id(rec),
3793 t_chld_value_set_id(rec),
3794 t_sngle_depth_flag(rec),
3795 t_dspy_order_num(rec),
3796 t_wt_pct(rec),
3797 l_creation_date,
3798 l_created_by,
3799 l_last_updated_by,
3800 l_last_update_date,
3801 l_last_update_login,
3802 1);
3803 elsif p_hier_table_name = 'FEM_USER_DIM7_HIER' then
3804
3805 select rowid,
3806 parent_depth_num,
3807 parent_id,
3808 parent_value_set_id,
3809 child_depth_num,
3810 child_id,
3811 child_value_set_id,
3812 single_depth_flag,
3813 display_order_num,
3814 weighting_pct
3815 bulk collect into
3816 t_row_id,
3817 t_prnt_depth_num,
3818 t_prnt_id,
3819 t_prnt_value_set_id,
3820 t_chld_depth_num,
3821 t_chld_id,
3822 t_chld_value_set_id,
3823 t_sngle_depth_flag,
3824 t_dspy_order_num,
3825 t_wt_pct
3826 from fem_user_dim7_hier
3827 where hierarchy_obj_def_id = p_src_hier_version_id;
3828
3829 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3830
3831 INSERT INTO fem_user_dim7_hier
3832 ( hierarchy_obj_def_id,
3833 parent_depth_num,
3834 parent_id ,
3835 parent_value_set_id,
3836 child_depth_num,
3837 child_id,
3838 child_value_set_id ,
3839 single_depth_flag,
3840 display_order_num ,
3841 weighting_pct,
3842 creation_date ,
3843 created_by ,
3844 last_updated_by ,
3845 last_update_date ,
3846 last_update_login ,
3847 object_version_number)
3848 VALUES (p_dest_hier_version_id,
3849 t_prnt_depth_num(rec),
3850 t_prnt_id(rec),
3851 t_prnt_value_set_id(rec),
3852 t_chld_depth_num(rec),
3853 t_chld_id(rec),
3854 t_chld_value_set_id(rec),
3855 t_sngle_depth_flag(rec),
3856 t_dspy_order_num(rec),
3857 t_wt_pct(rec),
3858 l_creation_date,
3859 l_created_by,
3860 l_last_updated_by,
3861 l_last_update_date,
3862 l_last_update_login,
3863 1);
3864 elsif p_hier_table_name = 'FEM_USER_DIM8_HIER' then
3865
3866 select rowid,
3867 parent_depth_num,
3868 parent_id,
3869 parent_value_set_id,
3870 child_depth_num,
3871 child_id,
3872 child_value_set_id,
3873 single_depth_flag,
3874 display_order_num,
3875 weighting_pct
3876 bulk collect into
3877 t_row_id,
3878 t_prnt_depth_num,
3879 t_prnt_id,
3880 t_prnt_value_set_id,
3881 t_chld_depth_num,
3882 t_chld_id,
3883 t_chld_value_set_id,
3884 t_sngle_depth_flag,
3885 t_dspy_order_num,
3886 t_wt_pct
3887 from fem_user_dim8_hier
3888 where hierarchy_obj_def_id = p_src_hier_version_id;
3889
3890 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3891
3892 INSERT INTO fem_user_dim8_hier
3896 parent_value_set_id,
3893 ( hierarchy_obj_def_id,
3894 parent_depth_num,
3895 parent_id ,
3897 child_depth_num,
3898 child_id,
3899 child_value_set_id ,
3900 single_depth_flag,
3901 display_order_num ,
3902 weighting_pct,
3903 creation_date ,
3904 created_by ,
3905 last_updated_by ,
3906 last_update_date ,
3907 last_update_login ,
3908 object_version_number)
3909 VALUES (p_dest_hier_version_id,
3910 t_prnt_depth_num(rec),
3911 t_prnt_id(rec),
3912 t_prnt_value_set_id(rec),
3913 t_chld_depth_num(rec),
3914 t_chld_id(rec),
3915 t_chld_value_set_id(rec),
3916 t_sngle_depth_flag(rec),
3917 t_dspy_order_num(rec),
3918 t_wt_pct(rec),
3919 l_creation_date,
3920 l_created_by,
3921 l_last_updated_by,
3922 l_last_update_date,
3923 l_last_update_login,
3924 1);
3925 elsif p_hier_table_name = 'FEM_USER_DIM9_HIER' then
3926
3927 select rowid,
3928 parent_depth_num,
3929 parent_id,
3930 parent_value_set_id,
3931 child_depth_num,
3932 child_id,
3933 child_value_set_id,
3934 single_depth_flag,
3935 display_order_num,
3936 weighting_pct
3937 bulk collect into
3938 t_row_id,
3939 t_prnt_depth_num,
3940 t_prnt_id,
3941 t_prnt_value_set_id,
3942 t_chld_depth_num,
3943 t_chld_id,
3944 t_chld_value_set_id,
3945 t_sngle_depth_flag,
3946 t_dspy_order_num,
3947 t_wt_pct
3948 from fem_user_dim9_hier
3949 where hierarchy_obj_def_id = p_src_hier_version_id;
3950
3951 FORALL rec in t_row_id.FIRST..t_row_id.LAST
3952
3953 INSERT INTO fem_user_dim9_hier
3954 ( hierarchy_obj_def_id,
3955 parent_depth_num,
3956 parent_id ,
3957 parent_value_set_id,
3958 child_depth_num,
3959 child_id,
3960 child_value_set_id ,
3961 single_depth_flag,
3962 display_order_num ,
3963 weighting_pct,
3964 creation_date ,
3965 created_by ,
3966 last_updated_by ,
3967 last_update_date ,
3968 last_update_login ,
3969 object_version_number)
3970 VALUES (p_dest_hier_version_id,
3971 t_prnt_depth_num(rec),
3972 t_prnt_id(rec),
3973 t_prnt_value_set_id(rec),
3974 t_chld_depth_num(rec),
3975 t_chld_id(rec),
3976 t_chld_value_set_id(rec),
3977 t_sngle_depth_flag(rec),
3978 t_dspy_order_num(rec),
3979 t_wt_pct(rec),
3980 l_creation_date,
3981 l_created_by,
3982 l_last_updated_by,
3983 l_last_update_date,
3984 l_last_update_login,
3985 1);
3986
3987 elsif p_hier_table_name = 'FEM_USER_DIM10_HIER' then
3988
3989 select rowid,
3990 parent_depth_num,
3991 parent_id,
3992 parent_value_set_id,
3993 child_depth_num,
3994 child_id,
3995 child_value_set_id,
3996 single_depth_flag,
3997 display_order_num,
3998 weighting_pct
3999 bulk collect into
4000 t_row_id,
4001 t_prnt_depth_num,
4002 t_prnt_id,
4003 t_prnt_value_set_id,
4004 t_chld_depth_num,
4005 t_chld_id,
4006 t_chld_value_set_id,
4007 t_sngle_depth_flag,
4008 t_dspy_order_num,
4009 t_wt_pct
4010 from fem_user_dim10_hier
4011 where hierarchy_obj_def_id = p_src_hier_version_id;
4012
4013 FORALL rec in t_row_id.FIRST..t_row_id.LAST
4014
4015 INSERT INTO fem_user_dim10_hier
4016 ( hierarchy_obj_def_id,
4017 parent_depth_num,
4018 parent_id ,
4019 parent_value_set_id,
4020 child_depth_num,
4021 child_id,
4022 child_value_set_id ,
4023 single_depth_flag,
4024 display_order_num ,
4025 weighting_pct,
4026 creation_date ,
4027 created_by ,
4028 last_updated_by ,
4029 last_update_date ,
4030 last_update_login ,
4031 object_version_number)
4032 VALUES (p_dest_hier_version_id,
4033 t_prnt_depth_num(rec),
4034 t_prnt_id(rec),
4035 t_prnt_value_set_id(rec),
4036 t_chld_depth_num(rec),
4037 t_chld_id(rec),
4038 t_chld_value_set_id(rec),
4039 t_sngle_depth_flag(rec),
4040 t_dspy_order_num(rec),
4041 t_wt_pct(rec),
4042 l_creation_date,
4043 l_created_by,
4044 l_last_updated_by,
4045 l_last_update_date,
4046 l_last_update_login,
4047 1);
4048
4049
4050 elsif p_hier_table_name = 'FEM_CAL_PERIODS_HIER' then
4051
4052 select rowid,
4053 parent_depth_num,
4054 parent_id,
4055 child_depth_num,
4056 child_id,
4057 single_depth_flag,
4058 display_order_num,
4059 weighting_pct
4060 bulk collect into
4061 t_row_id,
4062 t_prnt_depth_num,
4063 t_prnt_id,
4064 t_chld_depth_num,
4068 t_wt_pct
4065 t_chld_id,
4066 t_sngle_depth_flag,
4067 t_dspy_order_num,
4069 from fem_cal_periods_hier
4070 where hierarchy_obj_def_id = p_src_hier_version_id;
4071
4072 FORALL rec in t_row_id.FIRST..t_row_id.LAST
4073
4074 INSERT INTO fem_cal_periods_hier
4075 ( hierarchy_obj_def_id,
4076 parent_depth_num,
4077 parent_id ,
4078 child_depth_num,
4079 child_id,
4080 single_depth_flag,
4081 display_order_num ,
4082 weighting_pct,
4083 creation_date ,
4084 created_by ,
4085 last_updated_by ,
4086 last_update_date ,
4087 last_update_login ,
4088 object_version_number)
4089 VALUES (p_dest_hier_version_id,
4090 t_prnt_depth_num(rec),
4091 t_prnt_id(rec),
4092 t_chld_depth_num(rec),
4093 t_chld_id(rec),
4094 t_sngle_depth_flag(rec),
4095 t_dspy_order_num(rec),
4096 t_wt_pct(rec),
4097 l_creation_date,
4098 l_created_by,
4099 l_last_updated_by,
4100 l_last_update_date,
4101 l_last_update_login,
4102 1);
4103
4104 elsif p_hier_table_name = 'FEM_COST_OBJECTS_HIER' then
4105
4106 SELECT effective_start_date
4107 INTO l_version_start_date
4108 FROM fem_object_definition_b
4109 WHERE object_definition_id = p_src_hier_version_id ;
4110
4111 SELECT fcoh.rowid,
4112 fem_cost_objects_hier_s.NEXTVAL,
4113 effective_start_date,
4114 parent_id,
4115 child_id,
4116 child_sequence_num,
4117 display_order_num,
4118 effective_end_date,
4119 bom_reference,
4120 dataset_code,
4121 cal_period_id,
4122 parent_qty,
4123 child_qty,
4124 yield_percentage
4125 BULK COLLECT INTO
4126 t_co_row_id,
4127 t_co_rel_id,
4128 t_co_eff_start_date,
4129 t_co_prnt_id,
4130 t_co_chld_id,
4131 t_co_chld_sequence_num,
4132 t_co_disp_order_num,
4133 t_co_eff_end_date,
4134 t_co_bom_ref,
4135 t_co_ds_code,
4136 t_co_cal_per_id,
4137 t_co_prnt_qty,
4138 t_co_chld_qty,
4139 t_co_yld_percentage
4140 FROM fem_cost_objects_hier fcoh,
4141 fem_cost_obj_hier_qty fcohq
4142 WHERE fcoh.relationship_id = fcohq.relationship_id
4143 AND hierarchy_obj_id = p_src_hier_obj_id
4144 AND l_version_start_date BETWEEN effective_start_date
4145 AND effective_end_date;
4146
4147 FORALL rec in t_co_row_id.FIRST..t_co_row_id.LAST
4148
4149 INSERT INTO fem_cost_objects_hier
4150 (relationship_id,
4151 effective_start_date,
4152 hierarchy_obj_id,
4153 parent_id,
4154 child_id,
4155 child_sequence_num,
4156 display_order_num,
4157 effective_end_date,
4158 bom_reference,
4159 creation_date,
4160 created_by ,
4161 last_updated_by ,
4162 last_update_date ,
4163 last_update_login ,
4164 object_version_number)
4165 VALUES
4166 (t_co_rel_id(rec),
4167 t_co_eff_start_date(rec),
4168 p_dest_hier_obj_id,
4169 t_co_prnt_id(rec),
4170 t_co_chld_id(rec),
4171 t_co_chld_sequence_num(rec),
4172 t_co_disp_order_num(rec),
4173 t_co_eff_end_date(rec),
4174 t_co_bom_ref(rec),
4175 l_creation_date,
4176 l_created_by,
4177 l_last_updated_by,
4178 l_last_update_date,
4179 l_last_update_login,
4180 1);
4181
4182 FORALL rec in t_co_row_id.FIRST..t_co_row_id.LAST
4183
4184 INSERT INTO fem_cost_obj_hier_qty
4185 (relationship_id,
4186 dataset_code,
4187 cal_period_id,
4188 child_qty,
4189 parent_qty,
4190 yield_percentage,
4191 creation_date,
4192 created_by ,
4193 last_updated_by ,
4194 last_update_date ,
4195 last_update_login ,
4196 object_version_number)
4197 VALUES
4198 (t_co_rel_id(rec),
4199 t_co_ds_code(rec),
4200 t_co_cal_per_id(rec),
4201 t_co_chld_qty(rec),
4202 t_co_prnt_qty(rec),
4203 t_co_yld_percentage(rec),
4204 l_creation_date,
4205 l_created_by,
4206 l_last_updated_by,
4207 l_last_update_date,
4208 l_last_update_login,
4209 1);
4210
4211 elsif p_hier_table_name = 'FEM_ACTIVITIES_HIER' then
4212
4213 SELECT rowid,
4214 parent_depth_num,
4215 parent_id,
4216 child_depth_num,
4217 child_id,
4218 single_depth_flag,
4219 display_order_num,
4220 weighting_pct
4221 BULK COLLECT INTO
4222 t_row_id,
4223 t_prnt_depth_num,
4224 t_prnt_id,
4225 t_chld_depth_num,
4226 t_chld_id,
4227 t_sngle_depth_flag,
4228 t_dspy_order_num,
4229 t_wt_pct
4230 FROM fem_activities_hier
4231 WHERE hierarchy_obj_def_id = p_src_hier_version_id;
4232
4233 FORALL rec IN t_row_id.FIRST..t_row_id.LAST
4234
4235 INSERT INTO fem_activities_hier
4236 ( hierarchy_obj_def_id,
4240 child_id,
4237 parent_depth_num,
4238 parent_id ,
4239 child_depth_num,
4241 single_depth_flag,
4242 display_order_num ,
4243 weighting_pct,
4244 creation_date ,
4245 created_by ,
4246 last_updated_by ,
4247 last_update_date ,
4248 last_update_login ,
4249 object_version_number)
4250 VALUES (p_dest_hier_version_id,
4251 t_prnt_depth_num(rec),
4252 t_prnt_id(rec),
4253 t_chld_depth_num(rec),
4254 t_chld_id(rec),
4255 t_sngle_depth_flag(rec),
4256 t_dspy_order_num(rec),
4257 t_wt_pct(rec),
4258 l_creation_date,
4259 l_created_by,
4260 l_last_updated_by,
4261 l_last_update_date,
4262 l_last_update_login,
4263 1);
4264
4265 end if;
4266
4267 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4268 p_data => p_msg_data );
4269
4270 EXCEPTION
4271 WHEN FND_API.G_EXC_ERROR THEN
4272 ROLLBACK TO Copy_Hier_Data_Pvt ;
4273 p_return_status := FND_API.G_RET_STS_ERROR;
4274 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4275 p_data => p_msg_data );
4276
4277 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4278 ROLLBACK TO Copy_Hier_Data_Pvt ;
4279 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4280 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4281 p_data => p_msg_data );
4282
4283 WHEN OTHERS THEN
4284 ROLLBACK TO Copy_Hier_Data_Pvt ;
4285 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4286 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4287 p_data => p_msg_data );
4288
4289 END Copy_Hier_Data;
4290
4291 /*===========================================================================+
4292 | PROCEDURE Launch_Dup_Hier_Ver_Process |
4293 +===========================================================================*/
4294
4295 --
4296 -- The concurrent program to duplicate a Hierarchy Version.
4297 --
4298 PROCEDURE Launch_Dup_Hier_Ver_Process(ERRBUFF IN OUT NOCOPY VARCHAR2,
4299 RETCODE IN OUT NOCOPY VARCHAR2,
4300 p_hier_table_name IN VARCHAR2,
4301 p_src_hier_obj_id IN NUMBER,
4302 p_src_hier_version_id IN NUMBER,
4303 p_dest_version_name IN VARCHAR2,
4304 p_dest_version_desc IN VARCHAR2,
4305 p_dest_start_date IN VARCHAR2,
4306 p_dest_end_date IN VARCHAR2)
4307 is
4308 l_msg_count NUMBER;
4309 l_return_status VARCHAR2(1);
4310 l_msg_data VARCHAR2(630);
4311 l_dest_start_date DATE;
4312 l_dest_end_date DATE;
4313
4314 begin
4315
4316 l_dest_start_date := fnd_date.canonical_to_date(p_dest_start_date);
4317 l_dest_end_date := fnd_date.canonical_to_date(p_dest_end_date);
4318
4319 duplicate_hier_version (p_api_version => 1.0,
4320 p_return_status => l_return_status,
4321 p_msg_count => l_msg_count,
4322 p_msg_data => l_msg_data,
4323 p_hier_table_name => p_hier_table_name,
4324 p_src_hier_obj_id => p_src_hier_obj_id,
4325 p_src_hier_version_id => p_src_hier_version_id,
4326 p_dest_hier_obj_id => p_src_hier_obj_id,
4327 p_dest_version_name => p_dest_version_name,
4328 p_dest_version_desc => p_dest_version_desc,
4329 p_dest_start_date => l_dest_start_date,
4330 p_dest_end_date => l_dest_end_date);
4331
4332 if l_return_status in ('U', 'E') then
4333 RETCODE := 2;
4334 ERRBUFF := l_msg_data;
4335 else
4336 RETCODE := 0;
4337 ERRBUFF := l_msg_data;
4338 end if;
4339
4340 end Launch_Dup_Hier_Ver_Process;
4341
4342
4343 /*===========================================================================+
4344 | PROCEDURE Duplicate_Hier_Version |
4345 +===========================================================================*/
4346
4347 --
4348 -- The API to duplicate a Hierarchy Version.
4349 --
4350 PROCEDURE Duplicate_Hier_Version(
4351 p_api_version IN NUMBER ,
4352 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
4353 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
4354 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
4355 p_return_status OUT NOCOPY VARCHAR2 ,
4356 p_msg_count OUT NOCOPY NUMBER ,
4357 p_msg_data OUT NOCOPY VARCHAR2 ,
4358 p_hier_table_name IN VARCHAR2,
4359 p_src_hier_obj_id IN NUMBER,
4360 p_src_hier_version_id IN NUMBER,
4361 p_dest_hier_obj_id IN NUMBER,
4362 p_dest_version_name IN VARCHAR2,
4363 p_dest_version_desc IN VARCHAR2,
4364 p_dest_start_date IN DATE,
4365 p_dest_end_date IN DATE) IS
4366
4367 l_creation_date DATE := sysdate;
4368 l_created_by NUMBER := fnd_global.user_id;
4369 l_last_update_date DATE := sysdate;
4370 l_last_Updated_by NUMBER := fnd_global.user_id;
4371 l_last_update_login NUMBER := fnd_global.login_id;
4372
4373 l_new_version_id NUMBER;
4374
4375 l_object_definition_rec FEM_OBJECT_DEFINITION_VL%rowtype;
4379 l_api_version CONSTANT NUMBER := 1.0;
4376 l_row_id ROWID;
4377
4378 l_api_name CONSTANT VARCHAR2(30) := 'Duplicate_Hier_Version' ;
4380
4381 l_hier_versioning_type_code VARCHAR2(30);
4382
4383 CURSOR l_object_definition_csr (p_version_id IN NUMBER)
4384 IS
4385 SELECT *
4386 FROM fem_object_definition_vl
4387 WHERE object_definition_id = p_version_id;
4388
4389 CURSOR l_dimension_detail_csr (c_hierarchy_id IN NUMBER)
4390 IS
4391 SELECT hier_versioning_type_code
4392 FROM fem_xdim_dimensions
4393 WHERE dimension_id = (SELECT dimension_id
4394 FROM fem_hierarchies
4395 WHERE hierarchy_obj_id = c_hierarchy_id);
4396
4397 begin
4398
4399 SAVEPOINT Dup_Hier_Version_Pvt;
4400
4401 if not FND_API.Compatible_API_Call ( l_api_version,
4402 p_api_version,
4403 l_api_name,
4404 G_PKG_NAME )
4405 then
4406 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
4407 end if;
4408
4409 if FND_API.to_Boolean ( p_init_msg_list ) then
4410 FND_MSG_PUB.initialize ;
4411 end if;
4412
4413 p_return_status := FND_API.G_RET_STS_SUCCESS ;
4414
4415 -- Added for Bug:3737462
4416 -- The following call ensures that when duplicating a version there is no overlap in
4417 -- the date ranges of existing versions.
4418
4419 FEM_BUSINESS_RULE_PVT.checkoverlapobjdefs(p_obj_id => p_dest_hier_obj_id,
4420 p_exclude_obj_def_id => null,
4421 p_effective_start_date => p_dest_start_date,
4422 p_effective_end_date => p_dest_end_date,
4423 x_return_status => p_return_status,
4424 x_msg_count => p_msg_count,
4425 x_msg_data => p_msg_data);
4426
4427 if p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4428 RAISE FND_API.G_EXC_ERROR ;
4429 end if;
4430
4431 open l_object_definition_csr (p_version_id => p_src_hier_version_id);
4432 fetch l_object_definition_csr into l_object_definition_rec;
4433 close l_object_definition_csr;
4434
4435 select fem_object_definition_id_seq.nextval
4436 into l_new_version_id
4437 from dual;
4438
4439 FEM_OBJECT_DEFINITION_PKG.INSERT_ROW (X_ROWID => l_row_id,
4440 X_OBJECT_DEFINITION_ID => l_new_version_id,
4441 X_OBJECT_VERSION_NUMBER => 1,
4442 X_OBJECT_ID => p_dest_hier_obj_id,
4443 X_EFFECTIVE_START_DATE => p_dest_start_date,
4444 X_EFFECTIVE_END_DATE => p_dest_end_date,
4445 X_OBJECT_ORIGIN_CODE => l_object_definition_rec.object_origin_code,
4446 X_APPROVAL_STATUS_CODE => l_object_definition_rec.approval_status_code,
4447 X_OLD_APPROVED_COPY_FLAG => l_object_definition_rec.old_approved_copy_flag,
4448 X_OLD_APPROVED_COPY_OBJ_DEF_ID => l_object_definition_rec.old_approved_copy_obj_def_id,
4449 X_APPROVED_BY => l_object_definition_rec.approved_by,
4450 X_APPROVAL_DATE => l_object_definition_rec.approval_date,
4451 X_DISPLAY_NAME => p_dest_version_name,
4452 X_DESCRIPTION => p_dest_version_desc,
4453 X_CREATION_DATE => l_creation_date,
4454 X_CREATED_BY => l_created_by,
4455 X_LAST_UPDATE_DATE => l_last_update_date,
4456 X_LAST_UPDATED_BY => l_last_updated_by,
4457 X_LAST_UPDATE_LOGIN => l_last_update_login);
4458
4459 INSERT INTO fem_hier_definitions
4460 (hierarchy_obj_def_id,
4461 flattened_rows_completion_code,
4462 created_by,
4463 creation_date,
4464 last_updated_by,
4465 last_update_date,
4466 last_update_login,
4467 object_version_number)
4468 VALUES
4469 (l_new_version_id,
4470 'COMPLETED',
4471 l_created_by,
4472 l_creation_date,
4473 l_last_updated_by,
4474 l_last_update_date,
4475 l_last_update_login,
4476 1);
4477
4478 -- If the Hierarchy Versioning Type is RELATION then we do not copy the
4479 -- Hierarchy "Data" but only the "Header" info about the Hierarchy.
4480 -- NOTE: Currently, this is applicable only for Cost Object Hierarchies.
4481
4482 OPEN l_dimension_detail_csr (c_hierarchy_id => p_src_hier_obj_id);
4483 FETCH l_dimension_detail_csr INTO l_hier_versioning_type_code;
4484 CLOSE l_dimension_detail_csr;
4485
4486 IF l_hier_versioning_type_code <> 'RELATION' OR
4487 (p_src_hier_obj_id <> p_dest_hier_obj_id AND
4488 l_hier_versioning_type_code = 'RELATION') THEN
4489
4490 copy_hier_data(p_return_status => p_return_status,
4491 p_msg_count => p_msg_count,
4492 p_msg_data => p_msg_data,
4493 p_hier_table_name => p_hier_table_name,
4494 p_src_hier_obj_id => p_src_hier_obj_id,
4495 p_dest_hier_obj_id => p_dest_hier_obj_id,
4496 p_src_hier_version_id => p_src_hier_version_id,
4497 p_dest_hier_version_id => l_new_version_id);
4498
4499 ELSIF (p_src_hier_obj_id = p_dest_hier_obj_id AND
4500 l_hier_versioning_type_code = 'RELATION') THEN
4501
4502 Dup_Cost_Object_Hier_Data(x_return_status => p_return_status,
4506 p_src_version_id => p_src_hier_version_id,
4503 x_msg_count => p_msg_count,
4504 x_msg_data => p_msg_data,
4505 p_hierarchy_id => p_src_hier_obj_id,
4507 p_dest_version_id => l_new_version_id);
4508
4509 END IF;
4510
4511
4512 if p_return_status <> 'S' then
4513 RAISE FND_API.G_EXC_ERROR;
4514 end if;
4515
4516
4517 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4518 p_data => p_msg_data );
4519
4520 EXCEPTION
4521 WHEN FND_API.G_EXC_ERROR THEN
4522 ROLLBACK TO Dup_Hier_Version_Pvt ;
4523 p_return_status := FND_API.G_RET_STS_ERROR;
4524 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4525 p_data => p_msg_data );
4526
4527 p_msg_data := sqlerrm;
4528 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4529 ROLLBACK TO Dup_Hier_Version_Pvt ;
4530 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4531 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4532 p_data => p_msg_data );
4533
4534 p_msg_data := sqlerrm;
4535 WHEN OTHERS THEN
4536 ROLLBACK TO Dup_Hier_Version_Pvt ;
4537 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4538 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4539 p_data => p_msg_data );
4540
4541 p_msg_data := sqlerrm;
4542 end duplicate_hier_version;
4543
4544
4545 /*===========================================================================+
4546 | FUNCTION Can_Delete_Hier_Version |
4547 +===========================================================================*/
4548
4549 --
4550 -- This function returns 'N' if the concurrent request is submitted for deleting
4551 -- a Hierarchy Version.
4552 --
4553
4554 FUNCTION can_delete_hier_version (p_hier_version_id IN NUMBER, p_folder_id IN NUMBER)
4555 return VARCHAR2 AS
4556
4557 l_delete_status VARCHAR2(1) := 'Y';
4558 l_hier_version_status VARCHAR2(30);
4559 l_write_status VARCHAR2(1);
4560 begin
4561
4562 SELECT flattened_rows_completion_code
4563 INTO l_hier_version_status
4564 FROM fem_hier_definitions
4565 WHERE hierarchy_obj_def_id = p_hier_version_id;
4566
4567 SELECT WRITE_FLAG
4568 INTO l_write_status
4569 FROM FEM_USER_FOLDERS
4570 WHERE FOLDER_ID = p_folder_id
4571 AND USER_ID = FND_GLOBAL.USER_ID ;
4572
4573 if l_hier_version_status = 'PENDING_DELETION' then
4574 l_delete_status := 'N';
4575 end if;
4576 if l_write_status <> 'Y' then
4577 l_delete_status := 'N';
4578 end if;
4579
4580 return l_delete_status;
4581 exception
4582 when NO_DATA_FOUND then --Bug#4320272
4583 return 'N';
4584
4585 when OTHERS then
4586 return l_delete_status;
4587
4588 end can_delete_hier_version;
4589
4590 -- WIP - The following is a clugy way of determining if a Hierarchy
4591 -- is in PENDING_DELETION status. Should think of a better approach
4592 -- like having a status column in FEM_HIERARCHIES.
4593
4594 /*===========================================================================+
4595 | FUNCTION Can_View_Ver_Detail |
4596 +===========================================================================*/
4597
4598 --
4599 -- This function returns 'N' if the concurrent request is submitted for fetching details of
4600 -- a Hierarchy Version.
4601 --
4602
4603 FUNCTION can_view_ver_detail (p_hier_version_id IN NUMBER)
4604 return VARCHAR2 AS
4605
4606 l_detail_status VARCHAR2(1) := 'Y';
4607 l_hier_version_status VARCHAR2(30);
4608
4609 begin
4610
4611 SELECT flattened_rows_completion_code
4612 INTO l_hier_version_status
4613 FROM fem_hier_definitions
4614 WHERE hierarchy_obj_def_id = p_hier_version_id;
4615
4616 if l_hier_version_status = 'PENDING_DELETION' then
4617 l_detail_status := 'N';
4618 return l_detail_status ;
4619 else
4620 return l_detail_status ;
4621 end if;
4622
4623 exception
4624 when NO_DATA_FOUND then --Bug#4320272
4625 return 'N';
4626
4627 when OTHERS then
4628 return l_detail_status;
4629
4630 end can_view_ver_detail;
4631
4632 -- WIP - The following is a clugy way of determining if a Hierarchy
4633 -- is in PENDING_DELETION status. Should think of a better approach
4634 -- like having a status column in FEM_HIERARCHIES.
4635
4636 /*===========================================================================+
4637 | FUNCTION Can_Duplicate_Hier_Version |
4638 +===========================================================================*/
4639
4640 --
4641 -- This function returns 'N' if the concurrent request is submitted for duplicating
4642 -- a Hierarchy Version.
4643 --
4644
4645 FUNCTION can_duplicate_hier_version (p_hier_version_id IN NUMBER)
4646 return VARCHAR2 AS
4647
4648 l_duplicate_status VARCHAR2(1) := 'Y';
4649 l_hier_version_status VARCHAR2(30);
4650
4651 begin
4652
4653 SELECT flattened_rows_completion_code
4654 INTO l_hier_version_status
4658 if l_hier_version_status = 'PENDING_DELETION' then
4655 FROM fem_hier_definitions
4656 WHERE hierarchy_obj_def_id = p_hier_version_id;
4657
4659 l_duplicate_status := 'N';
4660 return l_duplicate_status ;
4661 else
4662 return l_duplicate_status ;
4663 end if;
4664
4665 exception
4666 when NO_DATA_FOUND then --Bug#4320272
4667 return 'N';
4668
4669 when OTHERS then
4670 return l_duplicate_status;
4671
4672 end can_duplicate_hier_version;
4673
4674 -- WIP - The following is a clugy way of determining if a Hierarchy
4675 -- is in PENDING_DELETION status. Should think of a better approach
4676 -- like having a status column in FEM_HIERARCHIES.
4677
4678 /*===========================================================================+
4679 | FUNCTION is_hier_ver_deleted |
4680 +===========================================================================*/
4681 --
4682 -- This function returns 'N' if the concurrent request is submitted for deleting
4683 -- a Hierarchy version.
4684 --
4685
4686 FUNCTION is_hier_ver_deleted (p_hier_ver_id IN NUMBER)
4687 return VARCHAR2 AS
4688
4689 l_delete_status VARCHAR2(1) := 'Y';
4690 l_hier_version_status VARCHAR2(30);
4691
4692 begin
4693
4694 SELECT flattened_rows_completion_code
4695 INTO l_hier_version_status
4696 FROM fem_hier_definitions
4697 WHERE hierarchy_obj_def_id = p_hier_ver_id;
4698
4699 if l_hier_version_status = 'PENDING_DELETION' then
4700 l_delete_status := 'N';
4701 return l_delete_status ;
4702 else
4703 return l_delete_status ;
4704 end if;
4705
4706 exception
4707 when NO_DATA_FOUND then --Bug#4320272
4708 return 'N';
4709
4710 when OTHERS then
4711 return l_delete_status;
4712
4713 end is_hier_ver_deleted;
4714
4715 /*===========================================================================+
4716 | FUNCTION is_hier_deleted |
4717 +===========================================================================*/
4718
4719 --
4720 -- This function returns 'N' if the concurrent request is submitted for deleting
4721 -- a Hierarchy.
4722 --
4723
4724 FUNCTION is_hier_deleted (p_hierarchy_id IN NUMBER)
4725 return VARCHAR2 AS
4726
4727 l_delete_status VARCHAR2(1) := 'Y';
4728 l_hier_status VARCHAR2(30);
4729
4730 begin
4731
4732 SELECT distinct flattened_rows_completion_code
4733 INTO l_hier_status
4734 FROM fem_hier_definitions hierDef,
4735 fem_object_definition_b objDef
4736 WHERE hierDef.hierarchy_obj_def_id = objDef.object_definition_id
4737 AND objDef.object_id = p_hierarchy_id;
4738
4739
4740 if l_hier_status = 'PENDING_DELETION' then
4741 l_delete_status := 'N';
4742 end if;
4743
4744 return l_delete_status;
4745 exception
4746 when NO_DATA_FOUND then --Bug#4320272
4747 return 'N';
4748
4749 when OTHERS then
4750 return l_delete_status;
4751
4752 end is_hier_deleted;
4753
4754
4755 /*===========================================================================+
4756 | FUNCTION Can_Delete_Hierarchy |
4757 +===========================================================================*/
4758
4759 --
4760 -- This function returns 'N' if the concurrent request is submitted for deleting
4761 -- a Hierarchy.
4762 --
4763
4764
4765 FUNCTION can_delete_hierarchy (p_hierarchy_id IN NUMBER, p_folder_id IN NUMBER)
4766 return VARCHAR2 AS
4767
4768 l_delete_status VARCHAR2(1) := 'Y';
4769 l_hier_status VARCHAR2(30);
4770 l_write_status VARCHAR2(1);
4771
4772 begin
4773
4774 SELECT distinct flattened_rows_completion_code
4775 INTO l_hier_status
4776 FROM fem_hier_definitions hierDef,
4777 fem_object_definition_b objDef
4778 WHERE hierDef.hierarchy_obj_def_id = objDef.object_definition_id
4779 AND objDef.object_id = p_hierarchy_id;
4780
4781 SELECT WRITE_FLAG
4782 INTO l_write_status
4783 FROM FEM_USER_FOLDERS
4784 WHERE FOLDER_ID = p_folder_id
4785 AND USER_ID = FND_GLOBAL.USER_ID ;
4786
4787 if l_hier_status = 'PENDING_DELETION' then
4788 l_delete_status := 'N';
4789 end if;
4790 if l_write_status <> 'Y' then
4791 l_delete_status := 'N';
4792 end if;
4793
4794 return l_delete_status;
4795 exception
4796 when NO_DATA_FOUND then --Bug#4320272
4797 return 'N';
4798
4799 when OTHERS then
4800 return l_delete_status;
4801 end can_delete_hierarchy;
4802
4803 /*===========================================================================+
4804 | PROCEDURE Launch_Del_Hier_Process |
4805 +===========================================================================*/
4806
4807 --
4808 -- The concurrent program to Delete a Hierarchy.
4809 --
4810 PROCEDURE Launch_Del_Hier_Process(ERRBUFF IN OUT NOCOPY VARCHAR2,
4811 RETCODE IN OUT NOCOPY VARCHAR2,
4812 p_hier_table_name IN VARCHAR2,
4816 l_msg_count NUMBER;
4813 p_hier_obj_id IN NUMBER)
4814 is
4815
4817 l_msg_data VARCHAR2(630);
4818 l_return_status VARCHAR2(1);
4819 l_current_hier_status VARCHAR2(30);
4820
4821
4822 begin
4823
4824 --Get the previous status of 'flattened_rows_completion_code'
4825
4826 SAVEPOINT Launch_Delete_Hier;
4827
4828 -- Bug:4042475
4829 -- When deleting the Hierarchy we set the status of all the versions
4830 -- of the Hierarchy to PENDING_DELETION
4831
4832 UPDATE fem_hier_definitions
4833 SET flattened_rows_completion_code = 'PENDING_DELETION'
4834 WHERE hierarchy_obj_def_id in (select object_definition_id
4835 from fem_object_definition_vl
4836 where object_id = p_hier_obj_id);
4837
4838 delete_hierarchy (p_api_version => 1.0,
4839 p_return_status => l_return_status,
4840 p_msg_count => l_msg_count,
4841 p_msg_data => l_msg_data,
4842 p_hier_table_name => p_hier_table_name,
4843 p_hier_obj_id => p_hier_obj_id);
4844
4845 if l_return_status in ('U', 'E') then
4846
4847 -- If the Hierarchy delete fails for some reason,the status of
4848 -- "flattened_rows_completion_code" will be 'PENDING DELETION'
4849 -- for all its versions.
4850
4851 ROLLBACK TO Launch_Delete_Hier;
4852
4853 RETCODE := 2;
4854 ERRBUFF := l_msg_data;
4855
4856 FND_FILE.put_line(FND_FILE.OUTPUT, l_msg_data);
4857 FND_FILE.put_line(FND_FILE.LOG, l_msg_data);
4858
4859 else
4860
4861 RETCODE := 0;
4862 ERRBUFF := l_msg_data;
4863 end if;
4864
4865 --Bug:4042475
4866
4867 --The follwoing update statement may not update any rows as
4868 --Delete is already done.
4869
4870 UPDATE fem_hier_definitions
4871 SET flattened_rows_completion_code = 'COMPLETE'
4872 WHERE hierarchy_obj_def_id in (select object_definition_id
4873 from fem_object_definition_vl
4874 where object_id = p_hier_obj_id);
4875
4876 commit;
4877
4878 end Launch_Del_Hier_Process;
4879
4880 /*===========================================================================+
4881 | PROCEDURE Delete_Hierarchy |
4882 +===========================================================================*/
4883
4884 --
4885 -- The API to delete a Hierarchy.
4886 --
4887 PROCEDURE Delete_Hierarchy(
4888 p_api_version IN NUMBER ,
4889 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
4890 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
4891 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
4892 p_return_status OUT NOCOPY VARCHAR2 ,
4893 p_msg_count OUT NOCOPY NUMBER ,
4894 p_msg_data OUT NOCOPY VARCHAR2 ,
4895 p_hier_table_name IN VARCHAR2,
4896 p_hier_obj_id IN NUMBER )
4897 is
4898
4899 cursor obj_def_csr (p_object_id IN NUMBER)
4900 is
4901 select object_definition_id
4902 from fem_object_definition_vl
4903 where object_id = p_object_id;
4904
4905 l_sql_stmt VARCHAR2(2000);
4906 l_delete_allowed BOOLEAN;
4907
4908 l_api_name CONSTANT VARCHAR2(30) := 'Delete_Hierarchy' ;
4909 l_api_version CONSTANT NUMBER := 1.0;
4910
4911 begin
4912
4913 SAVEPOINT Delete_Hierarachy_Pvt;
4914
4915 if not FND_API.Compatible_API_Call ( l_api_version,
4916 p_api_version,
4917 l_api_name,
4918 G_PKG_NAME )
4919 then
4920 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
4921 end if;
4922
4923 if FND_API.to_Boolean ( p_init_msg_list ) then
4924 FND_MSG_PUB.initialize ;
4925 end if;
4926
4927 p_return_status := FND_API.G_RET_STS_SUCCESS ;
4928
4929
4930 delete_hier_version( p_api_version => p_api_version,
4931 p_return_status => p_return_status,
4932 p_msg_count => p_msg_count,
4933 p_msg_data => p_msg_data,
4934 p_hier_table_name => p_hier_table_name,
4935 p_hier_obj_id => p_hier_obj_id,
4936 p_hier_version_id => NULL);
4937
4938 if p_return_status <> 'S' then
4939 RAISE FND_API.G_EXC_ERROR;
4940 end if;
4941
4942 DELETE FROM fem_hier_dimension_grps
4943 WHERE hierarchy_obj_id = p_hier_obj_id;
4944
4945 DELETE FROM fem_hier_value_sets
4946 WHERE hierarchy_obj_id = p_hier_obj_id;
4947
4948 DELETE FROM fem_hierarchies
4949 WHERE hierarchy_obj_id = p_hier_obj_id;
4950
4951 IF FND_API.To_Boolean ( p_commit ) THEN
4952
4953 COMMIT WORK;
4954
4955 END iF;
4956
4957 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4961 WHEN FND_API.G_EXC_ERROR THEN
4958 p_data => p_msg_data );
4959
4960 EXCEPTION
4962
4963 ROLLBACK TO Delete_Hierarachy_Pvt ;
4964
4965 p_return_status := FND_API.G_RET_STS_ERROR;
4966
4967 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4968 p_data => p_msg_data );
4969
4970 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4971
4972 ROLLBACK TO Delete_Hierarachy_Pvt ;
4973 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4974
4975 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4976 p_data => p_msg_data );
4977
4978 WHEN OTHERS THEN
4979
4980 ROLLBACK TO Delete_Hierarachy_Pvt ;
4981 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4982
4983 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
4984 p_data => p_msg_data );
4985
4986 end Delete_Hierarchy;
4987
4988 /*===========================================================================+
4989 | PROCEDURE Launch_Del_Hier_Ver_Process |
4990 +===========================================================================*/
4991
4992 --
4993 -- The concurrent program to delete a Hierarchy Version.
4994 --
4995 PROCEDURE Launch_Del_Hier_Ver_Process(ERRBUFF IN OUT NOCOPY VARCHAR2,
4996 RETCODE IN OUT NOCOPY VARCHAR2,
4997 p_hier_table_name IN VARCHAR2,
4998 p_hier_obj_id IN NUMBER,
4999 p_hier_version_id IN NUMBER)
5000 is
5001
5002 l_msg_count NUMBER;
5003 l_return_status VARCHAR2(1);
5004 l_msg_data VARCHAR2(630);
5005 l_current_hier_status VARCHAR2(30);
5006
5007 begin
5008
5009 --Get the previous status of 'flattened_rows_completion_code'
5010
5011 SELECT flattened_rows_completion_code
5012 INTO l_current_hier_status
5013 FROM fem_hier_definitions
5014 WHERE hierarchy_obj_def_id = p_hier_version_id;
5015
5016 --Bug:4042475
5017
5018 UPDATE fem_hier_definitions
5019 SET flattened_rows_completion_code = 'PENDING_DELETION'
5020 WHERE hierarchy_obj_def_id = p_hier_version_id;
5021
5022 commit;
5023
5024 delete_hier_version (p_api_version => 1.0,
5025 p_return_status => l_return_status,
5026 p_msg_count => l_msg_count,
5027 p_msg_data => l_msg_data,
5028 p_hier_table_name => p_hier_table_name,
5029 p_hier_obj_id => p_hier_obj_id,
5030 p_hier_version_id => p_hier_version_id);
5031
5032 if l_return_status in ('U', 'E') then
5033
5034 --Retain the initial status when there is any error.
5035
5036 UPDATE fem_hier_definitions
5037 SET flattened_rows_completion_code = l_current_hier_status
5038 WHERE hierarchy_obj_def_id = p_hier_version_id;
5039
5040 commit;
5041
5042 RETCODE := 2;
5043 ERRBUFF := l_msg_data;
5044
5045 FND_FILE.put_line(FND_FILE.OUTPUT, l_msg_data);
5046 FND_FILE.put_line(FND_FILE.LOG, l_msg_data);
5047
5048 else
5049
5050 RETCODE := 0;
5051 ERRBUFF := l_msg_data;
5052
5053 end if;
5054
5055 --Bug:4042475
5056
5057 UPDATE fem_hier_definitions
5058 SET flattened_rows_completion_code = 'COMPLETE'
5059 WHERE hierarchy_obj_def_id = p_hier_version_id;
5060
5061 commit;
5062
5063 end Launch_Del_Hier_Ver_Process;
5064
5065 /*===========================================================================+
5066 | PROCEDURE Delete_Hier_Version |
5067 +===========================================================================*/
5068
5069 --
5070 -- The API to Delete Hierarchy Version.
5071 --
5072 PROCEDURE Delete_Hier_Version(
5073 p_api_version IN NUMBER ,
5074 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
5075 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
5076 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
5077 p_return_status OUT NOCOPY VARCHAR2 ,
5078 p_msg_count OUT NOCOPY NUMBER ,
5079 p_msg_data OUT NOCOPY VARCHAR2 ,
5080 p_hier_table_name IN VARCHAR2,
5081 p_hier_obj_id IN NUMBER,
5082 p_hier_version_id IN NUMBER)
5083 IS
5084
5085 CURSOR obj_def_csr (p_object_id IN NUMBER)
5086 IS
5087 SELECT object_definition_id
5088 FROM fem_object_definition_vl
5089 WHERE object_id = p_object_id;
5090
5091 CURSOR other_version_exists_csr (p_object_id IN NUMBER,
5092 p_version_id IN NUMBER)
5093 IS
5094 SELECT 'Y' FROM dual
5095 WHERE EXISTs
5096 (SELECT 1
5097 FROM fem_object_catalog_vl obj,
5098 fem_object_definition_vl ver
5099 WHERE obj.object_id = ver.object_id
5100 AND ver.object_definition_id <> p_version_id
5101 AND ver.object_id = p_object_id);
5102
5103 CURSOR l_cost_obj_detail_csr (c_hierarchy_id IN NUMBER,
5104 c_version_id IN NUMBER)
5105 IS
5106 SELECT parent_id,
5107 child_id,
5108 child_sequence_num
5109 FROM fem_cost_objects_hier
5113 WHERE object_definition_id = c_version_id) BETWEEN
5110 WHERE hierarchy_obj_id = c_hierarchy_id
5111 AND (SELECT effective_start_date
5112 FROM fem_object_definition_b
5114 effective_start_date AND effective_end_date;
5115
5116 l_sql_stmt VARCHAR2(2000);
5117 l_dummy VARCHAR2(1) := 'N';
5118 l_delete_allowed BOOLEAN;
5119
5120 l_api_name CONSTANT VARCHAR2(30) := 'Delete_Hier_Version' ;
5121 l_api_version CONSTANT NUMBER := 1.0;
5122
5123 begin
5124
5125 SAVEPOINT Delete_Hier_Version_Pvt;
5126
5127 if not FND_API.Compatible_API_Call ( l_api_version,
5128 p_api_version,
5129 l_api_name,
5130 G_PKG_NAME )
5131 then
5132 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5133 end if;
5134
5135 if FND_API.to_Boolean ( p_init_msg_list ) then
5136 FND_MSG_PUB.initialize ;
5137 end if;
5138
5139 p_return_status := FND_API.G_RET_STS_SUCCESS ;
5140
5141 -- If p_hier_version_id = NULL then we want to delete all the versions
5142 -- for the given p_hier_obj_id.
5143
5144 IF p_hier_version_id is NULL THEN
5145
5146 FOR obj_def_rec IN obj_def_csr (p_object_id => p_hier_obj_id) LOOP
5147
5148 DELETE FROM fem_hier_definitions
5149 WHERE hierarchy_obj_def_id = obj_def_rec.object_definition_id;
5150
5151 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
5152
5153 DELETE FROM fem_cost_obj_hier_qty
5154 WHERE relationship_id IN (SELECT relationship_id
5155 FROM fem_cost_objects_hier
5156 WHERE hierarchy_obj_id = p_hier_obj_id);
5157
5158 DELETE FROM fem_cost_objects_hier
5159 WHERE hierarchy_obj_id = p_hier_obj_id;
5160
5161 ELSE
5162
5163 l_sql_stmt := 'DELETE FROM '||p_hier_table_name||
5164 ' WHERE hierarchy_obj_def_id = '||obj_def_rec.object_definition_id;
5165
5166 execute immediate l_sql_stmt;
5167
5168 END IF;
5169
5170 FEM_BUSINESS_RULE_PVT.DeleteObjectDefinition
5171 (p_object_type_code => 'HIERARCHY',
5172 p_obj_def_id => obj_def_rec.object_definition_id,
5173 x_return_status => p_return_status,
5174 x_msg_count => p_msg_count,
5175 x_msg_data => p_msg_data);
5176
5177 if p_return_status = FND_API.G_RET_STS_ERROR then
5178
5179 raise FND_API.G_EXC_ERROR;
5180
5181 elsif p_return_status = FND_API.G_RET_STS_UNEXP_ERROR then
5182
5183 raise FND_API.G_EXC_UNEXPECTED_ERROR;
5184
5185 end if;
5186
5187 END LOOP;
5188
5189 ELSE
5190
5191 -- If p_hier_version_id is not NULL then we want to delete the specific
5192 -- Hier. Version.
5193 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
5194
5195 FOR l_cost_obj_detail_rec IN
5196 l_cost_obj_detail_csr(c_hierarchy_id => p_hier_obj_id,
5197 c_version_id => p_hier_version_id)
5198 LOOP
5199
5200 remove_relation(p_api_version => 1.0,
5201 x_return_status => p_return_status,
5202 x_msg_count => p_msg_count,
5203 x_msg_data => p_msg_data,
5204 p_hierarchy_id => p_hier_obj_id,
5205 p_version_id => p_hier_version_id,
5206 p_parent_id => l_cost_obj_detail_rec.parent_id,
5207 p_child_id => l_cost_obj_detail_rec.child_id,
5208 p_child_sequence_num => l_cost_obj_detail_rec.child_sequence_num,
5209 p_hier_table_name => 'FEM_COST_OBJECTS_HIER',
5210 p_remove_all_children_flag => 'N');
5211
5212 END LOOP;
5213
5214 ELSE
5215
5216 l_sql_stmt := 'DELETE FROM '||p_hier_table_name||
5217 ' WHERE hierarchy_obj_def_id = '||p_hier_version_id;
5218
5219 execute immediate l_sql_stmt;
5220
5221 END IF; -- p_hier_table_name = 'FEM_COST_OBJECTS_HIER'
5222
5223 DELETE FROM fem_hier_definitions
5224 WHERE hierarchy_obj_def_id = p_hier_version_id;
5225
5226 FEM_BUSINESS_RULE_PVT.DeleteObjectDefinition
5227 (p_object_type_code => 'HIERARCHY',
5228 p_obj_def_id => p_hier_version_id,
5229 x_return_status => p_return_status,
5230 x_msg_count => p_msg_count,
5231 x_msg_data => p_msg_data);
5232
5233 if p_return_status = FND_API.G_RET_STS_ERROR then
5234
5235 raise FND_API.G_EXC_ERROR;
5236
5237
5238 elsif p_return_status = FND_API.G_RET_STS_UNEXP_ERROR then
5239
5240 raise FND_API.G_EXC_UNEXPECTED_ERROR;
5241
5242 end if;
5243
5244 END IF;
5245
5246 IF FND_API.To_Boolean ( p_commit ) THEN
5247
5248 COMMIT WORK;
5249
5250 END iF;
5251
5252 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
5253 p_data => p_msg_data );
5254
5255 EXCEPTION
5256 WHEN FND_API.G_EXC_ERROR THEN
5257
5258 ROLLBACK TO Delete_Hier_Version_Pvt ;
5259
5263 p_data => p_msg_data );
5260 p_return_status := FND_API.G_RET_STS_ERROR;
5261
5262 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
5264
5265 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5266
5267 ROLLBACK TO Delete_Hier_Version_Pvt ;
5268 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5269
5270 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
5271 p_data => p_msg_data );
5272
5273 WHEN OTHERS THEN
5274
5275 ROLLBACK TO Delete_Hier_Version_Pvt ;
5276 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5277
5278 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
5279 p_data => p_msg_data );
5280
5281
5282 end Delete_Hier_Version;
5283
5284 /*===========================================================================+
5285 | PROCEDURE Remove_Nodes |
5286 +===========================================================================*/
5287
5288 --
5289 -- The API to remove a node along with its descendant.
5290 --
5291 PROCEDURE Remove_Nodes
5292 (
5293 p_api_version IN NUMBER,
5294 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
5295 p_commit IN VARCHAR2 := FND_API.G_FALSE,
5296 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
5297 x_return_status OUT NOCOPY VARCHAR2,
5298 x_msg_count OUT NOCOPY NUMBER,
5299 x_msg_data OUT NOCOPY VARCHAR2,
5300 --
5301 p_version_id IN NUMBER,
5302 p_member_id IN NUMBER,
5303 p_value_set_id IN NUMBER,
5304 p_hier_table_name IN VARCHAR2,
5305 p_value_set_required_flag IN VARCHAR2,
5306 p_flatten_rows_flag IN VARCHAR2,
5307 p_user_id IN NUMBER
5308 )
5309 IS
5310 --
5311 l_api_name CONSTANT VARCHAR2(30) := 'Remove_Nodes';
5312 l_api_version CONSTANT NUMBER := 1.0;
5313 --
5314
5315 TYPE l_dhm_csr_type is REF CURSOR;
5316 l_hier_csr l_dhm_csr_type;
5317 l_root_csr l_dhm_csr_type;
5318 l_dspl_csr l_dhm_csr_type;
5319
5320 -- Start Bug#4022561
5321
5322 l_imm_parent_csr l_dhm_csr_type;
5323 l_imm_child_csr l_dhm_csr_type;
5324
5325 -- End Bug#4022561
5326
5327
5328
5329 TYPE l_member_id_tbl_type is TABLE of
5330 FEM_PRODUCTS_HIER.CHILD_ID%TYPE index by BINARY_INTEGER;
5331
5332 TYPE l_depth_num_tbl_type is TABLE of
5333 FEM_PRODUCTS_HIER.CHILD_DEPTH_NUM%TYPE index by BINARY_INTEGER;
5334
5335 TYPE l_value_set_id_tbl_type is TABLE of
5336 FEM_PRODUCTS_HIER.CHILD_VALUE_SET_ID%TYPE index by BINARY_INTEGER;
5337
5338 TYPE l_dis_ord_num_tbl_type is TABLE of
5339 FEM_PRODUCTS_HIER.DISPLAY_ORDER_NUM%TYPE index by BINARY_INTEGER;
5340
5341 l_child_id_tbl l_member_id_tbl_type;
5342 l_child_value_set_id_tbl l_value_set_id_tbl_type;
5343 l_child_depth_num_tbl l_depth_num_tbl_type;
5344 l_display_order_num_tbl l_dis_ord_num_tbl_type;
5345
5346 -- Start Bug#4022561
5347
5348 l_imm_child_id_tbl l_member_id_tbl_type;
5349 l_imm_child_value_set_id_tbl l_value_set_id_tbl_type;
5350
5351 -- End Bug#4022561
5352
5353 l_parent_id NUMBER;
5354 l_parent_value_set_id NUMBER := 0;
5355 l_parent_depth_num NUMBER;
5356 l_child_id NUMBER;
5357 l_child_value_set_id NUMBER;
5358 l_child_depth_num NUMBER := 1;
5359 l_display_order_num NUMBER;
5360 l_row_count NUMBER;
5361 l_req_id NUMBER;
5362 l_rowid VARCHAR2(20);
5363 l_select_stmt VARCHAR2(1000);
5364 l_delete_stmt VARCHAR2(1000);
5365 l_update_stmt VARCHAR2(1000);
5366 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
5367 l_msg_count NUMBER;
5368 l_msg_data VARCHAR2(2000);
5369
5370 BEGIN
5371 --
5372 SAVEPOINT Hier_Operation_Pvt ;
5373 --
5374 IF NOT FND_API.Compatible_API_Call ( l_api_version,
5375 p_api_version,
5376 l_api_name,
5377 G_PKG_NAME )
5378 THEN
5379 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5380 END IF;
5381 --
5382
5383 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
5384 FND_MSG_PUB.initialize ;
5385 END IF;
5386 --
5387 x_return_status := FND_API.G_RET_STS_SUCCESS ;
5388 --
5389
5390 IF (p_value_set_required_flag IS NULL OR p_value_set_required_flag = 'N')
5391 THEN
5392 -- Get the whole hierarchy to be removed from the source down
5393
5394 l_select_stmt := 'SELECT h.child_id, h.child_depth_num, ' ||
5395 'h.display_order_num ' ||
5396 'FROM ' || p_hier_table_name || ' h ' ||
5397 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
5401 'h.display_order_num ' ||
5398 'h.child_id = :2 AND h.single_depth_flag = ''Y'' ' ||
5399 'UNION ' ||
5400 'SELECT h.child_id, h.child_depth_num, ' ||
5402 'FROM ' || p_hier_table_name || ' h ' ||
5403 'WHERE h.hierarchy_obj_def_id = :3 AND ' ||
5404 'h.parent_id <> h.child_id ' ||
5405 'START WITH h.parent_id = :4 AND ' ||
5406 'h.hierarchy_obj_def_id = :5 AND ' ||
5407 'h.single_depth_flag = ''Y'' AND ' ||
5408 'h.parent_depth_num <> h.child_depth_num ' ||
5409 'CONNECT BY PRIOR h.child_id = h.parent_id AND ' ||
5410 'h.hierarchy_obj_def_id = :6 AND ' ||
5411 'h.single_depth_flag = ''Y'' AND ' ||
5412 'h.parent_depth_num <> h.child_depth_num ' ||
5413 'ORDER BY child_depth_num DESC';
5414
5415 OPEN l_hier_csr for l_select_stmt
5416 USING p_version_id, p_member_id, p_version_id, p_member_id,
5417 p_version_id, p_version_id;
5418 FETCH l_hier_csr BULK COLLECT
5419 into l_child_id_tbl, l_child_depth_num_tbl, l_display_order_num_tbl;
5420
5421 l_row_count := l_hier_csr%ROWCOUNT;
5422 CLOSE l_hier_csr;
5423
5424 IF (l_row_count < 1)
5425 THEN
5426 raise no_data_found;
5427 END IF;
5428
5429 -- Find out whether the member is a root node or not,
5430 -- and find out the display order num.
5431 -- This is necessary since the query to find out the display number
5432 -- is different
5433
5434 l_select_stmt := 'SELECT h.parent_id, h.parent_depth_num, ' ||
5435 'h.child_depth_num, h.display_order_num ' ||
5436 'FROM ' || p_hier_table_name || ' h ' ||
5437 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
5438 'h.child_id = :2 AND h.single_depth_flag = ''Y'' ';
5439
5440 OPEN l_root_csr for l_select_stmt
5441 USING p_version_id, p_member_id;
5442 FETCH l_root_csr
5443 into l_parent_id, l_parent_depth_num, l_child_depth_num,
5444 l_display_order_num;
5445 CLOSE l_root_csr;
5446
5447 l_delete_stmt := 'DELETE FROM ' || p_hier_table_name ||
5448 ' WHERE hierarchy_obj_def_id = :1' ||
5449 ' AND child_id = :2' ||
5450 ' AND child_depth_num = :3' ||
5451 ' AND single_depth_flag = ''Y''';
5452
5453 l_update_stmt := 'Update ' || p_hier_table_name || ' ' ||
5454 'SET display_order_num = display_order_num - 1, ' ||
5455 'object_version_number = object_version_number + 1, ' ||
5456 'last_updated_by = :1, ' ||
5457 'last_update_date = :2' ||
5458 'WHERE hierarchy_obj_def_id = :3 ' ||
5459 'AND child_id = :4 ' ||
5460 'AND child_depth_num = :5 ' ||
5461 'AND single_depth_flag = ''Y''';
5462
5463
5464 IF (l_child_depth_num = 1)
5465 THEN
5466
5467 -- root node
5468 -- Find out all the root nodes whoes display order number is larger
5469 -- than the focus member's display order num. Then decrease 1 from the
5470 -- current display order number.
5471
5472 l_select_stmt := 'SELECT child_id ' ||
5473 'FROM ' || p_hier_table_name || ' ' ||
5474 'WHERE hierarchy_obj_def_id = :1 ' ||
5475 'AND parent_id = child_id ' ||
5476 'AND single_depth_flag = ''Y'' ' ||
5477 'AND display_order_num > :2 ';
5478
5479 OPEN l_dspl_csr for l_select_stmt
5480 USING p_version_id, l_display_order_num;
5481 LOOP
5482 FETCH l_dspl_csr INTO l_child_id;
5483 EXIT WHEN l_dspl_csr%NOTFOUND;
5484
5485 -- update root level nodes display order num
5486 execute immediate l_update_stmt
5487 using p_user_id, sysdate, p_version_id, l_child_id, 1;
5488 END LOOP;
5489 CLOSE l_dspl_csr;
5490
5491 ELSE
5492
5493 -- not a root node
5494 -- Find out all the sibling nodes whoes display order number is larger
5495 -- than the focus member's display order num. Then decrease 1 from the
5496 -- current display order number.
5497
5498 l_select_stmt := 'SELECT child_id, child_depth_num ' ||
5499 'FROM ' || p_hier_table_name || ' ' ||
5500 'WHERE hierarchy_obj_def_id = :1 ' ||
5501 'AND parent_id = :2 ' ||
5502 'AND single_depth_flag = ''Y'' ' ||
5503 'AND NOT (parent_id = child_id ' ||
5504 'AND parent_depth_num = child_depth_num) ' ||
5505 'AND display_order_num > :3 ';
5506
5507 OPEN l_dspl_csr for l_select_stmt
5508 USING p_version_id, l_parent_id, l_display_order_num;
5509 LOOP
5510 FETCH l_dspl_csr INTO l_child_id,l_child_depth_num;
5511 EXIT WHEN l_dspl_csr%NOTFOUND;
5512
5516
5513 execute immediate l_update_stmt
5514 using p_user_id, sysdate, p_version_id, l_child_id,
5515 l_child_depth_num;
5517 END LOOP;
5518 CLOSE l_dspl_csr;
5519
5520 -- Start Bug#4022561
5521
5522 IF(p_flatten_rows_flag = 'Y')
5523 THEN
5524
5525 /*
5526 * Fetch all the immediate children
5527 * of the 'to be deleted' member
5528 */
5529
5530
5531 l_select_stmt := ' SELECT child_id ' ||
5532 ' FROM ' || p_hier_table_name ||
5533 ' WHERE hierarchy_obj_def_id = :1 ' ||
5534 ' AND parent_id = :2 ' ||
5535 ' AND single_depth_flag = ''Y''';
5536
5537 OPEN l_imm_child_csr for l_select_stmt
5538 USING p_version_id, p_member_id;
5539
5540 FETCH l_imm_child_csr BULK COLLECT
5541 into l_imm_child_id_tbl;
5542
5543 CLOSE l_imm_child_csr;
5544
5545
5546
5547
5548 /* Also fetch the immediate parent info of the
5549 * 'to be deleted' member. This will be passed
5550 * to unflatten_focus_node_tree() where leaf node
5551 * entry for parent node will be inserted depending
5552 * upon whether the parent has any other children and
5553 * it is a root node or not.
5554 */
5555
5556
5557
5558 l_select_stmt := ' SELECT parent_id ' ||
5559 ' FROM ' || p_hier_table_name || ' h ' ||
5560 ' WHERE h.hierarchy_obj_def_id = :1 ' ||
5561 ' AND h.child_id = :2 ' ||
5562 ' AND h.single_depth_flag = ''Y'' ';
5563
5564 OPEN l_imm_parent_csr FOR l_select_stmt
5565 USING p_version_id, p_member_id;
5566 LOOP
5567 FETCH l_imm_parent_csr
5568 into l_parent_id;
5569 EXIT WHEN l_imm_parent_csr%NOTFOUND;
5570 END LOOP;
5571 CLOSE l_imm_parent_csr;
5572
5573 END IF; -- End flatten_rows_flag
5574
5575 -- End Bug#4022561
5576
5577 END IF;
5578
5579 -- Delete the whole hierarchy from the focus node down
5580
5581 -- Begin bug fix# 3916681. Moved the check to validate for the
5582 -- last root to the HierVerDetailsAMImpl.checkChilsExists().
5583
5584 FORALL i in l_child_id_tbl.FIRST .. l_child_id_tbl.LAST
5585 execute immediate l_delete_stmt
5586 using p_version_id, l_child_id_tbl(i), l_child_depth_num_tbl(i);
5587
5588 -- End bug fix# 3916681.
5589
5590
5591 ELSE
5592
5593 -- Get the whole hierarchy to be removed from the source down
5594
5595 l_select_stmt := 'SELECT h.child_id, h.child_value_set_id, ' ||
5596 'h.child_depth_num, h.display_order_num ' ||
5597 'FROM ' || p_hier_table_name || ' h ' ||
5598 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
5599 'h.child_id = :2 AND h.child_value_set_id = :3 AND ' ||
5600 'h.single_depth_flag = ''Y'' ' ||
5601 'UNION ' ||
5602 'SELECT h.child_id, h.child_value_set_id, ' ||
5603 'h.child_depth_num, h.display_order_num ' ||
5604 'FROM ' || p_hier_table_name || ' h ' ||
5605 'WHERE h.hierarchy_obj_def_id = :4 AND ' ||
5606 'NOT (h.parent_id = h.child_id AND ' ||
5607 'h.parent_value_set_id = h.child_value_set_id) ' ||
5608 'START WITH h.parent_id = :5 AND ' ||
5609 'h.parent_value_set_id = :6 AND ' ||
5610 'h.hierarchy_obj_def_id = :7 AND ' ||
5611 'h.single_depth_flag = ''Y'' AND ' ||
5612 'h.parent_depth_num <> h.child_depth_num ' ||
5613 'CONNECT BY PRIOR h.child_id = h.parent_id AND ' ||
5614 'PRIOR h.child_value_set_id = h.parent_value_set_id ' ||
5615 'AND ' ||
5616 'h.hierarchy_obj_def_id = :8 AND ' ||
5617 'h.single_depth_flag = ''Y'' AND ' ||
5618 'h.parent_depth_num <> h.child_depth_num ' ||
5619 'ORDER BY child_depth_num DESC';
5620
5621 OPEN l_hier_csr for l_select_stmt
5622 USING p_version_id, p_member_id, p_value_set_id,
5623 p_version_id, p_member_id, p_value_set_id,
5624 p_version_id, p_version_id;
5625 FETCH l_hier_csr BULK COLLECT
5626 into l_child_id_tbl, l_child_value_set_id_tbl, l_child_depth_num_tbl,
5627 l_display_order_num_tbl;
5628
5629 l_row_count := l_hier_csr%ROWCOUNT;
5630 CLOSE l_hier_csr;
5631
5632 IF (l_row_count < 1)
5633 THEN
5634 raise no_data_found;
5635 END IF;
5636
5637 -- Find out whether the member is a root node or not,
5638 -- and find out the display order num
5639 -- This is necessary since the query to find out the display number
5640 -- is different
5641
5645 'FROM ' || p_hier_table_name || ' h ' ||
5642 l_select_stmt := 'SELECT h.parent_id, h.parent_value_set_id, ' ||
5643 'h.parent_depth_num, h.child_depth_num, ' ||
5644 'h.display_order_num ' ||
5646 'WHERE h.hierarchy_obj_def_id = :1 AND ' ||
5647 'h.child_id = :2 AND h.child_value_set_id = :3 AND ' ||
5648 'h.single_depth_flag = ''Y'' ';
5649
5650 OPEN l_root_csr for l_select_stmt
5651 USING p_version_id, p_member_id, p_value_set_id;
5652 FETCH l_root_csr
5653 into l_parent_id, l_parent_value_set_id, l_parent_depth_num,
5654 l_child_depth_num, l_display_order_num;
5655 CLOSE l_root_csr;
5656
5657 l_delete_stmt := 'DELETE FROM ' || p_hier_table_name ||
5658 ' WHERE hierarchy_obj_def_id = :1' ||
5659 ' AND child_id = :2' ||
5660 ' AND child_value_set_id = :3 ' ||
5661 ' AND child_depth_num = :4' ||
5662 ' AND single_depth_flag = ''Y''';
5663
5664 l_update_stmt := 'Update ' || p_hier_table_name || ' ' ||
5665 'SET display_order_num = display_order_num - 1, ' ||
5666 'object_version_number = object_version_number + 1, ' ||
5667 'last_updated_by = :1, ' ||
5668 'last_update_date = :2' ||
5669 'WHERE hierarchy_obj_def_id = :3 ' ||
5670 'AND child_id = :4 ' ||
5671 'AND child_value_set_id = :5 ' ||
5672 'AND child_depth_num = :6 ' ||
5673 'AND single_depth_flag = ''Y''';
5674
5675 IF (l_child_depth_num = 1)
5676 THEN
5677 -- root node
5678 -- Find out all the root nodes whoes display order number is larger
5679 -- than the focus member's display order num. Then decrease 1 from the
5680 -- current display order number.
5681
5682 l_select_stmt := 'SELECT child_id, child_value_set_id ' ||
5683 'FROM ' || p_hier_table_name || ' ' ||
5684 'WHERE hierarchy_obj_def_id = :1 ' ||
5685 'AND parent_id = child_id ' ||
5686 'AND parent_value_set_id = child_value_set_id ' ||
5687 'AND single_depth_flag = ''Y'' ' ||
5688 'AND display_order_num > :2 ';
5689
5690 OPEN l_dspl_csr for l_select_stmt
5691 USING p_version_id, l_display_order_num;
5692 LOOP
5693 FETCH l_dspl_csr INTO l_child_id, l_child_value_set_id;
5694 EXIT WHEN l_dspl_csr%NOTFOUND;
5695
5696 -- update root level nodes display order num
5697 execute immediate l_update_stmt
5698 using p_user_id, sysdate, p_version_id, l_child_id,
5699 l_child_value_set_id, 1;
5700 END LOOP;
5701 CLOSE l_dspl_csr;
5702
5703
5704 ELSE
5705 -- Not a root.
5706 -- Find out all the sibling nodes whoes display order number is larger
5707 -- than the focus member's display order num. Then decrease 1 from the
5708 -- current display order number.
5709
5710 l_select_stmt := 'SELECT child_id, child_value_set_id, ' ||
5711 'child_depth_num ' ||
5712 'FROM ' || p_hier_table_name || ' ' ||
5713 'WHERE hierarchy_obj_def_id = :1 ' ||
5714 'AND parent_id = :2 ' ||
5715 'AND parent_value_set_id = :3 ' ||
5716 'AND single_depth_flag = ''Y'' ' ||
5717 'AND NOT(parent_id = child_id ' ||
5718 'AND parent_value_set_id = child_value_set_id ' ||
5719 'AND parent_depth_num = child_depth_num) ' ||
5720 'AND display_order_num > :4 ';
5721
5722 OPEN l_dspl_csr for l_select_stmt
5723 USING p_version_id, l_parent_id,
5724 l_parent_value_set_id, l_display_order_num;
5725 LOOP
5726 FETCH l_dspl_csr
5727 INTO l_child_id, l_child_value_set_id, l_child_depth_num;
5728 EXIT WHEN l_dspl_csr%NOTFOUND;
5729
5730 execute immediate l_update_stmt
5731 using p_user_id, sysdate, p_version_id, l_child_id,
5732 l_child_value_set_id, l_child_depth_num;
5733
5734 END LOOP;
5735 CLOSE l_dspl_csr;
5736
5737 -- Start Bug#4022561
5738
5739 IF(p_flatten_rows_flag = 'Y')
5740 THEN
5741
5742 /*
5743 * Fetch all the immediate children
5744 * of the 'to be deleted' member
5745 */
5746
5747
5748 l_select_stmt := ' SELECT child_id, child_value_set_id ' ||
5749 ' FROM ' || p_hier_table_name ||
5750 ' WHERE hierarchy_obj_def_id = :1 ' ||
5751 ' AND parent_id = :2 ' ||
5752 ' AND parent_value_set_id = :3 ' ||
5753 ' AND single_depth_flag = ''Y''';
5754
5755 OPEN l_imm_child_csr for l_select_stmt
5756 USING p_version_id, p_member_id,p_value_set_id;
5757
5758 FETCH l_imm_child_csr BULK COLLECT
5759 into l_imm_child_id_tbl,l_imm_child_value_set_id_tbl;
5760
5761 CLOSE l_imm_child_csr;
5762
5763
5764 /* Also fetch the immediate parent info of the
5768 * upon whether the parent has any other children and
5765 * 'to be deleted' member. This will be passed
5766 * to unflatten_focus_node_tree() where leaf node
5767 * entry for parent node will be inserted depending
5769 * it is a root node or not.
5770 */
5771
5772
5773
5774 l_select_stmt := ' SELECT parent_id, parent_value_set_id ' ||
5775 ' FROM ' || p_hier_table_name || ' h ' ||
5776 ' WHERE h.hierarchy_obj_def_id = :1 ' ||
5777 ' AND h.child_id = :2 ' ||
5778 ' AND h.child_value_set_id = :3 ' ||
5779 ' AND h.single_depth_flag = ''Y'' ';
5780
5781 OPEN l_imm_parent_csr FOR l_select_stmt
5782 USING p_version_id, p_member_id, p_value_set_id;
5783 LOOP
5784 FETCH l_imm_parent_csr
5785 into l_parent_id,l_parent_value_set_id;
5786 EXIT WHEN l_imm_parent_csr%NOTFOUND;
5787 END LOOP;
5788 CLOSE l_imm_parent_csr;
5789
5790 END IF; -- End flatten_rows_flag
5791
5792 -- End Bug#4022561
5793
5794
5795
5796 END IF;
5797
5798 -- Delete the whole hierarchy from the focus node down
5799
5800 -- Begin bug fix# 3916681. Moved the check to validate for the
5801 -- last root to the HierVerDetailsAMImpl.checkChilsExists().
5802
5803 FORALL i in l_child_id_tbl.FIRST .. l_child_id_tbl.LAST
5804 execute immediate l_delete_stmt
5805 using p_version_id, l_child_id_tbl(i),
5806 l_child_value_set_id_tbl(i), l_child_depth_num_tbl(i);
5807
5808 -- End bug fix# 3916681.
5809
5810 END IF;
5811
5812 IF FND_API.To_Boolean(p_commit)
5813 THEN
5814 COMMIT WORK;
5815 END IF;
5816
5817 IF (p_flatten_rows_flag = 'Y')
5818 THEN
5819 l_req_id := FND_REQUEST.SUBMIT_REQUEST
5820 (application => 'FEM',
5821 program => 'DHMHVMFL',
5822 description => NULL,
5823 start_time => NULL,
5824 sub_request => FALSE,
5825 argument1 => p_version_id,
5826 argument2 => p_hier_table_name,
5827 argument3 => p_member_id,
5828 argument4 => p_value_set_id,
5829 argument5 => l_parent_id,
5830 argument6 => l_parent_value_set_id,
5831 argument7 => NULL,
5832 argument8 => NULL,
5833 argument9 => 'Remove');
5834
5835 -- Start Bug#4022561
5836
5837 /* Since we can't pass args of type pl/sql
5838 * collection to FND_REQUEST.SUBMIT_REQUEST,
5839 * submit as many concurrent requests as the
5840 * the no. of immediate children of the
5841 * 'to be deleted member'.
5842 */
5843
5844 IF(l_imm_child_id_tbl.COUNT > 0 ) THEN
5845 FOR i in l_imm_child_id_tbl.FIRST .. l_imm_child_id_tbl.LAST
5846 LOOP
5847 l_req_id := FND_REQUEST.SUBMIT_REQUEST
5848 (application => 'FEM',
5849 program => 'DHMHVMFL',
5850 description => NULL,
5851 start_time => NULL,
5852 sub_request => FALSE,
5853 argument1 => p_version_id,
5854 argument2 => p_hier_table_name,
5855 argument3 => p_member_id,
5856 argument4 => p_value_set_id,
5857 argument5 => NULL,
5858 argument6 => NULL,
5859 argument7 => l_imm_child_id_tbl(i),
5860 argument8 => l_imm_child_value_set_id_tbl(i),
5861 argument9 => 'RemoveImmChildren');
5862 END LOOP;
5863 END IF;
5864
5865 -- End Bug#4022561
5866 END IF;
5867
5868 EXCEPTION
5869
5870 --
5871 WHEN FND_API.G_EXC_ERROR THEN
5872 --
5873 ROLLBACK TO Hier_Operation_Pvt ;
5874 x_return_status := FND_API.G_RET_STS_ERROR;
5875 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
5876 p_data => x_msg_data );
5877 --
5878 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5879 --
5880 ROLLBACK TO Hier_Operation_Pvt ;
5881 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5882 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
5883 p_data => x_msg_data );
5884 --
5885 WHEN NO_DATA_FOUND THEN
5886 --Bug#4878100
5887 ROLLBACK TO Hier_Operation_Pvt ;
5888 x_return_status := FND_API.G_RET_STS_ERROR;
5889 FND_MESSAGE.SET_NAME('FEM', 'FEM_DHM_MEM_DELETED_ERR');
5890 FND_MSG_PUB.ADD;
5891
5892 --
5893 WHEN OTHERS THEN
5894 --
5895 ROLLBACK TO Hier_Operation_Pvt ;
5896 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5897 --
5898 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5899 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
5900 l_api_name);
5901 END if;
5902 --
5903 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
5907 END Remove_Nodes;
5904 p_data => x_msg_data );
5905 --
5906
5908
5909 /*===========================================================================+
5910 | PROCEDURE Move_Nodes |
5911 +===========================================================================*/
5912
5913 --
5914 -- The API to move a node along with its descendant to another node.
5915 --
5916 PROCEDURE Move_Nodes
5917 (
5918 p_api_version IN NUMBER,
5919 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
5920 p_commit IN VARCHAR2 := FND_API.G_FALSE,
5921 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
5922 x_return_status OUT NOCOPY VARCHAR2,
5923 x_msg_count OUT NOCOPY NUMBER,
5924 x_msg_data OUT NOCOPY VARCHAR2,
5925 --
5926 p_version_id IN NUMBER,
5927 p_source_member_id IN NUMBER,
5928 p_source_value_set_id IN NUMBER,
5929 p_dest_member_id IN NUMBER,
5930 p_dest_value_set_id IN NUMBER,
5931 p_hier_table_name IN VARCHAR2,
5932 p_value_set_required_flag IN VARCHAR2,
5933 p_flatten_rows_flag IN VARCHAR2,
5934 p_user_id IN NUMBER
5935 )
5936 IS
5937 --
5938 l_api_name CONSTANT VARCHAR2(30) := 'Move_Nodes';
5939 l_api_version CONSTANT NUMBER := 1.0;
5940 --
5941
5942 TYPE l_dhm_csr_type is REF CURSOR;
5943 l_src_node_csr l_dhm_csr_type;
5944 l_whl_hier_csr l_dhm_csr_type;
5945 l_dpth_csr l_dhm_csr_type;
5946 l_leaf_csr l_dhm_csr_type;
5947
5948 TYPE l_member_id_tbl_type is TABLE of
5949 FEM_PRODUCTS_HIER.CHILD_ID%TYPE index by BINARY_INTEGER;
5950
5951 TYPE l_depth_num_tbl_type is TABLE of
5952 FEM_PRODUCTS_HIER.CHILD_DEPTH_NUM%TYPE index by BINARY_INTEGER;
5953
5954 TYPE l_value_set_id_tbl_type is TABLE of
5955 FEM_PRODUCTS_HIER.CHILD_VALUE_SET_ID%TYPE index by BINARY_INTEGER;
5956
5957 TYPE l_dis_ord_num_tbl_type is TABLE of
5958 FEM_PRODUCTS_HIER.DISPLAY_ORDER_NUM%TYPE index by BINARY_INTEGER;
5959
5960 TYPE l_weighting_pct_tbl_type is TABLE of
5961 FEM_PRODUCTS_HIER.WEIGHTING_PCT%TYPE index by BINARY_INTEGER;
5962
5963 l_parent_id_tbl l_member_id_tbl_type;
5964 l_parent_value_set_id_tbl l_value_set_id_tbl_type;
5965 l_parent_depth_num_tbl l_depth_num_tbl_type;
5966 l_child_id_tbl l_member_id_tbl_type;
5967 l_child_value_set_id_tbl l_value_set_id_tbl_type;
5968 l_child_depth_num_tbl l_depth_num_tbl_type;
5969 l_display_order_num_tbl l_dis_ord_num_tbl_type;
5970 l_weighting_pct_tbl l_weighting_pct_tbl_type;
5971 l_parent_depth_num NUMBER;
5972 l_child_depth_num NUMBER := 0;
5973 l_display_order_num NUMBER;
5974 l_depth_gap NUMBER;
5975 l_old_child_depth_num NUMBER;
5976 l_weighting_pct NUMBER(3,2);
5977 l_last_update_login NUMBER:= FND_GLOBAL.Login_Id ;
5978 l_detailed_row_count NUMBER := 0;
5979 l_leaf_row_count NUMBER := 0;
5980 l_req_id NUMBER;
5981 l_rowid VARCHAR2(20);
5982 l_select_stmt VARCHAR2(1000);
5983 l_insert_stmt VARCHAR2(1000);
5984 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
5985 l_msg_count NUMBER;
5986 l_msg_data VARCHAR2(2000);
5987 BEGIN
5988 --
5989 SAVEPOINT Hier_Operation_Pvt ;
5990 --
5991 IF NOT FND_API.Compatible_API_Call ( l_api_version,
5992 p_api_version,
5993 l_api_name,
5994 G_PKG_NAME )
5995 THEN
5996 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5997 END IF;
5998 --
5999
6000 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
6001 FND_MSG_PUB.initialize ;
6002 END IF;
6003 --
6004 x_return_status := FND_API.G_RET_STS_SUCCESS ;
6005 --
6006
6007 -- Recorde the whole hierarchy from the source node down. Remove the
6008 -- hierarchy that was recorderd previously. Then add then back as
6009 -- children of the destination member.
6010
6011 IF (p_value_set_required_flag IS NULL OR p_value_set_required_flag = 'N')
6012 THEN
6013
6014 -- Find the child depth num and weighting pct that will be used
6015 -- to add the souce node to the destination node
6016
6017 l_select_stmt := 'SELECT child_depth_num, weighting_pct ' ||
6018 'FROM ' || p_hier_table_name || ' ' ||
6019 'WHERE hierarchy_obj_def_id = :1 AND child_id = :2 ' ||
6020 'AND single_depth_flag = ''Y''';
6021
6022 OPEN l_src_node_csr for l_select_stmt
6023 USING p_version_id, p_source_member_id;
6024 FETCH l_src_node_csr
6025 into l_old_child_depth_num, l_weighting_pct;
6026 CLOSE l_src_node_csr;
6027
6028 -- Find the whole hierarchy from the source node down (Do not include
6029 -- the dource node).
6030
6031 l_select_stmt := 'SELECT parent_id, parent_depth_num, ' ||
6035 'WHERE hierarchy_obj_def_id = :1 AND ' ||
6032 'child_id, child_depth_num, ' ||
6033 'display_order_num, weighting_pct ' ||
6034 'FROM ' || p_hier_table_name || ' ' ||
6036 'parent_id <> child_id ' ||
6037 'START WITH parent_id = :2 AND ' ||
6038 'hierarchy_obj_def_id = :3 AND ' ||
6039 'single_depth_flag = ''Y'' AND ' ||
6040 'parent_depth_num <> child_depth_num ' ||
6041 'CONNECT BY PRIOR child_id = parent_id AND ' ||
6042 'hierarchy_obj_def_id = :4 AND ' ||
6043 'single_depth_flag = ''Y'' AND ' ||
6044 'parent_depth_num <> child_depth_num ' ||
6045 'ORDER BY child_depth_num DESC';
6046
6047 OPEN l_whl_hier_csr for l_select_stmt
6048 USING p_version_id, p_source_member_id, p_version_id, p_version_id;
6049 FETCH l_whl_hier_csr BULK COLLECT
6050 into l_parent_id_tbl, l_parent_depth_num_tbl,
6051 l_child_id_tbl, l_child_depth_num_tbl,
6052 l_display_order_num_tbl, l_weighting_pct_tbl;
6053
6054 l_detailed_row_count := l_whl_hier_csr%ROWCOUNT;
6055 CLOSE l_whl_hier_csr;
6056
6057 -- Remove the whole hierarchy from the source node down (including source)
6058
6059 Remove_Nodes(
6060 p_api_version => 1.0,
6061 p_init_msg_list => FND_API.G_FALSE,
6062 p_commit => FND_API.G_FALSE,
6063 p_validation_level => p_validation_level,
6064 x_return_status => l_return_status,
6065 x_msg_count => l_msg_count,
6066 x_msg_data => l_msg_data,
6067 p_version_id => p_version_id,
6068 p_member_id => p_source_member_id,
6069 p_value_set_id => p_source_value_set_id,
6070 p_hier_table_name => p_hier_table_name,
6071 p_value_set_required_flag => p_value_set_required_flag,
6072 p_flatten_rows_flag => p_flatten_rows_flag,
6073 p_user_id => p_user_id);
6074
6075 IF l_return_status = FND_API.G_RET_STS_ERROR
6076 THEN
6077 RAISE FND_API.G_EXC_ERROR ;
6078 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6079 THEN
6080 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6081 END IF;
6082
6083 -- Get the max display number of the children of the destination member.
6084 -- If the destination member is a leaf level node, no record will be
6085 -- returned. If this is the case, child_depth_num will be 0 (default value)
6086
6087 l_select_stmt := 'SELECT parent_depth_num, child_depth_num, ' ||
6088 'max(display_order_num) ' ||
6089 'FROM ' || p_hier_table_name || ' ' ||
6090 'WHERE hierarchy_obj_def_id = :1 ' ||
6091 'AND parent_id = :2 ' ||
6092 'AND single_depth_flag = ''Y'' ' ||
6093 'GROUP BY child_depth_num, parent_depth_num ' ||
6094 'ORDER BY child_depth_num DESC, parent_depth_num DESC';
6095
6096 OPEN l_dpth_csr for l_select_stmt
6097 USING p_version_id, p_dest_member_id;
6098 Fetch l_dpth_csr
6099 into l_parent_depth_num, l_child_depth_num, l_display_order_num;
6100 CLOSE l_dpth_csr;
6101
6102 IF (l_parent_depth_num = l_child_depth_num)
6103 THEN
6104 -- if root node
6105 l_child_depth_num := l_child_depth_num + 1;
6106 l_display_order_num := 1;
6107
6108 ELSIF (l_child_depth_num = 0)
6109 THEN
6110 -- if leaf level node
6111 -- The current depth number is not yet known. Use the destination member
6112 -- id to find out what the current depth number is and then use it as the
6113 -- parent depth number of the future child to be
6114
6115 l_select_stmt := 'SELECT child_depth_num ' ||
6116 'FROM ' || p_hier_table_name || ' ' ||
6117 'WHERE hierarchy_obj_def_id = :1 ' ||
6118 'AND child_id = :2 ' ||
6119 'AND NOT(parent_id = child_id ' ||
6120 'AND parent_depth_num = child_depth_num) ' ||
6121 'AND single_depth_flag = ''Y''';
6122
6123 OPEN l_leaf_csr for l_select_stmt
6124 USING p_version_id, p_dest_member_id;
6125 Fetch l_leaf_csr
6126 into l_parent_depth_num;
6127 CLOSE l_leaf_csr;
6128
6129 l_display_order_num := 1;
6130 l_child_depth_num := l_parent_depth_num + 1;
6131 ELSE
6132 -- intermediate node
6133 l_display_order_num := l_display_order_num + 1;
6134 END IF;
6135
6136 l_depth_gap := l_child_depth_num - l_old_child_depth_num;
6137
6138
6139 /*Bug#4181214
6140 *Remove any flattenned entries between dest and source node
6141 *If flatten_focus_node_tree doesn't remove this entry before
6142 *the below insert stmt is executed, we get a unique key violation.
6143 */
6144
6145
6146 execute immediate 'DELETE FROM ' || p_hier_table_name ||
6150 ' AND single_depth_flag = ''N''';
6147 ' WHERE hierarchy_obj_def_id = ' || p_version_id ||
6148 ' AND parent_id = ' || p_dest_member_id ||
6149 ' AND child_id = ' || p_source_member_id ||
6151
6152
6153 l_insert_stmt := 'INSERT INTO '||p_hier_table_name||
6154 ' ( '||
6155 'HIERARCHY_OBJ_DEF_ID, '||
6156 'PARENT_DEPTH_NUM, '||
6157 'PARENT_ID, '||
6158 'CHILD_DEPTH_NUM, '||
6159 'CHILD_ID, '||
6160 'SINGLE_DEPTH_FLAG,'||
6161 'DISPLAY_ORDER_NUM,'||
6162 'WEIGHTING_PCT, ' ||
6163 'CREATION_DATE,'||
6164 'CREATED_BY, '||
6165 'LAST_UPDATED_BY,'||
6166 'LAST_UPDATE_DATE,'||
6167 'LAST_UPDATE_LOGIN, '||
6168 'OBJECT_VERSION_NUMBER) '||
6169 ' VALUES ('||
6170 ':1,'||
6171 ':2,'||
6172 ':3,'||
6173 ':4,'||
6174 ':5,'||
6175 ':6,'||
6176 ':7,'||
6177 ':8,'||
6178 ':9,'||
6179 p_user_id||','||
6180 p_user_id||','||
6181 ':10,'||
6182 l_last_update_login ||','||1||')';
6183
6184 -- insert the top source node to the destionation node
6185
6186 execute immediate l_insert_stmt
6187 using p_version_id,
6188 l_parent_depth_num, p_dest_member_id,
6189 l_child_depth_num, p_source_member_id,
6190 'Y', l_display_order_num, l_weighting_pct,
6191 sysdate, sysdate;
6192
6193 -- When there are children in the source member, update the depth numbers
6194 -- by the gap between the destination and source member.
6195
6196 IF (l_detailed_row_count > 0)
6197 THEN
6198 FOR i in l_parent_depth_num_tbl.FIRST .. l_parent_depth_num_tbl.LAST
6199 LOOP
6200 l_parent_depth_num_tbl(i) := l_parent_depth_num_tbl(i) + l_depth_gap;
6201 l_child_depth_num_tbl(i) := l_child_depth_num_tbl(i) + l_depth_gap;
6202 END LOOP;
6203
6204 FORALL i in l_parent_id_tbl.FIRST .. l_parent_id_tbl.LAST
6205 execute immediate l_insert_stmt
6206 using p_version_id,
6207 l_parent_depth_num_tbl(i), l_parent_id_tbl(i),
6208 l_child_depth_num_tbl(i), l_child_id_tbl(i),
6209 'Y', l_display_order_num_tbl(i), l_weighting_pct_tbl(i),
6210 sysdate, sysdate;
6211 END IF;
6212
6213 ELSE
6214
6215 -- Find the child depth num and weighting pct that will be used
6216 -- to add the souce node to the destination node
6217
6218 l_select_stmt := 'SELECT child_depth_num, weighting_pct ' ||
6219 'FROM ' || p_hier_table_name || ' ' ||
6220 'WHERE hierarchy_obj_def_id = :1 AND ' ||
6221 'child_id = :2 AND child_value_set_id = :3 AND ' ||
6222 'single_depth_flag = ''Y''';
6223
6224 OPEN l_src_node_csr for l_select_stmt
6225 USING p_version_id, p_source_member_id, p_source_value_set_id;
6226 FETCH l_src_node_csr
6227 into l_old_child_depth_num, l_weighting_pct;
6228 CLOSE l_src_node_csr;
6229
6230 -- Find the whole hierarchy from the source node down. (Do not include
6231 -- source node.)
6232
6233 l_select_stmt := 'SELECT parent_id, parent_value_set_id, ' ||
6234 'parent_depth_num, ' ||
6235 'child_id, child_value_set_id, child_depth_num, ' ||
6236 'display_order_num, weighting_pct ' ||
6237 'FROM ' || p_hier_table_name || ' ' ||
6238 'WHERE hierarchy_obj_def_id = :1 AND ' ||
6239 'NOT (parent_id = child_id AND ' ||
6240 'parent_value_set_id = child_value_set_id) ' ||
6241 'START WITH parent_id = :2 AND ' ||
6242 'parent_value_set_id = :3 AND ' ||
6243 'hierarchy_obj_def_id = :4 AND ' ||
6244 'single_depth_flag = ''Y'' AND ' ||
6245 'parent_depth_num <> child_depth_num ' ||
6246 'CONNECT BY PRIOR child_id = parent_id AND ' ||
6247 'PRIOR child_value_set_id = parent_value_set_id AND ' ||
6248 'hierarchy_obj_def_id = :5 AND ' ||
6249 'single_depth_flag = ''Y'' AND ' ||
6250 'parent_depth_num <> child_depth_num ' ||
6251 'ORDER BY child_depth_num DESC';
6252
6253 OPEN l_whl_hier_csr for l_select_stmt
6254 USING p_version_id, p_source_member_id, p_source_value_set_id,
6255 p_version_id, p_version_id;
6256 FETCH l_whl_hier_csr BULK COLLECT
6257 into l_parent_id_tbl, l_parent_value_set_id_tbl, l_parent_depth_num_tbl,
6258 l_child_id_tbl, l_child_value_set_id_tbl, l_child_depth_num_tbl,
6259 l_display_order_num_tbl, l_weighting_pct_tbl;
6260
6264 -- Remove the whole hierarchy from the source node down (including source)
6261 l_detailed_row_count := l_whl_hier_csr%ROWCOUNT;
6262 CLOSE l_whl_hier_csr;
6263
6265
6266 Remove_Nodes(
6267 p_api_version => 1.0,
6268 p_init_msg_list => FND_API.G_FALSE,
6269 p_commit => FND_API.G_FALSE,
6270 p_validation_level => p_validation_level,
6271 x_return_status => l_return_status,
6272 x_msg_count => l_msg_count,
6273 x_msg_data => l_msg_data,
6274 p_version_id => p_version_id,
6275 p_member_id => p_source_member_id,
6276 p_value_set_id => p_source_value_set_id,
6277 p_hier_table_name => p_hier_table_name,
6278 p_value_set_required_flag => p_value_set_required_flag,
6279 p_flatten_rows_flag => p_flatten_rows_flag,
6280 p_user_id => p_user_id);
6281
6282 IF l_return_status = FND_API.G_RET_STS_ERROR
6283 THEN
6284 RAISE FND_API.G_EXC_ERROR ;
6285 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6286 THEN
6287 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6288 END IF;
6289
6290 -- Get the max display number of the children of the destination member.
6291 -- If the destination member is a leaf level node, no record will be
6292 -- returned. If this is the case, child_depth_num will be 0 (default value)
6293
6294 l_select_stmt := 'SELECT parent_depth_num, child_depth_num, ' ||
6295 'max(display_order_num) ' ||
6296 'FROM ' || p_hier_table_name || ' ' ||
6297 'WHERE hierarchy_obj_def_id = :1 ' ||
6298 'AND parent_id = :2 ' ||
6299 'AND parent_value_set_id = :3 ' ||
6300 'AND single_depth_flag = ''Y'' ' ||
6301 'GROUP BY child_depth_num, parent_depth_num ' ||
6302 'ORDER BY child_depth_num DESC, parent_depth_num DESC';
6303
6304 OPEN l_dpth_csr for l_select_stmt
6305 USING p_version_id, p_dest_member_id, p_dest_value_set_id;
6306 Fetch l_dpth_csr
6307 into l_parent_depth_num, l_child_depth_num, l_display_order_num;
6308 CLOSE l_dpth_csr;
6309
6310 IF (l_parent_depth_num = l_child_depth_num)
6311 THEN
6312 -- if root node
6313 l_child_depth_num := l_child_depth_num + 1;
6314 l_display_order_num := 1;
6315
6316 ELSIF (l_child_depth_num = 0)
6317 THEN
6318 -- if leaf level node
6319 -- The current depth number is not yet known. Use the destination member
6320 -- id to find out what the current depth number is and then use it as the
6321 -- parent depth number of the future child to be
6322
6323 l_select_stmt := 'SELECT child_depth_num ' ||
6324 'FROM ' || p_hier_table_name || ' ' ||
6325 'WHERE hierarchy_obj_def_id = :1 ' ||
6326 'AND child_id = :2 ' ||
6327 'AND child_value_set_id = :3 ' ||
6328 'AND NOT(parent_id = child_id ' ||
6329 'AND parent_value_set_id = child_value_set_id ' ||
6330 'AND parent_depth_num = child_depth_num) ' ||
6331 'AND single_depth_flag = ''Y''';
6332
6333 OPEN l_leaf_csr for l_select_stmt
6334 USING p_version_id, p_dest_member_id, p_dest_value_set_id;
6335 Fetch l_leaf_csr into l_parent_depth_num;
6336 CLOSE l_leaf_csr;
6337
6338 l_display_order_num := 1;
6339 l_child_depth_num := l_parent_depth_num + 1;
6340 ELSE
6341 -- intermediate node
6342 l_display_order_num := l_display_order_num + 1;
6343 END IF;
6344
6345 l_depth_gap := l_child_depth_num - l_old_child_depth_num;
6346
6347
6348 /*Bug#4181214
6349 *Remove any flattenned entries between dest and source node
6350 *If flatten_focus_node_tree doesn't remove this entry before
6351 *the below insert stmt is executed, we get a unique key violation.
6352 */
6353
6354
6355 execute immediate 'DELETE FROM ' || p_hier_table_name ||
6356 ' WHERE hierarchy_obj_def_id = ' || p_version_id ||
6357 ' AND parent_id = ' || p_dest_member_id ||
6358 ' AND child_id = ' || p_source_member_id ||
6359 ' AND parent_value_set_id = ' || p_dest_value_set_id ||
6360 ' AND child_value_set_id = ' || p_source_value_set_id ||
6361 ' AND single_depth_flag = ''N''';
6362
6363 l_insert_stmt := 'INSERT INTO '||p_hier_table_name||
6364 ' ( '||
6365 'HIERARCHY_OBJ_DEF_ID, '||
6366 'PARENT_DEPTH_NUM, '||
6367 'PARENT_ID, '||
6368 'PARENT_VALUE_SET_ID, '||
6369 'CHILD_DEPTH_NUM, '||
6370 'CHILD_ID, '||
6371 'CHILD_VALUE_SET_ID, '||
6372 'SINGLE_DEPTH_FLAG,'||
6373 'DISPLAY_ORDER_NUM,'||
6374 'WEIGHTING_PCT, ' ||
6378 'LAST_UPDATE_DATE,'||
6375 'CREATION_DATE,'||
6376 'CREATED_BY, '||
6377 'LAST_UPDATED_BY,'||
6379 'LAST_UPDATE_LOGIN, '||
6380 'OBJECT_VERSION_NUMBER) '||
6381 ' VALUES ('||
6382 ':1,'||
6383 ':2,'||
6384 ':3,'||
6385 ':4,'||
6386 ':5,'||
6387 ':6,'||
6388 ':7,'||
6389 ':8,'||
6390 ':9,'||
6391 ':10,'||
6392 ':11,'||
6393 p_user_id||','||
6394 p_user_id||','||
6395 ':12,'||
6396 l_last_update_login ||','||1||')';
6397
6398 -- insert the top source node to the destionation node
6399 execute immediate l_insert_stmt
6400 using p_version_id,
6401 l_parent_depth_num, p_dest_member_id, p_dest_value_set_id,
6402 l_child_depth_num, p_source_member_id, p_source_value_set_id,
6403 'Y', l_display_order_num, l_weighting_pct,
6404 sysdate, sysdate;
6405
6406 -- When there are children in the source member, update the depth numbers
6407 -- by the gap between the destination and source member.
6408
6409 IF (l_detailed_row_count > 0)
6410 THEN
6411 FOR i in l_parent_depth_num_tbl.FIRST .. l_parent_depth_num_tbl.LAST
6412 LOOP
6413 l_parent_depth_num_tbl(i) := l_parent_depth_num_tbl(i) + l_depth_gap;
6414 l_child_depth_num_tbl(i) := l_child_depth_num_tbl(i) + l_depth_gap;
6415 END LOOP;
6416
6417 FORALL i in l_parent_id_tbl.FIRST .. l_parent_id_tbl.LAST
6418 execute immediate l_insert_stmt
6419 using p_version_id,
6420 l_parent_depth_num_tbl(i),
6421 l_parent_id_tbl(i),
6422 l_parent_value_set_id_tbl(i),
6423 l_child_depth_num_tbl(i),
6424 l_child_id_tbl(i),
6425 l_child_value_set_id_tbl(i),
6426 'Y',
6427 l_display_order_num_tbl(i),
6428 l_weighting_pct_tbl(i),
6429 sysdate,
6430 sysdate;
6431 END IF;
6432
6433 END IF;
6434
6435 IF FND_API.To_Boolean(p_commit)
6436 THEN
6437 COMMIT WORK;
6438 END IF;
6439
6440 IF (p_flatten_rows_flag = 'Y')
6441 THEN
6442 -- Bug#4022561
6443
6444 /* Pass destination member as the param
6445 * instead of the source member. The hierarchy
6446 * needs to be flattened w.r.t to the dest member.
6447 */
6448
6449 l_req_id := FND_REQUEST.SUBMIT_REQUEST
6450 (application => 'FEM',
6451 program => 'DHMHVMFL',
6452 description => NULL,
6453 start_time => NULL,
6454 sub_request => FALSE,
6455 argument1 => p_version_id,
6456 argument2 => p_hier_table_name,
6457 argument3 => p_dest_member_id,
6458 argument4 => p_dest_value_set_id,
6459 argument5 => NULL,
6460 argument6 => NULL,
6461 argument7 => NULL,
6462 argument8 => NULL,
6463 argument9 => 'Move');
6464 END IF;
6465
6466 EXCEPTION
6467
6468 --
6469 WHEN FND_API.G_EXC_ERROR THEN
6470 --
6471 ROLLBACK TO Hier_Operation_Pvt ;
6472 x_return_status := FND_API.G_RET_STS_ERROR;
6473 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6474 p_data => x_msg_data );
6475 --
6476 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6477 --
6478 ROLLBACK TO Hier_Operation_Pvt ;
6479 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6480 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6481 p_data => x_msg_data );
6482 --
6483 WHEN OTHERS THEN
6484 --
6485 ROLLBACK TO Hier_Operation_Pvt ;
6486 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6487 --
6488 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6489 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
6490 l_api_name);
6491 END if;
6492 --
6493 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6494 p_data => x_msg_data );
6495 --
6496
6497 END Move_Nodes;
6498
6499 /*===========================================================================+
6500 | PROCEDURE Add_Nodes |
6501 +===========================================================================*/
6502
6503 --
6504 -- The API to add a list of nodes under a focus node.
6505 --
6506 PROCEDURE Add_Nodes
6507 (
6508 p_api_version IN NUMBER,
6509 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
6510 p_commit IN VARCHAR2 := FND_API.G_FALSE,
6511 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6515 --
6512 x_return_status OUT NOCOPY VARCHAR2,
6513 x_msg_count OUT NOCOPY NUMBER,
6514 x_msg_data OUT NOCOPY VARCHAR2,
6516 p_version_id IN NUMBER,
6517 p_parent_member_id IN NUMBER,
6518 p_parent_value_set_id IN NUMBER,
6519 p_child_members IN FEM_DHM_MEMBER_TAB_TYP,
6520 p_user_id IN NUMBER,
6521 p_hier_table_name IN VARCHAR2,
6522 p_value_set_required_flag IN VARCHAR2,
6523 p_flatten_rows_flag IN VARCHAR2
6524 )
6525 IS
6526 --
6527 l_api_name CONSTANT VARCHAR2(30) := 'Add_Nodes';
6528 l_api_version CONSTANT NUMBER := 1.0;
6529 --
6530
6531 TYPE l_dhm_csr_type is REF CURSOR;
6532 l_dpth_csr l_dhm_csr_type;
6533 l_leaf_csr l_dhm_csr_type;
6534
6535 l_parent_depth_num NUMBER;
6536 l_child_depth_num NUMBER := 0;
6537 l_display_order_num NUMBER;
6538 l_req_id NUMBER;
6539 l_rowid VARCHAR2(20);
6540 l_select_depth_stmt VARCHAR2(1000);
6541 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
6542 l_msg_count NUMBER;
6543 l_msg_data VARCHAR2(2000);
6544 BEGIN
6545 --
6546 SAVEPOINT Hier_Operation_Pvt ;
6547 --
6548 IF NOT FND_API.Compatible_API_Call ( l_api_version,
6549 p_api_version,
6550 l_api_name,
6551 G_PKG_NAME )
6552 THEN
6553 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6554 END IF;
6555 --
6556
6557 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
6558 FND_MSG_PUB.initialize ;
6559 END IF;
6560 --
6561 x_return_status := FND_API.G_RET_STS_SUCCESS ;
6562 --
6563
6564 -- Get the max display order number of the children of the destination
6565 -- member. Then add a node as a child of the destination member using the
6566 -- next max display order number.
6567
6568 IF (p_value_set_required_flag IS NULL OR p_value_set_required_flag = 'N')
6569 THEN
6570
6571 -- Get the max display number of the children of the destination member.
6572 -- If the destination member is a leaf level node, no record will be
6573 -- returned. If this is the case, child_depth_num will be 0 (default value)
6574
6575 l_select_depth_stmt := 'SELECT parent_depth_num, child_depth_num, ' ||
6576 'max(display_order_num) ' ||
6577 'FROM ' || p_hier_table_name || ' ' ||
6578 'WHERE hierarchy_obj_def_id = :1 ' ||
6579 'AND parent_id = :2 ' ||
6580 'AND single_depth_flag = ''Y'' ' ||
6581 'GROUP BY child_depth_num, parent_depth_num ' ||
6582 'ORDER BY child_depth_num DESC, ' ||
6583 'parent_depth_num DESC';
6584
6585 OPEN l_dpth_csr for l_select_depth_stmt
6586 USING p_version_id, p_parent_member_id;
6587 Fetch l_dpth_csr
6588 into l_parent_depth_num, l_child_depth_num, l_display_order_num;
6589 CLOSE l_dpth_csr;
6590
6591 IF (l_parent_depth_num = l_child_depth_num)
6592 THEN
6593 -- if root node
6594 l_child_depth_num := l_child_depth_num + 1;
6595 l_display_order_num := 1;
6596
6597 ELSIF (l_child_depth_num = 0)
6598 THEN
6599
6600 -- if leaf level node
6601 -- The current depth number is not yet known. Use the destination member
6602 -- id to find out what the current depth number is and then use it as the
6603 -- parent depth number of the future child to be
6604
6605 l_select_depth_stmt := 'SELECT child_depth_num ' ||
6606 'FROM ' || p_hier_table_name || ' ' ||
6607 'WHERE hierarchy_obj_def_id = :1 ' ||
6608 'AND child_id = :2 ' ||
6609 'AND NOT (parent_id = child_id ' ||
6610 'AND parent_depth_num = child_depth_num) ' ||
6611 'AND single_depth_flag = ''Y''';
6612
6613 OPEN l_leaf_csr for l_select_depth_stmt
6614 USING p_version_id, p_parent_member_id;
6615 Fetch l_leaf_csr into l_parent_depth_num;
6616 CLOSE l_leaf_csr;
6617
6618 l_display_order_num := 1;
6619 l_child_depth_num := l_parent_depth_num + 1;
6620
6621 ELSE
6622
6623 -- intermediate node
6624 l_display_order_num := l_display_order_num + 1;
6625
6626 END IF;
6627
6628 ELSE
6629
6630 -- Get the max display number of the children of the destination member.
6631 -- If the destination member is a leaf level node, no record will be
6632 -- returned. If this is the case, child_depth_num will be 0 (default value)
6633
6634 l_select_depth_stmt := 'SELECT parent_depth_num, child_depth_num, ' ||
6635 'max(display_order_num) ' ||
6636 'FROM ' || p_hier_table_name || ' ' ||
6637 'WHERE hierarchy_obj_def_id = :1 ' ||
6638 'AND parent_id = :2 ' ||
6642 'ORDER BY child_depth_num DESC, ' ||
6639 'AND parent_value_set_id = :3 ' ||
6640 'AND single_depth_flag = ''Y'' ' ||
6641 'GROUP BY child_depth_num, parent_depth_num ' ||
6643 'parent_depth_num DESC';
6644
6645 OPEN l_dpth_csr for l_select_depth_stmt
6646 USING p_version_id, p_parent_member_id, p_parent_value_set_id;
6647 Fetch l_dpth_csr
6648 into l_parent_depth_num, l_child_depth_num, l_display_order_num;
6649 CLOSE l_dpth_csr;
6650
6651 IF (l_parent_depth_num = l_child_depth_num)
6652 THEN
6653 -- if root node
6654 l_child_depth_num := l_child_depth_num + 1;
6655 l_display_order_num := 1;
6656
6657 ELSIF (l_child_depth_num = 0)
6658 THEN
6659
6660 -- if leaf level node
6661 -- The current depth number is not yet known. Use the destination member
6662 -- id to find out what the current depth number is and then use it as the
6663 -- parent depth number of the future child to be
6664
6665 l_select_depth_stmt := 'SELECT child_depth_num ' ||
6666 'FROM ' || p_hier_table_name || ' ' ||
6667 'WHERE hierarchy_obj_def_id = :1 ' ||
6668 'AND child_id = :2 ' ||
6669 'AND child_value_set_id = :3 ' ||
6670 'AND NOT(parent_id = child_id ' ||
6671 'AND parent_value_set_id = child_value_set_id ' ||
6672 'AND parent_depth_num = child_depth_num) ' ||
6673 'AND single_depth_flag = ''Y''';
6674
6675 OPEN l_leaf_csr for l_select_depth_stmt
6676 USING p_version_id, p_parent_member_id, p_parent_value_set_id;
6677 Fetch l_leaf_csr
6678 into l_parent_depth_num;
6679 CLOSE l_leaf_csr;
6680
6681 l_display_order_num := 1;
6682 l_child_depth_num := l_parent_depth_num + 1;
6683
6684 ELSE
6685
6686 -- intermediate node
6687 l_display_order_num := l_display_order_num + 1;
6688
6689 END IF;
6690 END IF;
6691
6692 -- Add a node as a child of the destination member using the next display
6693 -- order number.
6694
6695 FOR i IN 1..p_child_members.COUNT
6696 LOOP
6697 insert_root_node(p_api_version => 1.0,
6698 p_init_msg_list => FND_API.G_FALSE,
6699 p_commit => FND_API.G_FALSE,
6700 p_validation_level => p_validation_level,
6701 p_return_status => l_return_status,
6702 p_msg_count => l_msg_count,
6703 p_msg_data => l_msg_data,
6704 p_rowid => l_rowid,
6705 p_vs_required_flag => p_value_set_required_flag,
6706 p_hier_table_name => p_hier_table_name,
6707 p_hier_obj_def_id => p_version_id,
6708 p_parent_depth_num => l_parent_depth_num,
6709 p_parent_id => p_parent_member_id,
6710 p_parent_value_set_id => p_parent_value_set_id,
6711 p_child_depth_num => l_child_depth_num,
6712 p_child_id => p_child_members(i).member_id,
6713 p_child_value_set_id => p_child_members(i).value_set_id,
6714 p_single_depth_flag => 'Y',
6715 p_display_order_num => l_display_order_num,
6716 p_weighting_pct => NULL);
6717
6718 l_display_order_num := l_display_order_num + 1;
6719
6720 IF l_return_status = FND_API.G_RET_STS_ERROR
6721 THEN
6722 RAISE FND_API.G_EXC_ERROR ;
6723 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6724 THEN
6725 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6726 END IF;
6727 END LOOP;
6728
6729 IF FND_API.To_Boolean(p_commit)
6730 THEN
6731 COMMIT WORK;
6732 END IF;
6733
6734 IF (p_flatten_rows_flag = 'Y')
6735 THEN
6736 l_req_id := FND_REQUEST.SUBMIT_REQUEST
6737 (application => 'FEM',
6738 program => 'DHMHVMFL',
6739 description => NULL,
6740 start_time => NULL,
6741 sub_request => FALSE,
6742 argument1 => p_version_id,
6743 argument2 => p_hier_table_name,
6744 argument3 => p_parent_member_id,
6745 argument4 => p_parent_value_set_id,
6746 argument5 => NULL,
6747 argument6 => NULL,
6748 argument7 => NULL,
6749 argument8 => NULL,
6750 argument9 => 'Add');
6751 END IF;
6752
6753 EXCEPTION
6754
6755 --
6756 WHEN FND_API.G_EXC_ERROR THEN
6757 --
6758 ROLLBACK TO Hier_Operation_Pvt ;
6759 x_return_status := FND_API.G_RET_STS_ERROR;
6760 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6761 p_data => x_msg_data );
6762 --
6763 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6764 --
6768 p_data => x_msg_data );
6765 ROLLBACK TO Hier_Operation_Pvt ;
6766 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6767 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6769 --
6770 WHEN OTHERS THEN
6771 --
6772 ROLLBACK TO Hier_Operation_Pvt ;
6773 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6774 --
6775 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6776 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
6777 l_api_name);
6778 END if;
6779 --
6780 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6781 p_data => x_msg_data );
6782 --
6783
6784 END Add_Nodes;
6785
6786 /*===========================================================================+
6787 | PROCEDURE Add_Rooot_nodes |
6788 +===========================================================================*/
6789
6790 --
6791 -- The API to add a list of nodes to the root.
6792 --
6793 PROCEDURE Add_Root_Nodes
6794 (
6795 p_api_version IN NUMBER,
6796 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
6797 p_commit IN VARCHAR2 := FND_API.G_FALSE,
6798 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6799 x_return_status OUT NOCOPY VARCHAR2,
6800 x_msg_count OUT NOCOPY NUMBER,
6801 x_msg_data OUT NOCOPY VARCHAR2,
6802 --
6803 p_version_id IN NUMBER,
6804 p_child_members IN FEM_DHM_MEMBER_TAB_TYP,
6805 p_user_id IN NUMBER,
6806 p_hier_table_name IN VARCHAR2,
6807 p_value_set_required_flag IN VARCHAR2
6808 )
6809 IS
6810 --
6811 l_api_name CONSTANT VARCHAR2(30) := 'Add_Root_Nodes';
6812 l_api_version CONSTANT NUMBER := 1.0;
6813 --
6814
6815 TYPE l_dhm_csr_type is REF CURSOR;
6816 l_dhm_csr l_dhm_csr_type;
6817
6818 l_display_order_num NUMBER := 0;
6819 l_rowid VARCHAR2(20);
6820 l_select_stmt VARCHAR2(1000);
6821 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
6822 l_msg_count NUMBER;
6823 l_msg_data VARCHAR2(2000);
6824 BEGIN
6825 --
6826 SAVEPOINT Hier_Operation_Pvt ;
6827 --
6828 IF NOT FND_API.Compatible_API_Call ( l_api_version,
6829 p_api_version,
6830 l_api_name,
6831 G_PKG_NAME )
6832 THEN
6833 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6834 END IF;
6835 --
6836
6837 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
6838 FND_MSG_PUB.initialize ;
6839 END IF;
6840 --
6841 x_return_status := FND_API.G_RET_STS_SUCCESS ;
6842 --
6843
6844 -- Find out the max display order number.
6845
6846 IF (p_value_set_required_flag IS NULL OR p_value_set_required_flag = 'N')
6847 THEN
6848
6849 l_select_stmt := 'SELECT max(display_order_num) ' ||
6850 'FROM ' || p_hier_table_name || ' ' ||
6851 'WHERE hierarchy_obj_def_id = :1 ' ||
6852 'AND parent_id = child_id ' ||
6853 'AND parent_depth_num = child_depth_num ' ||
6854 'AND child_depth_num = 1 ' ||
6855 'AND single_depth_flag = ''Y''';
6856
6857 OPEN l_dhm_csr for l_select_stmt
6858 USING p_version_id;
6859 Fetch l_dhm_csr
6860 into l_display_order_num;
6861 CLOSE l_dhm_csr;
6862
6863 ELSE
6864
6865 l_select_stmt := 'SELECT max(display_order_num) ' ||
6866 'FROM ' || p_hier_table_name || ' ' ||
6867 'WHERE hierarchy_obj_def_id = :1 ' ||
6868 'AND parent_id = child_id ' ||
6869 'AND parent_value_set_id = child_value_set_id ' ||
6870 'AND parent_depth_num = child_depth_num ' ||
6871 'AND child_depth_num = 1 ' ||
6872 'AND single_depth_flag = ''Y''';
6873
6874 OPEN l_dhm_csr for l_select_stmt
6875 USING p_version_id;
6876 Fetch l_dhm_csr
6877 into l_display_order_num;
6878 CLOSE l_dhm_csr;
6879
6880 END IF;
6881
6882 -- Determine the next display order number. Then add a root node to the
6883 -- hierarchy by the next display order number.
6884
6885 l_display_order_num := l_display_order_num + 1;
6886
6887 FOR i IN 1..p_child_members.COUNT
6888 LOOP
6889 insert_root_node(
6890 p_api_version => 1.0,
6891 p_init_msg_list => FND_API.G_FALSE,
6892 p_commit => FND_API.G_FALSE,
6893 p_validation_level => p_validation_level,
6894 p_return_status => l_return_status,
6895 p_msg_count => l_msg_count,
6896 p_msg_data => l_msg_data,
6897 p_rowid => l_rowid,
6898 p_vs_required_flag => p_value_set_required_flag,
6899 p_hier_table_name => p_hier_table_name,
6900 p_hier_obj_def_id => p_version_id,
6901 p_parent_depth_num => 1,
6902 p_parent_id => p_child_members(i).member_id,
6903 p_parent_value_set_id => p_child_members(i).value_set_id,
6904 p_child_depth_num => 1,
6905 p_child_id => p_child_members(i).member_id,
6909 p_weighting_pct => NULL);
6906 p_child_value_set_id => p_child_members(i).value_set_id,
6907 p_single_depth_flag => 'Y',
6908 p_display_order_num => l_display_order_num,
6910
6911 l_display_order_num := l_display_order_num + 1;
6912
6913 IF l_return_status = FND_API.G_RET_STS_ERROR
6914 THEN
6915 RAISE FND_API.G_EXC_ERROR ;
6916 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6917 THEN
6918 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6919 END IF;
6920 END LOOP;
6921
6922 IF FND_API.To_Boolean(p_commit)
6923 THEN
6924 COMMIT WORK;
6925 END IF;
6926
6927 EXCEPTION
6928
6929 --
6930 WHEN FND_API.G_EXC_ERROR THEN
6931 --
6932 ROLLBACK TO Hier_Operation_Pvt ;
6933 x_return_status := FND_API.G_RET_STS_ERROR;
6934 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6935 p_data => x_msg_data );
6936 --
6937 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6938 --
6939 ROLLBACK TO Hier_Operation_Pvt ;
6940 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6941 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6942 p_data => x_msg_data );
6943 --
6944 WHEN OTHERS THEN
6945 --
6946 ROLLBACK TO Hier_Operation_Pvt ;
6947 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6948 --
6949 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6950 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
6951 l_api_name);
6952 END if;
6953 --
6954 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6955 p_data => x_msg_data );
6956 --
6957
6958 END Add_Root_Nodes;
6959
6960 --
6961 -- Update Hierarchy Display Sequence numbbers
6962 --
6963 procedure Hier_Member_Sequence_Update (
6964 p_api_version IN NUMBER ,
6965 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
6966 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
6967 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
6968 p_return_status OUT NOCOPY VARCHAR2 ,
6969 p_msg_count OUT NOCOPY NUMBER ,
6970 p_msg_data OUT NOCOPY VARCHAR2 ,
6971 --
6972 p_new_display_order_num IN NUMBER ,
6973 p_hierarchy_table_name IN VARCHAR2 ,
6974 p_hierarchy_obj_def_id IN NUMBER ,
6975 p_parent_id IN NUMBER ,
6976 p_parent_value_set_id IN NUMBER ,
6977 p_child_id IN NUMBER ,
6978 p_child_value_set_id IN NUMBER
6979 ) IS
6980
6981 begin
6982 --
6983 SAVEPOINT Update_Row_Pvt ;
6984
6985 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
6986 FND_MSG_PUB.initialize ;
6987 END IF;
6988 --
6989 p_return_status := FND_API.G_RET_STS_SUCCESS ;
6990
6991 if (p_parent_value_set_id <= 0 AND p_child_value_set_id <= 0) then
6992 execute immediate 'update ' || p_hierarchy_table_name ||
6993 ' SET DISPLAY_ORDER_NUM = ' || p_new_display_order_num ||
6994 ' where hierarchy_obj_def_id = ' || p_hierarchy_obj_def_id || ' AND ' ||
6995 ' parent_id = ' || p_parent_id || ' AND ' ||
6996 ' child_id = ' || p_child_id;
6997 else
6998 execute immediate 'update ' || p_hierarchy_table_name ||
6999 ' SET DISPLAY_ORDER_NUM = ' || p_new_display_order_num ||
7000 ' where hierarchy_obj_def_id = ' || p_hierarchy_obj_def_id || ' AND ' ||
7001 ' parent_id = ' || p_parent_id || ' AND ' ||
7002 ' parent_value_set_id = ' || p_parent_value_set_id || ' AND ' ||
7003 ' child_value_set_id = ' || p_child_value_set_id || ' AND ' ||
7004 ' child_id = ' || p_child_id;
7005 END IF;
7006
7007 IF (sql%notfound) then
7008 RAISE no_data_found;
7009 END IF;
7010
7011 IF FND_API.To_Boolean ( p_commit ) THEN
7012 COMMIT WORK;
7013 END iF;
7014 --
7015 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
7016 p_data => p_msg_data );
7017 --
7018 EXCEPTION
7019 --
7020 WHEN FND_API.G_EXC_ERROR THEN
7021 --
7022 ROLLBACK TO Update_Row_Pvt ;
7023 p_return_status := FND_API.G_RET_STS_ERROR;
7024 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
7025 p_data => p_msg_data );
7026
7027 --
7028 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7029 --
7030 ROLLBACK TO Update_Row_Pvt ;
7031 -- DBMS_OUTPUT.PUT_LINE('error: '|| SQLCODE);
7032 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7033 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
7034 p_data => p_msg_data );
7035 --
7036
7037 WHEN OTHERS THEN
7038 --
7039 -- DBMS_OUTPUT.PUT_LINE('error: '|| SQLCODE);
7040 ROLLBACK TO Update_Row_Pvt ;
7041 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7042 --
7043
7044 --
7045 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
7046 p_data => p_msg_data );
7047
7048 END Hier_Member_Sequence_Update;
7049
7050
7051 /*===========================================================================+
7052 | FUNCTION Is_Lowest_Group |
7056 -- This API find out whether the dimension group is the lowest level of the
7053 +===========================================================================*/
7054
7055 --
7057 -- Hierarchy. If it is, return 'Y'. If the dimension group and hierarchy
7058 -- combination cannot be found in the fem_hier_dimension_grps table, it assumes
7059 -- that the hierarchy does not use group then return 'N'.
7060
7061 FUNCTION Is_Lowest_Group
7062 (
7063 p_hierarchy_obj_id IN NUMBER,
7064 p_dimension_group_id IN NUMBER
7065 )
7066 RETURN VARCHAR2 AS
7067
7068 l_is_lowest_group VARCHAR2(1) := 'N';
7069
7070 BEGIN
7071
7072 FOR l_rec_seq
7073 IN
7074 (
7075 SELECT a.relative_dimension_group_seq
7076 FROM fem_hier_dimension_grps a
7077 WHERE a.hierarchy_obj_id = p_hierarchy_obj_id AND
7078 a.dimension_group_id = p_dimension_group_id AND
7079 NOT EXISTS
7080 (
7081 SELECT b.dimension_group_id,
7082 b.hierarchy_obj_id,
7083 b.relative_dimension_group_seq
7084 FROM fem_hier_dimension_grps b
7085 WHERE b.hierarchy_obj_id = a.hierarchy_obj_id AND
7086 b.relative_dimension_group_seq >
7087 a.relative_dimension_group_seq
7088 )
7089 )
7090 LOOP
7091 l_is_lowest_group := 'Y';
7092 END LOOP;
7093
7094 RETURN l_is_lowest_group;
7095 END Is_Lowest_Group;
7096
7097
7098 /*===========================================================================+
7099 | FUNCTION Is_Highest_Group |
7100 +===========================================================================*/
7101
7102 --
7103 -- This API find out whether the dimension group is the highest level of the
7104 -- Hierarchy. If it is, return 'Y'. If the dimension group and hierarchy
7105 -- combination cannot be found in the fem_hier_dimension_grps table, it assumes
7106 -- that the hierarchy does not use group then return 'N'.
7107
7108 FUNCTION Is_Highest_Group
7109 (
7110 p_hierarchy_obj_id IN NUMBER,
7111 p_dimension_group_id IN NUMBER
7112 )
7113 RETURN VARCHAR2 AS
7114
7115 l_is_highest_group VARCHAR2(1) := 'N';
7116
7117 BEGIN
7118
7119 FOR l_rec_seq
7120 IN
7121 (
7122 SELECT a.relative_dimension_group_seq
7123 FROM fem_hier_dimension_grps a
7124 WHERE a.hierarchy_obj_id = p_hierarchy_obj_id AND
7125 a.dimension_group_id = p_dimension_group_id AND
7126 NOT EXISTS
7127 (
7128 SELECT b.dimension_group_id,
7129 b.hierarchy_obj_id,
7130 b.relative_dimension_group_seq
7131 FROM fem_hier_dimension_grps b
7132 WHERE b.hierarchy_obj_id = a.hierarchy_obj_id AND
7133 b.relative_dimension_group_seq <
7134 a.relative_dimension_group_seq
7135 )
7136 )
7137 LOOP
7138 l_is_highest_group := 'Y';
7139 END LOOP;
7140
7141 RETURN l_is_highest_group;
7142 END Is_Highest_Group;
7143
7144 /*===========================================================================+
7145 | FUNCTION Is_Reorder_Allowed |
7146 +===========================================================================*/
7147
7148 --
7149 -- This API find out whether the reorder should be allowed for a node.
7150 -- For regular user: It checks whether there is a child node.
7151 -- If there is a child node, returns 'Y'; otherwise 'N'.
7152 -- For Secure user: It checks whether there is a shared member node.
7153 -- If there is a shared member node, returns 'Y';
7154 -- otherwise 'N'.
7155 -- Do not pass value for p_member_id or pass 0 when check root nodes.
7156
7157 FUNCTION Is_Reorder_Allowed
7158 (
7159 p_dimension_id IN NUMBER,
7160 p_hierarchy_obj_id IN NUMBER,
7161 p_hierarchy_obj_def_id IN NUMBER,
7162 p_member_id IN NUMBER := 0,
7163 p_value_set_id IN NUMBER,
7164 p_user_mode IN VARCHAR2,
7165 p_comp_dim_flag IN VARCHAR2 := 'N'
7166 )
7167 RETURN VARCHAR2 AS
7168
7169 TYPE l_dhm_csr_type is REF CURSOR ;
7170 l_dhm_csr l_dhm_csr_type ;
7171
7172 l_stmt VARCHAR2(2000) ;
7173 l_member_col VARCHAR2(30) ;
7174 l_member_vl_object_name VARCHAR2(30) ;
7175 l_hierarchy_table_name VARCHAR2(30) ;
7176 l_per_hierarchy_table_name VARCHAR2(30) ;
7177 l_value_set_required_flag VARCHAR2(1) ;
7178 l_is_reorder_allowed VARCHAR2(1) := 'N' ;
7179 l_user_id NUMBER := FND_GLOBAL.User_Id;
7180
7181 BEGIN
7182
7183 -- Find out the metadata information.
7184
7185 SELECT MEMBER_COL,
7186 MEMBER_VL_OBJECT_NAME,
7190 INTO l_member_col,
7187 HIERARCHY_TABLE_NAME,
7188 PERSONAL_HIERARCHY_TABLE_NAME,
7189 VALUE_SET_REQUIRED_FLAG
7191 l_member_vl_object_name,
7192 l_hierarchy_table_name,
7193 l_per_hierarchy_table_name,
7194 l_value_set_required_flag
7195 FROM FEM_XDIM_DIMENSIONS_VL
7196 WHERE DIMENSION_ID = p_dimension_id;
7197
7198 IF p_comp_dim_flag = 'N' then -- BOR project - added the check condition
7199 -- Construct select statement
7200 IF (p_member_id is null OR p_member_id = 0)
7201 THEN
7202 -- construct select statement for root node
7203 IF (l_value_set_required_flag = 'Y')
7204 THEN
7205 l_stmt := 'SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
7206 'SELECT H.CHILD_ID ';
7207
7208 -- Will need to use different hierarchy table for secure user
7209 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7210 THEN
7211 l_stmt := l_stmt ||
7212 'FROM ' || l_per_hierarchy_table_name || ' H, ';
7213 ELSE
7214 l_stmt := l_stmt ||
7215 'FROM ' || l_hierarchy_table_name || ' H, ';
7216 END IF;
7217
7218 l_stmt := l_stmt ||
7219 ' ' || l_member_vl_object_name || ' DIM ' ||
7220 'WHERE H.HIERARCHY_OBJ_DEF_ID = :1 AND ' ||
7221 ' H.PARENT_ID = H.CHILD_ID AND ' ||
7222 ' H.PARENT_VALUE_SET_ID = H.CHILD_VALUE_SET_ID AND ' ||
7223 ' H.PARENT_DEPTH_NUM = H.CHILD_DEPTH_NUM AND ' ||
7224 ' H.PARENT_DEPTH_NUM = 1 AND ' ||
7225 ' H.SINGLE_DEPTH_FLAG = ''Y'' AND ' ||
7226 ' EXISTS ' ||
7227 ' ( ' ||
7228 ' SELECT HVS.VALUE_SET_ID ' ||
7229 ' FROM FEM_HIER_VALUE_SETS HVS ' ||
7230 ' WHERE PARENT_VALUE_SET_ID = HVS.VALUE_SET_ID AND ' ||
7231 ' HVS.HIERARCHY_OBJ_ID = :2 ' ||
7232 ' ) AND ' ||
7233 ' H.CHILD_ID = DIM.' || l_member_col || ' AND ' ||
7234 ' H.CHILD_VALUE_SET_ID = DIM.VALUE_SET_ID ';
7235
7236 -- Need to consider personal member if it is EPB user
7237 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7238 THEN
7239 l_stmt := l_stmt || 'AND ' ||
7240 ' DIM.CREATED_BY = :3 )';
7241
7242 OPEN l_dhm_csr for l_stmt
7243 USING p_hierarchy_obj_def_id,
7244 p_hierarchy_obj_id,
7245 l_user_id;
7246 Fetch l_dhm_csr
7247 into l_is_reorder_allowed;
7248 CLOSE l_dhm_csr;
7249
7250 ELSE
7251 l_stmt := l_stmt || ')';
7252
7253 OPEN l_dhm_csr for l_stmt
7254 USING p_hierarchy_obj_def_id,
7255 p_hierarchy_obj_id;
7256 Fetch l_dhm_csr
7257 into l_is_reorder_allowed;
7258 CLOSE l_dhm_csr;
7259
7260 END IF;
7261
7262 ELSE
7263 -- construct select statement for dimension not using value set
7264
7265 l_stmt := 'SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
7266 'SELECT H.CHILD_ID ';
7267
7268 -- Will need to use different hierarchy table for secure user
7269 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7270 THEN
7271 l_stmt := l_stmt ||
7272 'FROM ' || l_per_hierarchy_table_name || ' H, ';
7273 ELSE
7274 l_stmt := l_stmt ||
7275
7276 'FROM ' || l_hierarchy_table_name || ' H, ';
7277 END IF;
7278
7279 l_stmt := l_stmt ||
7280 ' ' || l_member_vl_object_name || ' DIM ' ||
7281 'WHERE H.HIERARCHY_OBJ_DEF_ID = :1 AND ' ||
7282 ' H.PARENT_ID = H.CHILD_ID AND ' ||
7283 ' H.PARENT_DEPTH_NUM = H.CHILD_DEPTH_NUM AND ' ||
7284 ' H.PARENT_DEPTH_NUM = 1 AND ' ||
7285 ' H.SINGLE_DEPTH_FLAG = ''Y'' AND ' ||
7286 ' H.CHILD_ID = DIM.' || l_member_col || ' ';
7287
7288
7289 -- Need to consider personal member if it is EPB user
7290 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7291 THEN
7292 l_stmt := l_stmt || 'AND ' ||
7293 ' DIM.CREATED_BY = :2 )';
7294
7295 OPEN l_dhm_csr for l_stmt
7296 USING p_hierarchy_obj_def_id,
7297 l_user_id;
7298 Fetch l_dhm_csr
7299 into l_is_reorder_allowed;
7300 CLOSE l_dhm_csr;
7301
7302 ELSE
7303 l_stmt := l_stmt || ')';
7304
7305 OPEN l_dhm_csr for l_stmt
7306 USING p_hierarchy_obj_def_id;
7307 Fetch l_dhm_csr
7308 into l_is_reorder_allowed;
7309 CLOSE l_dhm_csr;
7310 END IF;
7311
7312 END IF;
7313
7314 ELSE
7315 -- construct select statement for intermediate node
7316 IF (l_value_set_required_flag = 'Y')
7317 THEN
7318 l_stmt := 'SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
7319 'SELECT H.CHILD_ID ';
7320
7321 -- Will need to use different hierarchy table for secure user
7325 'FROM ' || l_per_hierarchy_table_name || ' H, ';
7322 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7323 THEN
7324 l_stmt := l_stmt ||
7326 ELSE
7327 l_stmt := l_stmt ||
7328 'FROM ' || l_hierarchy_table_name || ' H, ';
7329 END IF;
7330
7331 l_stmt := l_stmt ||
7332 ' ' || l_member_vl_object_name || ' DIM ' ||
7333 'WHERE H.HIERARCHY_OBJ_DEF_ID = :1 AND ' ||
7334 ' H.PARENT_ID = :2 AND ' ||
7335 ' H.PARENT_VALUE_SET_ID = :3 AND ' ||
7336 ' H.SINGLE_DEPTH_FLAG = ''Y'' AND '||
7337 ' NOT (H.PARENT_ID = H.CHILD_ID AND ' ||
7338 ' H.PARENT_VALUE_SET_ID = H.CHILD_VALUE_SET_ID) AND ' ||
7339 ' H.CHILD_ID = DIM.' || l_member_col || ' AND ' ||
7340 ' H.CHILD_VALUE_SET_ID = DIM.VALUE_SET_ID ';
7341
7342 -- Need to consider personal member if it is EPB user
7343 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7344 THEN
7345 l_stmt := l_stmt || 'AND ' ||
7346 ' DIM.CREATED_BY = :4 )';
7347
7348 OPEN l_dhm_csr for l_stmt
7349 USING p_hierarchy_obj_def_id,
7350 p_member_id,
7351 p_value_set_id,
7352 l_user_id;
7353 Fetch l_dhm_csr
7354 into l_is_reorder_allowed;
7355 CLOSE l_dhm_csr;
7356
7357 ELSE
7358 l_stmt := l_stmt || ')';
7359
7360 OPEN l_dhm_csr for l_stmt
7361 USING p_hierarchy_obj_def_id,
7362 p_member_id,
7363 p_value_set_id;
7364 Fetch l_dhm_csr
7365 into l_is_reorder_allowed;
7366 CLOSE l_dhm_csr;
7367
7368 END IF;
7369
7370 ELSE
7371 -- construct select statement for dimension not using value set
7372
7373 l_stmt := 'SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
7374 'SELECT H.CHILD_ID ';
7375
7376 -- Will need to use different hierarchy table for secure user
7377 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7378 THEN
7379 l_stmt := l_stmt ||
7380 'FROM ' || l_per_hierarchy_table_name || ' H, ';
7381 ELSE
7382 l_stmt := l_stmt ||
7383 'FROM ' || l_hierarchy_table_name || ' H, ';
7384 END IF;
7385
7386 l_stmt := l_stmt ||
7387 ' ' || l_member_vl_object_name || ' DIM ' ||
7388 'WHERE H.HIERARCHY_OBJ_DEF_ID = :1 AND ' ||
7389 ' H.PARENT_ID = :2 AND ' ||
7390 ' H.SINGLE_DEPTH_FLAG = ''Y'' AND ' ||
7391 ' H.PARENT_ID <> H.CHILD_ID AND ' ||
7392 ' H.CHILD_ID = DIM.' || l_member_col || ' ';
7393
7394 -- Need to consider personal member if it is EPB user
7395 IF (p_user_mode IS NOT NULL AND p_user_mode = 'SECURED')
7396 THEN
7397 l_stmt := l_stmt || 'AND ' ||
7398 ' DIM.CREATED_BY = :3 )';
7399
7400 OPEN l_dhm_csr for l_stmt
7401 USING p_hierarchy_obj_def_id,
7402 p_member_id,
7403 l_user_id;
7404 Fetch l_dhm_csr
7405 into l_is_reorder_allowed;
7406 CLOSE l_dhm_csr;
7407
7408 ELSE
7409 l_stmt := l_stmt || ')';
7410
7411 OPEN l_dhm_csr for l_stmt
7412 USING p_hierarchy_obj_def_id,
7413 p_member_id;
7414 Fetch l_dhm_csr
7415 into l_is_reorder_allowed;
7416 CLOSE l_dhm_csr;
7417 END IF;
7418
7419 END IF;
7420 END IF;
7421
7422 ELSE -- BOR project - if p_comp_dim_flag = 'Y' then
7423
7424 -- Construct select statement
7425 -- construct select statement for root node
7426
7427 l_stmt := 'SELECT ''Y'' FROM DUAL WHERE EXISTS ( ' ||
7428 'SELECT CO.COST_OBJECT_ID ';
7429
7430 -- Will need to use different hierarchy table for secure user
7431
7432 l_stmt := l_stmt ||
7433 'FROM ' || l_member_vl_object_name || ' CO ';
7434
7435 l_stmt := l_stmt ||
7436 'WHERE CO.COST_OBJECT_ID = :1 AND ' ||
7437 ' EXISTS (SELECT 1 ' ||
7438 ' FROM '||l_hierarchy_table_name||' H2, '||
7439 ' FEM_OBJECT_DEFINITION_VL OD, '||
7440 ' FEM_HIER_VALUE_SETS VS '||
7441 ' WHERE (H2.PARENT_ID = CO.COST_OBJECT_ID) AND '||
7442 ' H2.HIERARCHY_OBJ_ID = OD.OBJECT_ID AND '||
7443 ' OD.EFFECTIVE_START_DATE BETWEEN H2.EFFECTIVE_START_DATE AND H2.EFFECTIVE_END_DATE '||
7444 ' AND OD.OBJECT_DEFINITION_ID = :2 AND '||
7445 ' H2.HIERARCHY_OBJ_ID = :3 AND '||
7446 ' CO.LOCAL_VS_COMBO_ID = VS.VALUE_SET_ID AND '||
7447 ' H2.HIERARCHY_OBJ_ID = VS.HIERARCHY_OBJ_ID))';
7448
7449 OPEN l_dhm_csr for l_stmt
7450 USING p_member_id,
7451 p_hierarchy_obj_def_id,
7452 p_hierarchy_obj_id;
7453 Fetch l_dhm_csr
7454 into l_is_reorder_allowed;
7455 CLOSE l_dhm_csr;
7456
7457 END IF;
7458 RETURN l_is_reorder_allowed;
7459
7463
7460 EXCEPTION
7461 WHEN NO_DATA_FOUND THEN
7462 RETURN l_is_reorder_allowed;
7464 END Is_Reorder_Allowed;
7465
7466 /*===========================================================================+
7467 | PROCEDURE Circular_Ref_Check |
7468 +===========================================================================*/
7469 -- API to check for circular references when adding a new Relation to an
7470 -- existing Hierarchy.
7471
7472 PROCEDURE Circular_Ref_Check
7473 (p_hierarchy_id IN NUMBER,
7474 p_parent_id IN NUMBER,
7475 p_child_id IN NUMBER,
7476 x_return_status OUT NOCOPY VARCHAR2,
7477 x_msg_count OUT NOCOPY NUMBER,
7478 x_msg_data OUT NOCOPY VARCHAR2)
7479 IS
7480
7481 TYPE number_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7482 th_parent_id number_type;
7483
7484 l_sql_err_code NUMBER;
7485 l_parent_display_code VARCHAR2(2000);
7486 l_child_display_code VARCHAR2(2000);
7487
7488 CURSOR l_circ_ref_check_csr(c_hierarchy_id IN NUMBER,
7489 c_child_id IN NUMBER)
7490 IS
7491 SELECT parent_id
7492 FROM (SELECT parent_id,
7493 child_id
7494 FROM fem_cost_objects_hier
7495 WHERE hierarchy_obj_id = c_hierarchy_id)
7496 START WITH child_id = c_child_id
7497 CONNECT BY PRIOR parent_id = child_id;
7498
7499 /*
7500 SELECT parent_id
7501 FROM fem_cost_objects_hier
7502 WHERE hierarchy_obj_id = c_hierarchy_id
7503 START WITH child_id = c_child_id
7504 CONNECT BY PRIOR parent_id = child_id ;
7505 */
7506
7507 CURSOR l_cost_object_csr(c_cost_object_id IN NUMBER)
7508 IS
7509 SELECT cost_object_display_code
7510 FROM fem_cost_objects
7511 WHERE cost_object_id = c_cost_object_id;
7512
7513 BEGIN
7514
7515 OPEN l_circ_ref_check_csr(c_hierarchy_id => p_hierarchy_id,
7516 c_child_id => p_child_id);
7517 FETCH l_circ_ref_check_csr BULK COLLECT INTO th_parent_id;
7518 CLOSE l_circ_ref_check_csr;
7519
7520 EXCEPTION
7521 WHEN OTHERS THEN
7522 l_sql_err_code := SQLCODE;
7523
7524 IF l_sql_err_code = -1436 THEN
7525
7526 CLOSE l_circ_ref_check_csr;
7527
7528 OPEN l_cost_object_csr(c_cost_object_id => p_parent_id);
7529 FETCH l_cost_object_csr INTO l_parent_display_code;
7530 CLOSE l_cost_object_csr;
7531
7532 OPEN l_cost_object_csr(c_cost_object_id => p_child_id);
7533 FETCH l_cost_object_csr INTO l_child_display_code;
7534 CLOSE l_cost_object_csr;
7535
7536 -- Message: "Addition of CHILD_DISPLAY_CODE to PARENT_DISPLAY_CODE
7537 -- causes a circular reference in the Hierarchy."
7538
7539 FND_MESSAGE.SET_NAME('FEM','FEM_DHM_CIRC_REF_ERROR');
7540 FND_MESSAGE.SET_TOKEN('PARENT_DISPLAY_CODE',
7541 l_parent_display_code);
7542 FND_MESSAGE.SET_TOKEN('CHILD_DISPLAY_CODE',
7543 l_child_display_code);
7544
7545 FND_MSG_PUB.Add;
7546
7547 END IF;
7548
7549 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7550
7551 END Circular_Ref_Check;
7552
7553 /*===========================================================================+
7554 | PROCEDURE Add_Relation |
7555 +===========================================================================*/
7556
7557 --
7558 -- The API to add a single Relation to a Hierarchy.
7559 -- NOTE: This is currently used for Cost Object Hierarchies.
7560 --
7561 PROCEDURE Add_Relation(
7562 p_api_version IN NUMBER,
7563 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
7564 p_commit IN VARCHAR2 := FND_API.G_FALSE,
7565 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
7566 x_return_status OUT NOCOPY VARCHAR2,
7567 x_msg_count OUT NOCOPY NUMBER,
7568 x_msg_data OUT NOCOPY VARCHAR2,
7569 --
7570 p_hierarchy_id IN NUMBER,
7571 p_version_id IN NUMBER,
7572 p_parent_id IN NUMBER,
7573 p_parent_qty IN NUMBER,
7574 p_child_id IN NUMBER,
7575 p_child_qty IN NUMBER,
7576 p_yield_pct IN NUMBER,
7577 p_bom_reference IN VARCHAR2,
7578 p_display_order_num IN NUMBER,
7579 p_hier_table_name IN VARCHAR2
7580 )
7581 IS
7582 l_api_name CONSTANT VARCHAR2(30) := 'Add_Relation';
7583 l_api_version CONSTANT NUMBER := 1.0;
7584
7585 l_new_relationship_id NUMBER;
7586 l_effective_start_date DATE;
7587 l_effective_end_date DATE;
7588
7589 l_is_first_version NUMBER := 0;
7590 l_is_prior_version VARCHAR2(1) := 'N';
7591
7592 l_child_sequence_num NUMBER;
7593
7594 l_cal_period_id NUMBER := FND_PROFILE.Value_Specific('FEM_PERIOD',FND_GLOBAL.USER_ID);
7595 --l_dataset_code NUMBER := -999;
7596
7597 --Bug#4252397: Fetch dataset code from profile.
7598 l_dataset_code NUMBER := FND_PROFILE.Value_Specific('FEM_DATASET',FND_GLOBAL.USER_ID);
7599
7603 effective_end_date
7600 CURSOR l_hier_ver_details_csr (c_version_id IN NUMBER)
7601 IS
7602 SELECT effective_start_date,
7604 FROM fem_object_definition_b
7605 WHERE object_definition_id = c_version_id;
7606
7607 -- WIP - May have to change the logic to find
7608 -- if there is only one version so far.
7609 CURSOR l_is_first_version_csr (c_hierarchy_id IN NUMBER)
7610 IS
7611 SELECT COUNT(*)
7612 FROM fem_object_definition_b
7613 WHERE object_id = c_hierarchy_id;
7614
7615 CURSOR l_is_prior_version_csr (c_hierarchy_id IN NUMBER,
7616 c_version_id IN NUMBER)
7617 IS
7618 SELECT 'Y' FROM dual
7619 WHERE EXISTS( SELECT 1
7620 FROM fem_object_definition_b a,
7621 fem_object_definition_b b
7622 WHERE a.object_id = b.object_id
7623 AND a.object_id = c_hierarchy_id
7624 AND b.object_definition_id = c_version_id
7625 AND a.effective_start_date > b.effective_end_date);
7626
7627 BEGIN
7628
7629 SAVEPOINT Add_Relation_Pvt;
7630 --
7631 IF NOT FND_API.Compatible_API_Call ( l_api_version,
7632 p_api_version,
7633 l_api_name,
7634 G_PKG_NAME )
7635 THEN
7636 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7637 END IF;
7638 --
7639
7640 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
7641 FND_MSG_PUB.initialize ;
7642 END IF;
7643 --
7644
7645 ----- Start: Bug#5895840: Raising an exception and later catching it and throwing an error message
7646 ----- if there is no fem:period or fem:dataset profile set for the user
7647
7648 IF(l_cal_period_id IS NULL) THEN
7649 RAISE FND_API.G_EXC_ERROR;
7650 END IF;
7651
7652 IF(l_dataset_code IS NULL) THEN
7653 RAISE FND_API.G_EXC_ERROR;
7654 END IF;
7655 ---- End: Bug#5895840
7656
7657
7658 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
7659
7660 OPEN l_is_first_version_csr(c_hierarchy_id => p_hierarchy_id);
7661 FETCH l_is_first_version_csr INTO l_is_first_version;
7662 CLOSE l_is_first_version_csr;
7663
7664 OPEN l_is_prior_version_csr(c_hierarchy_id => p_hierarchy_id,
7665 c_version_id => p_version_id);
7666 FETCH l_is_prior_version_csr INTO l_is_prior_version;
7667 CLOSE l_is_prior_version_csr;
7668
7669 l_child_sequence_num := 1;
7670
7671 FOR l_max_child_seq_num_rec IN
7672 ( SELECT NVL(MAX(child_sequence_num),0) child_sequence_num
7673 FROM fem_cost_objects_hier
7674 WHERE hierarchy_obj_id = p_hierarchy_id
7675 AND parent_id = p_parent_id
7676 AND child_id = p_child_id)
7677 LOOP
7678 l_child_sequence_num := l_max_child_seq_num_rec.child_sequence_num + 1;
7679 END LOOP;
7680
7681 IF l_is_first_version = 1 THEN
7682
7683 l_effective_start_date := TO_DATE('01/01/1900', 'MM/DD/YYYY');
7684 l_effective_end_date := TO_DATE('01/01/2500', 'MM/DD/YYYY');
7685
7686 ELSIF l_is_prior_version = 'Y' THEN
7687
7688 OPEN l_hier_ver_details_csr (c_version_id => p_version_id);
7689 FETCH l_hier_ver_details_csr
7690 INTO l_effective_start_date, l_effective_end_date;
7691 CLOSE l_hier_ver_details_csr;
7692
7693 ELSE -- <adding to the latest version>
7694
7695 OPEN l_hier_ver_details_csr (c_version_id => p_version_id);
7696 FETCH l_hier_ver_details_csr
7697 INTO l_effective_start_date, l_effective_end_date;
7698 CLOSE l_hier_ver_details_csr;
7699
7700 l_effective_end_date := TO_DATE('01/01/2500', 'MM/DD/YYYY');
7701
7702 END IF;
7703
7704 SELECT fem_cost_objects_hier_s.NEXTVAL
7705 INTO l_new_relationship_id
7706 FROM dual;
7707
7708 INSERT INTO fem_cost_objects_hier
7709 (relationship_id,
7710 effective_start_date,
7711 hierarchy_obj_id,
7712 parent_id,
7713 child_id,
7714 child_sequence_num,
7715 display_order_num,
7716 effective_end_date,
7717 bom_reference,
7718 creation_date,
7719 created_by,
7720 last_updated_by,
7721 last_update_date,
7722 last_update_login,
7723 object_version_number)
7724 VALUES
7725 (l_new_relationship_id,
7726 l_effective_start_date,
7727 p_hierarchy_id,
7728 p_parent_id,
7729 p_child_id,
7730 l_child_sequence_num,
7731 p_display_order_num,
7732 l_effective_end_date,
7733 p_bom_reference,
7734 g_current_date,
7735 g_current_user_id,
7736 g_current_user_id,
7737 g_current_date,
7738 g_current_login_id,
7739 1);
7740
7741 INSERT INTO fem_cost_obj_hier_qty
7742 (relationship_id,
7743 dataset_code,
7744 cal_period_id,
7745 child_qty,
7746 parent_qty,
7747 yield_percentage,
7748 creation_date,
7749 created_by,
7750 last_updated_by,
7751 last_update_date,
7752 last_update_login,
7753 object_version_number)
7754 VALUES
7755 (l_new_relationship_id,
7756 l_dataset_code,
7760 p_yield_pct,
7757 l_cal_period_id,
7758 p_child_qty,
7759 p_parent_qty,
7761 g_current_date,
7762 g_current_user_id,
7763 g_current_user_id,
7764 g_current_date,
7765 g_current_login_id,
7766 1);
7767
7768 Circular_Ref_Check(p_hierarchy_id => p_hierarchy_id,
7769 p_parent_id => p_parent_id,
7770 p_child_id => p_child_id,
7771 x_return_status => x_return_status,
7772 x_msg_count => x_msg_count,
7773 x_msg_data => x_msg_data);
7774
7775
7776 IF x_return_status = FND_API.G_RET_STS_ERROR
7777 THEN
7778 RAISE FND_API.G_EXC_ERROR ;
7779 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR
7780 THEN
7781 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7782 END IF;
7783
7784 END IF;
7785
7786 IF FND_API.To_Boolean(p_commit) THEN
7787 COMMIT WORK;
7788 END iF;
7789
7790 x_return_status := FND_API.G_RET_STS_SUCCESS ;
7791
7792 EXCEPTION
7793 WHEN FND_API.G_EXC_ERROR THEN
7794
7795 ---- Start : Bug#5895840
7796 IF(l_cal_period_id IS NULL) THEN
7797 FND_MESSAGE.SET_NAME('FEM','FEM_DHM_CREATE_REL_PROFILE_ERR');
7798 FND_MSG_PUB.ADD;
7799 END IF;
7800
7801 IF(l_dataset_code IS NULL) THEN
7802 FND_MESSAGE.SET_NAME('FEM','FEM_DHM_CREATE_REL_DATASET_ERR');
7803 FND_MSG_PUB.ADD;
7804 END IF;
7805 ---- End: Bug#5895840
7806
7807 ROLLBACK TO Add_Relation_Pvt ;
7808 x_return_status := FND_API.G_RET_STS_ERROR;
7809 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7810 p_data => x_msg_data );
7811
7812 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7813
7814 ROLLBACK TO Add_Relation_Pvt ;
7815 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7816 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7817 p_data => x_msg_data );
7818
7819 WHEN OTHERS THEN
7820
7821 ROLLBACK TO Add_Relation_Pvt ;
7822 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7823
7824 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7825 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
7826 l_api_name);
7827 END if;
7828
7829 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7830 p_data => x_msg_data );
7831
7832 END Add_Relation;
7833
7834 /*===========================================================================+
7835 | PROCEDURE Add_Relations |
7836 +===========================================================================*/
7837
7838 --
7839 -- The API to add a set of Relations to a Hierarchy.
7840 -- NOTE: This is currently used for Cost Object Hierarchies.
7841 --
7842 PROCEDURE Add_Relations(
7843 p_api_version IN NUMBER,
7844 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
7845 p_commit IN VARCHAR2 := FND_API.G_FALSE,
7846 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
7847 x_return_status OUT NOCOPY VARCHAR2,
7848 x_msg_count OUT NOCOPY NUMBER,
7849 x_msg_data OUT NOCOPY VARCHAR2,
7850 --
7851 p_hierarchy_id IN NUMBER,
7852 p_version_id IN NUMBER,
7853 p_hier_table_name IN VARCHAR2,
7854 p_relation_details_tbl IN FEM_DHM_HIER_NODE_TAB_TYP
7855 )
7856 IS
7857
7858 l_api_name CONSTANT VARCHAR2(30) := 'Add_Relations';
7859 l_api_version CONSTANT NUMBER := 1.0;
7860
7861 l_relations_tab_type FEM_DHM_HIER_NODE_TAB_TYP;
7862
7863 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
7864 l_msg_count NUMBER;
7865 l_msg_data VARCHAR2(2000);
7866
7867 BEGIN
7868
7869 SAVEPOINT Add_Relations_Pvt;
7870 --
7871 IF NOT FND_API.Compatible_API_Call ( l_api_version,
7872 p_api_version,
7873 l_api_name,
7874 G_PKG_NAME )
7875 THEN
7876 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7877 END IF;
7878 --
7879
7880 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
7881 FND_MSG_PUB.initialize ;
7882 END IF;
7883 --
7884
7885 l_relations_tab_type := p_relation_details_tbl;
7886
7887 FOR i IN 1..l_relations_tab_type.COUNT
7888 LOOP
7889
7890 Add_Relation(p_api_version => 1.0,
7891 x_return_status => l_return_status,
7892 x_msg_count => l_msg_count,
7893 x_msg_data => l_msg_data,
7894 p_hierarchy_id => p_hierarchy_id,
7895 p_version_id => p_version_id,
7896 p_parent_id => l_relations_tab_type(i).parent_id,
7897 p_parent_qty => l_relations_tab_type(i).parent_qty,
7898 p_child_id => l_relations_tab_type(i).child_id,
7899 p_child_qty => l_relations_tab_type(i).child_qty,
7900 p_yield_pct => l_relations_tab_type(i).yield_pct,
7901 p_bom_reference => l_relations_tab_type(i).bom_reference,
7902 p_display_order_num=>l_relations_tab_type(i).display_order_num,
7906 THEN
7903 p_hier_table_name => p_hier_table_name);
7904
7905 IF l_return_status = FND_API.G_RET_STS_ERROR
7907 RAISE FND_API.G_EXC_ERROR ;
7908 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
7909 THEN
7910 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7911 END IF;
7912
7913 END LOOP;
7914
7915 IF FND_API.To_Boolean(p_commit) THEN
7916 COMMIT WORK;
7917 END iF;
7918
7919 x_return_status := FND_API.G_RET_STS_SUCCESS ;
7920
7921 EXCEPTION
7922 WHEN FND_API.G_EXC_ERROR THEN
7923
7924 ROLLBACK TO Add_Relations_Pvt ;
7925 x_return_status := FND_API.G_RET_STS_ERROR;
7926 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7927 p_data => x_msg_data );
7928
7929 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7930
7931 ROLLBACK TO Add_Relations_Pvt ;
7932 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7933 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7934 p_data => x_msg_data );
7935
7936 WHEN OTHERS THEN
7937
7938 ROLLBACK TO Add_Relations_Pvt ;
7939 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7940
7941 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7942 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
7943 l_api_name);
7944 END if;
7945
7946 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
7947 p_data => x_msg_data );
7948 END Add_Relations;
7949
7950 /*===========================================================================+
7951 | PROCEDURE Reset_Child_Seq_Num |
7952 +===========================================================================*/
7953 -- API to reset the Child Sequence Numbers in Cost Object Hierarchies after
7954 -- a node is removed.
7955
7956 PROCEDURE Reset_Child_Seq_Num
7957 (p_hierarchy_id IN NUMBER,
7958 p_parent_id IN NUMBER,
7959 p_child_id IN NUMBER,
7960 p_curr_ver_start_date IN DATE)
7961 IS
7962
7963 l_child_sequence_num NUMBER := 1;
7964 BEGIN
7965
7966 FOR x_rec IN (SELECT child_sequence_num, parent_id, child_id
7967 FROM fem_cost_objects_hier
7968 WHERE hierarchy_obj_id = p_hierarchy_id
7969 AND parent_id = p_parent_id
7970 AND child_id = p_child_id
7971 AND p_curr_ver_start_date
7972 BETWEEN effective_start_date AND effective_end_date
7973 ORDER BY child_sequence_num)
7974
7975 LOOP
7976
7977 UPDATE fem_cost_objects_hier
7978 SET child_sequence_num = l_child_sequence_num
7979 WHERE hierarchy_obj_id = p_hierarchy_id
7980 AND parent_id = x_rec.parent_id
7981 AND child_id = x_rec.child_id
7982 AND child_sequence_num = x_rec.child_sequence_num
7983 AND p_curr_ver_start_date
7984 BETWEEN effective_start_date AND effective_end_date;
7985
7986 l_child_sequence_num := l_child_sequence_num + 1;
7987
7988 END LOOP;
7989
7990 END Reset_Child_Seq_Num;
7991
7992 /*===========================================================================+
7993 | PROCEDURE Remove_Relation |
7994 +===========================================================================*/
7995
7996 --
7997 -- The API to remove a Relation from a Hierarchy.
7998 -- NOTE: This is currently used for Cost Object Hierarchies.
7999 --
8000 PROCEDURE Remove_Relation(
8001 p_api_version IN NUMBER,
8002 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
8003 p_commit IN VARCHAR2 := FND_API.G_FALSE,
8004 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
8005 x_return_status OUT NOCOPY VARCHAR2,
8006 x_msg_count OUT NOCOPY NUMBER,
8007 x_msg_data OUT NOCOPY VARCHAR2,
8008 --
8009 p_hierarchy_id IN NUMBER,
8010 p_version_id IN NUMBER,
8011 p_parent_id IN NUMBER,
8012 p_child_id IN NUMBER,
8013 p_child_sequence_num IN NUMBER,
8014 p_hier_table_name IN VARCHAR2,
8015 p_remove_all_children_flag IN VARCHAR
8016 )
8017 IS
8018
8019 l_api_name CONSTANT VARCHAR2(30) := 'Remove_Relation';
8020 l_api_version CONSTANT NUMBER := 1.0;
8021
8022 l_new_relationship_id NUMBER;
8023 l_parent_id NUMBER;
8024 l_child_id NUMBER;
8025 l_child_sequence_num NUMBER;
8026 l_display_order_num NUMBER := 10; -- WIP
8027 l_bom_reference VARCHAR2(30) := 'wip';
8028
8029 l_curr_version_start_date DATE;
8030 l_curr_version_end_date DATE;
8031 l_prior_version_exists VARCHAR2(1) := 'N';
8032 l_later_version_exists VARCHAR2(1) := 'N';
8033
8034 CURSOR l_prior_version_exists_csr (c_hierarchy_id IN NUMBER,
8035 c_eff_start_date IN DATE)
8036 IS
8037 SELECT 'Y' FROM dual
8038 WHERE EXISTS( SELECT 1
8042
8039 FROM fem_object_definition_b
8040 WHERE object_id = c_hierarchy_id
8041 AND effective_start_date < c_eff_start_date);
8043 CURSOR l_later_version_exists_csr(c_hierarchy_id IN NUMBER,
8044 c_eff_end_date IN DATE)
8045 IS
8046 SELECT 'Y' FROM dual
8047 WHERE EXISTS (SELECT 1
8048 FROM fem_object_definition_vl a
8049 WHERE object_id = c_hierarchy_id
8050 AND effective_end_date > c_eff_end_date);
8051
8052 CURSOR l_version_details_csr (c_version_id IN NUMBER)
8053 IS
8054 SELECT effective_start_date, effective_end_date
8055 FROM fem_object_definition_b
8056 WHERE object_definition_id = c_version_id;
8057
8058 CURSOR l_all_children_csr (c_hierarchy_id IN NUMBER,
8059 c_parent_id IN NUMBER)
8060 IS
8061 SELECT child_id, bom_reference, child_sequence_num, display_order_num
8062 FROM fem_cost_objects_hier
8063 WHERE hierarchy_obj_id = c_hierarchy_id
8064 AND parent_id = c_parent_id;
8065
8066 BEGIN
8067
8068 SAVEPOINT Remove_Relation_Pvt;
8069 --
8070 IF NOT FND_API.Compatible_API_Call ( l_api_version,
8071 p_api_version,
8072 l_api_name,
8073 G_PKG_NAME )
8074 THEN
8075 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8076 END IF;
8077 --
8078
8079 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
8080 FND_MSG_PUB.initialize ;
8081 END IF;
8082
8083 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
8084
8085 l_parent_id := p_parent_id;
8086 l_child_id := p_child_id;
8087 l_child_sequence_num := p_child_sequence_num;
8088
8089 /******************************************************************
8090 The following is the pseudo code for the Remove_Relation() API:
8091 ---------------------------------------------------------------
8092 if prior_version_exists = N then
8093 if later_version_exists = N then
8094 if remove_all_children = Y then
8095 <delete all the children of the given parent>
8096 else
8097 <delete just the given relation>
8098 end if
8099 else
8100 if remove_all_children = Y then
8101 <update set startDate = curr_ver_end_date+1 for all children>
8102 else
8103 <update set startDate = curr_ver_end_date+1 for the given relation>
8104 end if
8105 end if
8106 else
8107 if remove_all_children = Y then
8108 <update set endDate = curr_ver_start_date-1 for all children>
8109 else
8110 <update set endDate = curr_ver_start_date-1 for the given relation>
8111 end if
8112 if later_version_exists = Y then
8113 if remove_all_children = Y then
8114 <insert new record with startDate = curr_ver_end_date+1 for all chil.>
8115 else
8116 <insert new record with startDate = curr_ver_end_date+1 for the given
8117 relation>
8118 end if
8119 end if
8120 end if
8121 *******************************************************************/
8122
8123 OPEN l_version_details_csr(c_version_id => p_version_id);
8124 FETCH l_version_details_csr INTO l_curr_version_start_date,
8125 l_curr_version_end_date;
8126 CLOSE l_version_details_csr;
8127 --
8128 OPEN l_prior_version_exists_csr (c_hierarchy_id => p_hierarchy_id,
8129 c_eff_start_date => l_curr_version_start_date);
8130 FETCH l_prior_version_exists_csr INTO l_prior_version_exists;
8131 CLOSE l_prior_version_exists_csr;
8132 --
8133 OPEN l_later_version_exists_csr (c_hierarchy_id => p_hierarchy_id,
8134 c_eff_end_date => l_curr_version_end_date);
8135 FETCH l_later_version_exists_csr INTO l_later_version_exists;
8136 CLOSE l_later_version_exists_csr;
8137 --
8138
8139 IF l_prior_version_exists <> 'Y' THEN
8140
8141 IF l_later_version_exists = 'Y' THEN
8142
8143 IF p_remove_all_children_flag = 'Y' THEN
8144
8145 UPDATE fem_cost_objects_hier
8146 SET effective_start_date = l_curr_version_end_date + 1,
8147 last_update_date = g_current_date,
8148 last_updated_by = g_current_user_id,
8149 last_update_login = g_current_login_id,
8150 object_version_number = object_version_number + 1
8151 WHERE hierarchy_obj_id = p_hierarchy_id
8152 AND parent_id = l_parent_id
8153 AND l_curr_version_start_date
8154 BETWEEN effective_start_date AND effective_end_date;
8155
8156 ELSE
8157
8158 UPDATE fem_cost_objects_hier
8159 SET effective_start_date = l_curr_version_end_date + 1,
8160 last_update_date = g_current_date,
8161 last_updated_by = g_current_user_id,
8162 last_update_login = g_current_login_id,
8163 object_version_number = object_version_number + 1
8164 WHERE hierarchy_obj_id = p_hierarchy_id
8165 AND parent_id = l_parent_id
8166 AND child_id = l_child_id
8167 AND child_sequence_num = l_child_sequence_num
8168 AND l_curr_version_start_date
8169 BETWEEN effective_start_date AND effective_end_date;
8170
8171 END IF;
8172
8176
8173 ELSE -- l_later_version_exists = N
8174
8175 IF p_remove_all_children_flag = 'Y' THEN
8177 DELETE FROM fem_cost_objects_hier
8178 WHERE hierarchy_obj_id = p_hierarchy_id
8179 AND parent_id = l_parent_id;
8180
8181 DELETE FROM fem_cost_obj_hier_qty
8182 WHERE relationship_id = (SELECT relationship_id
8183 FROM fem_cost_objects_hier
8184 WHERE hierarchy_obj_id = p_hierarchy_id
8185 AND parent_id = l_parent_id);
8186
8187 ELSE
8188
8189 DELETE FROM fem_cost_objects_hier
8190 WHERE hierarchy_obj_id = p_hierarchy_id
8191 AND parent_id = l_parent_id
8192 AND child_id = l_child_id
8193 AND child_sequence_num = l_child_sequence_num;
8194
8195 DELETE FROM fem_cost_obj_hier_qty
8196 WHERE relationship_id = (SELECT relationship_id
8197 FROM fem_cost_objects_hier
8198 WHERE hierarchy_obj_id = p_hierarchy_id
8199 AND parent_id = l_parent_id
8200 AND child_id = l_child_id
8201 AND child_sequence_num=l_child_sequence_num);
8202
8203 END IF; -- p_remove_all_children_flag
8204
8205 END IF; -- l_later_version_exists
8206
8207 ELSE -- there is a prior version
8208
8209 IF p_remove_all_children_flag = 'Y' THEN
8210
8211 UPDATE fem_cost_objects_hier
8212 SET effective_end_date = (l_curr_version_start_date - 1),
8213 last_update_date = g_current_date,
8214 last_updated_by = g_current_user_id,
8215 last_update_login = g_current_login_id,
8216 object_version_number = object_version_number + 1
8217 WHERE hierarchy_obj_id = p_hierarchy_id
8218 AND parent_id = l_parent_id;
8219
8220 IF sql%NOTFOUND THEN
8221
8222 DELETE FROM fem_cost_objects_hier
8223 WHERE hierarchy_obj_id = p_hierarchy_id
8224 AND parent_id = l_parent_id
8225 AND child_sequence_num = l_child_sequence_num;
8226
8227 END IF;
8228
8229
8230 ELSE
8231
8232 UPDATE fem_cost_objects_hier
8233 SET effective_end_date = (l_curr_version_start_date - 1),
8234 last_update_date = g_current_date,
8235 last_updated_by = g_current_user_id,
8236 last_update_login = g_current_login_id,
8237 object_version_number = object_version_number + 1
8238 WHERE hierarchy_obj_id = p_hierarchy_id
8239 AND parent_id = l_parent_id
8240 AND child_id = l_child_id
8241 AND child_sequence_num = l_child_sequence_num;
8242
8243 IF sql%NOTFOUND THEN
8244
8245 DELETE FROM fem_cost_objects_hier
8246 WHERE hierarchy_obj_id = p_hierarchy_id
8247 AND parent_id = l_parent_id
8248 AND child_id = l_child_id
8249 AND child_sequence_num = l_child_sequence_num;
8250
8251 END IF;
8252
8253 END IF;
8254
8255 IF l_later_version_exists = 'Y' THEN
8256
8257 IF p_remove_all_children_flag = 'Y' THEN
8258
8259 FOR l_all_children_rec IN l_all_children_csr
8260 (c_hierarchy_id => p_hierarchy_id,
8261 c_parent_id => l_parent_id) LOOP
8262
8263 SELECT fem_cost_objects_hier_s.NEXTVAL
8264 INTO l_new_relationship_id
8265 FROM dual;
8266
8267 INSERT INTO fem_cost_objects_hier
8268 (relationship_id,
8269 effective_start_date,
8270 hierarchy_obj_id,
8271 parent_id,
8272 child_id,
8273 child_sequence_num,
8274 display_order_num,
8275 effective_end_date,
8276 bom_reference,
8277 creation_date,
8278 created_by,
8279 last_updated_by,
8280 last_update_date,
8281 last_update_login,
8282 object_version_number)
8283 VALUES
8284 (l_new_relationship_id,
8285 l_curr_version_end_date+1,
8286 p_hierarchy_id,
8287 l_parent_id,
8288 l_all_children_rec.child_id,
8289 l_all_children_rec.child_sequence_num,
8290 l_all_children_rec.display_order_num,
8291 TO_DATE('01/01/2500','mm/dd/yyyy'),
8292 l_all_children_rec.bom_reference,
8293 g_current_date,
8294 g_current_user_id,
8295 g_current_user_id,
8296 g_current_date,
8297 g_current_login_id,
8298 1);
8299
8300 END LOOP;
8301
8302 ELSE
8303
8304 SELECT fem_cost_objects_hier_s.NEXTVAL
8305 INTO l_new_relationship_id
8306 FROM dual;
8307
8308 INSERT INTO fem_cost_objects_hier
8309 (relationship_id,
8310 effective_start_date,
8311 hierarchy_obj_id,
8312 parent_id,
8313 child_id,
8317 bom_reference,
8314 child_sequence_num,
8315 display_order_num,
8316 effective_end_date,
8318 creation_date,
8319 created_by,
8320 last_updated_by,
8321 last_update_date,
8322 last_update_login,
8323 object_version_number)
8324 VALUES
8325 (l_new_relationship_id,
8326 l_curr_version_end_date+1,
8327 p_hierarchy_id,
8328 l_parent_id,
8329 l_child_id,
8330 l_child_sequence_num,
8331 l_display_order_num,
8332 TO_DATE('01/01/2500','mm/dd/yyyy'),
8333 l_bom_reference,
8334 g_current_date,
8335 g_current_user_id,
8336 g_current_user_id,
8337 g_current_date,
8338 g_current_login_id,
8339 1);
8340
8341 END IF;
8342 END IF;
8343
8344 END IF;
8345 /*
8346 reset_child_seq_num(p_hierarchy_id => p_hierarchy_id,
8347 p_parent_id => l_parent_id,
8348 p_child_id => l_child_id,
8349 p_curr_ver_start_date => l_curr_version_start_date);
8350 */
8351 END IF;
8352
8353 IF FND_API.To_Boolean(p_commit) THEN
8354 COMMIT WORK;
8355 END iF;
8356
8357 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8358
8359 EXCEPTION
8360 WHEN FND_API.G_EXC_ERROR THEN
8361
8362 ROLLBACK TO Remove_Relation_Pvt ;
8363 x_return_status := FND_API.G_RET_STS_ERROR;
8364 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8365 p_data => x_msg_data );
8366
8367 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8368
8369 ROLLBACK TO Remove_Relation_Pvt ;
8370 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8371 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8372 p_data => x_msg_data );
8373
8374 WHEN OTHERS THEN
8375
8376 ROLLBACK TO Remove_Relation_Pvt ;
8377 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8378
8379 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8380 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
8381 l_api_name);
8382 END if;
8383
8384 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8385 p_data => x_msg_data );
8386 END Remove_Relation;
8387
8388 /*===========================================================================+
8389 | PROCEDURE Update_Relation |
8390 +===========================================================================*/
8391
8392 --
8393 -- The API to update a Relation in a Hierarchy.
8394 -- NOTE: This is currently used for Cost Object Hierarchies.
8395 --
8396 PROCEDURE Update_Relation(
8397 p_api_version IN NUMBER,
8398 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
8399 p_commit IN VARCHAR2 := FND_API.G_FALSE,
8400 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
8401 x_return_status OUT NOCOPY VARCHAR2,
8402 x_msg_count OUT NOCOPY NUMBER,
8403 x_msg_data OUT NOCOPY VARCHAR2,
8404 --
8405 p_hierarchy_id IN NUMBER,
8406 p_version_id IN NUMBER,
8407 p_parent_id IN NUMBER,
8408 p_parent_qty IN NUMBER,
8409 p_child_id IN NUMBER,
8410 p_child_qty IN NUMBER,
8411 p_child_sequence_num IN NUMBER,
8412 p_yield_pct IN NUMBER,
8413 p_bom_reference IN VARCHAR2,
8414 p_display_order_num IN NUMBER,
8415 p_hier_table_name IN VARCHAR2
8416 )
8417 IS
8418
8419 l_api_name CONSTANT VARCHAR2(30) := 'Update_Relation';
8420 l_api_version CONSTANT NUMBER := 1.0;
8421
8422 l_relationship_id NUMBER;
8423 l_version_start_date DATE;
8424
8425 -- Bug#5723800 : Begin
8426 l_dataset_code NUMBER := FND_PROFILE.VALUE_SPECIFIC('FEM_DATASET',FND_GLOBAL.USER_ID);
8427 l_cal_period_id NUMBER := FND_PROFILE.VALUE_SPECIFIC('FEM_PERIOD',FND_GLOBAL.USER_ID);
8428 l_insert_flag VARCHAR2(1) := 'Y';
8429 l_creation_date DATE := SYSDATE;
8430 l_last_update_date DATE := SYSDATE;
8431 l_last_Updated_by NUMBER := FND_GLOBAL.User_Id;
8432 l_created_by NUMBER := FND_GLOBAL.User_Id;
8433 l_last_update_login NUMBER := FND_GLOBAL.Login_Id;
8434 -- Bug#5723800 : End
8435
8436 CURSOR l_version_csr (c_version_id IN NUMBER)
8437 IS
8438 SELECT effective_start_date
8439 FROM fem_object_definition_b
8440 WHERE object_definition_id = c_version_id;
8441
8442 CURSOR l_relation_csr (c_hierarchy_id IN NUMBER,
8443 c_parent_id IN NUMBER,
8444 c_child_id IN NUMBER,
8445 c_child_sequence_num IN NUMBER,
8446 c_version_start_date IN DATE)
8447 IS
8448 SELECT relationship_id
8449 FROM fem_cost_objects_hier
8450 WHERE hierarchy_obj_id = c_hierarchy_id
8451 AND parent_id = c_parent_id
8452 AND child_id = c_child_id
8453 AND child_sequence_num = c_child_sequence_num
8454 AND c_version_start_date BETWEEN effective_start_date
8458
8455 AND effective_end_date;
8456
8457 BEGIN
8459 SAVEPOINT Update_Relation_Pvt;
8460 --
8461 IF NOT FND_API.Compatible_API_Call ( l_api_version,
8462 p_api_version,
8463 l_api_name,
8464 G_PKG_NAME )
8465 THEN
8466 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8467 END IF;
8468 --
8469
8470 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
8471 FND_MSG_PUB.initialize ;
8472 END IF;
8473
8474 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
8475
8476 OPEN l_version_csr(c_version_id => p_version_id);
8477 FETCH l_version_csr INTO l_version_start_date;
8478 CLOSE l_version_csr;
8479
8480 OPEN l_relation_csr (c_hierarchy_id => p_hierarchy_id,
8481 c_parent_id => p_parent_id,
8482 c_child_id => p_child_id,
8483 c_child_sequence_num => p_child_sequence_num,
8484 c_version_start_date => l_version_start_date);
8485
8486 FETCH l_relation_csr INTO l_relationship_id;
8487 CLOSE l_relation_Csr;
8488
8489 -- Bug#5723800 : Begin
8490 BEGIN
8491 SELECT 'N' into l_insert_flag from fem_cost_obj_hier_qty
8492 WHERE relationship_id = l_relationship_id and
8493 dataset_code = l_dataset_code and
8494 cal_period_id = l_cal_period_id;
8495 EXCEPTION
8496 WHEN NO_DATA_FOUND THEN NULL;
8497 END;
8498 -- Bug#5723800 : End
8499
8500
8501 UPDATE fem_cost_objects_hier
8502 SET bom_reference = p_bom_reference
8503 WHERE relationship_id = l_relationship_id;
8504
8505 -- Bug#5723800 : Begin
8506 IF l_insert_flag <> 'N' then
8507 INSERT into fem_cost_obj_hier_qty
8508 (relationship_id,
8509 dataset_code,
8510 cal_period_id,
8511 child_qty,
8512 parent_qty,
8513 yield_percentage,
8514 creation_date,
8515 created_by ,
8516 last_updated_by ,
8517 last_update_date ,
8518 last_update_login ,
8519 object_version_number)
8520 values(
8521 l_relationship_id,
8522 l_dataset_code,
8523 l_cal_period_id,
8524 p_child_qty,
8525 p_parent_qty,
8526 p_yield_pct,
8527 l_creation_date,
8528 l_created_by,
8529 l_last_updated_by,
8530 l_last_update_date,
8531 l_last_update_login,
8532 1);
8533 ELSE
8534 -- Bug#5723800 : End
8535 UPDATE fem_cost_obj_hier_qty
8536 SET parent_qty = p_parent_qty,
8537 child_qty = p_child_qty,
8538 yield_percentage = p_yield_pct
8539 WHERE relationship_id = l_relationship_id
8540 -- Bug#5723800 : Begin
8541 AND dataset_code = l_dataset_code
8542 AND cal_period_id = l_cal_period_id;
8543 END IF;
8544 -- Bug#5723800 : End
8545
8546 END IF;
8547
8548 IF FND_API.To_Boolean(p_commit) THEN
8549 COMMIT WORK;
8550 END iF;
8551
8552 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8553
8554 EXCEPTION
8555 WHEN FND_API.G_EXC_ERROR THEN
8556
8557 ROLLBACK TO Update_Relation_Pvt ;
8558 x_return_status := FND_API.G_RET_STS_ERROR;
8559 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8560 p_data => x_msg_data );
8561
8562 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8563
8564 ROLLBACK TO Update_Relation_Pvt ;
8565 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8566 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8567 p_data => x_msg_data );
8568
8569 WHEN OTHERS THEN
8570
8571 ROLLBACK TO Update_Relation_Pvt ;
8572 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8573
8574 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8575 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
8576 l_api_name);
8577 END if;
8578
8579 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8580 p_data => x_msg_data );
8581 END Update_Relation;
8582
8583 /*===========================================================================+
8584 | PROCEDURE Update_Relations |
8585 +===========================================================================*/
8586
8587 --
8588 -- The API to update multiple Relations in a Hierarchy.
8589 -- NOTE: This is currently used for Cost Object Hierarchies.
8590 --
8591 PROCEDURE Update_Relations(
8592 p_api_version IN NUMBER,
8593 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
8594 p_commit IN VARCHAR2 := FND_API.G_FALSE,
8595 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
8596 x_return_status OUT NOCOPY VARCHAR2,
8597 x_msg_count OUT NOCOPY NUMBER,
8598 x_msg_data OUT NOCOPY VARCHAR2,
8599 --
8600 p_hierarchy_id IN NUMBER,
8601 p_version_id IN NUMBER,
8602 p_hier_table_name IN VARCHAR2,
8603 p_relation_details_tbl IN FEM_DHM_HIER_NODE_TAB_TYP
8604 )
8605 IS
8606
8607 l_api_name CONSTANT VARCHAR2(30) := 'Update_Relations';
8611
8608 l_api_version CONSTANT NUMBER := 1.0;
8609
8610 l_relations_tab_type FEM_DHM_HIER_NODE_TAB_TYP;
8612 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
8613 l_msg_count NUMBER;
8614 l_msg_data VARCHAR2(2000);
8615
8616 BEGIN
8617
8618 SAVEPOINT Update_Relations_Pvt;
8619 --
8620 IF NOT FND_API.Compatible_API_Call ( l_api_version,
8621 p_api_version,
8622 l_api_name,
8623 G_PKG_NAME )
8624 THEN
8625 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8626 END IF;
8627 --
8628
8629 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
8630 FND_MSG_PUB.initialize ;
8631 END IF;
8632
8633 l_relations_tab_type := p_relation_details_tbl;
8634
8635 FOR i IN 1..l_relations_tab_type.COUNT
8636 LOOP
8637
8638 Update_Relation(p_api_version => 1.0,
8639 x_return_status => l_return_status,
8640 x_msg_count => l_msg_count,
8641 x_msg_data => l_msg_data,
8642 p_hierarchy_id => p_hierarchy_id,
8643 p_version_id => p_version_id,
8644 p_child_sequence_num
8645 => l_relations_tab_type(i).child_sequence_num,
8646 p_parent_id => l_relations_tab_type(i).parent_id,
8647 p_parent_qty => l_relations_tab_type(i).parent_qty,
8648 p_child_id => l_relations_tab_type(i).child_id,
8649 p_child_qty => l_relations_tab_type(i).child_qty,
8650 p_yield_pct => l_relations_tab_type(i).yield_pct,
8651 p_display_order_num
8652 => l_relations_tab_type(i).display_order_num,
8653 p_bom_reference => l_relations_tab_type(i).bom_reference,
8654 p_hier_table_name => p_hier_table_name);
8655
8656 IF l_return_status = FND_API.G_RET_STS_ERROR
8657 THEN
8658 RAISE FND_API.G_EXC_ERROR ;
8659 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8660 THEN
8661 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8662 END IF;
8663
8664 END LOOP;
8665
8666 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8667
8668 EXCEPTION
8669 WHEN FND_API.G_EXC_ERROR THEN
8670
8671 ROLLBACK TO Update_Relations_Pvt ;
8672 x_return_status := FND_API.G_RET_STS_ERROR;
8673 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8674 p_data => x_msg_data );
8675
8676 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8677
8678 ROLLBACK TO Update_Relations_Pvt ;
8679 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8680 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8681 p_data => x_msg_data );
8682
8683 WHEN OTHERS THEN
8684
8685 ROLLBACK TO Update_Relations_Pvt ;
8686 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8687
8688 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8689 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
8690 l_api_name);
8691 END if;
8692
8693 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8694 p_data => x_msg_data );
8695 END Update_Relations;
8696
8697 /*===========================================================================+
8698 | PROCEDURE Move_Relation |
8699 +===========================================================================*/
8700 -- API to move a Relation from one node to another.
8701
8702 PROCEDURE Move_Relation(
8703 p_api_version IN NUMBER,
8704 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
8705 p_commit IN VARCHAR2 := FND_API.G_FALSE,
8706 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
8707 x_return_status OUT NOCOPY VARCHAR2,
8708 x_msg_count OUT NOCOPY NUMBER,
8709 x_msg_data OUT NOCOPY VARCHAR2,
8710 --
8711 p_hierarchy_id IN NUMBER,
8712 p_version_id IN NUMBER,
8713 p_hier_table_name IN VARCHAR2,
8714 p_child_id IN NUMBER,
8715 p_src_parent_id IN NUMBER,
8716 p_dest_parent_id IN NUMBER,
8717 p_child_sequence_num IN NUMBER)
8718 IS
8719
8720 l_api_name CONSTANT VARCHAR2(30) := 'Move_Relation';
8721 l_api_version CONSTANT NUMBER := 1.0;
8722
8723 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
8724 l_msg_count NUMBER;
8725 l_msg_data VARCHAR2(2000);
8726
8727 l_relationship_id NUMBER;
8728 l_display_order_num NUMBER;
8729 l_bom_reference VARCHAR2(30);
8730 l_dataset_code NUMBER;
8731 l_cal_period_id NUMBER;
8732 l_child_qty NUMBER;
8733 l_parent_qty NUMBER;
8734 l_yield_pct NUMBER;
8735
8736 CURSOR l_relation_details_csr(c_hierarchy_id IN NUMBER,
8737 c_version_id IN NUMBER,
8738 c_parent_id IN NUMBER,
8739 c_child_id IN NUMBER,
8743 display_order_num,
8740 c_child_sequence_num IN NUMBER)
8741 IS
8742 SELECT relationship_id,
8744 bom_reference
8745 FROM fem_cost_objects_hier
8746 WHERE hierarchy_obj_id = c_hierarchy_id
8747 AND parent_id = c_parent_id
8748 AND child_id = c_child_id
8749 AND child_sequence_num = c_child_sequence_num;
8750
8751 CURSOR l_hier_qty_details_csr(c_relationship_id IN NUMBER)
8752 IS
8753 SELECT dataset_code,
8754 cal_period_id,
8755 child_qty,
8756 parent_qty,
8757 yield_percentage
8758 FROM fem_cost_obj_hier_qty
8759 WHERE relationship_id = c_relationship_id;
8760
8761 BEGIN
8762
8763 SAVEPOINT Move_Relation_Pvt;
8764 --
8765 IF NOT FND_API.Compatible_API_Call ( l_api_version,
8766 p_api_version,
8767 l_api_name,
8768 G_PKG_NAME )
8769 THEN
8770 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8771 END IF;
8772 --
8773
8774 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
8775 FND_MSG_PUB.initialize ;
8776 END IF;
8777 --
8778
8779 IF p_hier_table_name = 'FEM_COST_OBJECTS_HIER' THEN
8780
8781 OPEN l_relation_details_csr(c_hierarchy_id => p_hierarchy_id,
8782 c_version_id => p_version_id,
8783 c_parent_id => p_src_parent_id,
8784 c_child_id => p_child_id,
8785 c_child_sequence_num => p_child_sequence_num);
8786 FETCH l_relation_details_csr INTO l_relationship_id,
8787 l_display_order_num,
8788 l_bom_reference;
8789 CLOSE l_relation_details_csr;
8790
8791 OPEN l_hier_qty_details_csr(c_relationship_id => l_relationship_id);
8792 FETCH l_hier_qty_details_csr INTO l_dataset_code,
8793 l_cal_period_id,
8794 l_child_qty,
8795 l_parent_qty,
8796 l_yield_pct;
8797 CLOSE l_hier_qty_details_csr;
8798
8799 Remove_Relation(p_api_version => '1.0',
8800 x_return_status => l_return_status,
8801 x_msg_count => l_msg_count,
8802 x_msg_data => l_msg_data,
8803 p_hierarchy_id => p_hierarchy_id,
8804 p_version_id => p_version_id,
8805 p_parent_id => p_src_parent_id,
8806 p_child_id => p_child_id,
8807 p_child_sequence_num => p_child_sequence_num,
8808 p_hier_table_name => p_hier_table_name,
8809 p_remove_all_children_flag => 'N');
8810
8811 IF l_return_status = FND_API.G_RET_STS_ERROR
8812 THEN
8813 RAISE FND_API.G_EXC_ERROR ;
8814 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8815 THEN
8816 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8817 END IF;
8818
8819 Add_Relation(p_api_version => '1.0',
8820 x_return_status => l_return_status,
8821 x_msg_count => l_msg_count,
8822 x_msg_data => l_msg_data,
8823 p_hierarchy_id => p_hierarchy_id,
8824 p_version_id => p_version_id,
8825 p_parent_id => p_dest_parent_id,
8826 p_parent_qty => l_parent_qty,
8827 p_child_id => p_child_id,
8828 p_child_qty => l_child_qty,
8829 p_yield_pct => l_yield_pct,
8830 p_bom_reference => l_bom_reference,
8831 p_display_order_num => l_display_order_num,
8832 p_hier_table_name => p_hier_table_name);
8833
8834 IF l_return_status = FND_API.G_RET_STS_ERROR
8835 THEN
8836 RAISE FND_API.G_EXC_ERROR ;
8837 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8838 THEN
8839 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8840 END IF;
8841
8842 END IF;
8843
8844 IF FND_API.To_Boolean(p_commit) THEN
8845 COMMIT WORK;
8846 END iF;
8847
8848 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8849
8850 EXCEPTION
8851 WHEN FND_API.G_EXC_ERROR THEN
8852
8853 ROLLBACK TO Move_Relation_Pvt ;
8854 x_return_status := FND_API.G_RET_STS_ERROR;
8855 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8856 p_data => x_msg_data );
8857
8858 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8859
8860 ROLLBACK TO Move_Relation_Pvt ;
8861 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8862 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8863 p_data => x_msg_data );
8864
8865 WHEN OTHERS THEN
8866
8867 ROLLBACK TO Move_Relation_Pvt ;
8868 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8869
8870 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8871 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
8872 l_api_name);
8873 END if;
8874
8875 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8876 p_data => x_msg_data );
8877 END Move_Relation;
8878
8879 /*===========================================================================+
8883 --
8880 | PROCEDURE Flatten_Whole_Hierarchy |
8881 +===========================================================================*/
8882
8884 -- The API to flatten a complete Hierarchy.
8885 --
8886
8887 PROCEDURE Flatten_Whole_Hierarchy
8888 (
8889 p_api_version IN NUMBER ,
8890 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE ,
8891 p_commit IN VARCHAR2 := FND_API.G_FALSE ,
8892 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL ,
8893 x_return_status OUT NOCOPY VARCHAR2 ,
8894 x_msg_count OUT NOCOPY NUMBER ,
8895 x_msg_data OUT NOCOPY VARCHAR2 ,
8896 p_hierarchy_id IN NUMBER
8897 )
8898 IS
8899
8900 CURSOR l_hier_version_csr (c_hierarchy_id IN NUMBER)
8901 IS
8902 SELECT object_definition_id
8903 FROM fem_object_definition_b
8904 WHERE object_id = c_hierarchy_id;
8905
8909 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
8906 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Whole_Hierarchy' ;
8907 l_api_version CONSTANT NUMBER := 1.0;
8908
8910 l_msg_count NUMBER;
8911 l_msg_data VARCHAR2(2000);
8912
8913 BEGIN
8914
8915 SAVEPOINT Flatten_Whole_Hierarchy_Pvt;
8916
8917 IF NOT FND_API.Compatible_API_Call ( l_api_version,
8918 p_api_version,
8919 l_api_name,
8920 G_PKG_NAME )
8921 THEN
8922 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8923 END IF;
8924 --
8925
8926 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
8927 FND_MSG_PUB.initialize ;
8928 END IF;
8929
8930 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8931
8932 FOR l_hier_version_rec IN l_hier_version_csr(c_hierarchy_id => p_hierarchy_id)
8933 LOOP
8934
8935 Flatten_Whole_Hier_Version
8936 (p_api_version => '1.0',
8937 x_return_status => l_return_status,
8938 x_msg_count => l_msg_count,
8939 x_msg_data => l_msg_data,
8940 p_hier_obj_defn_id => l_hier_version_rec.object_definition_id);
8941
8942 IF l_return_status = FND_API.G_RET_STS_ERROR
8943 THEN
8944 RAISE FND_API.G_EXC_ERROR ;
8945 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8946 THEN
8947 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8948 END IF;
8949
8950 END LOOP;
8951
8952 UPDATE fem_hier_definitions
8953 SET flattened_rows_completion_code = 'COMPLETED'
8954 WHERE hierarchy_obj_def_id IN
8955 (SELECT object_definition_id
8956 FROM fem_object_definition_b
8957 WHERE object_id = p_hierarchy_id);
8958
8959 IF FND_API.To_Boolean(p_commit) THEN
8960 COMMIT WORK;
8961 END iF;
8962
8963 x_return_status := FND_API.G_RET_STS_SUCCESS ;
8964
8965 EXCEPTION
8966 WHEN FND_API.G_EXC_ERROR THEN
8967
8968 ROLLBACK TO Flatten_Whole_Hierarchy_Pvt;
8969 x_return_status := FND_API.G_RET_STS_ERROR;
8970 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8971 p_data => x_msg_data );
8972
8973 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8974
8975 ROLLBACK TO Flatten_Whole_Hierarchy_Pvt;
8976 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8977 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8978 p_data => x_msg_data );
8979
8980 WHEN OTHERS THEN
8981
8982 ROLLBACK TO Flatten_Whole_Hierarchy_Pvt;
8983 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8984
8985 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8986 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
8987 l_api_name);
8988 END if;
8989
8990 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
8991 p_data => x_msg_data );
8992
8993 END Flatten_Whole_Hierarchy;
8994
8995 /*===========================================================================+
8996 | PROCEDURE Flatten_Whole_Hierarchy_CP |
8997 +===========================================================================*/
8998
8999 --
9000 -- The concurrent program to flatten the whole Hierarchy.
9001 --
9002
9003 PROCEDURE Flatten_Whole_Hierarchy_CP
9004 (
9005 errbuf OUT NOCOPY VARCHAR2 ,
9006 retcode OUT NOCOPY VARCHAR2 ,
9007 p_hierarchy_id IN NUMBER
9008 )
9009 IS
9010
9011 --
9012 l_api_name CONSTANT VARCHAR2(30) := 'Flatten_Whole_Hierarchy_CP';
9013 l_api_version CONSTANT NUMBER := 1.0 ;
9014 --
9015 l_return_status VARCHAR2(1);
9016 l_msg_count number;
9017 l_msg_data varchar2(2000);
9018
9019 BEGIN
9020
9021 Flatten_Whole_Hierarchy
9022 (
9023 p_api_version => 1.0,
9024 x_return_status => l_return_status ,
9025 x_msg_count => l_msg_count,
9026 x_msg_data => l_msg_data,
9027 p_hierarchy_id => p_hierarchy_id);
9028
9029 if l_return_status in ('U', 'E') then --Bug#5004662
9030 retcode := 2;
9031 else
9032 retcode := 0;
9033 end if; --End Bug#5004662
9034
9035 errbuf := l_msg_data;
9036
9037 COMMIT WORK;
9038
9039 EXCEPTION
9040
9041 WHEN FND_API.G_EXC_ERROR THEN
9042 --
9043 retcode := 2 ;
9044 COMMIT WORK ;
9045 --
9046 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9047 --
9048 retcode := 2 ;
9049 COMMIT WORK ;
9050 --
9051 WHEN OTHERS THEN
9052
9053 --
9054 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9055 --
9056 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,
9057 l_api_name ) ;
9058 END IF ;
9059 --
9060 retcode := 2 ;
9061 commIT WORK ;
9062 --
9063
9064 End Flatten_Whole_Hierarchy_CP;
9065
9066 /*===========================================================================+
9067 | FUNCTION Get_Version_Access_Code |
9068 +===========================================================================*/
9069 --
9070 -- The procedure checks if data lock exists for the version with 'W'
9071 -- access code.
9072
9073 FUNCTION Get_Version_Access_Code
9074 (
9078 RETURN VARCHAR2 AS
9075 p_version_id IN NUMBER,
9076 p_object_access_code IN VARCHAR2
9077 )
9079
9080 l_object_access_code VARCHAR2(1) := 'R';
9081
9082 BEGIN
9083
9084 IF p_object_access_code = 'W' then
9085 fem_pl_pkg.obj_def_data_edit_lock_exists(p_version_id,l_object_access_code);
9086
9087 IF l_object_access_code = 'T' then
9088 l_object_access_code := 'R';
9089 ELSE
9090 l_object_access_code := 'W';
9091 END IF;
9092 END IF;
9093
9094 RETURN l_object_access_code;
9095 END Get_Version_Access_Code;
9096
9097
9098
9099 /*===========================================================================+
9100 | FUNCTION Can_Update_Hierarchy |
9101 +===========================================================================*/
9102 --
9103 -- The function checks if the hierarchy can be updated by the
9104 -- current user or not. Returns 'E' if it can be updated, 'D' otherwise.
9105 --
9106
9107
9108 FUNCTION Can_Update_Hierarchy
9109 (
9110 p_object_access_code IN VARCHAR2,
9111 p_hier_created_by IN VARCHAR2
9112 )
9113 RETURN VARCHAR2 AS
9114
9115 begin
9116
9117 if p_hier_created_by=g_current_user_id then
9118 return 'E';
9119
9120 else
9121
9122 if p_object_access_code='W' then
9123 return 'E';
9124 else
9125 return 'D';
9126 end if;
9127
9128 end if;
9129
9130 end Can_Update_Hierarchy;
9131
9132 FUNCTION is_hier_vs_deleteable
9133 (
9134 p_hierarchy_id IN NUMBER,
9135 p_value_set_id IN NUMBER,
9136 p_hier_table IN VARCHAR2
9137 )
9138 RETURN VARCHAR2 AS
9139
9140 l_access_sql VARCHAR2(300);
9141 l_result NUMBER := 0;
9142
9143 begin
9144
9145 l_access_sql := ' SELECT COUNT(*) FROM DUAL WHERE EXISTS ' ||
9146 ' (SELECT 1 FROM ' || p_hier_table || ' WHERE ' ||
9147 ' HIERARCHY_OBJ_DEF_ID IN (SELECT OBJECT_DEFINITION_ID ' ||
9148 ' FROM FEM_OBJECT_DEFINITION_B WHERE OBJECT_ID = :1) ' ||
9149 ' AND CHILD_VALUE_SET_ID = :2) ';
9150 EXECUTE IMMEDIATE l_access_sql INTO l_result USING p_hierarchy_id, p_value_set_id;
9151 IF l_result <> 0 THEN
9152 RETURN 'N';
9153 ELSE
9154 RETURN 'Y';
9155 END IF;
9156
9157 end is_hier_vs_deleteable;
9158
9159
9160 end FEM_HIER_UTILS_PVT;