DBA Data[Home] [Help]

PACKAGE BODY: APPS.FEM_DIMENSION_UTIL_PKG

Source


1 PACKAGE BODY FEM_DIMENSION_UTIL_PKG AS
2 --$Header: FEMDIMAPB.plb 120.16.12000000.3 2007/08/08 16:16:46 gdonthir ship $
3 /*==========================================================================+
4  |    Copyright (c) 1997 Oracle Corporation, Redwood Shores, CA, USA        |
5  |                         All rights reserved.                             |
6  +==========================================================================+
7  | FILENAME
8  |
9  |    FEMDIMAPB.plb
10  |
11  | NAME fem_dimension_util_pkg
12  |
13  | DESCRIPTION
14  |
15  |   Package Body for fem_dimension_util_pkg
16  |
17  | HISTORY
18  |
19  |    16-JUN-03  SSista  Added APIs for Local VS Combo ID
20  |    02-MAY-03  RFlippo Created
21  |    27-OCT-03  TimMoore added following:
22  |                    Get_Cal_Period_ID
23  |                    Register_Data_Location
24  |                    UnRegister_Data_Location
25  |                    Generate_Member_ID
26  |                    New_Dataset
27  |                    New_Ledger
28  |                    Get_Dim_Attr_ID_Ver_ID
29  |    05-NOV-03  TimMoore modified following:
30  |                    Effective_Cal_Period_ID
31  |    03-JUN-04  Rflippo added SOURCE_SYSTEM as a member_id_method_code
32  |    06-JUL-04  Rfippo  changes to the Generate_Default_Load_Member procedure
33  |                       to create attr assignment rows for each member;  also
34  |                       changed name/display_code of the generated members to
35  |                       'Default' instead of 'Undefined';
36  |
37  |    09-JUL-04 Rflippo bug#3755923 changes to new_ledger API signature
38  |                      so that all "Is Pop" attributes are defaulted to 'N';
39  |                      Also added new 'Is Pop' attributes for Task and
40  |                      Financial Element.
41  |    10-AUG-04 Rflippo bug#3824427 - added New_Budget API to create budget
42  |                      members
43  |    28-OCT-04 Rflippo bug#3972903 - modify the Local_vs_combo_id function to
44  |                      return the Global Combo, not the Local.  This change
45  |                      is for the FEM.C modifications in the rule sharing
46  |                      design;
47  |    22-Nov-04 gcheng  bug#4005877 - obsolete the Effective_Cal_Period_ID
48  |                      and replaced it with a new Relative_Cal_Period_ID
49  |                      function.  The details of this new function can be
50  |                      found in the Dimension APIs document on ASDEV.
51  |    13-JAN-05 gcheng  Bug 3824701 - altered Register_Data_Location
52  |                                    and Unregister_Data_Location APIs
53  |
54  |    17-JAN-05 tmoore  Bug 4106880 - added following APIs:
55  |                         Register_Budget
56  |                         Register_Ledger
57  |                         Register_Encumbrance_Type
58  |                         New_Global_VS_Combo
59  |
60  |    26-JAN-05 tmoore  Bug 4145122 - added New_Encumbrance_Type
61  |    21-APR-05 RFlippo  Bug#4303380  Add Global_vs_combo_display_code to the
62  |                       Insert statement for FEM_GLOBAL_VS_COMBOS_PKG
63  |                       -- this fix will preserve the original signature
64  |                        for this API so that it is backward compatible
65  |                        with OGL by employing a default for the
66  |                        global combo display_code.  If the user passes
67  |                        null for the display code, it set it = global combo name.
68  |    03-MAY-05 tmoore  Bug 4036498 - Added Get_Dim_Member_ID.
69  |                                    This function returns a dimension
70  |                                     member ID
71  |    13-MAY-05 Rflippo Bug4367375 - some required attributes missing
72  |                                   a default assignment for the
73  |                                   generate_default_load_member proc
74  |    23-MAY-05 Rflippo Bug4316406 modify generate_default_load_member
75  |                                 for new req attribute security_enabled_flag
76  |    15-JUN-05 gcheng  4417618. Created the Get_Default_Dim_Member procedures.
77  |    30-JUN-05 gcheng  4143586. Added another version to the overloaded
78  |                      Generate_Default_Load_Member procedure.
79  |                      Also extensively modified the existing versions.
80  |                      Also modified Get_Default_Dim_Member to make sure
81  |                      it exits when OA Param validation fails.
82  |    26-JUL-05 ghall   4503014. Added user messages for Attribute errors
83  |                      in Relative_Cal_Period; changed WHEN OTHERS exception
84  |                      to WHEN e_error, so that database errors can
85  |                      pass through (for now, anyway).
86  |    24-OCT-05 tmoore  4619062. Added Get_Dim_Member_Display_Code.
87  |    21-NOV-05 rflippo 4749235 Modified get_default_dim_member (1) - set
88  |                      variable v_member_code to be typed as varchar2
89  |                      so the procedure will work for both non-value set
90  |                      and value set dims
91  |    30-JAN-06 gcheng  5011140 (FP:4596447) . Added an optional parameter
92  |              v120.9  p_table_name to UnRegister_Data_Location.
93  |    17-FEB-06 rflippo Bug#5040996 - added support for Composite dimensions
94  |                      in v120.10 to Get_Dim_Member_ID function.
95  |    27-FEB-06 rflippo Bug#5065490 Performance improvement for
96  |                      Dimension_Value_Set_ID function when called for VS view
97  |    09-MAR-06 rflippo Bug#5065490 - modified return statement for
98  |                      Dimension_Value_Set_ID function to be nvl
99  |                      because DHM calls the function for non-vsr dims
100  |    17-MAR-06 rflippo Bug#5102692 Overload Generate_Member_ID for Cal Period
101  |                      dimension;
102  |    04-AUG-06 rflippo Bug 5060702 modify get_cal_period_id function to be
103  |                      more performant
104  |    23-AUG-06 rflippo Bug#5486589 Modify logic so that if -1 passed in as the
105  |                       Cal Period Hier ID then it doesn't try to validate it.
106  |    24-AUG-06 nmartine Bug 5473131. Added Get_Dim_Member_Name.
107  |    23-MAR-07 rflippo MappingWizard project - modify Dimension_Value_Set_Id
108  |                      API to return -1 if passed in a non-vsr dimension
109  |    01-AUG-07 gdonthir Bug#5604779
110  +=========================================================================*/
111 
112 -----------------------
113 -- Package Constants --
114 -----------------------
115 c_resp_app_id CONSTANT NUMBER := FND_GLOBAL.RESP_APPL_ID;
116 
117 c_user_id CONSTANT NUMBER := FND_GLOBAL.USER_ID;
118 c_login_id    NUMBER := FND_GLOBAL.Login_Id;
119 
120 c_module_pkg   CONSTANT  VARCHAR2(80) := 'fem.plsql.fem_dimension_util_pkg';
121 G_PKG_NAME     CONSTANT  VARCHAR2(30) := 'FEM_DIMENSION_UTIL_PKG';
122 
123 f_set_status  BOOLEAN;
124 
125 c_log_level_1  CONSTANT  NUMBER  := fnd_log.level_statement;
126 c_log_level_2  CONSTANT  NUMBER  := fnd_log.level_procedure;
127 c_log_level_3  CONSTANT  NUMBER  := fnd_log.level_event;
128 c_log_level_4  CONSTANT  NUMBER  := fnd_log.level_exception;
129 c_log_level_5  CONSTANT  NUMBER  := fnd_log.level_error;
130 c_log_level_6  CONSTANT  NUMBER  := fnd_log.level_unexpected;
131 
132 -----------------------
133 -- Package Variables --
134 -----------------------
135 v_module_log   VARCHAR2(255);
136 
137 v_session_ledger_id NUMBER := NULL;
138 
139 g_cache_ledger_id NUMBER := NULL; -- this replaces v_session_ledger_id for
140                                   -- use with the Dimension_Value_Set_ID API
141 g_cache_dimension_id NUMBER := NULL; -- cached dimension_id
142 g_cache_dim_vs_id NUMBER := NULL; -- cached value set
143 
144 v_varchar      VARCHAR2(255);
145 
146 -- v_attr_label   VARCHAR2(30);
147 -- v_attr_value   VARCHAR2(150);
148 
149 v_token_value  VARCHAR2(150);
150 v_token_trans  VARCHAR2(1);
151 
152 v_msg_text     VARCHAR2(4000);
153 
154 gv_prg_msg      VARCHAR2(2000);
155 gv_callstack    VARCHAR2(2000);
156 
157 ------------------------
158 -- Package Exceptions --
159 ------------------------
160 e_bad_param_value     EXCEPTION;
161 e_null_param_value    EXCEPTION;
162 e_no_value_found      EXCEPTION;
163 e_many_values_found   EXCEPTION;
164 e_no_version_name     EXCEPTION;
165 e_bad_dim_id          EXCEPTION;
166 e_dup_mem_id          EXCEPTION;
167 e_user_exception      EXCEPTION;
168 e_dup_display_code    EXCEPTION;
169 e_req_attr_assign     EXCEPTION;
170 e_FEM_XDIM_UTIL_ATTR_NODEFAULT EXCEPTION;
171 e_unexp               EXCEPTION;
172 e_error               EXCEPTION;
173 
174 /*************************************************************************
175 
176                              FEM_Initialize
177 
178  This procuedure sets a global variable storing the Ledger ID so that it
179   can be available to other subprograms in the package.
180 
181 *************************************************************************/
182 
183 PROCEDURE FEM_Initialize (
184    p_ledger_id IN NUMBER
185 ) IS
186 BEGIN
187    v_session_ledger_id := p_ledger_id;
188 End FEM_Initialize;
189 
190 /*************************************************************************
191 
192                            Ledger_From_Session
193 
194  This function returns the Ledger ID that was set with FEM_Initialize
195 
196 *************************************************************************/
197 
198 FUNCTION Ledger_From_Session
199 RETURN NUMBER
200 IS
201 BEGIN
202    RETURN v_session_ledger_id;
203 END Ledger_From_Session;
204 
205 /*************************************************************************
206 
207                          Application_Group_ID
208 
209 *************************************************************************/
210 
211 FUNCTION Application_Group_ID
212 RETURN NUMBER
213 IS
214    v_app_grp_id NUMBER;
215 BEGIN
216 
217 SELECT application_group_id
218 INTO   v_app_grp_id
219 FROM   fem_applications
220 WHERE  application_id = c_resp_app_id;
221 
222 RETURN v_app_grp_id;
223 
224 EXCEPTION
225    WHEN no_data_found THEN
226       RETURN -1;
227 
228 END Application_Group_ID;
229 
230 /*************************************************************************
231 
232                          Is_Ledger_ID_Valid
233 
234 *************************************************************************/
235 
236 FUNCTION Is_Ledger_ID_Valid (
237    p_ledger_id IN NUMBER
238 ) RETURN VARCHAR2
239 IS
240    v_ledger_id NUMBER;
241 BEGIN
242 
243 SELECT ledger_id
244 INTO   v_ledger_id
245 FROM   fem_ledgers_b
246 WHERE  ledger_id = p_ledger_id;
247 
248 RETURN 'Y';
249 
250 EXCEPTION
251    WHEN no_data_found THEN
252       RETURN 'N';
253 
254 END Is_Ledger_ID_Valid;
255 
256 /*************************************************************************
257 
258                          Is_Dimension_ID_Valid
259 
260 *************************************************************************/
261 
262 FUNCTION Is_Dimension_ID_Valid (
263    p_dimension_id IN NUMBER
264 ) RETURN VARCHAR2
265 IS
266    v_dimension_id NUMBER;
267 BEGIN
268 
269 SELECT dimension_id
270 INTO   v_dimension_id
271 FROM   fem_xdim_dimensions
272 WHERE  dimension_id = p_dimension_id;
273 
274 RETURN 'Y';
275 
276 EXCEPTION
277    WHEN no_data_found THEN
278       RETURN 'N';
279 
280 END Is_Dimension_ID_Valid;
281 
282 /*************************************************************************
283 
284                          Global_VS_Combo_ID
285 
286  Ths procedure obtains the Global VS Combo attribute assignment of the
287   current Ledger.  The current Ledger is determined in any of the
288   following ways:
289    a)  directly passed in as a parameter
290    b)  set by the FEM_INITIALIZE procedure
291    c)  from the Set of Books user profile
292 
293 *************************************************************************/
294 
295 FUNCTION Global_VS_Combo_ID (
296    p_ledger_id IN NUMBER,
297    x_err_code OUT NOCOPY NUMBER,
298    x_num_msg  OUT NOCOPY NUMBER
299 ) RETURN NUMBER
300 IS
301    v_global_vs_id NUMBER;
302    v_ledger_id NUMBER;
303    v_dim_name VARCHAR2(80);
304 BEGIN
305 
306 x_err_code := 0;
307 x_num_msg := 0;
308 IF (p_ledger_id is NULL)
309 THEN
310    IF (v_session_ledger_id IS NULL)
311    THEN
312       v_ledger_id := FND_PROFILE.VALUE_SPECIFIC (
313                        c_fem_ledger,
314                        fnd_global.user_id,
315                        null ,null);
316    ELSE
317       v_ledger_id := v_session_ledger_id;
318    END IF;
319 ELSE
320    v_ledger_id := p_ledger_id;
321 END IF;
322 
323 v_dim_name := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
324                  p_dim_label => 'LEDGER');
325 
326 IF (v_ledger_id is NULL)
327 THEN
328    v_token_value := v_dim_name;
329    x_err_code := 2;
330    x_num_msg := x_num_msg + 1;
331    RAISE e_null_param_value;
332 
333 ELSE
334    IF (Is_Ledger_ID_Valid(v_ledger_id) = 'Y')
335    THEN
336       BEGIN
337          SELECT dim_attribute_numeric_member
338          INTO   v_global_vs_id
339          FROM   fem_ledgers_attr f
340          WHERE  f.ledger_id = v_ledger_id
341          AND    f.attribute_id =
342             (SELECT attribute_id
343              FROM   fem_dim_attributes_b
344              WHERE attribute_varchar_label = 'GLOBAL_VS_COMBO')
345          AND    f.version_id =
346             (SELECT version_id
347              FROM   fem_dim_attr_versions_b
348              WHERE  attribute_id = f.attribute_id
349              AND    default_version_flag = 'Y');
350       EXCEPTION
351          WHEN no_data_found THEN
352             v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
353                              p_dim_label => 'LEDGER',
354                              p_attr_label => 'GLOBAL_VS_COMBO');
355             x_err_code := 2;
356             x_num_msg := x_num_msg + 1;
357             RAISE e_no_value_found;
358       END;
359    ELSE
360       v_token_value := v_dim_name;
361       x_err_code := 2;
362       x_num_msg := x_num_msg + 1;
363       RAISE e_no_value_found;
364    END IF;
365 END IF;
366 
367 RETURN v_global_vs_id;
368 
369 EXCEPTION
370    WHEN e_null_param_value THEN
371       FEM_ENGINES_PKG.Put_Message(
372          p_app_name => 'FEM',
373          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
374          p_token1 => 'PARAM',
375          p_value1 => v_token_value);
376       RETURN -1;
377 
378    WHEN e_no_value_found THEN
379       FEM_ENGINES_PKG.Put_Message(
380          p_app_name => 'FEM',
381          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
382          p_token1 => 'ENTITY',
383          p_value1 => v_token_value);
384       RETURN -1;
385 
386 END Global_VS_Combo_ID;
387 
388 --------------------------------------------------------------------------
389 
390 FUNCTION Global_VS_Combo_ID (
391    p_api_version     IN NUMBER     DEFAULT c_api_version,
392    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
393    p_commit          IN VARCHAR2   DEFAULT c_false,
394    p_encoded         IN VARCHAR2   DEFAULT c_true,
395    x_return_status  OUT NOCOPY VARCHAR2,
396    x_msg_count      OUT NOCOPY NUMBER,
397    x_msg_data       OUT NOCOPY VARCHAR2,
398    p_ledger_id       IN NUMBER
399 ) RETURN NUMBER
400 IS
404 BEGIN
401    v_global_vs_id NUMBER;
402    v_ledger_id NUMBER;
403    v_dim_name VARCHAR2(80);
405 
406 x_return_status := c_success;
407 
408 Validate_OA_Params (
409    p_api_version => p_api_version,
410    p_init_msg_list => p_init_msg_list,
411    p_commit => p_commit,
412    p_encoded => p_encoded,
413    x_return_status => x_return_status);
414 
415 IF (x_return_status <> c_success)
416 THEN
417    FND_MSG_PUB.Count_and_Get(
418       p_encoded => c_false,
419       p_count => x_msg_count,
420       p_data => x_msg_data);
421    RETURN -1;
422 END IF;
423 
424 IF (p_ledger_id is NULL)
425 THEN
426    IF (v_session_ledger_id IS NULL)
427    THEN
428       v_ledger_id := FND_PROFILE.VALUE_SPECIFIC (
429                        c_fem_ledger,
430                        fnd_global.user_id,
431                        null ,null);
432    ELSE
433       v_ledger_id := v_session_ledger_id;
434    END IF;
435 ELSE
436    v_ledger_id := p_ledger_id;
437 END IF;
438 
439 v_dim_name := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
440               p_dim_label => 'LEDGER');
441 
442 IF (v_ledger_id is NULL)
443 THEN
444    v_token_value := v_dim_name;
445    RAISE e_null_param_value;
446 
447 ELSE
448    IF (Is_Ledger_ID_Valid(v_ledger_id) = 'Y')
449    THEN
450       BEGIN
451          SELECT dim_attribute_numeric_member
452          INTO   v_global_vs_id
453          FROM   fem_ledgers_attr f
454          WHERE  f.ledger_id = v_ledger_id
455          AND    f.attribute_id =
456             (SELECT attribute_id
457              FROM   fem_dim_attributes_b
458              WHERE attribute_varchar_label = 'GLOBAL_VS_COMBO')
459          AND    f.version_id =
460             (SELECT version_id
461              FROM   fem_dim_attr_versions_b
462              WHERE  attribute_id = f.attribute_id
463              AND    default_version_flag = 'Y');
464       EXCEPTION
465          WHEN no_data_found THEN
466             v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
467                              p_dim_label => 'LEDGER',
468                              p_attr_label => 'GLOBAL_VS_COMBO');
469             RAISE e_no_value_found;
470       END;
471    ELSE
472       v_token_value := v_dim_name;
473       RAISE e_no_value_found;
474    END IF;
475 END IF;
476 
477 RETURN v_global_vs_id;
478 
479 EXCEPTION
480    WHEN e_null_param_value THEN
481       FEM_ENGINES_PKG.Put_Message(
482          p_app_name => 'FEM',
483          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
484          p_token1 => 'PARAM',
485          p_value1 => v_token_value);
486       FND_MSG_PUB.Count_and_Get(
487          p_encoded => p_encoded,
488          p_count => x_msg_count,
489          p_data => x_msg_data);
490       x_return_status := c_error;
491       RETURN -1;
492 
493    WHEN e_no_value_found THEN
494       FEM_ENGINES_PKG.Put_Message(
495          p_app_name => 'FEM',
496          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
497          p_token1 => 'ENTITY',
498          p_value1 => v_token_value);
499       FND_MSG_PUB.Count_and_Get(
500          p_encoded => p_encoded,
501          p_count => x_msg_count,
502          p_data => x_msg_data);
503       x_return_status := c_error;
504       RETURN -1;
505 
506 END Global_VS_Combo_ID;
507 
508 /*************************************************************************
509 
510                           Local_VS_Combo_ID
511 
512 rflippo 10/26/2004  Due to changes in the rule sharing design for FEM.C,
513                     this function now returns the Global VS Combo ID.
514                     Local Combos have been obsoleted and are no longer
515                     applicable to FEM.
516 
517                      The function returns the value for the GLOBAL_VS_COMBO
518                      attribute assignment for the given ledger.
519 
520 PURPOSE:  This function is meant to be called by engines and UI to determine
521           the value set context for a given ledger.  The returned Global combo
522           then gets attached to business rules when they are created - this
523           controls how those rules are shared.
524 
525           For example - you create a Mapping Rule - the UI should call this
526           function to identify the Global Combo for that mapping rule based upon
527           the ledger under which it was created.  It then
528           stores that value into FEM_OBJECT_CATALOG_B.local_vs_combo_id.
529 
530           When you go to open that rule under a different ledger, the UI compares
531           the Global Combo that returns for the new Ledger with the global combo
532           stored in FEM_OBJECT_CATALOG_B.local_vs_combo_id for the rule being
533           opened.
534 
535           There are 2 signatures for this function - one is OA framework
536           compatible while the other is not.
537 
538 *************************************************************************/
539 
540 -- Non OA framework compatible signature
541 FUNCTION Local_VS_Combo_ID (
542    p_ledger_id IN NUMBER,
543    x_err_code OUT NOCOPY NUMBER,
544    x_num_msg  OUT NOCOPY NUMBER
548    v_global_vs_id NUMBER;
545 ) RETURN NUMBER
546 IS
547 
549 
550 BEGIN
551 
552 x_err_code := 0;
553 x_num_msg := 0;
554 
555 v_global_vs_id := Global_VS_Combo_ID (
556                   p_ledger_id => p_ledger_id,
557                   x_err_code => x_err_code,
558                   x_num_msg => x_num_msg);
559 
560 IF (v_global_vs_id = -1)
561 THEN
562    RAISE e_user_exception;
563 END IF;
564 
565 
566 RETURN v_global_vs_id;
567 
568 EXCEPTION
569    WHEN e_user_exception THEN
570       RETURN -1;
571 
572 END Local_VS_Combo_ID;
573 
574 --------------------------------------------------------------------------
575 -- OA Framework compatible signature
576 FUNCTION Local_VS_Combo_ID (
577    p_api_version     IN NUMBER     DEFAULT c_api_version,
578    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
579    p_commit          IN VARCHAR2   DEFAULT c_false,
580    p_encoded         IN VARCHAR2   DEFAULT c_true,
581    x_return_status  OUT NOCOPY VARCHAR2,
582    x_msg_count      OUT NOCOPY NUMBER,
583    x_msg_data       OUT NOCOPY VARCHAR2,
584    p_ledger_id       IN NUMBER
585 ) RETURN NUMBER
586 IS
587    v_global_vs_id NUMBER;
588 
589 BEGIN
590 
591 x_return_status := c_success;
592 
593 Validate_OA_Params (
594    p_api_version => p_api_version,
595    p_init_msg_list => p_init_msg_list,
596    p_commit => p_commit,
597    p_encoded => p_encoded,
598    x_return_status => x_return_status);
599 
600 IF (x_return_status <> c_success)
601 THEN
602    FND_MSG_PUB.Count_and_Get(
603       p_encoded => c_false,
604       p_count => x_msg_count,
605       p_data => x_msg_data);
606    RETURN -1;
607 END IF;
608 
609 v_global_vs_id := Global_VS_Combo_ID (
610                   p_api_version => p_api_version,
611                   p_init_msg_list => c_false,
612                   p_commit => c_false,
613                   p_encoded => p_encoded,
614                   x_return_status => x_return_status,
615                   x_msg_count => x_msg_count,
616                   x_msg_data => x_msg_data,
617                   p_ledger_id => p_ledger_id);
618 
619 IF (v_global_vs_id = -1)
620 THEN
621    RAISE e_user_exception;
622 END IF;
623 
624 
625 RETURN v_global_vs_id;
626 
627 EXCEPTION
628 
629    WHEN e_user_exception THEN
630       RETURN -1;
631 
632 END Local_VS_Combo_ID;
633 
634 /*************************************************************************
635 
636                        Dimension_Value_Set_ID
637 
638  This procedure returns the Value Set ID based upon the Global
639   Value Set of the ledger
640 
641  Normally, call the overloaded version of the function
642   that has the OUT NOCOPY parameters.
643  The version that only accepts the Dimension ID parameter is called only
644   as the where condition in the Value Set context views (_VS).
645 
646  2/27/2006 rflippo
647  NOTE:  In order to improve performance of this function for the VS views
648         I have done the following:
649            - cached values for ledger, dimension_id and value_set
650              The function returns the cache value set whenever the
651              ledger + dimension in the cache match the ledger + dimension
652              in the user's session.  This saves work because we don't
653              need to retrieve the global combo info again
654            - duplicated code for the global combo retreival from the
655              Global_VS_Combo_ID procedure in this package.  This will
656              improve performance because it skips error checks that are
657              in that procedure, as well as provides more efficient access
658              by removing one calling layer
659            - duplicated code from the overloaded Dimension_Value_Set_ID
660              function.  This improves performance by removing one calling
661              layer
662         The idea is to make this function as efficient as possible for
663         use with the VS views.  This means doing away from with error checks
664         so that we assume that we are getting a valid ledger/dimension being
665         passed in.  The function always has to call out to the
666         FND_PROFILE.value function in order to identify the ledger of the current
667         session - this is unavoidable because of the way that OA framework pools
668         sessions.  However, other than this one function call, we can return
669         the value set without any additional work for the same session.  This
670         means the VS views will only have to call the FND_PROFILE.value function
671         when returning rows, rather than redo all of the global combo/value
672         set retrievals.
673 
674 *************************************************************************/
675 
676 FUNCTION Dimension_Value_Set_ID (
677    p_dimension_id IN NUMBER,
678    p_ledger_id IN NUMBER DEFAULT NULL
679 ) RETURN NUMBER
680 IS
681    v_count NUMBER;
682    v_vsr_flag VARCHAR2(1);
683    v_current_session_ledger_id NUMBER;
684    v_global_vs_id NUMBER;
685 
686    v_dim_vs_id NUMBER;
687    v_err_code NUMBER;
688    v_num_msg  NUMBER;
692    SELECT count(*)
689    v_return_value_set NUMBER;
690 BEGIN
691 
693    INTO v_count
694    FROM fem_xdim_dimensions
695    WHERE dimension_id = p_dimension_id;
696 
697    IF v_count > 0 THEN
698       v_vsr_flag := 'Y';
699    ELSE v_vsr_flag := 'N';
700    END IF;
701 
702    /****************************************************
703     If the calling app passes in the ledger, then we use that ledger
704     for determining the global value set combo info.
705     Otherwise, we compare the ledger and dimension of the user's session with the
706     Ledger and dimension in the global variable for the package -
707     if they are NOT the same, then we need to retrieve all of the global combo
708     info from the database again (and store into global variables in the
709     package).
710     However, if they are the same, we use the value set that we already have
711     cached in a global package variable
712    ******************************************************/
713    IF v_vsr_flag = 'Y' THEN
714 
715    IF (p_ledger_id IS NULL) THEN
716       --Bug#5604779: Use Value_Specific to prevent caching
717       --v_current_session_ledger_id := FND_PROFILE.VALUE (c_fem_ledger);
718       v_current_session_ledger_id := FND_PROFILE.VALUE_SPECIFIC(
719                   c_fem_ledger,
720                   fnd_global.user_id,
721                   null,null);
722    ELSE v_current_session_ledger_id := p_ledger_id;
723    END IF;
724 
725    IF v_current_session_ledger_id <> nvl(g_cache_ledger_id,-1) OR
726      p_dimension_id <> nvl(g_cache_dimension_id,-1) THEN
727       g_cache_ledger_id := v_current_session_ledger_id;
728       g_cache_dimension_id := p_dimension_id;
729 
730       BEGIN
731          SELECT dim_attribute_numeric_member
732          INTO   v_global_vs_id
733          FROM   fem_ledgers_attr f
734          WHERE  f.ledger_id = v_current_session_ledger_id
735          AND    f.attribute_id =
736          (SELECT attribute_id
737           FROM   fem_dim_attributes_b
738           WHERE attribute_varchar_label = 'GLOBAL_VS_COMBO')
739           AND    f.version_id =
740          (SELECT version_id
741           FROM   fem_dim_attr_versions_b
742           WHERE  attribute_id = f.attribute_id
743           AND    default_version_flag = 'Y');
744       EXCEPTION
745          WHEN no_data_found THEN
746             v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
747                              p_dim_label => 'LEDGER',
748                              p_attr_label => 'GLOBAL_VS_COMBO');
749             FEM_ENGINES_PKG.Put_Message(
750                p_app_name => 'FEM',
751                p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
752                p_token1 => 'ENTITY',
753                p_value1 => v_token_value);
754       END;
755 
756       BEGIN
757          SELECT value_set_id
758          INTO   v_dim_vs_id
759          FROM   fem_global_vs_combo_defs
760          WHERE  global_vs_combo_id = v_global_vs_id
761          AND    dimension_id = p_dimension_id;
762 
763          g_cache_dim_vs_id := v_dim_vs_id;
764       EXCEPTION
765          WHEN no_data_found THEN
766             v_token_value := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
767                              p_dim_label => 'VALUE_SET');
768             FEM_ENGINES_PKG.Put_Message(
769                p_app_name => 'FEM',
770                p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
771                p_token1 => 'ENTITY',
772                p_value1 => v_token_value);
773 
774       END;
775 
776    END IF;
777    END IF;  -- v_vsr_flag
778 
779    IF v_vsr_flag = 'N' THEN
780       v_return_value_set := -1;
781    ELSE
782       v_return_value_set := nvl(g_cache_dim_vs_id,-1);
783    END IF;
784 RETURN v_return_value_set;
785 
786 
787 END Dimension_Value_Set_ID;
788 
789 ------------------------------------------------------------------------
790 
791 FUNCTION Dimension_Value_Set_ID (
792    p_dimension_id IN NUMBER,
793    p_ledger_id IN NUMBER,
794    x_err_code OUT NOCOPY NUMBER,
795    x_num_msg  OUT NOCOPY NUMBER
796 ) RETURN NUMBER
797 IS
798    v_vs_id NUMBER;
799    v_global_vs_id NUMBER;
800 BEGIN
801 
802 x_err_code := 0;
803 x_num_msg := 0;
804 
805 IF (Is_Dimension_ID_Valid(p_dimension_id) <> 'Y')
806 THEN
807    v_token_value := 'FEM_DIMENSION_TXT';
808    v_token_trans := 'Y';
809    x_err_code := 2;
810    x_num_msg := x_num_msg + 1;
811    RAISE e_no_value_found;
812 ELSE
813    v_global_vs_id := Global_VS_Combo_ID (
814                      p_ledger_id => p_ledger_id,
815                      x_err_code => x_err_code,
816                      x_num_msg  => x_num_msg);
817    IF (v_global_vs_id = -1)
818    THEN
819       RAISE e_user_exception;
820    END IF;
821 
822    BEGIN
823       SELECT value_set_id
824       INTO   v_vs_id
825       FROM   fem_global_vs_combo_defs
826       WHERE  global_vs_combo_id = v_global_vs_id
827       AND    dimension_id = p_dimension_id;
828    EXCEPTION
832          v_token_trans := 'N';
829       WHEN no_data_found THEN
830          v_token_value := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
831                           p_dim_label => 'VALUE_SET');
833          x_err_code := 2;
834          x_num_msg := x_num_msg + 1;
835          RAISE e_no_value_found;
836    END;
837 
838 END IF;
839 
840 RETURN v_vs_id;
841 
842 EXCEPTION
843    WHEN e_no_value_found THEN
844       FEM_ENGINES_PKG.Put_Message(
845          p_app_name => 'FEM',
846          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
847          p_token1 => 'ENTITY',
848          p_value1 => v_token_value,
849          p_trans1 => v_token_trans);
850       RETURN -1;
851 
852    WHEN e_user_exception THEN
853       RETURN -1;
854 
855 END Dimension_Value_Set_ID;
856 
857 ------------------------------------------------------------------------
858 
859 FUNCTION Dimension_Value_Set_ID (
860    p_api_version     IN NUMBER     DEFAULT c_api_version,
861    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
862    p_commit          IN VARCHAR2   DEFAULT c_false,
863    p_encoded         IN VARCHAR2   DEFAULT c_true,
864    x_return_status  OUT NOCOPY VARCHAR2,
865    x_msg_count      OUT NOCOPY NUMBER,
866    x_msg_data       OUT NOCOPY VARCHAR2,
867    p_dimension_id    IN NUMBER,
868    p_ledger_id       IN NUMBER
869 ) RETURN NUMBER
870 IS
871    v_vs_id NUMBER;
872    v_global_vs_id NUMBER;
873 BEGIN
874 
875 x_return_status := c_success;
876 
877 Validate_OA_Params (
878    p_api_version => p_api_version,
879    p_init_msg_list => p_init_msg_list,
880    p_commit => p_commit,
881    p_encoded => p_encoded,
882    x_return_status => x_return_status);
883 
884 IF (x_return_status <> c_success)
885 THEN
886    FND_MSG_PUB.Count_and_Get(
887       p_encoded => c_false,
888       p_count => x_msg_count,
889       p_data => x_msg_data);
890    RETURN -1;
891 END IF;
892 
893 IF (Is_Dimension_ID_Valid(p_dimension_id) <> 'Y')
894 THEN
895    v_token_value := 'FEM_DIMENSION_TXT';
896    v_token_trans := 'Y';
897    x_return_status := c_error;
898    RAISE e_no_value_found;
899 ELSE
900    v_global_vs_id := Global_VS_Combo_ID (
901                      p_api_version => p_api_version,
902                      p_init_msg_list => c_false,
903                      p_commit => c_false,
904                      p_encoded => p_encoded,
905                      x_return_status => x_return_status,
906                      x_msg_count => x_msg_count,
907                      x_msg_data => x_msg_data,
908                      p_ledger_id => p_ledger_id);
909 
910    IF (v_global_vs_id = -1)
911    THEN
912       RAISE e_user_exception;
913    END IF;
914 
915    BEGIN
916       SELECT value_set_id
917       INTO   v_vs_id
918       FROM   fem_global_vs_combo_defs
919       WHERE  global_vs_combo_id = v_global_vs_id
920       AND    dimension_id = p_dimension_id;
921    EXCEPTION
922       WHEN no_data_found THEN
923          v_token_value := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
924                           p_dim_label => 'VALUE_SET');
925          v_token_trans := 'N';
926          RAISE e_no_value_found;
927    END;
928 
929 END IF;
930 
931 RETURN v_vs_id;
932 
933 EXCEPTION
934    WHEN e_no_value_found THEN
935       FEM_ENGINES_PKG.Put_Message(
936          p_app_name => 'FEM',
937          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
938          p_token1 => 'ENTITY',
939          p_value1 => v_token_value,
940          p_trans1 => v_token_trans);
941       FND_MSG_PUB.Count_and_Get(
942          p_encoded => p_encoded,
943          p_count => x_msg_count,
944          p_data => x_msg_data);
945       x_return_status := c_error;
946       RETURN -1;
947 
948    WHEN e_user_exception THEN
949       RETURN -1;
950 
951 END Dimension_Value_Set_ID;
952 
953 /*************************************************************************
954 
955                         Is_Rule_Valid_For_Ledger
956 
957 *************************************************************************/
958 
959 FUNCTION Is_Rule_Valid_For_Ledger (
960    p_object_id   IN NUMBER,
961    p_ledger_id   IN NUMBER
962 ) RETURN VARCHAR2
963 IS
964    v_return_status VARCHAR2(1);
965    v_msg_count  NUMBER;
966    v_msg_data   VARCHAR2(255);
967    v_rule_vs_id NUMBER;
968    v_local_vs_id NUMBER;
969 BEGIN
970 
971 v_local_vs_id := Local_VS_Combo_ID (
972                  p_api_version => c_api_version,
973                  p_init_msg_list => c_false,
974                  p_commit => c_false,
975                  p_encoded => c_true,
976                  x_return_status => v_return_status,
977                  x_msg_count => v_msg_count,
978                  x_msg_data => v_msg_data,
979                  p_ledger_id => p_ledger_id);
980 
981 IF (v_local_vs_id = -1)
982 THEN
983    RETURN 'N';
984 END IF;
988    INTO   v_rule_vs_id
985 
986 BEGIN
987    SELECT local_vs_combo_id
989    FROM fem_object_catalog_b
990    WHERE object_id = p_object_id;
991 EXCEPTION
992    WHEN no_data_found THEN
993       RETURN 'N';
994 END;
995 
996    IF (v_local_vs_id = v_rule_vs_id)
997    THEN
998       RETURN 'Y';
999    ELSE
1000       RETURN 'N';
1001    END IF;
1002 
1003 END Is_Rule_Valid_For_Ledger;
1004 
1005 /*************************************************************************
1006 
1007                       Create_Local_VS_Combo_ID
1008 
1009 *************************************************************************/
1010 
1011 PROCEDURE Create_Local_VS_Combo_ID
1012 IS
1013    v_app_grp NUMBER;
1014    v_global_vs_id NUMBER;
1015 BEGIN
1016 
1017 SELECT application_group_id
1018 INTO   v_app_grp
1019 FROM   fem_applications;
1020 
1021 SELECT global_vs_combo_id
1022 INTO   v_global_vs_id
1023 FROM   fem_global_vs_combos_b;
1024 
1025 END Create_Local_VS_Combo_ID;
1026 
1027 
1028 /*************************************************************************
1029 
1030                        Relative_Cal_Period_ID
1031 Purpose:  To identify an offset calendar period when given
1032           a base calendar period and an offset count, within
1033           the same level (Dimension Group) and Calendar of
1034           the base period.
1035 
1036 The function works as follows:
1037 
1038 It builds a list of all of the Calendar Periods for the level
1039 and Calendar of the Base Period.  It orders these periods by
1040 End Date and period number.  Note that because CAL_PERIOD_ID
1041 is a composite key, it allows us to simploy order by CAL_PERIOD_ID
1042 to achieve the desire sequence.  This is because the first 2
1043 components of CAL_PERIOD_ID are End_Date (julian) and Period Number.
1044 
1045 The function then counts up and down the list based upon the
1046 offset value.
1047 
1048 Adjustment periods are considered based upon the value for a new
1049 attribute "USE_ADJ_PERIOD_FLAG" for the "CALENDAR" dimension.
1050 
1051 For example - here is a possible list of Periods
1052 (notice there is a gap for AUG):
1053 
1054 Calendar = Financial
1055 Level = Month
1056 
1057 End Date Period Number  Adjustment Period Flag? Fiscal Year
1058 JAN-31-2004 1  N  2003
1059 FEB-28-2004 2  N  2003
1060 MAR-31-2004 3  N  2003
1061 MAR-31-2004 13 Y  2003
1062 APR-30-2004 4  N  2004
1063 MAY-31-2004 5  N  2004
1064 JUN-30-2004 6  N  2004
1065 JUL-31-2004 7  N  2004
1066 SEP-30-2004 9  N  2004
1067 OCT-31-2004 10 N  2004
1068 NOV-30-2004 11 N  2004
1069 DEC-31-2004 12 N  2004
1070 DEC-31-2004 14 Y  2004
1071 
1072 
1073 Example1 - Assuming Adjustment Periods are counted:
1074 Base Period = JAN-31-2004
1075 Offset = +4
1076 Function returns - APR-30-2004
1077 
1078 Example2 - Assuming Adjustment Periods are not counted:
1079 Base Period = JAN-31-2004
1080 Offset= +4
1081 Function returns: MAY-31-2004
1082 
1083 Example3:
1084 Base Period = APR-30-2004
1085 Offset=+6
1086 Function returns: NOV-30-2004
1087 
1088 Note: The function returns p_base_cal_period_id when p_per_num_offset = 0
1089 (regardless of the adjustment period attribute settings).
1090 
1091 *************************************************************************/
1092 
1093 FUNCTION Relative_Cal_Period_ID (
1094    p_api_version        IN NUMBER     DEFAULT c_api_version,
1095    p_init_msg_list      IN VARCHAR2   DEFAULT c_false,
1096    p_commit             IN VARCHAR2   DEFAULT c_false,
1097    p_encoded            IN VARCHAR2   DEFAULT c_true,
1098    x_return_status      OUT NOCOPY VARCHAR2,
1099    x_msg_count          OUT NOCOPY NUMBER,
1100    x_msg_data           OUT NOCOPY VARCHAR2,
1101    p_per_num_offset     IN NUMBER,
1102    p_base_cal_period_id IN NUMBER
1103 ) RETURN NUMBER
1104 IS
1105   C_MODULE        CONSTANT FND_LOG_MESSAGES.module%TYPE :=
1106      'fem.plsql.fem_dimension_util_pkg.relative_cal_period_id';
1107   C_LIMIT         CONSTANT NUMBER := 10000;  -- fetch limit
1108   e_unexp         EXCEPTION;
1109 
1110   TYPE cal_period_tbl_type IS TABLE OF FEM_CAL_PERIODS_B.cal_period_id%TYPE;
1111   v_cal_period_tbl   cal_period_tbl_type;
1112   TYPE cal_period_cur_type IS REF CURSOR;  -- define weak REF CURSOR type
1113   v_cal_period_cv    cal_period_cur_type;
1114 
1115   v_base_dimgrp_id   FEM_CAL_PERIODS_B.calendar_id%TYPE;
1116   v_base_calendar_id FEM_CAL_PERIODS_B.dimension_group_id%TYPE;
1117   v_dim_id           FEM_DIMENSIONS_B.dimension_id%TYPE;
1118   v_dim_name         FEM_DIMENSIONS_TL.dimension_name%TYPE;
1119   v_dim_attr_id      FEM_DIM_ATTRIBUTES_B.attribute_id%TYPE;
1120   v_dim_attr_ver_id  FEM_DIM_ATTR_VERSIONS_B.version_id%TYPE;
1121   v_cal_attr_id      FEM_DIM_ATTRIBUTES_B.attribute_id%TYPE;
1122   v_cal_attr_ver_id  FEM_DIM_ATTR_VERSIONS_B.version_id%TYPE;
1123   v_cal_attr_name    FEM_DIM_ATTRIBUTES_TL.attribute_name%TYPE;
1124   v_incl_adj_period  FEM_CALENDARS_ATTR.dim_attribute_varchar_member%TYPE;
1125 
1126   v_return_code      NUMBER;
1127   v_sql              VARCHAR2(1000);
1128   v_offset           NUMBER;
1129   v_fetch_count      NUMBER;
1130   v_index            NUMBER;
1134   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1131   v_fetches_needed   NUMBER;
1132 BEGIN
1133 
1135     FEM_ENGINES_PKG.TECH_MESSAGE(
1136       p_severity => FND_LOG.level_procedure,
1137       p_module   => C_MODULE,
1138       p_msg_text => 'Begin Procedure');
1139   END IF;
1140 
1141   x_return_status := c_success;
1142 
1143   Validate_OA_Params (
1144       p_api_version => p_api_version,
1145       p_init_msg_list => p_init_msg_list,
1146       p_commit => p_commit,
1147       p_encoded => p_encoded,
1148       x_return_status => x_return_status);
1149 
1150   IF (x_return_status <> c_success)
1151   THEN
1152     FND_MSG_PUB.Count_and_Get(
1153       p_encoded => p_encoded,
1154       p_count => x_msg_count,
1155       p_data => x_msg_data);
1156     RETURN -1;
1157   END IF;
1158 
1159   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1160     FEM_ENGINES_PKG.TECH_MESSAGE(
1161       p_severity => FND_LOG.level_statement,
1162       p_module   => C_MODULE,
1163       p_msg_text => 'p_per_num_offset = '||to_char(p_per_num_offset));
1164     FEM_ENGINES_PKG.TECH_MESSAGE(
1165       p_severity => FND_LOG.level_statement,
1166       p_module   => C_MODULE,
1167       p_msg_text => 'p_base_cal_period_id = '||to_char(p_base_cal_period_id));
1168   END IF;
1169 
1170   -- Determine the dimension_group_id and calendar_id
1171   -- of the base period
1172   BEGIN
1173     SELECT calendar_id, dimension_group_id
1174     INTO v_base_calendar_id, v_base_dimgrp_id
1175     FROM fem_cal_periods_b
1176     WHERE cal_period_id = p_base_cal_period_id;
1177 
1178     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1179         FEM_ENGINES_PKG.TECH_MESSAGE(
1180           p_severity => FND_LOG.level_statement,
1181           p_module   => C_MODULE,
1182           p_msg_text => 'v_base_calendar_id = '||to_char(v_base_calendar_id));
1183         FEM_ENGINES_PKG.TECH_MESSAGE(
1184           p_severity => FND_LOG.level_statement,
1185           p_module   => C_MODULE,
1186           p_msg_text => 'v_base_dimgrp_id = '||to_char(v_base_dimgrp_id));
1187     END IF;
1188   EXCEPTION
1189     WHEN OTHERS THEN
1190       IF FND_LOG.level_error >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1191         FEM_ENGINES_PKG.TECH_MESSAGE(
1192           p_severity => FND_LOG.level_error,
1193           p_module   => C_MODULE,
1194           p_msg_text => 'Calendar period '||to_char(p_base_cal_period_id)
1195             ||' cannot be found.');
1196       END IF;
1197 
1198    -- Log user message onto the message stack:
1199    -- Calendar Period 'CAL_PER' is invalid
1200       FEM_ENGINES_PKG.Put_Message(
1201          p_app_name => 'FEM',
1202          p_msg_name => 'FEM_DATAX_LDR_BAD_CAL_PER_ERR',
1203          p_token1 => 'CAL_PER',
1204          p_value1 => TO_CHAR(p_base_cal_period_id));
1205 
1206       RAISE e_error;
1207   END;
1208 
1209   -- Obtain the value of the calendar attribute INCLUDE_ADJ_PERIOD_FLAG
1210   -- that determines whether or not Adjustment Periods
1211   -- will be considered in the relative period calc
1212 
1213   -- 1. Get the Dimension ID for Calendar.
1214   BEGIN
1215     SELECT dimension_id, dimension_name
1216     INTO v_dim_id, v_dim_name
1217     FROM fem_dimensions_vl
1218     WHERE dimension_varchar_label = 'CALENDAR';
1219 
1220     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1221       FEM_ENGINES_PKG.TECH_MESSAGE(
1222         p_severity => FND_LOG.level_statement,
1223         p_module   => C_MODULE,
1224         p_msg_text => 'Dimension ID of Calendar dimenions is '
1225           ||to_char(v_dim_id));
1226     END IF;
1227   EXCEPTION
1228     WHEN others THEN
1229       IF FND_LOG.level_error >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1230         FEM_ENGINES_PKG.TECH_MESSAGE(
1231           p_severity => FND_LOG.level_error,
1232           p_module   => C_MODULE,
1233           p_msg_text => 'CALENDAR dimension does not exist!');
1234       END IF;
1235       RAISE e_error;
1236   END;
1237 
1238   -- 2. Get the default dimension attribute id and version for
1239   --    calendar attribute INCLUDE_ADJ_PERIOD_FLAG.
1240   get_dim_attr_id_ver_id
1241      (p_dim_id      => v_dim_id,
1242       p_attr_label  => 'INCLUDE_ADJ_PERIOD_FLAG',
1243       x_attr_id     => v_cal_attr_id,
1244       x_ver_id      => v_cal_attr_ver_id,
1245       x_err_code    => v_return_code);
1246 
1250         p_module   => C_MODULE,
1247   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1248     FEM_ENGINES_PKG.TECH_MESSAGE(
1249         p_severity => FND_LOG.level_statement,
1251         p_msg_text => 'FEM_Dimension_Util_Pkg.get_dim_attr_id_ver_id'
1252           ||'(INCLUDE_ADJ_PERIOD_FLAG) returned with return code of '
1253           ||to_char(v_return_code));
1254   END IF;
1255 
1256   IF v_return_code <> 0 THEN  -- if not success
1257 
1258   -- Log debug message and put user user message on the message stack:
1259   -- The specified Dimension Attribute was not found. Please contact your System
1260   -- Administrator for assistance.
1261   -- Dimension: DIMENSION_VARCHAR_LABEL
1262   -- Attribute: ATTRIBUTE_VARCHAR_LABEL
1263 
1264     IF FND_LOG.level_error >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1265       FEM_ENGINES_PKG.TECH_MESSAGE(
1266          p_severity => FND_LOG.level_error,
1267          p_module   => C_MODULE,
1268          p_app_name => 'FEM',
1269          p_msg_name => 'FEM_ENG_NO_DIM_ATTR_VER_ERR',
1270          p_token1 => 'DIMENSION_VARCHAR_LABEL',
1271          p_value1 => v_dim_name,
1272          p_token2 => 'ATTRIBUTE_VARCHAR_LABEL',
1273          p_value2 => 'INCLUDE_ADJ_PERIOD_FLAG');
1274      END IF;
1275 
1276      FEM_ENGINES_PKG.Put_Message(
1277         p_app_name => 'FEM',
1278         p_msg_name => 'FEM_ENG_NO_DIM_ATTR_VER_ERR',
1279         p_token1 => 'DIMENSION_VARCHAR_LABEL',
1280         p_value1 => v_dim_name,
1281         p_token2 => 'ATTRIBUTE_VARCHAR_LABEL',
1282         p_value2 => 'INCLUDE_ADJ_PERIOD_FLAG');
1283 
1284     RAISE e_error;
1285 
1286   END IF;
1287 
1288   -- 3. Get the default version attribute assignment for
1289   -- calendar attribute INCLUDE_ADJ_PERIOD_FLAG.
1290   BEGIN
1291     SELECT dim_attribute_varchar_member
1292     INTO v_incl_adj_period
1293     FROM fem_calendars_attr
1294     WHERE attribute_id  = v_cal_attr_id
1295     AND version_id    = v_cal_attr_ver_id
1296     AND calendar_id   = v_base_calendar_id;
1297 
1298     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1299       FEM_ENGINES_PKG.TECH_MESSAGE(
1300         p_severity => FND_LOG.level_statement,
1301         p_module   => C_MODULE,
1302         p_msg_text => 'Calendar attribute INCLUDE_ADJ_PERIOD_FLAG is set to '
1303           ||v_incl_adj_period);
1304     END IF;
1305   EXCEPTION
1306     WHEN others THEN
1307 
1308       IF FND_LOG.level_error >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1309         FEM_ENGINES_PKG.TECH_MESSAGE(
1310           p_severity => FND_LOG.level_error,
1311           p_module   => C_MODULE,
1312           p_msg_text => 'Calendar does not have attribute value for '
1313             ||'attribute INCLUDE_ADJ_PERIOD_FLAG');
1314       END IF;
1315 
1316    -- Put user user message on the message stack:
1317    -- A Valid Attribute value was not found for the specified Dimension Attribute.
1318    -- Please contact your System Administrator for assistance.
1319    -- Dimension: DIMENSION_VARCHAR_LABEL
1320    -- Attribute: ATTRIBUTE_VARCHAR_LABEL
1321 
1322       SELECT attribute_name
1323       INTO v_cal_attr_name
1324       FROM fem_dim_attributes_vl
1325       WHERE attribute_id = v_cal_attr_id;
1326 
1327       FEM_ENGINES_PKG.Put_Message(
1328          p_app_name => 'FEM',
1329          p_msg_name => 'FEM_ENG_NO_DIM_ATTR_VAL_ERR',
1330          p_token1 => 'DIMENSION_VARCHAR_LABEL',
1331          p_value1 => v_dim_name,
1332          p_token2 => 'ATTRIBUTE_VARCHAR_LABEL',
1333          p_value2 => v_cal_attr_name);
1334 
1335        RAISE e_error;
1336    END;
1337 
1338   -- Obtain the dim attribute id and attribute version id for
1339   -- the calendar period attribute ADJ_PERIOD_FLAG
1340   -- that determines if a calendar period is an adjustment period.
1341 
1342   -- 1. Get the Dimension ID for Calendar Period.
1343   BEGIN
1344     SELECT dimension_id, dimension_name
1345     INTO v_dim_id, v_dim_name
1346     FROM fem_dimensions_vl
1347     WHERE dimension_varchar_label = 'CAL_PERIOD';
1348 
1349     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1350       FEM_ENGINES_PKG.TECH_MESSAGE(
1351         p_severity => FND_LOG.level_statement,
1352         p_module   => C_MODULE,
1353         p_msg_text => 'Dimension ID of Calendar Period dimenions is '
1354           ||to_char(v_dim_id));
1355     END IF;
1356   EXCEPTION
1357     WHEN others THEN
1358       IF FND_LOG.level_error >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1359         FEM_ENGINES_PKG.TECH_MESSAGE(
1360           p_severity => FND_LOG.level_error,
1361           p_module   => C_MODULE,
1362           p_msg_text => 'CAL_PERIOD dimension does not exist!');
1363       END IF;
1364       RAISE e_error;
1365   END;
1366 
1367   -- 2. Get the default dimension attribute id and version for
1368   --    calendar period attribute ADJ_PERIOD_FLAG.
1369   get_dim_attr_id_ver_id
1370      (p_dim_id      => v_dim_id,
1371       p_attr_label  => 'ADJ_PERIOD_FLAG',
1372       x_attr_id     => v_dim_attr_id,
1373       x_ver_id      => v_dim_attr_ver_id,
1374       x_err_code    => v_return_code);
1375 
1376   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1380         p_msg_text => 'FEM_Dimension_Util_Pkg.get_dim_attr_id_ver_id '
1377     FEM_ENGINES_PKG.TECH_MESSAGE(
1378         p_severity => FND_LOG.level_statement,
1379         p_module   => C_MODULE,
1381           ||'(INCLUDE_ADJ_PERIOD_FLAG) returned with error code of '
1382           ||to_char(v_return_code));
1383   END IF;
1384 
1385   IF v_return_code <> 0 THEN  -- if not success
1386 
1387   -- Log a debug message and put user user message on the message stack:
1388   -- The specified Dimension Attribute was not found. Please contact your System
1389   -- Administrator for assistance.
1390   -- Dimension: DIMENSION_VARCHAR_LABEL
1391   -- Attribute: ATTRIBUTE_VARCHAR_LABEL
1392 
1393     FEM_ENGINES_PKG.TECH_MESSAGE(
1394         p_severity => FND_LOG.level_error,
1395         p_module   => C_MODULE,
1396         p_app_name => 'FEM',
1397         p_msg_name => 'FEM_ENG_NO_DIM_ATTR_VER_ERR',
1398         p_token1 => 'DIMENSION_VARCHAR_LABEL',
1399         p_value1 => v_dim_name,
1400         p_token2 => 'ATTRIBUTE_VARCHAR_LABEL',
1401         p_value2 => 'ADJ_PERIOD_FLAG');
1402 
1403      FEM_ENGINES_PKG.Put_Message(
1404         p_app_name => 'FEM',
1405         p_msg_name => 'FEM_ENG_NO_DIM_ATTR_VER_ERR',
1406         p_token1 => 'DIMENSION_VARCHAR_LABEL',
1407         p_value1 => v_dim_name,
1408         p_token2 => 'ATTRIBUTE_VARCHAR_LABEL',
1409         p_value2 => 'ADJ_PERIOD_FLAG');
1410 
1411      RAISE e_error;
1412 
1413   END IF;
1414 
1415   IF p_per_num_offset = 0 THEN
1416 
1417   -- 0 offset returns the base period as the relative period
1418 
1419     FND_MSG_PUB.Count_and_Get(
1420       p_encoded => p_encoded,
1421       p_count => x_msg_count,
1422       p_data => x_msg_data);
1423 
1424     x_return_status := c_success;
1425 
1426     RETURN p_base_cal_period_id;
1427 
1428   END IF;
1429 
1430   -- Build the dynamic sql to return the relevant calendar periods
1431   -- needed for the relative offset calcs
1432 
1433   v_sql := 'SELECT CP.cal_period_id FROM fem_cal_periods_b CP';
1434 
1435   IF v_incl_adj_period = 'N' THEN
1436     v_sql := v_sql||',fem_cal_periods_attr CPA';
1437   END IF;
1438 
1439   v_sql := v_sql||' WHERE CP.calendar_id=:1'
1440     || ' AND CP.dimension_group_id=:2'
1441     || ' AND CP.cal_period_id';
1442   -- If offset is negative, then only look at earlier cal periods.
1443   -- Else, if offset is 0, then validate that the cal period
1444   --   being passed in actually exists.
1445   -- Else, only look at later cal periods.
1446   IF p_per_num_offset < 0 THEN
1447     v_sql := v_sql||'<';
1448   ELSIF p_per_num_offset = 0 THEN
1449     v_sql := v_sql||'=';
1450   ELSE
1451     v_sql := v_sql||'>';
1452   END IF;
1453   v_sql := v_sql||':3';
1454 
1455   IF v_incl_adj_period = 'N' THEN
1456     v_sql := v_sql||' AND CP.cal_period_id=CPA.cal_period_id'
1457       ||' AND CPA.attribute_id='||to_char(v_dim_attr_id)
1458       ||' AND CPA.version_id='||to_char(v_dim_attr_ver_id)
1459       ||' AND CPA.dim_attribute_varchar_member = ''N''';
1460   END IF;
1461 
1462   -- If offset is negative, then order by descending order.
1463   -- Else, order by ascending order.
1464   IF p_per_num_offset < 0 THEN
1465     v_sql := v_sql||' ORDER BY cal_period_id desc';
1466   ELSE
1467     v_sql := v_sql||' ORDER BY cal_period_id asc';
1468   END IF;
1469 
1470   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1471     FEM_ENGINES_PKG.TECH_MESSAGE(
1472         p_severity => FND_LOG.level_statement,
1473         p_module   => C_MODULE,
1474         p_msg_text => 'Dynamic sql is '||v_sql);
1475   END IF;
1476 
1477   -- Fetch all of the cal periods for the same
1478   -- Calendar and Dimension Group into an array.
1479   -- As the number of calendar periods fetched can be large
1480   -- the bulk collect fetch is set with a limit.
1481 
1482   -- If the offset parameter is 0, set the offset variable
1483   -- to 1 since the table index starts at 1.
1484   -- Otherwise, the offset variable needs to be set as
1485   -- a positive number so it can be used as the table index.
1486   IF p_per_num_offset = 0 THEN
1487     v_offset := 1;
1488   ELSE
1489     v_offset := abs(p_per_num_offset);
1490   END IF;
1491   -- Counter to keep track of number of fetches
1492   v_fetch_count := 1;
1493   -- Number of fetches needed to reach the offset number.
1494   v_fetches_needed := ceil(v_offset/C_LIMIT);
1495   -- Position of the cal period in the table, adjusted to compensate
1496   --  for the multiple fetches
1497   v_index := mod(v_offset,C_LIMIT);
1498 
1499   OPEN v_cal_period_cv FOR v_sql
1500     USING v_base_calendar_id, v_base_dimgrp_id, p_base_cal_period_id;
1501   LOOP
1502     FETCH v_cal_period_cv BULK COLLECT INTO v_cal_period_tbl LIMIT C_LIMIT;
1503     -- Exit loop if there are no more rows to fetch (cv%NOTFOUND), or
1504     -- if there is no need to fetch any further as the offset
1505     -- number has already been reached.
1506     EXIT WHEN v_cal_period_cv%NOTFOUND or v_fetch_count>=v_fetches_needed;
1507     v_fetch_count := v_fetch_count + 1;
1508   END LOOP;
1509   CLOSE v_cal_period_cv;
1510 
1511   IF v_index > v_cal_period_tbl.count OR v_fetch_count < v_fetches_needed THEN
1512 
1516   -- Log debug and user messages:
1513   -- If number of calendar periods found is less than the offset number,
1514   -- return -1 and set return status to error.
1515 
1517   -- Invalid Calendar Period Offset: CAL_PERIOD_OFFSET. The offset is greater
1518   -- than the number of existing Calendar Periods before or after the base period.
1519 
1520     SELECT attribute_name
1521     INTO v_cal_attr_name
1522     FROM fem_dim_attributes_vl
1523     WHERE attribute_id = v_cal_attr_id;
1524 
1525     FEM_ENGINES_PKG.TECH_MESSAGE(
1526       p_severity => FND_LOG.level_error,
1527       p_module   => C_MODULE,
1528       p_app_name => 'FEM',
1529       p_msg_name => 'FEM_INVALID_PERIOD_OFFSET',
1530       p_token1 => 'CAL_PERIOD_OFFSET',
1531       p_value1 => TO_CHAR(p_per_num_offset));
1532 
1533     FEM_ENGINES_PKG.Put_Message(
1534       p_app_name => 'FEM',
1535       p_msg_name => 'FEM_INVALID_PERIOD_OFFSET',
1536       p_token1 => 'CAL_PERIOD_OFFSET',
1537       p_value1 => TO_CHAR(p_per_num_offset));
1538 
1539     RAISE e_error;
1540 
1541   ELSE
1542     v_return_code := v_cal_period_tbl(v_index);
1543   END IF;
1544 
1545   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1546     FEM_ENGINES_PKG.TECH_MESSAGE(
1547         p_severity => FND_LOG.level_statement,
1548         p_module   => C_MODULE,
1549         p_msg_text => 'v_fetch_count = '||to_char(v_fetch_count));
1550     FEM_ENGINES_PKG.TECH_MESSAGE(
1551         p_severity => FND_LOG.level_statement,
1552         p_module   => C_MODULE,
1553         p_msg_text => 'v_fetches_needed = '||to_char(v_fetches_needed));
1554     FEM_ENGINES_PKG.TECH_MESSAGE(
1555         p_severity => FND_LOG.level_statement,
1556         p_module   => C_MODULE,
1557         p_msg_text => 'v_index = '||to_char(v_index));
1558     FEM_ENGINES_PKG.TECH_MESSAGE(
1559         p_severity => FND_LOG.level_statement,
1560         p_module   => C_MODULE,
1561         p_msg_text => 'v_cal_period_tbl.count = '||to_char(v_cal_period_tbl.count));
1562     FEM_ENGINES_PKG.TECH_MESSAGE(
1563         p_severity => FND_LOG.level_statement,
1564         p_module   => C_MODULE,
1565         p_msg_text => 'Returning value = '||to_char(v_return_code));
1566   END IF;
1567   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1568     FEM_ENGINES_PKG.TECH_MESSAGE(
1569       p_severity => FND_LOG.level_procedure,
1570       p_module   => C_MODULE,
1571       p_msg_text => 'End Procedure');
1572   END IF;
1573 
1574   FND_MSG_PUB.Count_and_Get(
1575     p_encoded => p_encoded,
1576     p_count => x_msg_count,
1577     p_data => x_msg_data);
1578 
1579   x_return_status := c_success;
1580 
1581   RETURN v_return_code;
1582 
1583 EXCEPTION
1584 
1585   WHEN e_error THEN
1586 
1587     FND_MSG_PUB.Count_and_Get(
1588       p_encoded => p_encoded,
1589       p_count => x_msg_count,
1590       p_data => x_msg_data);
1591 
1592     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1593       FEM_ENGINES_PKG.TECH_MESSAGE(
1594         p_severity => FND_LOG.level_procedure,
1595         p_module   => C_MODULE,
1596         p_msg_text => 'End Procedure');
1597     END IF;
1598 
1599     x_return_status := c_error;
1600 
1601     RETURN -1;
1602 
1603 END Relative_Cal_Period_ID;
1604 
1605 
1606 /*************************************************************************
1607 
1608                        Effective_Cal_Period_ID
1609 
1610 *************************************************************************/
1611 
1612 FUNCTION Effective_Cal_Period_ID (
1613    p_per_num_offset   IN NUMBER,
1614    p_rel_dim_grp_id   IN NUMBER,
1615    p_ledger_id        IN NUMBER,
1616    p_ref_cal_per_id   IN NUMBER,
1617    x_err_code         OUT NOCOPY  NUMBER,
1618    x_num_msg          OUT NOCOPY  NUMBER
1619 ) RETURN NUMBER
1620 IS
1621 BEGIN
1622 
1623 x_err_code := 2;
1624 x_num_msg := 0;
1625 RETURN -1;
1626 
1627 END Effective_Cal_Period_Id;
1628 
1629 
1630 /*************************************************************************
1631 
1632                          Get_Cal_Period_ID
1633 
1634 *************************************************************************
1635 This function is called by the OGL integration.  Note
1636 that the fiscal_year does not always match the calendar year, so this
1637 procedure could return a cal_period_id where the Year of the End Date
1638 belongs in a different year than the fiscal year.
1639 
1640 The above version finds the CAL_PERIOD_ID where:
1641     CALENDAR_ID (in fem_cal_periods_b) is the same as the Calendar
1642     of the CAL_PERIOD_HIER_OBJ_DEF_ID attribute of the p_ledger_id
1643 
1644     DIMENSION_GROUP_ID (in fem_cal_periods_b) matches the
1645     DIMENSION_GROUP_ID from fem_dimension_grps_b where
1646     the DIMENSION_GROUP_DISPLAY_CODE = p_dim grp_dc
1647 
1648     Value for the GL_PERIOD_NUM attribute (in fem_cal_periods_attr)
1649     matches the value from p_cal_per_num
1650 
1651     Value for the ACCOUNTING_YEAR attribute (in fem_Cal_periods_attr)
1652     matches value in p_fiscal_year.
1653 
1654  HISTORY
1658 *************************************************************************/
1655     04-AUG-06 rflippo Bug 5060702 Split single sql statement into individual
1656                       statements to avoid cartesian join
1657 
1659 
1660 FUNCTION Get_Cal_Period_ID
1661   (p_ledger_id       IN NUMBER,
1662    p_dim_grp_dc      IN VARCHAR2,
1663    p_cal_per_num     IN NUMBER,
1664    p_fiscal_year     IN NUMBER)
1665 RETURN NUMBER IS
1666    v_calp_dim_id        NUMBER;
1667    v_ledger_dim_id      NUMBER;
1668 
1669    v_cal_period_id      NUMBER;
1670    v_periodnum_attr_id  NUMBER;
1671    v_acctyear_attr_id   NUMBER;
1672    v_ledgerobj_attr_id  NUMBER;
1673 
1674    v_periodnum_vers_id  NUMBER;
1675    v_acctyear_vers_id   NUMBER;
1676    v_ledgerobj_vers_id  NUMBER;
1677 
1678    v_ledger_calphier_id NUMBER;
1679    v_ledger_calphier_obj_id NUMBER;
1680    v_calendar_id        NUMBER;
1681 BEGIN
1682 
1683 SELECT dimension_id
1684 INTO v_calp_dim_id
1685 FROM fem_dimensions_b
1686 WHERE dimension_varchar_label='CAL_PERIOD';
1687 
1688 SELECT dimension_id
1689 INTO v_ledger_dim_id
1690 FROM fem_dimensions_b
1691 WHERE dimension_varchar_label='LEDGER';
1692 
1693 
1694 SELECT attribute_id
1695 INTO v_ledgerobj_attr_id
1696 FROM fem_dim_attributes_b
1697 WHERE attribute_varchar_label='CAL_PERIOD_HIER_OBJ_DEF_ID'
1698 AND dimension_id = v_ledger_dim_id;
1699 
1700 SELECT version_id
1701 INTO v_ledgerobj_vers_id
1702 FROM fem_dim_attr_versions_b
1703 WHERE attribute_id = v_ledgerobj_attr_id
1704 AND default_version_flag='Y';
1705 
1706 SELECT dim_attribute_numeric_member
1707 INTO v_ledger_calphier_id
1708 FROM fem_ledgers_attr
1709 WHERE ledger_id = p_ledger_id
1710 AND attribute_id = v_ledgerobj_attr_id
1711 AND version_id = v_ledgerobj_vers_id;
1712 
1713 SELECT object_id
1714 INTO v_ledger_calphier_obj_id
1715 FROM fem_object_definition_b
1716 WHERE object_definition_id = v_ledger_calphier_id;
1717 
1718 SELECT calendar_id
1719 INTO v_calendar_id
1720 FROM fem_hierarchies
1721 WHERE hierarchy_obj_id = v_ledger_calphier_obj_id;
1722 
1723 SELECT attribute_id
1724 INTO v_periodnum_attr_id
1725 FROM fem_dim_attributes_b
1726 WHERE attribute_varchar_label='GL_PERIOD_NUM'
1727 AND dimension_id = v_calp_dim_id;
1728 
1729 SELECT attribute_id
1730 INTO v_acctyear_attr_id
1731 FROM fem_dim_attributes_b
1732 WHERE attribute_varchar_label='ACCOUNTING_YEAR'
1733 AND dimension_id = v_calp_dim_id;
1734 
1735 SELECT version_id
1736 INTO v_periodnum_vers_id
1737 FROM fem_dim_attr_versions_b
1738 WHERE attribute_id = v_periodnum_attr_id
1739 AND default_version_flag = 'Y';
1740 
1741 SELECT version_id
1742 INTO v_acctyear_vers_id
1743 FROM fem_dim_attr_versions_b
1744 WHERE attribute_id = v_acctyear_attr_id
1745 AND default_version_flag = 'Y';
1746 
1747 
1748 SELECT B.cal_period_id
1749 INTO   v_cal_period_id
1750 FROM   fem_cal_periods_b B,
1751        fem_cal_periods_attr N,
1752        fem_cal_periods_attr D,
1753        fem_dimension_grps_b G
1754 WHERE  N.attribute_id = v_periodnum_attr_id
1755 AND    N.version_id = v_periodnum_vers_id
1756 AND    N.cal_period_id = B.cal_period_id
1757 AND    N.number_assign_value = p_cal_per_num
1758 AND    D.attribute_id = v_acctyear_attr_id
1759 AND    D.version_id = v_acctyear_vers_id
1760 AND    D.cal_period_id = B.cal_period_id
1761 AND    D.number_assign_value = p_fiscal_year
1762 AND    B.calendar_id = v_calendar_id
1763 AND    G.dimension_group_id = B.dimension_group_id
1764 AND    G.dimension_group_display_code = p_dim_grp_dc;
1765 RETURN v_cal_period_id;
1766 
1767 EXCEPTION
1768    WHEN no_data_found THEN
1769       RETURN -1;
1770    WHEN too_many_rows THEN
1771       RETURN -1;
1772 
1773 END Get_Cal_Period_ID;
1774 
1775 /*************************************************************************
1776 This function is available for applications to call when they
1777 want to find the corresponding CAL_PERIOD_ID for a given end date.
1778 
1779 The above version finds the CAL_PERIOD_ID where:
1780     CALENDAR_ID (in fem_cal_periods_b) is the same as the Calendar
1781     of the CAL_PERIOD_HIER_OBJ_DEF_ID attribute of the p_ledger_id
1782 
1783     DIMENSION_GROUP_ID (in fem_cal_periods_b) matches the
1784     DIMENSION_GROUP_ID from fem_dimension_grps_b where
1785     the DIMENSION_GROUP_DISPLAY_CODE = p_dim grp_dc
1786 
1787     Value for the GL_PERIOD_NUM attribute (in fem_cal_periods_attr)
1788     matches the value from p_cal_per_num
1789 
1790     Value for the CAL_PERIOD_END_DATE attribute (in
1791     fem_Cal_periods_attr) matches value in p_cal_per_end_date.
1792 
1793     04-AUG-06 rflippo Bug 5060702 Split single sql statement into individual
1794                       statements to avoid cartesian join
1795 *************************************************************************/
1796 
1797 FUNCTION Get_Cal_Period_ID
1798   (p_ledger_id        IN NUMBER,
1799    p_dim_grp_dc       IN VARCHAR2,
1800    p_cal_per_num      IN NUMBER,
1801    p_cal_per_end_date IN DATE)
1802 RETURN NUMBER IS
1803    v_calp_dim_id        NUMBER;
1804    v_ledger_dim_id      NUMBER;
1805 
1806    v_cal_period_id      NUMBER;
1807    v_periodnum_attr_id  NUMBER;
1808    v_enddate_attr_id   NUMBER;
1809    v_ledgerobj_attr_id  NUMBER;
1810 
1814 
1811    v_periodnum_vers_id  NUMBER;
1812    v_enddate_vers_id   NUMBER;
1813    v_ledgerobj_vers_id  NUMBER;
1815    v_ledger_calphier_id NUMBER;
1816    v_ledger_calphier_obj_id NUMBER;
1817    v_calendar_id        NUMBER;
1818 
1819 
1820 BEGIN
1821 
1822 SELECT dimension_id
1823 INTO v_calp_dim_id
1824 FROM fem_dimensions_b
1825 WHERE dimension_varchar_label='CAL_PERIOD';
1826 
1827 SELECT dimension_id
1828 INTO v_ledger_dim_id
1829 FROM fem_dimensions_b
1830 WHERE dimension_varchar_label='LEDGER';
1831 
1832 
1833 SELECT attribute_id
1834 INTO v_ledgerobj_attr_id
1835 FROM fem_dim_attributes_b
1836 WHERE attribute_varchar_label='CAL_PERIOD_HIER_OBJ_DEF_ID'
1837 AND dimension_id = v_ledger_dim_id;
1838 
1839 SELECT version_id
1840 INTO v_ledgerobj_vers_id
1841 FROM fem_dim_attr_versions_b
1842 WHERE attribute_id = v_ledgerobj_attr_id
1843 AND default_version_flag='Y';
1844 
1845 SELECT dim_attribute_numeric_member
1846 INTO v_ledger_calphier_id
1847 FROM fem_ledgers_attr
1848 WHERE ledger_id = p_ledger_id
1849 AND attribute_id = v_ledgerobj_attr_id
1850 AND version_id = v_ledgerobj_vers_id;
1851 
1852 SELECT object_id
1853 INTO v_ledger_calphier_obj_id
1854 FROM fem_object_definition_b
1855 WHERE object_definition_id = v_ledger_calphier_id;
1856 
1857 SELECT calendar_id
1858 INTO v_calendar_id
1859 FROM fem_hierarchies
1860 WHERE hierarchy_obj_id = v_ledger_calphier_obj_id;
1861 
1862 SELECT attribute_id
1863 INTO v_periodnum_attr_id
1864 FROM fem_dim_attributes_b
1865 WHERE attribute_varchar_label='GL_PERIOD_NUM'
1866 AND dimension_id = v_calp_dim_id;
1867 
1868 SELECT attribute_id
1869 INTO v_enddate_attr_id
1870 FROM fem_dim_attributes_b
1871 WHERE attribute_varchar_label='CAL_PERIOD_END_DATE'
1872 AND dimension_id = v_calp_dim_id;
1873 
1874 SELECT version_id
1875 INTO v_periodnum_vers_id
1876 FROM fem_dim_attr_versions_b
1877 WHERE attribute_id = v_periodnum_attr_id
1878 AND default_version_flag = 'Y';
1879 
1880 SELECT version_id
1881 INTO v_enddate_vers_id
1882 FROM fem_dim_attr_versions_b
1883 WHERE attribute_id = v_enddate_attr_id
1884 AND default_version_flag = 'Y';
1885 
1886 
1887 SELECT B.cal_period_id
1888 INTO   v_cal_period_id
1889 FROM   fem_cal_periods_b B,
1890        fem_cal_periods_attr N,
1891        fem_cal_periods_attr D,
1892        fem_dimension_grps_b G
1893 WHERE  N.attribute_id = v_periodnum_attr_id
1894 AND    N.version_id = v_periodnum_vers_id
1895 AND    N.cal_period_id = B.cal_period_id
1896 AND    N.number_assign_value = p_cal_per_num
1897 AND    D.attribute_id = v_enddate_attr_id
1898 AND    D.version_id = v_enddate_vers_id
1899 AND    D.cal_period_id = B.cal_period_id
1903 AND    G.dimension_group_display_code = p_dim_grp_dc;
1900 AND    D.date_assign_value = p_cal_per_end_date
1901 AND    B.calendar_id = v_calendar_id
1902 AND    G.dimension_group_id = B.dimension_group_id
1904 
1905 RETURN v_cal_period_id;
1906 
1907 EXCEPTION
1908    WHEN no_data_found THEN
1909       RETURN -1;
1910    WHEN too_many_rows THEN
1911       RETURN -1;
1912 
1913 END Get_Cal_Period_ID;
1914 
1915 /*************************************************************************
1916 
1917                          Register_Data_Location
1918 
1919 *************************************************************************/
1920 
1921 PROCEDURE Register_Data_Location (
1922    p_request_id  NUMBER,
1923    p_object_id  NUMBER,
1924    p_table_name VARCHAR2,
1925    p_ledger_id  NUMBER,
1926    p_cal_per_id NUMBER,
1927    p_dataset_cd NUMBER,
1928    p_source_cd NUMBER,
1929    p_load_status VARCHAR2 DEFAULT NULL,
1930    p_avg_bal_flag    IN VARCHAR2 DEFAULT NULL,
1931    p_trans_curr      IN VARCHAR2 DEFAULT NULL
1932 ) IS
1933    v_ledger_col   VARCHAR2(30);
1934    v_cal_per_col  VARCHAR2(30);
1935    v_dataset_col  VARCHAR2(30);
1936    v_source_col   VARCHAR2(30);
1937    v_bal_type_col VARCHAR2(30);
1938    v_bal_type_cd  VARCHAR2(50);
1939    v_number       NUMBER;
1940    v_sql_cmd      VARCHAR2(32767);
1941    v_avg_balances NUMBER;
1942 BEGIN
1943   -- Verify prcedure parameters are valid
1944   IF p_load_status IS NOT NULL AND
1945      p_load_status NOT IN ('COMPLETE','INCOMPLETE') THEN
1946     RAISE e_bad_param_value;
1947   END IF;
1948 
1949   IF p_avg_bal_flag IS NOT NULL AND
1950      p_avg_bal_flag NOT IN ('Y','N') THEN
1951     RAISE e_bad_param_value;
1952   END IF;
1953 
1954 -- Comments by gcheng:
1955 -- From looking at the legacy code, this is what I think it is doing.
1956 --
1957 -- If load status is not given (i.e. not being called from the loader),
1958 -- make sure the dimension values actually exist on the table.
1959 -- Only register data locations if dimension values are found.
1960 --
1961 -- Not sure why the check is not necessary wen called by the loaders.
1962 -- Also, not sure why the dynamic sql selects from a hard-coded
1963 -- column name for ledger ID, and not use v_ledger_col.
1964 -- This is probably a mute issue because all existing tables
1965 -- store ledger ID in columns named ledger_id.
1966 IF (p_load_status IS NULL)
1967 THEN
1968    SELECT column_name
1969    INTO   v_ledger_col
1970    FROM   fem_tab_columns_b
1971    WHERE  table_name = p_table_name
1972    AND    dimension_id =
1973              (SELECT dimension_id
1974               FROM fem_dimensions_b
1975               WHERE dimension_varchar_label = 'LEDGER');
1976 
1977    SELECT column_name
1978    INTO   v_cal_per_col
1979    FROM   fem_tab_columns_b
1980    WHERE  table_name = p_table_name
1981    AND    dimension_id =
1982              (SELECT dimension_id
1983               FROM fem_dimensions_b
1984               WHERE dimension_varchar_label = 'CAL_PERIOD');
1985 
1986    SELECT column_name
1987    INTO   v_dataset_col
1988    FROM   fem_tab_columns_b
1989    WHERE  table_name = p_table_name
1990    AND    dimension_id =
1991              (SELECT dimension_id
1992               FROM fem_dimensions_b
1993               WHERE dimension_varchar_label = 'DATASET');
1994 
1995    SELECT column_name
1996    INTO   v_source_col
1997    FROM   fem_tab_columns_b
1998    WHERE  table_name = p_table_name
1999    AND    dimension_id =
2000              (SELECT dimension_id
2001               FROM fem_dimensions_b
2002               WHERE dimension_varchar_label = 'SOURCE_SYSTEM');
2003 
2004    v_sql_cmd :=
2005    'SELECT MIN(ledger_id)'||
2006    ' FROM '||p_table_name||
2007    ' WHERE '||v_ledger_col||' = :b_ledger_id'||
2008    ' AND '||v_cal_per_col||' = :b_cal_per_id'||
2009    ' AND '||v_dataset_col||' = :b_dataset_cd'||
2010    ' AND '||v_source_col||' = :b_source_cd';
2011 
2012    EXECUTE IMMEDIATE v_sql_cmd
2013    INTO v_number
2014    USING p_ledger_id,
2015          p_cal_per_id,
2016          p_dataset_cd,
2017          p_source_cd;
2018 ELSE
2019    v_number := 0;
2020 END IF;
2021 
2022 IF (v_number IS NOT NULL)
2023 THEN
2024    -- Grab the dataset balance type code
2025    SELECT attribute_value_column_name
2026    INTO v_bal_type_col
2027    FROM fem_dim_attributes_b
2028    WHERE dimension_id =
2029      (SELECT dimension_id
2030       FROM fem_dimensions_b
2031       WHERE dimension_varchar_label = 'DATASET')
2032    AND attribute_varchar_label = 'DATASET_BALANCE_TYPE_CODE';
2033 
2034    v_sql_cmd :=
2035    'SELECT '||v_bal_type_col||
2036    ' FROM fem_datasets_attr A,fem_dim_attr_versions_b V'||
2037    ' WHERE dataset_code = :b_dataset_cd'||
2038    ' AND A.attribute_id = '||
2039    '   (SELECT attribute_id'||
2040    '    FROM fem_dim_attributes_b'||
2041    '    WHERE dimension_id ='||
2042    '      (SELECT dimension_id'||
2043    '       FROM fem_dimensions_b'||
2044    '       WHERE dimension_varchar_label = ''DATASET'')'||
2045    '    AND attribute_varchar_label = ''DATASET_BALANCE_TYPE_CODE'')'||
2049 
2046    ' AND A.attribute_id = V.attribute_id'||
2047    ' AND A.version_id = V.version_id'||
2048    ' AND V.default_version_flag = ''Y''';
2050    EXECUTE IMMEDIATE v_sql_cmd
2051    INTO v_bal_type_cd
2052    USING p_dataset_cd;
2053 
2054    -- Determin avg_balances value.
2055    -- avg_balances should be 1 if avg_bal_flag is 'Y',
2056    --   0 if avg_bal_flag is 'N', and null otherwise.
2057    IF p_avg_bal_flag = 'Y' THEN
2058      v_avg_balances := 1;
2059    ELSIF p_avg_bal_flag = 'N' THEN
2060      v_avg_balances := 0;
2061    ELSE
2062      v_avg_balances := NULL;
2063    END IF;
2064 
2065    -- Insert into fem_dl_dimensions.
2066    -- If duplicate, update load status and avg_balances
2067    BEGIN
2068       INSERT INTO fem_dl_dimensions
2069         (request_id,
2070          object_id,
2071          ledger_id,
2072          cal_period_id,
2073          dataset_code,
2074          source_system_code,
2075          balance_type_code,
2076          table_name,
2077          avg_balances,
2078          creation_date,
2079          created_by,
2080          last_updated_by,
2081          last_update_date,
2082          last_update_login,
2083          load_status,
2084          reprocess_errors_flag,
2085          object_version_number)
2086       VALUES
2087          (p_request_id,
2088           p_object_id,
2089           p_ledger_id,
2090           p_cal_per_id,
2091           p_dataset_cd,
2092           p_source_cd,
2093           v_bal_type_cd,
2094           p_table_name,
2095           v_avg_balances,
2096           sysdate,
2097           c_user_id,
2098           c_user_id,
2099           sysdate,
2100           null,
2101           p_load_status,
2102           'N',
2103           1);
2104    EXCEPTION
2105       WHEN dup_val_on_index THEN
2106          UPDATE fem_dl_dimensions
2107          SET load_status = p_load_status,
2108              avg_balances = v_avg_balances,
2109              last_updated_by = c_user_id,
2110              last_update_date = sysdate
2111          WHERE request_id = p_request_id
2112          AND object_id = p_object_id
2113          AND ledger_id = p_ledger_id
2114          AND cal_period_id = p_cal_per_id
2115          AND dataset_code = p_dataset_cd
2116          AND source_system_code = p_source_cd
2117          AND table_name = p_table_name;
2118    END;
2119 
2120    -- If p_trans_curr is not null, insert into fem_dl_trans_curr
2121    -- Do nothing if inserting duplicate row.
2122    IF p_trans_curr IS NOT NULL THEN
2123      BEGIN
2124        INSERT INTO fem_dl_trans_curr
2125         (request_id,
2126          object_id,
2127          ledger_id,
2128          cal_period_id,
2129          dataset_code,
2130          source_system_code,
2131          table_name,
2132          translated_currency,
2133          creation_date,
2134          created_by,
2135          last_updated_by,
2136          last_update_date,
2137          last_update_login,
2138          object_version_number)
2139        VALUES
2140          (p_request_id,
2141           p_object_id,
2142           p_ledger_id,
2143           p_cal_per_id,
2144           p_dataset_cd,
2145           p_source_cd,
2146           p_table_name,
2147           p_trans_curr,
2148           sysdate,
2149           c_user_id,
2150           c_user_id,
2151           sysdate,
2152           null,
2153           1);
2154      EXCEPTION WHEN dup_val_on_index THEN null;
2155      END;
2156    END IF;
2157 END IF;
2158 
2159 END Register_Data_Location;
2160 
2161 
2162 /*************************************************************************
2163 
2164                          UnRegister_Data_Location
2165 
2166 *************************************************************************/
2170    p_object_id      IN NUMBER,
2167 
2168 PROCEDURE UnRegister_Data_Location (
2169    p_request_id     IN NUMBER,
2171    p_table_name     IN VARCHAR2 DEFAULT NULL
2172 ) IS
2173 -- =========================================================================
2174 -- Purpose
2175 --    Given an object execution, check if it has been chained to other
2176 --    object executions.  If yes, this procedure also returns one
2177 --    of the object executions chained to the given object execution.
2178 -- History
2179 --    01-30-06  G Cheng    Bug 4596447. Created.
2180 -- Arguments
2181 --    p_request_id         Object execution Concurrent Request ID
2182 --    p_object_id          Object execution Object ID
2183 --    p_table_name         Table name (Optional)
2184 -- Logic
2185 --    If the optional p_table_name parameter is provided, delete
2186 --    data locations information for just one table.  Otherwise,
2187 --    remove data locations information for all tables associated with
2188 --    the object execution.
2189 -- =========================================================================
2190 BEGIN
2191 
2192   -- If p_table_name is not passed, then unregister the whole object execution.
2193   -- Otherwise, just unregister the data locations for the table.
2194   IF p_table_name IS NULL THEN
2195     DELETE FROM fem_dl_dimensions
2196     WHERE request_id = p_request_id
2197     AND object_id = p_object_id;
2198 
2199     DELETE FROM fem_dl_trans_curr
2200     WHERE request_id = p_request_id
2201     AND object_id = p_object_id;
2202   ELSE
2203     DELETE FROM fem_dl_dimensions
2204     WHERE request_id = p_request_id
2205     AND object_id = p_object_id
2206     AND table_name = p_table_name;
2207 
2208     DELETE FROM fem_dl_trans_curr
2209     WHERE request_id = p_request_id
2210     AND object_id = p_object_id
2211     AND table_name = p_table_name;
2212   END IF;
2213 END UnRegister_Data_Location;
2214 
2215 /*************************************************************************
2216 
2217                          Generate_Member_ID
2218 
2219 *************************************************************************/
2220 
2221 FUNCTION Generate_Member_ID (
2222    p_dim_id    IN NUMBER
2223 ) RETURN NUMBER
2224 AS
2225    v_dim_label VARCHAR2(80);
2226    v_source_cd VARCHAR2(30);
2227    v_mem_id NUMBER;
2228 BEGIN
2229 
2230 BEGIN
2231    SELECT dimension_varchar_label
2232    INTO v_dim_label
2233    FROM fem_dimensions_b
2234    WHERE dimension_id = p_dim_id;
2235 EXCEPTION
2236    WHEN no_data_found THEN
2237       RETURN null;
2238 END;
2239 
2240 BEGIN
2241    SELECT member_id_source_code
2242    INTO   v_source_cd
2243    FROM   fem_xdim_dimensions
2244    WHERE  dimension_id = p_dim_id
2245    AND    member_id_method_code = 'FUNCTION';
2246 EXCEPTION
2247    WHEN no_data_found THEN
2248       RETURN null;
2249 END;
2250 
2251 CASE v_source_cd
2252    WHEN 'DATASET' THEN
2253       SELECT fem_datasets_b_s.NEXTVAL
2254       INTO v_mem_id FROM dual;
2255    WHEN 'SOURCE_SYSTEM' THEN
2256       SELECT fem_source_systems_b_s.NEXTVAL
2257       INTO v_mem_id FROM dual;
2258    WHEN 'CALENDAR' THEN
2259       SELECT fem_calendars_b_s.NEXTVAL
2260       INTO v_mem_id FROM dual;
2261    WHEN 'FLEX' THEN
2262       SELECT fnd_flex_values_s.NEXTVAL
2263       INTO v_mem_id FROM dual;
2264    WHEN 'LEDGER' THEN
2265       SELECT gl_sets_of_books_s.NEXTVAL
2266       INTO v_mem_id FROM dual;
2267    WHEN 'ORG' THEN
2268       SELECT fem_cctr_orgs_b_s.NEXTVAL
2269       INTO v_mem_id FROM dual;
2270    WHEN 'BUDGET' THEN
2271       SELECT gl_budget_versions_s.NEXTVAL
2272       INTO v_mem_id FROM dual;
2273    WHEN 'ENCUMBRANCE' THEN
2274       SELECT gl_encumbrance_types_s.NEXTVAL
2275       INTO v_mem_id FROM dual;
2276    ELSE
2277       RETURN null;
2278 END CASE;
2279 
2280 RETURN v_mem_id;
2281 
2282 END Generate_Member_ID;
2283 
2284 ------------------------------------------------------------------------
2285 
2286 FUNCTION Generate_Member_ID (
2287    p_dim_id    IN NUMBER,
2288    x_err_code OUT NOCOPY NUMBER,
2289    x_num_msg  OUT NOCOPY NUMBER
2290 ) RETURN NUMBER
2291 AS
2292    v_dim_name VARCHAR2(80);
2293    v_source_cd VARCHAR2(30);
2294    v_mem_id NUMBER;
2295 
2296    no_source_code   EXCEPTION;
2297 BEGIN
2298 
2299 x_err_code := 0;
2300 x_num_msg := 0;
2301 
2302 IF (p_dim_id IS NOT NULL)
2303 THEN
2304    BEGIN
2305       SELECT dimension_name
2306       INTO v_dim_name
2307       FROM fem_dimensions_tl
2308       WHERE dimension_id = p_dim_id
2309       AND   language = userenv('LANG');
2310    EXCEPTION
2311       WHEN no_data_found THEN
2312          RAISE e_bad_dim_id;
2313    END;
2314 ELSE
2315    RAISE e_null_param_value;
2316 END IF;
2317 
2318 BEGIN
2319    SELECT member_id_source_code
2320    INTO   v_source_cd
2321    FROM   fem_xdim_dimensions
2322    WHERE  dimension_id = p_dim_id
2323    AND    member_id_method_code = 'FUNCTION';
2324 EXCEPTION
2325    WHEN no_data_found THEN
2326       x_err_code := 2;
2330 
2327       x_num_msg := x_num_msg + 1;
2328       RAISE no_source_code;
2329 END;
2331 CASE v_source_cd
2332    WHEN 'DATASET' THEN
2333       SELECT fem_datasets_b_s.NEXTVAL
2334       INTO v_mem_id FROM dual;
2335    WHEN 'SOURCE_SYSTEM' THEN
2336       SELECT fem_source_systems_b_s.NEXTVAL
2337       INTO v_mem_id FROM dual;
2338    WHEN 'CALENDAR' THEN
2339       SELECT fem_calendars_b_s.NEXTVAL
2340       INTO v_mem_id FROM dual;
2341    WHEN 'FLEX' THEN
2342       SELECT fnd_flex_values_s.NEXTVAL
2343       INTO v_mem_id FROM dual;
2344    WHEN 'LEDGER' THEN
2345       SELECT gl_sets_of_books_s.NEXTVAL
2346       INTO v_mem_id FROM dual;
2347    WHEN 'ORG' THEN
2348       SELECT fem_cctr_orgs_b_s.NEXTVAL
2349       INTO v_mem_id FROM dual;
2350    WHEN 'BUDGET' THEN
2351       SELECT gl_budget_versions_s.NEXTVAL
2352       INTO v_mem_id FROM dual;
2353    WHEN 'ENCUMBRANCE' THEN
2354       SELECT gl_encumbrance_types_s.NEXTVAL
2355       INTO v_mem_id FROM dual;
2356    ELSE
2357       x_err_code := 2;
2358       x_num_msg := x_num_msg + 1;
2359       RAISE no_source_code;
2360 END CASE;
2361 
2362 RETURN v_mem_id;
2363 
2364 EXCEPTION
2365    WHEN no_source_code THEN
2366       FEM_ENGINES_PKG.Put_Message(
2367          p_app_name => 'FEM',
2368          p_msg_name => 'FEM_NO_SOURCE_CODE_ERR',
2369          p_token1 => 'DIMENSION',
2370          p_value1 => v_dim_name);
2371       RETURN -1;
2372 
2373    WHEN e_bad_dim_id THEN
2374       FEM_ENGINES_PKG.PUT_MESSAGE(
2375          p_app_name => 'FEM',
2376          p_msg_name => 'FEM_BAD_DIM_ID_ERR',
2377          p_token1 => 'DIM_ID',
2378          p_value1 => p_dim_id);
2379       RETURN -1;
2380 
2381    WHEN e_null_param_value THEN
2382       FEM_ENGINES_PKG.PUT_MESSAGE(
2383          p_app_name => 'FEM',
2384          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
2385          p_token1 => 'PARAM',
2386          p_value1 => 'FEM_DIMENSION_TXT',
2387          p_trans1 => 'Y');
2388       RETURN -1;
2389 
2390 END Generate_Member_ID;
2391 
2392 ------------------------------------------------------------------------
2393 
2394 FUNCTION Generate_Member_ID (
2395    p_api_version     IN NUMBER     DEFAULT c_api_version,
2396    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
2397    p_commit          IN VARCHAR2   DEFAULT c_false,
2398    p_encoded         IN VARCHAR2   DEFAULT c_true,
2399    x_return_status  OUT NOCOPY VARCHAR2,
2400    x_msg_count      OUT NOCOPY NUMBER,
2401    x_msg_data       OUT NOCOPY VARCHAR2,
2402    p_dim_id          IN NUMBER
2403 ) RETURN NUMBER
2404 AS
2405    v_dim_name VARCHAR2(80);
2406    v_source_cd VARCHAR2(30);
2407    v_mem_id NUMBER;
2408 
2409    no_source_code   EXCEPTION;
2410 BEGIN
2411 
2412 x_return_status := c_success;
2413 
2414 Validate_OA_Params (
2415    p_api_version => p_api_version,
2416    p_init_msg_list => p_init_msg_list,
2417    p_commit => p_commit,
2418    p_encoded => p_encoded,
2419    x_return_status => x_return_status);
2420 
2421 IF (x_return_status <> c_success)
2422 THEN
2423    FND_MSG_PUB.Count_and_Get(
2424       p_encoded => c_false,
2425       p_count => x_msg_count,
2426       p_data => x_msg_data);
2427    RETURN -1;
2428 END IF;
2429 
2430 IF (p_dim_id IS NOT NULL)
2431 THEN
2432    BEGIN
2433       SELECT dimension_name
2434       INTO v_dim_name
2435       FROM fem_dimensions_tl
2436       WHERE dimension_id = p_dim_id
2437       AND   language = userenv('LANG');
2438    EXCEPTION
2439       WHEN no_data_found THEN
2440          RAISE e_bad_dim_id;
2441    END;
2442 ELSE
2443    RAISE e_null_param_value;
2444 END IF;
2445 
2446 BEGIN
2447    SELECT member_id_source_code
2448    INTO   v_source_cd
2449    FROM   fem_xdim_dimensions
2450    WHERE  dimension_id = p_dim_id
2451    AND    member_id_method_code = 'FUNCTION';
2452 EXCEPTION
2453    WHEN no_data_found THEN
2454       RAISE no_source_code;
2455 END;
2456 
2457 CASE v_source_cd
2458    WHEN 'DATASET' THEN
2459       SELECT fem_datasets_b_s.NEXTVAL
2460       INTO v_mem_id FROM dual;
2461    WHEN 'SOURCE_SYSTEM' THEN
2462       SELECT fem_source_systems_b_s.NEXTVAL
2463       INTO v_mem_id FROM dual;
2464    WHEN 'CALENDAR' THEN
2465       SELECT fem_calendars_b_s.NEXTVAL
2466       INTO v_mem_id FROM dual;
2470    WHEN 'LEDGER' THEN
2467    WHEN 'FLEX' THEN
2468       SELECT fnd_flex_values_s.NEXTVAL
2469       INTO v_mem_id FROM dual;
2471       SELECT gl_sets_of_books_s.NEXTVAL
2472       INTO v_mem_id FROM dual;
2473    WHEN 'ORG' THEN
2474       SELECT fem_cctr_orgs_b_s.NEXTVAL
2475       INTO v_mem_id FROM dual;
2476    WHEN 'BUDGET' THEN
2477       SELECT gl_budget_versions_s.NEXTVAL
2478       INTO v_mem_id FROM dual;
2479    WHEN 'ENCUMBRANCE' THEN
2480       SELECT gl_encumbrance_types_s.NEXTVAL
2481       INTO v_mem_id FROM dual;
2482    ELSE
2483       RAISE no_source_code;
2484 END CASE;
2485 
2486 RETURN v_mem_id;
2487 
2488 EXCEPTION
2489    WHEN no_source_code THEN
2490       FEM_ENGINES_PKG.Put_Message(
2491          p_app_name => 'FEM',
2492          p_msg_name => 'FEM_NO_SOURCE_CODE_ERR',
2493          p_token1 => 'DIMENSION',
2494          p_value1 => v_dim_name);
2495       FND_MSG_PUB.Count_and_Get(
2496          p_encoded => p_encoded,
2497          p_count => x_msg_count,
2498          p_data => x_msg_data);
2499       x_return_status := c_error;
2500       RETURN -1;
2501 
2502    WHEN e_bad_dim_id THEN
2503       FEM_ENGINES_PKG.PUT_MESSAGE(
2504          p_app_name => 'FEM',
2505          p_msg_name => 'FEM_BAD_DIM_ID_ERR',
2506          p_token1 => 'DIM_ID',
2507          p_value1 => p_dim_id);
2508       FND_MSG_PUB.Count_and_Get(
2509          p_encoded => p_encoded,
2510          p_count => x_msg_count,
2511          p_data => x_msg_data);
2512       x_return_status := c_error;
2513       RETURN -1;
2514 
2515    WHEN e_null_param_value THEN
2516       FEM_ENGINES_PKG.PUT_MESSAGE(
2517          p_app_name => 'FEM',
2518          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
2519          p_token1 => 'PARAM',
2520          p_value1 => 'FEM_DIMENSION_TXT',
2521          p_trans1 => 'Y');
2522       FND_MSG_PUB.Count_and_Get(
2523          p_encoded => p_encoded,
2524          p_count => x_msg_count,
2525          p_data => x_msg_data);
2526       x_return_status := c_error;
2527       RETURN -1;
2528 
2529 END Generate_Member_ID;
2530 
2531 --------------------------------------------------------------------------
2532 
2533 FUNCTION Generate_Member_ID (
2534    p_end_date        IN   DATE,
2535    p_period_num      IN   NUMBER,
2536    p_calendar_id     IN   NUMBER,
2537    p_dim_grp_id      IN   NUMBER
2538 ) RETURN NUMBER
2539 IS
2540    v_cal_per_id     NUMBER;
2541    v_num_of_periods NUMBER;
2542    v_julian_date    VARCHAR2(7);
2543    v_period_chr     VARCHAR2(15);
2544    v_calendar_chr   VARCHAR2(5);
2545    v_dim_grp_key    VARCHAR2(5);
2546 BEGIN
2547 
2548 SELECT TO_CHAR(p_end_date,'J')
2549 INTO v_julian_date
2550 FROM dual;
2551 
2552 BEGIN
2553    SELECT T.number_assign_value
2554    INTO v_num_of_periods
2555    FROM fem_time_grp_types_attr T,
2556         fem_dimension_grps_b G,
2557         fem_dim_attributes_b A,
2558         fem_dim_attr_versions_b V
2559    WHERE G.dimension_group_id = p_dim_grp_id
2560    AND A.attribute_varchar_label = 'PERIODS_IN_YEAR'
2561    AND A.attribute_id = T.attribute_id
2562    AND G.time_group_type_code = T.time_group_type_code
2563    AND V.attribute_id = T.attribute_id
2564    AND V.version_id = T.version_id
2565    AND V.default_version_flag = 'Y';
2566 EXCEPTIOn
2567    WHEN no_data_found THEN
2568       RETURN null;
2569    WHEN too_many_rows THEN
2570       RETURN null;
2571 END;
2572 
2573 -- IF (p_period_num > v_num_of_periods)
2574 -- THEN
2575 --    RETURN null;
2576 -- END IF;
2577 
2578 SELECT LPAD(TO_CHAR(p_period_num),15,'0')
2579 INTO v_period_chr
2580 FROM dual;
2581 
2582 BEGIN
2583    SELECT LPAD(TO_CHAR(calendar_id),5,'0')
2584    INTO v_calendar_chr
2585    FROM fem_calendars_b
2586    WHERE calendar_id = p_calendar_id;
2587 EXCEPTION
2588    WHEN no_data_found THEN
2589       RETURN null;
2590 END;
2591 
2592 SELECT LPAD(TO_CHAR(time_dimension_group_key),5,'0')
2593 INTO v_dim_grp_key
2594 FROM fem_dimension_grps_b
2595 WHERE dimension_group_id = p_dim_grp_id;
2596 
2597 SELECT TO_NUMBER(v_julian_date||v_period_chr||v_calendar_chr||v_dim_grp_key)
2598 INTO v_cal_per_id
2599 FROM dual;
2600 
2601 RETURN v_cal_per_id;
2602 
2603 END Generate_Member_ID;
2604 
2605 --------------------------------------------------------------------------
2606 
2607 FUNCTION Generate_Member_ID (
2608    p_end_date        IN   DATE,
2609    p_period_num      IN   NUMBER,
2610    p_calendar_dc     IN   VARCHAR2,
2611    p_dim_grp_dc      IN   VARCHAR2
2612 ) RETURN NUMBER
2613 IS
2614    v_cal_per_id     NUMBER;
2615    v_num_of_periods NUMBER;
2616    v_julian_date    VARCHAR2(7);
2617    v_period_chr     VARCHAR2(15);
2618    v_calendar_chr   VARCHAR2(5);
2619    v_dim_grp_key    VARCHAR2(5);
2620 BEGIN
2621 
2622 SELECT TO_CHAR(p_end_date,'J')
2623 INTO v_julian_date
2624 FROM dual;
2625 
2626 BEGIN
2627    SELECT T.number_assign_value
2628    INTO v_num_of_periods
2629    FROM fem_time_grp_types_attr T,
2633    WHERE G.dimension_group_display_code = p_dim_grp_dc
2630         fem_dimension_grps_b G,
2631         fem_dim_attributes_b A,
2632         fem_dim_attr_versions_b V
2634    AND A.attribute_varchar_label = 'PERIODS_IN_YEAR'
2635    AND A.attribute_id = T.attribute_id
2636    AND G.time_group_type_code = T.time_group_type_code
2637    AND V.attribute_id = T.attribute_id
2638    AND V.version_id = T.version_id
2639    AND V.default_version_flag = 'Y';
2640 EXCEPTION
2641    WHEN no_data_found THEN
2642       RETURN null;
2643    WHEN too_many_rows THEN
2644       RETURN null;
2645 END;
2646 
2647 -- IF (p_period_num > v_num_of_periods)
2648 -- THEN
2649 --    RETURN null;
2650 -- END IF;
2651 
2652 SELECT LPAD(TO_CHAR(p_period_num),15,'0')
2653 INTO v_period_chr
2654 FROM dual;
2655 
2656 BEGIN
2657    SELECT LPAD(TO_CHAR(calendar_id),5,'0')
2658    INTO v_calendar_chr
2659    FROM fem_calendars_b
2660    WHERE calendar_display_code = p_calendar_dc;
2661 EXCEPTION
2662    WHEN no_data_found THEN
2663       RETURN null;
2664 END;
2665 
2666 SELECT LPAD(TO_CHAR(time_dimension_group_key),5,'0')
2667 INTO v_dim_grp_key
2668 FROM fem_dimension_grps_b
2669 WHERE dimension_group_display_code = p_dim_grp_dc;
2670 
2671 SELECT TO_NUMBER(v_julian_date||v_period_chr||v_calendar_chr||v_dim_grp_key)
2672 INTO v_cal_per_id
2673 FROM dual;
2674 
2675 RETURN v_cal_per_id;
2676 
2677 END Generate_Member_ID;
2678 
2679 --------------------------------------------------------------------------
2680 FUNCTION Generate_Member_ID (
2681    p_api_version     IN NUMBER     DEFAULT c_api_version,
2682    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
2683    p_commit          IN VARCHAR2   DEFAULT c_false,
2684    p_encoded         IN VARCHAR2   DEFAULT c_true,
2685    x_return_status  OUT NOCOPY VARCHAR2,
2686    x_msg_count      OUT NOCOPY NUMBER,
2687    x_msg_data       OUT NOCOPY VARCHAR2,
2688    p_end_date        IN DATE,
2689    p_period_num      IN NUMBER,
2690    p_calendar_dc     IN VARCHAR2,
2691    p_dim_grp_dc      IN VARCHAR2
2692 ) RETURN NUMBER IS
2693 
2694    v_cal_per_id     NUMBER;
2695 
2696 BEGIN
2697 
2698 x_return_status := c_success;
2699 
2700 Validate_OA_Params (
2701    p_api_version => p_api_version,
2702    p_init_msg_list => p_init_msg_list,
2703    p_commit => p_commit,
2704    p_encoded => p_encoded,
2705    x_return_status => x_return_status);
2706 
2707 IF (x_return_status <> c_success)
2708 THEN
2709    FND_MSG_PUB.Count_and_Get(
2710       p_encoded => c_false,
2711       p_count => x_msg_count,
2712       p_data => x_msg_data);
2713    RETURN -1;
2714 END IF;
2715 
2716 v_cal_per_id := Generate_Member_ID (p_end_date => p_end_date
2717                                    ,p_period_num => p_period_num
2718                                    ,p_calendar_dc => p_calendar_dc
2719                                    ,p_dim_grp_dc => p_dim_grp_dc);
2720 
2721 
2722 RETURN v_cal_per_id;
2723 
2724 END Generate_Member_ID;
2725 
2726 
2727 ------------------------------------------------------------------------
2728 
2729 FUNCTION Generate_Member_ID (
2730    p_end_date        IN DATE,
2731    p_period_num      IN NUMBER,
2732    p_calendar_id     IN NUMBER,
2733    p_dim_grp_id      IN NUMBER,
2734    x_err_code       OUT NOCOPY   NUMBER,
2735    x_num_msg        OUT NOCOPY   NUMBER
2736 ) RETURN NUMBER
2737 IS
2738    v_cal_per_id     NUMBER;
2739    v_num_of_periods NUMBER;
2740    v_attr_value     VARCHAR2(150);
2741    v_julian_date    VARCHAR2(7);
2742    v_period_chr     VARCHAR2(15);
2743    v_calendar_chr   VARCHAR2(5);
2744    v_dim_grp_key    VARCHAR2(5);
2745 BEGIN
2746 
2747 x_err_code := 0;
2748 x_num_msg := 0;
2749 
2750 SELECT TO_CHAR(p_end_date,'J')
2751 INTO v_julian_date
2752 FROM dual;
2753 
2754 BEGIN
2755    SELECT T.number_assign_value
2756    INTO v_num_of_periods
2757    FROM fem_time_grp_types_attr T,
2758         fem_dimension_grps_b G,
2759         fem_dim_attributes_b A,
2760         fem_dim_attr_versions_b V
2761    WHERE G.dimension_group_id = p_dim_grp_id
2762    AND A.attribute_varchar_label = 'PERIODS_IN_YEAR'
2763    AND A.attribute_id = T.attribute_id
2764    AND G.time_group_type_code = T.time_group_type_code
2765    AND V.attribute_id = T.attribute_id
2766    AND V.version_id = T.version_id
2767    AND V.default_version_flag = 'Y';
2768 EXCEPTION
2769    WHEN no_data_found THEN
2770       v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2771                           p_dim_label => 'TIME_GROUP_TYPE',
2772                           p_attr_label => 'PERIODS_IN_YEAR');
2773       RAISE e_no_value_found;
2774    WHEN too_many_rows THEN
2775       v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2776                           p_dim_label => 'TIME_GROUP_TYPE',
2777                           p_attr_label => 'PERIODS_IN_YEAR');
2778       RAISE e_many_values_found;
2779 END;
2780 
2781 -- IF (p_period_num > v_num_of_periods)
2782 -- THEN
2783 --    v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2787 --    RAISE e_bad_param_value;
2784 --                        p_dim_label => 'CAL_PERIOD',
2785 --                        p_attr_label => 'GL_PERIOD_NUM');
2786 --    v_attr_value := TO_CHAR(p_period_num);
2788 -- END IF;
2789 
2790 SELECT LPAD(TO_CHAR(p_period_num),15,'0')
2791 INTO v_period_chr
2792 FROM dual;
2793 
2794 BEGIN
2795    SELECT LPAD(TO_CHAR(calendar_id),5,'0')
2796    INTO v_calendar_chr
2797    FROM fem_calendars_b
2798    WHERE calendar_id = p_calendar_id;
2799 EXCEPTION
2800    WHEN no_data_found THEN
2801       v_token_value := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
2802                           p_dim_label => 'CALENDAR');
2803       v_attr_value := TO_CHAR(p_calendar_id);
2804       RAISE e_bad_param_value;
2805 END;
2806 
2807 SELECT LPAD(TO_CHAR(time_dimension_group_key),5,'0')
2808 INTO v_dim_grp_key
2809 FROM fem_dimension_grps_b
2810 WHERE dimension_group_id = p_dim_grp_id;
2811 
2812 SELECT TO_NUMBER(v_julian_date||v_period_chr||v_calendar_chr||v_dim_grp_key)
2813 INTO v_cal_per_id
2814 FROM dual;
2815 RETURN v_cal_per_id;
2816 
2817 EXCEPTION
2818    WHEN e_bad_param_value THEN
2819       FEM_Engines_Pkg.Put_Message(
2820          p_app_name => 'FEM',
2821          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
2822          p_token1 => 'PARAM',
2823          p_value1 => v_token_value,
2824          p_trans1 => null,
2825          p_token2 => 'VALUE',
2826          p_value2 => v_attr_value);
2827       x_err_code := 2;
2828       x_num_msg := x_num_msg + 1;
2829       RETURN -1;
2830 
2831    WHEN e_no_value_found THEN
2832       FEM_Engines_Pkg.Put_Message(
2833          p_app_name => 'FEM',
2834          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
2835          p_token1 => 'ENTITY',
2836          p_value1 => v_token_value);
2837       x_err_code := 2;
2838       x_num_msg := x_num_msg + 1;
2839       RETURN -1;
2840 
2841    WHEN e_many_values_found THEN
2842       FEM_Engines_Pkg.Put_Message(
2843          p_app_name => 'FEM',
2844          p_msg_name => 'FEM_MANY_VALUES_FOUND_ERR',
2845          p_token1 => 'ENTITY',
2846          p_value1 => v_token_value);
2847       x_err_code := 2;
2848       x_num_msg := x_num_msg + 1;
2849       RETURN -1;
2850 END Generate_Member_ID;
2851 
2852 ------------------------------------------------------------------------
2853 
2854 FUNCTION Generate_Member_ID (
2855    p_api_version     IN NUMBER     DEFAULT c_api_version,
2856    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
2857    p_commit          IN VARCHAR2   DEFAULT c_false,
2858    p_encoded         IN VARCHAR2   DEFAULT c_true,
2859    x_return_status  OUT NOCOPY VARCHAR2,
2860    x_msg_count      OUT NOCOPY NUMBER,
2861    x_msg_data       OUT NOCOPY VARCHAR2,
2862    p_end_date        IN DATE,
2863    p_period_num      IN NUMBER,
2864    p_calendar_id     IN NUMBER,
2865    p_dim_grp_id      IN NUMBER
2866 ) RETURN NUMBER
2867 IS
2868    v_cal_per_id     NUMBER;
2869    v_num_of_periods NUMBER;
2870    v_julian_date    VARCHAR2(7);
2871    v_period_chr     VARCHAR2(15);
2872    v_calendar_chr   VARCHAR2(5);
2873    v_dim_grp_key    VARCHAR2(5);
2874    v_attr_value     VARCHAR2(150);
2875 BEGIN
2876 
2877 x_return_status := c_success;
2878 
2879 Validate_OA_Params (
2880    p_api_version => p_api_version,
2881    p_init_msg_list => p_init_msg_list,
2882    p_commit => p_commit,
2883    p_encoded => p_encoded,
2884    x_return_status => x_return_status);
2885 
2886 IF (x_return_status <> c_success)
2887 THEN
2888    FND_MSG_PUB.Count_and_Get(
2889       p_encoded => c_false,
2890       p_count => x_msg_count,
2891       p_data => x_msg_data);
2892    RETURN -1;
2893 END IF;
2894 
2895 SELECT TO_CHAR(p_end_date,'J')
2896 INTO v_julian_date
2897 FROM dual;
2898 
2899 BEGIN
2900    SELECT T.number_assign_value
2901    INTO v_num_of_periods
2902    FROM fem_time_grp_types_attr T,
2903         fem_dimension_grps_b G,
2904         fem_dim_attributes_b A,
2905         fem_dim_attr_versions_b V
2906    WHERE G.dimension_group_id = p_dim_grp_id
2907    AND A.attribute_varchar_label = 'PERIODS_IN_YEAR'
2908    AND A.attribute_id = T.attribute_id
2909    AND G.time_group_type_code = T.time_group_type_code
2910    AND V.attribute_id = T.attribute_id
2911    AND V.version_id = T.version_id
2912    AND V.default_version_flag = 'Y';
2913 EXCEPTION
2914    WHEN no_data_found THEN
2915       v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2916                        p_dim_label => 'TIME_GROUP_TYPE',
2917                        p_attr_label => 'PERIODS_IN_YEAR');
2918       RAISE e_no_value_found;
2919    WHEN too_many_rows THEN
2920       v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2921                        p_dim_label => 'TIME_GROUP_TYPE',
2922                        p_attr_label => 'PERIODS_IN_YEAR');
2923       RAISE e_many_values_found;
2924 END;
2925 
2926 -- IF (p_period_num > v_num_of_periods)
2927 -- THEN
2928 --    v_token_value := FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
2929 --                     p_dim_label => 'CAL_PERIOD',
2930 --                     p_attr_label => 'GL_PERIOD_NUM');
2931 --    v_attr_value := TO_CHAR(p_period_num);
2932 --    RAISE e_bad_param_value;
2936 INTO v_period_chr
2933 -- END IF;
2934 
2935 SELECT LPAD(TO_CHAR(p_period_num),15,'0')
2937 FROM dual;
2938 
2939 BEGIN
2940    SELECT LPAD(TO_CHAR(calendar_id),5,'0')
2941    INTO v_calendar_chr
2942    FROM fem_calendars_b
2943    WHERE calendar_id = p_calendar_id;
2944 EXCEPTION
2945    WHEN no_data_found THEN
2946       v_token_value := FEM_Dimension_Util_Pkg.Get_Dimension_Name(
2947                        p_dim_label => 'CALENDAR');
2948       v_attr_value := TO_CHAR(p_calendar_id);
2949       RAISE e_bad_param_value;
2950 END;
2951 
2952 SELECT LPAD(TO_CHAR(time_dimension_group_key),5,'0')
2953 INTO v_dim_grp_key
2954 FROM fem_dimension_grps_b
2955 WHERE dimension_group_id = p_dim_grp_id;
2956 
2957 SELECT TO_NUMBER(v_julian_date||v_period_chr||v_calendar_chr||v_dim_grp_key)
2958 INTO v_cal_per_id
2959 FROM dual;
2960 
2961 RETURN v_cal_per_id;
2962 
2963 EXCEPTION
2964    WHEN e_bad_param_value THEN
2965       FEM_Engines_Pkg.Put_Message(
2966          p_app_name => 'FEM',
2967          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
2968          p_token1 => 'PARAM',
2969          p_value1 => v_token_value,
2970          p_trans1 => null,
2971          p_token2 => 'VALUE',
2972          p_value2 => v_attr_value);
2973       FND_MSG_PUB.Count_and_Get(
2974          p_encoded => p_encoded,
2975          p_count => x_msg_count,
2976          p_data => x_msg_data);
2977       x_return_status := c_error;
2978       RETURN -1;
2979 
2980    WHEN e_no_value_found THEN
2981       FEM_Engines_Pkg.Put_Message(
2982          p_app_name => 'FEM',
2983          p_msg_name => 'FEM_NO_VALUE_FOUND_ERR',
2984          p_token1 => 'ENTITY',
2985          p_value1 => v_token_value);
2986       FND_MSG_PUB.Count_and_Get(
2987          p_encoded => p_encoded,
2988          p_count => x_msg_count,
2989          p_data => x_msg_data);
2990       x_return_status := c_error;
2991       RETURN -1;
2992 
2993    WHEN e_many_values_found THEN
2994       FEM_Engines_Pkg.Put_Message(
2995          p_app_name => 'FEM',
2996          p_msg_name => 'FEM_MANY_VALUES_FOUND_ERR',
2997          p_token1 => 'ENTITY',
2998          p_value1 => v_token_value);
2999       FND_MSG_PUB.Count_and_Get(
3000          p_encoded => p_encoded,
3001          p_count => x_msg_count,
3002          p_data => x_msg_data);
3003       x_return_status := c_error;
3004       RETURN -1;
3005 END Generate_Member_ID;
3006 
3007 
3008 /*************************************************************************
3009 
3010                        Generate_Default_Load_Member
3011 
3012 PURPOSE:  This procedure creates a default member for dimensions
3013           that do not already have any members in the system.
3014           The new member is named "Default".  This procedure is
3015           overloaded and each version performs a slightly different task.
3016 
3017           If called with a dimension (and value set for VSR dimensions),
3018           this version will return the default member for the dimension
3019           (and value set).  If a default member already exists, this
3020           version will return that default member.  If members exist
3021           but no default has yet been designated, this version will
3022           return the first member that was created in the system and
3023           set that as the new default member.  If no members exist, this
3024           version will create a default member and set that as the default member.
3025 
3026           If called with just a value set, this version will set a default
3027           member for the value set.  If a default member already exists,
3028           this version does nothing.  If members exist but no default has
3029           yet been designated, this version will find the first member that
3030           was created in the system and set that as the new default member.
3031           If no members exist, this version will create a default member and
3032           set that as the default member.
3033 
3034           If called with no API-specific parameters, this version generates
3035           default members for all dimensions that can be defaulted.  For each
3036           Value Set Required (VSR) dimension, this version will populate all
3037           dimension value sets (FEM_VALUE_SETS_B) with the newly created
3038           default member.  For each non-VSR dimension, this version will
3039           populate the dimensions metadata (FEM_XDIM_DIMENSIONS) with the
3040           default member display code.
3041 
3042           When each member is created, the procedure also creates the
3043           assignments for any required attributes of the dimension.
3044           These assignments are defined in the fem_dim_attributes_b.
3045 
3046           This procedure is run at installation time.  It may also
3047           be called separately after installation.
3048 
3049 *************************************************************************/
3050 
3051 PROCEDURE Generate_Default_Load_Member (
3052    p_api_version     IN NUMBER     DEFAULT c_api_version,
3053    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
3054    p_commit          IN VARCHAR2   DEFAULT c_false,
3055    p_encoded         IN VARCHAR2   DEFAULT c_true,
3056    x_return_status  OUT NOCOPY VARCHAR2,
3057    x_msg_count      OUT NOCOPY NUMBER,
3058    x_msg_data       OUT NOCOPY VARCHAR2,
3062 )
3059    p_dim_label       IN VARCHAR2,
3060    p_vs_id           IN NUMBER     DEFAULT NULL,
3061    x_member_code    OUT NOCOPY VARCHAR2
3063 IS
3064 
3065   C_MODULE            CONSTANT FND_LOG_MESSAGES.module%TYPE :=
3066      'fem.plsql.fem_dimension_util_pkg.generate_default_load_member(1)';
3067   C_API_NAME          CONSTANT VARCHAR2(30)  := 'Genereate_Default_Load_Member';
3068 
3069   v_sql               VARCHAR2(8191);
3070   v_member_code       VARCHAR2(250);
3071   v_member_dc         VARCHAR2(250);
3072   v_member_name       VARCHAR2(150);
3073   v_member_desc       VARCHAR2(255);
3074   v_dim_id            FEM_DIMENSIONS_B.dimension_id%TYPE;
3075   v_member_b_tab      FEM_XDIM_DIMENSIONS.member_b_table_name%TYPE;
3076   v_member_col        FEM_XDIM_DIMENSIONS.member_col%TYPE;
3077   v_member_dc_col     FEM_XDIM_DIMENSIONS.member_display_code_col%TYPE;
3078   v_member_name_col   FEM_XDIM_DIMENSIONS.member_name_col%TYPE;
3079   v_member_desc_col   FEM_XDIM_DIMENSIONS.member_description_col%TYPE;
3080   v_member_data_type_code  FEM_XDIM_DIMENSIONS.member_data_type_code%TYPE;
3081   v_group_use_code    FEM_XDIM_DIMENSIONS.group_use_code%TYPE;
3082   v_attr_tab          FEM_XDIM_DIMENSIONS.attribute_table_name%TYPE;
3083   v_vsr_flag          FEM_XDIM_DIMENSIONS.value_set_required_flag%TYPE;
3084   v_default_member_dc FEM_XDIM_DIMENSIONS.default_member_display_code%TYPE;
3085   v_member_id_method_code  FEM_XDIM_DIMENSIONS.member_id_method_code%TYPE;
3086   v_default_load_member_id FEM_VALUE_SETS_B.default_load_member_id%TYPE;
3087   v_member_pkg        VARCHAR2(30);
3088 
3089   -- This cursor retrieves all of the required attributes
3090   -- of the dimension of the value set
3091   CURSOR c_req_attr (p_dimension_id NUMBER) IS
3092       SELECT A.attribute_id,
3093              A.attribute_varchar_label,
3094               A.attribute_value_column_name,
3095               A.attribute_data_type_code,
3096                 A.default_assignment,
3097              A.default_assignment_vs_id,
3098              V.version_id
3099       FROM fem_dim_attributes_b A, fem_dim_attr_versions_b V
3100       WHERE A.attribute_required_flag = 'Y'
3101       AND A.dimension_id = p_dimension_id
3102       AND V.version_id =
3103         (SELECT min(version_id)
3104          FROM fem_dim_attr_versions_b V2
3105          WHERE V2.attribute_id = A.attribute_id
3106          AND V2.default_version_flag = 'Y');
3107 
3108 BEGIN
3109 
3110   -- Standard Start of API savepoint
3111   SAVEPOINT  gen_default_load_member1_pub;
3112 
3113   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3114     FEM_ENGINES_PKG.TECH_MESSAGE(
3115       p_severity => FND_LOG.level_procedure,
3116       p_module   => C_MODULE,
3117       p_msg_text => 'Begin Procedure');
3118   END IF;
3119 
3120   -- Initialize return status to unexpected error
3121   x_return_status := c_unexp;
3122 
3123   -- Check for call compatibility.
3124   IF NOT FND_API.Compatible_API_Call (c_api_version,
3125                 p_api_version,
3126                 C_API_NAME,
3127                 G_PKG_NAME)
3128   THEN
3129     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3130       FEM_ENGINES_PKG.TECH_MESSAGE(
3131         p_severity => FND_LOG.level_statement,
3132         p_module   => C_MODULE,
3133         p_msg_text => 'API Version ('||C_API_VERSION||') not compatible with '
3134                     ||'passed in version ('||p_api_version||')');
3135     END IF;
3136     RAISE e_unexp;
3137   END IF;
3138 
3139   Validate_OA_Params (
3140     p_api_version => p_api_version,
3141     p_init_msg_list => p_init_msg_list,
3142     p_commit => p_commit,
3143     p_encoded => p_encoded,
3144     x_return_status => x_return_status);
3145 
3146   IF (x_return_status <> c_success) THEN
3147     RAISE e_error;
3148   END IF;
3149 
3150   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3151     FEM_ENGINES_PKG.TECH_MESSAGE(
3152       p_severity => FND_LOG.level_statement,
3153       p_module   => C_MODULE,
3154       p_msg_text => 'p_dim_label = '||p_dim_label);
3155     FEM_ENGINES_PKG.TECH_MESSAGE(
3156       p_severity => FND_LOG.level_statement,
3157       p_module   => C_MODULE,
3158       p_msg_text => 'p_vs_id = '||to_char(p_vs_id));
3159   END IF;
3160 
3161   -- Get dimension info.
3162   -- This API will only populate default members for those dimensions where
3163   --  * members can be created in DHM, i.e. not seeded or created
3164   --    through another mechanism (READ_ONLY_FLAG = 'N')
3165   --  * is not a composite dimension (COMPOSITE_DIMENSION_FLAG = 'N')
3166   --  * dimension is a not hidden dimension and shows up in DHM
3167   --    (HIER_EDITOR_MANAGED_FLAG = 'Y')
3168   BEGIN
3169     SELECT d.dimension_id,
3170            x.member_b_table_name,
3171            x.member_col,
3172            x.member_display_code_col,
3173            x.member_name_col,
3174            x.member_description_col,
3175            x.member_data_type_code,
3176            x.group_use_code,
3177            x.attribute_table_name,
3178            x.value_set_required_flag,
3179            x.member_id_method_code,
3180            x.default_member_display_code,
3181            REPLACE(x.member_b_table_name||'XYZ','_BXYZ','_PKG')
3182     INTO   v_dim_id,
3183            v_member_b_tab,
3187            v_member_desc_col,
3184            v_member_col,
3185            v_member_dc_col,
3186            v_member_name_col,
3188            v_member_data_type_code,
3189            v_group_use_code,
3190            v_attr_tab,
3191            v_vsr_flag,
3192            v_member_id_method_code,
3193            v_default_member_dc,
3194            v_member_pkg
3195     FROM   fem_xdim_dimensions x, fem_dimensions_b d
3196     WHERE  d.dimension_varchar_label = p_dim_label
3197     AND    x.read_only_flag = 'N'
3198     AND    x.composite_dimension_flag = 'N'
3199     AND    x.hier_editor_managed_flag = 'Y'
3200     AND    x.dimension_id = d.dimension_id;
3201   EXCEPTION
3202     WHEN no_data_found THEN
3203       FEM_Engines_Pkg.Put_Message(
3204         p_app_name => 'FEM',
3205         p_msg_name => 'FEM_BAD_DIM_ID_ERR',
3206         p_token1 => 'DIM_ID',
3207         p_value1 => v_dim_id);
3208       RAISE e_error;
3209   END;
3210 
3211   -- Check that value set exists if dimension is VSR
3212   IF v_vsr_flag = 'Y' THEN
3213     BEGIN
3214       SELECT default_load_member_id
3215       INTO   v_default_load_member_id
3216       FROM   fem_value_sets_b
3217       WHERE  value_set_id = p_vs_id
3218       AND    dimension_id = v_dim_id;
3219     EXCEPTION
3220       WHEN no_data_found THEN
3221         FEM_Engines_Pkg.Put_Message(
3222            p_app_name => 'FEM',
3223            p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
3224            p_token1 => 'PARAM',
3225            p_value1 => 'FEM_VALUE_SET_TXT',
3226            p_trans1 => 'Y',
3227            p_token2 => 'VALUE',
3228            p_value2 => p_vs_id);
3229         RAISE e_error;
3230     END;
3231   END IF; -- v_vsr_flag = 'Y'
3232 
3233   -- Initialize
3234   v_member_code := null;
3235 
3236   -- If defaults already exist, verify that the member exists
3237   IF (v_vsr_flag = 'N' AND v_default_member_dc IS NOT NULL) OR
3238      (v_vsr_flag = 'Y' AND v_default_load_member_id IS NOT NULL) THEN
3239     v_sql := 'SELECT '||v_member_col||', '||v_member_dc_col
3240           ||' FROM '||v_member_b_tab;
3241     IF v_vsr_flag = 'N' THEN
3242       v_sql := v_sql||' WHERE '||v_member_dc_col||' = :1';
3243     ELSE
3244       v_sql := v_sql||' WHERE '||v_member_col||' = :1'
3245           ||' AND value_set_id = :2';
3246     END IF;
3247 
3248     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3249       FEM_ENGINES_PKG.TECH_MESSAGE(
3250         p_severity => FND_LOG.level_statement,
3251         p_module   => C_MODULE,
3252         p_msg_text => 'v_sql = '||v_sql);
3253     END IF;
3254 
3255     BEGIN
3256       IF v_vsr_flag = 'N' THEN
3257         EXECUTE IMMEDIATE v_sql INTO v_member_code, v_member_dc USING v_default_member_dc;
3258       ELSE
3259         EXECUTE IMMEDIATE v_sql INTO v_member_code, v_member_dc USING v_default_load_member_id, p_vs_id;
3260       END IF;
3261     EXCEPTION
3262       WHEN no_data_found THEN
3263         v_default_member_dc := null;
3264         v_default_load_member_id := null;
3265         v_member_code := null;
3266     END;
3267   END IF;
3268 
3269   -- If default does not exist, check if any members exist
3270   IF v_member_code IS NULL THEN
3271     -- If the dimension already has a member,
3272     -- return the first created member.
3273     v_sql :=  'SELECT MAX('||v_member_col||') KEEP (DENSE_RANK FIRST ORDER BY creation_date),'
3274            ||' MAX('||v_member_dc_col||') KEEP (DENSE_RANK FIRST ORDER BY creation_date)'
3275            ||' FROM '||v_member_b_tab;
3276     IF v_vsr_flag = 'Y' THEN
3277       v_sql := v_sql||' WHERE value_set_id = :1';
3278     END IF;
3279 
3280     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3281       FEM_ENGINES_PKG.TECH_MESSAGE(
3282         p_severity => FND_LOG.level_statement,
3283         p_module   => C_MODULE,
3284         p_msg_text => 'v_sql = '||v_sql);
3285     END IF;
3286 
3287     BEGIN
3288       IF v_vsr_flag = 'Y' THEN
3289         EXECUTE IMMEDIATE v_sql INTO v_member_code, v_member_dc USING p_vs_id;
3290       ELSE
3291         EXECUTE IMMEDIATE v_sql INTO v_member_code, v_member_dc;
3292       END IF;
3293     EXCEPTION
3294       WHEN no_data_found THEN
3295         v_member_code := null;
3296     END;
3297   END IF; -- v_member_code IS NULL
3298 
3299   -- If no members exist, then create default member
3300   IF v_member_code IS NULL THEN
3301     -- the default member display code is hard coded
3302     v_member_dc := 'Default';
3303 
3304     IF v_member_id_method_code = 'FUNCTION' THEN
3305       v_member_code := FEM_Dimension_Util_Pkg.Generate_Member_ID (
3306                   p_api_version => 1.0,
3307                   p_init_msg_list => c_false,
3308                   p_commit => c_false,
3309                   p_encoded => p_encoded,
3310                   x_return_status => x_return_status,
3311                   x_msg_count => x_msg_count,
3312                   x_msg_data => x_msg_data,
3313                   p_dim_id => v_dim_id);
3314     ELSE
3315       IF v_member_data_type_code = 'VARCHAR' THEN
3316         -- Display code is only necessary if the member code column
3317         -- is a surrogate key column (which should have a NUMBER data type).
3318         -- IF that is not the case, this API does not know what value to
3322             FEM_ENGINES_PKG.TECH_MESSAGE(
3319         -- use to default the display code column and errors.
3320         IF v_member_col <> v_member_dc_col THEN
3321           IF FND_LOG.level_exception >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3323               p_severity => FND_LOG.level_exception,
3324               p_module   => C_MODULE,
3325               p_msg_text => 'Dimension member display code column ('||v_member_dc_col
3326                           ||') must be same as member code column ('||v_member_col
3327                           ||') if member data type is VARCHAR.');
3328           END IF;
3329           RAISE e_unexp;
3330         END IF; -- v_member_col <> v_member_dc_col
3331 
3332         v_member_code := v_member_dc;
3333       ELSE
3334         -- If member data type is not VARCHAR, this API
3335         -- does not know what value to default so it errors.
3336         IF FND_LOG.level_exception >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3337           FEM_ENGINES_PKG.TECH_MESSAGE(
3338             p_severity => FND_LOG.level_exception,
3339             p_module   => C_MODULE,
3340             p_msg_text => 'Dimension member data type ('||v_member_data_type_code
3341                         ||') has to be VARCHAR if the member ID source code is not FUNCTION');
3342         END IF;
3343         RAISE e_unexp;
3344       END IF; -- v_member_data_type_code = 'VARCHAR'
3345     END IF; -- v_member_id_source_code = 'FUNCTION'
3346 
3347     ----------------------------------------------------------
3348     -- Insert new member using Dimension table handler package
3349     ----------------------------------------------------------
3350 
3351     -- First get the translated default member name and description
3352     FND_MESSAGE.Set_Name('FEM','FEM_DEFAULT_TXT');
3353     v_member_name := substr(FND_MESSAGE.Get,1,150);
3354     FND_MESSAGE.Set_Name('FEM','FEM_DEFAULT_MEMBER_TXT');
3355     v_member_desc := substr(FND_MESSAGE.Get,1,255);
3356 
3357     v_sql :=
3358       'DECLARE v_rowid VARCHAR2(20);'||
3359       ' BEGIN '||
3360          v_member_pkg||'.INSERT_ROW('||
3361         'x_rowid => v_rowid,';
3362 
3363     IF v_member_data_type_code = 'NUMBER' THEN
3364       v_sql := v_sql||'x_'||substr(v_member_col,1,28)||' => '||v_member_code||',';
3365     ELSIF v_member_data_type_code = 'VARCHAR' THEN
3366       v_sql := v_sql||'x_'||substr(v_member_col,1,28)||' => '''||v_member_code||''',';
3367     ELSE
3368       IF FND_LOG.level_exception >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3369         FEM_ENGINES_PKG.TECH_MESSAGE(
3370           p_severity => FND_LOG.level_exception,
3371           p_module   => C_MODULE,
3372           p_msg_text => 'Member data type ('||v_member_data_type_code
3373                       ||') must be is not NUMBER or VARCHAR.');
3374       END IF;
3375       RAISE e_unexp;
3376     END IF;
3377 
3378     IF v_member_id_method_code = 'FUNCTION' THEN
3379       v_sql := v_sql||'x_'||substr(v_member_dc_col,1,28)||' => '''||v_member_dc||''',';
3380     END IF;
3381 
3382     IF v_vsr_flag = 'Y' THEN
3383       v_sql := v_sql||'x_value_set_id => '||p_vs_id||',';
3384     END IF;
3385 
3386     IF v_group_use_code <> 'NOT_SUPPORTED' THEN
3387       v_sql := v_sql||'x_dimension_group_id => null,';
3388     END IF;
3389 
3390     v_sql := v_sql||
3391         'x_'||substr(v_member_name_col,1,28)||' => '''||v_member_name||''','||
3392         'x_'||substr(v_member_desc_col,1,28)||' => '''||v_member_desc||''','||
3393         'x_enabled_flag => ''Y'','||
3394         'x_personal_flag => ''N'','||
3395         'x_read_only_flag => ''N'','||
3396         'x_object_version_number => 1,'||
3397         'x_creation_date => sysdate,'||
3398         'x_created_by => '||c_user_id||','||
3399         'x_last_update_date => sysdate,'||
3400         'x_last_updated_by => '||c_user_id||','||
3401         'x_last_update_login => null);'||
3402       ' END;';
3403 
3404     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3405       FEM_ENGINES_PKG.TECH_MESSAGE(
3406         p_severity => FND_LOG.level_statement,
3407         p_module   => C_MODULE,
3408         p_msg_text => 'v_sql = '||v_sql);
3409     END IF;
3410 
3411     BEGIN
3412       EXECUTE IMMEDIATE v_sql;
3413     EXCEPTION
3414       WHEN dup_val_on_index THEN
3415         FEM_Engines_Pkg.Put_Message(
3416           p_app_name => 'FEM',
3417           p_msg_name => 'FEM_DUP_NEW_MEMBER_ERR',
3418           p_token1 => 'VALUE',
3419           p_value1 => v_member_code,
3420           p_trans1 => 'N',
3421           p_token2 => 'DIMENSION',
3422           p_value2 => FEM_Dimension_Util_Pkg.Get_Dimension_Name(
3423                         p_dim_id => v_dim_id));
3424         RAISE e_error;
3425     END;
3426 
3427     ----------------------------------------
3428     -- Create attribute assignments for the new member,
3429     -- but only for the required attributes.
3430     -- If the assignment value is a DATE, it will be stored as a VARCHAR2
3431     -- in the Canonical date format as defined in FND_DATE package.
3432     ----------------------------------------
3433     IF v_attr_tab IS NOT NULL THEN
3434       FOR attr IN c_req_attr (v_dim_id) LOOP
3435         -- Raise error if no default assignment is found
3436         IF attr.default_assignment IS NULL THEN
3437           FEM_ENGINES_PKG.Put_Message(
3438             p_app_name => 'FEM',
3442             p_trans1 => 'N',
3439             p_msg_name => 'FEM_XDIM_UTIL_ATTR_NODEFAULT',
3440             p_token1 => 'DIMLABEL',
3441             p_value1 => p_dim_label,
3443             p_token2 => 'ATTRLABEL',
3444             p_value2 => attr.attribute_varchar_label,
3445             p_trans2 => 'N');
3446           RAISE e_error;
3447         END IF;
3448         -- Otherwise, insert the attribute assignment
3449         v_sql := 'INSERT INTO '||v_attr_tab||
3450                           ' (ATTRIBUTE_ID'||
3451                           ',VERSION_ID'||
3452                           ','||v_member_col;
3453         IF v_vsr_flag = 'Y' THEN
3454           v_sql := v_sql||',VALUE_SET_ID';
3455         END IF;
3456         IF attr.default_assignment_vs_id IS NOT NULL THEN
3457           v_sql := v_sql||',DIM_ATTRIBUTE_VALUE_SET_ID';
3458         END IF;
3459         v_sql := v_sql||
3460                           ','||attr.attribute_value_column_name||
3461                           ',CREATION_DATE'||
3462                           ',CREATED_BY'||
3463                           ',LAST_UPDATED_BY'||
3464                           ',LAST_UPDATE_DATE'||
3465                           ',LAST_UPDATE_LOGIN'||
3466                           ',OBJECT_VERSION_NUMBER'||
3467                           ',AW_SNAPSHOT_FLAG)'||
3468                           ' select '||attr.attribute_id||
3469                           ','||attr.version_id||
3470                           ','||v_member_code;
3471         IF v_vsr_flag = 'Y' THEN
3472           v_sql := v_sql||','||p_vs_id;
3473         END IF;
3474         IF attr.default_assignment_vs_id IS NOT NULL THEN
3475           v_sql := v_sql||','''||attr.default_assignment_vs_id||'''';
3476         END IF;
3477         -- If the attribute is a DATE, it would have been stored
3478         -- in DEFAULT_ASSIGNMENT in the canonical format.
3479         -- Otherwise, just assign it as is.
3480         IF attr.attribute_data_type_code = 'DATE' THEN
3481           v_sql := v_sql||','''||to_char(FND_DATE.canonical_to_date(attr.default_assignment))||'''';
3482         ELSE
3483           v_sql := v_sql||','''||attr.default_assignment||'''';
3484         END IF;
3485         v_sql := v_sql||
3486                           ',sysdate'||
3487                           ','||c_user_id||
3488                           ','||c_user_id||
3489                           ',sysdate'||
3490                           ','||c_login_id||
3491                           ','||1||
3492                           ','||'''N'' from dual';
3493 
3494         IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3495           FEM_ENGINES_PKG.TECH_MESSAGE(
3496             p_severity => FND_LOG.level_statement,
3497             p_module   => C_MODULE,
3498             p_msg_text => 'v_sql = '||v_sql);
3499         END IF;
3500 
3501         EXECUTE IMMEDIATE v_sql;
3502 
3503       END LOOP;
3504     END IF;  -- v_attr_tab is not null
3505   END IF; -- v_member_code IS NULL
3506 
3507   -- Set the default member if none exists
3508   IF v_vsr_flag = 'Y' THEN
3509     IF v_default_load_member_id IS NULL THEN
3510       UPDATE fem_value_sets_b
3511       SET default_load_member_id = to_number(v_member_code),
3512           last_update_date = sysdate,
3513           last_updated_by = c_user_id
3514       WHERE value_set_id = p_vs_id;
3515 
3516       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3517         FEM_ENGINES_PKG.TECH_MESSAGE(
3518           p_severity => FND_LOG.level_statement,
3519           p_module   => C_MODULE,
3520           p_msg_text => 'Updated FEM_VALUE_SETS_B.default_load_member_id = '
3521                        ||v_member_code);
3522       END IF;
3523     END IF;
3524   ELSE
3525     IF v_default_member_dc IS NULL THEN
3526       UPDATE fem_xdim_dimensions
3527       SET default_member_display_code = (v_member_dc),
3528           last_update_date = sysdate,
3529           last_updated_by = c_user_id
3530       WHERE dimension_id = v_dim_id;
3531 
3532       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3533         FEM_ENGINES_PKG.TECH_MESSAGE(
3534           p_severity => FND_LOG.level_statement,
3535           p_module   => C_MODULE,
3536           p_msg_text => 'Updated FEM_XDIM_DIMENSIONS.default_member_display_code = '
3537                        ||v_member_dc);
3538       END IF;
3539     END IF;
3540   END IF; -- v_vsr_flag = 'Y'
3541 
3542   IF (p_commit = c_true) THEN
3543     COMMIT;
3544   END IF;
3545 
3546   x_member_code := v_member_code;
3547   x_return_status := c_success;
3548 
3549   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3550     FEM_ENGINES_PKG.TECH_MESSAGE(
3551       p_severity => FND_LOG.level_statement,
3552       p_module   => C_MODULE,
3553       p_msg_text => 'x_member_code = '||x_member_code);
3554   END IF;
3555   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3556     FEM_ENGINES_PKG.TECH_MESSAGE(
3557       p_severity => FND_LOG.level_procedure,
3558       p_module   => C_MODULE,
3559       p_msg_text => 'End Procedure');
3560   END IF;
3561 
3562 EXCEPTION
3563   WHEN e_error THEN
3564     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3565       FEM_ENGINES_PKG.TECH_MESSAGE(
3569     END IF;
3566         p_severity => FND_LOG.level_procedure,
3567         p_module   => C_MODULE,
3568         p_msg_text => 'End Procedure');
3570     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
3571                               p_count => x_msg_count,
3572                               p_data => x_msg_data);
3573     ROLLBACK TO gen_default_load_member1_pub;
3574     x_return_status := c_error;
3575 
3576   WHEN others THEN
3577     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3578       FEM_ENGINES_PKG.TECH_MESSAGE(
3579         p_severity => FND_LOG.level_statement,
3580         p_module   => C_MODULE,
3581         p_msg_text => 'Unexpected error.');
3582       FEM_ENGINES_PKG.TECH_MESSAGE(
3583         p_severity => FND_LOG.level_statement,
3584         p_module   => C_MODULE,
3585         p_msg_text => SQLERRM);
3586     END IF;
3587     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3588       FEM_ENGINES_PKG.TECH_MESSAGE(
3589         p_severity => FND_LOG.level_procedure,
3590         p_module   => C_MODULE,
3591         p_msg_text => 'End Procedure');
3592     END IF;
3593     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
3594                               p_count => x_msg_count,
3595                               p_data => x_msg_data);
3596     ROLLBACK TO gen_default_load_member1_pub;
3597     x_return_status := c_unexp;
3598 
3599 END;
3600 
3601 PROCEDURE Generate_Default_Load_Member (
3602    p_api_version     IN NUMBER     DEFAULT c_api_version,
3603    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
3604    p_commit          IN VARCHAR2   DEFAULT c_false,
3605    p_encoded         IN VARCHAR2   DEFAULT c_true,
3606    x_return_status  OUT NOCOPY VARCHAR2,
3607    x_msg_count      OUT NOCOPY NUMBER,
3608    x_msg_data       OUT NOCOPY VARCHAR2,
3609    p_vs_id           IN NUMBER
3610 )
3611 IS
3612   C_MODULE            CONSTANT FND_LOG_MESSAGES.module%TYPE :=
3613      'fem.plsql.fem_dimension_util_pkg.generate_default_load_member(2)';
3614   C_API_NAME          CONSTANT VARCHAR2(30)  := 'Genereate_Default_Load_Member';
3615 
3616   v_dim_label        FEM_DIMENSIONS_B.dimension_varchar_label%TYPE;
3617   v_def_load_id      NUMBER;
3618   v_member_code      VARCHAR2(38);
3619 BEGIN
3620 
3621   -- Standard Start of API savepoint
3622   SAVEPOINT  gen_default_load_member2_pub;
3623 
3624   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3625     FEM_ENGINES_PKG.TECH_MESSAGE(
3626       p_severity => FND_LOG.level_procedure,
3627       p_module   => C_MODULE,
3628       p_msg_text => 'Begin Procedure');
3629   END IF;
3630 
3631   -- Initialize return status to unexpected error
3632   x_return_status := c_unexp;
3633 
3634   -- Check for call compatibility.
3635   IF NOT FND_API.Compatible_API_Call (c_api_version,
3636                 p_api_version,
3637                 C_API_NAME,
3638                 G_PKG_NAME)
3639   THEN
3640     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3641       FEM_ENGINES_PKG.TECH_MESSAGE(
3642         p_severity => FND_LOG.level_statement,
3643         p_module   => C_MODULE,
3644         p_msg_text => 'API Version ('||C_API_VERSION||') not compatible with '
3645                     ||'passed in version ('||p_api_version||')');
3646     END IF;
3647     RAISE e_unexp;
3648   END IF;
3649 
3650   Validate_OA_Params (
3651     p_api_version => p_api_version,
3652     p_init_msg_list => p_init_msg_list,
3653     p_commit => p_commit,
3654     p_encoded => p_encoded,
3655     x_return_status => x_return_status);
3656 
3657   IF (x_return_status <> c_success) THEN
3658     RAISE e_error;
3659   END IF;
3660 
3661   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3662     FEM_ENGINES_PKG.TECH_MESSAGE(
3663       p_severity => FND_LOG.level_statement,
3664       p_module   => C_MODULE,
3665       p_msg_text => 'p_vs_id = '||to_char(p_vs_id));
3666   END IF;
3667 
3668   -------------------------------------
3669   -- Check that Value Set ID was passed
3670   -------------------------------------
3671   IF (p_vs_id IS NULL) THEN
3672     FEM_ENGINES_PKG.Put_Message(
3673          p_app_name => 'FEM',
3674          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
3675          p_token1 => 'PARAM',
3676          p_value1 => 'FEM_VALUE_SET_TXT',
3677          p_trans1 => 'Y');
3678     RAISE e_error;
3679   END IF;
3680 
3681   ------------------------------
3682   -- Check that Value Set exists
3683   ------------------------------
3684   BEGIN
3685     SELECT D.dimension_varchar_label,
3686            V.default_load_member_id
3687     INTO   v_dim_label,
3688            v_def_load_id
3689     FROM   fem_value_sets_b V, fem_dimensions_b D
3690     WHERE  V.value_set_id = p_vs_id
3691     AND    V.dimension_id = D.dimension_id;
3692   EXCEPTION
3693     WHEN no_data_found THEN
3694      FEM_Engines_Pkg.Put_Message(
3695          p_app_name => 'FEM',
3696          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
3697          p_token1 => 'PARAM',
3698          p_value1 => 'FEM_VALUE_SET_TXT',
3699          p_trans1 => 'Y',
3700          p_token2 => 'VALUE',
3701          p_value2 => p_vs_id);
3705   -----------------------------------------------
3702       RAISE e_error;
3703   END;
3704 
3706   -- Return if Default Load Member already exists
3707   -----------------------------------------------
3708   IF (v_def_load_id IS NULL) THEN
3709     Generate_Default_Load_Member (
3710                   p_api_version   => 1.0,
3711                   p_init_msg_list => c_false,
3712                   p_commit        => c_false,
3713                   p_encoded       => p_encoded,
3714                   x_return_status => x_return_status,
3715                   x_msg_count     => x_msg_count,
3716                   x_msg_data      => x_msg_data,
3717                   p_dim_label     => v_dim_label,
3718                   p_vs_id         => p_vs_id,
3719                   x_member_code   => v_member_code);
3720 
3721     IF (x_return_status <> c_success) THEN
3722       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3723         FEM_ENGINES_PKG.TECH_MESSAGE(
3724           p_severity => FND_LOG.level_statement,
3725           p_module   => C_MODULE,
3726           p_msg_text => 'Call to FEM_Dimension_Util_Pkg.Generate_Default_Load_Member(1)'
3727                   ||' returned with status: '||x_return_status);
3728       END IF;
3729       RAISE e_error;
3730     END IF;
3731   END IF;  -- v_def_load_id IS NULL
3732 
3733   IF (p_commit = c_true) THEN
3734     COMMIT;
3735   END IF;
3736 
3737   x_return_status := c_success;
3738 
3739   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3740     FEM_ENGINES_PKG.TECH_MESSAGE(
3741       p_severity => FND_LOG.level_procedure,
3742       p_module   => C_MODULE,
3743       p_msg_text => 'End Procedure');
3744   END IF;
3745 
3746 EXCEPTION
3747   WHEN e_error THEN
3748     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3749       FEM_ENGINES_PKG.TECH_MESSAGE(
3750         p_severity => FND_LOG.level_procedure,
3751         p_module   => C_MODULE,
3752         p_msg_text => 'End Procedure');
3753     END IF;
3754     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
3755                               p_count => x_msg_count,
3756                               p_data => x_msg_data);
3757     ROLLBACK TO gen_default_load_member2_pub;
3758     x_return_status := c_error;
3759 
3760   WHEN others THEN
3761     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3762       FEM_ENGINES_PKG.TECH_MESSAGE(
3763         p_severity => FND_LOG.level_statement,
3764         p_module   => C_MODULE,
3765         p_msg_text => 'Unexpected error.');
3766     END IF;
3767     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3768       FEM_ENGINES_PKG.TECH_MESSAGE(
3769         p_severity => FND_LOG.level_procedure,
3770         p_module   => C_MODULE,
3771         p_msg_text => 'End Procedure');
3772     END IF;
3773     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
3774                               p_count => x_msg_count,
3775                               p_data => x_msg_data);
3776     ROLLBACK TO gen_default_load_member2_pub;
3777     x_return_status := c_unexp;
3778 
3779 END Generate_Default_Load_Member;
3780 
3781 --------------------------------------------------------------------
3782 
3783 PROCEDURE Generate_Default_Load_Member (
3784    p_api_version     IN NUMBER     DEFAULT c_api_version,
3785    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
3786    p_commit          IN VARCHAR2   DEFAULT c_false,
3787    p_encoded         IN VARCHAR2   DEFAULT c_true,
3788    x_return_status  OUT NOCOPY VARCHAR2,
3789    x_msg_count      OUT NOCOPY NUMBER,
3790    x_msg_data       OUT NOCOPY VARCHAR2
3791 )
3792 IS
3793   C_MODULE            CONSTANT FND_LOG_MESSAGES.module%TYPE :=
3794      'fem.plsql.fem_dimension_util_pkg.generate_default_load_member(3)';
3795   C_API_NAME          CONSTANT VARCHAR2(30)  := 'Genereate_Default_Load_Member';
3796 
3797   v_member_code       VARCHAR2(250);
3798   v_exception_flag    BOOLEAN;
3799 
3800   -- All dimensions that this API is able to default
3801   CURSOR c_dims IS
3802     SELECT d.dimension_id,
3803            d.dimension_varchar_label,
3804            x.value_set_required_flag
3805     FROM   fem_xdim_dimensions x, fem_dimensions_b d
3806     WHERE  x.dimension_id = d.dimension_id
3807     AND    x.read_only_flag = 'N'
3808     AND    x.composite_dimension_flag = 'N'
3809     AND    x.hier_editor_managed_flag = 'Y'
3810     AND   (x.default_member_display_code IS NULL OR
3811            x.value_set_required_flag = 'Y');
3812 
3813   -- All value sets given a dimension
3814   CURSOR c_value_sets (p_dim_id NUMBER) IS
3815       SELECT value_set_id
3816       FROM   fem_value_sets_b
3817       WHERE  dimension_id = p_dim_id
3818       AND    default_load_member_id IS NULL;
3819 
3820 BEGIN
3821 
3822   -- Standard Start of API savepoint
3823   SAVEPOINT  gen_default_load_member3_pub;
3824 
3825   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3826     FEM_ENGINES_PKG.TECH_MESSAGE(
3827       p_severity => FND_LOG.level_procedure,
3828       p_module   => C_MODULE,
3829       p_msg_text => 'Begin Procedure');
3830   END IF;
3831 
3832   -- Initialize variables
3833   x_return_status := c_unexp;
3834   v_exception_flag := FALSE;
3835 
3836   -- Check for call compatibility.
3840                 G_PKG_NAME)
3837   IF NOT FND_API.Compatible_API_Call (c_api_version,
3838                 p_api_version,
3839                 C_API_NAME,
3841   THEN
3842     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3843       FEM_ENGINES_PKG.TECH_MESSAGE(
3844         p_severity => FND_LOG.level_statement,
3845         p_module   => C_MODULE,
3846         p_msg_text => 'API Version ('||C_API_VERSION||') not compatible with '
3847                     ||'passed in version ('||p_api_version||')');
3848     END IF;
3849     RAISE e_unexp;
3850   END IF;
3851 
3852   Validate_OA_Params (
3853     p_api_version => p_api_version,
3854     p_init_msg_list => p_init_msg_list,
3855     p_commit => p_commit,
3856     p_encoded => p_encoded,
3857     x_return_status => x_return_status);
3858 
3859   IF (x_return_status <> c_success) THEN
3860     RAISE e_error;
3861   END IF;
3862 
3863   FOR dims IN c_dims LOOP
3864     IF dims.value_set_required_flag = 'Y' THEN
3865       FOR value_sets IN c_value_sets(dims.dimension_id) LOOP
3866         Generate_Default_Load_Member(
3867           p_api_version => 1.0,
3868           p_init_msg_list => c_false,
3869           p_commit => c_false,
3870           p_encoded => p_encoded,
3871           x_return_status => x_return_status,
3872           x_msg_count => x_msg_count,
3873           x_msg_data => x_msg_data,
3874           p_dim_label => dims.dimension_varchar_label,
3875           p_vs_id => value_sets.value_set_id,
3876           x_member_code => v_member_code);
3877 
3878         IF x_return_status <> c_success THEN
3879           IF FND_LOG.level_exception >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3880             v_exception_flag := TRUE;
3881             FEM_ENGINES_PKG.TECH_MESSAGE(
3882               p_severity => FND_LOG.level_exception,
3883               p_module   => C_MODULE,
3884               p_msg_text => 'Generate_Default_Load_Member returned with error for'
3885                          ||' dim_label = '||dims.dimension_varchar_label
3886                          ||', value_set_id = '||value_sets.value_set_id);
3887           END IF;
3888         END IF;
3889       END LOOP;
3890     ELSE
3891       Generate_Default_Load_Member(
3892         p_api_version => 1.0,
3893         p_init_msg_list => c_false,
3894         p_commit => c_false,
3895         p_encoded => p_encoded,
3896         x_return_status => x_return_status,
3897         x_msg_count => x_msg_count,
3898         x_msg_data => x_msg_data,
3899         p_dim_label => dims.dimension_varchar_label,
3900         x_member_code => v_member_code);
3901 
3902       IF x_return_status <> c_success THEN
3903         v_exception_flag := TRUE;
3904         IF FND_LOG.level_exception >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3905           FEM_ENGINES_PKG.TECH_MESSAGE(
3906             p_severity => FND_LOG.level_exception,
3907             p_module   => C_MODULE,
3908             p_msg_text => 'Generate_Default_Load_Member returned with error for'
3909                        ||' dim_label = '||dims.dimension_varchar_label);
3910         END IF;
3911       END IF;
3912     END IF;
3913   END LOOP;
3914 
3915   IF (p_commit = c_true) THEN
3916     COMMIT;
3917   END IF;
3918 
3919   IF v_exception_flag THEN
3920     x_return_status := c_error;
3921   ELSE
3922     x_return_status := c_success;
3923   END IF;
3924 
3925   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3926     FEM_ENGINES_PKG.TECH_MESSAGE(
3927       p_severity => FND_LOG.level_procedure,
3928       p_module   => C_MODULE,
3929       p_msg_text => 'End Procedure');
3930   END IF;
3931 
3932 EXCEPTION
3933   WHEN others THEN
3934     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3935       FEM_ENGINES_PKG.TECH_MESSAGE(
3936         p_severity => FND_LOG.level_statement,
3937         p_module   => C_MODULE,
3938         p_msg_text => 'Unexpected error.');
3939     END IF;
3940     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3941       FEM_ENGINES_PKG.TECH_MESSAGE(
3942         p_severity => FND_LOG.level_procedure,
3943         p_module   => C_MODULE,
3944         p_msg_text => 'End Procedure');
3945     END IF;
3946     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
3947                               p_count => x_msg_count,
3948                               p_data => x_msg_data);
3949     ROLLBACK TO gen_default_load_member3_pub;
3950     x_return_status := c_unexp;
3951 
3952 END Generate_Default_Load_Member;
3953 
3954 /*************************************************************************
3955 
3956                             New_Dataset
3957 
3958 *************************************************************************/
3959 
3960 PROCEDURE New_Dataset (
3961    p_display_code  IN VARCHAR2,
3962    p_dataset_name  IN VARCHAR2,
3963    p_bal_type_cd   IN VARCHAR2,
3964    p_source_cd     IN NUMBER,
3965    p_pft_w_flg     IN VARCHAR2   DEFAULT 'Y',
3966    p_prod_flg      IN VARCHAR2   DEFAULT 'Y',
3967    p_budget_id     IN NUMBER,
3968    p_enc_type_id   IN NUMBER,
3969    p_ver_name      IN VARCHAR2,
3970    p_ver_disp_cd   IN VARCHAR2,
3971    p_dataset_desc  IN VARCHAR2,
3972    x_err_code     OUT NOCOPY   NUMBER,
3976 
3973    x_num_msg      OUT NOCOPY   NUMBER
3974 )
3975 IS
3977 c_module_prg   CONSTANT   VARCHAR2(160) := c_module_pkg||'.new_dataset';
3978 
3979 c_dim_label    CONSTANT   VARCHAR2(30) := 'DATASET';
3980 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
3981 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
3982 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
3983 c_obj_ver_no   CONSTANT   NUMBER       := 1;
3984 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
3985 
3986 v_row_id       VARCHAR2(20) := '';
3987 
3988 v_prg_msg      VARCHAR2(4000);
3989 v_err_code     NUMBER;
3990 v_num_msg      NUMBER;
3991 v_err_msg      VARCHAR2(4000);
3992 
3993 v_dim_id       NUMBER;
3994 v_ds_cd        NUMBER;
3995 v_ver_id       NUMBER;
3996 v_attr_id      NUMBER;
3997 v_xdim_id      NUMBER;
3998 v_xdim_tab     VARCHAR2(30);
3999 v_xdim_col     VARCHAR2(30);
4000 v_xdim_cd_col  VARCHAR2(30);
4001 v_attr_col     VARCHAR2(30);
4002 v_reqd_flg     VARCHAR2(1);
4003 v_attr_value   VARCHAR2(1000);
4004 v_attr_date    DATE;
4005 v_attr_label   VARCHAR2(150);
4006 v_attr_num     NUMBER;
4007 v_attr_vch     VARCHAR2(30);
4008 
4009 v_sql_cmd      VARCHAR2(32767);
4010 
4011 CURSOR cv_dim_attr IS
4012    SELECT attribute_id,
4013           attribute_varchar_label,
4014           attribute_dimension_id,
4015           attribute_value_column_name,
4016           attribute_required_flag
4017    FROM fem_dim_attributes_b
4018    WHERE dimension_id =
4019       (SELECT dimension_id
4020        FROM fem_dimensions_b
4021        WHERE dimension_varchar_label = c_dim_label);
4022 
4023 TYPE cv_curs_type IS REF CURSOR;
4024 cv_attr_dim   cv_curs_type;
4025 
4026 BEGIN
4027 
4028 x_err_code := 0;
4029 x_num_msg := 0;
4030 
4031 ------------------------
4032 -- Get New Dataset ID --
4033 ------------------------
4034 SELECT dimension_id
4035 INTO v_dim_id
4036 FROM fem_dimensions_b
4037 WHERE dimension_varchar_label = c_dim_label;
4038 
4039 v_ds_cd := FEM_Dimension_Util_Pkg.Generate_Member_ID(
4040               p_dim_id => v_dim_id,
4041               x_err_code => v_err_code,
4042               x_num_msg => v_num_msg);
4043 IF (v_err_code > 0)
4044 THEN
4045    RAISE e_user_exception;
4046 END IF;
4047 
4048 -------------------------------
4049 -- Insert New Dataset Member --
4050 -------------------------------
4051 BEGIN
4052    FEM_DATASETS_PKG.INSERT_ROW(
4053       x_rowid => v_row_id,
4054       x_dataset_code => v_ds_cd,
4055       x_enabled_flag => c_enbld_flg,
4056       x_dataset_display_code => p_display_code,
4057       x_read_only_flag => c_ro_flg,
4058       x_personal_flag => c_pers_flg,
4059       x_object_version_number => c_obj_ver_no,
4060       x_dataset_name => p_dataset_name,
4061       x_description => p_dataset_desc,
4062       x_creation_date => sysdate,
4063       x_created_by => c_user_id,
4064       x_last_update_date => sysdate,
4065       x_last_updated_by => c_user_id,
4066       x_last_update_login => null);
4067 EXCEPTION
4068    WHEN dup_val_on_index THEN
4069       RAISE e_dup_display_code;
4070 END;
4071 
4072 -----------------------------------
4073 -- Insert New Dataset Attributes --
4074 -----------------------------------
4075 FOR r_dim_attr IN cv_dim_attr
4076 LOOP
4077    v_attr_id := r_dim_attr.attribute_id;
4078    v_attr_label := r_dim_attr.attribute_varchar_label;
4079    v_xdim_id := r_dim_attr.attribute_dimension_id;
4080    v_attr_col := r_dim_attr.attribute_value_column_name;
4081    v_reqd_flg := r_dim_attr.attribute_required_flag;
4082 
4083    -------------------------------
4084    -- Check Attribute's Version --
4085    -------------------------------
4086    SELECT MIN(version_id)
4087    INTO v_ver_id
4088    FROM fem_dim_attr_versions_b
4089    WHERE attribute_id = v_attr_id
4090    AND default_version_flag = 'Y';
4091 
4092    IF (v_ver_id IS NULL)
4093    THEN
4094       IF (p_ver_name IS NULL)
4095       THEN
4096          RAISE e_no_version_name;
4097       ELSIF (p_ver_disp_cd IS NULL)
4098       THEN
4099          RAISE e_no_version_name;
4100       END IF;
4101 
4102       SELECT fem_dim_attr_versions_b_s.NEXTVAL
4103       INTO v_ver_id FROM dual;
4104 
4105       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
4106          x_rowid => v_row_id,
4107          x_version_id => v_ver_id,
4108          x_aw_snapshot_flag => c_aw_flg,
4109          x_version_display_code => p_ver_disp_cd,
4110          x_object_version_number => c_obj_ver_no,
4111          x_default_version_flag => 'Y',
4112          x_personal_flag => c_pers_flg,
4113          x_attribute_id => v_attr_id,
4114          x_version_name => p_ver_name,
4115          x_description => null,
4116          x_creation_date => sysdate,
4117          x_created_by => c_user_id,
4118          x_last_update_date => sysdate,
4119          x_last_updated_by => c_user_id,
4120          x_last_update_login => null);
4121    END IF;
4122 
4123    -----------------------------
4124    -- Get Attribute Parameter --
4125    -----------------------------
4126    CASE v_attr_label
4130          v_attr_value := p_source_cd;
4127       WHEN 'DATASET_BALANCE_TYPE_CODE' THEN
4128          v_attr_value := p_bal_type_cd;
4129       WHEN 'SOURCE_SYSTEM_CODE' THEN
4131       WHEN 'PFT_ENG_WRITE_FLAG' THEN
4132          v_attr_value := p_pft_w_flg;
4133       WHEN 'PRODUCTION_FLAG' THEN
4134          v_attr_value := p_prod_flg;
4135       WHEN 'BUDGET_ID' THEN
4136          v_attr_value := p_budget_id;
4137       WHEN 'ENCUMBRANCE_TYPE_ID' THEN
4138          v_attr_value := p_enc_type_id;
4139       ELSE
4140          FEM_ENGINES_PKG.Tech_Message(
4141             p_severity => c_log_level_1,
4142             p_module => c_module_pkg||'.New_Dataset.bad_attr_list',
4143             p_msg_text => 'The Dataset attribute '||v_attr_label||
4144                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
4145                           ' the API''s list of attribute labels');
4146 
4147          FEM_ENGINES_PKG.Put_Message(
4148             p_app_name => 'FEM',
4149             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
4150             p_token1 => 'ATTR',
4151             p_value1 => v_attr_label);
4152 
4153          x_err_code := 1;
4154          x_num_msg := x_num_msg + 1;
4155    END CASE;
4156 
4157    IF (v_attr_value IS NULL)
4158    THEN
4159       CASE v_reqd_flg
4160          WHEN 'Y' THEN
4161             RAISE e_null_param_value;
4162          ELSE null;
4163       END CASE;
4164    ELSE
4165       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
4166           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
4167       THEN
4168          -------------------------------------
4169          -- Attribute is a Dimension Attribute
4170          -- which needs to be validated
4171          -------------------------------------
4172          SELECT member_b_table_name,
4173                 member_col
4174          INTO v_xdim_tab,
4175               v_xdim_col
4176          FROM fem_xdim_dimensions
4177          WHERE dimension_id = v_xdim_id;
4178 
4179          v_sql_cmd :=
4180             'SELECT '||v_xdim_col||
4181             ' FROM '||v_xdim_tab||
4182             ' WHERE '||v_xdim_col||' = :b_attr_value';
4183 
4184          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
4185          THEN
4186             BEGIN
4187                EXECUTE IMMEDIATE v_sql_cmd
4188                INTO v_attr_num
4189                USING v_attr_value;
4190             EXCEPTION
4191                WHEN no_data_found THEN
4192                   RAISE e_bad_param_value;
4193             END;
4194             v_attr_vch := '';
4195          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
4196          THEN
4197             BEGIN
4198                EXECUTE IMMEDIATE v_sql_cmd
4199                INTO v_attr_vch
4200                USING v_attr_value;
4201             EXCEPTION
4202                WHEN no_data_found THEN
4203                   RAISE e_bad_param_value;
4204             END;
4205             v_attr_num := '';
4206          END IF;
4207 
4208          INSERT INTO fem_datasets_attr(
4209             attribute_id,
4210             version_id,
4211             dataset_code,
4212             dim_attribute_numeric_member,
4213             dim_attribute_varchar_member,
4214             number_assign_value,
4215             varchar_assign_value,
4216             date_assign_value,
4217             creation_date,
4218             created_by,
4219             last_updated_by,
4220             last_update_date,
4221             last_update_login,
4222             aw_snapshot_flag,
4223             object_version_number)
4224          VALUES(
4225             v_attr_id,
4226             v_ver_id,
4227             v_ds_cd,
4228             v_attr_num,
4229             v_attr_vch,
4230             null,
4231             null,
4232             null,
4233             sysdate,
4234             c_user_id,
4235             c_user_id,
4236             sysdate,
4237             null,
4238             c_aw_flg,
4239             c_obj_ver_no);
4240 
4241       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
4242       THEN
4243          ----------------------------------------
4244          -- Attribute is an assigned number value
4245          ----------------------------------------
4246          INSERT INTO fem_datasets_attr(
4247             attribute_id,
4248             version_id,
4249             dataset_code,
4250             dim_attribute_numeric_member,
4251             dim_attribute_varchar_member,
4252             number_assign_value,
4253             varchar_assign_value,
4254             date_assign_value,
4255             creation_date,
4256             created_by,
4257             last_updated_by,
4258             last_update_date,
4259             last_update_login,
4260             aw_snapshot_flag,
4261             object_version_number)
4262          VALUES(
4263             v_attr_id,
4264             v_ver_id,
4265             v_ds_cd,
4266             null,
4267             null,
4268             v_attr_value,
4269             null,
4270             null,
4271             sysdate,
4272             c_user_id,
4273             c_user_id,
4274             sysdate,
4275             null,
4279       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
4276             c_aw_flg,
4277             c_obj_ver_no);
4278 
4280       THEN
4281          -----------------------------------------
4282          -- Attribute is an assigned varchar value
4283          -----------------------------------------
4284          INSERT INTO fem_datasets_attr(
4285             attribute_id,
4286             version_id,
4287             dataset_code,
4288             dim_attribute_numeric_member,
4289             dim_attribute_varchar_member,
4290             number_assign_value,
4291             varchar_assign_value,
4292             date_assign_value,
4293             creation_date,
4294             created_by,
4295             last_updated_by,
4296             last_update_date,
4297             last_update_login,
4298             aw_snapshot_flag,
4299             object_version_number)
4300          VALUES(
4301             v_attr_id,
4302             v_ver_id,
4303             v_ds_cd,
4304             null,
4305             null,
4306             null,
4307             v_attr_value,
4308             null,
4309             sysdate,
4310             c_user_id,
4311             c_user_id,
4312             sysdate,
4313             null,
4314             c_aw_flg,
4315             c_obj_ver_no);
4316 
4317       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
4318       THEN
4319          --------------------------------------
4320          -- Attribute is an assigned date value
4321          --------------------------------------
4322          INSERT INTO fem_datasets_attr(
4323             attribute_id,
4324             version_id,
4325             dataset_code,
4326             dim_attribute_numeric_member,
4327             dim_attribute_varchar_member,
4328             number_assign_value,
4329             varchar_assign_value,
4330             date_assign_value,
4331             creation_date,
4332             created_by,
4333             last_updated_by,
4334             last_update_date,
4335             last_update_login,
4336             aw_snapshot_flag,
4337             object_version_number)
4338          VALUES(
4339             v_attr_id,
4340             v_ver_id,
4341             v_ds_cd,
4342             null,
4343             null,
4344             null,
4345             null,
4346             v_attr_date,
4347             sysdate,
4348             c_user_id,
4349             c_user_id,
4350             sysdate,
4351             null,
4352             c_aw_flg,
4353             c_obj_ver_no);
4354       END IF;
4355    END IF;
4356 END LOOP;
4357 
4358 EXCEPTION
4359    WHEN e_bad_param_value THEN
4360    ROLLBACK;
4361       FEM_ENGINES_PKG.Put_Message(
4362          p_app_name => 'FEM',
4363          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
4364          p_token1 => 'PARAM',
4365          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4366                     p_attr_id => v_attr_id),
4367          p_token2 => 'VALUE',
4368          p_value2 => v_attr_value);
4369       x_err_code := 2;
4370       x_num_msg := x_num_msg + 1;
4371 
4372    WHEN e_null_param_value THEN
4373    ROLLBACK;
4374       FEM_ENGINES_PKG.Put_Message(
4375          p_app_name => 'FEM',
4376          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
4377          p_token1 => 'PARAM',
4378          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4379                     p_attr_id => v_attr_id));
4380       x_err_code := 2;
4381       x_num_msg := x_num_msg + 1;
4382 
4383    WHEN e_no_version_name THEN
4384    ROLLBACK;
4385       FEM_ENGINES_PKG.Put_Message(
4386          p_app_name => 'FEM',
4387          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
4388          p_token1 => 'ENTITY',
4389          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4390                         p_attr_id => v_attr_id));
4391       x_err_code := 2;
4392       x_num_msg := x_num_msg + 1;
4393 
4394    WHEN e_dup_display_code THEN
4395    ROLLBACK;
4396       FEM_ENGINES_PKG.Put_Message(
4397          p_app_name => 'FEM',
4398          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
4399          p_token1 => 'VALUE',
4400          p_value1 => p_display_code);
4401       x_err_code := 2;
4402       x_num_msg := x_num_msg + 1;
4403 
4404    WHEN e_user_exception THEN
4405    ROLLBACK;
4406       x_err_code := 2;
4407       x_num_msg := v_num_msg;
4408 
4409 END New_Dataset;
4410 
4411 ---------------------------------------------------------------
4412 
4413 PROCEDURE New_Dataset (
4414    p_api_version     IN NUMBER     DEFAULT c_api_version,
4415    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
4416    p_commit          IN VARCHAR2   DEFAULT c_false,
4417    p_encoded         IN VARCHAR2   DEFAULT c_true,
4418    x_return_status  OUT NOCOPY VARCHAR2,
4419    x_msg_count      OUT NOCOPY NUMBER,
4420    x_msg_data       OUT NOCOPY VARCHAR2,
4421    p_display_code    IN VARCHAR2,
4422    p_dataset_name    IN VARCHAR2,
4423    p_bal_type_cd     IN VARCHAR2,
4424    p_source_cd       IN NUMBER,
4425    p_pft_w_flg       IN VARCHAR2   DEFAULT 'Y',
4429    p_ver_name        IN VARCHAR2,
4426    p_prod_flg        IN VARCHAR2   DEFAULT 'Y',
4427    p_budget_id       IN NUMBER,
4428    p_enc_type_id     IN NUMBER,
4430    p_ver_disp_cd     IN VARCHAR2,
4431    p_dataset_desc    IN VARCHAR2
4432 )
4433 IS
4434 
4435 c_module_prg   CONSTANT   VARCHAR2(160) := c_module_pkg||'.new_dataset';
4436 
4437 c_dim_label    CONSTANT   VARCHAR2(30) := 'DATASET';
4438 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
4439 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
4440 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
4441 c_obj_ver_no   CONSTANT   NUMBER       := 1;
4442 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
4443 
4444 v_row_id       VARCHAR2(20) := '';
4445 
4446 v_dim_id       NUMBER;
4447 v_ds_cd        NUMBER;
4448 v_ver_id       NUMBER;
4449 v_attr_id      NUMBER;
4450 v_xdim_id      NUMBER;
4451 v_xdim_tab     VARCHAR2(30);
4452 v_xdim_col     VARCHAR2(30);
4453 v_xdim_cd_col  VARCHAR2(30);
4454 v_attr_col     VARCHAR2(30);
4455 v_reqd_flg     VARCHAR2(1);
4456 v_attr_value   VARCHAR2(1000);
4457 v_attr_date    DATE;
4458 v_attr_label   VARCHAR2(150);
4459 v_attr_num     NUMBER;
4460 v_attr_vch     VARCHAR2(30);
4461 
4462 v_sql_cmd      VARCHAR2(32767);
4463 
4464 CURSOR cv_dim_attr IS
4465    SELECT attribute_id,
4466           attribute_varchar_label,
4467           attribute_dimension_id,
4468           attribute_value_column_name,
4469           attribute_required_flag
4470    FROM fem_dim_attributes_b
4471    WHERE dimension_id =
4472       (SELECT dimension_id
4473        FROM fem_dimensions_b
4474        WHERE dimension_varchar_label = c_dim_label);
4475 
4476 TYPE cv_curs_type IS REF CURSOR;
4477 cv_attr_dim   cv_curs_type;
4478 
4479 BEGIN
4480 
4481 x_return_status := c_success;
4482 
4483 Validate_OA_Params (
4484    p_api_version => p_api_version,
4485    p_init_msg_list => p_init_msg_list,
4486    p_commit => p_commit,
4487    p_encoded => p_encoded,
4488    x_return_status => x_return_status);
4489 
4490 IF (x_return_status <> c_success)
4491 THEN
4492    FND_MSG_PUB.Count_and_Get(
4493       p_encoded => c_false,
4494       p_count => x_msg_count,
4495       p_data => x_msg_data);
4496    RETURN;
4497 END IF;
4498 
4499 ------------------------
4500 -- Get New Dataset ID --
4501 ------------------------
4502 SELECT dimension_id
4503 INTO v_dim_id
4504 FROM fem_dimensions_b
4505 WHERE dimension_varchar_label = c_dim_label;
4506 
4507 v_ds_cd := FEM_Dimension_Util_Pkg.Generate_Member_ID(
4508               p_api_version => p_api_version,
4509               p_init_msg_list => c_false,
4510               p_commit => c_false,
4511               p_encoded => p_encoded,
4512               x_return_status => x_return_status,
4513               x_msg_count => x_msg_count,
4514               x_msg_data => x_msg_data,
4515               p_dim_id => v_dim_id);
4516 
4517 IF (x_return_status <> c_success)
4518 THEN
4519    RETURN;
4520 END IF;
4521 
4522 -------------------------------
4523 -- Insert New Dataset Member --
4524 -------------------------------
4525 BEGIN
4526    FEM_DATASETS_PKG.INSERT_ROW(
4527       x_rowid => v_row_id,
4528       x_dataset_code => v_ds_cd,
4529       x_enabled_flag => c_enbld_flg,
4530       x_dataset_display_code => p_display_code,
4531       x_read_only_flag => c_ro_flg,
4532       x_personal_flag => c_pers_flg,
4533       x_object_version_number => c_obj_ver_no,
4534       x_dataset_name => p_dataset_name,
4535       x_description => p_dataset_desc,
4536       x_creation_date => sysdate,
4537       x_created_by => c_user_id,
4538       x_last_update_date => sysdate,
4539       x_last_updated_by => c_user_id,
4540       x_last_update_login => null);
4541 EXCEPTION
4542    WHEN dup_val_on_index THEN
4543       RAISE e_dup_display_code;
4544 END;
4545 
4546 -----------------------------------
4547 -- Insert New Dataset Attributes --
4548 -----------------------------------
4549 FOR r_dim_attr IN cv_dim_attr
4550 LOOP
4551    v_attr_id := r_dim_attr.attribute_id;
4552    v_attr_label := r_dim_attr.attribute_varchar_label;
4553    v_xdim_id := r_dim_attr.attribute_dimension_id;
4554    v_attr_col := r_dim_attr.attribute_value_column_name;
4555    v_reqd_flg := r_dim_attr.attribute_required_flag;
4556 
4557    -------------------------------
4558    -- Check Attribute's Version --
4559    -------------------------------
4560    SELECT MIN(version_id)
4561    INTO v_ver_id
4562    FROM fem_dim_attr_versions_b
4563    WHERE attribute_id = v_attr_id
4564    AND default_version_flag = 'Y';
4565 
4566    IF (v_ver_id IS NULL)
4567    THEN
4568       IF (p_ver_name IS NULL)
4569       THEN
4570          RAISE e_no_version_name;
4571       ELSIF (p_ver_disp_cd IS NULL)
4572       THEN
4573          RAISE e_no_version_name;
4574       END IF;
4575 
4576       SELECT fem_dim_attr_versions_b_s.NEXTVAL
4577       INTO v_ver_id FROM dual;
4578 
4579       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
4580          x_rowid => v_row_id,
4581          x_version_id => v_ver_id,
4585          x_default_version_flag => 'Y',
4582          x_aw_snapshot_flag => c_aw_flg,
4583          x_version_display_code => p_ver_disp_cd,
4584          x_object_version_number => c_obj_ver_no,
4586          x_personal_flag => c_pers_flg,
4587          x_attribute_id => v_attr_id,
4588          x_version_name => p_ver_name,
4589          x_description => null,
4590          x_creation_date => sysdate,
4591          x_created_by => c_user_id,
4592          x_last_update_date => sysdate,
4593          x_last_updated_by => c_user_id,
4594          x_last_update_login => null);
4595    END IF;
4596 
4597    -----------------------------
4598    -- Get Attribute Parameter --
4599    -----------------------------
4600    CASE v_attr_label
4601       WHEN 'DATASET_BALANCE_TYPE_CODE' THEN
4602          v_attr_value := p_bal_type_cd;
4603       WHEN 'SOURCE_SYSTEM_CODE' THEN
4604          v_attr_value := p_source_cd;
4605       WHEN 'PFT_ENG_WRITE_FLAG' THEN
4606          v_attr_value := p_pft_w_flg;
4607       WHEN 'PRODUCTION_FLAG' THEN
4608          v_attr_value := p_prod_flg;
4609       WHEN 'BUDGET_ID' THEN
4610          v_attr_value := p_budget_id;
4611       WHEN 'ENCUMBRANCE_TYPE_ID' THEN
4612          v_attr_value := p_enc_type_id;
4613       ELSE
4614          FEM_ENGINES_PKG.Tech_Message(
4615             p_severity => c_log_level_1,
4616             p_module => c_module_pkg||'.New_Dataset.bad_attr_list',
4617             p_msg_text => 'The Dataset attribute '||v_attr_label||
4618                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
4619                           ' the API''s list of attribute labels');
4620 
4621          FEM_ENGINES_PKG.Put_Message(
4622             p_app_name => 'FEM',
4623             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
4624             p_token1 => 'ATTR',
4625             p_value1 => v_attr_label);
4626    END CASE;
4627 
4628    IF (v_attr_value IS NULL)
4629    THEN
4630       CASE v_reqd_flg
4631          WHEN 'Y' THEN
4632             RAISE e_null_param_value;
4633          ELSE null;
4634       END CASE;
4635    ELSE
4636       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
4637           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
4638       THEN
4639          -------------------------------------
4640          -- Attribute is a Dimension Attribute
4641          -- which needs to be validated
4642          -------------------------------------
4643          SELECT member_b_table_name,
4644                 member_col
4645          INTO v_xdim_tab,
4646               v_xdim_col
4647          FROM fem_xdim_dimensions
4648          WHERE dimension_id = v_xdim_id;
4649 
4650          v_sql_cmd :=
4651             'SELECT '||v_xdim_col||
4652             ' FROM '||v_xdim_tab||
4653             ' WHERE '||v_xdim_col||' = :b_attr_value';
4654 
4655          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
4656          THEN
4657             BEGIN
4658                EXECUTE IMMEDIATE v_sql_cmd
4659                INTO v_attr_num
4660                USING v_attr_value;
4661             EXCEPTION
4662                WHEN no_data_found THEN
4663                   RAISE e_bad_param_value;
4664             END;
4665             v_attr_vch := '';
4666          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
4667          THEN
4668             BEGIN
4669                EXECUTE IMMEDIATE v_sql_cmd
4670                INTO v_attr_vch
4671                USING v_attr_value;
4672             EXCEPTION
4673                WHEN no_data_found THEN
4674                   RAISE e_bad_param_value;
4675             END;
4676             v_attr_num := '';
4677          END IF;
4678 
4679          INSERT INTO fem_datasets_attr(
4680             attribute_id,
4681             version_id,
4682             dataset_code,
4683             dim_attribute_numeric_member,
4684             dim_attribute_varchar_member,
4685             number_assign_value,
4686             varchar_assign_value,
4687             date_assign_value,
4688             creation_date,
4689             created_by,
4690             last_updated_by,
4691             last_update_date,
4692             last_update_login,
4693             aw_snapshot_flag,
4694             object_version_number)
4695          VALUES(
4696             v_attr_id,
4697             v_ver_id,
4698             v_ds_cd,
4699             v_attr_num,
4700             v_attr_vch,
4701             null,
4702             null,
4703             null,
4704             sysdate,
4705             c_user_id,
4706             c_user_id,
4707             sysdate,
4708             null,
4709             c_aw_flg,
4710             c_obj_ver_no);
4711 
4712       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
4713       THEN
4714          ----------------------------------------
4715          -- Attribute is an assigned number value
4716          ----------------------------------------
4717          INSERT INTO fem_datasets_attr(
4718             attribute_id,
4719             version_id,
4720             dataset_code,
4721             dim_attribute_numeric_member,
4722             dim_attribute_varchar_member,
4723             number_assign_value,
4727             created_by,
4724             varchar_assign_value,
4725             date_assign_value,
4726             creation_date,
4728             last_updated_by,
4729             last_update_date,
4730             last_update_login,
4731             aw_snapshot_flag,
4732             object_version_number)
4733          VALUES(
4734             v_attr_id,
4735             v_ver_id,
4736             v_ds_cd,
4737             null,
4738             null,
4739             v_attr_value,
4740             null,
4741             null,
4742             sysdate,
4743             c_user_id,
4744             c_user_id,
4745             sysdate,
4746             null,
4747             c_aw_flg,
4748             c_obj_ver_no);
4749 
4750       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
4751       THEN
4752          -----------------------------------------
4753          -- Attribute is an assigned varchar value
4754          -----------------------------------------
4755          INSERT INTO fem_datasets_attr(
4756             attribute_id,
4757             version_id,
4758             dataset_code,
4759             dim_attribute_numeric_member,
4760             dim_attribute_varchar_member,
4761             number_assign_value,
4762             varchar_assign_value,
4763             date_assign_value,
4764             creation_date,
4765             created_by,
4766             last_updated_by,
4767             last_update_date,
4768             last_update_login,
4769             aw_snapshot_flag,
4770             object_version_number)
4771          VALUES(
4772             v_attr_id,
4773             v_ver_id,
4774             v_ds_cd,
4775             null,
4776             null,
4777             null,
4778             v_attr_value,
4779             null,
4780             sysdate,
4781             c_user_id,
4782             c_user_id,
4783             sysdate,
4784             null,
4785             c_aw_flg,
4786             c_obj_ver_no);
4787 
4788       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
4789       THEN
4790          -----------------------------------------
4791          -- Attribute is an assigned date value
4792          -----------------------------------------
4793          INSERT INTO fem_datasets_attr(
4794             attribute_id,
4795             version_id,
4796             dataset_code,
4797             dim_attribute_numeric_member,
4798             dim_attribute_varchar_member,
4799             number_assign_value,
4800             varchar_assign_value,
4801             date_assign_value,
4802             creation_date,
4803             created_by,
4804             last_updated_by,
4805             last_update_date,
4806             last_update_login,
4807             aw_snapshot_flag,
4808             object_version_number)
4809          VALUES(
4810             v_attr_id,
4811             v_ver_id,
4812             v_ds_cd,
4813             null,
4814             null,
4815             null,
4816             null,
4817             v_attr_date,
4818             sysdate,
4819             c_user_id,
4820             c_user_id,
4821             sysdate,
4822             null,
4823             c_aw_flg,
4824             c_obj_ver_no);
4825       END IF;
4826    END IF;
4827 END LOOP;
4828 
4829 IF (p_commit = c_true)
4830 THEN
4831    COMMIT;
4832 END IF;
4833 
4834 FND_MSG_PUB.Count_and_Get(
4835    p_encoded => p_encoded,
4836    p_count => x_msg_count,
4837    p_data => x_msg_data);
4838 
4839 EXCEPTION
4840    WHEN e_bad_param_value THEN
4841       ROLLBACK;
4842       FEM_ENGINES_PKG.Put_Message(
4843          p_app_name => 'FEM',
4844          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
4845          p_token1 => 'PARAM',
4846          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4847                     p_attr_id => v_attr_id),
4848          p_token2 => 'VALUE',
4849          p_value2 => v_attr_value);
4850       FND_MSG_PUB.Count_and_Get(
4851          p_encoded => p_encoded,
4852          p_count => x_msg_count,
4853          p_data => x_msg_data);
4854       x_return_status := c_error;
4855 
4856    WHEN e_null_param_value THEN
4857       ROLLBACK;
4858       FEM_ENGINES_PKG.Put_Message(
4859          p_app_name => 'FEM',
4860          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
4861          p_token1 => 'PARAM',
4862          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4863                     p_attr_id => v_attr_id));
4864       FND_MSG_PUB.Count_and_Get(
4865          p_encoded => p_encoded,
4866          p_count => x_msg_count,
4867          p_data => x_msg_data);
4868       x_return_status := c_error;
4869 
4870    WHEN e_no_version_name THEN
4871       ROLLBACK;
4872       FEM_ENGINES_PKG.Put_Message(
4873          p_app_name => 'FEM',
4874          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
4875          p_token1 => 'ENTITY',
4876          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
4877                         p_attr_id => v_attr_id));
4878       FND_MSG_PUB.Count_and_Get(
4882       x_return_status := c_error;
4879          p_encoded => p_encoded,
4880          p_count => x_msg_count,
4881          p_data => x_msg_data);
4883 
4884    WHEN e_dup_display_code THEN
4885       ROLLBACK;
4886       FEM_ENGINES_PKG.Put_Message(
4887          p_app_name => 'FEM',
4888          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
4889          p_token1 => 'VALUE',
4890          p_value1 => p_display_code);
4891       FND_MSG_PUB.Count_and_Get(
4892          p_encoded => p_encoded,
4893          p_count => x_msg_count,
4894          p_data => x_msg_data);
4895       x_return_status := c_error;
4896 
4897 END New_Dataset;
4898 
4899 /*************************************************************************
4900 
4901                             New_Ledger
4902 
4903 *************************************************************************/
4904 
4905 PROCEDURE New_Ledger (
4906    p_display_code    IN VARCHAR2,
4907    p_ledger_name     IN VARCHAR2,
4908    p_func_curr_cd    IN VARCHAR2,
4909    p_source_cd       IN NUMBER,
4910    p_cal_per_hid     IN NUMBER,
4911    p_global_vs_id    IN NUMBER,
4912    p_epb_def_lg_flg  IN VARCHAR2,
4913    p_ent_curr_flg    IN VARCHAR2,
4914    p_avg_bal_flg     IN VARCHAR2,
4915    p_chan_flg        IN VARCHAR2 DEFAULT 'N',
4916    p_cctr_flg        IN VARCHAR2 DEFAULT 'N',
4917    p_cust_flg        IN VARCHAR2 DEFAULT 'N',
4918    p_geog_flg        IN VARCHAR2 DEFAULT 'N',
4919    p_ln_item_flg     IN VARCHAR2 DEFAULT 'N',
4920    p_nat_acct_flg    IN VARCHAR2 DEFAULT 'N',
4921    p_prod_flg        IN VARCHAR2 DEFAULT 'N',
4922    p_proj_flg        IN VARCHAR2 DEFAULT 'N',
4923    p_entity_flg      IN VARCHAR2 DEFAULT 'N',
4924    p_user1_flg       IN VARCHAR2 DEFAULT 'N',
4925    p_user2_flg       IN VARCHAR2 DEFAULT 'N',
4926    p_user3_flg       IN VARCHAR2 DEFAULT 'N',
4927    p_user4_flg       IN VARCHAR2 DEFAULT 'N',
4928    p_user5_flg       IN VARCHAR2 DEFAULT 'N',
4929    p_user6_flg       IN VARCHAR2 DEFAULT 'N',
4930    p_user7_flg       IN VARCHAR2 DEFAULT 'N',
4931    p_user8_flg       IN VARCHAR2 DEFAULT 'N',
4932    p_user9_flg       IN VARCHAR2 DEFAULT 'N',
4933    p_user10_flg      IN VARCHAR2 DEFAULT 'N',
4934    p_task_flg        IN VARCHAR2 DEFAULT 'N',
4935    p_fin_elem_flg    IN VARCHAR2 DEFAULT 'N',
4936    p_ver_name        IN VARCHAR2,
4937    p_ver_disp_cd     IN VARCHAR2,
4938    p_ledger_desc     IN VARCHAR2,
4939    x_err_code       OUT NOCOPY   NUMBER,
4940    x_num_msg        OUT NOCOPY   NUMBER
4941 )
4942 IS
4943 
4944 c_module_prg   VARCHAR2(160) := c_module_pkg||'.new_ledger';
4945 
4946 c_dim_label     CONSTANT   VARCHAR2(30) := 'LEDGER';
4947 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
4948 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
4949 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
4950 c_obj_ver_no   CONSTANT   NUMBER       := 1;
4951 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
4952 
4953 v_row_id       VARCHAR2(20) := '';
4954 
4955 v_prg_msg      VARCHAR2(4000);
4956 v_err_code     NUMBER;
4957 v_num_msg      NUMBER;
4958 v_err_msg      VARCHAR2(4000);
4959 
4960 v_dim_id       NUMBER;
4961 v_lg_id        NUMBER;
4962 v_ver_id       NUMBER;
4963 v_attr_id      NUMBER;
4964 v_xdim_id      NUMBER;
4965 v_xdim_tab     VARCHAR2(30);
4966 v_xdim_col     VARCHAR2(30);
4967 v_xdim_cd_col  VARCHAR2(30);
4968 v_attr_label   VARCHAR2(30);
4969 v_attr_col     VARCHAR2(30);
4970 v_reqd_flg     VARCHAR2(1);
4971 v_attr_value   VARCHAR2(1000);
4972 v_attr_date    DATE;
4973 v_attr_num     NUMBER;
4974 v_attr_vch     VARCHAR2(30);
4975 
4976 v_sql_cmd      VARCHAR2(32767);
4977 
4978 CURSOR cv_dim_attr IS
4979    SELECT attribute_id,
4980           attribute_varchar_label,
4981           attribute_dimension_id,
4982           attribute_value_column_name,
4983           attribute_required_flag
4984    FROM fem_dim_attributes_b
4985    WHERE dimension_id =
4986       (SELECT dimension_id
4987        FROM fem_dimensions_b
4988        WHERE dimension_varchar_label = c_dim_label);
4989 
4990 BEGIN
4991 
4992 x_err_code := 0;
4993 x_num_msg := 0;
4994 
4995 ------------------------
4996 -- Get New Ledger ID --
4997 ------------------------
4998 SELECT dimension_id
4999 INTO v_dim_id
5000 FROM fem_dimensions_b
5001 WHERE dimension_varchar_label = c_dim_label;
5002 
5003 v_lg_id := FEM_Dimension_Util_Pkg.Generate_Member_ID(
5004               p_dim_id => v_dim_id,
5005               x_err_code => v_err_code,
5006               x_num_msg => v_num_msg);
5007 IF (v_err_code > 0)
5008 THEN
5009    RAISE e_user_exception;
5010 END IF;
5011 
5012 ------------------------------
5013 -- Insert New Ledger Member --
5014 ------------------------------
5015 BEGIN
5016    FEM_LEDGERS_PKG.INSERT_ROW(
5017       x_rowid => v_row_id,
5018       x_ledger_id => v_lg_id,
5019       x_personal_flag => c_pers_flg,
5020       x_read_only_flag => c_ro_flg,
5021       x_object_version_number => c_obj_ver_no,
5022       x_enabled_flag => c_enbld_flg,
5023       x_ledger_display_code => p_display_code,
5024       x_ledger_name => p_ledger_name,
5025       x_description => p_ledger_desc,
5029       x_last_updated_by => c_user_id,
5026       x_creation_date => sysdate,
5027       x_created_by => c_user_id,
5028       x_last_update_date => sysdate,
5030       x_last_update_login => null);
5031 EXCEPTION
5032    WHEN dup_val_on_index THEN
5033       RAISE e_dup_display_code;
5034 END;
5035 
5036 ----------------------------------
5037 -- Insert New Ledger Attributes --
5038 ----------------------------------
5039 FOR r_dim_attr IN cv_dim_attr
5040 LOOP
5041    v_attr_id := r_dim_attr.attribute_id;
5042    v_attr_label := r_dim_attr.attribute_varchar_label;
5043    v_xdim_id := r_dim_attr.attribute_dimension_id;
5044    v_attr_col := r_dim_attr.attribute_value_column_name;
5045    v_reqd_flg := r_dim_attr.attribute_required_flag;
5046 
5047    -------------------------------
5048    -- Check Attribute's Version --
5049    -------------------------------
5050    SELECT MIN(version_id)
5051    INTO v_ver_id
5052    FROM fem_dim_attr_versions_b
5053    WHERE attribute_id = v_attr_id
5054    AND default_version_flag = 'Y';
5055 
5056    IF (v_ver_id IS NULL)
5057    THEN
5058       IF (p_ver_name IS NULL)
5059       THEN
5060          RAISE e_no_version_name;
5061       ELSIF (p_ver_disp_cd IS NULL)
5062       THEN
5063          RAISE e_no_version_name;
5064       END IF;
5065 
5066       SELECT fem_dim_attr_versions_b_s.NEXTVAL
5067       INTO v_ver_id FROM dual;
5068 
5069       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
5070          x_rowid => v_row_id,
5071          x_version_id => v_ver_id,
5072          x_aw_snapshot_flag => c_aw_flg,
5073          x_version_display_code => p_ver_disp_cd,
5074          x_object_version_number => c_obj_ver_no,
5075          x_default_version_flag => 'Y',
5076          x_personal_flag => c_pers_flg,
5077          x_attribute_id => v_attr_id,
5078          x_version_name => p_ver_name,
5079          x_description => null,
5080          x_creation_date => sysdate,
5081          x_created_by => c_user_id,
5082          x_last_update_date => sysdate,
5083          x_last_updated_by => c_user_id,
5084          x_last_update_login => null);
5085    END IF;
5086 
5087    -----------------------------
5088    -- Get Attribute Parameter --
5089    -----------------------------
5090    CASE v_attr_label
5091       WHEN 'LEDGER_FUNCTIONAL_CRNCY_CODE' THEN
5092          v_attr_value := p_func_curr_cd;
5093       WHEN 'SOURCE_SYSTEM_CODE' THEN
5094          v_attr_value := p_source_cd;
5095       WHEN 'CAL_PERIOD_HIER_OBJ_DEF_ID' THEN
5096          v_attr_value := p_cal_per_hid;
5097       WHEN 'GLOBAL_VS_COMBO' THEN
5098          v_attr_value := p_global_vs_id;
5099       WHEN 'EPB_DEFAULT_LEDGER_FLAG' THEN
5100          v_attr_value := null;
5101       WHEN 'ENTERED_CRNCY_ENABLE_FLAG' THEN
5102          v_attr_value := p_ent_curr_flg;
5103       WHEN 'LEDGER_ENABLE_AVG_BAL_FLAG' THEN
5104          v_attr_value := p_avg_bal_flg;
5105       WHEN 'LEDGER_CHANNEL_IS_POP_FLAG' THEN
5106          v_attr_value := p_chan_flg;
5107       WHEN 'LEDGER_CCTR_IS_POP_FLAG' THEN
5108          v_attr_value := p_cctr_flg;
5109       WHEN 'LEDGER_CUSTOMER_IS_POP_FLAG' THEN
5110          v_attr_value := p_cust_flg;
5111       WHEN 'LEDGER_GEOGRAPHY_IS_POP_FLAG' THEN
5112          v_attr_value := p_geog_flg;
5113       WHEN 'LEDGER_LINE_ITEM_IS_POP_FLAG' THEN
5114          v_attr_value := p_ln_item_flg;
5115       WHEN 'LEDGER_NAT_ACCT_IS_POP_FLAG' THEN
5116          v_attr_value := p_nat_acct_flg;
5117       WHEN 'LEDGER_PRODUCT_IS_POP_FLAG' THEN
5118          v_attr_value := p_prod_flg;
5119       WHEN 'LEDGER_PROJECT_IS_POP_FLAG' THEN
5120          v_attr_value := p_proj_flg;
5121       WHEN 'LEDGER_ENTITY_IS_POP_FLAG' THEN
5122          v_attr_value := p_entity_flg;
5123       WHEN 'LEDGER_USER_DIM1_IS_POP_FLAG' THEN
5124          v_attr_value := p_user1_flg;
5125       WHEN 'LEDGER_USER_DIM2_IS_POP_FLAG' THEN
5126          v_attr_value := p_user2_flg;
5127       WHEN 'LEDGER_USER_DIM3_IS_POP_FLAG' THEN
5128          v_attr_value := p_user3_flg;
5129       WHEN 'LEDGER_USER_DIM4_IS_POP_FLAG' THEN
5130          v_attr_value := p_user4_flg;
5131       WHEN 'LEDGER_USER_DIM5_IS_POP_FLAG' THEN
5132          v_attr_value := p_user5_flg;
5133       WHEN 'LEDGER_USER_DIM6_IS_POP_FLAG' THEN
5134          v_attr_value := p_user6_flg;
5135       WHEN 'LEDGER_USER_DIM7_IS_POP_FLAG' THEN
5136          v_attr_value := p_user7_flg;
5137       WHEN 'LEDGER_USER_DIM8_IS_POP_FLAG' THEN
5138          v_attr_value := p_user8_flg;
5139       WHEN 'LEDGER_USER_DIM9_IS_POP_FLAG' THEN
5140          v_attr_value := p_user9_flg;
5141       WHEN 'LEDGER_USER_DIM10_IS_POP_FLAG' THEN
5142          v_attr_value := p_user10_flg;
5143       WHEN 'LEDGER_TASK_IS_POP_FLAG' THEN
5144          v_attr_value := p_task_flg;
5145       WHEN 'LEDGER_FIN_ELEM_IS_POP_FLAG' THEN
5146          v_attr_value := p_fin_elem_flg;
5147       ELSE
5148          FEM_ENGINES_PKG.Tech_Message(
5149             p_severity => c_log_level_1,
5150             p_module => c_module_pkg||'.New_Ledger.bad_attr_list',
5151             p_msg_text => 'The Ledger attribute '||v_attr_label||
5152                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
5153                           ' the API''s list of attribute labels');
5154 
5158             p_token1 => 'ATTR',
5155          FEM_ENGINES_PKG.Put_Message(
5156             p_app_name => 'FEM',
5157             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
5159             p_value1 => v_attr_label);
5160 
5161          x_err_code := 1;
5162          x_num_msg := x_num_msg + 1;
5163    END CASE;
5164 
5165    IF (v_attr_value IS NULL)
5166    THEN
5167       CASE v_reqd_flg
5168          WHEN 'Y' THEN
5169             RAISE e_null_param_value;
5170          ELSE null;
5171       END CASE;
5172    ELSE
5173       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
5174           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
5175       THEN
5176          -------------------------------------
5177          -- Attribute is a Dimension Attribute
5178          -- which needs to be validated
5179          -------------------------------------
5180          SELECT member_b_table_name,
5181                 member_col
5182          INTO v_xdim_tab,
5183               v_xdim_col
5184          FROM fem_xdim_dimensions
5185          WHERE dimension_id = v_xdim_id;
5186 
5187          v_sql_cmd :=
5188             'SELECT '||v_xdim_col||
5189             ' FROM '||v_xdim_tab||
5190             ' WHERE '||v_xdim_col||' = :b_attr_value';
5191 
5192          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
5193          THEN
5194             BEGIN
5195                EXECUTE IMMEDIATE v_sql_cmd
5196                INTO v_attr_num
5197                USING v_attr_value;
5198             EXCEPTION
5199                WHEN no_data_found THEN
5200                   RAISE e_bad_param_value;
5201             END;
5202             v_attr_vch := '';
5203          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
5204          THEN
5205             BEGIN
5206                EXECUTE IMMEDIATE v_sql_cmd
5207                INTO v_attr_vch
5208                USING v_attr_value;
5209             EXCEPTION
5210                WHEN no_data_found THEN
5211                   RAISE e_bad_param_value;
5212             END;
5213             v_attr_num := '';
5214          END IF;
5215 
5216          INSERT INTO fem_ledgers_attr(
5217             attribute_id,
5218             version_id,
5219             ledger_id,
5220             dim_attribute_numeric_member,
5221             dim_attribute_varchar_member,
5222             number_assign_value,
5223             varchar_assign_value,
5224             date_assign_value,
5225             creation_date,
5226             created_by,
5227             last_updated_by,
5228             last_update_date,
5229             last_update_login,
5230             object_version_number,
5231             aw_snapshot_flag)
5232          VALUES(
5233             v_attr_id,
5234             v_ver_id,
5235             v_lg_id,
5236             v_attr_num,
5237             v_attr_vch,
5238             null,
5239             null,
5240             null,
5241             sysdate,
5242             c_user_id,
5243             c_user_id,
5244             sysdate,
5245             null,
5246             c_obj_ver_no,
5247             c_aw_flg);
5248 
5249       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
5250       THEN
5251          ----------------------------------------
5252          -- Attribute is an assigned number value
5253          ----------------------------------------
5254          INSERT INTO fem_ledgers_attr(
5255             attribute_id,
5256             version_id,
5257             ledger_id,
5258             dim_attribute_numeric_member,
5259             dim_attribute_varchar_member,
5260             number_assign_value,
5261             varchar_assign_value,
5262             date_assign_value,
5263             creation_date,
5264             created_by,
5265             last_updated_by,
5266             last_update_date,
5267             last_update_login,
5268             object_version_number,
5269             aw_snapshot_flag)
5270          VALUES(
5271             v_attr_id,
5272             v_ver_id,
5273             v_lg_id,
5274             null,
5275             null,
5276             v_attr_value,
5277             null,
5278             null,
5279             sysdate,
5280             c_user_id,
5281             c_user_id,
5282             sysdate,
5283             null,
5284             c_obj_ver_no,
5285             c_aw_flg);
5286 
5287       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
5288       THEN
5289          -----------------------------------------
5290          -- Attribute is an assigned varchar value
5291          -----------------------------------------
5292          INSERT INTO fem_ledgers_attr(
5293             attribute_id,
5294             version_id,
5295             ledger_id,
5296             dim_attribute_numeric_member,
5297             dim_attribute_varchar_member,
5298             number_assign_value,
5299             varchar_assign_value,
5300             date_assign_value,
5301             creation_date,
5302             created_by,
5303             last_updated_by,
5304             last_update_date,
5305             last_update_login,
5309             v_attr_id,
5306             object_version_number,
5307             aw_snapshot_flag)
5308          VALUES(
5310             v_ver_id,
5311             v_lg_id,
5312             null,
5313             null,
5314             null,
5315             v_attr_value,
5316             null,
5317             sysdate,
5318             c_user_id,
5319             c_user_id,
5320             sysdate,
5321             null,
5322             c_obj_ver_no,
5323             c_aw_flg);
5324 
5325       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
5326       THEN
5327          --------------------------------------
5328          -- Attribute is an assigned date value
5329          --------------------------------------
5330          INSERT INTO fem_ledgers_attr(
5331             attribute_id,
5332             version_id,
5333             ledger_id,
5334             dim_attribute_numeric_member,
5335             dim_attribute_varchar_member,
5336             number_assign_value,
5337             varchar_assign_value,
5338             date_assign_value,
5339             creation_date,
5340             created_by,
5341             last_updated_by,
5342             last_update_date,
5343             last_update_login,
5344             object_version_number,
5345             aw_snapshot_flag)
5346          VALUES(
5347             v_attr_id,
5348             v_ver_id,
5349             v_lg_id,
5350             null,
5351             null,
5352             null,
5353             null,
5354             v_attr_date,
5355             sysdate,
5356             c_user_id,
5357             c_user_id,
5358             sysdate,
5359             null,
5360             c_obj_ver_no,
5361             c_aw_flg);
5362 
5363       END IF;
5364    END IF;
5365 END LOOP;
5366 
5367 EXCEPTION
5368    WHEN e_bad_param_value THEN
5369    ROLLBACK;
5370       FEM_ENGINES_PKG.Put_Message(
5371          p_app_name => 'FEM',
5372          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
5373          p_token1 => 'PARAM',
5374          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5375                         p_attr_id => v_attr_id),
5376          p_trans1 => 'n',
5377          p_token2 => 'VALUE',
5378          p_value2 => v_attr_value);
5379       x_err_code := 2;
5380       x_num_msg := x_num_msg + 1;
5381 
5382    WHEN e_null_param_value THEN
5383    ROLLBACK;
5384       FEM_ENGINES_PKG.Put_Message(
5385          p_app_name => 'FEM',
5386          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
5387          p_token1 => 'PARAM',
5388          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5389                         p_attr_id => v_attr_id));
5390       x_err_code := 2;
5391       x_num_msg := x_num_msg + 1;
5392 
5393    WHEN e_no_version_name THEN
5394    ROLLBACK;
5395       FEM_ENGINES_PKG.Put_Message(
5396          p_app_name => 'FEM',
5397          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
5398          p_token1 => 'ENTITY',
5399          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5400                         p_attr_id => v_attr_id));
5401       x_err_code := 2;
5402       x_num_msg := x_num_msg + 1;
5403 
5404    WHEN e_dup_display_code THEN
5405    ROLLBACK;
5406       FEM_ENGINES_PKG.Put_Message(
5407          p_app_name => 'FEM',
5408          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
5409          p_token1 => 'VALUE',
5410          p_value1 => p_display_code);
5411       x_err_code := 2;
5412       x_num_msg := x_num_msg + 1;
5413 
5414    WHEN e_user_exception THEN
5415    ROLLBACK;
5416 
5417       x_err_code := 2;
5418       x_num_msg := v_num_msg;
5419 
5420 END New_Ledger;
5421 
5422 ------------------------------------------------------------------
5423 
5424 PROCEDURE New_Ledger (
5425    p_api_version     IN NUMBER     DEFAULT c_api_version,
5426    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
5427    p_commit          IN VARCHAR2   DEFAULT c_false,
5428    p_encoded         IN VARCHAR2   DEFAULT c_true,
5429    x_return_status  OUT NOCOPY VARCHAR2,
5430    x_msg_count      OUT NOCOPY NUMBER,
5431    x_msg_data       OUT NOCOPY VARCHAR2,
5432    p_display_code    IN VARCHAR2,
5433    p_ledger_name     IN VARCHAR2,
5434    p_func_curr_cd    IN VARCHAR2,
5435    p_source_cd       IN NUMBER,
5436    p_cal_per_hid     IN NUMBER,
5437    p_global_vs_id    IN NUMBER,
5438    p_epb_def_lg_flg  IN VARCHAR2,
5439    p_ent_curr_flg    IN VARCHAR2,
5440    p_avg_bal_flg     IN VARCHAR2,
5441    p_chan_flg        IN VARCHAR2 DEFAULT 'N',
5442    p_cctr_flg        IN VARCHAR2 DEFAULT 'N',
5443    p_cust_flg        IN VARCHAR2 DEFAULT 'N',
5444    p_geog_flg        IN VARCHAR2 DEFAULT 'N',
5445    p_ln_item_flg     IN VARCHAR2 DEFAULT 'N',
5446    p_nat_acct_flg    IN VARCHAR2 DEFAULT 'N',
5447    p_prod_flg        IN VARCHAR2 DEFAULT 'N',
5448    p_proj_flg        IN VARCHAR2 DEFAULT 'N',
5449    p_entity_flg      IN VARCHAR2 DEFAULT 'N',
5450    p_user1_flg       IN VARCHAR2 DEFAULT 'N',
5451    p_user2_flg       IN VARCHAR2 DEFAULT 'N',
5452    p_user3_flg       IN VARCHAR2 DEFAULT 'N',
5453    p_user4_flg       IN VARCHAR2 DEFAULT 'N',
5454    p_user5_flg       IN VARCHAR2 DEFAULT 'N',
5458    p_user9_flg       IN VARCHAR2 DEFAULT 'N',
5455    p_user6_flg       IN VARCHAR2 DEFAULT 'N',
5456    p_user7_flg       IN VARCHAR2 DEFAULT 'N',
5457    p_user8_flg       IN VARCHAR2 DEFAULT 'N',
5459    p_user10_flg      IN VARCHAR2 DEFAULT 'N',
5460    p_task_flg        IN VARCHAR2 DEFAULT 'N',
5461    p_fin_elem_flg    IN VARCHAR2 DEFAULT 'N',
5462    p_ver_name        IN VARCHAR2,
5463    p_ver_disp_cd     IN VARCHAR2,
5464    p_ledger_desc     IN VARCHAR2
5465 )
5466 IS
5467 
5468 c_module_prg   VARCHAR2(160) := c_module_pkg||'.new_ledger';
5469 
5470 c_dim_label    CONSTANT   VARCHAR2(30) := 'LEDGER';
5471 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
5472 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
5473 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
5474 c_obj_ver_no   CONSTANT   NUMBER       := 1;
5475 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
5476 
5477 v_row_id       VARCHAR2(20) := '';
5478 
5479 v_dim_id       NUMBER;
5480 v_lg_id        NUMBER;
5481 v_ver_id       NUMBER;
5482 v_attr_id      NUMBER;
5483 v_xdim_id      NUMBER;
5484 v_xdim_tab     VARCHAR2(30);
5485 v_xdim_col     VARCHAR2(30);
5486 v_xdim_cd_col  VARCHAR2(30);
5487 v_attr_label   VARCHAR2(30);
5488 v_attr_col     VARCHAR2(30);
5489 v_reqd_flg     VARCHAR2(1);
5490 v_attr_value   VARCHAR2(1000);
5491 v_attr_date    DATE;
5492 v_attr_num     NUMBER;
5493 v_attr_vch     VARCHAR2(30);
5494 
5495 v_sql_cmd      VARCHAR2(32767);
5496 
5497 CURSOR cv_dim_attr IS
5498    SELECT attribute_id,
5499           attribute_varchar_label,
5500           attribute_dimension_id,
5501           attribute_value_column_name,
5502           attribute_required_flag
5503    FROM fem_dim_attributes_b
5504    WHERE dimension_id =
5505       (SELECT dimension_id
5506        FROM fem_dimensions_b
5507        WHERE dimension_varchar_label = c_dim_label);
5508 
5509 BEGIN
5510 
5511 x_return_status := c_success;
5512 
5513 Validate_OA_Params (
5514    p_api_version => p_api_version,
5515    p_init_msg_list => p_init_msg_list,
5516    p_commit => p_commit,
5517    p_encoded => p_encoded,
5518    x_return_status => x_return_status);
5519 
5520 IF (x_return_status <> c_success)
5521 THEN
5522    FND_MSG_PUB.Count_and_Get(
5523       p_encoded => c_false,
5524       p_count => x_msg_count,
5525       p_data => x_msg_data);
5526    RETURN;
5527 END IF;
5528 
5529 ------------------------
5530 -- Get New Ledger ID --
5531 ------------------------
5532 SELECT dimension_id
5533 INTO v_dim_id
5534 FROM fem_dimensions_b
5535 WHERE dimension_varchar_label = c_dim_label;
5536 
5537 v_lg_id := FEM_Dimension_Util_Pkg.Generate_Member_ID(
5538               p_api_version => p_api_version,
5539               p_init_msg_list => c_false,
5540               p_commit => c_false,
5541               p_encoded => p_encoded,
5542               x_return_status => x_return_status,
5543               x_msg_count => x_msg_count,
5544               x_msg_data => x_msg_data,
5545               p_dim_id => v_dim_id);
5546 
5547 IF (x_return_status <> c_success)
5548 THEN
5549    RETURN;
5550 END IF;
5551 
5552 ------------------------------
5553 -- Insert New Ledger Member --
5554 ------------------------------
5555 BEGIN
5556    FEM_LEDGERS_PKG.INSERT_ROW(
5557       x_rowid => v_row_id,
5558       x_ledger_id => v_lg_id,
5559       x_personal_flag => c_pers_flg,
5560       x_read_only_flag => c_ro_flg,
5561       x_object_version_number => c_obj_ver_no,
5562       x_enabled_flag => c_enbld_flg,
5563       x_ledger_display_code => p_display_code,
5564       x_ledger_name => p_ledger_name,
5565       x_description => p_ledger_desc,
5566       x_creation_date => sysdate,
5567       x_created_by => c_user_id,
5568       x_last_update_date => sysdate,
5569       x_last_updated_by => c_user_id,
5570       x_last_update_login => null);
5571 EXCEPTION
5572    WHEN dup_val_on_index THEN
5573       RAISE e_dup_display_code;
5574 END;
5575 
5576 ----------------------------------
5577 -- Insert New Ledger Attributes --
5578 ----------------------------------
5579 FOR r_dim_attr IN cv_dim_attr
5580 LOOP
5581    v_attr_id := r_dim_attr.attribute_id;
5582    v_attr_label := r_dim_attr.attribute_varchar_label;
5583    v_xdim_id := r_dim_attr.attribute_dimension_id;
5584    v_attr_col := r_dim_attr.attribute_value_column_name;
5585    v_reqd_flg := r_dim_attr.attribute_required_flag;
5586 
5587    -------------------------------
5588    -- Check Attribute's Version --
5589    -------------------------------
5590    SELECT MIN(version_id)
5591    INTO v_ver_id
5592    FROM fem_dim_attr_versions_b
5593    WHERE attribute_id = v_attr_id
5594    AND default_version_flag = 'Y';
5595 
5596    IF (v_ver_id IS NULL)
5597    THEN
5598       IF (p_ver_name IS NULL)
5599       THEN
5600          RAISE e_no_version_name;
5601       ELSIF (p_ver_disp_cd IS NULL)
5602       THEN
5603          RAISE e_no_version_name;
5604       END IF;
5605 
5606       SELECT fem_dim_attr_versions_b_s.NEXTVAL
5607       INTO v_ver_id FROM dual;
5608 
5609       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
5610          x_rowid => v_row_id,
5614          x_object_version_number => c_obj_ver_no,
5611          x_version_id => v_ver_id,
5612          x_aw_snapshot_flag => c_aw_flg,
5613          x_version_display_code => p_ver_disp_cd,
5615          x_default_version_flag => 'Y',
5616          x_personal_flag => c_pers_flg,
5617          x_attribute_id => v_attr_id,
5618          x_version_name => p_ver_name,
5619          x_description => null,
5620          x_creation_date => sysdate,
5621          x_created_by => c_user_id,
5622          x_last_update_date => sysdate,
5623          x_last_updated_by => c_user_id,
5624          x_last_update_login => null);
5625    END IF;
5626 
5627    -----------------------------
5628    -- Get Attribute Parameter --
5629    -----------------------------
5630    CASE v_attr_label
5631       WHEN 'LEDGER_FUNCTIONAL_CRNCY_CODE' THEN
5632          v_attr_value := p_func_curr_cd;
5633       WHEN 'SOURCE_SYSTEM_CODE' THEN
5634          v_attr_value := p_source_cd;
5635       WHEN 'CAL_PERIOD_HIER_OBJ_DEF_ID' THEN
5636          v_attr_value := p_cal_per_hid;
5637       WHEN 'GLOBAL_VS_COMBO' THEN
5638          v_attr_value := p_global_vs_id;
5639       WHEN 'EPB_DEFAULT_LEDGER_FLAG' THEN
5640          v_attr_value := null;
5641       WHEN 'ENTERED_CRNCY_ENABLE_FLAG' THEN
5642          v_attr_value := p_ent_curr_flg;
5643       WHEN 'LEDGER_ENABLE_AVG_BAL_FLAG' THEN
5644          v_attr_value := p_avg_bal_flg;
5645       WHEN 'LEDGER_CHANNEL_IS_POP_FLAG' THEN
5646          v_attr_value := p_chan_flg;
5647       WHEN 'LEDGER_CCTR_IS_POP_FLAG' THEN
5648          v_attr_value := p_cctr_flg;
5649       WHEN 'LEDGER_CUSTOMER_IS_POP_FLAG' THEN
5650          v_attr_value := p_cust_flg;
5651       WHEN 'LEDGER_GEOGRAPHY_IS_POP_FLAG' THEN
5652          v_attr_value := p_geog_flg;
5653       WHEN 'LEDGER_LINE_ITEM_IS_POP_FLAG' THEN
5654          v_attr_value := p_ln_item_flg;
5655       WHEN 'LEDGER_NAT_ACCT_IS_POP_FLAG' THEN
5656          v_attr_value := p_nat_acct_flg;
5657       WHEN 'LEDGER_PRODUCT_IS_POP_FLAG' THEN
5658          v_attr_value := p_prod_flg;
5659       WHEN 'LEDGER_PROJECT_IS_POP_FLAG' THEN
5660          v_attr_value := p_proj_flg;
5661       WHEN 'LEDGER_ENTITY_IS_POP_FLAG' THEN
5662          v_attr_value := p_entity_flg;
5663       WHEN 'LEDGER_USER_DIM1_IS_POP_FLAG' THEN
5664          v_attr_value := p_user1_flg;
5665       WHEN 'LEDGER_USER_DIM2_IS_POP_FLAG' THEN
5666          v_attr_value := p_user2_flg;
5667       WHEN 'LEDGER_USER_DIM3_IS_POP_FLAG' THEN
5668          v_attr_value := p_user3_flg;
5669       WHEN 'LEDGER_USER_DIM4_IS_POP_FLAG' THEN
5670          v_attr_value := p_user4_flg;
5671       WHEN 'LEDGER_USER_DIM5_IS_POP_FLAG' THEN
5672          v_attr_value := p_user5_flg;
5673       WHEN 'LEDGER_USER_DIM6_IS_POP_FLAG' THEN
5674          v_attr_value := p_user6_flg;
5675       WHEN 'LEDGER_USER_DIM7_IS_POP_FLAG' THEN
5676          v_attr_value := p_user7_flg;
5677       WHEN 'LEDGER_USER_DIM8_IS_POP_FLAG' THEN
5678          v_attr_value := p_user8_flg;
5679       WHEN 'LEDGER_USER_DIM9_IS_POP_FLAG' THEN
5680          v_attr_value := p_user9_flg;
5681       WHEN 'LEDGER_USER_DIM10_IS_POP_FLAG' THEN
5682          v_attr_value := p_user10_flg;
5683       WHEN 'LEDGER_TASK_IS_POP_FLAG' THEN
5684          v_attr_value := p_task_flg;
5685       WHEN 'LEDGER_FIN_ELEM_IS_POP_FLAG' THEN
5686          v_attr_value := p_fin_elem_flg;
5687       ELSE
5688          FEM_ENGINES_PKG.Tech_Message(
5689             p_severity => c_log_level_1,
5690             p_module => c_module_pkg||'.New_Ledger.bad_attr_list',
5691             p_msg_text => 'The Ledger attribute '||v_attr_label||
5692                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
5693                           ' the API''s list of attribute labels');
5694 
5695          FEM_ENGINES_PKG.Put_Message(
5696             p_app_name => 'FEM',
5697             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
5698             p_token1 => 'ATTR',
5699             p_value1 => v_attr_label);
5700    END CASE;
5701 
5702    IF (v_attr_value IS NULL)
5703    THEN
5704       CASE v_reqd_flg
5705          WHEN 'Y' THEN
5706             RAISE e_null_param_value;
5707          ELSE null;
5708       END CASE;
5709    ELSE
5710       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
5711           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
5712       THEN
5713          -------------------------------------
5714          -- Attribute is a Dimension Attribute
5715          -- which needs to be validated
5716          -------------------------------------
5717          SELECT member_b_table_name,
5718                 member_col
5719          INTO v_xdim_tab,
5720               v_xdim_col
5721          FROM fem_xdim_dimensions
5722          WHERE dimension_id = v_xdim_id;
5723 
5724          v_sql_cmd :=
5725             'SELECT '||v_xdim_col||
5726             ' FROM '||v_xdim_tab||
5727             ' WHERE '||v_xdim_col||' = :b_attr_value';
5728 
5729          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
5730          THEN
5731             BEGIN
5732                EXECUTE IMMEDIATE v_sql_cmd
5733                INTO v_attr_num
5734                USING v_attr_value;
5735             EXCEPTION
5736                WHEN no_data_found THEN
5737                   RAISE e_bad_param_value;
5738             END;
5739             v_attr_vch := '';
5743                EXECUTE IMMEDIATE v_sql_cmd
5740          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
5741          THEN
5742             BEGIN
5744                INTO v_attr_vch
5745                USING v_attr_value;
5746             EXCEPTION
5747                WHEN no_data_found THEN
5748                   RAISE e_bad_param_value;
5749             END;
5750             v_attr_num := '';
5751          END IF;
5752 
5753          INSERT INTO fem_ledgers_attr(
5754             attribute_id,
5755             version_id,
5756             ledger_id,
5757             dim_attribute_numeric_member,
5758             dim_attribute_varchar_member,
5759             number_assign_value,
5760             varchar_assign_value,
5761             date_assign_value,
5762             creation_date,
5763             created_by,
5764             last_updated_by,
5765             last_update_date,
5766             last_update_login,
5767             object_version_number,
5768             aw_snapshot_flag)
5769          VALUES(
5770             v_attr_id,
5771             v_ver_id,
5772             v_lg_id,
5773             v_attr_num,
5774             v_attr_vch,
5775             null,
5776             null,
5777             null,
5778             sysdate,
5779             c_user_id,
5780             c_user_id,
5781             sysdate,
5782             null,
5783             c_obj_ver_no,
5784             c_aw_flg);
5785 
5786       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
5787       THEN
5788          ----------------------------------------
5789          -- Attribute is an assigned number value
5790          ----------------------------------------
5791          INSERT INTO fem_ledgers_attr(
5792             attribute_id,
5793             version_id,
5794             ledger_id,
5795             dim_attribute_numeric_member,
5796             dim_attribute_varchar_member,
5797             number_assign_value,
5798             varchar_assign_value,
5799             date_assign_value,
5800             creation_date,
5801             created_by,
5802             last_updated_by,
5803             last_update_date,
5804             last_update_login,
5805             object_version_number,
5806             aw_snapshot_flag)
5807          VALUES(
5808             v_attr_id,
5809             v_ver_id,
5810             v_lg_id,
5811             null,
5812             null,
5813             v_attr_value,
5814             null,
5815             null,
5816             sysdate,
5817             c_user_id,
5818             c_user_id,
5819             sysdate,
5820             null,
5821             c_obj_ver_no,
5822             c_aw_flg);
5823 
5824       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
5825       THEN
5826          -----------------------------------------
5827          -- Attribute is an assigned varchar value
5828          -----------------------------------------
5829          INSERT INTO fem_ledgers_attr(
5830             attribute_id,
5831             version_id,
5832             ledger_id,
5833             dim_attribute_numeric_member,
5834             dim_attribute_varchar_member,
5835             number_assign_value,
5836             varchar_assign_value,
5837             date_assign_value,
5838             creation_date,
5839             created_by,
5840             last_updated_by,
5841             last_update_date,
5842             last_update_login,
5843             object_version_number,
5844             aw_snapshot_flag)
5845          VALUES(
5846             v_attr_id,
5847             v_ver_id,
5848             v_lg_id,
5849             null,
5850             null,
5851             null,
5852             v_attr_value,
5853             null,
5854             sysdate,
5855             c_user_id,
5856             c_user_id,
5857             sysdate,
5858             null,
5859             c_obj_ver_no,
5860             c_aw_flg);
5861 
5862       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
5863       THEN
5864          --------------------------------------
5865          -- Attribute is an assigned date value
5866          --------------------------------------
5867          INSERT INTO fem_ledgers_attr(
5868             attribute_id,
5869             version_id,
5870             ledger_id,
5871             dim_attribute_numeric_member,
5872             dim_attribute_varchar_member,
5873             number_assign_value,
5874             varchar_assign_value,
5875             date_assign_value,
5876             creation_date,
5877             created_by,
5878             last_updated_by,
5879             last_update_date,
5880             last_update_login,
5881             object_version_number,
5882             aw_snapshot_flag)
5883          VALUES(
5884             v_attr_id,
5885             v_ver_id,
5886             v_lg_id,
5887             null,
5888             null,
5889             null,
5890             null,
5891             v_attr_date,
5892             sysdate,
5893             c_user_id,
5894             c_user_id,
5895             sysdate,
5896             null,
5897             c_obj_ver_no,
5898             c_aw_flg);
5899 
5900       END IF;
5904 IF (p_commit = c_true)
5901    END IF;
5902 END LOOP;
5903 
5905 THEN
5906    COMMIT;
5907 END IF;
5908 
5909 FND_MSG_PUB.Count_and_Get(
5910    p_encoded => p_encoded,
5911    p_count => x_msg_count,
5912    p_data => x_msg_data);
5913 
5914 EXCEPTION
5915    WHEN e_bad_param_value THEN
5916    ROLLBACK;
5917       FEM_ENGINES_PKG.Put_Message(
5918          p_app_name => 'FEM',
5919          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
5920          p_token1 => 'PARAM',
5921          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5922                         p_attr_id => v_attr_id),
5923          p_token2 => 'VALUE',
5924          p_value2 => v_attr_value);
5925       FND_MSG_PUB.Count_and_Get(
5926          p_encoded => p_encoded,
5927          p_count => x_msg_count,
5928          p_data => x_msg_data);
5929       x_return_status := c_error;
5930 
5931    WHEN e_null_param_value THEN
5932    ROLLBACK;
5933       FEM_ENGINES_PKG.Put_Message(
5934          p_app_name => 'FEM',
5935          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
5936          p_token1 => 'PARAM',
5937          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5938                         p_attr_id => v_attr_id));
5939       FND_MSG_PUB.Count_and_Get(
5940          p_encoded => p_encoded,
5941          p_count => x_msg_count,
5942          p_data => x_msg_data);
5943       x_return_status := c_error;
5944 
5945    WHEN e_no_version_name THEN
5946    ROLLBACK;
5947       FEM_ENGINES_PKG.Put_Message(
5948          p_app_name => 'FEM',
5949          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
5950          p_token1 => 'ENTITY',
5951          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
5952                         p_attr_id => v_attr_id));
5953       FND_MSG_PUB.Count_and_Get(
5954          p_encoded => p_encoded,
5955          p_count => x_msg_count,
5956          p_data => x_msg_data);
5957       x_return_status := c_error;
5958 
5959    WHEN e_dup_display_code THEN
5960    ROLLBACK;
5961       FEM_ENGINES_PKG.Put_Message(
5962          p_app_name => 'FEM',
5963          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
5964          p_token1 => 'VALUE',
5965          p_value1 => p_display_code);
5966       FND_MSG_PUB.Count_and_Get(
5967          p_encoded => p_encoded,
5968          p_count => x_msg_count,
5969          p_data => x_msg_data);
5970       x_return_status := c_error;
5971 
5972 END New_Ledger;
5973 
5974 /*************************************************************************
5975 
5976                          New_Budget
5977 This procedure creates a new budget member
5978 Notes:
5979    The "FIRST_PERIOD" and "LAST_PERIOD" attributes both require a
5980    CAL_PERIOD_ID assignment.  Since the person calling the API will
5981    not necessarily know the 32 digit numeric CAL_PERIOD_ID value,
5982    the API requires that they specify the 4 components (Calendar, Dimension Group,
5983    Period Number and End Date) instead.
5984 
5985 *************************************************************************/
5986 
5987 
5988 PROCEDURE New_Budget (
5989    p_api_version             IN NUMBER     DEFAULT c_api_version,
5990    p_init_msg_list           IN VARCHAR2   DEFAULT c_false,
5991    p_commit                  IN VARCHAR2   DEFAULT c_false,
5992    p_encoded                 IN VARCHAR2   DEFAULT c_true,
5993    x_return_status           OUT NOCOPY VARCHAR2,
5994    x_msg_count               OUT NOCOPY NUMBER,
5995    x_msg_data                OUT NOCOPY VARCHAR2,
5996    p_budget_display_code     IN VARCHAR2,
5997    p_budget_name             IN VARCHAR2,
5998    p_budget_ledger           IN VARCHAR2,
5999    p_require_journals_flag   IN VARCHAR2,
6000    p_budget_status_code      IN VARCHAR2,
6001    p_budget_latest_open_year IN NUMBER,
6002    p_budget_source_system    IN VARCHAR2,
6003    p_first_period_calendar   IN VARCHAR2,
6004    p_first_period_dimgrp     IN VARCHAR2,
6005    p_first_period_number     IN VARCHAR2,
6006    p_first_period_end_date   IN DATE,
6007    p_last_period_calendar    IN VARCHAR2,
6008    p_last_period_dimgrp      IN VARCHAR2,
6009    p_last_period_number      IN VARCHAR2,
6010    p_last_period_end_date    IN DATE,
6011    p_ver_name                IN VARCHAR2,
6012    p_ver_disp_cd             IN VARCHAR2,
6013    p_budget_desc             IN VARCHAR2)
6014 IS
6015 
6016    -- constant declarations
6017    c_module_prg   CONSTANT   VARCHAR2(160) := c_module_pkg||'.new_budget';
6018 
6019    c_budget_label            CONSTANT   VARCHAR2(30) := 'BUDGET';
6020    c_enabled_flag            CONSTANT   VARCHAR2(1)  := 'Y';
6021    c_read_only_flag          CONSTANT   VARCHAR2(1)  := 'N';
6022    c_personal_flag           CONSTANT   VARCHAR2(1)  := 'N';
6023    c_object_version_number   CONSTANT   NUMBER       := 1;
6024    c_aw_snapshot_flag        CONSTANT   VARCHAR2(1)  := 'N';
6025 
6026    v_row_id       VARCHAR2(20) := '';
6027 
6028    v_budget_dimension_id       NUMBER;  -- dimension_id of BUDGET
6029    v_budget_id                 NUMBER;
6030    v_version_id                NUMBER;
6031    v_attr_label                VARCHAR2(30);
6032    v_attr_assign_value         VARCHAR2(150);  -- placeholder for the assignment
6033                                                -- value that will be used for each
6034                                                -- attribute
6035 
6039 
6036    v_attr_numeric_member       NUMBER;         -- placeholder for numeric dimensions
6037    v_attr_number_assign        NUMBER;         -- placeholder for number assignment values
6038    v_attr_varchar_member       VARCHAR2(30);   -- placeholder for alphanumeric dimensions
6040    -- Variables used to identify the CAL_PERIOD_ID for the BUDGET_FIRST_PERIOD
6041    -- and BUDGET_LAST_PERIOD attribute assignments
6042    v_first_period_calendar_id       NUMBER;
6043    v_last_period_calendar_id        NUMBER;
6044    v_first_period_time_dimgrp_key   NUMBER;
6045    v_last_period_time_dimgrp_key    NUMBER;
6046 
6047    -- placeholder variables for the member table of the Dimension from which
6048    -- the attribute assignment comes from
6049    -- we use this information to validate that the attribute assignment
6050    -- is a valid Dimension member (for DIMENSION attributes only)
6051    v_attribute_id                  NUMBER;
6052    v_attr_member_tab               VARCHAR2(30);
6053    v_attr_member_col               VARCHAR2(30);
6054    v_attr_member_dc_col            VARCHAR2(30);  -- display_code column of the attribute dim
6055    v_param_req                     BOOLEAN;
6056 
6057    v_sql_stmt      VARCHAR2(32767);
6058 
6059    CURSOR cv_budget_attr IS
6060       SELECT attribute_id,
6061              attribute_varchar_label,
6062              attribute_dimension_id,
6063              attribute_value_column_name
6064       FROM fem_dim_attributes_b
6065       WHERE dimension_id =
6066          (SELECT dimension_id
6067           FROM fem_dimensions_b
6068           WHERE dimension_varchar_label = 'BUDGET')
6069       AND attribute_required_flag = 'Y';
6070 
6071    TYPE cv_curs_type IS REF CURSOR;
6072    cv_attr_dim   cv_curs_type;
6073 
6074 BEGIN
6075 
6076 x_return_status := c_success;
6077 
6078 Validate_OA_Params (
6079    p_api_version => p_api_version,
6080    p_init_msg_list => p_init_msg_list,
6081    p_commit => p_commit,
6082    p_encoded => p_encoded,
6083    x_return_status => x_return_status);
6084 
6085 IF (x_return_status <> c_success)
6086 THEN
6087    FND_MSG_PUB.Count_and_Get(
6088       p_encoded => c_false,
6089       p_count => x_msg_count,
6090       p_data => x_msg_data);
6091    RETURN;
6092 END IF;
6093 
6094 ------------------------
6095 -- Get the next BUDGET_ID value available --
6096 ------------------------
6097 SELECT dimension_id
6098 INTO v_budget_dimension_id
6099 FROM fem_dimensions_b
6100 WHERE dimension_varchar_label = c_budget_label;
6101 
6102 v_budget_id := FEM_Dimension_Util_Pkg.Generate_Member_ID(
6103               p_api_version => p_api_version,
6104               p_init_msg_list => c_false,
6105               p_commit => c_false,
6106               p_encoded => p_encoded,
6107               x_return_status => x_return_status,
6108               x_msg_count => x_msg_count,
6109               x_msg_data => x_msg_data,
6110               p_dim_id => v_budget_dimension_id);
6111 
6112 IF (x_return_status <> c_success)
6113 THEN
6114    RETURN;
6115 END IF;
6116 
6117 -------------------------------
6118 -- Insert New Budget Member --
6119 -------------------------------
6120 BEGIN
6121    FEM_BUDGETS_PKG.INSERT_ROW(
6122       x_rowid => v_row_id,
6123       x_budget_id => v_budget_id,
6124       x_enabled_flag => c_enabled_flag,
6125       x_budget_display_code => p_budget_display_code,
6126       x_read_only_flag => c_read_only_flag,
6127       x_personal_flag => c_personal_flag,
6128       x_object_version_number => c_object_version_number,
6129       x_budget_name => p_budget_name,
6130       x_description => p_budget_desc,
6131       x_creation_date => sysdate,
6132       x_created_by => c_user_id,
6133       x_last_update_date => sysdate,
6134       x_last_updated_by => c_user_id,
6135       x_last_update_login => null);
6136 EXCEPTION
6137    WHEN dup_val_on_index THEN
6138       RAISE e_dup_display_code;
6139 END;
6140 
6141 -----------------------------------
6142 -- Insert New Budget Attributes --
6143 -----------------------------------
6144 FOR attr IN cv_budget_attr
6145 LOOP
6146 
6147    v_attribute_id := attr.attribute_id;
6148    v_attr_label := attr.attribute_varchar_label;
6149    -------------------------------
6150    -- Check Attribute Version --
6151    -------------------------------
6152    BEGIN
6153       SELECT MIN(version_id)
6154       INTO v_version_id
6155       FROM fem_dim_attr_versions_b
6156       WHERE attribute_id = v_attribute_id
6157       AND default_version_flag = 'Y';
6158    EXCEPTION
6159       WHEN no_data_found THEN
6160       -- In this case, the version did not exist, so we will try
6161       -- to create a new version for the attribute using the provided
6162       -- version display code and version name
6163 
6164          IF (p_ver_name IS NULL)
6165          THEN
6166             RAISE e_no_version_name;
6167          ELSIF (p_ver_disp_cd IS NULL)
6168          THEN
6169             RAISE e_no_version_name;
6170          END IF;
6171 
6172          SELECT fem_dim_attr_versions_b_s.NEXTVAL
6173          INTO v_version_id FROM dual;
6174 
6175          FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
6176             x_rowid => v_row_id,
6180             x_object_version_number => c_object_version_number,
6177             x_version_id => v_version_id,
6178             x_aw_snapshot_flag => c_aw_snapshot_flag,
6179             x_version_display_code => p_ver_disp_cd,
6181             x_default_version_flag => 'Y',
6182             x_personal_flag => c_personal_flag,
6183             x_attribute_id => v_attribute_id,
6184             x_version_name => p_ver_name,
6185             x_description => null,
6186             x_creation_date => sysdate,
6187             x_created_by => c_user_id,
6188             x_last_update_date => sysdate,
6189             x_last_updated_by => c_user_id,
6190             x_last_update_login => null);
6191    END;
6192 
6193    -----------------------------
6194    -- Get Attribute information --
6195    -----------------------------
6196    CASE attr.attribute_varchar_label
6197       WHEN 'BUDGET_LEDGER' THEN
6198          v_attr_assign_value := p_budget_ledger;
6199          v_param_req := TRUE;
6200       WHEN 'REQUIRE_JOURNALS_FLAG' THEN
6201          v_attr_assign_value := p_require_journals_flag;
6202          v_param_req := TRUE;
6203       WHEN 'BUDGET_STATUS_CODE' THEN
6204          v_attr_assign_value := p_budget_status_code;
6205          v_param_req := TRUE;
6206       WHEN 'BUDGET_LATEST_OPEN_YEAR' THEN
6207          v_attr_assign_value := p_budget_latest_open_year;
6208          v_param_req := TRUE;
6209       WHEN 'SOURCE_SYSTEM_CODE' THEN
6210          v_attr_assign_value := p_budget_source_system;
6211          v_param_req := TRUE;
6212       WHEN 'BUDGET_FIRST_PERIOD' THEN
6213          -- for this attribute we have to identify the CAL_PERIOD_ID
6214          -- of the assignment
6215          BEGIN
6216             select calendar_id
6217             into v_first_period_calendar_id
6218             from fem_calendars_b
6219             where calendar_display_code = p_first_period_calendar;
6220          EXCEPTION
6221             WHEN no_data_found THEN
6222                RAISE e_null_param_value;
6223          END;
6224 
6225          BEGIN
6226             select time_dimension_group_key
6227             into v_first_period_time_dimgrp_key
6228             from fem_dimension_grps_b D, fem_dimensions_b B
6229             where D.dimension_group_display_code = p_first_period_dimgrp
6230             and D.dimension_id = B.dimension_id
6231             and B.dimension_varchar_label = 'CAL_PERIOD';
6232          EXCEPTION
6233             WHEN no_data_found THEN
6234                RAISE e_null_param_value;
6235          END;
6236 
6237          select LPAD(to_char(to_number(to_char(p_first_period_end_date,'j'))),7,'0')||
6238          LPAD(TO_CHAR(p_first_period_number),15,'0')||
6239          LPAD(to_char(v_first_period_calendar_id),5,'0')||
6240          LPAD(to_char(v_first_period_time_dimgrp_key),5,'0')
6241          into v_attr_assign_value
6242          from dual;
6243 
6244          v_param_req := TRUE;
6245       WHEN 'BUDGET_LAST_PERIOD' THEN
6246          -- for this attribute we have to identify the CAL_PERIOD_ID
6247          -- of the assignment
6248          BEGIN
6249             select calendar_id
6250             into v_last_period_calendar_id
6251             from fem_calendars_b
6252             where calendar_display_code = p_last_period_calendar;
6253          EXCEPTION
6254             WHEN no_data_found THEN
6255                RAISE e_null_param_value;
6256          END;
6257 
6258          BEGIN
6259             select time_dimension_group_key
6260             into v_last_period_time_dimgrp_key
6261             from fem_dimension_grps_b D, fem_dimensions_b B
6262             where D.dimension_group_display_code = p_last_period_dimgrp
6263             and D.dimension_id = B.dimension_id
6264             and B.dimension_varchar_label = 'CAL_PERIOD';
6265          EXCEPTION
6266             WHEN no_data_found THEN
6267                RAISE e_null_param_value;
6268          END;
6269 
6270          select LPAD(to_char(to_number(to_char(p_last_period_end_date,'j'))),7,'0')||
6271          LPAD(TO_CHAR(p_last_period_number),15,'0')||
6272          LPAD(to_char(v_last_period_calendar_id),5,'0')||
6273          LPAD(to_char(v_last_period_time_dimgrp_key),5,'0')
6274          into v_attr_assign_value
6275          from dual;
6276 
6277          v_param_req := TRUE;
6278       ELSE
6279          FEM_ENGINES_PKG.Tech_Message(
6280             p_severity => c_log_level_1,
6281             p_module => c_module_pkg||'.New_Budget.bad_attr_list',
6282             p_msg_text => 'The Budget attribute '||v_attr_label||
6283                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
6284                           ' the API''s list of attribute labels');
6285 
6286          FEM_ENGINES_PKG.Put_Message(
6287             p_app_name => 'FEM',
6288             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
6289             p_token1 => 'ATTR',
6290             p_value1 => v_attr_label);
6291    END CASE;
6292 
6293    IF (v_attr_assign_value IS NULL)
6294    THEN
6295       CASE v_param_req
6296          WHEN TRUE THEN
6297             RAISE e_null_param_value;
6298          ELSE null;
6299       END CASE;
6300    ELSE
6301 
6302       -------------------------
6303       -- Verify that the attribute assignment value is a valid
6304       -- for that attribute
6308       IF attr.attribute_dimension_id is not null THEN
6305       -- this only applies for DIMENSION attributes (i.e., where
6306       -- attribute_dimension_id is not null
6307       -------------------------
6309          SELECT member_b_table_name,
6310                 member_col,
6311                 member_display_code_col
6312          INTO v_attr_member_tab,
6313               v_attr_member_col,
6314               v_attr_member_dc_col
6315          FROM fem_xdim_dimensions
6316          WHERE dimension_id = attr.attribute_dimension_id;
6317 
6318          v_sql_stmt :=
6319             'SELECT '||v_attr_member_col||
6320             ' FROM '||v_attr_member_tab||
6321             ' WHERE to_char('||v_attr_member_dc_col||') = '''||v_attr_assign_value||'''';
6322      END IF;
6323 
6324       IF (attr.attribute_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
6325       THEN
6326          BEGIN
6327             EXECUTE IMMEDIATE v_sql_stmt
6328             INTO v_attr_numeric_member;
6329          EXCEPTION
6330             WHEN no_data_found THEN
6331                RAISE e_bad_param_value;
6332          END;
6333          v_attr_varchar_member := '';
6334          v_attr_number_assign := '';
6335       ELSIF (attr.attribute_value_column_name = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
6336       THEN
6337          BEGIN
6338             EXECUTE IMMEDIATE v_sql_stmt
6339             INTO v_attr_varchar_member;
6340          EXCEPTION
6341             WHEN no_data_found THEN
6342                RAISE e_bad_param_value;
6343          END;
6344          v_attr_numeric_member := '';
6345          v_attr_number_assign := '';
6346       ELSIF (attr.attribute_value_column_name = 'NUMBER_ASSIGN_VALUE')
6347       THEN
6348          v_attr_number_assign := v_attr_assign_value;
6349          v_attr_numeric_member := '';
6350          v_attr_varchar_member := '';
6351       END IF;
6352 
6353       -----------------------------
6354       -- Insert Attribute Values --
6355       -----------------------------
6356       INSERT INTO fem_budgets_attr(
6357          attribute_id,
6358          version_id,
6359          budget_id,
6360          dim_attribute_numeric_member,
6361          dim_attribute_varchar_member,
6362          number_assign_value,
6363          varchar_assign_value,
6364          date_assign_value,
6365          creation_date,
6366          created_by,
6367          last_updated_by,
6368          last_update_date,
6369          last_update_login,
6370          aw_snapshot_flag,
6371          object_version_number)
6372       VALUES(
6373          v_attribute_id,
6374          v_version_id,
6375          v_budget_id,
6376          v_attr_numeric_member,
6377          v_attr_varchar_member,
6378          v_attr_number_assign,
6379          null,
6380          null,
6381          sysdate,
6382          c_user_id,
6383          c_user_id,
6384          sysdate,
6385          null,
6386          c_aw_snapshot_flag,
6387          c_object_version_number);
6388 
6389    END IF;
6390 
6391 END LOOP;
6392 
6393 IF (p_commit = c_true)
6394 THEN
6395    COMMIT;
6396 END IF;
6397 
6398 FND_MSG_PUB.Count_and_Get(
6399    p_encoded => p_encoded,
6400    p_count => x_msg_count,
6401    p_data => x_msg_data);
6402 
6403 EXCEPTION
6404    WHEN e_bad_param_value THEN
6405       ROLLBACK;
6406       FEM_ENGINES_PKG.Put_Message(
6407          p_app_name => 'FEM',
6408          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
6409          p_token1 => 'PARAM',
6410          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6411                     p_attr_id => v_attribute_id),
6412          p_token2 => 'VALUE',
6413          p_value2 => v_attr_assign_value);
6414       FND_MSG_PUB.Count_and_Get(
6415          p_encoded => p_encoded,
6416          p_count => x_msg_count,
6417          p_data => x_msg_data);
6418       x_return_status := c_error;
6419 
6420    WHEN e_null_param_value THEN
6421       ROLLBACK;
6422       FEM_ENGINES_PKG.Put_Message(
6423          p_app_name => 'FEM',
6424          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
6425          p_token1 => 'PARAM',
6426          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6427                     p_attr_id => v_attribute_id));
6428       FND_MSG_PUB.Count_and_Get(
6429          p_encoded => p_encoded,
6430          p_count => x_msg_count,
6431          p_data => x_msg_data);
6432       x_return_status := c_error;
6433 
6434    WHEN e_no_version_name THEN
6435       ROLLBACK;
6436       FEM_ENGINES_PKG.Put_Message(
6437          p_app_name => 'FEM',
6438          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
6439          p_token1 => 'ENTITY',
6440          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6441                         p_attr_id => v_attribute_id));
6442       FND_MSG_PUB.Count_and_Get(
6443          p_encoded => p_encoded,
6444          p_count => x_msg_count,
6445          p_data => x_msg_data);
6446       x_return_status := c_error;
6447 
6448    WHEN e_dup_display_code THEN
6449       ROLLBACK;
6450       FEM_ENGINES_PKG.Put_Message(
6451          p_app_name => 'FEM',
6452          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
6453          p_token1 => 'VALUE',
6457          p_count => x_msg_count,
6454          p_value1 => p_budget_display_code);
6455       FND_MSG_PUB.Count_and_Get(
6456          p_encoded => p_encoded,
6458          p_data => x_msg_data);
6459       x_return_status := c_error;
6460 
6461 END New_Budget;
6462 
6463 /*************************************************************************
6464 
6465                         Register Budget
6466 
6467 *************************************************************************/
6468 
6469 PROCEDURE Register_Budget (
6470    p_api_version             IN NUMBER     DEFAULT c_api_version,
6471    p_init_msg_list           IN VARCHAR2   DEFAULT c_false,
6472    p_commit                  IN VARCHAR2   DEFAULT c_false,
6473    p_encoded                 IN VARCHAR2   DEFAULT c_true,
6474    x_return_status           OUT NOCOPY VARCHAR2,
6475    x_msg_count               OUT NOCOPY NUMBER,
6476    x_msg_data                OUT NOCOPY VARCHAR2,
6477    p_budget_id               IN NUMBER,
6478    p_budget_display_code     IN VARCHAR2,
6479    p_budget_name             IN VARCHAR2,
6480    p_budget_ledger           IN VARCHAR2,
6481    p_require_journals_flag   IN VARCHAR2,
6482    p_budget_status_code      IN VARCHAR2,
6483    p_budget_latest_open_year IN NUMBER,
6484    p_budget_source_system    IN VARCHAR2,
6485    p_first_period_calendar   IN VARCHAR2,
6486    p_first_period_dimgrp     IN VARCHAR2,
6487    p_first_period_number     IN VARCHAR2,
6488    p_first_period_end_date   IN DATE,
6489    p_last_period_calendar    IN VARCHAR2,
6490    p_last_period_dimgrp      IN VARCHAR2,
6491    p_last_period_number      IN VARCHAR2,
6492    p_last_period_end_date    IN DATE,
6493    p_ver_name                IN VARCHAR2,
6494    p_ver_disp_cd             IN VARCHAR2,
6495    p_budget_desc             IN VARCHAR2)
6496 IS
6497 
6498 -- constant declarations
6499 c_module_prg   CONSTANT   VARCHAR2(160) := c_module_pkg||'.new_budget';
6500 
6501 c_budget_label            CONSTANT   VARCHAR2(30) := 'BUDGET';
6502 c_enabled_flag            CONSTANT   VARCHAR2(1)  := 'Y';
6503 c_read_only_flag          CONSTANT   VARCHAR2(1)  := 'N';
6504 c_personal_flag           CONSTANT   VARCHAR2(1)  := 'N';
6505 c_object_version_number   CONSTANT   NUMBER       := 1;
6506 c_aw_snapshot_flag        CONSTANT   VARCHAR2(1)  := 'N';
6507 
6508 v_row_id       VARCHAR2(20) := '';
6509 v_dim_id       NUMBER;
6510 v_budget_dimension_id       NUMBER;  -- dimension_id of BUDGET
6511 v_budget_id                 NUMBER;
6512 v_version_id                NUMBER;
6513 v_attr_label                VARCHAR2(30);
6514 v_attr_assign_value         VARCHAR2(150);  -- placeholder for the assignment
6515                                             -- value that will be used for each
6516                                             -- attribute
6517 
6518 v_attr_numeric_member       NUMBER;         -- placeholder for numeric dimensions
6519 v_attr_number_assign        NUMBER;         -- placeholder for number assignment values
6520 v_attr_varchar_member       VARCHAR2(30);   -- placeholder for alphanumeric dimensions
6521 
6522 -- Variables used to identify the CAL_PERIOD_ID for the BUDGET_FIRST_PERIOD
6523 -- and BUDGET_LAST_PERIOD attribute assignments
6524 v_first_period_calendar_id       NUMBER;
6525 v_last_period_calendar_id        NUMBER;
6526 v_first_period_time_dimgrp_key   NUMBER;
6527 v_last_period_time_dimgrp_key    NUMBER;
6528 
6529 -- placeholder variables for the member table of the Dimension from which
6530 -- the attribute assignment comes from
6531 -- we use this information to validate that the attribute assignment
6532 -- is a valid Dimension member (for DIMENSION attributes only)
6533 
6534 v_attribute_id                  NUMBER;
6535 v_attr_member_tab               VARCHAR2(30);
6536 v_attr_member_col               VARCHAR2(30);
6537 v_attr_member_dc_col            VARCHAR2(30);  -- display_code column of the attribute dim
6538 v_param_req                     BOOLEAN;
6539 
6540 v_sql_stmt      VARCHAR2(32767);
6541 
6542 CURSOR cv_budget_attr IS
6543    SELECT attribute_id,
6544           attribute_varchar_label,
6545           attribute_dimension_id,
6546           attribute_value_column_name
6547    FROM fem_dim_attributes_b
6548    WHERE dimension_id =
6549       (SELECT dimension_id
6550        FROM fem_dimensions_b
6551        WHERE dimension_varchar_label = 'BUDGET')
6552    AND attribute_required_flag = 'Y';
6553 
6554 TYPE cv_curs_type IS REF CURSOR;
6555 cv_attr_dim   cv_curs_type;
6556 
6557 e_dup_reg_id   EXCEPTION;
6558 
6559 BEGIN
6560 
6561 x_return_status := c_success;
6562 
6563 ---------------------
6564 -- Validate Budget ID
6565 ---------------------
6566 SELECT dimension_id
6567 INTO v_dim_id
6568 FROM fem_dimensions_b
6569 WHERE dimension_varchar_label = c_budget_label;
6570 
6571 BEGIN
6572    SELECT budget_id
6573    INTO v_budget_id
6574    FROM fem_budgets_b
6575    WHERE budget_id = p_budget_id;
6576 EXCEPTION
6577    WHEN no_data_found THEN
6578       v_budget_id := null;
6579 END;
6580 
6581 IF (v_budget_id IS NULL)
6582 THEN
6583    v_budget_id := p_budget_id;
6584 ELSE
6585    RAISE e_dup_reg_id;
6586 END IF;
6587 
6588 Validate_OA_Params (
6589    p_api_version => p_api_version,
6593    x_return_status => x_return_status);
6590    p_init_msg_list => p_init_msg_list,
6591    p_commit => p_commit,
6592    p_encoded => p_encoded,
6594 
6595 IF (x_return_status <> c_success)
6596 THEN
6597    FND_MSG_PUB.Count_and_Get(
6598       p_encoded => c_false,
6599       p_count => x_msg_count,
6600       p_data => x_msg_data);
6601    RETURN;
6602 END IF;
6603 
6604 -------------------------------
6605 -- Insert New Budget Member --
6606 -------------------------------
6607 BEGIN
6608    FEM_BUDGETS_PKG.INSERT_ROW(
6609       x_rowid => v_row_id,
6610       x_budget_id => v_budget_id,
6611       x_enabled_flag => c_enabled_flag,
6612       x_budget_display_code => p_budget_display_code,
6613       x_read_only_flag => c_read_only_flag,
6614       x_personal_flag => c_personal_flag,
6615       x_object_version_number => c_object_version_number,
6616       x_budget_name => p_budget_name,
6617       x_description => p_budget_desc,
6618       x_creation_date => sysdate,
6619       x_created_by => c_user_id,
6620       x_last_update_date => sysdate,
6621       x_last_updated_by => c_user_id,
6622       x_last_update_login => null);
6623 EXCEPTION
6624    WHEN dup_val_on_index THEN
6625       RAISE e_dup_display_code;
6626 END;
6627 
6628 -----------------------------------
6629 -- Insert New Budget Attributes --
6630 -----------------------------------
6631 FOR attr IN cv_budget_attr
6632 LOOP
6633 
6634    v_attribute_id := attr.attribute_id;
6635    v_attr_label := attr.attribute_varchar_label;
6636    -------------------------------
6637    -- Check Attribute Version --
6638    -------------------------------
6639    SELECT MIN(version_id)
6640    INTO v_version_id
6641    FROM fem_dim_attr_versions_b
6642    WHERE attribute_id = v_attribute_id
6643    AND default_version_flag = 'Y';
6644 
6645    IF (v_version_id IS NULL)
6646    THEN
6647       -- In this case, the version did not exist, so we will try
6648       -- to create a new version for the attribute using the provided
6649       -- version display code and version name
6650 
6651       IF (p_ver_name IS NULL)
6652       THEN
6653          RAISE e_no_version_name;
6654       ELSIF (p_ver_disp_cd IS NULL)
6655       THEN
6656          RAISE e_no_version_name;
6657       END IF;
6658 
6659       SELECT fem_dim_attr_versions_b_s.NEXTVAL
6660       INTO v_version_id FROM dual;
6661 
6662       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
6663          x_rowid => v_row_id,
6664          x_version_id => v_version_id,
6665          x_aw_snapshot_flag => c_aw_snapshot_flag,
6666          x_version_display_code => p_ver_disp_cd,
6667          x_object_version_number => c_object_version_number,
6668          x_default_version_flag => 'Y',
6669          x_personal_flag => c_personal_flag,
6670          x_attribute_id => v_attribute_id,
6671          x_version_name => p_ver_name,
6672          x_description => null,
6673          x_creation_date => sysdate,
6674          x_created_by => c_user_id,
6675          x_last_update_date => sysdate,
6676          x_last_updated_by => c_user_id,
6677          x_last_update_login => null);
6678    END IF;
6679 
6680    -----------------------------
6681    -- Get Attribute information --
6682    -----------------------------
6683    CASE attr.attribute_varchar_label
6684       WHEN 'BUDGET_LEDGER' THEN
6685          v_attr_assign_value := p_budget_ledger;
6686          v_param_req := TRUE;
6687       WHEN 'REQUIRE_JOURNALS_FLAG' THEN
6688          v_attr_assign_value := p_require_journals_flag;
6689          v_param_req := TRUE;
6690       WHEN 'BUDGET_STATUS_CODE' THEN
6691          v_attr_assign_value := p_budget_status_code;
6692          v_param_req := TRUE;
6693       WHEN 'BUDGET_LATEST_OPEN_YEAR' THEN
6694          v_attr_assign_value := p_budget_latest_open_year;
6695          v_param_req := TRUE;
6696       WHEN 'SOURCE_SYSTEM_CODE' THEN
6697          v_attr_assign_value := p_budget_source_system;
6698          v_param_req := TRUE;
6699       WHEN 'BUDGET_FIRST_PERIOD' THEN
6700          -- for this attribute we have to identify the CAL_PERIOD_ID
6701          -- of the assignment
6702          BEGIN
6703             select calendar_id
6704             into v_first_period_calendar_id
6705             from fem_calendars_b
6706             where calendar_display_code = p_first_period_calendar;
6707          EXCEPTION
6708             WHEN no_data_found THEN
6709                RAISE e_null_param_value;
6710          END;
6711 
6712          BEGIN
6713             select time_dimension_group_key
6714             into v_first_period_time_dimgrp_key
6715             from fem_dimension_grps_b D, fem_dimensions_b B
6716             where D.dimension_group_display_code = p_first_period_dimgrp
6717             and D.dimension_id = B.dimension_id
6718             and B.dimension_varchar_label = 'CAL_PERIOD';
6719          EXCEPTION
6720             WHEN no_data_found THEN
6721                RAISE e_null_param_value;
6722          END;
6723 
6724          select LPAD(to_char(to_number(to_char(p_first_period_end_date,'j'))),7,'0')||
6725          LPAD(TO_CHAR(p_first_period_number),15,'0')||
6726          LPAD(to_char(v_first_period_calendar_id),5,'0')||
6730 
6727          LPAD(to_char(v_first_period_time_dimgrp_key),5,'0')
6728          into v_attr_assign_value
6729          from dual;
6731          v_param_req := TRUE;
6732       WHEN 'BUDGET_LAST_PERIOD' THEN
6733          -- for this attribute we have to identify the CAL_PERIOD_ID
6734          -- of the assignment
6735          BEGIN
6736             select calendar_id
6737             into v_last_period_calendar_id
6738             from fem_calendars_b
6739             where calendar_display_code = p_last_period_calendar;
6740          EXCEPTION
6741             WHEN no_data_found THEN
6742                RAISE e_null_param_value;
6743          END;
6744 
6745          BEGIN
6746             select time_dimension_group_key
6747             into v_last_period_time_dimgrp_key
6748             from fem_dimension_grps_b D, fem_dimensions_b B
6749             where D.dimension_group_display_code = p_last_period_dimgrp
6750             and D.dimension_id = B.dimension_id
6751             and B.dimension_varchar_label = 'CAL_PERIOD';
6752          EXCEPTION
6753             WHEN no_data_found THEN
6754                RAISE e_null_param_value;
6755          END;
6756 
6757          select LPAD(to_char(to_number(to_char(p_last_period_end_date,'j'))),7,'0')||
6758          LPAD(TO_CHAR(p_last_period_number),15,'0')||
6759          LPAD(to_char(v_last_period_calendar_id),5,'0')||
6760          LPAD(to_char(v_last_period_time_dimgrp_key),5,'0')
6761          into v_attr_assign_value
6762          from dual;
6763 
6764          v_param_req := TRUE;
6765       ELSE
6766          FEM_ENGINES_PKG.Tech_Message(
6767             p_severity => c_log_level_1,
6768             p_module => c_module_pkg||'.New_Budget.bad_attr_list',
6769             p_msg_text => 'The Budget attribute '||v_attr_label||
6770                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
6771                           ' the API''s list of attribute labels');
6772 
6773          FEM_ENGINES_PKG.Put_Message(
6774             p_app_name => 'FEM',
6775             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
6776             p_token1 => 'ATTR',
6777             p_value1 => v_attr_label);
6778    END CASE;
6779 
6780    IF (v_attr_assign_value IS NULL)
6781    THEN
6782       CASE v_param_req
6783          WHEN TRUE THEN
6784             RAISE e_null_param_value;
6785          ELSE null;
6786       END CASE;
6787    ELSE
6788 
6789       -------------------------
6790       -- Verify that the attribute assignment value is a valid
6791       -- for that attribute
6792       -- this only applies for DIMENSION attributes (i.e., where
6793       -- attribute_dimension_id is not null
6794       -------------------------
6795       IF attr.attribute_dimension_id is not null THEN
6796          SELECT member_b_table_name,
6797                 member_col,
6798                 member_display_code_col
6799          INTO v_attr_member_tab,
6800               v_attr_member_col,
6801               v_attr_member_dc_col
6802          FROM fem_xdim_dimensions
6803          WHERE dimension_id = attr.attribute_dimension_id;
6804 
6805          v_sql_stmt :=
6806             'SELECT '||v_attr_member_col||
6807             ' FROM '||v_attr_member_tab||
6808             ' WHERE to_char('||v_attr_member_dc_col||') = '''||v_attr_assign_value||'''';
6809      END IF;
6810 
6811       IF (attr.attribute_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
6812       THEN
6813          BEGIN
6814             EXECUTE IMMEDIATE v_sql_stmt
6815             INTO v_attr_numeric_member;
6816          EXCEPTION
6817             WHEN no_data_found THEN
6818                RAISE e_bad_param_value;
6819          END;
6820          v_attr_varchar_member := '';
6821          v_attr_number_assign := '';
6822       ELSIF (attr.attribute_value_column_name = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
6823       THEN
6824          BEGIN
6825             EXECUTE IMMEDIATE v_sql_stmt
6826             INTO v_attr_varchar_member;
6827          EXCEPTION
6828             WHEN no_data_found THEN
6829                RAISE e_bad_param_value;
6830          END;
6831          v_attr_numeric_member := '';
6832          v_attr_number_assign := '';
6833       ELSIF (attr.attribute_value_column_name = 'NUMBER_ASSIGN_VALUE')
6834       THEN
6835          v_attr_number_assign := v_attr_assign_value;
6836          v_attr_numeric_member := '';
6837          v_attr_varchar_member := '';
6838       END IF;
6839 
6840       -----------------------------
6841       -- Insert Attribute Values --
6842       -----------------------------
6843       INSERT INTO fem_budgets_attr(
6844          attribute_id,
6845          version_id,
6846          budget_id,
6847          dim_attribute_numeric_member,
6848          dim_attribute_varchar_member,
6849          number_assign_value,
6850          varchar_assign_value,
6851          date_assign_value,
6852          creation_date,
6853          created_by,
6854          last_updated_by,
6855          last_update_date,
6856          last_update_login,
6857          aw_snapshot_flag,
6858          object_version_number)
6859       VALUES(
6860          v_attribute_id,
6861          v_version_id,
6865          v_attr_number_assign,
6862          v_budget_id,
6863          v_attr_numeric_member,
6864          v_attr_varchar_member,
6866          null,
6867          null,
6868          sysdate,
6869          c_user_id,
6870          c_user_id,
6871          sysdate,
6872          null,
6873          c_aw_snapshot_flag,
6874          c_object_version_number);
6875 
6876    END IF;
6877 
6878 END LOOP;
6879 
6880 IF (p_commit = c_true)
6881 THEN
6882    COMMIT;
6883 END IF;
6884 
6885 FND_MSG_PUB.Count_and_Get(
6886    p_encoded => p_encoded,
6887    p_count => x_msg_count,
6888    p_data => x_msg_data);
6889 
6890 EXCEPTION
6891    WHEN e_dup_reg_id THEN
6892       FEM_Engines_Pkg.Put_Message(
6893          p_app_name => 'FEM',
6894          p_msg_name => 'FEM_DUP_REG_MEMBER_ERR',
6895          p_token1 => 'DIMENSION',
6896          p_value1 => FEM_Dimension_Util_Pkg.Get_Dimension_Name(
6897                         p_dim_id => v_dim_id),
6898          p_trans1 => 'N',
6899          p_token2 => 'VALUE',
6900          p_value2 => p_budget_id);
6901       FND_MSG_PUB.Count_and_Get(
6902          p_encoded => p_encoded,
6903          p_count => x_msg_count,
6904          p_data => x_msg_data);
6905       x_return_status := c_error;
6906 
6907    WHEN e_bad_param_value THEN
6908       ROLLBACK;
6909       FEM_ENGINES_PKG.Put_Message(
6910          p_app_name => 'FEM',
6911          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
6912          p_token1 => 'PARAM',
6913          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6914                     p_attr_id => v_attribute_id),
6915          p_token2 => 'VALUE',
6916          p_value2 => v_attr_assign_value);
6917       FND_MSG_PUB.Count_and_Get(
6918          p_encoded => p_encoded,
6919          p_count => x_msg_count,
6920          p_data => x_msg_data);
6921       x_return_status := c_error;
6922 
6923    WHEN e_null_param_value THEN
6924       ROLLBACK;
6925       FEM_ENGINES_PKG.Put_Message(
6926          p_app_name => 'FEM',
6927          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
6928          p_token1 => 'PARAM',
6929          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6930                     p_attr_id => v_attribute_id));
6931       FND_MSG_PUB.Count_and_Get(
6932          p_encoded => p_encoded,
6933          p_count => x_msg_count,
6934          p_data => x_msg_data);
6935       x_return_status := c_error;
6936 
6937    WHEN e_no_version_name THEN
6938       ROLLBACK;
6939       FEM_ENGINES_PKG.Put_Message(
6940          p_app_name => 'FEM',
6941          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
6942          p_token1 => 'ENTITY',
6943          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
6944                         p_attr_id => v_attribute_id));
6945       FND_MSG_PUB.Count_and_Get(
6946          p_encoded => p_encoded,
6947          p_count => x_msg_count,
6948          p_data => x_msg_data);
6949       x_return_status := c_error;
6950 
6951    WHEN e_dup_display_code THEN
6952       ROLLBACK;
6953       FEM_ENGINES_PKG.Put_Message(
6954          p_app_name => 'FEM',
6955          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
6956          p_token1 => 'VALUE',
6957          p_value1 => p_budget_display_code);
6958       FND_MSG_PUB.Count_and_Get(
6959          p_encoded => p_encoded,
6960          p_count => x_msg_count,
6961          p_data => x_msg_data);
6962       x_return_status := c_error;
6963 
6964 END Register_Budget;
6965 
6966 /*************************************************************************
6967 
6968                         Register Ledger
6969 
6970   08/23/2006 rflippo Bug#5486589 Modify logic so that if -1 passed in as the
6971                      Cal Period Hier ID then it doesn't try to validate it.
6972                      The reason is that the OGL integration needs to create the
6973                      ledger with a placeholder for the Cal Period Hier ID, since
6974                      they won't have that information until the Cal Period hiers
6975                      are created later.
6976 *************************************************************************/
6977 
6978 PROCEDURE Register_Ledger (
6979    p_api_version     IN NUMBER     DEFAULT c_api_version,
6980    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
6981    p_commit          IN VARCHAR2   DEFAULT c_false,
6982    p_encoded         IN VARCHAR2   DEFAULT c_true,
6983    x_return_status  OUT NOCOPY VARCHAR2,
6984    x_msg_count      OUT NOCOPY NUMBER,
6985    x_msg_data       OUT NOCOPY VARCHAR2,
6986    p_ledger_id       IN NUMBER,
6987    p_display_code    IN VARCHAR2,
6988    p_ledger_name     IN VARCHAR2,
6989    p_func_curr_cd    IN VARCHAR2,
6990    p_source_cd       IN NUMBER,
6991    p_cal_per_hid     IN NUMBER,
6992    p_global_vs_id    IN NUMBER,
6993    p_epb_def_lg_flg  IN VARCHAR2,
6994    p_ent_curr_flg    IN VARCHAR2,
6995    p_avg_bal_flg     IN VARCHAR2,
6996    p_chan_flg        IN VARCHAR2 DEFAULT 'N',
6997    p_cctr_flg        IN VARCHAR2 DEFAULT 'N',
6998    p_cust_flg        IN VARCHAR2 DEFAULT 'N',
6999    p_geog_flg        IN VARCHAR2 DEFAULT 'N',
7000    p_ln_item_flg     IN VARCHAR2 DEFAULT 'N',
7004    p_entity_flg      IN VARCHAR2 DEFAULT 'N',
7001    p_nat_acct_flg    IN VARCHAR2 DEFAULT 'N',
7002    p_prod_flg        IN VARCHAR2 DEFAULT 'N',
7003    p_proj_flg        IN VARCHAR2 DEFAULT 'N',
7005    p_user1_flg       IN VARCHAR2 DEFAULT 'N',
7006    p_user2_flg       IN VARCHAR2 DEFAULT 'N',
7007    p_user3_flg       IN VARCHAR2 DEFAULT 'N',
7008    p_user4_flg       IN VARCHAR2 DEFAULT 'N',
7009    p_user5_flg       IN VARCHAR2 DEFAULT 'N',
7010    p_user6_flg       IN VARCHAR2 DEFAULT 'N',
7011    p_user7_flg       IN VARCHAR2 DEFAULT 'N',
7012    p_user8_flg       IN VARCHAR2 DEFAULT 'N',
7013    p_user9_flg       IN VARCHAR2 DEFAULT 'N',
7014    p_user10_flg      IN VARCHAR2 DEFAULT 'N',
7015    p_task_flg        IN VARCHAR2 DEFAULT 'N',
7016    p_fin_elem_flg    IN VARCHAR2 DEFAULT 'N',
7017    p_ver_name        IN VARCHAR2,
7018    p_ver_disp_cd     IN VARCHAR2,
7019    p_ledger_desc     IN VARCHAR2
7020 )
7021 IS
7022 
7023 c_module_prg   VARCHAR2(160) := c_module_pkg||'.new_ledger';
7024 
7025 c_dim_label     CONSTANT   VARCHAR2(30) := 'LEDGER';
7026 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
7027 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
7028 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
7029 c_obj_ver_no   CONSTANT   NUMBER       := 1;
7030 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
7031 
7032 v_row_id       VARCHAR2(20) := '';
7033 
7034 v_dim_id       NUMBER;
7035 v_lg_id        NUMBER;
7036 v_ver_id       NUMBER;
7037 v_attr_id      NUMBER;
7038 v_xdim_id      NUMBER;
7039 v_xdim_tab     VARCHAR2(30);
7040 v_xdim_col     VARCHAR2(30);
7041 v_xdim_cd_col  VARCHAR2(30);
7042 v_attr_label   VARCHAR2(30);
7043 v_attr_col     VARCHAR2(30);
7044 v_reqd_flg     VARCHAR2(1);
7045 v_attr_value   VARCHAR2(1000);
7046 v_attr_date    DATE;
7047 v_attr_num     NUMBER;
7048 v_attr_vch     VARCHAR2(30);
7049 
7050 v_sql_cmd      VARCHAR2(32767);
7051 
7052 CURSOR cv_dim_attr IS
7053    SELECT attribute_id,
7054           attribute_varchar_label,
7055           attribute_dimension_id,
7056           attribute_value_column_name,
7057           attribute_required_flag
7058    FROM fem_dim_attributes_b
7059    WHERE dimension_id =
7060       (SELECT dimension_id
7061        FROM fem_dimensions_b
7062        WHERE dimension_varchar_label = c_dim_label);
7063 
7064 e_dup_reg_id   EXCEPTION;
7065 
7066 BEGIN
7067 
7068 x_return_status := c_success;
7069 
7070 ---------------------
7071 -- Validate Ledger ID
7072 ---------------------
7073 SELECT dimension_id
7074 INTO v_dim_id
7075 FROM fem_dimensions_b
7076 WHERE dimension_varchar_label = c_dim_label;
7077 
7078 BEGIN
7079    SELECT ledger_id
7080    INTO v_lg_id
7081    FROM fem_ledgers_b
7082    WHERE ledger_id = p_ledger_id;
7083 EXCEPTION
7084    WHEN no_data_found THEN
7085       v_lg_id := null;
7086 END;
7087 
7088 IF (v_lg_id IS NULL)
7089 THEN
7090    v_lg_id := p_ledger_id;
7091 ELSE
7092    RAISE e_dup_reg_id;
7093 END IF;
7094 
7095 Validate_OA_Params (
7096    p_api_version => p_api_version,
7097    p_init_msg_list => p_init_msg_list,
7098    p_commit => p_commit,
7099    p_encoded => p_encoded,
7100    x_return_status => x_return_status);
7101 
7102 IF (x_return_status <> c_success)
7103 THEN
7104    FND_MSG_PUB.Count_and_Get(
7105       p_encoded => c_false,
7106       p_count => x_msg_count,
7107       p_data => x_msg_data);
7108    RETURN;
7109 END IF;
7110 
7111 ------------------------------
7112 -- Insert New Ledger Member --
7113 ------------------------------
7114 BEGIN
7115    FEM_LEDGERS_PKG.INSERT_ROW(
7116       x_rowid => v_row_id,
7117       x_ledger_id => v_lg_id,
7118       x_personal_flag => c_pers_flg,
7119       x_read_only_flag => c_ro_flg,
7120       x_object_version_number => c_obj_ver_no,
7121       x_enabled_flag => c_enbld_flg,
7122       x_ledger_display_code => p_display_code,
7123       x_ledger_name => p_ledger_name,
7124       x_description => p_ledger_desc,
7125       x_creation_date => sysdate,
7126       x_created_by => c_user_id,
7127       x_last_update_date => sysdate,
7128       x_last_updated_by => c_user_id,
7129       x_last_update_login => null);
7130 EXCEPTION
7131    WHEN dup_val_on_index THEN
7132       RAISE e_dup_display_code;
7133 END;
7134 
7135 ----------------------------------
7136 -- Insert New Ledger Attributes --
7137 ----------------------------------
7138 FOR r_dim_attr IN cv_dim_attr
7139 LOOP
7140    v_attr_id := r_dim_attr.attribute_id;
7141    v_attr_label := r_dim_attr.attribute_varchar_label;
7142    v_xdim_id := r_dim_attr.attribute_dimension_id;
7143    v_attr_col := r_dim_attr.attribute_value_column_name;
7144    v_reqd_flg := r_dim_attr.attribute_required_flag;
7145 
7146    -------------------------------
7147    -- Check Attribute's Version --
7148    -------------------------------
7149    SELECT MIN(version_id)
7150    INTO v_ver_id
7151    FROM fem_dim_attr_versions_b
7152    WHERE attribute_id = v_attr_id
7153    AND default_version_flag = 'Y';
7154 
7155    IF (v_ver_id IS NULL)
7156    THEN
7157       IF (p_ver_name IS NULL)
7161       THEN
7158       THEN
7159          RAISE e_no_version_name;
7160       ELSIF (p_ver_disp_cd IS NULL)
7162          RAISE e_no_version_name;
7163       END IF;
7164 
7165       SELECT fem_dim_attr_versions_b_s.NEXTVAL
7166       INTO v_ver_id FROM dual;
7167 
7168       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
7169          x_rowid => v_row_id,
7170          x_version_id => v_ver_id,
7171          x_aw_snapshot_flag => c_aw_flg,
7172          x_version_display_code => p_ver_disp_cd,
7173          x_object_version_number => c_obj_ver_no,
7174          x_default_version_flag => 'Y',
7175          x_personal_flag => c_pers_flg,
7176          x_attribute_id => v_attr_id,
7177          x_version_name => p_ver_name,
7178          x_description => null,
7179          x_creation_date => sysdate,
7180          x_created_by => c_user_id,
7181          x_last_update_date => sysdate,
7182          x_last_updated_by => c_user_id,
7183          x_last_update_login => null);
7184    END IF;
7185 
7186    -----------------------------
7187    -- Get Attribute Parameter --
7188    -----------------------------
7189    CASE v_attr_label
7190       WHEN 'LEDGER_FUNCTIONAL_CRNCY_CODE' THEN
7191          v_attr_value := p_func_curr_cd;
7192       WHEN 'SOURCE_SYSTEM_CODE' THEN
7193          v_attr_value := p_source_cd;
7194       WHEN 'CAL_PERIOD_HIER_OBJ_DEF_ID' THEN
7195          v_attr_value := p_cal_per_hid;
7196       WHEN 'GLOBAL_VS_COMBO' THEN
7197          v_attr_value := p_global_vs_id;
7198       WHEN 'EPB_DEFAULT_LEDGER_FLAG' THEN
7199          v_attr_value := p_epb_def_lg_flg;
7200       WHEN 'ENTERED_CRNCY_ENABLE_FLAG' THEN
7201          v_attr_value := p_ent_curr_flg;
7202       WHEN 'LEDGER_ENABLE_AVG_BAL_FLAG' THEN
7203          v_attr_value := p_avg_bal_flg;
7204       WHEN 'LEDGER_CHANNEL_IS_POP_FLAG' THEN
7205          v_attr_value := p_chan_flg;
7206       WHEN 'LEDGER_CCTR_IS_POP_FLAG' THEN
7207          v_attr_value := p_cctr_flg;
7208       WHEN 'LEDGER_CUSTOMER_IS_POP_FLAG' THEN
7209          v_attr_value := p_cust_flg;
7210       WHEN 'LEDGER_GEOGRAPHY_IS_POP_FLAG' THEN
7211          v_attr_value := p_geog_flg;
7212       WHEN 'LEDGER_LINE_ITEM_IS_POP_FLAG' THEN
7213          v_attr_value := p_ln_item_flg;
7214       WHEN 'LEDGER_NAT_ACCT_IS_POP_FLAG' THEN
7215          v_attr_value := p_nat_acct_flg;
7216       WHEN 'LEDGER_PRODUCT_IS_POP_FLAG' THEN
7217          v_attr_value := p_prod_flg;
7218       WHEN 'LEDGER_PROJECT_IS_POP_FLAG' THEN
7219          v_attr_value := p_proj_flg;
7220       WHEN 'LEDGER_ENTITY_IS_POP_FLAG' THEN
7221          v_attr_value := p_entity_flg;
7222       WHEN 'LEDGER_USER_DIM1_IS_POP_FLAG' THEN
7223          v_attr_value := p_user1_flg;
7224       WHEN 'LEDGER_USER_DIM2_IS_POP_FLAG' THEN
7225          v_attr_value := p_user2_flg;
7226       WHEN 'LEDGER_USER_DIM3_IS_POP_FLAG' THEN
7227          v_attr_value := p_user3_flg;
7228       WHEN 'LEDGER_USER_DIM4_IS_POP_FLAG' THEN
7229          v_attr_value := p_user4_flg;
7230       WHEN 'LEDGER_USER_DIM5_IS_POP_FLAG' THEN
7231          v_attr_value := p_user5_flg;
7232       WHEN 'LEDGER_USER_DIM6_IS_POP_FLAG' THEN
7233          v_attr_value := p_user6_flg;
7234       WHEN 'LEDGER_USER_DIM7_IS_POP_FLAG' THEN
7235          v_attr_value := p_user7_flg;
7236       WHEN 'LEDGER_USER_DIM8_IS_POP_FLAG' THEN
7237          v_attr_value := p_user8_flg;
7238       WHEN 'LEDGER_USER_DIM9_IS_POP_FLAG' THEN
7239          v_attr_value := p_user9_flg;
7240       WHEN 'LEDGER_USER_DIM10_IS_POP_FLAG' THEN
7241          v_attr_value := p_user10_flg;
7242       WHEN 'LEDGER_TASK_IS_POP_FLAG' THEN
7243          v_attr_value := p_task_flg;
7244       WHEN 'LEDGER_FIN_ELEM_IS_POP_FLAG' THEN
7245          v_attr_value := p_fin_elem_flg;
7246       ELSE
7247          FEM_ENGINES_PKG.Tech_Message(
7248             p_severity => c_log_level_1,
7249             p_module => c_module_pkg||'.New_Ledger.bad_attr_list',
7250             p_msg_text => 'The Ledger attribute '||v_attr_label||
7251                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
7252                           ' the API''s list of attribute labels');
7253 
7254          FEM_ENGINES_PKG.Put_Message(
7255             p_app_name => 'FEM',
7256             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
7257             p_token1 => 'ATTR',
7258             p_value1 => v_attr_label);
7259    END CASE;
7260 
7261    IF (v_attr_value IS NULL)
7262    THEN
7263       CASE v_reqd_flg
7264          WHEN 'Y' THEN
7265             RAISE e_null_param_value;
7266          ELSE null;
7267       END CASE;
7268    ELSE
7269       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
7270           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
7271       THEN
7272          -------------------------------------
7273          -- Attribute is a Dimension Attribute
7274          -- which needs to be validated
7275          -------------------------------------
7276          SELECT member_b_table_name,
7277                 member_col
7278          INTO v_xdim_tab,
7279               v_xdim_col
7280          FROM fem_xdim_dimensions
7281          WHERE dimension_id = v_xdim_id;
7282 
7283          v_sql_cmd :=
7284             'SELECT '||v_xdim_col||
7285             ' FROM '||v_xdim_tab||
7289             IF v_attr_label = 'CAL_PERIOD_HIER_OBJ_DEF_ID' AND v_attr_value = -1 THEN
7286             ' WHERE '||v_xdim_col||' = :b_attr_value';
7287 
7288          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER') THEN
7290                v_attr_num := v_attr_value;
7291             ELSE
7292                BEGIN
7293                   EXECUTE IMMEDIATE v_sql_cmd
7294                   INTO v_attr_num
7295                   USING v_attr_value;
7296                EXCEPTION
7297                   WHEN no_data_found THEN
7298                      RAISE e_bad_param_value;
7299                END;
7300             END IF;
7301             v_attr_vch := '';
7302          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
7303          THEN
7304             BEGIN
7305                EXECUTE IMMEDIATE v_sql_cmd
7306                INTO v_attr_vch
7307                USING v_attr_value;
7308             EXCEPTION
7309                WHEN no_data_found THEN
7310                   RAISE e_bad_param_value;
7311             END;
7312             v_attr_num := '';
7313          END IF;
7314 
7315          INSERT INTO fem_ledgers_attr(
7316             attribute_id,
7317             version_id,
7318             ledger_id,
7319             dim_attribute_numeric_member,
7320             dim_attribute_varchar_member,
7321             number_assign_value,
7322             varchar_assign_value,
7323             date_assign_value,
7324             creation_date,
7325             created_by,
7326             last_updated_by,
7327             last_update_date,
7328             last_update_login,
7329             object_version_number,
7330             aw_snapshot_flag)
7331          VALUES(
7332             v_attr_id,
7333             v_ver_id,
7334             v_lg_id,
7335             v_attr_num,
7336             v_attr_vch,
7337             null,
7338             null,
7339             null,
7340             sysdate,
7341             c_user_id,
7342             c_user_id,
7343             sysdate,
7344             null,
7345             c_obj_ver_no,
7346             c_aw_flg);
7347 
7348       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
7349       THEN
7350          ----------------------------------------
7351          -- Attribute is an assigned number value
7352          ----------------------------------------
7353          INSERT INTO fem_ledgers_attr(
7354             attribute_id,
7355             version_id,
7356             ledger_id,
7357             dim_attribute_numeric_member,
7358             dim_attribute_varchar_member,
7359             number_assign_value,
7360             varchar_assign_value,
7361             date_assign_value,
7362             creation_date,
7363             created_by,
7364             last_updated_by,
7365             last_update_date,
7366             last_update_login,
7367             object_version_number,
7368             aw_snapshot_flag)
7369          VALUES(
7370             v_attr_id,
7371             v_ver_id,
7372             v_lg_id,
7373             null,
7374             null,
7375             v_attr_value,
7376             null,
7377             null,
7378             sysdate,
7379             c_user_id,
7380             c_user_id,
7381             sysdate,
7382             null,
7383             c_obj_ver_no,
7384             c_aw_flg);
7385 
7386       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
7387       THEN
7388          -----------------------------------------
7389          -- Attribute is an assigned varchar value
7390          -----------------------------------------
7391          INSERT INTO fem_ledgers_attr(
7392             attribute_id,
7393             version_id,
7394             ledger_id,
7395             dim_attribute_numeric_member,
7396             dim_attribute_varchar_member,
7397             number_assign_value,
7398             varchar_assign_value,
7399             date_assign_value,
7400             creation_date,
7401             created_by,
7402             last_updated_by,
7403             last_update_date,
7404             last_update_login,
7405             object_version_number,
7406             aw_snapshot_flag)
7407          VALUES(
7408             v_attr_id,
7409             v_ver_id,
7410             v_lg_id,
7411             null,
7412             null,
7413             null,
7414             v_attr_value,
7415             null,
7416             sysdate,
7417             c_user_id,
7418             c_user_id,
7419             sysdate,
7420             null,
7421             c_obj_ver_no,
7422             c_aw_flg);
7423 
7424       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
7425       THEN
7426          --------------------------------------
7427          -- Attribute is an assigned date value
7428          --------------------------------------
7429          INSERT INTO fem_ledgers_attr(
7430             attribute_id,
7431             version_id,
7432             ledger_id,
7433             dim_attribute_numeric_member,
7434             dim_attribute_varchar_member,
7435             number_assign_value,
7436             varchar_assign_value,
7440             last_updated_by,
7437             date_assign_value,
7438             creation_date,
7439             created_by,
7441             last_update_date,
7442             last_update_login,
7443             object_version_number,
7444             aw_snapshot_flag)
7445          VALUES(
7446             v_attr_id,
7447             v_ver_id,
7448             v_lg_id,
7449             null,
7450             null,
7451             null,
7452             null,
7453             v_attr_date,
7454             sysdate,
7455             c_user_id,
7456             c_user_id,
7457             sysdate,
7458             null,
7459             c_obj_ver_no,
7460             c_aw_flg);
7461 
7462       END IF;
7463    END IF;
7464 END LOOP;
7465 
7466 IF (p_commit = c_true)
7467 THEN
7468    COMMIT;
7469 END IF;
7470 
7471 FND_MSG_PUB.Count_and_Get(
7472    p_encoded => p_encoded,
7473    p_count => x_msg_count,
7474    p_data => x_msg_data);
7475 
7476 EXCEPTION
7477    WHEN e_dup_reg_id THEN
7478       FEM_Engines_Pkg.Put_Message(
7479          p_app_name => 'FEM',
7480          p_msg_name => 'FEM_DUP_REG_MEMBER_ERR',
7481          p_token1 => 'DIMENSION',
7482          p_value1 => FEM_Dimension_Util_Pkg.Get_Dimension_Name(
7483                         p_dim_id => v_dim_id),
7484          p_trans1 => 'N',
7485          p_token2 => 'VALUE',
7486          p_value2 => p_ledger_id);
7487       FND_MSG_PUB.Count_and_Get(
7488          p_encoded => p_encoded,
7489          p_count => x_msg_count,
7490          p_data => x_msg_data);
7491       x_return_status := c_error;
7492 
7493    WHEN e_bad_param_value THEN
7494    ROLLBACK;
7495       FEM_ENGINES_PKG.Put_Message(
7496          p_app_name => 'FEM',
7497          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
7498          p_token1 => 'PARAM',
7499          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
7500                         p_attr_id => v_attr_id),
7501          p_token2 => 'VALUE',
7502          p_value2 => v_attr_value);
7503       FND_MSG_PUB.Count_and_Get(
7504          p_encoded => p_encoded,
7505          p_count => x_msg_count,
7506          p_data => x_msg_data);
7507       x_return_status := c_error;
7508 
7509    WHEN e_null_param_value THEN
7510    ROLLBACK;
7511       FEM_ENGINES_PKG.Put_Message(
7512          p_app_name => 'FEM',
7513          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
7514          p_token1 => 'PARAM',
7515          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
7516                         p_attr_id => v_attr_id));
7517       FND_MSG_PUB.Count_and_Get(
7518          p_encoded => p_encoded,
7519          p_count => x_msg_count,
7520          p_data => x_msg_data);
7521       x_return_status := c_error;
7522 
7523    WHEN e_no_version_name THEN
7524    ROLLBACK;
7525       FEM_ENGINES_PKG.Put_Message(
7526          p_app_name => 'FEM',
7527          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
7528          p_token1 => 'ENTITY',
7529          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
7530                         p_attr_id => v_attr_id));
7531       FND_MSG_PUB.Count_and_Get(
7532          p_encoded => p_encoded,
7533          p_count => x_msg_count,
7534          p_data => x_msg_data);
7535       x_return_status := c_error;
7536 
7537    WHEN e_dup_display_code THEN
7538    ROLLBACK;
7539       FEM_ENGINES_PKG.Put_Message(
7540          p_app_name => 'FEM',
7541          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
7542          p_token1 => 'VALUE',
7543          p_value1 => p_display_code);
7544       FND_MSG_PUB.Count_and_Get(
7545          p_encoded => p_encoded,
7546          p_count => x_msg_count,
7547          p_data => x_msg_data);
7548       x_return_status := c_error;
7549 
7550 END Register_Ledger;
7551 
7552 /*************************************************************************
7553 
7554                         New Encumbrance Type
7555 
7556 *************************************************************************/
7557 
7558 PROCEDURE New_Encumbrance_Type (
7559    p_api_version     IN NUMBER     DEFAULT c_api_version,
7560    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
7561    p_commit          IN VARCHAR2   DEFAULT c_false,
7562    p_encoded         IN VARCHAR2   DEFAULT c_true,
7563    x_return_status  OUT NOCOPY VARCHAR2,
7564    x_msg_count      OUT NOCOPY NUMBER,
7565    x_msg_data       OUT NOCOPY VARCHAR2,
7566    x_enc_type_id    OUT NOCOPY NUMBER,
7567    p_enc_type_code   IN VARCHAR2,
7568    p_enc_type_name   IN VARCHAR2,
7569    p_enc_type_desc   IN VARCHAR2,
7570    p_source_cd       IN NUMBER,
7571    p_ver_name        IN VARCHAR2,
7572    p_ver_disp_cd     IN VARCHAR2
7573 )
7574 IS
7575 
7576 c_module_prg   VARCHAR2(160) := c_module_pkg||'.new_enc_type';
7577 
7578 c_dim_label    CONSTANT   VARCHAR2(30) := 'ENCUMBRANCE_TYPE';
7579 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
7580 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
7581 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
7582 c_obj_ver_no   CONSTANT   NUMBER       := 1;
7583 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
7584 
7588 v_enc_type_id  NUMBER;
7585 v_row_id       VARCHAR2(20) := '';
7586 
7587 v_dim_id       NUMBER;
7589 v_ver_id       NUMBER;
7590 v_attr_id      NUMBER;
7591 v_xdim_id      NUMBER;
7592 v_xdim_tab     VARCHAR2(30);
7593 v_xdim_col     VARCHAR2(30);
7594 v_xdim_cd_col  VARCHAR2(30);
7595 v_attr_label   VARCHAR2(30);
7596 v_attr_col     VARCHAR2(30);
7597 v_reqd_flg     VARCHAR2(1);
7598 v_attr_value   VARCHAR2(1000);
7599 v_attr_date    DATE;
7600 v_attr_num     NUMBER;
7601 v_attr_vch     VARCHAR2(30);
7602 
7603 v_sql_cmd      VARCHAR2(32767);
7604 
7605 CURSOR cv_dim_attr IS
7606    SELECT attribute_id,
7607           attribute_varchar_label,
7608           attribute_dimension_id,
7609           attribute_value_column_name,
7610           attribute_required_flag
7611    FROM fem_dim_attributes_b
7612    WHERE dimension_id =
7613       (SELECT dimension_id
7614        FROM fem_dimensions_b
7615        WHERE dimension_varchar_label = c_dim_label);
7616 
7617 BEGIN
7618 
7619 x_return_status := c_success;
7620 x_enc_type_id := -1;
7621 
7622 Validate_OA_Params (
7623    p_api_version => p_api_version,
7624    p_init_msg_list => p_init_msg_list,
7625    p_commit => p_commit,
7626    p_encoded => p_encoded,
7627    x_return_status => x_return_status);
7628 
7629 IF (x_return_status <> c_success)
7630 THEN
7631    FND_MSG_PUB.Count_and_Get(
7632       p_encoded => c_false,
7633       p_count => x_msg_count,
7634       p_data => x_msg_data);
7635    RETURN;
7636 END IF;
7637 
7638 ---------------------------------
7639 -- Get New Encumbrance Type ID --
7640 ---------------------------------
7641 SELECT dimension_id
7642 INTO v_dim_id
7643 FROM fem_dimensions_b
7644 WHERE dimension_varchar_label = c_dim_label;
7645 
7646 v_enc_type_id := FEM_Dimension_Util_Pkg.Generate_Member_ID(
7647                   p_api_version => p_api_version,
7648                   p_init_msg_list => c_false,
7649                   p_commit => c_false,
7650                   p_encoded => p_encoded,
7651                   x_return_status => x_return_status,
7652                   x_msg_count => x_msg_count,
7653                   x_msg_data => x_msg_data,
7654                   p_dim_id => v_dim_id);
7655 
7656 IF (x_return_status <> c_success)
7657 THEN
7658    RETURN;
7659 END IF;
7660 
7661 ----------------------------------------
7662 -- Insert New Encumbrance Type Member --
7663 ----------------------------------------
7664 BEGIN
7665    FEM_ENCUMBRANCE_TYPES_PKG.INSERT_ROW(
7666       x_rowid => v_row_id,
7667       x_encumbrance_type_id => v_enc_type_id,
7668       x_personal_flag => c_pers_flg,
7669       x_encumbrance_type_code => p_enc_type_code,
7670       x_enabled_flag => c_enbld_flg,
7671       x_object_version_number => c_obj_ver_no,
7672       x_read_only_flag => c_ro_flg,
7673       x_encumbrance_type_name => p_enc_type_name,
7674       x_description => p_enc_type_desc,
7675       x_creation_date => sysdate,
7676       x_created_by => c_user_id,
7677       x_last_update_date => sysdate,
7678       x_last_updated_by => c_user_id,
7679       x_last_update_login => null);
7680 EXCEPTION
7681    WHEN dup_val_on_index THEN
7682       RAISE e_dup_display_code;
7683 END;
7684 
7685 --------------------------------------------
7686 -- Insert New Encumbrance Type Attributes --
7687 --------------------------------------------
7688 FOR r_dim_attr IN cv_dim_attr
7689 LOOP
7690    v_attr_id := r_dim_attr.attribute_id;
7691    v_attr_label := r_dim_attr.attribute_varchar_label;
7692    v_xdim_id := r_dim_attr.attribute_dimension_id;
7693    v_attr_col := r_dim_attr.attribute_value_column_name;
7694    v_reqd_flg := r_dim_attr.attribute_required_flag;
7695 
7696    -------------------------------
7697    -- Check Attribute's Version --
7698    -------------------------------
7699    SELECT MIN(version_id)
7700    INTO v_ver_id
7701    FROM fem_dim_attr_versions_b
7702    WHERE attribute_id = v_attr_id
7703    AND default_version_flag = 'Y';
7704 
7705    IF (v_ver_id IS NULL)
7706    THEN
7707       IF (p_ver_name IS NULL)
7708       THEN
7709          RAISE e_no_version_name;
7710       ELSIF (p_ver_disp_cd IS NULL)
7711       THEN
7712          RAISE e_no_version_name;
7713       END IF;
7714 
7715       SELECT fem_dim_attr_versions_b_s.NEXTVAL
7716       INTO v_ver_id FROM dual;
7717 
7718       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
7719          x_rowid => v_row_id,
7720          x_version_id => v_ver_id,
7721          x_aw_snapshot_flag => c_aw_flg,
7722          x_version_display_code => p_ver_disp_cd,
7723          x_object_version_number => c_obj_ver_no,
7724          x_default_version_flag => 'Y',
7725          x_personal_flag => c_pers_flg,
7726          x_attribute_id => v_attr_id,
7727          x_version_name => p_ver_name,
7728          x_description => null,
7729          x_creation_date => sysdate,
7730          x_created_by => c_user_id,
7731          x_last_update_date => sysdate,
7732          x_last_updated_by => c_user_id,
7733          x_last_update_login => null);
7734    END IF;
7735 
7736    -----------------------------
7740       WHEN 'SOURCE_SYSTEM_CODE' THEN
7737    -- Get Attribute Parameter --
7738    -----------------------------
7739    CASE v_attr_label
7741          v_attr_value := p_source_cd;
7742       ELSE
7743          FEM_ENGINES_PKG.Tech_Message(
7744             p_severity => c_log_level_1,
7745             p_module => c_module_pkg||'.New_Encumbrance Type.bad_attr_list',
7746             p_msg_text => 'The Encumbrance Type attribute '||v_attr_label||
7747                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
7748                           ' the API''s list of attribute labels');
7749 
7750          FEM_ENGINES_PKG.Put_Message(
7751             p_app_name => 'FEM',
7752             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
7753             p_token1 => 'ATTR',
7754             p_value1 => v_attr_label);
7755    END CASE;
7756 
7757    IF (v_attr_value IS NULL)
7758    THEN
7759       CASE v_reqd_flg
7760          WHEN 'Y' THEN
7761             RAISE e_null_param_value;
7762          ELSE null;
7763       END CASE;
7764    ELSE
7765       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
7766           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
7767       THEN
7768          -------------------------------------
7769          -- Attribute is a Dimension Attribute
7770          -- which needs to be validated
7771          -------------------------------------
7772          SELECT member_b_table_name,
7773                 member_col
7774          INTO v_xdim_tab,
7775               v_xdim_col
7776          FROM fem_xdim_dimensions
7777          WHERE dimension_id = v_xdim_id;
7778 
7779          v_sql_cmd :=
7780             'SELECT '||v_xdim_col||
7781             ' FROM '||v_xdim_tab||
7782             ' WHERE '||v_xdim_col||' = :b_attr_value';
7783 
7784          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
7785          THEN
7786             BEGIN
7787                EXECUTE IMMEDIATE v_sql_cmd
7788                INTO v_attr_num
7789                USING v_attr_value;
7790             EXCEPTION
7791                WHEN no_data_found THEN
7792                   RAISE e_bad_param_value;
7793             END;
7794             v_attr_vch := '';
7795          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
7796          THEN
7797             BEGIN
7798                EXECUTE IMMEDIATE v_sql_cmd
7799                INTO v_attr_vch
7800                USING v_attr_value;
7801             EXCEPTION
7802                WHEN no_data_found THEN
7803                   RAISE e_bad_param_value;
7804             END;
7805             v_attr_num := '';
7806          END IF;
7807 
7808          INSERT INTO fem_enc_types_attr(
7809             attribute_id,
7810             version_id,
7811             encumbrance_type_id,
7812             dim_attribute_numeric_member,
7813             dim_attribute_varchar_member,
7814             number_assign_value,
7815             varchar_assign_value,
7816             date_assign_value,
7817             creation_date,
7818             created_by,
7819             last_updated_by,
7820             last_update_date,
7821             last_update_login,
7822             aw_snapshot_flag,
7823             object_version_number)
7824          VALUES(
7825             v_attr_id,
7826             v_ver_id,
7827             v_enc_type_id,
7828             v_attr_num,
7829             v_attr_vch,
7830             null,
7831             null,
7832             null,
7833             sysdate,
7834             c_user_id,
7835             c_user_id,
7836             sysdate,
7837             null,
7838             c_aw_flg,
7839             c_obj_ver_no);
7840       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
7841       THEN
7842          ----------------------------------------
7843          -- Attribute is an assigned number value
7844          ----------------------------------------
7845          INSERT INTO fem_enc_types_attr(
7846             attribute_id,
7847             version_id,
7848             encumbrance_type_id,
7849             dim_attribute_numeric_member,
7850             dim_attribute_varchar_member,
7851             number_assign_value,
7852             varchar_assign_value,
7853             date_assign_value,
7854             creation_date,
7855             created_by,
7856             last_updated_by,
7857             last_update_date,
7858             last_update_login,
7859             aw_snapshot_flag,
7860             object_version_number)
7861          VALUES(
7862             v_attr_id,
7863             v_ver_id,
7864             v_enc_type_id,
7865             null,
7866             null,
7867             v_attr_value,
7868             null,
7869             null,
7870             sysdate,
7871             c_user_id,
7872             c_user_id,
7873             sysdate,
7874             null,
7875             c_aw_flg,
7876             c_obj_ver_no);
7877       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
7878       THEN
7879          -----------------------------------------
7880          -- Attribute is an assigned varchar value
7881          -----------------------------------------
7882          INSERT INTO fem_enc_types_attr(
7883             attribute_id,
7884             version_id,
7888             number_assign_value,
7885             encumbrance_type_id,
7886             dim_attribute_numeric_member,
7887             dim_attribute_varchar_member,
7889             varchar_assign_value,
7890             date_assign_value,
7891             creation_date,
7892             created_by,
7893             last_updated_by,
7894             last_update_date,
7895             last_update_login,
7896             aw_snapshot_flag,
7897             object_version_number)
7898          VALUES(
7899             v_attr_id,
7900             v_ver_id,
7901             v_enc_type_id,
7902             null,
7903             null,
7904             null,
7905             v_attr_value,
7906             null,
7907             sysdate,
7908             c_user_id,
7909             c_user_id,
7910             sysdate,
7911             null,
7912             c_aw_flg,
7913             c_obj_ver_no);
7914       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
7915       THEN
7916          -----------------------------------------
7917          -- Attribute is an assigned date value
7918          -----------------------------------------
7919          INSERT INTO fem_enc_types_attr(
7920             attribute_id,
7921             version_id,
7922             encumbrance_type_id,
7923             dim_attribute_numeric_member,
7924             dim_attribute_varchar_member,
7925             number_assign_value,
7926             varchar_assign_value,
7927             date_assign_value,
7928             creation_date,
7929             created_by,
7930             last_updated_by,
7931             last_update_date,
7932             last_update_login,
7933             aw_snapshot_flag,
7934             object_version_number)
7935          VALUES(
7936             v_attr_id,
7937             v_ver_id,
7938             v_enc_type_id,
7939             null,
7940             null,
7941             null,
7942             null,
7943             v_attr_date,
7944             sysdate,
7945             c_user_id,
7946             c_user_id,
7947             sysdate,
7948             null,
7949             c_aw_flg,
7950             c_obj_ver_no);
7951       END IF;
7952    END IF;
7953 END LOOP;
7954 
7955 x_enc_type_id := v_enc_type_id;
7956 
7957 IF (p_commit = c_true)
7958 THEN
7959    COMMIT;
7960 END IF;
7961 
7962 FND_MSG_PUB.Count_and_Get(
7963    p_encoded => p_encoded,
7964    p_count => x_msg_count,
7965    p_data => x_msg_data);
7966 
7967 EXCEPTION
7968    WHEN e_bad_param_value THEN
7969    ROLLBACK;
7970       FEM_ENGINES_PKG.Put_Message(
7971          p_app_name => 'FEM',
7972          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
7973          p_token1 => 'PARAM',
7974          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
7975                         p_attr_id => v_attr_id),
7976          p_token2 => 'VALUE',
7977          p_value2 => v_attr_value);
7978       FND_MSG_PUB.Count_and_Get(
7979          p_encoded => p_encoded,
7980          p_count => x_msg_count,
7981          p_data => x_msg_data);
7982       x_return_status := c_error;
7983 
7984    WHEN e_null_param_value THEN
7985    ROLLBACK;
7986       FEM_ENGINES_PKG.Put_Message(
7987          p_app_name => 'FEM',
7988          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
7989          p_token1 => 'PARAM',
7990          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
7991                         p_attr_id => v_attr_id));
7992       FND_MSG_PUB.Count_and_Get(
7993          p_encoded => p_encoded,
7994          p_count => x_msg_count,
7995          p_data => x_msg_data);
7996       x_return_status := c_error;
7997 
7998    WHEN e_no_version_name THEN
7999    ROLLBACK;
8000       FEM_ENGINES_PKG.Put_Message(
8001          p_app_name => 'FEM',
8002          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
8003          p_token1 => 'ENTITY',
8004          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
8005                         p_attr_id => v_attr_id));
8006       FND_MSG_PUB.Count_and_Get(
8007          p_encoded => p_encoded,
8008          p_count => x_msg_count,
8009          p_data => x_msg_data);
8010       x_return_status := c_error;
8011 
8012    WHEN e_dup_display_code THEN
8013    ROLLBACK;
8014       FEM_ENGINES_PKG.Put_Message(
8015          p_app_name => 'FEM',
8016          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
8017          p_token1 => 'VALUE',
8018          p_value1 => p_enc_type_code);
8019       FND_MSG_PUB.Count_and_Get(
8020          p_encoded => p_encoded,
8021          p_count => x_msg_count,
8022          p_data => x_msg_data);
8023       x_return_status := c_error;
8024 
8025 END New_Encumbrance_Type;
8026 
8027 /*************************************************************************
8028 
8029                     Register Encumbrance Type
8030 
8031 *************************************************************************/
8032 
8033 PROCEDURE Register_Encumbrance_Type (
8034    p_api_version     IN NUMBER     DEFAULT c_api_version,
8035    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
8036    p_commit          IN VARCHAR2   DEFAULT c_false,
8037    p_encoded         IN VARCHAR2   DEFAULT c_true,
8038    x_return_status  OUT NOCOPY VARCHAR2,
8042    p_enc_type_code   IN VARCHAR2,
8039    x_msg_count      OUT NOCOPY NUMBER,
8040    x_msg_data       OUT NOCOPY VARCHAR2,
8041    p_enc_type_id     IN NUMBER,
8043    p_enc_type_name   IN VARCHAR2,
8044    p_enc_type_desc   IN VARCHAR2,
8045    p_source_cd       IN NUMBER,
8046    p_ver_name        IN VARCHAR2,
8047    p_ver_disp_cd     IN VARCHAR2
8048 )
8049 IS
8050 
8051 c_module_prg   VARCHAR2(160) := c_module_pkg||'.new_enc_type';
8052 
8053 c_dim_label    CONSTANT   VARCHAR2(30) := 'ENCUMBRANCE_TYPE';
8054 c_enbld_flg    CONSTANT   VARCHAR2(1)  := 'Y';
8055 c_ro_flg       CONSTANT   VARCHAR2(1)  := 'N';
8056 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
8057 c_obj_ver_no   CONSTANT   NUMBER       := 1;
8058 c_aw_flg       CONSTANT   VARCHAR2(1)  := 'N';
8059 
8060 v_row_id       VARCHAR2(20) := '';
8061 
8062 v_dim_id       NUMBER;
8063 v_enc_type_id  NUMBER;
8064 v_ver_id       NUMBER;
8065 v_attr_id      NUMBER;
8066 v_xdim_id      NUMBER;
8067 v_xdim_tab     VARCHAR2(30);
8068 v_xdim_col     VARCHAR2(30);
8069 v_xdim_cd_col  VARCHAR2(30);
8070 v_attr_label   VARCHAR2(30);
8071 v_attr_col     VARCHAR2(30);
8072 v_reqd_flg     VARCHAR2(1);
8073 v_attr_value   VARCHAR2(1000);
8074 v_attr_date    DATE;
8075 v_attr_num     NUMBER;
8076 v_attr_vch     VARCHAR2(30);
8077 
8078 v_sql_cmd      VARCHAR2(32767);
8079 
8080 CURSOR cv_dim_attr IS
8081    SELECT attribute_id,
8082           attribute_varchar_label,
8083           attribute_dimension_id,
8084           attribute_value_column_name,
8085           attribute_required_flag
8086    FROM fem_dim_attributes_b
8087    WHERE dimension_id =
8088       (SELECT dimension_id
8089        FROM fem_dimensions_b
8090        WHERE dimension_varchar_label = c_dim_label);
8091 
8092 e_dup_reg_id   EXCEPTION;
8093 
8094 BEGIN
8095 
8096 x_return_status := c_success;
8097 
8098 -------------------------------
8099 -- Validate Encumbrance Type ID
8100 -------------------------------
8101 SELECT dimension_id
8102 INTO v_dim_id
8103 FROM fem_dimensions_b
8104 WHERE dimension_varchar_label = c_dim_label;
8105 
8106 BEGIN
8107    SELECT encumbrance_type_id
8108    INTO v_enc_type_id
8109    FROM fem_encumbrance_types_b
8110    WHERE encumbrance_type_id = p_enc_type_id;
8111 EXCEPTION
8112    WHEN no_data_found THEN
8113       v_enc_type_id := null;
8114 END;
8115 
8116 IF (v_enc_type_id IS NULL)
8117 THEN
8118    v_enc_type_id := p_enc_type_id;
8119 ELSE
8120    RAISE e_dup_reg_id;
8121 END IF;
8122 
8123 Validate_OA_Params (
8124    p_api_version => p_api_version,
8125    p_init_msg_list => p_init_msg_list,
8126    p_commit => p_commit,
8127    p_encoded => p_encoded,
8128    x_return_status => x_return_status);
8129 
8130 IF (x_return_status <> c_success)
8131 THEN
8132    FND_MSG_PUB.Count_and_Get(
8133       p_encoded => c_false,
8134       p_count => x_msg_count,
8135       p_data => x_msg_data);
8136    RETURN;
8137 END IF;
8138 
8139 ----------------------------------------
8140 -- Insert New Encumbrance Type Member --
8141 ----------------------------------------
8142 BEGIN
8143    FEM_ENCUMBRANCE_TYPES_PKG.INSERT_ROW(
8144       x_rowid => v_row_id,
8145       x_encumbrance_type_id => v_enc_type_id,
8146       x_personal_flag => c_pers_flg,
8147       x_encumbrance_type_code => p_enc_type_code,
8148       x_enabled_flag => c_enbld_flg,
8149       x_object_version_number => c_obj_ver_no,
8150       x_read_only_flag => c_ro_flg,
8151       x_encumbrance_type_name => p_enc_type_name,
8152       x_description => p_enc_type_desc,
8153       x_creation_date => sysdate,
8154       x_created_by => c_user_id,
8155       x_last_update_date => sysdate,
8156       x_last_updated_by => c_user_id,
8157       x_last_update_login => null);
8158 EXCEPTION
8159    WHEN dup_val_on_index THEN
8160       RAISE e_dup_display_code;
8161 END;
8162 
8163 --------------------------------------------
8164 -- Insert New Encumbrance Type Attributes --
8165 --------------------------------------------
8166 FOR r_dim_attr IN cv_dim_attr
8167 LOOP
8168    v_attr_id := r_dim_attr.attribute_id;
8169    v_attr_label := r_dim_attr.attribute_varchar_label;
8170    v_xdim_id := r_dim_attr.attribute_dimension_id;
8171    v_attr_col := r_dim_attr.attribute_value_column_name;
8172    v_reqd_flg := r_dim_attr.attribute_required_flag;
8173 
8174    -------------------------------
8175    -- Check Attribute's Version --
8176    -------------------------------
8177    SELECT MIN(version_id)
8178    INTO v_ver_id
8179    FROM fem_dim_attr_versions_b
8180    WHERE attribute_id = v_attr_id
8181    AND default_version_flag = 'Y';
8182 
8183    IF (v_ver_id IS NULL)
8184    THEN
8185       IF (p_ver_name IS NULL)
8186       THEN
8187          RAISE e_no_version_name;
8188       ELSIF (p_ver_disp_cd IS NULL)
8189       THEN
8190          RAISE e_no_version_name;
8191       END IF;
8192 
8193       SELECT fem_dim_attr_versions_b_s.NEXTVAL
8194       INTO v_ver_id FROM dual;
8195 
8196       FEM_DIM_ATTR_VERSIONS_PKG.INSERT_ROW(
8197          x_rowid => v_row_id,
8198          x_version_id => v_ver_id,
8202          x_default_version_flag => 'Y',
8199          x_aw_snapshot_flag => c_aw_flg,
8200          x_version_display_code => p_ver_disp_cd,
8201          x_object_version_number => c_obj_ver_no,
8203          x_personal_flag => c_pers_flg,
8204          x_attribute_id => v_attr_id,
8205          x_version_name => p_ver_name,
8206          x_description => null,
8207          x_creation_date => sysdate,
8208          x_created_by => c_user_id,
8209          x_last_update_date => sysdate,
8210          x_last_updated_by => c_user_id,
8211          x_last_update_login => null);
8212    END IF;
8213 
8214    -----------------------------
8215    -- Get Attribute Parameter --
8216    -----------------------------
8217    CASE v_attr_label
8218       WHEN 'SOURCE_SYSTEM_CODE' THEN
8219          v_attr_value := p_source_cd;
8220       ELSE
8221          FEM_ENGINES_PKG.Tech_Message(
8222             p_severity => c_log_level_1,
8223             p_module => c_module_pkg||'.New_Encumbrance Type.bad_attr_list',
8224             p_msg_text => 'The Encumbrance Type attribute '||v_attr_label||
8225                           ' is in FEM_DIM_ATTRIBUTES_B but not in'||
8226                           ' the API''s list of attribute labels');
8227 
8228          FEM_ENGINES_PKG.Put_Message(
8229             p_app_name => 'FEM',
8230             p_msg_name => 'FEM_BAD_ATTR_LIST_WARN',
8231             p_token1 => 'ATTR',
8232             p_value1 => v_attr_label);
8233    END CASE;
8234 
8235    IF (v_attr_value IS NULL)
8236    THEN
8237       CASE v_reqd_flg
8238          WHEN 'Y' THEN
8239             RAISE e_null_param_value;
8240          ELSE null;
8241       END CASE;
8242    ELSE
8243       IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER' OR
8244           v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
8245       THEN
8246          -------------------------------------
8247          -- Attribute is a Dimension Attribute
8248          -- which needs to be validated
8249          -------------------------------------
8250          SELECT member_b_table_name,
8251                 member_col
8252          INTO v_xdim_tab,
8253               v_xdim_col
8254          FROM fem_xdim_dimensions
8255          WHERE dimension_id = v_xdim_id;
8256 
8257          v_sql_cmd :=
8258             'SELECT '||v_xdim_col||
8259             ' FROM '||v_xdim_tab||
8260             ' WHERE '||v_xdim_col||' = :b_attr_value';
8261 
8262          IF (v_attr_col = 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
8263          THEN
8264             BEGIN
8265                EXECUTE IMMEDIATE v_sql_cmd
8266                INTO v_attr_num
8267                USING v_attr_value;
8268             EXCEPTION
8269                WHEN no_data_found THEN
8270                   RAISE e_bad_param_value;
8271             END;
8272             v_attr_vch := '';
8273          ELSIF (v_attr_col = 'DIM_ATTRIBUTE_VARCHAR_MEMBER')
8274          THEN
8275             BEGIN
8276                EXECUTE IMMEDIATE v_sql_cmd
8277                INTO v_attr_vch
8278                USING v_attr_value;
8279             EXCEPTION
8280                WHEN no_data_found THEN
8281                   RAISE e_bad_param_value;
8282             END;
8283             v_attr_num := '';
8284          END IF;
8285 
8286          INSERT INTO fem_enc_types_attr(
8287             attribute_id,
8288             version_id,
8289             encumbrance_type_id,
8290             dim_attribute_numeric_member,
8291             dim_attribute_varchar_member,
8292             number_assign_value,
8293             varchar_assign_value,
8294             date_assign_value,
8295             creation_date,
8296             created_by,
8297             last_updated_by,
8298             last_update_date,
8299             last_update_login,
8300             aw_snapshot_flag,
8301             object_version_number)
8302          VALUES(
8303             v_attr_id,
8304             v_ver_id,
8305             v_enc_type_id,
8306             v_attr_num,
8307             v_attr_vch,
8308             null,
8309             null,
8310             null,
8311             sysdate,
8312             c_user_id,
8313             c_user_id,
8314             sysdate,
8315             null,
8316             c_aw_flg,
8317             c_obj_ver_no);
8318 
8319       ELSIF (v_attr_col = 'NUMBER_ASSIGN_VALUE')
8320       THEN
8321          ----------------------------------------
8322          -- Attribute is an assigned number value
8323          ----------------------------------------
8324          INSERT INTO fem_enc_types_attr(
8325             attribute_id,
8326             version_id,
8327             encumbrance_type_id,
8328             dim_attribute_numeric_member,
8329             dim_attribute_varchar_member,
8330             number_assign_value,
8331             varchar_assign_value,
8332             date_assign_value,
8333             creation_date,
8334             created_by,
8335             last_updated_by,
8336             last_update_date,
8337             last_update_login,
8338             aw_snapshot_flag,
8339             object_version_number)
8340          VALUES(
8341             v_attr_id,
8342             v_ver_id,
8346             v_attr_value,
8343             v_enc_type_id,
8344             null,
8345             null,
8347             null,
8348             null,
8349             sysdate,
8350             c_user_id,
8351             c_user_id,
8352             sysdate,
8353             null,
8354             c_aw_flg,
8355             c_obj_ver_no);
8356 
8357       ELSIF (v_attr_col = 'VARCHAR_ASSIGN_VALUE')
8358       THEN
8359          -----------------------------------------
8360          -- Attribute is an assigned varchar value
8361          -----------------------------------------
8362          INSERT INTO fem_enc_types_attr(
8363             attribute_id,
8364             version_id,
8365             encumbrance_type_id,
8366             dim_attribute_numeric_member,
8367             dim_attribute_varchar_member,
8368             number_assign_value,
8369             varchar_assign_value,
8370             date_assign_value,
8371             creation_date,
8372             created_by,
8373             last_updated_by,
8374             last_update_date,
8375             last_update_login,
8376             aw_snapshot_flag,
8377             object_version_number)
8378          VALUES(
8379             v_attr_id,
8380             v_ver_id,
8381             v_enc_type_id,
8382             null,
8383             null,
8384             null,
8385             v_attr_value,
8386             null,
8387             sysdate,
8388             c_user_id,
8389             c_user_id,
8390             sysdate,
8391             null,
8392             c_aw_flg,
8393             c_obj_ver_no);
8394 
8395       ELSIF (v_attr_col = 'DATE_ASSIGN_VALUE')
8396       THEN
8397          -----------------------------------------
8398          -- Attribute is an assigned date value
8399          -----------------------------------------
8400          INSERT INTO fem_enc_types_attr(
8401             attribute_id,
8402             version_id,
8403             encumbrance_type_id,
8404             dim_attribute_numeric_member,
8405             dim_attribute_varchar_member,
8406             number_assign_value,
8407             varchar_assign_value,
8408             date_assign_value,
8409             creation_date,
8410             created_by,
8411             last_updated_by,
8412             last_update_date,
8413             last_update_login,
8414             aw_snapshot_flag,
8415             object_version_number)
8416          VALUES(
8417             v_attr_id,
8418             v_ver_id,
8419             v_enc_type_id,
8420             null,
8421             null,
8422             null,
8423             null,
8424             v_attr_date,
8425             sysdate,
8426             c_user_id,
8427             c_user_id,
8428             sysdate,
8429             null,
8430             c_aw_flg,
8431             c_obj_ver_no);
8432       END IF;
8433 
8434    END IF;
8435 END LOOP;
8436 
8437 IF (p_commit = c_true)
8438 THEN
8439    COMMIT;
8440 END IF;
8441 
8442 FND_MSG_PUB.Count_and_Get(
8443    p_encoded => p_encoded,
8444    p_count => x_msg_count,
8445    p_data => x_msg_data);
8446 
8447 EXCEPTION
8448    WHEN e_dup_reg_id THEN
8449       FEM_Engines_Pkg.Put_Message(
8450          p_app_name => 'FEM',
8451          p_msg_name => 'FEM_DUP_REG_MEMBER_ERR',
8452          p_token1 => 'DIMENSION',
8453          p_value1 => FEM_Dimension_Util_Pkg.Get_Dimension_Name(
8454                         p_dim_id => v_dim_id),
8455          p_trans1 => 'N',
8456          p_token2 => 'VALUE',
8457          p_value2 => p_enc_type_id);
8458       FND_MSG_PUB.Count_and_Get(
8459          p_encoded => p_encoded,
8460          p_count => x_msg_count,
8461          p_data => x_msg_data);
8462       x_return_status := c_error;
8463 
8464    WHEN e_bad_param_value THEN
8465    ROLLBACK;
8466       FEM_ENGINES_PKG.Put_Message(
8467          p_app_name => 'FEM',
8468          p_msg_name => 'FEM_BAD_PARAM_VALUE_ERR',
8469          p_token1 => 'PARAM',
8470          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
8471                         p_attr_id => v_attr_id),
8472          p_token2 => 'VALUE',
8473          p_value2 => v_attr_value);
8474       FND_MSG_PUB.Count_and_Get(
8475          p_encoded => p_encoded,
8476          p_count => x_msg_count,
8477          p_data => x_msg_data);
8478       x_return_status := c_error;
8479 
8480    WHEN e_null_param_value THEN
8481    ROLLBACK;
8482       FEM_ENGINES_PKG.Put_Message(
8483          p_app_name => 'FEM',
8484          p_msg_name => 'FEM_NULL_PARAM_VALUE_ERR',
8485          p_token1 => 'PARAM',
8486          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
8487                         p_attr_id => v_attr_id));
8488       FND_MSG_PUB.Count_and_Get(
8489          p_encoded => p_encoded,
8490          p_count => x_msg_count,
8491          p_data => x_msg_data);
8492       x_return_status := c_error;
8493 
8494    WHEN e_no_version_name THEN
8495    ROLLBACK;
8496       FEM_ENGINES_PKG.Put_Message(
8497          p_app_name => 'FEM',
8498          p_msg_name => 'FEM_NO_VERSION_NAME_ERR',
8502       FND_MSG_PUB.Count_and_Get(
8499          p_token1 => 'ENTITY',
8500          p_value1 => FEM_Dimension_Util_Pkg.Get_Dim_Attr_Name(
8501                         p_attr_id => v_attr_id));
8503          p_encoded => p_encoded,
8504          p_count => x_msg_count,
8505          p_data => x_msg_data);
8506       x_return_status := c_error;
8507 
8508    WHEN e_dup_display_code THEN
8509    ROLLBACK;
8510       FEM_ENGINES_PKG.Put_Message(
8511          p_app_name => 'FEM',
8512          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
8513          p_token1 => 'VALUE',
8514          p_value1 => p_enc_type_code);
8515       FND_MSG_PUB.Count_and_Get(
8516          p_encoded => p_encoded,
8517          p_count => x_msg_count,
8518          p_data => x_msg_data);
8519       x_return_status := c_error;
8520 
8521 END Register_Encumbrance_Type;
8522 
8523 /*************************************************************************
8524 
8525                         New_Global_VS_Combo
8526 
8527 4/20/2005 RobFlippo  Bug#4303380  Add Global_vs_combo_display_code to the
8528                      Insert statement for FEM_GLOBAL_VS_COMBOS_PKG
8529                      -- this fix will preserve the original signature
8530                         for this API so that it is backward compatible
8531                         with OGL by employing a default for the
8532                         global combo display_code.  If the user passes
8533                         null for the display code, it set it = global combo name.
8534 
8535 *************************************************************************/
8536 
8537 PROCEDURE New_Global_VS_Combo (
8538    p_api_version     IN NUMBER     DEFAULT c_api_version,
8539    p_init_msg_list   IN VARCHAR2   DEFAULT c_false,
8540    p_commit          IN VARCHAR2   DEFAULT c_false,
8541    p_encoded         IN VARCHAR2   DEFAULT c_true,
8542    x_return_status  OUT NOCOPY VARCHAR2,
8543    x_msg_count      OUT NOCOPY NUMBER,
8544    x_msg_data       OUT NOCOPY VARCHAR2,
8545    x_global_vs_combo_id  OUT NOCOPY NUMBER,
8546    p_global_vs_combo_name IN VARCHAR2,
8547    p_global_vs_combo_desc IN VARCHAR2 DEFAULT NULL,
8548    p_read_only_flag       IN VARCHAR2 DEFAULT 'N',
8549    p_enabled_flag         IN VARCHAR2 DEFAULT 'Y',
8550    p_global_vs_combo_dc   IN VARCHAR2 DEFAULT NULL
8551 )
8552 IS
8553 
8554 c_obj_ver_no   CONSTANT   NUMBER := 1;
8555 c_pers_flg     CONSTANT   VARCHAR2(1)  := 'N';
8556 
8557 v_vs_id        NUMBER  := -1;
8558 
8559 v_row_id       VARCHAR2(20) := '';
8560 v_gvsc_id      NUMBER;
8561 v_vs_dim_id    NUMBER;
8562 v_global_vs_combo_dc  VARCHAR2(150);
8563 
8564 ---------------------------------------------------
8565 -- Cursor to get dimensions that require Value Sets
8566 ---------------------------------------------------
8567 CURSOR c_vs_dim_ids IS
8568    SELECT dimension_id, dimension_varchar_label
8569    FROM fem_xdim_dimensions_vl
8570    WHERE value_set_required_flag = 'Y'
8571    ORDER BY dimension_id;
8572 
8573 BEGIN
8574 
8575 x_return_status := c_success;
8576 x_global_vs_combo_id := -1;
8577 
8578 Validate_OA_Params (
8579    p_api_version => p_api_version,
8580    p_init_msg_list => p_init_msg_list,
8581    p_commit => p_commit,
8582    p_encoded => p_encoded,
8583    x_return_status => x_return_status);
8584 
8585 IF (x_return_status <> c_success)
8586 THEN
8587    FND_MSG_PUB.Count_and_Get(
8588       p_encoded => c_false,
8589       p_count => x_msg_count,
8590       p_data => x_msg_data);
8591    RETURN;
8592 END IF;
8593 
8594 --------------------------------
8595 -- Get New Global VS Combo ID --
8596 --------------------------------
8597 SELECT fem_global_vs_combos_b_s.NEXTVAL
8598 INTO v_gvsc_id
8599 FROM dual;
8600 ---------------------------------------
8601 -- Validate the Global VS Combo Display Code --
8602 ---------------------------------------
8603 IF p_global_vs_combo_dc IS NULL THEN
8604    v_global_vs_combo_dc := p_global_vs_combo_name;
8605 ELSE
8606    v_global_vs_combo_dc := p_global_vs_combo_dc;
8607 END IF;
8608 
8609 
8610 ---------------------------------------
8611 -- Insert New Global VS Combo Member --
8612 ---------------------------------------
8613 BEGIN
8614    FEM_GLOBAL_VS_COMBOS_PKG.INSERT_ROW(
8615       x_rowid => v_row_id,
8616       x_global_vs_combo_id => v_gvsc_id,
8617       x_global_vs_combo_display_code => v_global_vs_combo_dc,
8618       x_enabled_flag => p_enabled_flag,
8619       x_read_only_flag => p_read_only_flag,
8620       x_personal_flag => c_pers_flg,
8621       x_object_version_number => c_obj_ver_no,
8622       x_global_vs_combo_name => p_global_vs_combo_name,
8623       x_description => p_global_vs_combo_desc,
8624       x_creation_date => sysdate,
8625       x_created_by => c_user_id,
8626       x_last_update_date => sysdate,
8627       x_last_updated_by => c_user_id,
8628       x_last_update_login => null);
8629 EXCEPTION
8630    WHEN dup_val_on_index THEN
8631       FEM_ENGINES_PKG.Put_Message(
8632          p_app_name => 'FEM',
8633          p_msg_name => 'FEM_DUP_DISPLAY_CODE_ERR',
8634          p_token1 => 'VALUE',
8635          p_value1 => p_global_vs_combo_name);
8636       FND_MSG_PUB.Count_and_Get(
8637          p_encoded => p_encoded,
8641       RETURN;
8638          p_count => x_msg_count,
8639          p_data => x_msg_data);
8640       x_return_status := c_error;
8642 END;
8643 
8644 ----------------------------------------------------------------
8645 -- Initialize Value Set ID for each value-set_required dimension
8646 ----------------------------------------------------------------
8647 FOR r_vs_dim_id IN c_vs_dim_ids
8648 LOOP
8649 
8650    -- Retrieve the seeded value set for the dimension
8651    -- We do this by getting the value_set_id that has
8652    -- the display_code = dimension varchar label
8653    SELECT value_set_id
8654    INTO v_vs_id
8655    FROM fem_value_sets_b
8656    WHERE dimension_id = r_vs_dim_id.dimension_id
8657    AND value_set_display_code = r_vs_dim_id.dimension_varchar_label;
8658 
8659    -- RCF 4/20/2005 Obsolete - v_vs_dim_id := r_vs_dim_id.dimension_id;
8660 
8661    INSERT INTO fem_global_vs_combo_defs
8662      (global_vs_combo_id,
8663       dimension_id,
8664       value_set_id,
8665       creation_date,
8666       created_by,
8667       last_updated_by,
8668       last_update_date,
8669       last_update_login,
8670       object_version_number)
8671    VALUES
8672      (v_gvsc_id,
8673       r_vs_dim_id.dimension_id,
8674       v_vs_id,
8675       sysdate,
8676       c_user_id,
8677       c_user_id,
8678       sysdate,
8679       null,
8680       c_obj_ver_no);
8681 END LOOP;
8682 
8683 IF (p_commit = c_true)
8684 THEN
8685    COMMIT;
8686 END IF;
8687 
8688 x_global_vs_combo_id := v_gvsc_id;
8689 
8690 END New_Global_VS_Combo;
8691 
8692 /*************************************************************************
8693 
8694                          Get_Dim_Attr_ID_Ver_ID
8695 
8696 *************************************************************************/
8697 
8698 PROCEDURE Get_Dim_Attr_ID_Ver_ID (
8699    p_dim_id          IN NUMBER,
8700    p_attr_label      IN VARCHAR,
8701    x_attr_id        OUT NOCOPY   NUMBER,
8702    x_ver_id         OUT NOCOPY   NUMBER,
8703    x_err_code       OUT NOCOPY   NUMBER
8704 )
8705 IS
8706 BEGIN
8707 
8708 x_err_code := 0;
8709 
8710 SELECT A.attribute_id,
8711        V.version_id
8712 INTO   x_attr_id,
8713        x_ver_id
8714 FROM   fem_dim_attributes_b A,
8715        fem_dim_attr_versions_b V
8716 WHERE attribute_varchar_label = p_attr_label
8717 AND   dimension_id = p_dim_id
8718 AND   A.attribute_id = V.attribute_id
8719 AND   V.default_version_flag = 'Y';
8720 
8721 EXCEPTION
8722    WHEN no_data_found THEN
8723       x_err_code := 2;
8724 END Get_Dim_Attr_ID_Ver_ID;
8725 
8726 /*************************************************************************
8727 
8728                          Get_Dim_Member_ID
8729 
8730           This function returns a dimension member ID
8731 
8732 NOTE:  This procedure assumes that the dimension being evaluated
8733        is a surrogate key dimension.  If the dimension does not have
8734        a surrogate key (i.e., member_col = member_display_code_col),
8735        then the function returns a -1 since there is no "member_id"
8736        for that members of that dimension.
8737 
8738 HISTORY:
8739 Rob Flippo 2/17/2006 Bug#5040996 - added support for Composite dimensions
8740 
8741 *************************************************************************/
8742 
8743 FUNCTION Get_Dim_Member_ID (
8744    p_api_version                 IN  NUMBER     DEFAULT 1.0,
8745    p_init_msg_list               IN  VARCHAR2   DEFAULT c_false,
8746    p_commit                      IN  VARCHAR2   DEFAULT c_false,
8747    p_encoded                     IN  VARCHAR2   DEFAULT c_true,
8748    x_return_status               OUT NOCOPY VARCHAR2,
8749    x_msg_count                   OUT NOCOPY NUMBER,
8750    x_msg_data                    OUT NOCOPY VARCHAR2,
8751    p_dimension_varchar_label     IN  VARCHAR2,
8752    p_member_display_code         IN  VARCHAR2,
8753    p_member_vs_display_code      IN  VARCHAR2
8754 ) RETURN VARCHAR2
8755 IS
8756 
8757   C_MODULE            CONSTANT FND_LOG_MESSAGES.module%TYPE :=
8758      'fem.plsql.fem_dimension_util_pkg.get_dim_member_id';
8759 
8760 v_dim_id         NUMBER;
8761 v_vs_id          NUMBER;
8762 v_mem_b_tab      VARCHAR2(30);
8763 v_mem_col        VARCHAR2(30);
8764 v_mem_dc_col     VARCHAR2(30);
8765 v_vs_req_flg     VARCHAR2(1);
8766 v_gvsc_id        NUMBER; --- Global Value Set Combo ID for the users session
8767 
8768 v_comp_dim_flg   VARCHAR2(1); -- Designates if the dimension is a composite dim
8769 v_member_id      NUMBER;
8770 
8771 v_sql_stmt       VARCHAR2(32767);
8772 
8773 -- OUT parameters for calling the Global_vs_combo_id function
8774 -- we ignore these parameters - if there is an error, that function
8775 -- will post a message to the stack and this api exits via the When OTHERS
8776 v_return_status  VARCHAR2(100);
8777 v_msg_count      NUMBER;
8778 v_msg_data       VARCHAR2(4000);
8779 
8780 e_bad_dim_label  EXCEPTION;
8781 e_bad_vs_code    EXCEPTION;
8782 e_no_member      EXCEPTION;
8783 
8784 BEGIN
8785 
8786 ---------------------------
8787 -- Verify the OA parameters
8788 ---------------------------
8789 FEM_Dimension_Util_Pkg.Validate_OA_Params (
8793    p_encoded => p_encoded,
8790    p_api_version => c_api_version,
8791    p_init_msg_list => p_init_msg_list,
8792    p_commit => p_commit,
8794    x_return_status => x_return_status);
8795 
8796 IF (x_return_status <> c_success)
8797 THEN
8798    FND_MSG_PUB.Count_and_Get(
8799       p_encoded => c_false,
8800       p_count => x_msg_count,
8801       p_data => x_msg_data);
8802    RETURN -1;
8803 END IF;
8804 
8805 ---------------------------------
8806 -- Verify the specified Dimension
8807 ---------------------------------
8808 BEGIN
8809    SELECT dimension_id
8810    INTO   v_dim_id
8811    FROM   fem_dimensions_b
8812    WHERE  dimension_varchar_label = p_dimension_varchar_label;
8813 EXCEPTION
8814    WHEN no_data_found THEN
8815       RAISE e_bad_dim_label;
8816 END;
8817 
8818 -------------------------------
8819 -- Get the Dimension's metadata
8820 -------------------------------
8821 SELECT member_b_table_name,
8822        member_col,
8823        member_display_code_col,
8824        value_set_required_flag,
8825        composite_dimension_flag
8826 INTO   v_mem_b_tab,
8827        v_mem_col,
8828        v_mem_dc_col,
8829        v_vs_req_flg,
8830        v_comp_dim_flg
8831 FROM   fem_xdim_dimensions
8832 WHERE  dimension_id = v_dim_id;
8833 
8834 ---------------------------------
8835 -- Verify the specified Value Set
8836 ---------------------------------
8837 
8838 v_gvsc_id := null;
8839 v_vs_id := null;
8840 -- For composite dimensions, we also need to get the Global VS Combo
8841 -- for the user's session
8842 IF (v_comp_dim_flg = 'Y')
8843 THEN
8844   v_gvsc_id :=
8845     Global_VS_Combo_ID (
8846       x_return_status  => v_return_status,
8847       x_msg_count      => v_msg_count,
8848       x_msg_data       => v_msg_data,
8849       p_ledger_id      => null);
8850 
8851 ELSIF (v_vs_req_flg = 'Y')
8852 THEN
8853    BEGIN
8854       SELECT value_set_id
8855       INTO   v_vs_id
8856       FROM   fem_value_sets_b
8857       WHERE  value_set_display_code = p_member_vs_display_code
8858       AND    dimension_id = v_dim_id;
8859    EXCEPTION
8860       WHEN no_data_found THEN
8861           RAISE e_bad_vs_code;
8862    END;
8863 ELSE
8864    v_vs_id := null;
8865 END IF;
8866 
8867 ----------------
8868 -- Get Member ID
8869 ----------------
8870 IF (v_gvsc_id IS NOT NULL)  -- query for composite dims
8871 THEN
8872    v_sql_stmt :=
8873    'SELECT '||v_mem_col||
8874    ' FROM '||v_mem_b_tab||
8875    ' WHERE '||v_mem_dc_col||' = :b_member_display_code'||
8876    ' AND local_vs_combo_id = :b_gvsc_id';
8877 
8878    BEGIN
8879       EXECUTE IMMEDIATE v_sql_stmt
8880       INTO v_member_id
8881       USING p_member_display_code,
8882             v_gvsc_id;
8883    EXCEPTION
8884       WHEN no_data_found THEN
8885          RAISE e_no_member;
8886    END;
8887 
8888 ELSIF (v_vs_id  IS NOT NULL) -- query for value set dims
8889 THEN
8890    v_sql_stmt :=
8891    'SELECT '||v_mem_col||
8892    ' FROM '||v_mem_b_tab||
8893    ' WHERE '||v_mem_dc_col||' = :b_member_display_code'||
8894    ' AND value_set_id = :b_vs_id';
8895 
8896    BEGIN
8897       EXECUTE IMMEDIATE v_sql_stmt
8898       INTO v_member_id
8899       USING p_member_display_code,
8900             v_vs_id;
8901    EXCEPTION
8902       WHEN no_data_found THEN
8903          RAISE e_no_member;
8904    END;
8905 ELSE
8906    v_sql_stmt :=
8907    'SELECT '||v_mem_col||
8908    ' FROM '||v_mem_b_tab||
8909    ' WHERE '||v_mem_dc_col||' = :b_member_display_code';
8910 
8911    BEGIN
8912       EXECUTE IMMEDIATE v_sql_stmt
8913       INTO v_member_id
8914       USING p_member_display_code;
8915    EXCEPTION
8916       WHEN no_data_found THEN
8917          RAISE e_no_member;
8918    END;
8919 END IF;
8920 
8921 x_return_status := c_success;
8922 RETURN v_member_id;
8923 
8924 ------------------
8925 -- Exception Block
8926 ------------------
8927 EXCEPTION
8928 
8929 WHEN e_bad_dim_label THEN
8930    FEM_ENGINES_PKG.Put_Message(
8931       p_app_name => 'FEM',
8932       p_msg_name => 'FEM_DIM_BAD_DIM_LABEL',
8933       p_token1 => 'DIM_LABEL',
8934       p_value1 => p_dimension_varchar_label);
8935    FND_MSG_PUB.Count_and_Get(
8936       p_encoded => p_encoded,
8937       p_count => x_msg_count,
8938       p_data => x_msg_data);
8939    x_return_status := c_error;
8940    RETURN -1;
8941 
8942 WHEN e_bad_vs_code THEN
8943    FEM_ENGINES_PKG.Put_Message(
8944       p_app_name => 'FEM',
8945       p_msg_name => 'FEM_DIM_BAD_VS_CODE',
8946       p_token1 => 'VS_CODE',
8947       p_value1 => p_member_vs_display_code);
8948    FND_MSG_PUB.Count_and_Get(
8949       p_encoded => p_encoded,
8950       p_count => x_msg_count,
8951       p_data => x_msg_data);
8952   x_return_status := c_error;
8953    RETURN -1;
8954 
8955 WHEN e_no_member THEN
8956    FEM_ENGINES_PKG.Put_Message(
8957       p_app_name => 'FEM',
8958       p_msg_name => 'FEM_DIM_NO_MEMBER',
8959       p_token1 => 'MEM_CODE',
8963       p_count => x_msg_count,
8960       p_value1 => p_member_display_code);
8961    FND_MSG_PUB.Count_and_Get(
8962       p_encoded => p_encoded,
8964       p_data => x_msg_data);
8965    x_return_status := c_error;
8966    RETURN -1;
8967 
8968   WHEN others THEN
8969     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8970       FEM_ENGINES_PKG.TECH_MESSAGE(
8971         p_severity => FND_LOG.level_statement,
8972         p_module   => C_MODULE,
8973         p_msg_text => 'Unexpected error.');
8974     END IF;
8975     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8976       FEM_ENGINES_PKG.TECH_MESSAGE(
8977         p_severity => FND_LOG.level_procedure,
8978         p_module   => C_MODULE,
8979         p_msg_text => 'End Procedure');
8980     END IF;
8981     x_return_status := c_unexp;
8982     RETURN -1;
8983 
8984 
8985 END Get_Dim_Member_ID;
8986 
8987 /*************************************************************************
8988 
8989                          Get_Dim_Attr_Name
8990 
8991 *************************************************************************/
8992 
8993 FUNCTION Get_Dim_Attr_Name (
8994    p_attr_id        IN   NUMBER
8995 ) RETURN VARCHAR2
8996 IS
8997    v_attr_name VARCHAR2(80);
8998 BEGIN
8999 
9000 SELECT attribute_name
9001 INTO v_attr_name
9002 FROM fem_dim_attributes_tl
9003 WHERE attribute_id = p_attr_id
9004 AND   language = userenv('LANG');
9005 
9006 RETURN v_attr_name;
9007 
9008 EXCEPTION
9009    WHEN no_data_found THEN
9010       RETURN null;
9011 END Get_Dim_Attr_Name;
9012 
9013 --------------------------------------------------------------------------
9014 
9015 FUNCTION Get_Dim_Attr_Name (
9016    p_dim_id        IN   NUMBER,
9017    p_attr_label    IN   VARCHAR2
9018 ) RETURN VARCHAR2
9019 IS
9020    v_attr_name VARCHAR2(80);
9021 BEGIN
9022 
9023 SELECT T.attribute_name
9024 INTO v_attr_name
9025 FROM fem_dim_attributes_b B,
9026      fem_dim_attributes_tl T
9027 WHERE B.attribute_varchar_label = p_attr_label
9028 AND B.dimension_id = p_dim_id
9029 AND T.attribute_id = B.attribute_id
9030 AND T.language = userenv('LANG');
9031 
9032 RETURN v_attr_name;
9033 
9034 EXCEPTION
9035    WHEN no_data_found THEN
9036       RETURN null;
9037 END Get_Dim_Attr_Name;
9038 
9039 --------------------------------------------------------------------------
9040 
9041 FUNCTION Get_Dim_Attr_Name (
9042    p_dim_label     IN   VARCHAR2,
9043    p_attr_label    IN   VARCHAR2
9044 ) RETURN VARCHAR2
9045 IS
9046    v_attr_name VARCHAR2(80);
9047 BEGIN
9048 
9049 SELECT AT.attribute_name
9050 INTO v_attr_name
9051 FROM fem_dim_attributes_b AB,
9052      fem_dim_attributes_tl AT,
9053      fem_dimensions_b DB
9054 WHERE AB.attribute_varchar_label = p_attr_label
9055 AND DB.dimension_varchar_label = p_dim_label
9056 AND AB.dimension_id = DB.dimension_id
9057 AND AT.attribute_id = AB.attribute_id
9058 AND AT.language = userenv('LANG');
9059 
9060 RETURN v_attr_name;
9061 
9062 EXCEPTION
9063    WHEN no_data_found THEN
9064       RETURN null;
9065 END Get_Dim_Attr_Name;
9066 
9067 /*************************************************************************
9068 
9069                          Get_Dimension_Name
9070 
9071 *************************************************************************/
9072 
9073 FUNCTION Get_Dimension_Name (
9074    p_dim_id        IN   NUMBER
9075 ) RETURN VARCHAR2
9076 IS
9077    v_dim_name VARCHAR2(80);
9078 BEGIN
9079 
9080 SELECT dimension_name
9081 INTO v_dim_name
9082 FROM fem_dimensions_tl
9083 WHERE dimension_id = p_dim_id
9084 AND language = userenv('LANG');
9085 
9086 RETURN v_dim_name;
9087 
9088 EXCEPTION
9089    WHEN no_data_found THEN
9090       RETURN null;
9091 END Get_Dimension_Name;
9092 
9093 --------------------------------------------------------------------------
9094 
9095 FUNCTION Get_Dimension_Name (
9096    p_dim_label    IN   VARCHAR2
9097 ) RETURN VARCHAR2
9098 IS
9099    v_dim_name VARCHAR2(80);
9100 BEGIN
9101 
9102 SELECT T.dimension_name
9103 INTO v_dim_name
9104 FROM fem_dimensions_b B,
9105      fem_dimensions_tl T
9106 WHERE B.dimension_varchar_label = p_dim_label
9107 AND T.dimension_id = B.dimension_id
9108 AND T.language = userenv('LANG');
9109 
9110 RETURN v_dim_name;
9111 
9112 EXCEPTION
9113    WHEN no_data_found THEN
9114       RETURN null;
9115 END Get_Dimension_Name;
9116 
9117 /*************************************************************************
9118 
9119                          OA Exception Handler
9120 
9121 *************************************************************************/
9122 
9123 PROCEDURE Validate_OA_Params (
9124    p_api_version     IN NUMBER,
9125    p_init_msg_list   IN VARCHAR2,
9126    p_commit          IN VARCHAR2,
9127    p_encoded         IN VARCHAR2,
9128    x_return_status   OUT NOCOPY VARCHAR2
9129 )
9130 IS
9134    e_bad_p_encoded         EXCEPTION;
9131    e_bad_p_api_ver         EXCEPTION;
9132    e_bad_p_init_msg_list   EXCEPTION;
9133    e_bad_p_commit          EXCEPTION;
9135 BEGIN
9136 
9137 x_return_status := c_success;
9138 
9139 CASE p_api_version
9140    WHEN c_api_version THEN NULL;
9141    ELSE RAISE e_bad_p_api_ver;
9142 END CASE;
9143 
9144 CASE p_init_msg_list
9145    WHEN c_false THEN NULL;
9146    WHEN c_true THEN
9147       FND_MSG_PUB.Initialize;
9148    ELSE RAISE e_bad_p_init_msg_list;
9149 END CASE;
9150 
9151 CASE p_encoded
9152    WHEN c_false THEN NULL;
9153    WHEN c_true THEN NULL;
9154    ELSE RAISE e_bad_p_encoded;
9155 END CASE;
9156 
9157 CASE p_commit
9158    WHEN c_false THEN NULL;
9159    WHEN c_true THEN NULL;
9160    ELSE RAISE e_bad_p_commit;
9161 END CASE;
9162 
9163 EXCEPTION
9164    WHEN e_bad_p_api_ver THEN
9165       FEM_ENGINES_PKG.Put_Message(
9166          p_app_name => 'FEM',
9167          p_msg_name => 'FEM_BAD_P_API_VER_ERR',
9168          p_token1 => 'VALUE',
9169          p_value1 => p_api_version);
9170       x_return_status := c_error;
9171 
9172    WHEN e_bad_p_init_msg_list THEN
9173       FEM_ENGINES_PKG.Put_Message(
9174          p_app_name => 'FEM',
9175          p_msg_name => 'FEM_BAD_P_INIT_MSG_LIST_ERR');
9176       x_return_status := c_error;
9177 
9178    WHEN e_bad_p_encoded THEN
9179       FEM_ENGINES_PKG.Put_Message(
9180          p_app_name => 'FEM',
9181          p_msg_name => 'FEM_BAD_P_ENCODED_ERR');
9182       x_return_status := c_error;
9183 
9184    WHEN e_bad_p_commit THEN
9185       FEM_ENGINES_PKG.Put_Message(
9186          p_app_name => 'FEM',
9187          p_msg_name => 'FEM_BAD_P_COMMIT_ERR');
9188       x_return_status := c_error;
9189 
9190 END Validate_OA_Params;
9191 
9192 /*************************************************************************
9193 
9194                          Get_Default_Dim_Member
9195 
9196 Purpose:  This function returns the default dimension member code and
9197           display code given a ledger ID and dimension.
9198 
9199 Usage:    The caller has the option to provide either the dimension ID
9200           or dimension varchar label - but at least one must be provided.
9201           If both are provided, the dimension ID is used.
9202 
9203           Ledger ID is an optional parameter because:
9204            1) Only value set required (VSR) dimensions require the ledger ID.
9205               In fact, for non VSR dimensions, if Ledger ID is provided,
9206               it is ignored.
9207            2) Even for VSR dimensions, if the Ledger ID is left null, this
9208               API will attempt to find a default ledger based on the
9209               User Profile: 'FEM_LEDGER'.
9210 
9211 Return variables:
9212    x_member_code           - Member ID/Code
9213    x_member_data_type      - Member ID/Code Data Type
9214                             (from FEM_XDIM_DIMENSIONS.MEMBER_DATA_TYPE_CODE)
9215    x_member_display_code   - Member Display Code
9216    x_return_status
9217       - FND_API.G_RET_STS_SUCCESS ('S') if default member was found
9218       - FND_API.G_RET_STS_ERROR ('E') if no default member exists
9219       - FND_API.G_RET_STS_UNEXP_ERROR if something unexpected occurs
9220 
9221 *************************************************************************/
9222 
9223 PROCEDURE Get_Default_Dim_Member (
9224    p_api_version                 IN  NUMBER DEFAULT 1.0,
9225    p_init_msg_list               IN  VARCHAR2 DEFAULT c_false,
9226    p_commit                      IN  VARCHAR2 DEFAULT c_false,
9227    p_encoded                     IN  VARCHAR2 DEFAULT c_true,
9228    p_dimension_id                IN  NUMBER DEFAULT NULL,
9229    p_dimension_varchar_label     IN  VARCHAR2 DEFAULT NULL,
9230    p_ledger_id                   IN  NUMBER DEFAULT NULL,
9231    x_member_code                 OUT NOCOPY VARCHAR2,
9232    x_member_data_type            OUT NOCOPY VARCHAR2,
9233    x_member_display_code         OUT NOCOPY VARCHAR2,
9234    x_return_status               OUT NOCOPY VARCHAR2,
9235    x_msg_count                   OUT NOCOPY NUMBER,
9236    x_msg_data                    OUT NOCOPY VARCHAR2
9237 )
9238 IS
9239 
9240   C_MODULE            CONSTANT FND_LOG_MESSAGES.module%TYPE :=
9241      'fem.plsql.fem_dimension_util_pkg.get_default_dim_member';
9242   C_API_VERSION       CONSTANT NUMBER := 1.0;
9243   C_API_NAME          CONSTANT VARCHAR2(30)  := 'Get_Default_Dim_Member';
9244   e_no_member         EXCEPTION;
9245 
9246   v_dim_id            FEM_DIMENSIONS_B.dimension_id%TYPE;
9247   v_member_table      FEM_XDIM_DIMENSIONS.member_b_table_name%TYPE;
9248   v_member_col        FEM_XDIM_DIMENSIONS.member_col%TYPE;
9249   v_member_dc_col     FEM_XDIM_DIMENSIONS.member_display_code_col%TYPE;
9250   v_vsr_flag          FEM_XDIM_DIMENSIONS.value_set_required_flag%TYPE;
9251   v_default_member_dc FEM_XDIM_DIMENSIONS.default_member_display_code%TYPE;
9252   v_vs_id             FEM_VALUE_SETS_B.value_set_id%TYPE;
9253   v_default_member    FEM_XDIM_DIMENSIONS.default_member_display_code%TYPE;
9254   v_sql               VARCHAR2(4000);
9255 
9256 BEGIN
9257 
9258   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9259     FEM_ENGINES_PKG.TECH_MESSAGE(
9260       p_severity => FND_LOG.level_procedure,
9261       p_module   => C_MODULE,
9265   -- Initialize return status to unexpected error
9262       p_msg_text => 'Begin Procedure');
9263   END IF;
9264 
9266   x_return_status := c_unexp;
9267 
9268   -- Check for call compatibility.
9269   IF NOT FND_API.Compatible_API_Call (C_API_VERSION,
9270                 p_api_version,
9271                 C_API_NAME,
9272                 G_PKG_NAME)
9273   THEN
9274     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9275       FEM_ENGINES_PKG.TECH_MESSAGE(
9276         p_severity => FND_LOG.level_statement,
9277         p_module   => C_MODULE,
9278         p_msg_text => 'API Version ('||C_API_VERSION||') not compatible with '
9279                     ||'passed in version ('||p_api_version||')');
9280     END IF;
9281     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
9282                               p_count => x_msg_count,
9283                               p_data => x_msg_data);
9284     RAISE e_unexp;
9285   END IF;
9286 
9287   Validate_OA_Params (
9288     p_api_version => p_api_version,
9289     p_init_msg_list => p_init_msg_list,
9290     p_commit => p_commit,
9291     p_encoded => p_encoded,
9292     x_return_status => x_return_status);
9293 
9294   IF (x_return_status <> c_success) THEN
9295     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
9296                               p_count => x_msg_count,
9297                               p_data => x_msg_data);
9298     RETURN;
9299   END IF;
9300 
9301   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9302     FEM_ENGINES_PKG.TECH_MESSAGE(
9303       p_severity => FND_LOG.level_statement,
9304       p_module   => C_MODULE,
9305       p_msg_text => 'p_ledger_id = '||to_char(p_ledger_id));
9306     FEM_ENGINES_PKG.TECH_MESSAGE(
9307       p_severity => FND_LOG.level_statement,
9308       p_module   => C_MODULE,
9309       p_msg_text => 'p_dimension_id = '||to_char(p_dimension_id));
9310     FEM_ENGINES_PKG.TECH_MESSAGE(
9311       p_severity => FND_LOG.level_statement,
9312       p_module   => C_MODULE,
9313       p_msg_text => 'p_dimension_varchar_label = '||p_dimension_varchar_label);
9314   END IF;
9315 
9316   -- Make sure at least one dimension parameter is provided
9317   IF p_dimension_id IS NULL AND p_dimension_varchar_label IS NULL THEN
9318     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9319       FEM_ENGINES_PKG.TECH_MESSAGE(
9320         p_severity => FND_LOG.level_statement,
9321         p_module   => C_MODULE,
9322         p_msg_text => 'At least one of the dimension parameters must be provided');
9323     END IF;
9324     RAISE e_unexp;
9325   END IF;
9326 
9327   -- Obtain some dimension info
9328   BEGIN
9329     IF p_dimension_id IS NULL THEN
9330       SELECT dimension_id
9331       INTO v_dim_id
9332       FROM fem_dimensions_b
9333       WHERE dimension_varchar_label = p_dimension_varchar_label;
9334     ELSE
9335       v_dim_id := p_dimension_id;
9336     END IF;
9337 
9338     SELECT member_b_table_name,
9339            member_col,
9340            member_display_code_col,
9341            member_data_type_code,
9342            value_set_required_flag,
9343            default_member_display_code
9344     INTO   v_member_table,
9345            v_member_col,
9346            v_member_dc_col,
9347            x_member_data_type,
9348            v_vsr_flag,
9349            v_default_member_dc
9350     FROM   fem_xdim_dimensions
9351     WHERE  dimension_id = v_dim_id;
9352 
9353     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9354       FEM_ENGINES_PKG.TECH_MESSAGE(
9355         p_severity => FND_LOG.level_statement,
9356         p_module   => C_MODULE,
9357         p_msg_text => 'XDIM Info for dim '||v_dim_id
9358                    ||': v_member_table = '||v_member_table
9359                    ||', v_member_col = '||v_member_col
9360                    ||', v_member_dc_col = '||v_member_dc_col
9361                    ||', v_vsr_flag = '||v_vsr_flag
9362                    ||', v_default_member_dc = '||v_default_member_dc);
9363     END IF;
9364 
9365   EXCEPTION WHEN no_data_found THEN
9366     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9367       FEM_ENGINES_PKG.TECH_MESSAGE(
9368         p_severity => FND_LOG.level_statement,
9369         p_module   => C_MODULE,
9370         p_msg_text => 'Dimension is not registered in FEM_DIMENSIONS_B or FEM_XDIM_DIMENSIONS');
9371     END IF;
9372     RAISE e_unexp;
9373   END;
9374 
9375   -- If dimension is a VSR dimension, then the default
9376   -- member is stored in with the Global Combo Value Set.
9377   -- Otherwise, it is stored in XDIM_DIMENSIONS.
9378   IF v_vsr_flag = 'Y' THEN
9379     v_vs_id := Dimension_Value_Set_ID (
9380                   p_api_version    => 1.0,
9381                   p_init_msg_list  => p_init_msg_list,
9382                   p_commit         => p_commit,
9383                   p_encoded        => p_encoded,
9384                   p_dimension_id   => v_dim_id,
9385                   p_ledger_id      => p_ledger_id,
9386                   x_return_status  => x_return_status,
9387                   x_msg_count      => x_msg_count,
9388                   x_msg_data       => x_msg_data);
9389 
9390     IF x_return_status <> c_success THEN
9391       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9392         FEM_ENGINES_PKG.TECH_MESSAGE(
9393           p_severity => FND_LOG.level_statement,
9394           p_module   => C_MODULE,
9395           p_msg_text => 'Call to Dimension_Value_Set_ID failed');
9399 
9396       END IF;
9397       raise e_unexp;
9398     END IF;
9400     BEGIN
9401       SELECT default_load_member_id
9402       INTO v_default_member
9403       FROM fem_value_sets_b
9404       WHERE value_set_id = v_vs_id;
9405 
9406       -- Get the default member display code
9407       IF v_default_member IS NOT NULL THEN
9408         v_sql :=  'SELECT '||v_member_dc_col
9409                ||' FROM '||v_member_table
9410                ||' WHERE '||v_member_col||' = :v_default_member'
9411                ||' AND value_set_id = :v_vs_id';
9412 
9413         BEGIN
9414           v_default_member_dc := NULL;
9415 
9416           EXECUTE IMMEDIATE v_sql
9417           INTO v_default_member_dc
9418           USING v_default_member, v_vs_id;
9419         EXCEPTION WHEN no_data_found THEN
9420           IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9421             FEM_ENGINES_PKG.TECH_MESSAGE(
9422               p_severity => FND_LOG.level_statement,
9423               p_module   => C_MODULE,
9424               p_msg_text => 'Following SQL failed to return rows: '||v_sql);
9425             FEM_ENGINES_PKG.TECH_MESSAGE(
9426               p_severity => FND_LOG.level_statement,
9427               p_module   => C_MODULE,
9428               p_msg_text => 'Cannot find the dimension member (ID) = '||to_char(v_default_member)
9429                          ||' in '||v_member_table||' where vaset set ID = '||to_char(v_vs_id));
9430           END IF;
9431           RAISE e_no_member;
9432         END;
9433       END IF; -- v_default_member IS NOT NULL
9434     EXCEPTION WHEN no_data_found THEN
9435       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9436         FEM_ENGINES_PKG.TECH_MESSAGE(
9437           p_severity => FND_LOG.level_statement,
9438           p_module   => C_MODULE,
9439           p_msg_text => 'Cannot find value set ID = '||to_char(v_vs_id));
9440       END IF;
9441       RAISE e_unexp;
9442     END;
9443   ELSE -- v_vsr_flag = 'N'
9444     -- Get the default member code
9445     IF v_default_member_dc IS NOT NULL THEN
9446       v_sql :=  'SELECT '||v_member_col
9447              ||' FROM '||v_member_table
9448              ||' WHERE '||v_member_dc_col||' = :v_default_member_dc';
9449 
9450       BEGIN
9451         EXECUTE IMMEDIATE v_sql
9452         INTO v_default_member
9453         USING v_default_member_dc;
9454       EXCEPTION WHEN no_data_found THEN
9455         IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9456           FEM_ENGINES_PKG.TECH_MESSAGE(
9457             p_severity => FND_LOG.level_statement,
9458             p_module   => C_MODULE,
9459             p_msg_text => 'Following SQL failed to return rows: '||v_sql);
9460           FEM_ENGINES_PKG.TECH_MESSAGE(
9461             p_severity => FND_LOG.level_statement,
9462             p_module   => C_MODULE,
9463             p_msg_text => 'Cannot find the dimension member (display code) '
9464                        ||v_default_member_dc||' in '||v_member_table);
9465         END IF;
9466         RAISE e_no_member;
9467       END;
9468     END IF; -- v_default_member IS NOT NULL
9469   END IF; -- v_vsr_flag
9470 
9471   -- set return vars
9472   x_member_code := v_default_member;
9473   x_member_display_code := v_default_member_dc;
9474 
9475   IF x_member_code IS NULL THEN
9476     x_return_status := c_error;
9477   ELSE
9478     x_return_status := c_success;
9479   END IF;
9480 
9481   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9482     FEM_ENGINES_PKG.TECH_MESSAGE(
9483       p_severity => FND_LOG.level_statement,
9484       p_module   => C_MODULE,
9485       p_msg_text => 'x_member_code = '||x_member_code);
9486     FEM_ENGINES_PKG.TECH_MESSAGE(
9487       p_severity => FND_LOG.level_statement,
9488       p_module   => C_MODULE,
9489       p_msg_text => 'x_member_data_type = '||x_member_data_type);
9490     FEM_ENGINES_PKG.TECH_MESSAGE(
9491       p_severity => FND_LOG.level_statement,
9492       p_module   => C_MODULE,
9493       p_msg_text => 'x_member_display_code = '||x_member_display_code);
9494     FEM_ENGINES_PKG.TECH_MESSAGE(
9495       p_severity => FND_LOG.level_statement,
9496       p_module   => C_MODULE,
9497       p_msg_text => 'x_return_status = '||x_return_status);
9498   END IF;
9499   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9500     FEM_ENGINES_PKG.TECH_MESSAGE(
9501       p_severity => FND_LOG.level_procedure,
9502       p_module   => C_MODULE,
9503       p_msg_text => 'End Procedure');
9504   END IF;
9505 
9506 EXCEPTION
9507   WHEN e_no_member THEN
9508     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9509       FEM_ENGINES_PKG.TECH_MESSAGE(
9510         p_severity => FND_LOG.level_procedure,
9511         p_module   => C_MODULE,
9515     x_member_data_type := NULL;
9512         p_msg_text => 'End Procedure');
9513     END IF;
9514     x_member_code := NULL;
9516     x_member_display_code := NULL;
9517     x_return_status := c_error;
9518   WHEN others THEN
9519     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9520       FEM_ENGINES_PKG.TECH_MESSAGE(
9521         p_severity => FND_LOG.level_statement,
9522         p_module   => C_MODULE,
9523         p_msg_text => 'Unexpected error.');
9524     END IF;
9525     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9526       FEM_ENGINES_PKG.TECH_MESSAGE(
9527         p_severity => FND_LOG.level_procedure,
9528         p_module   => C_MODULE,
9529         p_msg_text => 'End Procedure');
9530     END IF;
9531     x_return_status := c_unexp;
9532 
9533 END Get_Default_Dim_Member;
9534 
9535 /*************************************************************************
9536 
9537                          Get_Default_Dim_Member
9538 
9539 Purpose:  This procedure returns the default dimension member code and display code
9540           given a ledger ID, table name and column name.
9541 
9542 Usage:    Ledger ID is an optional parameter because:
9543            1) Only value set required (VSR) dimensions require the ledger ID.
9544               In fact, for non VSR dimensions, if Ledger ID is provided,
9545               it is ignored.
9546            2) Even for VSR dimensions, if the Ledger ID is left null, this
9547               API will attempt to find a default ledger based on the
9548               User Profile: 'FEM_LEDGER'.
9549 
9550 Return variables:
9551    x_member_code           - Member ID/Code
9552    x_member_data_type      - Member ID/Code Data Type
9553                             (from FEM_XDIM_DIMENSIONS.MEMBER_DATA_TYPE_CODE)
9554    x_member_display_code   - Member Display Code
9555    x_return_status
9556       - FND_API.G_RET_STS_SUCCESS ('S') if default member was found
9557       - FND_API.G_RET_STS_ERROR ('E') if no default member exists
9558       - FND_API.G_RET_STS_UNEXP_ERROR if something unexpected occurs
9559 
9560 *************************************************************************/
9561 
9562 PROCEDURE Get_Default_Dim_Member (
9563    p_api_version                 IN  NUMBER DEFAULT 1.0,
9564    p_init_msg_list               IN  VARCHAR2 DEFAULT c_false,
9565    p_commit                      IN  VARCHAR2 DEFAULT c_false,
9566    p_encoded                     IN  VARCHAR2 DEFAULT c_true,
9567    p_table_name                  IN  VARCHAR2,
9568    p_column_name                 IN  VARCHAR2,
9569    p_ledger_id                   IN  NUMBER DEFAULT NULL,
9570    x_member_code                 OUT NOCOPY VARCHAR2,
9571    x_member_data_type            OUT NOCOPY VARCHAR2,
9572    x_member_display_code         OUT NOCOPY VARCHAR2,
9573    x_return_status               OUT NOCOPY VARCHAR2,
9574    x_msg_count                   OUT NOCOPY NUMBER,
9575    x_msg_data                    OUT NOCOPY VARCHAR2
9576 )
9577 IS
9578 
9579   C_MODULE        CONSTANT FND_LOG_MESSAGES.module%TYPE :=
9580      'fem.plsql.fem_dimension_util_pkg.get_default_dim_member.table';
9581   C_API_VERSION   CONSTANT NUMBER := 1.0;
9582   C_API_NAME      CONSTANT VARCHAR2(30)  := 'Get_Default_Dim_Member';
9583 
9584   v_dim_id           FEM_DIMENSIONS_B.dimension_id%TYPE;
9585 
9586 BEGIN
9587 
9588   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9589     FEM_ENGINES_PKG.TECH_MESSAGE(
9590       p_severity => FND_LOG.level_procedure,
9591       p_module   => C_MODULE,
9592       p_msg_text => 'Begin Procedure');
9593   END IF;
9594 
9595   -- Initialize return status to unexpected error
9596   x_return_status := c_unexp;
9597 
9598   -- Check for call compatibility.
9599   IF NOT FND_API.Compatible_API_Call (C_API_VERSION,
9600                 p_api_version,
9601                 C_API_NAME,
9602                 G_PKG_NAME)
9603   THEN
9604     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9605       FEM_ENGINES_PKG.TECH_MESSAGE(
9606         p_severity => FND_LOG.level_statement,
9607         p_module   => C_MODULE,
9608         p_msg_text => 'API Version ('||C_API_VERSION||') not compatible with '
9609                     ||'passed in version ('||p_api_version||')');
9610     END IF;
9611     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
9612                               p_count => x_msg_count,
9613                               p_data => x_msg_data);
9614     RAISE e_unexp;
9615   END IF;
9616 
9617   Validate_OA_Params (
9618     p_api_version => p_api_version,
9619     p_init_msg_list => p_init_msg_list,
9620     p_commit => p_commit,
9621     p_encoded => p_encoded,
9622     x_return_status => x_return_status);
9623 
9624   IF (x_return_status <> c_success) THEN
9625     FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded,
9626                               p_count => x_msg_count,
9627                               p_data => x_msg_data);
9628     RETURN;
9629   END IF;
9630 
9631   IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9632     FEM_ENGINES_PKG.TECH_MESSAGE(
9633       p_severity => FND_LOG.level_statement,
9634       p_module   => C_MODULE,
9635       p_msg_text => 'p_ledger_id = '||to_char(p_ledger_id));
9636     FEM_ENGINES_PKG.TECH_MESSAGE(
9637       p_severity => FND_LOG.level_statement,
9638       p_module   => C_MODULE,
9639       p_msg_text => 'p_table_name = '||p_table_name);
9640     FEM_ENGINES_PKG.TECH_MESSAGE(
9641       p_severity => FND_LOG.level_statement,
9642       p_module   => C_MODULE,
9643       p_msg_text => 'p_column_name = '||p_column_name);
9644   END IF;
9645 
9646   -- Determine the dimension associated with the column
9647   BEGIN
9648     SELECT dimension_id
9649     INTO v_dim_id
9650     FROM fem_tab_columns_b
9654     IF v_dim_id IS NULL THEN
9651     WHERE table_name = Upper(p_table_name)
9652     AND column_name = Upper(p_column_name);
9653 
9655       IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9656         FEM_ENGINES_PKG.TECH_MESSAGE(
9660       END IF;
9657           p_severity => FND_LOG.level_statement,
9658           p_module   => C_MODULE,
9659           p_msg_text => 'Column does not point to a dimension');
9661       RAISE e_unexp;
9662     END IF;
9663 
9664   EXCEPTION WHEN no_data_found THEN
9665     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9666       FEM_ENGINES_PKG.TECH_MESSAGE(
9667         p_severity => FND_LOG.level_statement,
9668         p_module   => C_MODULE,
9669         p_msg_text => 'Column is not registered in FEM_TAB_COLUMNS_B');
9670     END IF;
9671     RAISE e_unexp;
9672   END;
9673 
9674   -- Call Get_Default_Dim_Member with the dimension ID
9675   -- to obtain the default dim member
9676   Get_Default_Dim_Member (
9677               p_api_version            => 1.0,
9678               p_init_msg_list          => p_init_msg_list,
9679               p_commit                 => p_commit,
9680               p_encoded                => p_encoded,
9681               x_return_status          => x_return_status,
9682               x_msg_count              => x_msg_count,
9683               x_msg_data               => x_msg_data,
9684               p_dimension_id           => v_dim_id,
9685               p_ledger_id              => p_ledger_id,
9686               x_member_code            => x_member_code,
9687               x_member_data_type       => x_member_data_type,
9688               x_member_display_code    => x_member_display_code);
9689 
9690   IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9691     FEM_ENGINES_PKG.TECH_MESSAGE(
9695   END IF;
9692       p_severity => FND_LOG.level_procedure,
9693       p_module   => C_MODULE,
9694       p_msg_text => 'End Procedure');
9696 
9697 EXCEPTION
9698   WHEN others THEN
9699     IF FND_LOG.level_statement >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9700       FEM_ENGINES_PKG.TECH_MESSAGE(
9701         p_severity => FND_LOG.level_statement,
9702         p_module   => C_MODULE,
9703         p_msg_text => 'Unexpected error.');
9704     END IF;
9705     IF FND_LOG.level_procedure >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
9706       FEM_ENGINES_PKG.TECH_MESSAGE(
9707         p_severity => FND_LOG.level_procedure,
9708         p_module   => C_MODULE,
9709         p_msg_text => 'End Procedure');
9710     END IF;
9711     x_return_status := c_unexp;
9712 
9713 END Get_Default_Dim_Member;
9714 
9715 
9716 /*************************************************************************
9717 
9718                       Get_Dim_Member_Display_Code
9719 
9720 *************************************************************************/
9721 
9722 FUNCTION Get_Dim_Member_Display_Code (
9723    p_dimension_id                IN  NUMBER,
9724    p_dimension_member_id         IN  VARCHAR2,
9725    p_dimension_member_vs_id      IN  NUMBER DEFAULT NULL
9726 ) RETURN VARCHAR2
9727 IS
9728 
9729 v_dim_id         NUMBER;
9730 v_vs_id          NUMBER;
9731 v_mem_b_tab      VARCHAR2(30);
9732 v_mem_col        VARCHAR2(30);
9733 v_mem_dc_col     VARCHAR2(30);
9734 v_vs_req_flg     VARCHAR2(1);
9735 
9736 v_member_display_code    VARCHAR(150);
9737 
9738 v_sql_stmt       VARCHAR2(32767);
9739 
9740 e_error          EXCEPTION;
9741 
9742 BEGIN
9743 
9744 ---------------------------------
9745 -- Verify the specified Dimension
9746 ---------------------------------
9747 BEGIN
9748    SELECT dimension_id
9749    INTO   v_dim_id
9750    FROM   fem_dimensions_b
9751    WHERE  dimension_id = p_dimension_id;
9752 EXCEPTION
9753    WHEN no_data_found THEN
9754       RAISE e_error;
9755 END;
9756 
9757 -------------------------------
9758 -- Get the Dimension's metadata
9759 -------------------------------
9760 SELECT member_b_table_name,
9761        member_col,
9762        member_display_code_col,
9763        value_set_required_flag
9764 INTO   v_mem_b_tab,
9765        v_mem_col,
9766        v_mem_dc_col,
9767        v_vs_req_flg
9768 FROM   fem_xdim_dimensions
9769 WHERE  dimension_id = v_dim_id;
9770 
9771 ---------------------------------
9772 -- Verify the specified Value Set
9773 ---------------------------------
9774 IF (v_vs_req_flg = 'Y')
9775 THEN
9776    BEGIN
9777       SELECT value_set_id
9778       INTO   v_vs_id
9779       FROM   fem_value_sets_b
9780       WHERE  value_set_id = p_dimension_member_vs_id
9781       AND    dimension_id = v_dim_id;
9782    EXCEPTION
9783       WHEN no_data_found THEN
9784          RAISE e_error;
9785    END;
9786 ELSE
9787    v_vs_id := null;
9788 END IF;
9789 
9790 ----------------
9791 -- Get Member ID
9792 ----------------
9793 IF (v_vs_id  IS NOT NULL)
9794 THEN
9795    v_sql_stmt :=
9796    'SELECT '||v_mem_dc_col||
9797    ' FROM '||v_mem_b_tab||
9798    ' WHERE '||v_mem_col||' = :b_dimension_member_id'||
9799    ' AND value_set_id = :b_vs_id';
9800 
9801    BEGIN
9802       EXECUTE IMMEDIATE v_sql_stmt
9803       INTO v_member_display_code
9804       USING p_dimension_member_id,
9805             v_vs_id;
9806    EXCEPTION
9807       WHEN no_data_found THEN
9808          RAISE e_error;
9809    END;
9810 ELSE
9811    v_sql_stmt :=
9812    'SELECT '||v_mem_dc_col||
9813    ' FROM '||v_mem_b_tab||
9814    ' WHERE '||v_mem_col||' = :b_dimension_member_id';
9815 
9816    BEGIN
9817       EXECUTE IMMEDIATE v_sql_stmt
9818       INTO v_member_display_code
9819       USING p_dimension_member_id;
9820    EXCEPTION
9821       WHEN no_data_found THEN
9822          RAISE e_error;
9823    END;
9824 END IF;
9825 
9826 RETURN v_member_display_code;
9827 
9828 ------------------
9829 -- Exception Block
9830 ------------------
9831 EXCEPTION
9832 
9833 WHEN e_error THEN
9834    RETURN null;
9835 
9836 END Get_Dim_Member_Display_Code;
9837 
9838 
9839 /*************************************************************************
9840 
9841                       Get_Dim_Member_Name
9842 
9843 *************************************************************************/
9844 
9845 FUNCTION Get_Dim_Member_Name (
9846    p_dimension_id                IN  NUMBER,
9847    p_dimension_member_id         IN  VARCHAR2,
9848    p_dimension_member_vs_id      IN  NUMBER DEFAULT NULL
9849 ) RETURN VARCHAR2
9850 IS
9851 
9852 v_dim_id         NUMBER;
9853 v_vs_id          NUMBER;
9854 v_mem_vl_tab     VARCHAR2(30);
9855 v_mem_col        VARCHAR2(30);
9856 v_mem_name_col   VARCHAR2(30);
9857 v_vs_req_flg     VARCHAR2(1);
9858 
9859 v_member_name    VARCHAR(150);
9860 
9861 v_sql_stmt       VARCHAR2(32767);
9862 
9863 e_error          EXCEPTION;
9864 
9865 BEGIN
9866 
9867 ---------------------------------
9868 -- Verify the specified Dimension
9869 ---------------------------------
9870 BEGIN
9871    SELECT dimension_id
9872    INTO   v_dim_id
9873    FROM   fem_dimensions_b
9874    WHERE  dimension_id = p_dimension_id;
9875 EXCEPTION
9876    WHEN no_data_found THEN
9877       RAISE e_error;
9878 END;
9879 
9880 -------------------------------
9881 -- Get the Dimension's metadata
9885        member_name_col,
9882 -------------------------------
9883 SELECT member_vl_object_name,
9884        member_col,
9886        value_set_required_flag
9887 INTO   v_mem_vl_tab,
9888        v_mem_col,
9889        v_mem_name_col,
9890        v_vs_req_flg
9891 FROM   fem_xdim_dimensions
9892 WHERE  dimension_id = v_dim_id;
9893 
9894 ---------------------------------
9895 -- Verify the specified Value Set
9896 ---------------------------------
9897 IF (v_vs_req_flg = 'Y')
9898 THEN
9899    BEGIN
9900       SELECT value_set_id
9901       INTO   v_vs_id
9902       FROM   fem_value_sets_b
9903       WHERE  value_set_id = p_dimension_member_vs_id
9904       AND    dimension_id = v_dim_id;
9905    EXCEPTION
9906       WHEN no_data_found THEN
9907          RAISE e_error;
9908    END;
9909 ELSE
9910    v_vs_id := null;
9911 END IF;
9912 
9913 ----------------
9914 -- Get Member ID
9915 ----------------
9916 IF (v_vs_id  IS NOT NULL)
9917 THEN
9918    v_sql_stmt :=
9919    'SELECT '||v_mem_name_col||
9920    ' FROM '||v_mem_vl_tab||
9921    ' WHERE '||v_mem_col||' = :b_dimension_member_id'||
9922    ' AND value_set_id = :b_vs_id';
9923 
9924    BEGIN
9925       EXECUTE IMMEDIATE v_sql_stmt
9926       INTO v_member_name
9927       USING p_dimension_member_id,
9928             v_vs_id;
9929    EXCEPTION
9930       WHEN no_data_found THEN
9931          RAISE e_error;
9932    END;
9933 ELSE
9934    v_sql_stmt :=
9935    'SELECT '||v_mem_name_col||
9936    ' FROM '||v_mem_vl_tab||
9937    ' WHERE '||v_mem_col||' = :b_dimension_member_id';
9938 
9939    BEGIN
9940       EXECUTE IMMEDIATE v_sql_stmt
9941       INTO v_member_name
9942       USING p_dimension_member_id;
9943    EXCEPTION
9944       WHEN no_data_found THEN
9945          RAISE e_error;
9946    END;
9947 END IF;
9948 
9949 RETURN v_member_name;
9950 
9951 ------------------
9952 -- Exception Block
9953 ------------------
9954 EXCEPTION
9955 
9956 WHEN e_error THEN
9957    RETURN null;
9958 
9959 END Get_Dim_Member_Name;
9960 
9961 
9962 ---------------------------------------------
9963 
9964 END FEM_Dimension_Util_Pkg;