DBA Data[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;