DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_BIS_DIM_OBJ_PUB

Source


1 PACKAGE BODY BSC_BIS_DIM_OBJ_PUB AS
2 /* $Header: BSCDPMDB.pls 120.30 2008/01/09 13:07:04 lbodired ship $ */
3 /*
4 REM +=======================================================================+
5 REM |    Copyright (c) 2002 Oracle Corporation, Redwood Shores, CA, USA     |
6 REM |                         All rights reserved.                          |
7 REM +=======================================================================+
8 REM | FILENAME                                                              |
9 REM |     BSCDPMDB.pls                                                      |
10 REM |                                                                       |
11 REM | DESCRIPTION                                                           |
12 REM |     Module: Wrapper for Dimensions, part of PMD APIs                  |
13 REM |                                                                       |
14 REM | NOTES                                                                 |
15 REM | 14-FEB-2003 PAJOHRI  Created.                                         |
16 REM | 15-MAY-2003 ADRAO    Added Incremental Changes                        |
17 REM | 06-JUN-2003 ADRAO    Added Granular Locking                           |
18 REM | 17-JUL-2003 ADRAO    Bug#3054935 Changed following procedures         |
19 REM |                      BSC_BIS_KPI_MEAS_PUB.Assign_Dims_To_Dim_Set()    |
20 REM |                      BSC_BIS_KPI_MEAS_PUB.Unassign_Dims_To_Dim_Set()  |
21 REM |                      to use 'NULL' timestamp                          |
22 REM | 17-JUL-2003 PAJOHRI  Bug #3053701, Fixed API Create_Pmf_Views         |
23 REM | 29-JUL-2003 PAJOHRI  Bug #3049659                                     |
24 REM | 11-AUG-2003 ADEULGAO fixed bug#3081595                                |
25 REM | 12-AUG-2003 ADRAO    Added new index for Loader Performance for       |
26 REM |                      for Dimension Object tables  Bug#3090828         |
27 REM | 20-OCT-2003 PAJOHRI  Bug #3179995                                     |
28 REM | 20-OCT-2003 PAJOHRI  Bug #3179995                                     |
29 REM | 29-OCT-2003 PAJOHRI  Bug #3120190                                     |
30 REM | 04-NOV-2003 PAJOHRI  Bug #3152258                                     |
31 REM | 04-NOV-2003 PAJOHRI  Bug #3220613                                     |
32 REM | 04-NOV-2003 PAJOHRI  Bug #3232366                                     |
33 REM | 04-NOV-2003 PAJOHRI  Bug #3262631                                     |
34 REM | 08-DEC-2003 KYADAMAK Bug #3225685                                     |
35 REM | 24-DEC-2003 MEASTMON Bug #3337923                                     |
36 REM | 26-FEB-2004 MEASTMON Bug #3458428                                     |
37 REM | 27-FEB-2004 adeulgao fixed bug#3431750                                |
38 REM | 02-MAR-2004 ankgoel  Bug #3464470                                     |
39 REM | 29-MAR-2004 PAJOHRI  Bug #3530886, Modified tablespaces for tables    |
40 REM | 30-MAR-2004 KYADAMAK BUG #3516466 Passing default appid as 271        |
41 REM | 12-APR-2004 PAJOHRI  Bug #3426566, modified the logic to use dimension|
42 REM |                      'UNASSIGNED' always if there if no Dimension/    |
43 REM |                      Dimension Object association for PMF and retain  |
44 REM |                      'All Enable' flag                                |
45 REM | 19-APR-2004 PAJOHRI  Bug #3583394, fix BIS_LEVELS UI Issues           |
46 REM |                      Other issues related to Autonmous Transactions,  |
47 REM |                      and performance also fixed,                      |
48 REM | 23-APR-2004 ASHANKAR  Bug #3518610,Added the fucntion Validate        |
49 REM |                       listbutton                                      |
50 REM | 16-JUN-2004 PAJOHRI   Bug #3659486, to support 'All Enable' flag in   |
51 REM |                       Dimension/Dimension Object Association Page     |
52 REM | 07-JUL-2004 WLEUNG    Bug 3751932, always create/replace PMF View     |
53 REM |                       modified Initialize_Pmf_Recs()                  |
54 REM | 09-AUG-2004 sawu      Used c_BSC_DIM_OBJ in create_dim_object         |
55 REM | 11-AUG-2004 sawu     Added create_dim_obj() for bug#3819855 with      |
56 REM |                      p_is_default_short_name                          |
57 REM | 17-AUG-2004 ADRAO    Modified Create_Pmf_Views to work with BSC511    |
58 REM |                      at the code level for Bug#3836170                |
59 REM |25-AUG-2004 visuri    Modified Initialize_Bsc_Recs() and               |
60 REM |                      Update_Dim_Object() for bug#3842366              |
61 REM | 17-AUG-2004 wleung   modified Bug#3784852 Assign_Unassign_Dimensions  |
62 REM | 09-SEP-2004 visuri   Shifted Remove_Empty_Dims_For_DimSet() from      |
63 REM |                      BSC_BIS_KPI_MEAS_PUB to BSC_BIS_DIMENSION_PUB    |
64 REM | 14-SEP-2004 KYADAMAK added function get_valid_ddlentry_frm_name()     |
65 REM | 08-OCT-2004 rpenneru added Modified for bug#3939995                   |
66 REM | 21-OCT-2004 akoduri added Modified for bug#3930280                    |
67 REM | 03-FEB-2005 kyadamak modified for the bug#4091924                     |
68 REM | 08-Feb-04   skchoudh  Enh#3873195 drill_to_form_function column       |
69 REM |                  is added                                             |
70 REM | 14-FEB-2005 ashankar modified Alter_One_By_N_Tables and               |
71 REM |                      Alter_M_By_N_Tables.Added the cascading logic    |
72 REM |                      to update RELATION_COL in BSC_SYS_DIM_LEVEL_RELS |
73 REM | 15-FEB-05   ppandey   Enh #4016669, support ID, Value for Autogen DO  |
74 REM | 16-FEB-2005 ashankar  Bug#4184438 Added the Synch Up API              |
75 REM |                       BSC_SYNC_MVLOGS.Sync_dim_table_mv_log           |
76 REM | 11-Mar-05   ankgoel   Enh#2690720 - AG Report enh                     |
77 REM | 30-Mar-05   ankgoel   Support 'All' enable/disable for BSC dim objects|
78 REM |                       from Report Designer                            |
79 REM | 31-MAR-05   adrao     Modified API check_sametype_dims to remove      |
80 REM |                       disctinction betweem BSC and BIS Dimesion Objs  |
81 REM |  08-APR-2005 kyadamak generating unique master table for PMF dimension|
82 REM |                       objects for the bug# 4290359                    |
83 REM |  02-May-2005 visuri   Modified for Bug#4323383                        |
84 REM |  18-Jul-2005 ppandey  Enh #4417483, Restrict Internal/Calendar Dims   |
85 REM |  20-Jul-2005 ppandey  Bug #4495539, MIXED Dim Obj not allowed from DD |
86 REM |  22-Jul-2005 kyadamak Modified for bug#4091924                        |
87 REM |  09-AUG-2005 adrao    Fixed Bug#4383962 for prototype value gen       |
88 REM |  11-AUG-2005 ppandey  Bug #4324947 Validation for Dim,Dim Obj in Rpt  |
89 REM |  27-Sep-2005 ankgoel  Bug#4625598,4626579 Uptake common API to get dim|
90 REM |                       level values                                    |
91 REM |  27-SEP-2005 ashankar Bug#4630859  Removed the duplicate objectives   |
92 REM |  28-SEP-2005 ashankar Bug#4630892  Added a new API is_Obj_Display_Frmt_Change |
93 REM |                       which will check for format changes and the API |
94 REM |                       is_KPI_Flag_For_DimObject check for Structural  |
95 REM |                       Changes                                         |
96 REM | 25-OCT-2005 kyadamak  Removed literals for Enhancement#4618419        |
97 REM | 27-DEC-2005 kyadamak  Calling BIA API for bug#4875047                 |
98 REM | 02-Jan-2006   akoduri Bug#4611303 - Support For Enable/Disable All    |
99 REM |                       In Report Designer                              |
100 REM | 06-Jan-2006   akoduri   Enh#4739401 - Hide Dimensions/Dim Objects     |
101 REM | 13-jan-2005 ashankar  Bug#4947293  calling the API sync_dimension_table|
102 REM |                       dynamically                                     |
103 REM | 31-JAN-2006 adrao     Added APIs                                      |
104 REM |                            - Is_Recursive_Relationship                |
105 REM |                            - Get_Unique_Level_Pk_Col                  |
106 REM |                                                                       |
107 REM |                       Also modified the logic to ensure that when a   |
108 REM |                       PMF DO is under a recursive relationship, the   |
109 REM |                       corresponding BSC View is also changed          |
110 REM | 10-FEB-2006 akoduri   Bug#4997042 Cascade 'All' property from dim     |
111 REM |                       designer to dim groups of Reports               |
112 REM | 15-FEB-2006 visuri    bug#4757375 Calendar Create Performance Issue   |
113 REM | 31-MAR-2006 akoduri   Bug #5048186 No View creation for obsoleted     |
114 REM |                       BIS Dimension objects                           |
115 REM | 26-Apr-2006  psomesul  Enh#5124125 - Creating BSC wrapper view of a   |
116 REM |                                 BIS type Dim. Obj.                    |
117 REM |  15-JUN-2006 ashankar Bug#5254737 Made changes to Create_Dim_Object   |
118 REM |                       Method.Removed the parameter value 'TRUE' in    |
119 REM |                       FND_MESSAGE.SET_TOKEN API                       |
120 REM | 20-FEB-2006  akoduri  Bug #5880618 Validate_PMF_Base_View API is      |
121 REM |                       is failing when more than one parent is passed  |
122 REM | 29-JUN-2007  akoduri  Bug #6155820 Structural change warning is not   |
123 REM |                       displayed during create dimension object        |
124 REM | 21-SEP-2007  ankgoel  Bug#6391292 - Handled validation of Manager's   |
125 REM |                       dim object view separately                      |
126 REM | 09-JAN-2008 lbodired  Bug#6707712 PL/SQL error while creating custom  |
127 REM |                       Period for the calendar                             |
128 REM +=======================================================================+
129 */
130 CONFIG_LIMIT_DIM              CONSTANT        NUMBER := 8;
131 /*********************************************************************************/
132 TYPE KPI_Dim_Set_Type IS Record
133 (       p_kpi_id            BSC_KPI_DIM_SETS_TL.indicator%TYPE
134     ,   p_dim_set_id        BSC_KPI_DIM_SETS_TL.dim_set_id%TYPE
135     ,   p_Name              BSC_KPIS_VL.name%TYPE
136 );
137 /*********************************************************************************/
138 
139 TYPE KPI_Dim_Set_Table_Type IS TABLE OF KPI_Dim_Set_Type INDEX BY BINARY_INTEGER;
140 /********************************************************************************
141       FUNCTION TO CHECK IF PASSED PARAMETER IS IS KEY-WORD OR NOT
142 ********************************************************************************/
143 FUNCTION is_SQL_Key_Word
144 (
145     p_value   IN  VARCHAR2
146 ) RETURN BOOLEAN;
147 /*******************************************************************************
148                FUNCTION TO ALTER
149                M x N Tables
150 ********************************************************************************/
151 FUNCTION Alter_M_By_N_Tables
152 (       p_Dim_Level_Rec     IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
153     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
154     ,   x_return_status         OUT NOCOPY  VARCHAR2
155     ,   x_msg_count             OUT NOCOPY  NUMBER
156     ,   x_msg_data              OUT NOCOPY  VARCHAR2
157 )
158 RETURN BOOLEAN;
159 /*******************************************************************************
160                FUNCTION TO strip off invalid characters in the given string
161 ********************************************************************************/
162 
163 FUNCTION  get_valid_ddlentry_frm_name(
164     p_name          IN VARCHAR2
165 )RETURN VARCHAR2;
166 
167 /*******************************************************************************
168                FUNCTION TO ALTER One x N Child Tables
169 ********************************************************************************/
170 FUNCTION Alter_One_By_N_Tables
171 (       p_Dim_Level_Rec     IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
172     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
173     ,   x_return_status         OUT NOCOPY  VARCHAR2
174     ,   x_msg_count             OUT NOCOPY  NUMBER
175     ,   x_msg_data              OUT NOCOPY  VARCHAR2
176 )
177 RETURN BOOLEAN;
178 /*******************************************************************************
179                FUNCTION TO CREATE BSC DIMENSION OBJECTS MASTER TABLES
180 ********************************************************************************/
181 FUNCTION Create_Bsc_Master_Tabs
182 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
183     ,   x_return_status         OUT NOCOPY  VARCHAR2
184     ,   x_msg_count             OUT NOCOPY  NUMBER
185     ,   x_msg_data              OUT NOCOPY  VARCHAR2
186 )
187 RETURN BOOLEAN;
188 /*******************************************************************************
189                FUNCTION TO ALTER BSC DIMENSION OBJECTS MASTER TABLES
190 ********************************************************************************/
191 FUNCTION Alter_Bsc_Master_Tabs
192 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
193     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
194     ,   x_return_status         OUT NOCOPY  VARCHAR2
195     ,   x_msg_count             OUT NOCOPY  NUMBER
196     ,   x_msg_data              OUT NOCOPY  VARCHAR2
197 )
198 RETURN BOOLEAN;
199 /*******************************************************************************
200                       FUNCTION TO CREATE PMF DIMENSION-OBJ VIEWS
201 ********************************************************************************/
202 FUNCTION Create_Pmf_Views
203 (       p_Dim_Level_Rec     IN  OUT   NOCOPY    BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
204     ,   x_return_status         OUT   NOCOPY    VARCHAR2
205     ,   x_msg_count             OUT   NOCOPY    NUMBER
206     ,   x_msg_data              OUT   NOCOPY    VARCHAR2
207 )
208 RETURN BOOLEAN;
209 /*******************************************************************************/
210 FUNCTION check_sametype_dims
211 (       p_dim_obj_name              IN  VARCHAR2
212     ,   p_dim_obj_short_name        IN  VARCHAR2
213     ,   p_dim_obj_source            IN  VARCHAR2
214     ,   p_dim_short_names       IN  VARCHAR2
215     ,   p_Restrict_Dim_Validate     IN  VARCHAR2   := NULL
216     ,   x_return_status             OUT    NOCOPY   VARCHAR2
217     ,   x_msg_count                 OUT    NOCOPY   NUMBER
218     ,   x_msg_data                  OUT    NOCOPY   VARCHAR2
219 )RETURN BOOLEAN;
220 
221 /******************************************************************************/
222 FUNCTION is_Obj_Display_Frmt_Change
223 (       p_dim_obj_short_name        IN          VARCHAR2
224     ,   p_Source                    IN          VARCHAR2
225     ,   p_source_table              IN          VARCHAR2
226     ,   p_table_column              IN          VARCHAR2
227     ,   p_prototype_default_value   IN          VARCHAR2
228     ,   p_maximum_code_size         IN          NUMBER
229     ,   p_maximum_name_size         IN          NUMBER
230     ,   p_dim_short_names           IN          VARCHAR2
231     ,   x_obj_names                 OUT NOCOPY  VARCHAR2
232 ) RETURN BOOLEAN;
233 
234 /******************************************************************************/
235 -- Added for Bug#4758995
236 FUNCTION Is_Recursive_Relationship
237 (
238       p_Short_Name       IN VARCHAR2
239     , x_Relation_Col     OUT NOCOPY VARCHAR2
240     , x_Data_Source      OUT NOCOPY VARCHAR2
241     , x_Data_Source_Type OUT NOCOPY VARCHAR2
242 ) RETURN VARCHAR2;
243 /******************************************************************************/
244 
245 FUNCTION Validate_PMF_Base_View_Mgr (
246   p_view_name        IN VARCHAR2
247 , p_parent_id_exists IN VARCHAR2
248 , p_parent_column    IN VARCHAR2
249 ) RETURN NUMBER;
250 /******************************************************************************/
251 
252 /*******************************************************************************
253                   FUNCTION TO CHECK IF VALID ALPHA NUMERIC CHARACTER
254 ********************************************************************************/
255 FUNCTION is_Valid_AlphaNum
256 (
257     p_SQL_Ident IN VARCHAR2
258 ) RETURN BOOLEAN
259 IS
260     l_SQL_Ident VARCHAR2(30);
261 BEGIN
262     IF (p_SQL_Ident IS NULL) THEN
263         RETURN FALSE;
264     END IF;
265     l_SQL_Ident :=  UPPER(p_SQL_Ident);
266     IF (REPLACE(TRANSLATE(l_SQL_Ident, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_',
267                                        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'), 'X', '') IS NOT NULL) THEN
268         RETURN FALSE;
269     END IF;
270     RETURN TRUE;
271 END is_Valid_AlphaNum;
272 
273 /*******************************************************************************
274               FUNCTION TO CHECK IT THE IDENTIFIER IS VALID SQL IDENTIFIER
275 ********************************************************************************/
276 FUNCTION is_Valid_Identifier
277 (
278     p_SQL_Ident IN VARCHAR2
279 ) RETURN BOOLEAN
280 IS
281     l_SQL_Ident VARCHAR2(30);
282 BEGIN
283     IF (p_SQL_Ident IS NULL) THEN
284         RETURN FALSE;
285     END IF;
286     IF (LENGTH(p_SQL_Ident) > 30) THEN
287         RETURN FALSE;
288     END IF;
289     IF (SUBSTR(p_SQL_Ident, 1,1) = '_') THEN
290         RETURN FALSE;
291     END IF;
292     l_SQL_Ident :=  UPPER(p_SQL_Ident);
293     IF(REPLACE(TRANSLATE(SUBSTR(l_SQL_Ident, 1, 1), '0123456789', '0000000000'), '0', '') IS NULL) THEN
294         RETURN FALSE;
295     END IF;
296     IF (REPLACE(TRANSLATE(l_SQL_Ident, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_',
297                                        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'), 'X', '') IS NOT NULL) THEN
298         RETURN FALSE;
299     END IF;
300     RETURN TRUE;
301 END is_Valid_Identifier;
302 
303 /*******************************************************************************
304                       FUNCTION TO INITIALIZE BSC RECORDS
305 ********************************************************************************/
306 FUNCTION Initialize_Bsc_Recs
307 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
308     ,   x_return_status         OUT NOCOPY  VARCHAR2
309     ,   x_msg_count             OUT NOCOPY  NUMBER
310     ,   x_msg_data              OUT NOCOPY  VARCHAR2
311 ) RETURN BOOLEAN;
312 
313 /********************************************************************************
314                    FUNCTION TO RETRIEVE CHILD DIM OBJECTS
315  ********************************************************************************/
316 FUNCTION Get_Child_Dim_Objs
317 ( p_Dim_Level_Id  IN NUMBER
318 ) RETURN VARCHAR2 IS
319 
320 l_child_dim_obj VARCHAR2(32000);
321 
322 CURSOR c_Dim_Level_Child IS
323 SELECT dim_level_id
324 FROM BSC_SYS_DIM_LEVEL_RELS
325 WHERE parent_dim_level_id = p_Dim_Level_Id
326 AND RELATION_TYPE <> 2;
327 
328 BEGIN
329 l_child_dim_obj := NULL;
330 
331 FOR cdl in c_Dim_Level_Child LOOP
332     IF (l_child_dim_obj IS NULL) THEN
333         l_child_dim_obj := cdl.dim_level_id;
334     ELSE
335         l_child_dim_obj := l_child_dim_obj||','||cdl.dim_level_id;
336     END IF;
337 END LOOP;
338 
339 RETURN l_child_dim_obj;
340 
341 END Get_Child_Dim_Objs;
342 
343 /*********************************************************************************/
344 
345 -- Modified this API for Bug#4383962
346 -- After A999 - this API will bomb, instead this API will user A - Z to increase
347 -- generation range. For example if A999 is passed, then B0 will be returned.
348 -- If D999 is passed E0 will be returned.
349 FUNCTION get_Next_Alias
350 (
351     p_Alias        IN   VARCHAR2
352 ) RETURN VARCHAR2
353 IS
354     l_return    VARCHAR2(4);
355     l_count     NUMBER;
356 
357     l_Alias_Prefix      VARCHAR2(8);
358     l_Alias_Postfix     VARCHAR2(8);
359     l_Alias_Postfix_Num NUMBER;
360 BEGIN
361     IF (p_Alias IS NULL) THEN
362         l_return :=  'A';
363     ELSE
364         l_Alias_Prefix  := SUBSTR(p_Alias, 1, 1);
365         l_Alias_Postfix := SUBSTR(p_Alias, 2);
366 
367         l_Alias_Postfix_Num := TO_NUMBER(l_Alias_Postfix);
368 
369         l_count := LENGTH(p_Alias);
370 
371         IF (l_count = 1) THEN
372             l_return   := l_Alias_Prefix || '0';
373         ELSIF (l_count > 1) THEN
374             IF(l_Alias_Postfix_Num >= 999) THEN
375                 l_Alias_Postfix     := '0';
376                 l_Alias_Prefix      := FND_GLOBAL.LOCAL_CHR(ASCII(SUBSTR(p_Alias, 1, 1))+1);
377             ELSE
378                 l_Alias_Postfix     := TO_CHAR(l_Alias_Postfix_Num+1);
379             END IF;
380 
381             l_return    := l_Alias_Prefix || l_Alias_Postfix;
382         END IF;
383     END IF;
384     RETURN l_return;
385 EXCEPTION
386     WHEN OTHERS THEN
387         RETURN p_Alias;
388 END get_Next_Alias;
389 
390 /*********************************************************************************/
391 
392 FUNCTION Is_More
393 (       p_dim_short_names   IN  OUT NOCOPY  VARCHAR2
394     ,   p_dim_name          OUT NOCOPY      VARCHAR2
395 ) RETURN BOOLEAN;
396 /*********************************************************************************
397    Set the ALL Enable Flag, must be called only for PMF type Dimension Objects
398 *********************************************************************************/
399 PROCEDURE Set_All_Enable_Flag
400 (       p_commit                IN              VARCHAR2   := FND_API.G_TRUE
401     ,   p_Dim_Obj_Short_Name    IN              VARCHAR2
402     ,   p_All_Enabled           IN              NUMBER
403     ,   x_return_status         OUT    NOCOPY   VARCHAR2
404     ,   x_msg_count             OUT    NOCOPY   NUMBER
405     ,   x_msg_data              OUT    NOCOPY   VARCHAR2
406 ) IS
407     l_Bsc_Dim_Obj_ID        BSC_SYS_DIM_LEVELS_B.Dim_Level_ID%TYPE;
408     l_Bsc_Group_ID          BSC_SYS_DIM_GROUPS_TL.Dim_Group_ID%TYPE;
409     l_Dim_Short_Name        BIS_DIMENSIONS.Short_Name%TYPE;
410 
411     CURSOR  c_Bis_Levels IS
412     SELECT  B.Short_Name
413     FROM    BIS_LEVELS     A
414          ,  BIS_DIMENSIONS B
415     WHERE   A.Short_Name   = p_Dim_Obj_Short_Name
416     AND     A.Dimension_Id = B.Dimension_Id;
417 BEGIN
418 
419     SAVEPOINT SyncPMFAllInPMD;
420     IF ((p_All_Enabled IS NOT NULL) AND ((p_All_Enabled = 0) OR (p_All_Enabled = -1))) THEN
421         IF (c_Bis_Levels%ISOPEN) THEN
422             CLOSE c_Bis_Levels;
423         END IF;
424         OPEN  c_Bis_Levels;
425             FETCH   c_Bis_Levels
426             INTO    l_Dim_Short_Name;
427         CLOSE  c_Bis_Levels;
428         l_Bsc_Group_ID     := BSC_BIS_DIMENSION_PUB.Get_Bsc_Dimension_ID(l_Dim_Short_Name);
429         l_Bsc_Dim_Obj_ID   := BSC_BIS_DIM_OBJ_PUB.Get_Bsc_Dim_Obj_ID(p_Dim_Obj_Short_Name);
430 
431         UPDATE BSC_SYS_DIM_LEVELS_BY_GROUP
432         SET    Total_Flag   =  p_All_Enabled
433         WHERE  Dim_Level_Id =  l_Bsc_Dim_Obj_ID
434         AND    Dim_Group_Id =  l_Bsc_Group_ID;
435     END IF;
436     IF (p_commit = FND_API.G_TRUE) THEN
437         COMMIT;
438     END IF;
439     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
440 
441 EXCEPTION
442     WHEN OTHERS THEN
443         ROLLBACK TO SyncPMFAllInPMD;
444         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
445         IF (x_msg_data IS NOT NULL) THEN
446             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Set_All_Enable_Flag ';
447         ELSE
448             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Set_All_Enable_Flag ';
449         END IF;
450 END Set_All_Enable_Flag;
451 
452 /*********************************************************************************************
453                          update relation col in case of m_by_n relation type
454                          Modified for bug#4091924
455 *********************************************************************************************/
456 PROCEDURE Update_M_By_N_Relation_col
457 ( p_Dim_Level_Id          IN NUMBER
458 , p_Parent_Dim_Level_Id   IN NUMBER
459 , p_Relation_Col          IN VARCHAR2
460 , x_return_status       OUT NOCOPY     VARCHAR2
461 , x_msg_count           OUT NOCOPY     NUMBER
462 , x_msg_data            OUT NOCOPY     VARCHAR2
463 ) IS
464 
465   CURSOR c_Relation_Col IS
466     SELECT K.indicator
467           ,K.dim_set_id
468           ,K.dim_level_index
469           ,K.level_table_name
470     FROM   bsc_kpi_dim_levels_vl K
471           ,bsc_sys_dim_levels_b S
472     WHERE  S.level_Table_name = K.level_table_name
473     AND    S.dim_level_id     IN ( p_Dim_Level_Id,p_Parent_Dim_Level_Id)
474     AND    K.parent_level_rel IS NOT NULL
475     AND    K.table_relation   IS NOT NULL;
476 
477 BEGIN
478   BSC_APPS.Init_Bsc_Apps;
479   x_return_status := FND_API.G_RET_STS_SUCCESS;
480 
481   UPDATE  bsc_sys_dim_level_rels
482   SET     relation_col = p_Relation_Col
483   WHERE   dim_level_id = p_Dim_Level_Id
484   AND     parent_dim_level_id = p_Parent_Dim_Level_Id
485   AND     relation_type = 2;
486 
487   UPDATE  bsc_sys_dim_level_rels
488   SET     relation_col = p_Relation_Col
489   WHERE   dim_level_id = p_Parent_Dim_Level_Id
490   AND     parent_dim_level_id = p_Dim_Level_Id
491   AND     relation_type = 2;
492 
493   FOR CD IN c_Relation_Col LOOP
494     UPDATE bsc_kpi_dim_levels_b
495     SET    table_relation  =  p_Relation_Col
496     WHERE  indicator       =  CD.indicator
497     AND    dim_set_id      =  CD.dim_set_id
498     AND    dim_level_index =  CD.dim_level_index;
499   END LOOP;
500 
501 
502 EXCEPTION
503     WHEN OTHERS THEN
504         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
505         IF (x_msg_data IS NOT NULL) THEN
506             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Refresh_BSC_Dim_View_In_Pmf';
507         ELSE
508             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Refresh_BSC_Dim_View_In_Pmf';
509         END IF;
510 END Update_M_By_N_Relation_col;
511 --=======================================================================================
512 
513 -- Called from Create and Update flow for BSC type dim objects only.
514 -- This will support enable/disable of 'All' flag from Report Designer.
515 PROCEDURE Set_Bsc_All_Enable_Flag
516 ( p_commit              IN           VARCHAR2 := FND_API.G_TRUE
517 , p_Dim_Obj_Short_Name  IN           VARCHAR2
518 , p_Dim_Short_Name      IN           VARCHAR2 := NULL
519 , p_All_Enabled         IN           NUMBER
520 , x_return_status       OUT  NOCOPY  VARCHAR2
521 , x_msg_count           OUT  NOCOPY  NUMBER
522 , x_msg_data            OUT  NOCOPY  VARCHAR2
523 )
524 IS
525 BEGIN
526 
527   SAVEPOINT SyncBSCAllInPMD;
528 
529   IF ((p_All_Enabled IS NOT NULL) AND (p_All_Enabled = 0)) THEN
530     IF (p_Dim_Short_Name IS NOT NULL) THEN  -- Update Mode
531       UPDATE bsc_sys_dim_levels_by_group
532         SET   total_flag   = p_All_Enabled
533         WHERE dim_level_id = BSC_BIS_DIM_OBJ_PUB.Get_Bsc_Dim_Obj_ID(p_Dim_Obj_Short_Name)
534         AND   dim_group_id = BSC_BIS_DIMENSION_PUB.Get_Bsc_Dimension_ID(p_Dim_Short_Name);
535     ELSE -- Create Mode
536       UPDATE bsc_sys_dim_levels_by_group
537         SET   total_flag   = p_All_Enabled
538         WHERE dim_level_id = BSC_BIS_DIM_OBJ_PUB.Get_Bsc_Dim_Obj_ID(p_Dim_Obj_Short_Name);
539     END IF;
540   END IF;
541 
542   IF (p_commit = FND_API.G_TRUE) THEN
543     COMMIT;
544   END IF;
545   x_return_status :=  FND_API.G_RET_STS_SUCCESS;
546 
547 EXCEPTION
548   WHEN OTHERS THEN
549     ROLLBACK TO SyncBSCAllInPMD;
550     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
551     IF (x_msg_data IS NOT NULL) THEN
552       x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Set_Bsc_All_Enable_Flag ';
553     ELSE
554       x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Set_Bsc_All_Enable_Flag ';
555     END IF;
556 END Set_Bsc_All_Enable_Flag;
557 
558 /*********************************************************************************
559                             CREATE DIMENSION
560 *********************************************************************************/
561 PROCEDURE Create_Dim_Object
562 (       p_commit                    IN          VARCHAR2   := FND_API.G_TRUE
563     ,   p_dim_obj_short_name        IN          VARCHAR2
564     ,   p_display_name              IN          VARCHAR2
565     ,   p_application_id            IN          NUMBER
566     ,   p_description               IN          VARCHAR2
567     ,   p_data_source               IN          VARCHAR2
568     ,   p_source_table              IN          VARCHAR2
569     ,   p_where_clause              IN          VARCHAR2   := NULL
570     ,   p_comparison_label_code     IN          VARCHAR2
571     ,   p_table_column              IN          VARCHAR2
572     ,   p_source_type               IN          VARCHAR2
573     ,   p_maximum_code_size         IN          NUMBER
574     ,   p_maximum_name_size         IN          NUMBER
575     ,   p_all_item_text             IN          VARCHAR2
576     ,   p_comparison_item_text      IN          VARCHAR2
577     ,   p_prototype_default_value   IN          VARCHAR2
578     ,   p_dimension_values_order    IN          NUMBER
579     ,   p_comparison_order          IN          NUMBER
580     ,   p_dim_short_names           IN          VARCHAR2
581     ,   p_Master_Level              IN          VARCHAR2   := NULL
582     ,   p_Long_Lov                  IN          VARCHAR2   := FND_API.G_FALSE
583     ,   p_Search_Function           IN          VARCHAR2   := NULL
584     ,   p_Dim_Obj_Enabled           IN          VARCHAR2   := FND_API.G_FALSE
585     ,   p_View_Object_Name          IN          VARCHAR2   := NULL
586     ,   p_Default_Values_Api        IN          VARCHAR2   := NULL
587     ,   p_All_Enabled               IN          NUMBER     := NULL
588     ,   p_Drill_To_Form_Function    IN          VARCHAR2   := NULL
589     ,   x_return_status             OUT NOCOPY  VARCHAR2
590     ,   x_msg_count                 OUT NOCOPY  NUMBER
591     ,   x_msg_data                  OUT NOCOPY  VARCHAR2
592 ) IS
593 BEGIN
594     SAVEPOINT CreateBSCDimObjPMD;
595     FND_MSG_PUB.Initialize;
596     x_return_status := FND_API.G_RET_STS_SUCCESS;
597 
598     Create_Dim_Object
599     (   p_commit                    => p_commit
600     ,   p_dim_obj_short_name        => p_dim_obj_short_name
601     ,   p_display_name              => p_display_name
602     ,   p_application_id            => p_application_id
603     ,   p_description               => p_description
604     ,   p_data_source               => p_data_source
605     ,   p_source_table              => p_source_table
606     ,   p_where_clause              => p_where_clause
607     ,   p_comparison_label_code     => p_comparison_label_code
608     ,   p_table_column              => p_table_column
609     ,   p_source_type               => p_source_type
610     ,   p_maximum_code_size         => p_maximum_code_size
611     ,   p_maximum_name_size         => p_maximum_name_size
612     ,   p_all_item_text             => p_all_item_text
613     ,   p_comparison_item_text      => p_comparison_item_text
614     ,   p_prototype_default_value   => p_prototype_default_value
615     ,   p_dimension_values_order    => p_dimension_values_order
616     ,   p_comparison_order          => p_comparison_order
617     ,   p_dim_short_names           => p_dim_short_names
618     ,   p_Master_Level              => p_Master_Level
619     ,   p_Long_Lov                  => p_Long_Lov
620     ,   p_Search_Function           => p_Search_Function
621     ,   p_Dim_Obj_Enabled           => p_Dim_Obj_Enabled
622     ,   p_View_Object_Name          => p_View_Object_Name
623     ,   p_Default_Values_Api        => p_Default_Values_Api
624     ,   p_All_Enabled               => p_All_Enabled
625     ,   p_is_default_short_name     => 'F'
626     ,   p_Drill_To_Form_Function    =>  p_Drill_To_Form_Function
627     ,   x_return_status             => x_return_status
628     ,   x_msg_count                 => x_msg_count
629     ,   x_msg_data                  => x_msg_data
630    );
631 EXCEPTION
632     WHEN FND_API.G_EXC_ERROR THEN
633         ROLLBACK TO CreateBSCDimObjPMD;
634         IF (x_msg_data IS NULL) THEN
635             FND_MSG_PUB.Count_And_Get
636             (      p_encoded   =>  FND_API.G_FALSE
637                ,   p_count     =>  x_msg_count
638                ,   p_data      =>  x_msg_data
639             );
640         END IF;
641         x_return_status :=  FND_API.G_RET_STS_ERROR;
642     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
643         ROLLBACK TO CreateBSCDimObjPMD;
644         IF (x_msg_data IS NULL) THEN
645             FND_MSG_PUB.Count_And_Get
646             (      p_encoded   =>  FND_API.G_FALSE
647                ,   p_count     =>  x_msg_count
648                ,   p_data      =>  x_msg_data
649             );
650         END IF;
651         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
652     WHEN NO_DATA_FOUND THEN
653         ROLLBACK TO CreateBSCDimObjPMD;
654         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
655         IF (x_msg_data IS NOT NULL) THEN
656             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
657         ELSE
658             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
659         END IF;
660     WHEN OTHERS THEN
661         ROLLBACK TO CreateBSCDimObjPMD;
662         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
663         IF (x_msg_data IS NOT NULL) THEN
664             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
665         ELSE
666             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
667         END IF;
668 END Create_Dim_Object;
669 
670 /*
671 ** Called from JAVA Dimension Designer
672 */
673 PROCEDURE Create_Dim_Object
674 ( p_commit                    IN          VARCHAR2   := FND_API.G_FALSE
675 , p_dim_obj_short_name        IN          VARCHAR2
676 , p_display_name              IN          VARCHAR2
677 , p_application_id            IN          NUMBER
678 , p_description               IN          VARCHAR2
679 , p_data_source               IN          VARCHAR2
680 , p_source_table              IN          VARCHAR2
681 , p_where_clause              IN          VARCHAR2   := NULL
682 , p_comparison_label_code     IN          VARCHAR2
683 , p_table_column              IN          VARCHAR2
684 , p_source_type               IN          VARCHAR2
685 , p_maximum_code_size         IN          NUMBER
686 , p_maximum_name_size         IN          NUMBER
687 , p_all_item_text             IN          VARCHAR2
688 , p_comparison_item_text      IN          VARCHAR2
689 , p_prototype_default_value   IN          VARCHAR2
690 , p_dimension_values_order    IN          NUMBER
691 , p_comparison_order          IN          NUMBER
692 , p_dim_short_names           IN          VARCHAR2
693 , p_Master_Level              IN          VARCHAR2   :=  NULL
694 , p_Long_Lov                  IN          VARCHAR2   :=  FND_API.G_FALSE
695 , p_Search_Function           IN          VARCHAR2   :=  NULL
696 , p_Dim_Obj_Enabled           IN          VARCHAR2   :=  FND_API.G_FALSE
697 , p_View_Object_Name          IN          VARCHAR2   :=  NULL
698 , p_Default_Values_Api        IN          VARCHAR2   :=  NULL
699 , p_All_Enabled               IN          NUMBER     :=  NULL
700 , p_is_default_short_name     IN          VARCHAR2
701 , p_Drill_To_Form_Function    IN          VARCHAR2   :=  NULL
702 , p_Prototype_Values          IN          BIS_STRING_ARRAY
703 , p_Force_Dimension_Create    IN          VARCHAR2
704 , p_Restrict_Dim_Validate     IN          VARCHAR2   := NULL
705 , x_return_status             OUT NOCOPY  VARCHAR2
706 , x_msg_count                 OUT NOCOPY  NUMBER
707 , x_msg_data                  OUT NOCOPY  VARCHAR2
708 ) IS
709   l_next_dim_grp_id        NUMBER;
710   l_is_default_short_name  VARCHAR2(1);
711 BEGIN
712     SAVEPOINT CreateBSCDimObjPMD;
713     FND_MSG_PUB.Initialize;
714     x_return_status := FND_API.G_RET_STS_SUCCESS;
715 
716     l_is_default_short_name := p_is_default_short_name;
717 
718     -- Create Dimension if p_Force_Dimension_Create = 'T' (AG)
719     IF (p_Force_Dimension_Create = 'T') THEN
720 
721       BSC_BIS_DIMENSION_PUB.Create_Dimension
722       ( p_commit               => FND_API.G_FALSE
723       , p_dim_short_name       => p_dim_short_names
724       , p_display_name         => p_display_name
725       , p_description          => p_description
726       , p_dim_obj_short_names  => NULL
727       , p_application_id       => p_application_id
728       , x_return_status        => x_return_status
729       , x_msg_count            => x_msg_count
730       , x_msg_data             => x_msg_data
731       );
732 
733       IF ((x_return_status  IS NOT NULL) AND (x_return_status  <>  FND_API.G_RET_STS_SUCCESS)) THEN
734         RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
735       END IF;
736 
737       l_is_default_short_name := 'F';
738     END IF;
739 
740     -- Create Dimension Object
741     Create_Dim_Object
742     ( p_commit                   => p_commit
743     , p_dim_obj_short_name       => p_dim_obj_short_name
744     , p_display_name             => p_display_name
745     , p_application_id           => p_application_id
746     , p_description              => p_description
747     , p_data_source              => p_data_source
748     , p_source_table             => p_source_table
749     , p_where_clause             => p_where_clause
750     , p_comparison_label_code    => p_comparison_label_code
751     , p_table_column             => p_table_column
752     , p_source_type              => p_source_type
753     , p_maximum_code_size        => p_maximum_code_size
754     , p_maximum_name_size        => p_maximum_name_size
755     , p_all_item_text            => p_all_item_text
756     , p_comparison_item_text     => p_comparison_item_text
757     , p_prototype_default_value  => p_prototype_default_value
758     , p_dimension_values_order   => p_dimension_values_order
759     , p_comparison_order         => p_comparison_order
760     , p_dim_short_names          => p_dim_short_names
761     , p_Master_Level             => p_Master_Level
762     , p_Long_Lov                 => p_Long_Lov
763     , p_Search_Function          => p_Search_Function
764     , p_Dim_Obj_Enabled          => p_Dim_Obj_Enabled
765     , p_View_Object_Name         => p_View_Object_Name
766     , p_Default_Values_Api       => p_Default_Values_Api
767     , p_All_Enabled              => p_All_Enabled
768     , p_is_default_short_name    => l_is_default_short_name  --p_is_default_short_name
769     , p_Drill_To_Form_Function   => p_Drill_To_Form_Function
770     , p_Restrict_Dim_Validate    => p_Restrict_Dim_Validate
771     , x_return_status            => x_return_status
772     , x_msg_count                => x_msg_count
773     , x_msg_data                 => x_msg_data
774    );
775 
776    IF ((x_return_status  IS NOT NULL) AND (x_return_status  <>  FND_API.G_RET_STS_SUCCESS)) THEN
777      RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
778    END IF;
779 
780    -- Save Prototype Values if NOT NULL (AG)
781    IF (p_Prototype_Values.COUNT > 0) THEN
782      BIS_UTIL.save_prototype_values
783      ( p_dim_object  => p_dim_obj_short_name
784      , p_PV_array    => p_Prototype_Values
785      );
786    END IF;
787 
788 EXCEPTION
789   WHEN FND_API.G_EXC_ERROR THEN
790     ROLLBACK TO CreateBSCDimObjPMD;
791     IF (x_msg_data IS NULL) THEN
792       FND_MSG_PUB.Count_And_Get
793       ( p_encoded   =>  FND_API.G_FALSE
794       , p_count     =>  x_msg_count
795       , p_data      =>  x_msg_data
796       );
797     END IF;
798     x_return_status :=  FND_API.G_RET_STS_ERROR;
799   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
800     ROLLBACK TO CreateBSCDimObjPMD;
801     IF (x_msg_data IS NULL) THEN
802       FND_MSG_PUB.Count_And_Get
803       ( p_encoded   =>  FND_API.G_FALSE
804       , p_count     =>  x_msg_count
805       , p_data      =>  x_msg_data
806       );
807     END IF;
808     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
809   WHEN NO_DATA_FOUND THEN
810     ROLLBACK TO CreateBSCDimObjPMD;
811     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
812     IF (x_msg_data IS NOT NULL) THEN
813       x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
814     ELSE
815       x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
816     END IF;
817   WHEN OTHERS THEN
818     ROLLBACK TO CreateBSCDimObjPMD;
819     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
820     IF (x_msg_data IS NOT NULL) THEN
821       x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
822     ELSE
823       x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
824     END IF;
825 END Create_Dim_Object;
826 
827 /*
828     This procedure allow user to create a new dimension category whose records
829     will be inserted into the following tables.
830         1  BIS_LEVELS.
831         2. BIS_LEVELS_TL
832         3. BSC_SYS_DIM_LEVELS_B
833         4. BSC_SYS_DIM_LEVELS_TL
834 
835     Key
836         p_dim_obj_short_name
837 
838     Validations:
839         1. p_dimension_id, p_dim_obj_short_name, p_display_name, p_data_source,  p_application_id
840            and p_source_type must not be null.
841         2. p_dim_obj_short_name and p_display_name must be unique.
842 */
843 
844 PROCEDURE Create_Dim_Object
845 (       p_commit                    IN          VARCHAR2   := FND_API.G_TRUE
846     ,   p_dim_obj_short_name        IN          VARCHAR2
847     ,   p_display_name              IN          VARCHAR2
848     ,   p_application_id            IN          NUMBER
849     ,   p_description               IN          VARCHAR2
850     ,   p_data_source               IN          VARCHAR2
851     ,   p_source_table              IN          VARCHAR2
852     ,   p_where_clause              IN          VARCHAR2   := NULL
853     ,   p_comparison_label_code     IN          VARCHAR2
854     ,   p_table_column              IN          VARCHAR2
855     ,   p_source_type               IN          VARCHAR2
856     ,   p_maximum_code_size         IN          NUMBER
857     ,   p_maximum_name_size         IN          NUMBER
858     ,   p_all_item_text             IN          VARCHAR2
859     ,   p_comparison_item_text      IN          VARCHAR2
860     ,   p_prototype_default_value   IN          VARCHAR2
861     ,   p_dimension_values_order    IN          NUMBER
862     ,   p_comparison_order          IN          NUMBER
863     ,   p_dim_short_names           IN          VARCHAR2
864     ,   p_Master_Level              IN          VARCHAR2   := NULL
865     ,   p_Long_Lov                  IN          VARCHAR2   := FND_API.G_FALSE
866     ,   p_Search_Function           IN          VARCHAR2   := NULL
867     ,   p_Dim_Obj_Enabled           IN          VARCHAR2   := FND_API.G_FALSE
868     ,   p_View_Object_Name          IN          VARCHAR2   := NULL
869     ,   p_Default_Values_Api        IN          VARCHAR2   := NULL
870     ,   p_All_Enabled               IN          NUMBER     := NULL
871     ,   p_is_default_short_name     IN          VARCHAR2
872     ,   p_Drill_To_Form_Function    IN          VARCHAR2   := NULL
873     ,   p_Restrict_Dim_Validate     IN          VARCHAR2   := NULL
874     ,   x_return_status             OUT NOCOPY  VARCHAR2
875     ,   x_msg_count                 OUT NOCOPY  NUMBER
876     ,   x_msg_data                  OUT NOCOPY  VARCHAR2
877 ) IS
878     l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
879     l_bis_dim_level_rec     BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
880     l_error_tbl             BIS_UTILITIES_PUB.Error_Tbl_Type;
881     l_level_table_name      BIS_LEVELS.LEVEL_VALUES_VIEW_NAME%TYPE;
882     l_bis_short_name        BIS_LEVELS.Short_Name%TYPE;
883     l_bis_name              BIS_LEVELS_TL.Name%TYPE;
884     l_user_id               FND_USER.user_id%TYPE;
885     l_login_id              NUMBER;
886     l_count                 NUMBER;
887     l_temp_var              BSC_SYS_DIM_LEVELS_B.Short_Name%TYPE;
888     l_alias                 VARCHAR2(4);
889 
890     l_dim_short_names       VARCHAR2(32000);
891     l_flag                  BOOLEAN := FALSE;
892     l_dim_obj_name          BSC_SYS_DIM_LEVELS_B.Short_Name%TYPE;
893     l_application_id        BIS_LEVELS.Application_Id%TYPE;
894     -- Start Granular Locking added by Aditya
895     l_Dim_Tab               BSC_BIS_LOCKS_PUB.t_numberTable;
896     l_dim_Grp_names         VARCHAR2(32000);
897 
898     l_dim_Grp_name          BSC_SYS_DIM_GROUPS_TL.short_name%TYPE;
899     l_index                 NUMBER := 0;
900     l_first_dim             BOOLEAN := TRUE;
901     -- End Granular Locking added by Aditya
902     l_pmf_disp_name         VARCHAR2(255); -- DispName
903 
904     -- init new case when source='BSC' and short_name = null (or <Default>)
905     l_source_table              VARCHAR(30);
906     l_table_column              VARCHAR(30);
907     l_prototype_default_value   VARCHAR2(255);
908     l_mix_type_dim              BOOLEAN;
909 
910     CURSOR c_Master_Level IS
911     SELECT Short_Name
912          , Master_Level
913          , Name
914     FROM   BIS_LEVELS_VL
915     WHERE  Short_Name = p_Master_Level;
916 BEGIN
917 
918     SAVEPOINT CreateBSCDimObjPMD;
919     FND_MSG_PUB.Initialize;
920     x_return_status := FND_API.G_RET_STS_SUCCESS;
921 
922     IF ((p_dim_obj_short_name IS NOT NULL) AND
923         (p_is_default_short_name <> 'T')) THEN
924         l_dim_obj_name      :=  TRIM(p_dim_obj_short_name);
925         l_application_id    :=  p_application_id;
926     ELSE
927         SELECT  NVL(MAX(dim_level_id) + 1, 0)
928         INTO    l_count
929         FROM    BSC_SYS_DIM_LEVELS_B;
930         IF (p_dim_obj_short_name IS NULL) THEN
931           l_dim_obj_name      := c_BSC_DIM_OBJ||l_count;
932         ELSE
933           l_dim_obj_name      := p_dim_obj_short_name;
934         END IF;
935         l_flag              :=  TRUE;
936         l_alias             :=  NULL;
937         l_temp_var          :=  l_dim_obj_name;
938         WHILE (l_flag) LOOP
939             SELECT COUNT(1) INTO l_count
940             FROM (SELECT COUNT(1) rec_count
941                   FROM   BSC_SYS_DIM_LEVELS_VL
942                   WHERE  UPPER(Short_Name) = UPPER(l_temp_var)
943                   UNION
944                   SELECT COUNT(1) rec_count
945                   FROM   BIS_LEVELS_VL
946                   WHERE  UPPER(Short_Name) = UPPER(l_temp_var))
947             WHERE rec_count > 0;
948             IF (l_count = 0) THEN
949               l_flag              :=  FALSE;
950               l_dim_obj_name      :=  l_temp_var;
951             END IF;
952             l_alias     :=  BSC_BIS_DIM_OBJ_PUB.get_Next_Alias(l_alias);
953             l_temp_var  :=  l_dim_obj_name||l_alias;
954         END LOOP;
955         IF(p_application_id = -1 OR p_application_id IS NULL) THEN
956             l_application_id    :=  271;
957         ELSE
958             l_application_id    := p_application_id;
959         END IF;
960     END IF;
961 
962     l_source_table := p_source_table;
963     l_table_column := p_table_column;
964     l_prototype_default_value := p_prototype_default_value;
965 
966     --check for not null fields
967     IF (l_dim_obj_name IS NULL) THEN
968         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
969         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'));
970         FND_MSG_PUB.ADD;
971         RAISE FND_API.G_EXC_ERROR;
972     END IF;
973     IF (NOT is_Valid_AlphaNum(l_dim_obj_name)) THEN
974         FND_MESSAGE.SET_NAME('BSC','BSC_ALPHA_NUM_REQUIRED');
975         FND_MESSAGE.SET_TOKEN('VALUE',  l_dim_obj_name);
976         FND_MESSAGE.SET_TOKEN('NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'));
977         FND_MSG_PUB.ADD;
978         RAISE FND_API.G_EXC_ERROR;
979     END IF;
980     IF (p_display_name IS NULL) THEN
981         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
982         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DISPLAY_NAME'));
983         FND_MSG_PUB.ADD;
984         RAISE FND_API.G_EXC_ERROR;
985     END IF;
986     IF (l_application_id IS NULL) THEN
987         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
988         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'APPLICATION_ID'));
989         FND_MSG_PUB.ADD;
990         RAISE FND_API.G_EXC_ERROR;
991     END IF;
992     IF (p_data_source IS NULL) THEN
993         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
994         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DATA_SOURCE'));
995         FND_MSG_PUB.ADD;
996         RAISE FND_API.G_EXC_ERROR;
997     END IF;
998     IF ((p_data_source <> 'BSC') AND (p_data_source <> 'PMF')) THEN
999         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_DATA_SOURCE');
1000         FND_MSG_PUB.ADD;
1001         RAISE           FND_API.G_EXC_ERROR;
1002     END IF;
1003     IF (p_data_source = 'BSC') THEN
1004         l_bsc_dim_obj_rec.Source        :=  'OLTP';
1005     ELSE
1006         IF ((p_source_type IS NULL) OR ((p_source_type <> 'OLTP') AND (p_source_type <> 'EDW'))) THEN
1007             FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SOURCE_TYPE');
1008             FND_MSG_PUB.ADD;
1009             RAISE           FND_API.G_EXC_ERROR;
1010         ELSE
1011             l_bsc_dim_obj_rec.Source    :=  p_source_type;
1012         END IF;
1013     END IF;
1014     --check for uniqueness of l_dim_obj_name in PMF's metadata
1015     SELECT  COUNT(1) INTO l_count
1016     FROM    BIS_LEVELS_VL
1017     WHERE   UPPER(short_name) = UPPER(l_dim_obj_name);
1018     IF (l_count > 0) THEN
1019         FND_MESSAGE.SET_NAME('BSC','BSC_UNIQUE_NAME_REQUIRED');
1020         FND_MESSAGE.SET_TOKEN('SHORT_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'));
1021         FND_MESSAGE.SET_TOKEN('NAME_VALUE', l_dim_obj_name);
1022         FND_MSG_PUB.ADD;
1023         RAISE FND_API.G_EXC_ERROR;
1024     END IF;
1025     --check for uniqueness of l_dim_obj_name in BSC's metadata
1026     SELECT  COUNT(1) INTO l_count
1027     FROM    BSC_SYS_DIM_LEVELS_VL
1028     WHERE   UPPER(short_name) = UPPER(l_dim_obj_name);
1029     IF (l_count > 0) THEN
1030         FND_MESSAGE.SET_NAME('BSC','BSC_UNIQUE_NAME_REQUIRED');
1031         FND_MESSAGE.SET_TOKEN('SHORT_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'));
1032         FND_MESSAGE.SET_TOKEN('NAME_VALUE', l_dim_obj_name);
1033         FND_MSG_PUB.ADD;
1034         RAISE FND_API.G_EXC_ERROR;
1035     END IF;
1036     ---Check the dimensions that are being attached may contain both autogenerated and existing
1037     -- source type because of this
1038     l_mix_type_dim := FALSE;
1039     IF(p_dim_short_names IS NOT NULL) THEN
1040         l_mix_type_dim := check_sametype_dims
1041                             (       p_dim_obj_name          =>  p_display_name
1042                                 ,   p_dim_obj_short_name    =>  p_dim_obj_short_name
1043                                 ,   p_dim_obj_source        =>  p_data_source
1044                                 ,   p_dim_short_names       =>  p_dim_short_names
1045                                 ,   p_Restrict_Dim_Validate =>  p_Restrict_Dim_Validate
1046                                 ,   x_return_status         =>  x_return_status
1047                                 ,   x_msg_count             =>  x_msg_count
1048                                 ,   x_msg_data              =>  x_msg_data
1049                             );
1050         IF (l_mix_type_dim) THEN
1051             RAISE  FND_API.G_EXC_ERROR;
1052         END IF;
1053     END IF;
1054 
1055     -- start checkin for Default names
1056     l_pmf_disp_name := p_display_name;
1057     IF (p_data_source = 'PMF') THEN
1058         SELECT  COUNT(1) INTO l_count
1059         FROM    BIS_LEVELS_VL
1060         WHERE   UPPER(name)  = UPPER(p_display_name);
1061         IF (l_count <> 0) THEN
1062             FND_MESSAGE.SET_NAME('BSC','BSC_UNIQUE_NAME_REQUIRED');
1063             FND_MESSAGE.SET_TOKEN('SHORT_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DISPLAY_NAME'));
1064             FND_MESSAGE.SET_TOKEN('NAME_VALUE', p_display_name);
1065             FND_MSG_PUB.ADD;
1066             RAISE FND_API.G_EXC_ERROR;
1067         END IF;
1068     ELSIF (p_data_source = 'BSC') THEN   -- Allow insertion into BSC Data Model, with the same display name
1069         SELECT  COUNT(1) INTO l_count
1070         FROM    BIS_LEVELS_VL
1071         WHERE   UPPER(name)  = UPPER(l_pmf_disp_name);
1072         WHILE(l_count > 0) LOOP
1073             l_pmf_disp_name := BSC_UTILITY.get_Next_DispName(l_pmf_disp_name);
1074             SELECT  COUNT(1) INTO l_count
1075             FROM    BIS_LEVELS_VL
1076             WHERE   UPPER(name)  = UPPER(l_pmf_disp_name);
1077         END LOOP;
1078     END IF;
1079 
1080     -- Start Granular Locking added by Aditya
1081     l_dim_Grp_names :=  p_dim_short_names;
1082     -- for PMF pick 1st one define a boolean variable first=true;, and
1083     IF (p_dim_short_names IS NOT NULL) THEN
1084         l_dim_Grp_names   :=  p_dim_short_names ;
1085         WHILE (is_more( p_dim_short_names  =>  l_dim_Grp_names
1086                       , p_dim_name         =>  l_dim_Grp_name)
1087         ) LOOP
1088             IF (l_first_dim) THEN
1089                 l_first_dim := FALSE;
1090                 l_bis_dim_level_rec.Dimension_Short_Name  := l_dim_Grp_name;
1091             END IF;
1092             l_Dim_Tab(l_index) := NVL(BSC_DIMENSION_GROUPS_PVT.get_Dim_Group_Id(l_dim_Grp_name), -1);
1093             l_index            := l_index + 1;
1094         END LOOP;
1095         -- Lock all the Dimension to be assigned to the Dimension Objects
1096         BSC_BIS_LOCKS_PUB.Lock_Create_Dimension_Object
1097         (    p_selected_dimensions   =>  l_Dim_Tab
1098           ,  x_return_status         =>  x_return_status
1099           ,  x_msg_count             =>  x_msg_count
1100           ,  x_msg_data              =>  x_msg_data
1101         );
1102         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1103             RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
1104         END IF;
1105     ELSE
1106         l_bis_dim_level_rec.Dimension_Short_Name  :=  BSC_BIS_DIMENSION_PUB.Unassigned_Dim;
1107     END IF;
1108     -- End Granular Locking
1109     --BSC_SYS_DIM_LEVELS_B.dim_level_id
1110     l_bsc_dim_obj_rec.Bsc_Level_Id            :=  BSC_DIMENSION_LEVELS_PVT.Get_Next_Value('BSC_SYS_DIM_LEVELS_B', 'DIM_LEVEL_ID');
1111     l_bsc_dim_obj_rec.Bsc_Source              :=  p_data_source;--BSC_SYS_DIM_LEVELS_B.source
1112     l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size :=  p_maximum_code_size;--BSC_SYS_DIM_LEVELS_B.user_key_size
1113     l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size :=  p_maximum_name_size;--BSC_SYS_DIM_LEVELS_B.disp_key_size
1114     IF (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size IS NULL) THEN
1115         l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size   :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Default_Size;
1116     END IF;
1117     IF (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size IS NULL) THEN
1118         l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size   :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Default_Size;
1119     END IF;
1120 
1121     -- Bug#4383962
1122     -- Changed the substring to 7, since Get_Next_Alias can return upto 4 chars
1123     -- but UI validation is 11 chars only (8+4 = 12 in the older case)
1124     -- Modified the Get_Next_Alias API to generate better abbreviations.
1125     IF (l_prototype_default_value IS NULL) THEN
1126         IF ((p_dim_obj_short_name IS NULL) OR (p_is_default_short_name = 'T')) THEN
1127             l_bsc_dim_obj_rec.Bsc_Level_Abbreviation  := substr(get_valid_ddlentry_frm_name(p_display_name),1,7);
1128             IF(l_bsc_dim_obj_rec.Bsc_Level_Abbreviation IS NULL) THEN -- If the abbrevation generated based on display name is still null then generate on short name
1129                 l_bsc_dim_obj_rec.Bsc_Level_Abbreviation  := substr(REPLACE(l_dim_obj_name, ' ', ''),1,7);
1130             END IF;
1131         ELSE
1132             l_bsc_dim_obj_rec.Bsc_Level_Abbreviation  :=  SUBSTR(REPLACE(l_dim_obj_name, ' ', ''), 1, 7);
1133         END IF;
1134 
1135     ELSE
1136         l_bsc_dim_obj_rec.Bsc_Level_Abbreviation  :=  SUBSTR(l_prototype_default_value, 1, 11);
1137     END IF;
1138 
1139     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
1140       SELECT COUNT(1) INTO l_count
1141       FROM   BSC_SYS_DIM_LEVELS_B
1142       WHERE  UPPER(abbreviation) = UPPER(l_bsc_dim_obj_rec.Bsc_Level_Abbreviation);
1143       IF (l_count <> 0) THEN
1144         l_flag          :=  TRUE;
1145         l_alias         :=  NULL;
1146         l_temp_var      :=  SUBSTR(l_bsc_dim_obj_rec.Bsc_Level_Abbreviation, 1, 7);
1147         WHILE (l_flag) LOOP
1148           SELECT COUNT(1) INTO l_count
1149           FROM   BSC_SYS_DIM_LEVELS_B
1150           WHERE  UPPER(abbreviation) = UPPER(l_temp_var);
1151           IF (l_count = 0) THEN
1152             l_flag                                      :=  FALSE;
1153             l_bsc_dim_obj_rec.Bsc_Level_Abbreviation    :=  l_temp_var;
1154           ELSE
1155             l_alias     :=  BSC_BIS_DIM_OBJ_PUB.get_Next_Alias(l_alias);
1156             l_temp_var  :=  SUBSTR(l_bsc_dim_obj_rec.Bsc_Level_Abbreviation, 1, 7)||l_alias;
1157           END IF;
1158         END LOOP;
1159       END IF;
1160     END IF;
1161 
1162     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
1163         IF ((l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size < BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Min_Size) OR
1164               (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size > BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Max_Size) OR
1165                 (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size < BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Min_Size) OR
1166                   (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size > BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Max_Size)) THEN
1167                 FND_MESSAGE.SET_NAME('BSC','BSC_CODE_NAME_SIZE');
1168                 FND_MSG_PUB.ADD;
1169                 RAISE FND_API.G_EXC_ERROR;
1170         END IF;
1171     END IF;
1172 
1173 
1174     l_bsc_dim_obj_rec.Bsc_Level_Short_Name    :=  l_dim_obj_name;--BSC_SYS_DIM_LEVELS_B.short_name
1175     l_bsc_dim_obj_rec.Bsc_Pk_Col              :=  l_table_column;
1176     l_bsc_dim_obj_rec.Bsc_Level_Name          :=  l_source_table;
1177     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
1178         IF (l_bsc_dim_obj_rec.Bsc_Level_Name IS NULL) THEN
1179             IF ((p_dim_obj_short_name IS NULL) OR (p_is_default_short_name = 'T')) THEN
1180                 l_bsc_dim_obj_rec.Bsc_Level_Name  :=  substr(get_valid_ddlentry_frm_name(p_display_name),1,30);
1181                 IF(l_bsc_dim_obj_rec.Bsc_Level_Name IS NULL) THEN -- Generate level_table_name based on short name if it null
1182                     l_bsc_dim_obj_rec.Bsc_Level_Name  :=  substr(get_valid_ddlentry_frm_name(l_dim_obj_name),1,30);
1183                 END IF;
1184                 l_bsc_dim_obj_rec.Bsc_Level_Name  :=  'BSC_D_'||SUBSTR(l_bsc_dim_obj_rec.Bsc_Level_Name, 1, 21);
1185                 IF (NOT is_Valid_Identifier(l_bsc_dim_obj_rec.Bsc_Level_Name)) THEN
1186                     FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
1187                     FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'));
1188                     FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_bsc_dim_obj_rec.Bsc_Level_Name);
1189                     FND_MSG_PUB.ADD;
1190                     RAISE FND_API.G_EXC_ERROR;
1191                 END IF;
1192                 --generate unique table name if already exists
1193                 l_flag          :=  TRUE;
1194                 l_alias         :=  NULL;
1195                 l_temp_var      :=  l_bsc_dim_obj_rec.Bsc_Level_Name;
1196                 WHILE (l_flag) LOOP
1197                     SELECT COUNT(1) INTO l_count
1198                     FROM   BSC_SYS_DIM_LEVELS_B
1199                     WHERE  UPPER(Level_Table_Name) = UPPER(l_temp_var);
1200                     IF (l_count = 0) THEN
1201                         l_flag                           :=  FALSE;
1202                         l_bsc_dim_obj_rec.Bsc_Level_Name :=  l_temp_var;
1203                     END IF;
1204                     l_alias     :=  BSC_BIS_DIM_OBJ_PUB.get_Next_Alias(l_alias);
1205                     l_temp_var  :=  SUBSTR(l_bsc_dim_obj_rec.Bsc_Level_Name, 1, 18)||l_alias;
1206                 END LOOP;
1207             ELSE
1208                 l_bsc_dim_obj_rec.Bsc_Level_Name  :=  'BSC_D_'||SUBSTR(TRIM(l_dim_obj_name) , 1, 21);
1209             END IF;
1210         END IF;
1211         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs
1212                     (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
1213                         ,   x_return_status     =>  x_return_status
1214                         ,   x_msg_count         =>  x_msg_count
1215                         ,   x_msg_data          =>  x_msg_data
1216                     );
1217         IF(NOT l_flag) THEN
1218             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1219         END IF;
1220     ELSIF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
1221         IF ((l_bsc_dim_obj_rec.Source = 'OLTP') OR (l_bsc_dim_obj_rec.Source = 'EDW')) THEN
1222             l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs
1223                         (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
1224                             ,   x_return_status     =>  x_return_status
1225                             ,   x_msg_count         =>  x_msg_count
1226                             ,   x_msg_data          =>  x_msg_data
1227                         );
1228             IF(NOT l_flag) THEN
1229                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1230             END IF;
1231         ELSE
1232             FND_MESSAGE.SET_NAME('BSC','BSC_PRE_DIM_OBJ_SOURCE_TYPE');
1233             FND_MSG_PUB.ADD;
1234             RAISE FND_API.G_EXC_ERROR;
1235         END IF;
1236     END IF;
1237 
1238     --CALL PMF'S API
1239     l_user_id   :=  FND_GLOBAL.USER_ID;
1240     l_login_id  :=  FND_GLOBAL.LOGIN_ID;
1241     --   l_bis_dim_level_rec.Dimension_Short_Name        :=  'UNASSIGNED';--dummy name is required
1242     /* ADDED BY RAVI ************/
1243     l_bis_dim_level_rec.Dimension_ID               :=  get_bis_dimension_id(l_bis_dim_level_rec.Dimension_Short_Name);
1244     /****************/
1245     l_bis_dim_level_rec.Dimension_Name             :=  p_display_name;
1246     l_bis_dim_level_rec.Dimension_Level_Short_Name :=  l_dim_obj_name;
1247     l_bis_dim_level_rec.Dimension_Level_Name       :=  l_pmf_disp_name;
1248     l_bis_dim_level_rec.Description                :=  p_description;
1249     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
1250         l_bis_dim_level_rec.Level_Values_View_Name :=  l_bsc_dim_obj_rec.Bsc_Level_Name;
1251     ELSE
1252         l_bis_dim_level_rec.Level_Values_View_Name :=  l_source_table;
1253     END IF;
1254     IF ((l_bis_dim_level_rec.Level_Values_View_Name IS NOT NULL) AND
1255          (NOT is_Valid_Identifier(l_bis_dim_level_rec.Level_Values_View_Name))) THEN
1256         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
1257         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'));
1258         FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_bis_dim_level_rec.Level_Values_View_Name);
1259         FND_MSG_PUB.ADD;
1260         RAISE FND_API.G_EXC_ERROR;
1261     END IF;
1262 
1263     l_bis_dim_level_rec.where_Clause               :=  p_where_clause;
1264     l_bis_dim_level_rec.application_id             :=  l_application_id;
1265     l_bis_dim_level_rec.Source                     :=  l_bsc_dim_obj_rec.Source;
1266     l_bis_dim_level_rec.Comparison_Label_Code      :=  p_comparison_label_code;
1267     --SELECT bis_levels_s.NextVal INTO l_bis_dim_level_rec.Dimension_Level_ID FROM DUAL;
1268 
1269     IF ((p_Long_Lov IS NULL) OR ((p_Long_Lov <> FND_API.G_TRUE) AND (p_Long_Lov <> FND_API.G_FALSE))) THEN
1270         l_bis_dim_level_rec.Long_Lov               :=  FND_API.G_FALSE;
1271     ELSE
1272         l_bis_dim_level_rec.Long_Lov               :=  p_Long_Lov;
1273     END IF;
1274 
1275     IF ((p_Dim_Obj_Enabled IS NULL) OR ((p_Dim_Obj_Enabled <> FND_API.G_TRUE) AND (p_Dim_Obj_Enabled <> FND_API.G_FALSE))) THEN
1276         l_bis_dim_level_rec.Enabled                :=  FND_API.G_FALSE;
1277     ELSE
1278         l_bis_dim_level_rec.Enabled                :=  p_Dim_Obj_Enabled;
1279     END IF;
1280     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
1281         IF (p_Default_Values_Api IS NULL) THEN
1282             l_bis_dim_level_rec.Default_Values_Api :=  p_Default_Values_Api;
1283         ELSIF (p_Default_Values_Api <> '''''') THEN
1284             l_bis_dim_level_rec.Default_Values_Api :=  p_Default_Values_Api;
1285         END IF;
1286         l_bis_dim_level_rec.View_Object_Name       :=  p_View_Object_Name;
1287         l_bis_dim_level_rec.Attribute_Code         :=  l_bis_dim_level_rec.Dimension_Level_Short_Name;
1288     END IF;
1289     IF ((l_bsc_dim_obj_rec.Bsc_Source = 'PMF') AND (p_Master_Level IS NOT NULL)) THEN
1290         IF (p_Master_Level = l_bis_dim_level_rec.Dimension_Level_Short_Name) THEN
1291             FND_MESSAGE.SET_NAME('BIS','BIS_PMF_NO_SAME_DO');
1292             FND_MSG_PUB.ADD;
1293             RAISE FND_API.G_EXC_ERROR;
1294         END IF;
1295         IF (c_Master_Level%ISOPEN) THEN
1296             CLOSE c_Master_Level;
1297         END IF;
1298         OPEN    c_Master_Level;
1299             FETCH   c_Master_Level
1300             INTO    l_bis_dim_level_rec.Master_Level
1301                  ,  l_bis_short_name
1302                  ,  l_bis_name;
1303         CLOSE c_Master_Level;
1304         IF (l_bis_dim_level_rec.Master_Level IS NULL) THEN
1305             FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_LEVEL_NAME');
1306             FND_MESSAGE.SET_TOKEN('BSC_LEVEL_NAME', p_Master_Level);
1307             FND_MSG_PUB.ADD;
1308             RAISE FND_API.G_EXC_ERROR;
1309         END IF;
1310         IF (l_bis_short_name IS NOT NULL) THEN
1311             FND_MESSAGE.SET_NAME('BIS','BIS_PMF_LOV_NO_MASTER');
1312             FND_MESSAGE.SET_TOKEN('BIS_OBJ_LOV', l_bis_name);
1313             FND_MSG_PUB.ADD;
1314             RAISE FND_API.G_EXC_ERROR;
1315         END IF;
1316     END IF;
1317 
1318     l_bis_dim_level_rec.Default_Search     :=  p_Search_Function;
1319 
1320     -- Assigns Drill_To_Form_Function
1321     l_bis_dim_level_rec.Drill_To_Form_Function := p_Drill_To_Form_Function;
1322     BIS_DIMENSION_LEVEL_PUB.Create_Dimension_Level
1323     (       p_api_version           =>  1.0
1324         ,   p_commit                =>  FND_API.G_FALSE
1325         ,   p_validation_level      =>  FND_API.G_VALID_LEVEL_FULL
1326         ,   p_Dimension_Level_Rec   =>  l_bis_dim_level_rec
1327         ,   x_return_status         =>  x_return_status
1328         ,   x_error_Tbl             =>  l_error_tbl
1329     );
1330     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1331         IF (l_error_tbl.COUNT > 0) THEN
1332             x_msg_data  :=  l_error_tbl(l_error_tbl.COUNT).Error_Description;
1333             IF(INSTR(x_msg_data, ' ')  =  0 ) THEN
1334                 FND_MESSAGE.SET_NAME('BIS',x_msg_data);
1335                 FND_MSG_PUB.ADD;
1336                 x_msg_data  :=  NULL;
1337             END IF;
1338             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1339         END IF;
1340         RAISE           FND_API.G_EXC_UNEXPECTED_ERROR;
1341     END IF;
1342 
1343     --CALL BSC API
1344     l_bsc_dim_obj_rec.Bsc_Dim_Comp_Disp_Name          :=  p_comparison_item_text;--BSC_SYS_DIM_LEVELS_TL.comp_disp_name
1345     l_bsc_dim_obj_rec.Bsc_Dim_Level_Long_Name         :=  p_display_name;--BSC_SYS_DIM_LEVELS_TL.name
1346     IF (p_description IS NULL) THEN
1347         l_bsc_dim_obj_rec.Bsc_Dim_Level_Help          :=  p_display_name;
1348     ELSE
1349         l_bsc_dim_obj_rec.Bsc_Dim_Level_Help          :=  p_description;--BSC_SYS_DIM_LEVELS_TL.help
1350     END IF;
1351     l_bsc_dim_obj_rec.Bsc_Dim_Tot_Disp_Name           :=  p_all_item_text;--BSC_SYS_DIM_LEVELS_TL.total_disp_name
1352     l_bsc_dim_obj_rec.Bsc_Language                    :=  NULL;--BSC_SYS_DIM_LEVELS_TL.language
1353     l_bsc_dim_obj_rec.Bsc_Level_Column_Name           :=  NULL;
1354     l_bsc_dim_obj_rec.Bsc_Level_Column_Type           :=  NULL;
1355     l_bsc_dim_obj_rec.Bsc_Level_Comp_Order_By         :=  p_comparison_order;--BSC_SYS_DIM_LEVELS_B.comp_order_by
1356     l_bsc_dim_obj_rec.Bsc_Level_Custom_Group          :=  0;--BSC_SYS_DIM_LEVELS_B.custom_group
1357     l_bsc_dim_obj_rec.Bsc_Level_Index                 :=  0;
1358     l_bsc_dim_obj_rec.Bsc_Level_Table_Type            :=  1;--BSC_SYS_DIM_LEVELS_B.table_type
1359     l_bsc_dim_obj_rec.Bsc_Level_Value_Order_By        :=  p_dimension_values_order;--BSC_SYS_DIM_LEVELS_B.value_order_by
1360     l_bsc_dim_obj_rec.Bsc_Source_Language             :=  NULL;--source_lang
1361     l_bsc_dim_obj_rec.Bsc_Source_Level_Long_Name      :=  NULL;
1362     l_bsc_dim_obj_rec.Bsc_Relation_Column             :=  NULL;
1363     l_bsc_dim_obj_rec.Bsc_Relation_Type               :=  NULL;
1364     l_bsc_dim_obj_rec.Bsc_Parent_Level_Id             :=  NULL;
1365     l_bsc_dim_obj_rec.Bsc_Parent_Level_Index          :=  NULL;
1366     l_bsc_dim_obj_rec.Bsc_Parent_Level_Short_Name     :=  NULL;
1367     l_bsc_dim_obj_rec.Bsc_Parent_Level_Source         :=  NULL;
1368     l_bsc_dim_obj_rec.Bsc_Flag                        :=  NULL;
1369     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
1370         l_level_table_name                :=  l_bsc_dim_obj_rec.Bsc_Level_Name;
1371         l_bsc_dim_obj_rec.Bsc_Level_Name  :=  l_bsc_dim_obj_rec.Bsc_Level_View_Name;
1372     END IF;
1373     BSC_DIMENSION_LEVELS_PUB.Create_Dim_Level
1374     (       p_commit            =>  FND_API.G_FALSE
1375          ,  p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
1376          ,  p_create_tables     =>  FALSE
1377          ,  x_return_status     =>  x_return_status
1378          ,  x_msg_count         =>  x_msg_count
1379          ,  x_msg_data          =>  x_msg_data
1380     );
1381     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1382         RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
1383     END IF;
1384     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
1385         BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions
1386         (       p_commit                =>  FND_API.G_FALSE
1387             ,   p_dim_obj_short_name    =>  l_dim_obj_name
1388             ,   p_dim_short_names       =>  BSC_BIS_DIMENSION_PUB.Unassigned_Dim
1389             ,   x_return_status         =>  x_return_status
1390             ,   x_msg_count             =>  x_msg_count
1391             ,   x_msg_data              =>  x_msg_data
1392         );
1393         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1394             RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
1395         END IF;
1396         BSC_BIS_DIM_OBJ_PUB.Set_All_Enable_Flag
1397         (       p_commit                =>  FND_API.G_FALSE
1398             ,   p_Dim_Obj_Short_Name    =>  l_dim_obj_name
1399             ,   p_All_Enabled           =>  p_All_Enabled
1400             ,   x_return_status         =>  x_return_status
1401             ,   x_msg_count             =>  x_msg_count
1402             ,   x_msg_data              =>  x_msg_data
1403         );
1404         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1405             RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
1406         END IF;
1407     END IF;
1408     IF (p_dim_short_names IS NOT NULL) THEN
1409         BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions
1410         (       p_commit                        =>  FND_API.G_FALSE
1411             ,   p_dim_obj_short_name            =>  l_dim_obj_name
1412             ,   p_assign_dim_short_names        =>  p_dim_short_names
1413             ,   p_unassign_dim_short_names      =>  BSC_BIS_DIMENSION_PUB.Unassigned_Dim
1414             ,   p_Restrict_Dim_Validate         =>  p_Restrict_Dim_Validate
1415             ,   x_return_status                 =>  x_return_status
1416             ,   x_msg_count                     =>  x_msg_count
1417             ,   x_msg_data                      =>  x_msg_data
1418         );
1419         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1420             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1421         END IF;
1422     END IF;
1423 
1424     /* Set 'All' flag for BSC type dim objects (specific to RPD)
1425        'All' flag is not supported from Dimension Designer for BSC type dim objects
1426        from Create/Update Dim Object screen. Only from RPD, 'All' flag can be '0' in
1427        Create case.
1428     */
1429     IF ((l_bsc_dim_obj_rec.Bsc_Source = 'BSC') AND (p_dim_short_names IS NOT NULL)) THEN
1430       BSC_BIS_DIM_OBJ_PUB.Set_Bsc_All_Enable_Flag
1431       ( p_commit                =>  FND_API.G_FALSE
1432       , p_Dim_Obj_Short_Name    =>  l_dim_obj_name
1433       , p_All_Enabled           =>  p_All_Enabled
1434       , x_return_status         =>  x_return_status
1435       , x_msg_count             =>  x_msg_count
1436       , x_msg_data              =>  x_msg_data
1437       );
1438     END IF;
1439     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1440       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1441     END IF;
1442 
1443     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
1444         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs
1445                     (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
1446                         ,   x_return_status     =>  x_return_status
1447                         ,   x_msg_count         =>  x_msg_count
1448                         ,   x_msg_data          =>  x_msg_data
1449                     );
1450         IF(NOT l_flag) THEN
1451             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1452         END IF;
1453     ELSIF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
1454         IF ((l_bsc_dim_obj_rec.Source = 'OLTP') OR (l_bsc_dim_obj_rec.Source = 'EDW')) THEN
1455             l_bsc_dim_obj_rec.Bsc_Level_Name  :=  l_level_table_name;
1456             l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views
1457                         (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
1458                             ,   x_return_status     =>  x_return_status
1459                             ,   x_msg_count         =>  x_msg_count
1460                             ,   x_msg_data          =>  x_msg_data
1461                         );
1462             IF(NOT l_flag) THEN
1463                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1464             END IF;
1465         ELSE
1466             FND_MESSAGE.SET_NAME('BSC','BSC_PRE_DIM_OBJ_SOURCE_TYPE');
1467             FND_MSG_PUB.ADD;
1468             RAISE FND_API.G_EXC_ERROR;
1469         END IF;
1470     END IF;
1471 
1472     /********************************************************
1473       Check no of independent dimension objects in dimension set
1474     ********************************************************/
1475 
1476     check_indp_dimobjs
1477     (
1478             p_dim_id                    =>  l_bsc_dim_obj_rec.Bsc_Level_Id
1479         ,   x_return_status             =>  x_return_status
1480         ,   x_msg_count                 =>  x_msg_count
1481         ,   x_msg_data                  =>  x_msg_data
1482     );
1483     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1484         RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
1485     END IF;
1486     /***********************************************************/
1487 
1488 
1489     IF (p_commit = FND_API.G_TRUE) THEN
1490         COMMIT;
1491     END IF;
1492     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1493 EXCEPTION
1494     WHEN FND_API.G_EXC_ERROR THEN
1495         IF (c_Master_Level%ISOPEN) THEN
1496             CLOSE c_Master_Level;
1497         END IF;
1498         ROLLBACK TO CreateBSCDimObjPMD;
1499         IF (x_msg_data IS NULL) THEN
1500             FND_MSG_PUB.Count_And_Get
1501             (      p_encoded   =>  FND_API.G_FALSE
1502                ,   p_count     =>  x_msg_count
1503                ,   p_data      =>  x_msg_data
1504             );
1505         END IF;
1506         x_return_status :=  FND_API.G_RET_STS_ERROR;
1507     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1508         IF (c_Master_Level%ISOPEN) THEN
1509             CLOSE c_Master_Level;
1510         END IF;
1511         ROLLBACK TO CreateBSCDimObjPMD;
1512         IF (x_msg_data IS NULL) THEN
1513             FND_MSG_PUB.Count_And_Get
1514             (      p_encoded   =>  FND_API.G_FALSE
1515                ,   p_count     =>  x_msg_count
1516                ,   p_data      =>  x_msg_data
1517             );
1518         END IF;
1519         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1520     WHEN NO_DATA_FOUND THEN
1521         IF (c_Master_Level%ISOPEN) THEN
1522             CLOSE c_Master_Level;
1523         END IF;
1524         ROLLBACK TO CreateBSCDimObjPMD;
1525         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1526         IF (x_msg_data IS NOT NULL) THEN
1527             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
1528         ELSE
1529             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
1530         END IF;
1531     WHEN OTHERS THEN
1532         IF (c_Master_Level%ISOPEN) THEN
1533             CLOSE c_Master_Level;
1534         END IF;
1535         ROLLBACK TO CreateBSCDimObjPMD;
1536         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1537         IF (x_msg_data IS NOT NULL) THEN
1538             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
1539         ELSE
1540             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Dim_Object ';
1541         END IF;
1542 END Create_Dim_Object;
1543 
1544 /*********************************************************************************
1545                           ASSIGN DIMENSIONS TO DIMENSION OBJECT
1546 *********************************************************************************/
1547 PROCEDURE Assign_Dimensions
1548 (       p_commit                IN              VARCHAR2   := FND_API.G_TRUE
1549     ,   p_dim_obj_short_name    IN              VARCHAR2
1550     ,   p_dim_short_names       IN              VARCHAR2
1551     ,   x_return_status         OUT    NOCOPY   VARCHAR2
1552     ,   x_msg_count             OUT    NOCOPY   NUMBER
1553     ,   x_msg_data              OUT    NOCOPY   VARCHAR2
1554 ) IS
1555     l_dim_short_names       VARCHAR2(32000);
1556     l_dim_name              BSC_SYS_DIM_GROUPS_TL.short_name%TYPE;
1557     l_dim_grp_id            BSC_SYS_DIM_GROUPS_TL.Dim_Group_Id%TYPE;
1558 
1559     l_count                 NUMBER;
1560 BEGIN
1561     FND_MSG_PUB.Initialize;
1562     x_return_status := FND_API.G_RET_STS_SUCCESS;
1563     IF (p_dim_obj_short_name IS NULL) THEN
1564         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
1565         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
1566         FND_MSG_PUB.ADD;
1567         RAISE FND_API.G_EXC_ERROR;
1568     END IF;
1569     IF (p_dim_short_names IS NOT NULL) THEN
1570         l_dim_short_names   :=  p_dim_short_names;
1571         WHILE (is_more(     p_dim_short_names   =>  l_dim_short_names
1572                         ,   p_dim_name          =>  l_dim_name)
1573         ) LOOP
1574             -- Granular Locking - Set the timestamp of Dimension Group
1575             l_dim_grp_id    :=  NVL(BSC_DIMENSION_GROUPS_PVT.get_Dim_Group_Id(l_dim_name), -1);
1576             BSC_BIS_LOCKS_PUB.Set_Time_Stamp_Dim_Group
1577             (    p_dim_group_id      =>  l_dim_grp_id
1578               ,  x_return_status     =>  x_return_status
1579               ,  x_msg_count         =>  x_msg_count
1580               ,  x_msg_data          =>  x_msg_data
1581             );
1582             IF ((x_return_status  =  FND_API.G_RET_STS_ERROR)  OR (x_return_status  =  FND_API.G_RET_STS_UNEXP_ERROR)) THEN
1583                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1584             END IF;
1585             -- Granular Locking - Set the timestamp of Dimension Group
1586             SELECT COUNT(1) INTO l_count
1587             FROM   BSC_SYS_DIM_LEVELS_BY_GROUP A
1588                  , BSC_SYS_DIM_LEVELS_B        B
1589             WHERE  A.Dim_Group_Id = l_dim_grp_id
1590             AND    A.Dim_Level_Id = B.Dim_Level_Id
1591             AND    B.Short_Name   = p_dim_obj_short_name;
1592             IF (l_count = 0) THEN
1593                 BSC_BIS_DIMENSION_PUB.Assign_Dimension_Objects
1594                 (       p_commit                =>  FND_API.G_FALSE
1595                     ,   p_dim_short_name        =>  l_dim_name
1596                     ,   p_dim_obj_short_names   =>  p_dim_obj_short_name
1597                     ,   p_time_stamp            =>  NULL
1598                     ,   x_return_status         =>  x_return_status
1599                     ,   x_msg_count             =>  x_msg_count
1600                     ,   x_msg_data              =>  x_msg_data
1601                 );
1602                 IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1603                     RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1604                 END IF;
1605             END IF;
1606         END LOOP;
1607     END IF;
1608     IF (p_commit = FND_API.G_TRUE) THEN
1609         COMMIT;
1610     END IF;
1611     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1612 EXCEPTION
1613     WHEN FND_API.G_EXC_ERROR THEN
1614         IF (x_msg_data IS NULL) THEN
1615             FND_MSG_PUB.Count_And_Get
1616             (      p_encoded   =>  FND_API.G_FALSE
1617                ,   p_count     =>  x_msg_count
1618                ,   p_data      =>  x_msg_data
1619             );
1620         END IF;
1621         x_return_status :=  FND_API.G_RET_STS_ERROR;
1622     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1623         IF (x_msg_data IS NULL) THEN
1624             FND_MSG_PUB.Count_And_Get
1625             (      p_encoded   =>  FND_API.G_FALSE
1626                ,   p_count     =>  x_msg_count
1627                ,   p_data      =>  x_msg_data
1628             );
1629         END IF;
1630         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1631     WHEN NO_DATA_FOUND THEN
1632         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1633         IF (x_msg_data IS NOT NULL) THEN
1634             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions ';
1635         ELSE
1636             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions ';
1637         END IF;
1638     WHEN OTHERS THEN
1639         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1640         IF (x_msg_data IS NOT NULL) THEN
1641             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions ';
1642         ELSE
1643             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions ';
1644         END IF;
1645 END Assign_Dimensions;
1646 
1647 /*********************************************************************************
1648                           ASSIGN DIMENSIONS TO DIMENSION OBJECT
1649 *********************************************************************************/
1650 PROCEDURE Unassign_Dimensions
1651 (       p_commit                IN              VARCHAR2   := FND_API.G_TRUE
1652     ,   p_dim_obj_short_name    IN              VARCHAR2
1653     ,   p_dim_short_names       IN              VARCHAR2
1654     ,   x_return_status         OUT    NOCOPY   VARCHAR2
1655     ,   x_msg_count             OUT    NOCOPY   NUMBER
1656     ,   x_msg_data              OUT    NOCOPY   VARCHAR2
1657 ) IS
1658     l_dim_short_names       VARCHAR2(32000);
1659     l_dim_name              BSC_SYS_DIM_GROUPS_TL.short_name%TYPE;
1660 BEGIN
1661     FND_MSG_PUB.Initialize;
1662     x_return_status := FND_API.G_RET_STS_SUCCESS;
1663     IF (p_dim_obj_short_name IS NULL) THEN
1664         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
1665         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
1666         FND_MSG_PUB.ADD;
1667         RAISE FND_API.G_EXC_ERROR;
1668     END IF;
1669     IF (p_dim_short_names IS NOT NULL) THEN
1670         l_dim_short_names   :=  p_dim_short_names;
1671         WHILE (is_more(     p_dim_short_names   =>  l_dim_short_names
1672                         ,   p_dim_name          =>  l_dim_name)
1673         ) LOOP
1674 
1675             -- Granular Locking - Set the timestamp of Dimension Group
1676             BSC_BIS_LOCKS_PUB.Set_Time_Stamp_Dim_Group
1677             (    p_dim_group_id      =>  NVL(BSC_DIMENSION_GROUPS_PVT.get_Dim_Group_Id(l_dim_name), -1)
1678               ,  x_return_status     =>  x_return_status
1679               ,  x_msg_count         =>  x_msg_count
1680               ,  x_msg_data          =>  x_msg_data
1681             );
1682             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1683                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1684             END IF;
1685             -- Granular Locking - Set the timestamp of Dimension Group
1686             BSC_BIS_DIMENSION_PUB.Unassign_Dimension_Objects
1687             (       p_commit                =>  FND_API.G_FALSE
1688                 ,   p_dim_short_name        =>  l_dim_name
1689                 ,   p_dim_obj_short_names   =>  p_dim_obj_short_name
1690                 ,   x_return_status         =>  x_return_status
1691                 ,   x_msg_count             =>  x_msg_count
1692                 ,   x_msg_data              =>  x_msg_data
1693             );
1694             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1695                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1696             END IF;
1697         END LOOP;
1698     END IF;
1699     IF (p_commit = FND_API.G_TRUE) THEN
1700         COMMIT;
1701     END IF;
1702     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1703 EXCEPTION
1704     WHEN FND_API.G_EXC_ERROR THEN
1705         IF (x_msg_data IS NULL) THEN
1706             FND_MSG_PUB.Count_And_Get
1707             (      p_encoded   =>  FND_API.G_FALSE
1708                ,   p_count     =>  x_msg_count
1709                ,   p_data      =>  x_msg_data
1710             );
1711         END IF;
1712         x_return_status :=  FND_API.G_RET_STS_ERROR;
1713     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1714         IF (x_msg_data IS NULL) THEN
1715             FND_MSG_PUB.Count_And_Get
1716             (      p_encoded   =>  FND_API.G_FALSE
1717                ,   p_count     =>  x_msg_count
1718                ,   p_data      =>  x_msg_data
1719             );
1720         END IF;
1721         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1722     WHEN NO_DATA_FOUND THEN
1723         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1724         IF (x_msg_data IS NOT NULL) THEN
1725             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Unassign_Dimensions ';
1726         ELSE
1727             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Unassign_Dimensions ';
1728         END IF;
1729     WHEN OTHERS THEN
1730         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1731         IF (x_msg_data IS NOT NULL) THEN
1732             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Unassign_Dimensions ';
1733         ELSE
1734             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Unassign_Dimensions ';
1735         END IF;
1736 END Unassign_Dimensions;
1737 
1738 /*********************************************************************************
1739                           RESTRICT INTERNAL DIMENSION FOR USE IN DD
1740 *********************************************************************************/
1741 PROCEDURE Restrict_Internal_Dimensions
1742 (       p_dim_obj_short_name            IN              VARCHAR2
1743     ,   p_assign_dim_short_names        IN              VARCHAR2
1744     ,   p_unassign_dim_short_names      IN              VARCHAR2
1745     ,   x_return_status                 OUT    NOCOPY   VARCHAR2
1746     ,   x_msg_count                     OUT    NOCOPY   NUMBER
1747     ,   x_msg_data                      OUT    NOCOPY   VARCHAR2
1748 ) IS
1749   l_assigns             VARCHAR2(32000);
1750   l_assign              BSC_SYS_DIM_GROUPS_TL.Short_Name%TYPE;
1751   l_assign_dim          VARCHAR2(32000);
1752   l_count               NUMBER;
1753 BEGIN
1754     -- It is to find values from p_assign_dim_short_names which are not already assigned.
1755     l_assigns := p_assign_dim_short_names;
1756     WHILE (is_more(     p_dim_short_names   =>  l_assigns
1757                     ,   p_dim_name          =>  l_assign)
1758         ) LOOP
1759             SELECT COUNT(1)
1760             INTO l_count
1761             FROM BSC_SYS_DIM_LEVELS_BY_GROUP A
1762                 ,BSC_SYS_DIM_LEVELS_B L
1763                 ,BSC_SYS_DIM_GROUPS_TL D
1764             WHERE D.SHORT_NAME = l_assign
1765             AND   L.SHORT_NAME = p_dim_obj_short_name
1766             AND   L.DIM_LEVEL_ID = A.DIM_LEVEL_ID
1767             AND   D.DIM_GROUP_ID = A.DIM_GROUP_ID;
1768 
1769             IF(l_count = 0) THEN
1770               IF (l_assign_dim IS NULL) THEN
1771                   l_assign_dim    :=  l_assign;
1772               ELSE
1773                   l_assign_dim    :=  l_assign_dim||','||l_assign;
1774               END IF;
1775             END IF;
1776     END LOOP;
1777     IF (p_unassign_dim_short_names IS NOT NULL) THEN
1778       IF (l_assign_dim IS NULL) THEN
1779         l_assign_dim := p_unassign_dim_short_names;
1780       ELSE
1781         l_assign_dim := l_assign_dim ||','||p_unassign_dim_short_names;
1782       END IF;
1783     END IF;
1784     BSC_UTILITY.Enable_Dimensions_Entity(
1785         p_Entity_Type           => BSC_UTILITY.c_DIMENSION
1786       , p_Entity_Short_Names    => l_assign_dim
1787       , p_Entity_Action_Type    => BSC_UTILITY.c_UPDATE
1788       , x_Return_Status         => x_return_status
1789       , x_Msg_Count             => x_msg_count
1790       , x_Msg_Data              => x_msg_data
1791     );
1792     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1793         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1794     END IF;
1795 
1796 
1797 END Restrict_Internal_Dimensions;
1798 
1799 
1800 /*********************************************************************************
1801                           ASSIGN DIMENSIONS TO DIMENSION OBJECT
1802 *********************************************************************************/
1803 PROCEDURE Assign_Unassign_Dimensions
1804 (       p_commit                        IN              VARCHAR2   := FND_API.G_TRUE
1805     ,   p_dim_obj_short_name            IN              VARCHAR2
1806     ,   p_assign_dim_short_names        IN              VARCHAR2
1807     ,   p_unassign_dim_short_names      IN              VARCHAR2
1808     ,   p_Restrict_Dim_Validate         IN              VARCHAR2   := NULL
1809     ,   x_return_status                 OUT    NOCOPY   VARCHAR2
1810     ,   x_msg_count                     OUT    NOCOPY   NUMBER
1811     ,   x_msg_data                      OUT    NOCOPY   VARCHAR2
1812 ) IS
1813   l_unassigns           VARCHAR2(32000);
1814   l_assigns             VARCHAR2(32000);
1815   l_unassign            BSC_SYS_DIM_GROUPS_TL.Short_Name%TYPE;
1816   l_assign              BSC_SYS_DIM_GROUPS_TL.Short_Name%TYPE;
1817 
1818   l_unassign_dims       VARCHAR2(32000);
1819   l_temp                VARCHAR2(32000);
1820   l_regions             VARCHAR2(32000);
1821   l_dim_name            VARCHAR2(300);
1822   l_dim_obj_name        VARCHAR2(300);
1823   l_flag                BOOLEAN;
1824 
1825 BEGIN
1826     FND_MSG_PUB.Initialize;
1827     x_return_status := FND_API.G_RET_STS_SUCCESS;
1828     IF (p_dim_obj_short_name IS NULL) THEN
1829         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
1830         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
1831         FND_MSG_PUB.ADD;
1832         RAISE FND_API.G_EXC_ERROR;
1833     END IF;
1834 
1835     IF (p_unassign_dim_short_names IS NOT NULL) THEN
1836         l_unassigns   :=  p_unassign_dim_short_names;
1837         WHILE (is_more(     p_dim_short_names   =>  l_unassigns
1838                         ,   p_dim_name          =>  l_unassign)
1839         ) LOOP
1840             l_assigns   :=  p_assign_dim_short_names;
1841             l_flag      :=  TRUE;
1842             WHILE (is_more(     p_dim_short_names   =>  l_assigns
1843                             ,   p_dim_name          =>  l_assign)
1844             ) LOOP
1845                 IF(l_unassign = l_assign) THEN
1846                     l_flag  :=  FALSE;
1847                     EXIT;
1848                 END IF;
1849             END LOOP;
1850             IF(l_flag) THEN
1851                 IF (l_unassign_dims IS NULL) THEN
1852                     l_unassign_dims    :=  l_unassign;
1853                 ELSE
1854                     l_unassign_dims    :=  l_unassign_dims||', '||l_unassign;
1855                 END IF;
1856 
1857                 IF (l_unassign <> BSC_BIS_DIMENSION_PUB.Unassigned_Dim) THEN
1858 
1859                   l_regions := BSC_UTILITY.Is_Dim_In_AKReport(l_unassign||'+'||p_dim_obj_short_name);
1860                   IF(l_regions IS NOT NULL) THEN
1861                     SELECT DIM_NAME
1862                     INTO   l_dim_name
1863                     FROM   BSC_BIS_DIM_VL
1864                     WHERE  SHORT_NAME = l_unassign;
1865 
1866                     SELECT NAME
1867                     INTO   l_dim_obj_name
1868                     FROM   BSC_BIS_DIM_OBJS_VL
1869                     WHERE  SHORT_NAME = p_dim_obj_short_name;
1870 
1871                     FND_MESSAGE.SET_NAME('BIS','BIS_DIM_OBJ_RPTASSOC_ERROR');
1872                     FND_MESSAGE.SET_TOKEN('DIM_NAME', l_dim_name);
1873                     FND_MESSAGE.SET_TOKEN('DIM_OBJ_NAME', l_dim_obj_name);
1874                     FND_MESSAGE.SET_TOKEN('REPORTS_ASSOC', l_regions);
1875                     FND_MSG_PUB.ADD;
1876                     RAISE FND_API.G_EXC_ERROR;
1877                   END IF;
1878                 END IF;
1879             END IF;
1880         END LOOP;
1881         IF (l_unassign_dims IS NOT NULL) THEN
1882             BSC_BIS_DIM_OBJ_PUB.Unassign_Dimensions
1883             (       p_commit                =>  FND_API.G_FALSE
1884                 ,   p_dim_obj_short_name    =>  p_dim_obj_short_name
1885                 ,   p_dim_short_names       =>  l_unassign_dims
1886                 ,   x_return_status         =>  x_return_status
1887                 ,   x_msg_count             =>  x_msg_count
1888                 ,   x_msg_data              =>  x_msg_data
1889             );
1890             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1891                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1892             END IF;
1893         END IF;
1894     END IF;
1895     IF (p_Restrict_Dim_Validate IS NOT NULL) THEN
1896       Restrict_Internal_Dimensions
1897       (       p_dim_obj_short_name            => p_dim_obj_short_name
1898           ,   p_assign_dim_short_names        => p_assign_dim_short_names
1899           ,   p_unassign_dim_short_names      => l_unassign_dims
1900           ,   x_return_status                 => x_return_status
1901           ,   x_msg_count                     => x_msg_count
1902           ,   x_msg_data                      => x_msg_data
1903       );
1904     END IF;
1905     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1906         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1907     END IF;
1908 
1909     IF (p_assign_dim_short_names IS NOT NULL) THEN
1910         BSC_BIS_DIM_OBJ_PUB.Assign_Dimensions
1911         (       p_commit                =>  FND_API.G_FALSE
1912             ,   p_dim_obj_short_name    =>  p_dim_obj_short_name
1913             ,   p_dim_short_names       =>  p_assign_dim_short_names
1914             ,   x_return_status         =>  x_return_status
1915             ,   x_msg_count             =>  x_msg_count
1916             ,   x_msg_data              =>  x_msg_data
1917         );
1918         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1919             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1920         END IF;
1921     END IF;
1922     -- Bug 3784852 validate empty dimension after unassign/assign dim objs. Remove empty from dim sets for all objectives
1923     IF (p_unassign_dim_short_names IS NOT NULL) THEN
1924         BSC_BIS_DIMENSION_PUB.Remove_Empty_Dims_For_DimSet
1925         (       p_commit                =>  FND_API.G_FALSE
1926             ,   p_dim_short_names       =>  p_unassign_dim_short_names
1927             ,   x_return_status         =>  x_return_status
1928             ,   x_msg_count             =>  x_msg_count
1929             ,   x_msg_data              =>  x_msg_data
1930         );
1931         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
1932             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1933         END IF;
1934     END IF;
1935     IF (p_commit = FND_API.G_TRUE) THEN
1936         COMMIT;
1937     END IF;
1938     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1939 EXCEPTION
1940     WHEN FND_API.G_EXC_ERROR THEN
1941         IF (x_msg_data IS NULL) THEN
1942             FND_MSG_PUB.Count_And_Get
1943             (      p_encoded   =>  FND_API.G_FALSE
1944                ,   p_count     =>  x_msg_count
1945                ,   p_data      =>  x_msg_data
1946             );
1947         END IF;
1948         x_return_status :=  FND_API.G_RET_STS_ERROR;
1949     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1950         IF (x_msg_data IS NULL) THEN
1951             FND_MSG_PUB.Count_And_Get
1952             (      p_encoded   =>  FND_API.G_FALSE
1953                ,   p_count     =>  x_msg_count
1954                ,   p_data      =>  x_msg_data
1955             );
1956         END IF;
1957         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1958     WHEN NO_DATA_FOUND THEN
1959         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1960         IF (x_msg_data IS NOT NULL) THEN
1961             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions ';
1962         ELSE
1963             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions ';
1964         END IF;
1965     WHEN OTHERS THEN
1966         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1967         IF (x_msg_data IS NOT NULL) THEN
1968             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions ';
1969         ELSE
1970             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions ';
1971         END IF;
1972 END Assign_Unassign_Dimensions;
1973 
1974 FUNCTION Retrieve_Primary_Dimension(
1975   p_Dim_Obj_Short_Name      IN    VARCHAR2
1976 ) RETURN VARCHAR2 IS
1977     l_Dim_Short_Name BIS_DIMENSIONS.SHORT_NAME%TYPE;
1978     CURSOR  c_Bis_Levels IS
1979     SELECT  B.Short_Name
1980     FROM    BIS_LEVELS     A
1981          ,  BIS_DIMENSIONS B
1982     WHERE   A.Short_Name   = p_Dim_Obj_Short_Name
1983     AND     A.Dimension_Id = B.Dimension_Id;
1984 BEGIN
1985      OPEN  c_Bis_Levels;
1986      FETCH   c_Bis_Levels  INTO    l_Dim_Short_Name;
1987      CLOSE  c_Bis_Levels;
1988      RETURN l_Dim_Short_Name;
1989 EXCEPTION
1990   WHEN OTHERS THEN
1991     RETURN NULL;
1992 END   Retrieve_Primary_Dimension;
1993 
1994 /*********************************************************************************
1995                             UPDATE DIMENSION
1996 *********************************************************************************/
1997 /*
1998     This procedure allows user to update a dimension. These changes will
1999     be reflected into the following metadata: -
2000         1  BIS_LEVELS.
2001         2. BIS_LEVELS_TL
2002         3. BSC_SYS_DIM_LEVELS_B
2003         4. BSC_SYS_DIM_LEVELS_TL
2004 
2005     Key:
2006         'p_dim_obj_short_name'
2007 
2008     Validations:
2009         1. p_dimension_id, p_dim_obj_short_name, p_display_name, p_data_source,  p_application_id
2010            and p_source_type must not be null.
2011         2. p_dim_obj_short_name and p_display_name must be unique.
2012 */
2013 PROCEDURE Update_Dim_Object
2014 (       p_commit                    IN          VARCHAR2   :=  FND_API.G_TRUE
2015     ,   p_dim_obj_short_name        IN          VARCHAR2
2016     ,   p_display_name              IN          VARCHAR2
2017     ,   p_application_id            IN          NUMBER
2018     ,   p_description               IN          VARCHAR2
2019     ,   p_data_source               IN          VARCHAR2
2020     ,   p_source_table              IN          VARCHAR2
2021     ,   p_where_clause              IN          VARCHAR2   :=  NULL
2022     ,   p_comparison_label_code     IN          VARCHAR2
2023     ,   p_table_column              IN          VARCHAR2
2024     ,   p_source_type               IN          VARCHAR2
2025     ,   p_maximum_code_size         IN          NUMBER
2026     ,   p_maximum_name_size         IN          NUMBER
2027     ,   p_all_item_text             IN          VARCHAR2
2028     ,   p_comparison_item_text      IN          VARCHAR2
2029     ,   p_prototype_default_value   IN          VARCHAR2
2030     ,   p_dimension_values_order    IN          NUMBER
2031     ,   p_comparison_order          IN          NUMBER
2032     ,   p_assign_dim_short_names    IN          VARCHAR2
2033     ,   p_unassign_dim_short_names  IN          VARCHAR2
2034     ,   p_time_stamp                IN          VARCHAR2   :=  NULL    -- Granular Locking
2035     ,   p_Master_Level              IN          VARCHAR2   :=  NULL
2036     ,   p_Long_Lov                  IN          VARCHAR2   :=  FND_API.G_FALSE
2037     ,   p_Search_Function           IN          VARCHAR2   :=  NULL
2038     ,   p_Dim_Obj_Enabled           IN          VARCHAR2   :=  FND_API.G_FALSE
2039     ,   p_View_Object_Name          IN          VARCHAR2   :=  NULL
2040     ,   p_Default_Values_Api        IN          VARCHAR2   :=  NULL
2041     ,   p_All_Enabled               IN          NUMBER     :=  NULL
2042     ,   p_Drill_To_Form_Function    IN          VARCHAR2   :=  NULL
2043     ,   p_Restrict_Dim_Validate     IN          VARCHAR2   := NULL
2044     ,   p_Hide                      IN          VARCHAR2   :=  FND_API.G_FALSE
2045     ,   x_return_status             OUT NOCOPY  VARCHAR2
2046     ,   x_msg_count                 OUT NOCOPY  NUMBER
2047     ,   x_msg_data                  OUT NOCOPY  VARCHAR2
2048 ) IS
2049     l_error_tbl             BIS_UTILITIES_PUB.Error_Tbl_Type;
2050     l_bis_dim_level_rec     BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
2051     l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
2052     l_bsc_drop_tables       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
2053     l_MTab_Tbl              BSC_BIS_DIM_OBJ_PUB.KPI_Dim_Set_Table_Type;
2054 
2055     l_temp_var              BSC_SYS_DIM_LEVELS_B.abbreviation%TYPE;
2056     l_source_table          VARCHAR(33);
2057     l_bsc_dim_id            BSC_SYS_DIM_LEVELS_B.Dim_Level_Id%TYPE;
2058     l_level_table_name      BIS_LEVELS.LEVEL_VALUES_VIEW_NAME%TYPE;
2059     l_dim_obj_name          BSC_SYS_DIM_LEVELS_B.Short_Name%TYPE;
2060     l_dim_Grp_name          BSC_SYS_DIM_GROUPS_TL.short_name%TYPE;
2061     l_application_id        BIS_LEVELS.Application_Id%TYPE;
2062     l_bis_short_name        BIS_LEVELS.Short_Name%TYPE;
2063     l_bis_name              BIS_LEVELS_TL.Name%TYPE;
2064     l_flag                  BOOLEAN := FALSE;
2065     l_struct_change         BOOLEAN := FALSE;
2066     l_child_struc           BOOLEAN := FALSE;
2067     l_create_pmf            BOOLEAN := FALSE;--must be false
2068     l_create_bsc            BOOLEAN := FALSE;--must be false
2069     l_mix_type_dim          BOOLEAN ;
2070     l_duplicate_flag        BOOLEAN ;
2071 
2072 
2073     l_Dim_Tab               BSC_BIS_LOCKS_PUB.t_numberTable;
2074     l_dim_Grp_names         VARCHAR2(32000);
2075     l_dim_short_names       VARCHAR2(32000);
2076     l_child_dim_obj_list    VARCHAR2(32000);
2077     l_pmf_disp_name         VARCHAR2(255); -- DispName
2078 
2079     l_index                 NUMBER := 0;
2080     l_count                 NUMBER;
2081 
2082     CURSOR  c_dimension_names IS
2083     SELECT  short_name
2084     FROM    BSC_SYS_DIM_GROUPS_VL
2085     WHERE   dim_group_id IN (SELECT dim_group_id
2086     FROM    BSC_SYS_DIM_LEVELS_BY_GROUP
2087     WHERE   dim_level_id = l_bsc_dim_obj_rec.Bsc_Level_Id);
2088 
2089     CURSOR  c_kpi_dim_set IS
2090     SELECT  DISTINCT A.indicator  Indicator
2091         ,   A.dim_set_id          Dim_Set_Id
2092     FROM    BSC_KPI_DIM_LEVELS_B    A
2093         ,   BSC_SYS_DIM_LEVELS_B    D
2094         ,   BSC_KPIS_B              B
2095     WHERE   A.Level_Table_Name      =  D.Level_Table_Name
2096     AND     B.Indicator             =  A.Indicator
2097     AND     B.Share_Flag           <>  2
2098     AND     D.Dim_Level_Id          =  l_bsc_dim_obj_rec.Bsc_Level_Id;
2099 
2100     /* ADDED BY RAVI *********/
2101     CURSOR  c_dim_short_name IS
2102     SELECT  B.SHORT_NAME
2103     FROM    BIS_LEVELS      A
2104          ,  BIS_DIMENSIONS  B
2105     WHERE   B.DIMENSION_ID  =   A.DIMENSION_ID
2106     AND     A.SHORT_NAME    =   p_dim_obj_short_name;
2107     --dimension_level_short_name = p_dim_obj_short_name;
2108     l_dim_short_name       BIS_DIMENSIONS.short_name%TYPE;
2109     l_dim_exist            BOOLEAN := FALSE;
2110     l_first_dim_short_name BIS_DIMENSIONS.short_name%TYPE;
2111     l_first                BOOLEAN := TRUE;
2112     l_primary_dim_sht_name BIS_DIMENSIONS.short_name%TYPE;
2113     /********************************/
2114 
2115     CURSOR c_Master_Level IS
2116     SELECT Short_Name
2117          , Master_Level
2118          , Name
2119     FROM   BIS_LEVELS_VL
2120     WHERE  Short_Name = p_Master_Level;
2121 
2122 
2123    CURSOR  c_Kpi_Dim_Set1 IS
2124    SELECT DISTINCT A.INDICATOR Indicator,
2125           A.DIM_SET_ID Dim_Set_Id
2126    FROM   BSC_KPI_DIM_LEVELS_VL A,
2127           BSC_SYS_DIM_LEVELS_VL B,
2128           BSC_KPIS_B            C
2129    WHERE  A.LEVEL_TABLE_NAME=B.LEVEL_TABLE_NAME
2130    AND    C.INDICATOR = A.INDICATOR
2131    AND    C.SHARE_FLAG <> 2
2132    AND    INSTR(','||l_child_dim_obj_list||',', ','||b.dim_level_id||',') > 0;
2133    ------------------------------------------------------------------
2134 
2135 BEGIN
2136     FND_MSG_PUB.Initialize;
2137     x_return_status := FND_API.G_RET_STS_SUCCESS;
2138     SAVEPOINT UpdateBSCDimObjectPMD;
2139     IF(p_dim_obj_short_name IS NOT NULL) THEN
2140         l_application_id    :=  p_application_id;
2141     END IF;
2142     l_dim_obj_name      :=  p_dim_obj_short_name;
2143 
2144     IF (l_dim_obj_name IS NULL) THEN
2145         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
2146         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
2147         FND_MSG_PUB.ADD;
2148         RAISE FND_API.G_EXC_ERROR;
2149     END IF;
2150     IF (p_data_source IS NULL) THEN
2151         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
2152         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DATA_SOURCE'), TRUE);
2153         FND_MSG_PUB.ADD;
2154         RAISE FND_API.G_EXC_ERROR;
2155     END IF;
2156     IF ((p_data_source <> 'BSC') AND (p_data_source <> 'PMF')) THEN
2157         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_DATA_SOURCE');
2158         FND_MSG_PUB.ADD;
2159         RAISE           FND_API.G_EXC_ERROR;
2160     END IF;
2161     IF (p_data_source = 'BSC') THEN
2162         l_bsc_dim_obj_rec.Source        :=  'OLTP';
2163     ELSE
2164         IF ((p_source_type IS NULL) OR ((p_source_type <> 'OLTP') AND (p_source_type <> 'EDW'))) THEN
2165             FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SOURCE_TYPE');
2166             FND_MSG_PUB.ADD;
2167             RAISE           FND_API.G_EXC_ERROR;
2168         ELSE
2169             l_bsc_dim_obj_rec.Source    :=  p_source_type;
2170         END IF;
2171     END IF;
2172 
2173     --check if short_name exists in the PMF system
2174     SELECT  COUNT(1) INTO l_count
2175     FROM    BIS_LEVELS
2176     WHERE   short_name  =   l_dim_obj_name;
2177     IF (l_count = 0) THEN
2178         FND_MESSAGE.SET_NAME('BSC','BSC_MUSER_DELETE_MESSAGE');
2179         FND_MESSAGE.SET_TOKEN('TYPE', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECT'), TRUE);
2180         FND_MSG_PUB.ADD;
2181         RAISE FND_API.G_EXC_ERROR;
2182     END IF;
2183     --check if short_name exists in the BSC system
2184     SELECT  COUNT(1)  INTO    l_count
2185     FROM    BSC_SYS_DIM_LEVELS_B
2186     WHERE   Short_Name  =   l_dim_obj_name;
2187     IF (l_count = 0) THEN
2188         FND_MESSAGE.SET_NAME('BSC','BSC_MUSER_DELETE_MESSAGE');
2189         FND_MESSAGE.SET_TOKEN('TYPE', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECT'), TRUE);
2190         FND_MSG_PUB.ADD;
2191         RAISE FND_API.G_EXC_ERROR;
2192     END IF;
2193     SELECT   dim_level_id
2194            , level_table_name
2195            , user_key_size
2196            , disp_key_size
2197            , NVL(source, 'BSC')
2198            , abbreviation
2199            , level_pk_col
2200            , name
2201            , level_view_name
2202     INTO     l_bsc_dim_obj_rec.Bsc_Level_Id
2203            , l_bsc_dim_obj_rec.Bsc_Level_Name          --p_source_table
2204            , l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size --p_maximum_code_size
2205            , l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size --p_maximum_name_size
2206            , l_bsc_dim_obj_rec.Bsc_Source              --p_data_source
2207            , l_bsc_dim_obj_rec.Bsc_Level_Abbreviation  --p_prototype_default_value
2208            , l_bsc_dim_obj_rec.Bsc_Pk_Col              --p_table_column
2209            , l_bis_dim_level_rec.Dimension_Level_Name
2210            , l_bsc_dim_obj_rec.Bsc_Level_View_Name
2211     FROM     BSC_SYS_DIM_LEVELS_VL
2212     WHERE    short_name = l_dim_obj_name;
2213     --check uniqueness of display name
2214     IF (p_display_name IS NOT NULL) THEN
2215         l_pmf_disp_name := p_display_name;
2216         IF (p_display_name <> l_bis_dim_level_rec.Dimension_Level_Name) THEN
2217              IF (p_data_source = 'PMF') THEN
2218                  SELECT  COUNT(1) INTO l_count
2219                  FROM    BIS_LEVELS_VL
2220                  WHERE   UPPER(short_name) <> UPPER(l_dim_obj_name)
2221                  AND     UPPER(name)       =  UPPER(p_display_name);
2222                  IF (l_count <> 0) THEN
2223                      FND_MESSAGE.SET_NAME('BSC','BSC_UNIQUE_NAME_REQUIRED');
2224                      FND_MESSAGE.SET_TOKEN('SHORT_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DISPLAY_NAME'), TRUE);
2225                      FND_MESSAGE.SET_TOKEN('NAME_VALUE', p_display_name);
2226                      FND_MSG_PUB.ADD;
2227                      RAISE FND_API.G_EXC_ERROR;
2228                  END IF;
2229              ELSIF (p_data_source = 'BSC') THEN   -- Allow insertion into BSC Data Model, with the same display name
2230                  SELECT  COUNT(1) INTO l_count
2231                  FROM    BIS_LEVELS_VL
2232                  WHERE   UPPER(short_name) <> UPPER(l_dim_obj_name)
2233                  AND     UPPER(name)       =  UPPER(l_pmf_disp_name);
2234 
2235                  WHILE(l_count > 0) LOOP
2236                      l_pmf_disp_name := BSC_UTILITY.get_Next_DispName(l_pmf_disp_name);
2237                      SELECT  COUNT(1) INTO l_count
2238                      FROM    BIS_LEVELS_VL
2239                      WHERE   UPPER(name) = UPPER(l_pmf_disp_name);
2240                  END LOOP;
2241              END IF;
2242         END IF;
2243     END IF;
2244     ---Check the dimensions that are being attached may contain both autogenerated and existing
2245     -- source type because of this
2246     l_mix_type_dim := FALSE;
2247         IF(p_assign_dim_short_names IS NOT NULL) THEN
2248         l_mix_type_dim := check_sametype_dims
2249                             (       p_dim_obj_name          =>  p_display_name
2250                                 ,   p_dim_obj_short_name    =>  p_dim_obj_short_name
2251                                 ,   p_dim_obj_source        =>  p_data_source
2252                                 ,   p_dim_short_names       =>  p_assign_dim_short_names
2253                                 ,   p_Restrict_Dim_Validate =>  p_Restrict_Dim_Validate
2254                                 ,   x_return_status         =>  x_return_status
2255                                 ,   x_msg_count             =>  x_msg_count
2256                                 ,   x_msg_data              =>  x_msg_data
2257                             );
2258         IF (l_mix_type_dim) THEN
2259             RAISE  FND_API.G_EXC_ERROR;
2260         END IF;
2261     END IF;
2262 
2263     --intialize records with existing values
2264     l_bsc_drop_tables.Bsc_Level_Id              :=  l_bsc_dim_obj_rec.Bsc_Level_Id;
2265     l_bsc_drop_tables.Bsc_Level_Name            :=  l_bsc_dim_obj_rec.Bsc_Level_Name;
2266     l_bsc_drop_tables.Bsc_Level_User_Key_Size   :=  l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size;
2267     l_bsc_drop_tables.Bsc_Level_Disp_Key_Size   :=  l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size;
2268     l_bsc_drop_tables.Bsc_Source                :=  l_bsc_dim_obj_rec.Bsc_Source;
2269     l_bsc_drop_tables.Bsc_Level_Abbreviation    :=  l_bsc_dim_obj_rec.Bsc_Level_Abbreviation;
2270     l_bsc_drop_tables.Bsc_Pk_Col                :=  l_bsc_dim_obj_rec.Bsc_Pk_Col;
2271     l_bsc_drop_tables.Bsc_Level_View_Name       :=  l_bsc_dim_obj_rec.Bsc_Level_View_Name;
2272 
2273     --BSC_SYS_DIM_LEVELS_B.dim_level_id
2274     -- Dimension Object type can not be changed (BSC/PMF).
2275     IF ((p_data_source IS NOT NULL) AND (l_bsc_dim_obj_rec.Bsc_Source <> p_data_source)) THEN
2276         FND_MESSAGE.SET_NAME('BSC','BSC_NO_UPDATE_DATA_SOURCE');
2277         FND_MSG_PUB.ADD;
2278         RAISE FND_API.G_EXC_ERROR;
2279     END IF;
2280     l_source_table  :=  p_source_table;
2281     IF ((p_source_table IS NOT NULL) AND (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') AND (INSTR(l_source_table, 'BSC_D_') <> 1)) THEN
2282         l_source_table  :=  'BSC_D_'||UPPER(l_source_table);
2283     END IF;
2284 
2285     IF((LENGTHB(l_source_table) > 27) AND (l_bsc_dim_obj_rec.Bsc_Source = 'BSC')) THEN
2286 
2287                 FND_MESSAGE.SET_NAME('BSC','BSC_DIM_OBJ_TABLE_NAME');
2288                 FND_MESSAGE.SET_TOKEN('TAB_NAME', l_source_table);
2289                 FND_MSG_PUB.ADD;
2290                 RAISE FND_API.G_EXC_ERROR;
2291     END IF;
2292 
2293     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
2294         IF ((l_bsc_dim_obj_rec.Bsc_Level_Abbreviation <> NVL(p_prototype_default_value, l_bsc_dim_obj_rec.Bsc_Level_Abbreviation)) OR
2295              (l_bsc_dim_obj_rec.Bsc_Level_Name <> NVL(p_source_table, l_bsc_dim_obj_rec.Bsc_Level_Name)) OR
2296                (l_bsc_dim_obj_rec.Bsc_Pk_Col <> NVL(p_table_column, l_bsc_dim_obj_rec.Bsc_Pk_Col)) OR
2297                  (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size <> NVL(p_maximum_code_size, l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size)) OR
2298                    (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size <> NVL(p_maximum_name_size, l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size))) THEN
2299                l_create_bsc    :=  TRUE;
2300         END IF;
2301         IF((l_bsc_dim_obj_rec.Bsc_Level_Name <> NVL(p_source_table, l_bsc_dim_obj_rec.Bsc_Level_Name)) OR
2302            (l_bsc_dim_obj_rec.Bsc_Pk_Col <> NVL(p_table_column, l_bsc_dim_obj_rec.Bsc_Pk_Col)))THEN
2303            l_struct_change :=  TRUE;
2304         END IF;
2305     END IF;
2306 
2307     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2308         IF (l_bsc_dim_obj_rec.Bsc_Level_Name <> NVL(l_source_table, l_bsc_dim_obj_rec.Bsc_Level_Name)) THEN
2309             l_create_pmf    :=  TRUE;
2310         END IF;
2311     END IF;
2312     IF (p_source_table IS NOT NULL) THEN
2313         l_bsc_dim_obj_rec.Bsc_Level_Name            :=  l_source_table;
2314     END IF;
2315     IF (p_maximum_code_size IS NOT NULL) THEN
2316         l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size   :=  p_maximum_code_size;
2317     END IF;
2318     IF (p_maximum_name_size IS NOT NULL) THEN
2319         l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size   :=  p_maximum_name_size;
2320     END IF;
2321     IF (p_table_column IS NOT NULL) THEN
2322         l_bsc_dim_obj_rec.Bsc_Pk_Col    :=  p_table_column;
2323     END IF;
2324     IF (p_prototype_default_value IS NOT NULL) THEN
2325         l_bsc_dim_obj_rec.Bsc_Level_Abbreviation    :=  SUBSTR(p_prototype_default_value, 1, 11);
2326     END IF;
2327 
2328     l_bsc_dim_obj_rec.Bsc_Level_Short_Name    :=  l_dim_obj_name;--BSC_SYS_DIM_LEVELS_B.short_name
2329 
2330     IF (c_dim_short_name%ISOPEN) THEN
2331         CLOSE c_dim_short_name;
2332     END IF;
2333     OPEN c_dim_short_name;
2334         FETCH c_dim_short_name INTO l_dim_short_name;
2335     CLOSE c_dim_short_name;
2336     l_dim_Grp_names :=  p_assign_dim_short_names;
2337     IF (p_assign_dim_short_names IS NOT NULL) THEN
2338         l_dim_Grp_names   :=  p_assign_dim_short_names ;
2339         WHILE (is_more(     p_dim_short_names   =>  l_dim_Grp_names
2340                         ,   p_dim_name          =>  l_dim_Grp_name)
2341         ) LOOP
2342             IF (l_first) THEN
2343                 l_first                := FALSE;
2344                 l_first_dim_short_name := l_dim_Grp_name;
2345             END IF;
2346             IF (l_dim_short_name = l_dim_Grp_name) THEN
2347                 l_dim_exist                             :=  TRUE;
2348                 l_bis_dim_level_rec.Dimension_Short_Name:= l_dim_Grp_name;
2349             END IF;
2350             l_Dim_Tab(l_index)  := NVL(BSC_DIMENSION_GROUPS_PVT.get_Dim_Group_Id(l_dim_Grp_name), -1);
2351             l_index             := l_index + 1;
2352         END LOOP;
2353     ELSE
2354         l_bis_dim_level_rec.Dimension_Short_Name        :=  BSC_BIS_DIMENSION_PUB.Unassigned_Dim;
2355     END IF;
2356     IF ((NOT l_dim_exist) AND (NOT l_first)) THEN
2357         l_bis_dim_level_rec.Dimension_Short_Name  := l_first_dim_short_name;
2358     END IF;
2359     l_dim_Grp_names :=  p_unassign_dim_short_names;
2360     -- Get all the Dimension Group that are going to be Unassigned
2361     IF (p_unassign_dim_short_names IS NOT NULL) THEN
2362         l_dim_Grp_names   :=  p_unassign_dim_short_names;
2363         WHILE (is_more(     p_dim_short_names   =>  l_dim_Grp_names
2364                         ,   p_dim_name          =>  l_dim_Grp_name)
2365         ) LOOP
2366             l_Dim_Tab(l_index) := NVL(BSC_DIMENSION_GROUPS_PVT.get_Dim_Group_Id(l_dim_Grp_name), -1);
2367             l_index := l_index + 1;
2368         END LOOP;
2369     END IF;
2370     -- Lock all the Dimension Groups to be assigned to the Dimension Objects
2371     BSC_BIS_LOCKS_PUB.Lock_Update_Dimension_Object
2372     (    p_Dim_Object_Id          => l_bsc_dim_obj_rec.Bsc_Level_Id
2373         ,p_Selected_Dimensions    => l_Dim_Tab
2374         ,p_time_stamp             => p_time_stamp  -- Granular Locking
2375         ,x_return_status          => x_return_status
2376         ,x_msg_count              => x_msg_count
2377         ,x_msg_data               => x_msg_data
2378     );
2379     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2380          RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2381     END IF;
2382     -- End Granular Locking
2383 
2384     l_bsc_dim_obj_rec.Bsc_Level_Short_Name    :=  l_dim_obj_name;--BSC_SYS_DIM_LEVELS_B.short_name
2385     --generate unique abbreviation if source is BSC
2386     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
2387         IF ((l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size < l_bsc_drop_tables.Bsc_Level_User_Key_Size)
2388           OR (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size < l_bsc_drop_tables.Bsc_Level_Disp_Key_Size)) THEN
2389                 FND_MESSAGE.SET_NAME('BSC','BSC_CODE_SIZE_NOT_DECREASED');
2390                 FND_MSG_PUB.ADD;
2391                 RAISE FND_API.G_EXC_ERROR;
2392         END IF;
2393         IF ((l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size < BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Min_Size) OR
2394               (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size > BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Max_Size) OR
2395                 (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size < BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Min_Size) OR
2396                   (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size > BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Max_Size)) THEN
2397                 FND_MESSAGE.SET_NAME('BSC','BSC_CODE_NAME_SIZE');
2398                 FND_MSG_PUB.ADD;
2399                 RAISE FND_API.G_EXC_ERROR;
2400         END IF;
2401         SELECT COUNT(1) INTO l_count
2402         FROM   BSC_SYS_DIM_LEVELS_B
2403         WHERE  UPPER(abbreviation)  = UPPER(l_bsc_dim_obj_rec.Bsc_Level_Abbreviation)
2404         AND    dim_level_id        <> l_bsc_dim_obj_rec.Bsc_Level_Id
2405         AND    Source               = 'BSC';
2406         IF (l_count <> 0) THEN
2407             FND_MESSAGE.SET_NAME('BSC','BSC_UNIQUE_NAME_REQUIRED');
2408             FND_MESSAGE.SET_TOKEN('SHORT_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'ABBREVIATION'), TRUE);
2409             FND_MESSAGE.SET_TOKEN('NAME_VALUE', l_bsc_dim_obj_rec.Bsc_Level_Abbreviation);
2410             FND_MSG_PUB.ADD;
2411             RAISE FND_API.G_EXC_ERROR;
2412         END IF;
2413         IF (l_bsc_dim_obj_rec.Bsc_Level_Name IS NULL) THEN
2414             l_bsc_dim_obj_rec.Bsc_Level_Name    :=  'BSC_D_'||SUBSTR(REPLACE(l_dim_obj_name, ' ', '_') , 1, 22);
2415         END IF;
2416         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs
2417                     (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
2418                         ,   x_return_status     =>  x_return_status
2419                         ,   x_msg_count         =>  x_msg_count
2420                         ,   x_msg_data          =>  x_msg_data
2421                     );
2422         IF(NOT l_flag) THEN
2423             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2424         END IF;
2425     ELSIF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2426         IF ((l_bsc_dim_obj_rec.Source = 'OLTP') OR (l_bsc_dim_obj_rec.Source = 'EDW')) THEN
2427 
2428             l_bsc_dim_obj_rec.Bsc_Level_Name  :=  p_source_table;
2429             IF((l_bsc_dim_obj_rec.Bsc_Level_Name IS NOT NULL) AND
2430                 (INSTR(l_bsc_dim_obj_rec.Bsc_Level_Name, 'BSC_D_') = 1)) THEN
2431                 l_bsc_dim_obj_rec.Bsc_Level_Name   :=  SUBSTR(l_bsc_dim_obj_rec.Bsc_Level_Name, 7, LENGTH(l_bsc_dim_obj_rec.Bsc_Level_Name));
2432             END IF;
2433             l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs
2434                         (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
2435                             ,   x_return_status     =>  x_return_status
2436                             ,   x_msg_count         =>  x_msg_count
2437                             ,   x_msg_data          =>  x_msg_data
2438                         );
2439             IF (NOT l_flag) THEN
2440                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2441             END IF;
2442         ELSE
2443             FND_MESSAGE.SET_NAME('BSC','BSC_PRE_DIM_OBJ_SOURCE_TYPE');
2444             FND_MSG_PUB.ADD;
2445             RAISE FND_API.G_EXC_ERROR;
2446         END IF;
2447     END IF;
2448 
2449     SELECT level_id INTO  l_bis_dim_level_rec.Dimension_Level_ID
2450     FROM   BIS_LEVELS
2451     WHERE  short_name = l_dim_obj_name;
2452 
2453     /********DISABLED BY RAVI ****************/
2454     --l_bis_dim_level_rec.Dimension_Short_Name        :=  'UNASSIGNED';
2455     l_bis_dim_level_rec.Dimension_ID                :=  get_bis_dimension_id(l_bis_dim_level_rec.Dimension_Short_Name) ;
2456     /*****************************************/
2457     l_bis_dim_level_rec.Dimension_Name              :=  NULL;
2458     l_bis_dim_level_rec.Dimension_Level_Short_Name  :=  l_dim_obj_name;
2459     l_bis_dim_level_rec.Dimension_Level_Name        :=  l_pmf_disp_name; -- PMF Dimension Name should be different
2460     l_bis_dim_level_rec.Description                 :=  p_description;
2461     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
2462         l_bis_dim_level_rec.Level_Values_View_Name  := l_bsc_dim_obj_rec.Bsc_Level_Name;
2463     ELSE
2464         l_bis_dim_level_rec.Level_Values_View_Name  :=  p_source_table;
2465     END IF;
2466     IF ((l_bis_dim_level_rec.Level_Values_View_Name IS NOT NULL) AND
2467          (NOT is_Valid_Identifier(l_bis_dim_level_rec.Level_Values_View_Name))) THEN
2468         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
2469         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'), TRUE);
2470         FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_bis_dim_level_rec.Level_Values_View_Name);
2471         FND_MSG_PUB.ADD;
2472         RAISE FND_API.G_EXC_ERROR;
2473     END IF;
2474     l_bis_dim_level_rec.where_Clause            :=  p_where_clause;
2475     l_bis_dim_level_rec.source                  :=  l_bsc_dim_obj_rec.Source;
2476     l_bis_dim_level_rec.application_id          :=  l_application_id;
2477     l_bis_dim_level_rec.Comparison_Label_Code   :=  p_comparison_label_code;
2478     IF ((p_Long_Lov IS NULL) OR ((p_Long_Lov <> FND_API.G_TRUE) AND (p_Long_Lov <> FND_API.G_FALSE))) THEN
2479         l_bis_dim_level_rec.Long_Lov            :=  FND_API.G_FALSE;
2480     ELSE
2481         l_bis_dim_level_rec.Long_Lov            :=  p_Long_Lov;
2482     END IF;
2483 
2484     IF ((p_Dim_Obj_Enabled IS NULL) OR ((p_Dim_Obj_Enabled <> FND_API.G_TRUE) AND (p_Dim_Obj_Enabled <> FND_API.G_FALSE))) THEN
2485         l_bis_dim_level_rec.Enabled                :=  FND_API.G_FALSE;
2486     ELSE
2487         l_bis_dim_level_rec.Enabled                :=  p_Dim_Obj_Enabled;
2488     END IF;
2489 
2490     IF( BIS_UTILITIES_PUB.Value_Not_Missing(p_hide) = FND_API.G_TRUE ) THEN
2491       l_bis_dim_level_rec.hide := p_hide;
2492     END IF;
2493 
2494     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2495         IF (p_Default_Values_Api IS NULL) THEN
2496             l_bis_dim_level_rec.Default_Values_Api :=  p_Default_Values_Api;
2497         ELSIF (p_Default_Values_Api <> '''''') THEN
2498             l_bis_dim_level_rec.Default_Values_Api :=  p_Default_Values_Api;
2499         END IF;
2500         l_bis_dim_level_rec.View_Object_Name       :=  p_View_Object_Name;
2501         l_bis_dim_level_rec.Attribute_Code         :=  l_bis_dim_level_rec.Dimension_Level_Short_Name;
2502     END IF;
2503     IF ((l_bsc_dim_obj_rec.Bsc_Source = 'PMF') AND (p_Master_Level IS NOT NULL)) THEN
2504         IF (p_Master_Level = l_bis_dim_level_rec.Dimension_Level_Short_Name) THEN
2505             FND_MESSAGE.SET_NAME('BIS','BIS_PMF_NO_SAME_DO');
2506             FND_MSG_PUB.ADD;
2507             RAISE FND_API.G_EXC_ERROR;
2508         END IF;
2509         IF (c_Master_Level%ISOPEN) THEN
2510             CLOSE c_Master_Level;
2511         END IF;
2512         OPEN    c_Master_Level;
2513             FETCH   c_Master_Level
2514             INTO    l_bis_dim_level_rec.Master_Level
2515                  ,  l_bis_short_name
2516                  ,  l_bis_name;
2517         CLOSE c_Master_Level;
2518         IF (l_bis_dim_level_rec.Master_Level IS NULL) THEN
2519             FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_LEVEL_NAME');
2520             FND_MESSAGE.SET_TOKEN('BSC_LEVEL_NAME', p_Master_Level);
2521             FND_MSG_PUB.ADD;
2522             RAISE FND_API.G_EXC_ERROR;
2523         END IF;
2524         IF (l_bis_short_name IS NOT NULL) THEN
2525             FND_MESSAGE.SET_NAME('BIS','BIS_PMF_LOV_NO_MASTER');
2526             FND_MESSAGE.SET_TOKEN('BIS_OBJ_LOV', l_bis_name);
2527             FND_MSG_PUB.ADD;
2528             RAISE FND_API.G_EXC_ERROR;
2529         END IF;
2530         SELECT COUNT(1) INTO l_Count
2531         FROM   BIS_LEVELS
2532         WHERE  Master_Level = l_bis_dim_level_rec.Dimension_Level_Short_Name;
2533         IF (l_Count <> 0) THEN
2534             FND_MESSAGE.SET_NAME('BIS','BIS_PMF_UPD_NO_MASTER');
2535             FND_MESSAGE.SET_TOKEN('BIS_OBJ_UPD', NVL(l_bis_dim_level_rec.Dimension_Level_Name, l_bis_dim_level_rec.Dimension_Level_Short_Name));
2536             FND_MSG_PUB.ADD;
2537             RAISE FND_API.G_EXC_ERROR;
2538         END IF;
2539     END IF;
2540 
2541     l_bis_dim_level_rec.Default_Search     :=  p_Search_Function;
2542     l_bis_dim_level_rec.Drill_To_Form_Function := p_Drill_To_Form_Function;
2543     -- Primary_Dim will be used only ine case of LDT upload in update mode it should take as provided from PMD API.
2544     l_bis_dim_level_rec.Primary_Dim := FND_API.G_TRUE;
2545     BIS_DIMENSION_LEVEL_PUB.Update_Dimension_Level
2546     (       p_api_version           =>  1.0
2547         ,   p_commit                =>  FND_API.G_FALSE
2548         ,   p_validation_level      =>  FND_API.G_VALID_LEVEL_FULL
2549         ,   p_Dimension_Level_Rec   =>  l_bis_dim_level_rec
2550         ,   x_return_status         =>  x_return_status
2551         ,   x_error_Tbl             =>  l_error_tbl
2552     );
2553     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2554         IF (l_error_tbl.COUNT > 0) THEN
2555             x_msg_data  :=  l_error_tbl(l_error_tbl.COUNT).Error_Description;
2556             IF(INSTR(x_msg_data, ' ')  =  0 ) THEN
2557                 FND_MESSAGE.SET_NAME('BIS',x_msg_data);
2558                 FND_MSG_PUB.ADD;
2559                 x_msg_data  :=  NULL;
2560             END IF;
2561             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2562         END IF;
2563         RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
2564     END IF;
2565 
2566     --CALL API TO UPDATE INTO FND_LOOKUP_VALUES
2567 
2568     --CALL BSC API
2569     --Get BSC Dimension ID into 'l_bsc_dim_id'
2570     SELECT dim_level_id INTO    l_bsc_dim_id
2571     FROM   BSC_SYS_DIM_LEVELS_B
2572     WHERE  UPPER(short_name) = UPPER(l_dim_obj_name);
2573 
2574     l_bsc_dim_obj_rec.Bsc_Dim_Comp_Disp_Name          :=  p_comparison_item_text;
2575     l_bsc_dim_obj_rec.Bsc_Dim_Level_Long_Name         :=  p_display_name;
2576     l_bsc_dim_obj_rec.Bsc_Dim_Level_Help              :=  p_description;
2577     l_bsc_dim_obj_rec.Bsc_Dim_Tot_Disp_Name           :=  p_all_item_text;
2578     l_bsc_dim_obj_rec.Bsc_Language                    :=  NULL;
2579     l_bsc_dim_obj_rec.Bsc_Level_Column_Name           :=  NULL;
2580     l_bsc_dim_obj_rec.Bsc_Level_Column_Type           :=  NULL;
2581     l_bsc_dim_obj_rec.Bsc_Level_Comp_Order_By         :=  p_comparison_order;
2582     l_bsc_dim_obj_rec.Bsc_Level_Custom_Group          :=  0;
2583     l_bsc_dim_obj_rec.Bsc_Level_Index                 :=  0;
2584     l_bsc_dim_obj_rec.Bsc_Level_Value_Order_By        :=  p_dimension_values_order;
2585     l_bsc_dim_obj_rec.Bsc_Source_Language             :=  NULL;
2586     l_bsc_dim_obj_rec.Bsc_Source_Level_Long_Name      :=  NULL;
2587     l_bsc_dim_obj_rec.Bsc_Relation_Column             :=  NULL;
2588     l_bsc_dim_obj_rec.Bsc_Relation_Type               :=  NULL;
2589     l_bsc_dim_obj_rec.Bsc_Parent_Level_Id             :=  NULL;
2590     l_bsc_dim_obj_rec.Bsc_Parent_Level_Index          :=  NULL;
2591     l_bsc_dim_obj_rec.Bsc_Parent_Level_Short_Name     :=  NULL;
2592     l_bsc_dim_obj_rec.Bsc_Parent_Level_Source         :=  NULL;
2593     l_bsc_dim_obj_rec.Bsc_Flag                        :=  NULL;
2594 
2595     l_count := 0;
2596     --cascading is required for BSC types of Dimension Objects Only
2597     FOR cd IN c_kpi_dim_set LOOP
2598         l_MTab_Tbl(l_count).p_kpi_id      :=  cd.Indicator;
2599         l_MTab_Tbl(l_count).p_dim_set_id  :=  cd.Dim_Set_Id;
2600         l_count :=  l_count + 1;
2601     END LOOP;
2602 
2603     l_child_dim_obj_list := NULL;
2604     -- If l_child_Struct is true, then we need to refresh the Child Dimension Object's Kpis as well
2605     IF (l_child_struc) THEN
2606         l_child_dim_obj_list := Get_Child_Dim_Objs(p_Dim_Level_Id => l_bsc_dim_obj_rec.Bsc_Level_Id);
2607 
2608 
2609         IF (l_child_dim_obj_list IS NOT NULL) THEN
2610             FOR ckds IN c_Kpi_Dim_Set1 LOOP
2611                 l_duplicate_flag := FALSE;
2612                 FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
2613                     IF(l_MTab_Tbl(i).p_kpi_id=ckds.Indicator)THEN
2614                     l_duplicate_flag := TRUE;
2615                     EXIT;
2616                     END IF;
2617                 END LOOP;
2618                 IF(NOT l_duplicate_flag) THEN
2619                     l_MTab_Tbl(l_count).p_kpi_id      :=  ckds.Indicator;
2620                     l_MTab_Tbl(l_count).p_dim_set_id  :=  ckds.Dim_Set_Id;
2621                     l_count :=  l_count + 1;
2622                 END IF;
2623             END LOOP;
2624         END IF;
2625     END IF;
2626 
2627 
2628     FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
2629         BSC_BIS_KPI_MEAS_PUB.Delete_Dim_Objs_In_DSet
2630         (       p_commit             =>   FND_API.G_FALSE
2631             ,   p_kpi_id             =>   l_MTab_Tbl(i).p_kpi_id
2632             ,   p_dim_set_id         =>   l_MTab_Tbl(i).p_dim_set_id
2633             ,   x_return_status      =>   x_return_status
2634             ,   x_msg_count          =>   x_msg_count
2635             ,   x_msg_data           =>   x_msg_data
2636         );
2637         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2638             RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2639         END IF;
2640     END LOOP;
2641     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2642         l_level_table_name                :=  l_bsc_dim_obj_rec.Bsc_Level_Name;
2643         l_bsc_dim_obj_rec.Bsc_Level_Name  :=  l_bsc_dim_obj_rec.Bsc_Level_View_Name;
2644     END IF;
2645     BSC_DIMENSION_LEVELS_PUB.Update_Dim_Level
2646     (       p_commit            =>  FND_API.G_FALSE
2647         ,   p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
2648         ,   x_return_status     =>  x_return_status
2649         ,   x_msg_count         =>  x_msg_count
2650         ,   x_msg_data          =>  x_msg_data
2651     );
2652     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2653         RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2654     END IF;
2655     FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
2656         IF (l_struct_change) THEN
2657             BSC_BIS_KPI_MEAS_PUB.Create_Dim_Objs_In_DSet
2658             (       p_commit             =>   FND_API.G_FALSE
2659                 ,   p_kpi_id             =>   l_MTab_Tbl(i).p_kpi_id
2660                 ,   p_dim_set_id         =>   l_MTab_Tbl(i).p_dim_set_id
2661                 ,   x_return_status      =>   x_return_status
2662                 ,   x_msg_count          =>   x_msg_count
2663                 ,   x_msg_data           =>   x_msg_data
2664             );
2665             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2666                 RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2667             END IF;
2668         ELSE
2669             BSC_BIS_KPI_MEAS_PUB.Create_Dim_Objs_In_DSet
2670             (       p_commit             =>   FND_API.G_FALSE
2671                 ,   p_kpi_id             =>   l_MTab_Tbl(i).p_kpi_id
2672                 ,   p_dim_set_id         =>   l_MTab_Tbl(i).p_dim_set_id
2673                 ,   p_kpi_flag_change    =>   BSC_DESIGNER_PVT.G_ActionFlag.Normal
2674                 ,   x_return_status      =>   x_return_status
2675                 ,   x_msg_count          =>   x_msg_count
2676                 ,   x_msg_data           =>   x_msg_data
2677             );
2678             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2679                 RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2680             END IF;
2681         END IF;
2682     END LOOP;
2683     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2684         BSC_BIS_DIM_OBJ_PUB.Set_All_Enable_Flag
2685         (       p_commit                =>  FND_API.G_FALSE
2686             ,   p_Dim_Obj_Short_Name    =>  l_bis_dim_level_rec.Dimension_Level_Short_Name
2687             ,   p_All_Enabled           =>  p_All_Enabled
2688             ,   x_return_status         =>  x_return_status
2689             ,   x_msg_count             =>  x_msg_count
2690             ,   x_msg_data              =>  x_msg_data
2691         );
2692         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2693             RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
2694         END IF;
2695     END IF;
2696     BSC_BIS_DIM_OBJ_PUB.Assign_Unassign_Dimensions
2697     (       p_commit                        =>  FND_API.G_FALSE
2698         ,   p_dim_obj_short_name            =>  l_dim_obj_name
2699         ,   p_assign_dim_short_names        =>  p_assign_dim_short_names
2700         ,   p_unassign_dim_short_names      =>  p_unassign_dim_short_names
2701         ,   p_Restrict_Dim_Validate         =>  p_Restrict_Dim_Validate
2702         ,   x_return_status                 =>  x_return_status
2703         ,   x_msg_count                     =>  x_msg_count
2704         ,   x_msg_data                      =>  x_msg_data
2705     );
2706     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2707         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2708     END IF;
2709     IF (l_bsc_dim_obj_rec.Bsc_Source = 'PMF') THEN
2710         BSC_BIS_DIM_OBJ_PUB.Set_All_Enable_Flag
2711         (       p_commit                =>  FND_API.G_FALSE
2712             ,   p_Dim_Obj_Short_Name    =>  l_bis_dim_level_rec.Dimension_Level_Short_Name
2713             ,   p_All_Enabled           =>  p_All_Enabled
2714             ,   x_return_status         =>  x_return_status
2715             ,   x_msg_count             =>  x_msg_count
2716             ,   x_msg_data              =>  x_msg_data
2717         );
2718         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2719           RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
2720         END IF;
2721     ELSIF ((l_bsc_dim_obj_rec.Bsc_Source = 'BSC') AND (p_assign_dim_short_names IS NOT NULL) AND (p_unassign_dim_short_names IS NULL) AND (INSTR(p_assign_dim_short_names, ',') = 0)) THEN
2722       /* Set 'All' flag for BSC type dim objects (specific to Auto Generated RPD - reserved for future)
2723          We are checking if p_assign_dim_short_names contains only 1 dimension
2724      and p_unassign_dim_short_names doesn't contain any dimension. This way
2725      we are safe not to update 'All' flag for other dimension-dim object
2726      relationships while coming from Dimension Designer.
2727       */
2728       BSC_BIS_DIM_OBJ_PUB.Set_Bsc_All_Enable_Flag
2729       ( p_commit                =>  FND_API.G_FALSE
2730       , p_Dim_Obj_Short_Name    =>  l_dim_obj_name
2731       , p_Dim_Short_Name        =>  p_assign_dim_short_names
2732       , p_All_Enabled           =>  p_All_Enabled
2733       , x_return_status         =>  x_return_status
2734       , x_msg_count             =>  x_msg_count
2735       , x_msg_data              =>  x_msg_data
2736       );
2737       IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2738         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2739       END IF;
2740     END IF;
2741 
2742     l_primary_dim_sht_name := Retrieve_Primary_Dimension(l_dim_obj_name);
2743     IF (l_primary_dim_sht_name IS NOT NULL AND l_primary_dim_sht_name <> BSC_BIS_DIMENSION_PUB.Unassigned_Dim) THEN
2744     -- Bug 4997042
2745         BSC_BIS_DIM_OBJ_PUB.Cascade_Dim_Props_Into_Dim_Grp (
2746           p_Dim_Obj_Short_Name   =>  l_dim_obj_name
2747           , p_Dim_Short_Name     =>  l_primary_dim_sht_name
2748           , p_All_Flag           =>  p_All_Enabled
2749           , x_Return_Status      =>  x_return_status
2750           , x_Msg_Count          =>  x_msg_count
2751           , x_Msg_Data           =>  x_msg_data
2752        );
2753        IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2754            RAISE           FND_API.G_EXC_UNEXPECTED_ERROR;
2755        END IF;
2756     END IF;
2757 
2758     -- Start Granular Locking
2759     BSC_BIS_LOCKS_PUB.Set_Time_Stamp_Dim_Level
2760     (        p_dim_level_id          =>  l_bsc_dim_obj_rec.Bsc_Level_Id
2761          ,   x_return_status         =>  x_return_status
2762          ,   x_msg_count             =>  x_msg_count
2763          ,   x_msg_data              =>  x_msg_data
2764     );
2765     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2766          RAISE           FND_API.G_EXC_UNEXPECTED_ERROR;
2767     END IF;
2768     IF ((l_create_pmf) AND (l_bsc_dim_obj_rec.Bsc_Source = 'PMF')) THEN
2769         BSC_DIMENSION_LEVELS_PUB.Drop_Dim_Level_Tabs
2770         (       p_Dim_Level_Rec     =>  l_bsc_drop_tables
2771             ,   x_return_status     =>  x_return_status
2772             ,   x_msg_count         =>  x_msg_count
2773             ,   x_msg_data          =>  x_msg_data
2774         );
2775         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2776             RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2777         END IF;
2778         l_bsc_dim_obj_rec.Bsc_Level_Name  :=  l_level_table_name;
2779         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views
2780                     (       p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
2781                         ,   x_return_status     =>  x_return_status
2782                         ,   x_msg_count         =>  x_msg_count
2783                         ,   x_msg_data          =>  x_msg_data
2784                     );
2785         IF (NOT l_flag) THEN
2786             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2787         END IF;
2788     END IF;
2789     IF ((l_create_bsc) AND (l_bsc_dim_obj_rec.Bsc_Source = 'BSC')) THEN
2790         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs
2791                     (       p_Dim_Level_Rec       =>  l_bsc_dim_obj_rec
2792                         ,   p_Dim_Level_Rec_Old   =>  l_bsc_drop_tables
2793                         ,   x_return_status       =>  x_return_status
2794                         ,   x_msg_count           =>  x_msg_count
2795                         ,   x_msg_data            =>  x_msg_data
2796                     );
2797         IF(NOT l_flag) THEN
2798             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2799         END IF;
2800     END IF;
2801     /*************************************************************
2802      When a dimension object is updated, it is possible to assign
2803      unassing the dimension objects from the dimensions.It is possible
2804      that these dimensions might be used in some Kpis and part of the
2805      list button. so we need to call the Validate_List_Button logic
2806      here.
2807     /************************************************************/
2808     IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
2809        BSC_COMMON_DIM_LEVELS_PUB.Validate_List_Button
2810        (
2811                 p_Kpi_Id        =>  NULL
2812           ,     p_Dim_Level_Id  =>  l_bsc_dim_obj_rec.Bsc_Level_Id
2813           ,     x_return_status =>  x_return_status
2814           ,     x_msg_count     =>  x_msg_count
2815           ,     x_msg_data      =>  x_msg_data
2816         );
2817         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2818           RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2819         END IF;
2820     END IF;
2821     IF (p_commit = FND_API.G_TRUE) THEN
2822         COMMIT;
2823     END IF;
2824     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
2825 EXCEPTION
2826     WHEN FND_API.G_EXC_ERROR THEN
2827         IF (c_Master_Level%ISOPEN) THEN
2828             CLOSE c_Master_Level;
2829         END IF;
2830         ROLLBACK TO UpdateBSCDimObjectPMD;
2831         IF (x_msg_data IS NULL) THEN
2832             FND_MSG_PUB.Count_And_Get
2833             (      p_encoded   =>  FND_API.G_FALSE
2834                ,   p_count     =>  x_msg_count
2835                ,   p_data      =>  x_msg_data
2836             );
2837         END IF;
2838         x_return_status :=  FND_API.G_RET_STS_ERROR;
2839     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2840         IF (c_Master_Level%ISOPEN) THEN
2841             CLOSE c_Master_Level;
2842         END IF;
2843         ROLLBACK TO UpdateBSCDimObjectPMD;
2844         IF (x_msg_data IS NULL) THEN
2845             FND_MSG_PUB.Count_And_Get
2846             (      p_encoded   =>  FND_API.G_FALSE
2847                ,   p_count     =>  x_msg_count
2848                ,   p_data      =>  x_msg_data
2849             );
2850         END IF;
2851         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2852     WHEN NO_DATA_FOUND THEN
2853         IF (c_Master_Level%ISOPEN) THEN
2854             CLOSE c_Master_Level;
2855         END IF;
2856         ROLLBACK TO UpdateBSCDimObjectPMD;
2857         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2858         IF (x_msg_data IS NOT NULL) THEN
2859             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2860         ELSE
2861             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2862         END IF;
2863     WHEN OTHERS THEN
2864         IF (c_Master_Level%ISOPEN) THEN
2865             CLOSE c_Master_Level;
2866         END IF;
2867         ROLLBACK TO UpdateBSCDimObjectPMD;
2868         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2869         IF (x_msg_data IS NOT NULL) THEN
2870             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2871         ELSE
2872             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2873         END IF;
2874 END Update_Dim_Object;
2875 
2876 /*********************************************************************************
2877                             UPDATE DIMENSION
2878 *********************************************************************************/
2879 PROCEDURE Update_Dim_Object
2880 (       p_commit                    IN          VARCHAR2   := FND_API.G_TRUE
2881     ,   p_dim_obj_short_name        IN          VARCHAR2
2882     ,   p_display_name              IN          VARCHAR2
2883     ,   p_application_id            IN          NUMBER
2884     ,   p_description               IN          VARCHAR2
2885     ,   p_data_source               IN          VARCHAR2
2886     ,   p_source_table              IN          VARCHAR2
2887     ,   p_where_clause              IN          VARCHAR2   :=  NULL
2888     ,   p_comparison_label_code     IN          VARCHAR2
2889     ,   p_table_column              IN          VARCHAR2
2890     ,   p_source_type               IN          VARCHAR2
2891     ,   p_maximum_code_size         IN          NUMBER
2892     ,   p_maximum_name_size         IN          NUMBER
2893     ,   p_all_item_text             IN          VARCHAR2
2894     ,   p_comparison_item_text      IN          VARCHAR2
2895     ,   p_prototype_default_value   IN          VARCHAR2
2896     ,   p_dimension_values_order    IN          NUMBER
2897     ,   p_comparison_order          IN          NUMBER
2898     ,   p_time_stamp                IN          VARCHAR2   :=  NULL        -- Granular Locking
2899     ,   p_Master_Level              IN          VARCHAR2   :=  NULL
2900     ,   p_Long_Lov                  IN          VARCHAR2   :=  FND_API.G_FALSE
2901     ,   p_Search_Function           IN          VARCHAR2   :=  NULL
2902     ,   p_Dim_Obj_Enabled           IN          VARCHAR2   :=  FND_API.G_FALSE
2903     ,   p_View_Object_Name          IN          VARCHAR2   :=  NULL
2904     ,   p_Default_Values_Api        IN          VARCHAR2   :=  NULL
2905     ,   p_All_Enabled               IN          NUMBER     :=  NULL
2906     ,   p_Drill_To_Form_Function    IN          VARCHAR2   :=  NULL
2907     ,   p_Hide                      IN          VARCHAR2   :=  FND_API.G_FALSE
2908     ,   x_return_status             OUT NOCOPY  VARCHAR2
2909     ,   x_msg_count                 OUT NOCOPY  NUMBER
2910     ,   x_msg_data                  OUT NOCOPY  VARCHAR2
2911 ) IS
2912 BEGIN
2913     FND_MSG_PUB.Initialize;
2914     x_return_status := FND_API.G_RET_STS_SUCCESS;
2915 
2916     BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object
2917     (       p_commit                    =>  FND_API.G_FALSE
2918         ,   p_dim_obj_short_name        =>  p_dim_obj_short_name
2919         ,   p_display_name              =>  p_display_name
2920         ,   p_application_id            =>  p_application_id
2921         ,   p_description               =>  p_description
2922         ,   p_data_source               =>  p_data_source
2923         ,   p_source_table              =>  p_source_table
2924         ,   p_where_clause              =>  p_where_clause
2925         ,   p_comparison_label_code     =>  p_comparison_label_code
2926         ,   p_table_column              =>  p_table_column
2927         ,   p_source_type               =>  p_source_type
2928         ,   p_maximum_code_size         =>  p_maximum_code_size
2929         ,   p_maximum_name_size         =>  p_maximum_name_size
2930         ,   p_all_item_text             =>  p_all_item_text
2931         ,   p_comparison_item_text      =>  p_comparison_item_text
2932         ,   p_prototype_default_value   =>  p_prototype_default_value
2933         ,   p_dimension_values_order    =>  p_dimension_values_order
2934         ,   p_comparison_order          =>  p_comparison_order
2935         ,   p_assign_dim_short_names    =>  NULL
2936         ,   p_unassign_dim_short_names  =>  NULL
2937         ,   p_time_stamp                =>  p_time_stamp -- Granular Locking
2938         ,   p_Master_Level              =>  p_Master_Level
2939         ,   p_Long_Lov                  =>  p_Long_Lov
2940         ,   p_Search_Function           =>  p_Search_Function
2941         ,   p_Dim_Obj_Enabled           =>  p_Dim_Obj_Enabled
2942         ,   p_View_Object_Name          =>  p_View_Object_Name
2943         ,   p_Default_Values_Api        =>  p_Default_Values_Api
2944         ,   p_Drill_To_Form_Function    =>  p_Drill_To_Form_Function
2945         ,   p_All_Enabled               =>  p_All_Enabled
2946         ,   p_Hide                      =>  p_Hide
2947         ,   x_return_status             =>  x_return_status
2948         ,   x_msg_count                 =>  x_msg_count
2949         ,   x_msg_data                  =>  x_msg_data
2950     );
2951     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
2952         RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
2953     END IF;
2954     IF (p_commit = FND_API.G_TRUE) THEN
2955         COMMIT;
2956     END IF;
2957     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
2958 EXCEPTION
2959     WHEN FND_API.G_EXC_ERROR THEN
2960         IF (x_msg_data IS NULL) THEN
2961             FND_MSG_PUB.Count_And_Get
2962             (      p_encoded   =>  FND_API.G_FALSE
2963                ,   p_count     =>  x_msg_count
2964                ,   p_data      =>  x_msg_data
2965             );
2966         END IF;
2967         x_return_status :=  FND_API.G_RET_STS_ERROR;
2968     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2969         IF (x_msg_data IS NULL) THEN
2970             FND_MSG_PUB.Count_And_Get
2971             (      p_encoded   =>  FND_API.G_FALSE
2972                ,   p_count     =>  x_msg_count
2973                ,   p_data      =>  x_msg_data
2974             );
2975         END IF;
2976         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2977     WHEN NO_DATA_FOUND THEN
2978         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2979         IF (x_msg_data IS NOT NULL) THEN
2980             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2981         ELSE
2982             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2983         END IF;
2984     WHEN OTHERS THEN
2985         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2986         IF (x_msg_data IS NOT NULL) THEN
2987             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2988         ELSE
2989             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
2990         END IF;
2991 END Update_Dim_Object;
2992 
2993 /*********************************************************************************
2994                             UPDATE DIMENSION
2995 *********************************************************************************/
2996 PROCEDURE Update_Dim_Object
2997 (       p_commit                    IN          VARCHAR2    :=  FND_API.G_TRUE
2998     ,   p_dim_obj_short_name        IN          VARCHAR2
2999     ,   p_display_name              IN          VARCHAR2
3000     ,   p_application_id            IN          NUMBER
3001     ,   p_description               IN          VARCHAR2
3002     ,   p_data_source               IN          VARCHAR2
3003     ,   p_source_table              IN          VARCHAR2
3004     ,   p_where_clause              IN          VARCHAR2    :=  NULL
3005     ,   p_comparison_label_code     IN          VARCHAR2
3006     ,   p_table_column              IN          VARCHAR2
3007     ,   p_source_type               IN          VARCHAR2
3008     ,   p_maximum_code_size         IN          NUMBER
3009     ,   p_maximum_name_size         IN          NUMBER
3010     ,   p_all_item_text             IN          VARCHAR2
3011     ,   p_comparison_item_text      IN          VARCHAR2
3012     ,   p_prototype_default_value   IN          VARCHAR2
3013     ,   p_dimension_values_order    IN          NUMBER
3014     ,   p_comparison_order          IN          NUMBER
3015     ,   p_assign_dim_short_names    IN          VARCHAR2
3016     ,   p_time_stamp                IN          VARCHAR2   :=  NULL        -- Granular Locking
3017     ,   p_Master_Level              IN          VARCHAR2   :=  NULL
3018     ,   p_Long_Lov                  IN          VARCHAR2   :=  FND_API.G_FALSE
3019     ,   p_Search_Function           IN          VARCHAR2   :=  NULL
3020     ,   p_Dim_Obj_Enabled           IN          VARCHAR2   :=  FND_API.G_FALSE
3021     ,   p_View_Object_Name          IN          VARCHAR2   :=  NULL
3022     ,   p_Default_Values_Api        IN          VARCHAR2   :=  NULL
3023     ,   p_All_Enabled               IN          NUMBER     :=  NULL
3024     ,   p_Drill_To_Form_Function    IN          VARCHAR2   :=  NULL
3025     ,   p_Restrict_Dim_Validate     IN          VARCHAR2   := NULL
3026     ,   p_Hide                      IN          VARCHAR2   :=  FND_API.G_FALSE
3027     ,   x_return_status             OUT NOCOPY  VARCHAR2
3028     ,   x_msg_count                 OUT NOCOPY  NUMBER
3029     ,   x_msg_data                  OUT NOCOPY  VARCHAR2
3030 ) IS
3031     l_dim_level_id          BSC_SYS_DIM_LEVELS_BY_GROUP.dim_level_id%TYPE;
3032     l_unas_dim_short_names  VARCHAR2(32000);
3033 
3034 
3035     CURSOR  cr_bsc_dim_obj IS
3036     SELECT  dim_level_id
3037     FROM    BSC_SYS_DIM_LEVELS_B
3038     WHERE   short_name     = p_dim_obj_short_name;
3039 
3040     CURSOR  c_dimension_names IS
3041     SELECT  short_name
3042     FROM    BSC_SYS_DIM_GROUPS_VL
3043     WHERE   dim_group_id IN (SELECT dim_group_id
3044     FROM    BSC_SYS_DIM_LEVELS_BY_GROUP
3045     WHERE   dim_level_id = l_dim_level_id);
3046 
3047 BEGIN
3048     FND_MSG_PUB.Initialize;
3049     x_return_status := FND_API.G_RET_STS_SUCCESS;
3050 
3051     IF (p_dim_obj_short_name IS NULL) THEN
3052         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3053         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
3054         FND_MSG_PUB.ADD;
3055         RAISE FND_API.G_EXC_ERROR;
3056     END IF;
3057 
3058     IF (cr_bsc_dim_obj%ISOPEN) THEN
3059         CLOSE cr_bsc_dim_obj;
3060     END IF;
3061     OPEN    cr_bsc_dim_obj;
3062         FETCH   cr_bsc_dim_obj
3063         INTO    l_dim_level_id;
3064         IF (cr_bsc_dim_obj%ROWCOUNT = 0) THEN
3065             l_dim_level_id := -1;
3066         END IF;
3067     CLOSE cr_bsc_dim_obj;
3068     IF (l_dim_level_id = -1) THEN
3069         FND_MESSAGE.SET_NAME('BSC','BSC_MUSER_DELETE_MESSAGE');
3070         FND_MESSAGE.SET_TOKEN('TYPE', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECT'), TRUE);
3071         FND_MSG_PUB.ADD;
3072         RAISE FND_API.G_EXC_ERROR;
3073     END IF;
3074 
3075     FOR cd IN c_dimension_names LOOP
3076         IF (l_unas_dim_short_names IS NULL) THEN
3077             l_unas_dim_short_names  :=  cd.short_name;
3078         ELSE
3079             l_unas_dim_short_names  :=  l_unas_dim_short_names||', '||cd.short_name;
3080         END IF;
3081     END LOOP;
3082     BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object
3083     (       p_commit                    =>  FND_API.G_FALSE
3084         ,   p_dim_obj_short_name        =>  p_dim_obj_short_name
3085         ,   p_display_name              =>  p_display_name
3086         ,   p_application_id            =>  p_application_id
3087         ,   p_description               =>  p_description
3088         ,   p_data_source               =>  p_data_source
3089         ,   p_source_table              =>  p_source_table
3090         ,   p_where_clause              =>  p_where_clause
3091         ,   p_comparison_label_code     =>  p_comparison_label_code
3092         ,   p_table_column              =>  p_table_column
3093         ,   p_source_type               =>  p_source_type
3094         ,   p_maximum_code_size         =>  p_maximum_code_size
3095         ,   p_maximum_name_size         =>  p_maximum_name_size
3096         ,   p_all_item_text             =>  p_all_item_text
3097         ,   p_comparison_item_text      =>  p_comparison_item_text
3098         ,   p_prototype_default_value   =>  p_prototype_default_value
3099         ,   p_dimension_values_order    =>  p_dimension_values_order
3100         ,   p_comparison_order          =>  p_comparison_order
3101         ,   p_assign_dim_short_names    =>  p_assign_dim_short_names
3102         ,   p_unassign_dim_short_names  =>  l_unas_dim_short_names
3103         ,   p_time_stamp                =>  p_time_stamp        -- Granular Locking
3104         ,   p_Master_Level              =>  p_Master_Level
3105         ,   p_Long_Lov                  =>  p_Long_Lov
3106         ,   p_Search_Function           =>  p_Search_Function
3107         ,   p_Dim_Obj_Enabled           =>  p_Dim_Obj_Enabled
3108         ,   p_View_Object_Name          =>  p_View_Object_Name
3109         ,   p_Default_Values_Api        =>  p_Default_Values_Api
3110         ,   p_All_Enabled               =>  p_All_Enabled
3111         ,   p_Drill_To_Form_Function    =>  p_Drill_To_Form_Function
3112         ,   p_Restrict_Dim_Validate     =>  p_Restrict_Dim_Validate
3113         ,   p_Hide                      =>  p_Hide
3114         ,   x_return_status             =>  x_return_status
3115         ,   x_msg_count                 =>  x_msg_count
3116         ,   x_msg_data                  =>  x_msg_data
3117     );
3118     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3119         RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
3120     END IF;
3121     /********************************************************
3122                 Check no of independent dimension objects in dimension set
3123     ********************************************************/
3124 
3125     check_indp_dimobjs
3126     (
3127             p_dim_id                    =>  l_dim_level_id
3128         ,   x_return_status             =>  x_return_status
3129         ,   x_msg_count                 =>  x_msg_count
3130         ,   x_msg_data                  =>  x_msg_data
3131     );
3132     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3133         RAISE   FND_API.G_EXC_UNEXPECTED_ERROR;
3134     END IF;
3135   /********************************************************/
3136     IF (p_commit = FND_API.G_TRUE) THEN
3137         COMMIT;
3138     END IF;
3139     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
3140 EXCEPTION
3141     WHEN FND_API.G_EXC_ERROR THEN
3142         IF (cr_bsc_dim_obj%ISOPEN) THEN
3143             CLOSE cr_bsc_dim_obj;
3144         END IF;
3145         IF (x_msg_data IS NULL) THEN
3146             FND_MSG_PUB.Count_And_Get
3147             (      p_encoded   =>  FND_API.G_FALSE
3148                ,   p_count     =>  x_msg_count
3149                ,   p_data      =>  x_msg_data
3150             );
3151         END IF;
3152         x_return_status :=  FND_API.G_RET_STS_ERROR;
3153     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3154         IF (cr_bsc_dim_obj%ISOPEN) THEN
3155             CLOSE cr_bsc_dim_obj;
3156         END IF;
3157         IF (x_msg_data IS NULL) THEN
3158             FND_MSG_PUB.Count_And_Get
3159             (      p_encoded   =>  FND_API.G_FALSE
3160                ,   p_count     =>  x_msg_count
3161                ,   p_data      =>  x_msg_data
3162             );
3163         END IF;
3164         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3165     WHEN NO_DATA_FOUND THEN
3166         IF (cr_bsc_dim_obj%ISOPEN) THEN
3167             CLOSE cr_bsc_dim_obj;
3168         END IF;
3169         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3170         IF (x_msg_data IS NOT NULL) THEN
3171             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
3172         ELSE
3173             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
3174         END IF;
3175     WHEN OTHERS THEN
3176         IF (cr_bsc_dim_obj%ISOPEN) THEN
3177             CLOSE cr_bsc_dim_obj;
3178         END IF;
3179         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3180         IF (x_msg_data IS NOT NULL) THEN
3181             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
3182         ELSE
3183             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
3184         END IF;
3185 END Update_Dim_Object;
3186 
3187 /*********************************************************************************
3188                             DELETE DIMENSION
3189 *********************************************************************************/
3190 /*
3191     This procedure allows user to delete a dimension. Respective records will be
3192     deleted from the following metadata: -
3193         1  BIS_LEVELS.
3194         2. BIS_LEVELS_TL
3195         3. BSC_SYS_DIM_LEVELS_B
3196         4. BSC_SYS_DIM_LEVELS_TL
3197 
3198     Validations:
3199         1. dimension must not be associated with any group.
3200 */
3201 PROCEDURE Delete_Dim_Object
3202 (       p_commit                IN              VARCHAR2   := FND_API.G_TRUE
3203     ,   p_dim_obj_short_name    IN              VARCHAR2
3204     ,   x_return_status         OUT    NOCOPY   VARCHAR2
3205     ,   x_msg_count             OUT    NOCOPY   NUMBER
3206     ,   x_msg_data              OUT    NOCOPY   VARCHAR2
3207 ) IS
3208     l_bsc_dimension_rec     BSC_DIMENSION_GROUPS_PUB.Bsc_Dim_Group_Rec_Type;
3209     l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
3210     l_bis_dim_level_rec     BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
3211     l_error_tbl             BIS_UTILITIES_PUB.Error_Tbl_Type;
3212     l_count                 NUMBER;
3213     l_dim_short_name        VARCHAR2(30);
3214     l_regions               VARCHAR2(2000);
3215     l_is_denorm_deleted     VARCHAR(1);
3216     l_delete_count          NUMBER := 0;
3217     l_Sql                   VARCHAR2(8000);
3218 
3219     CURSOR  c_bsc_levels IS
3220     SELECT  dim_level_id
3221           , source
3222           , name
3223     FROM    BSC_SYS_DIM_LEVELS_VL
3224     WHERE   short_name = p_dim_obj_short_name;
3225 BEGIN
3226     FND_MSG_PUB.Initialize;
3227     x_return_status := FND_API.G_RET_STS_SUCCESS;
3228     SAVEPOINT DeleteBSCDimObjectPMD;
3229 
3230     IF (p_dim_obj_short_name IS NULL) THEN
3231         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3232         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
3233         FND_MSG_PUB.ADD;
3234         RAISE FND_API.G_EXC_ERROR;
3235     END IF;
3236     -- CALL PMF'S API
3237     --check if short_name exists in the PMF system
3238     SELECT  COUNT(1) INTO l_count FROM BIS_LEVELS
3239     WHERE   short_name  =   p_dim_obj_short_name;
3240     IF (l_count <> 0) THEN
3241         l_bis_dim_level_rec.Dimension_Level_Short_Name    :=  p_dim_obj_short_name;
3242         SELECT COUNT(1) INTO l_Count
3243         FROM   BIS_LEVELS
3244         WHERE  Master_Level = l_bis_dim_level_rec.Dimension_Level_Short_Name;
3245         IF (l_Count <> 0) THEN
3246             FND_MESSAGE.SET_NAME('BIS','BIS_MASTER_DELETE_DIM_OBJ');
3247             FND_MSG_PUB.ADD;
3248             RAISE FND_API.G_EXC_ERROR;
3249         END IF;
3250         BIS_DIMENSION_LEVEL_PUB.Delete_Dimension_Level
3251         (       p_commit                =>  FND_API.G_FALSE
3252             ,   p_validation_level      =>  FND_API.G_VALID_LEVEL_FULL
3253             ,   p_Dimension_Level_Rec   =>  l_bis_dim_level_rec
3254             ,   x_return_status         =>  x_return_status
3255             ,   x_error_Tbl             =>  l_error_tbl
3256         );
3257         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3258             IF (l_error_tbl.COUNT > 0) THEN
3259                 x_msg_data  :=  l_error_tbl(l_error_tbl.COUNT).Error_Description;
3260                 IF(INSTR(x_msg_data, ' ')  =  0 ) THEN
3261                     FND_MESSAGE.SET_NAME('BIS',x_msg_data);
3262                     FND_MSG_PUB.ADD;
3263                     x_msg_data  :=  NULL;
3264                 END IF;
3265                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3266             END IF;
3267             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3268         END IF;
3269         l_delete_count  :=  l_delete_count + 1;
3270     END IF;
3271 
3272     --check if short_name exists in the BSC system
3273     IF (c_bsc_levels%ISOPEN) THEN
3274         CLOSE c_bsc_levels;
3275     END IF;
3276     OPEN    c_bsc_levels;
3277         FETCH   c_bsc_levels
3278         INTO    l_bsc_dim_obj_rec.Bsc_Level_Id
3279              ,  l_bsc_dim_obj_rec.Bsc_Source
3280              ,  l_bsc_dim_obj_rec.Bsc_Dim_Level_Long_Name;
3281     CLOSE c_bsc_levels;
3282     IF (l_bsc_dim_obj_rec.Bsc_Level_Id IS NOT NULL) THEN
3283         -- Granular Locking START
3284         BSC_BIS_LOCKS_PUB.Lock_Dim_Level
3285         (     p_dim_level_id       => l_bsc_dim_obj_rec.Bsc_Level_Id
3286              ,p_time_stamp         => NULL       -- Granular Locking
3287              ,x_return_status      => x_return_status
3288              ,x_msg_count          => x_msg_count
3289              ,x_msg_data            => x_msg_data
3290         ) ;
3291         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3292             RAISE           FND_API.G_EXC_UNEXPECTED_ERROR;
3293         END IF;
3294         -- Granular Locking END
3295         BSC_BIS_DIM_OBJ_PUB.validateBscDimensionToDelete
3296         (       p_dim_obj_short_name    =>  p_dim_obj_short_name
3297             ,   x_return_status         =>  x_return_status
3298             ,   x_msg_count             =>  x_msg_count
3299             ,   x_msg_data              =>  x_msg_data
3300         );
3301         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3302            RAISE           FND_API.G_EXC_ERROR;
3303         END IF;
3304         IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
3305             BSC_DESIGNER_PVT.Dim_Object_Change(l_bsc_dim_obj_rec.Bsc_Level_Id);
3306         END IF;
3307         --remove association with unassigned Dimension if exists
3308         l_bsc_dimension_rec.Bsc_Dim_Level_Group_Short_Name  := BSC_BIS_DIMENSION_PUB.Unassigned_Dim;
3309         l_bsc_dimension_rec.Bsc_Level_Id                    := l_bsc_dim_obj_rec.Bsc_Level_Id;
3310         BSC_DIMENSION_GROUPS_PUB.Delete_Dim_Levels_In_Group
3311         (       p_commit            =>  FND_API.G_FALSE
3312             ,   p_Dim_Grp_Rec       =>  l_bsc_dimension_rec
3313             ,   x_return_status     =>  x_return_status
3314             ,   x_msg_count         =>  x_msg_count
3315             ,   x_msg_data          =>  x_msg_data
3316         );
3317         IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3318             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3319         END IF;
3320         --CALL BSC API
3321         BSC_DIMENSION_LEVELS_PUB.Delete_Dim_Level
3322         (       p_commit            =>  FND_API.G_FALSE
3323              ,  p_Dim_Level_Rec     =>  l_bsc_dim_obj_rec
3324              ,  x_return_status     =>  x_return_status
3325              ,  x_msg_count         =>  x_msg_count
3326              ,  x_msg_data          =>  x_msg_data
3327         );
3328         IF ((x_return_status  =  FND_API.G_RET_STS_ERROR)  OR (x_return_status  =  FND_API.G_RET_STS_UNEXP_ERROR)) THEN
3329             RAISE            FND_API.G_EXC_UNEXPECTED_ERROR;
3330         END IF;
3331         /*************************************************************
3332           List Button validation.For a list button the condition is that
3333           all the dimesnion sets within the tab (irrespective of whether they are
3334           in the same KPI or different KPIs) the dimesnion objects should be the same
3335           So while deleting the dimension object validate if it is being used in
3336           the tabs.Validate_List_Button takes care of this.
3337      /************************************************************/
3338         IF (l_bsc_dim_obj_rec.Bsc_Source = 'BSC') THEN
3339             BSC_COMMON_DIM_LEVELS_PUB.Validate_List_Button
3340             (
3341                 p_Kpi_Id         =>  NULL
3342               , p_Dim_Level_Id   =>  l_bsc_dim_obj_rec.Bsc_Level_Id
3343               , x_return_status  =>  x_return_status
3344               , x_msg_count      =>  x_msg_count
3345               , x_msg_data       =>  x_msg_data
3346             );
3347 
3348             IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3349               RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3350             END IF;
3351         END IF;
3352         l_delete_count  :=  l_delete_count + 1;
3353         /****************************************************
3354         BSC_PMA_APIS_PUB.sync_dimension_table Should be called only when
3355         BSC53 is installed.So first we are checking if BSC53 is installed on the
3356         environment.Since this file is the part of MD/DD ARU we have made the call to
3357         the PL/SQL procedure "BSC_PMA_APIS_PUB.sync_dimension_table" dynamic so that
3358         the package gets complied on the pure BIS409 enviornments.
3359         /****************************************************/
3360         IF(BIS_UTILITIES_PUB.Enable_Generated_Source_Report = FND_API.G_TRUE) THEN
3361             l_is_denorm_deleted := FND_API.G_TRUE;
3362             BEGIN
3363                 l_Sql := 'BEGIN IF(BSC_PMA_APIS_PUB.sync_dimension_table (:2,:3,:4)) THEN :1 :=FND_API.G_TRUE; ELSE :1:=FND_API.G_FALSE; END IF;END;';
3364                 EXECUTE IMMEDIATE l_Sql USING IN p_dim_obj_short_name,IN BIS_UTIL.G_DROP_TABLE,OUT x_msg_data,OUT l_is_denorm_deleted;
3365             EXCEPTION
3366               WHEN OTHERS THEN
3367                NULL;
3368             END;
3369             IF(l_is_denorm_deleted=FND_API.G_FALSE) THEN
3370               RAISE FND_API.G_EXC_ERROR;
3371             END IF;
3372         END IF;
3373     END IF;
3374     IF (l_delete_count  = 0) THEN
3375         FND_MESSAGE.SET_NAME('BSC','BSC_MUSER_DELETE_MESSAGE');
3376         FND_MESSAGE.SET_TOKEN('TYPE', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECT'), TRUE);
3377         FND_MSG_PUB.ADD;
3378         RAISE FND_API.G_EXC_ERROR;
3379     END IF;
3380     IF (p_commit = FND_API.G_TRUE) THEN
3381         COMMIT;
3382     END IF;
3383     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
3384 
3385 EXCEPTION
3386     WHEN FND_API.G_EXC_ERROR THEN
3387         IF (c_bsc_levels%ISOPEN) THEN
3388             CLOSE c_bsc_levels;
3389         END IF;
3390         ROLLBACK TO DeleteBSCDimObjectPMD;
3391         IF (x_msg_data IS NULL) THEN
3392             FND_MSG_PUB.Count_And_Get
3393             (      p_encoded   =>  FND_API.G_FALSE
3394                ,   p_count     =>  x_msg_count
3395                ,   p_data      =>  x_msg_data
3396             );
3397         END IF;
3398         x_return_status :=  FND_API.G_RET_STS_ERROR;
3399     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3400         IF (c_bsc_levels%ISOPEN) THEN
3401             CLOSE c_bsc_levels;
3402         END IF;
3403         ROLLBACK TO DeleteBSCDimObjectPMD;
3404         IF (x_msg_data IS NULL) THEN
3405             FND_MSG_PUB.Count_And_Get
3406             (      p_encoded   =>  FND_API.G_FALSE
3407                ,   p_count     =>  x_msg_count
3408                ,   p_data      =>  x_msg_data
3409             );
3410         END IF;
3411         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3412     WHEN NO_DATA_FOUND THEN
3413         IF (c_bsc_levels%ISOPEN) THEN
3414             CLOSE c_bsc_levels;
3415         END IF;
3416         ROLLBACK TO DeleteBSCDimObjectPMD;
3417         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3418         IF (x_msg_data IS NOT NULL) THEN
3419             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Delete_Dim_Object ';
3420         ELSE
3421             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Delete_Dim_Object ';
3422         END IF;
3423     WHEN OTHERS THEN
3424         IF (c_bsc_levels%ISOPEN) THEN
3425             CLOSE c_bsc_levels;
3426         END IF;
3427         ROLLBACK TO DeleteBSCDimObjectPMD;
3428         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3429         IF (x_msg_data IS NOT NULL) THEN
3430             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Delete_Dim_Object ';
3431         ELSE
3432             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Delete_Dim_Object ';
3433         END IF;
3434 END Delete_Dim_Object;
3435 
3436 /*********************************************************************************
3437                             FUNCTION validateBscDimensionToDelete
3438 *********************************************************************************/
3439 PROCEDURE validateBscDimensionToDelete
3440 (       p_commit                IN              VARCHAR2   := FND_API.G_TRUE
3441     ,   p_dim_obj_short_name    IN              VARCHAR2
3442     ,   x_return_status         OUT     NOCOPY  VARCHAR2
3443     ,   x_msg_count             OUT     NOCOPY  NUMBER
3444     ,   x_msg_data              OUT     NOCOPY  VARCHAR2
3445 ) IS
3446     l_bsc_dim_id    BSC_SYS_DIM_LEVELS_B.dim_level_id%TYPE;
3447     l_name          BSC_SYS_DIM_LEVELS_TL.Name%TYPE;
3448     l_count         NUMBER;
3449     l_edw_flag      BSC_SYS_DIM_LEVELS_B.Edw_Flag%TYPE;
3450 
3451     l_dim_Group_id  BSC_SYS_DIM_GROUPS_TL.Dim_Group_Id%TYPE;
3452 BEGIN
3453     FND_MSG_PUB.Initialize;
3454     x_return_status := FND_API.G_RET_STS_SUCCESS;
3455 
3456     l_dim_Group_id  := BSC_BIS_DIMENSION_PUB.Get_Bsc_Dimension_ID(BSC_BIS_DIMENSION_PUB.Unassigned_Dim);
3457     IF (p_dim_obj_short_name IS NULL) THEN
3458         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3459         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
3460         FND_MSG_PUB.ADD;
3461         RAISE FND_API.G_EXC_ERROR;
3462     END IF;
3463 
3464     SELECT dim_level_id
3465          , name
3466     INTO   l_bsc_dim_id
3467          , l_name
3468     FROM   BSC_SYS_DIM_LEVELS_VL
3469     WHERE  short_name = p_dim_obj_short_name;
3470 
3471 
3472     -- CAN'T DELETE DIMENSION, validataion one.
3473     /*SELECT Edw_Flag INTO l_edw_flag
3474     FROM   BSC_SYS_DIM_LEVELS_B
3475     WHERE  dim_level_id = l_bsc_dim_id;
3476     IF (l_edw_flag <> 1) THEN
3477         --this message is hard coded because it needs more investigation if it is really required
3478         x_msg_data      := 'The dimension object can''t be deleted, since BSC_SYS_DIM_LEVELS_B.Edw_Flag <> 1';
3479         RAISE           FND_API.G_EXC_ERROR;
3480     END IF;*/
3481 
3482     --check if the dimension is associated with any group, if so raise an exception
3483     SELECT  COUNT(1) INTO l_count
3484     FROM    BSC_SYS_DIM_LEVELS_BY_GROUP
3485     WHERE   Dim_Level_Id  = l_bsc_dim_id
3486     AND     Dim_Group_Id <> l_dim_Group_id;
3487     IF (l_count > 0) THEN
3488         FND_MESSAGE.SET_NAME('BSC','BSC_NOT_DELETE_DIM_OBJ_GRPS');
3489         FND_MESSAGE.SET_TOKEN('SHORT_NAME', l_name);
3490         FND_MSG_PUB.ADD;
3491         RAISE FND_API.G_EXC_ERROR;
3492     END IF;
3493 
3494     --check if the dimension is associated in relationships, if so raise an exception
3495     SELECT  COUNT(1) INTO l_count
3496     FROM    BSC_SYS_DIM_LEVEL_RELS
3497     WHERE   dim_level_id         = l_bsc_dim_id
3498     OR      parent_dim_level_id  = l_bsc_dim_id;
3499     IF (l_count > 0) THEN
3500         FND_MESSAGE.SET_NAME('BSC','BSC_NOT_DELETE_DIM_OBJ_RELS');
3501         FND_MESSAGE.SET_TOKEN('SHORT_NAME', l_name);
3502         FND_MSG_PUB.ADD;
3503         RAISE FND_API.G_EXC_ERROR;
3504     END IF;
3505     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
3506 
3507 EXCEPTION
3508     WHEN FND_API.G_EXC_ERROR THEN
3509         IF (x_msg_data IS NULL) THEN
3510             FND_MSG_PUB.Count_And_Get
3511             (      p_encoded   =>  FND_API.G_FALSE
3512                ,   p_count     =>  x_msg_count
3513                ,   p_data      =>  x_msg_data
3514             );
3515         END IF;
3516         x_return_status :=  FND_API.G_RET_STS_ERROR;
3517     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3518         IF (x_msg_data IS NULL) THEN
3519             FND_MSG_PUB.Count_And_Get
3520             (      p_encoded   =>  FND_API.G_FALSE
3521                ,   p_count     =>  x_msg_count
3522                ,   p_data      =>  x_msg_data
3523             );
3524         END IF;
3525         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3526     WHEN NO_DATA_FOUND THEN
3527         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3528         IF (x_msg_data IS NOT NULL) THEN
3529             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.validateBscDimensionToDelete ';
3530         ELSE
3531             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.validateBscDimensionToDelete ';
3532         END IF;
3533     WHEN OTHERS THEN
3534         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3535         IF (x_msg_data IS NOT NULL) THEN
3536             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.validateBscDimensionToDelete ';
3537         ELSE
3538             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.validateBscDimensionToDelete ';
3539         END IF;
3540 END validateBscDimensionToDelete;
3541 /*********************************************************************************
3542                             FUNCTION GET DIMENSIONS
3543 *********************************************************************************/
3544 FUNCTION get_Dimensions
3545 (
3546     p_group_id  IN  NUMBER
3547 )RETURN VARCHAR2
3548 IS
3549     l_dimension_names   VARCHAR2(32000);
3550     l_name              BSC_SYS_DIM_LEVELS_VL.Name%TYPE;
3551 
3552     CURSOR  c_dimesnion_names IS
3553     SELECT  V.NAME
3554     FROM    BSC_SYS_DIM_LEVELS_VL       V,
3555             BSC_SYS_DIM_LEVELS_BY_GROUP B
3556     WHERE   V.DIM_LEVEL_ID  =   B.DIM_LEVEL_ID
3557     AND      B.DIM_GROUP_ID  =   p_group_id
3558     ORDER BY B.DIM_LEVEL_INDEX;
3559 BEGIN
3560 
3561     FOR cd IN c_dimesnion_names LOOP
3562         l_name :=   cd.name;
3563         IF (l_name IS NOT NULL)THEN
3564             IF (l_dimension_names IS NULL )THEN
3565                 l_dimension_names :=l_name;
3566             ELSE
3567                 l_dimension_names :=l_dimension_names ||', '|| l_name;
3568             END IF;
3569         END IF;
3570     END LOOP;
3571 
3572     RETURN l_dimension_names;
3573 EXCEPTION
3574     WHEN OTHERS THEN
3575         RETURN NULL;
3576 END get_Dimensions;
3577 
3578 FUNCTION get_Dimension_Objects
3579 (
3580    p_dim_short_name  IN  VARCHAR2
3581 ) RETURN VARCHAR2
3582 IS
3583     l_dimObjects_names      VARCHAR2(32000);
3584     l_name                  BSC_SYS_DIM_GROUPS_TL.NAME%TYPE;
3585 
3586     CURSOR c_dimension_obj_name IS
3587     SELECT A.name
3588     FROM   BSC_SYS_DIM_LEVELS_VL       A
3589          , BSC_SYS_DIM_LEVELS_BY_GROUP B
3590     WHERE  A.dim_level_id = B.dim_level_id
3591     AND    B.dim_group_id = (SELECT dim_group_id
3592                              FROM   BSC_SYS_DIM_GROUPS_VL
3593                              WHERE  Short_Name = p_dim_short_name);
3594 BEGIN
3595     FOR cd IN c_dimension_obj_name LOOP
3596         l_name := cd.name;
3597         IF (l_name IS NOT NULL) THEN
3598             IF (l_dimObjects_names IS NULL) THEN
3599                 l_dimObjects_names := l_name;
3600             ELSE
3601                 l_dimObjects_names := l_dimObjects_names ||', '|| l_name;
3602             END IF;
3603         END IF;
3604     END LOOP;
3605     RETURN l_dimObjects_names;
3606 EXCEPTION
3607     WHEN OTHERS THEN
3608         RETURN NULL;
3609 END get_Dimension_Objects;
3610 /********************************************************************************/
3611 FUNCTION Is_More
3612 (       p_dim_short_names IN  OUT NOCOPY  VARCHAR2
3613     ,   p_dim_name        OUT NOCOPY  VARCHAR2
3614 ) RETURN BOOLEAN
3615 IS
3616     l_pos_ids               NUMBER;
3617     l_pos_rel_types         NUMBER;
3618     l_pos_rel_columns       NUMBER;
3619 BEGIN
3620     IF (p_dim_short_names IS NOT NULL) THEN
3621         l_pos_ids           := INSTR(p_dim_short_names,   ',');
3622         IF (l_pos_ids > 0) THEN
3623             p_dim_name          :=  TRIM(SUBSTR(p_dim_short_names,    1,    l_pos_ids - 1));
3624             p_dim_short_names   :=  TRIM(SUBSTR(p_dim_short_names,    l_pos_ids + 1));
3625         ELSE
3626             p_dim_name          :=  TRIM(p_dim_short_names);
3627             p_dim_short_names   :=  NULL;
3628         END IF;
3629         RETURN TRUE;
3630     ELSE
3631         RETURN FALSE;
3632     END IF;
3633 END Is_More;
3634 /*******************************************************************************
3635                       FUNCTION TO INITIALIZE BSC RECORDS
3636 ********************************************************************************/
3637 FUNCTION Initialize_Bsc_Recs
3638 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
3639     ,   x_return_status         OUT NOCOPY  VARCHAR2
3640     ,   x_msg_count             OUT NOCOPY  NUMBER
3641     ,   x_msg_data              OUT NOCOPY  VARCHAR2
3642 )
3643 RETURN BOOLEAN IS
3644     l_flag          BOOLEAN         :=  TRUE;
3645     l_alias         VARCHAR(4);
3646     l_temp_var      VARCHAR(50);
3647     l_count         NUMBER          := 0;
3648     l_Bsc_Level_Name VARCHAR(33);
3649 BEGIN
3650     FND_MSG_PUB.Initialize;
3651     x_return_status := FND_API.G_RET_STS_SUCCESS;
3652 
3653     IF ((p_Dim_Level_Rec.Bsc_Source IS NULL) OR (p_Dim_Level_Rec.Bsc_Source <> 'BSC')) THEN
3654         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_DATA_SOURCE');
3655         FND_MSG_PUB.ADD;
3656         RAISE FND_API.G_EXC_ERROR;
3657     END IF;
3658     IF (p_Dim_Level_Rec.Bsc_Level_Id IS NULL) THEN
3659         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3660         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_ID'), TRUE);
3661         FND_MSG_PUB.ADD;
3662         RAISE FND_API.G_EXC_ERROR;
3663     END IF;
3664     IF (p_Dim_Level_Rec.Bsc_Level_Name IS NULL) THEN
3665         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3666         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
3667         FND_MSG_PUB.ADD;
3668         RAISE FND_API.G_EXC_ERROR;
3669     END IF;
3670     --Initialize 'l_Dim_Level_Rec' record with the default values
3671     IF (p_Dim_Level_Rec.Bsc_Level_User_Key_Size IS NULL) THEN
3672         p_Dim_Level_Rec.Bsc_Level_User_Key_Size     :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Default_Size;  --default size
3673     END IF;
3674     IF (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size IS NULL) THEN
3675         p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size     :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Default_Size; --default size
3676     END IF;
3677     IF (p_Dim_Level_Rec.Bsc_Level_Abbreviation IS NULL) THEN
3678         p_Dim_Level_Rec.Bsc_Level_Abbreviation      :=  SUBSTR(REPLACE(p_Dim_Level_Rec.Bsc_Level_Short_Name, ' ', ''), 1, 8);
3679     END IF;
3680     p_Dim_Level_Rec.Bsc_Level_Abbreviation          :=  UPPER(p_Dim_Level_Rec.Bsc_Level_Abbreviation);
3681     IF (NOT is_Valid_AlphaNum(p_Dim_Level_Rec.Bsc_Level_Abbreviation)) THEN
3682         FND_MESSAGE.SET_NAME('BSC','BSC_ALPHA_NUM_REQUIRED');
3683         FND_MESSAGE.SET_TOKEN('VALUE',  p_Dim_Level_Rec.Bsc_Level_Abbreviation);
3684         FND_MESSAGE.SET_TOKEN('NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'ABBREVIATION'), TRUE);
3685         FND_MSG_PUB.ADD;
3686         RAISE FND_API.G_EXC_ERROR;
3687     END IF;
3688     IF(INSTR(p_Dim_Level_Rec.Bsc_Level_Name, 'BSC_D_') = 1) THEN
3689         p_Dim_Level_Rec.Bsc_Level_Name   :=  SUBSTR(p_Dim_Level_Rec.Bsc_Level_Name, 7, LENGTH(p_Dim_Level_Rec.Bsc_Level_Name));
3690     END IF;
3691     l_Bsc_Level_Name  :=  'BSC_D_'||UPPER(p_Dim_Level_Rec.Bsc_Level_Name);
3692     IF(LENGTHB(l_Bsc_Level_Name) > 27) THEN
3693 
3694             FND_MESSAGE.SET_NAME('BSC','BSC_DIM_OBJ_TABLE_NAME');
3695             FND_MESSAGE.SET_TOKEN('TAB_NAME', l_Bsc_Level_Name);
3696             FND_MSG_PUB.ADD;
3697             RAISE FND_API.G_EXC_ERROR;
3698     END IF;
3699     IF (NOT is_Valid_Identifier(l_Bsc_Level_Name)) THEN
3700         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
3701         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
3702         FND_MESSAGE.SET_TOKEN('SQL_VALUE',l_Bsc_Level_Name);
3703         FND_MSG_PUB.ADD;
3704         RAISE FND_API.G_EXC_ERROR;
3705     END IF;
3706     SELECT COUNT(1) INTO l_count
3707     FROM   BSC_SYS_DIM_LEVELS_B
3708     WHERE  DIM_LEVEL_ID           <> p_Dim_Level_Rec.Bsc_Level_Id
3709     AND    LEVEL_TABLE_NAME = l_Bsc_Level_Name;
3710     IF (l_count <> 0) THEN
3711         FND_MESSAGE.SET_NAME('BSC','BSC_D_TABLE_NAME_EXIST');
3712         FND_MESSAGE.SET_TOKEN('TABLE_NAME', l_Bsc_Level_Name);
3713         FND_MSG_PUB.ADD;
3714         RAISE FND_API.G_EXC_ERROR;
3715     END IF;
3716     p_Dim_Level_Rec.Bsc_Level_Name :=l_Bsc_Level_Name;
3717 
3718     p_Dim_Level_Rec.Bsc_Level_View_Name   :=  'BSC_D_'||p_Dim_Level_Rec.Bsc_Level_Id||'_VL';
3719 
3720     p_Dim_Level_Rec.Bsc_Pk_Col := BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col
3721                                     (       p_Dim_Level_Rec  => p_Dim_Level_Rec
3722                                         ,   x_return_status  => x_return_status
3723                                         ,   x_msg_count      => x_msg_count
3724                                         ,   x_msg_data       => x_msg_data
3725                                     );
3726     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3727         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3728     END IF;
3729 
3730     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
3731 
3732     RETURN TRUE;
3733 EXCEPTION
3734     WHEN FND_API.G_EXC_ERROR THEN
3735         IF (x_msg_data IS NULL) THEN
3736             FND_MSG_PUB.Count_And_Get
3737             (      p_encoded   =>  FND_API.G_FALSE
3738                ,   p_count     =>  x_msg_count
3739                ,   p_data      =>  x_msg_data
3740             );
3741         END IF;
3742         x_return_status :=  FND_API.G_RET_STS_ERROR;
3743         RETURN FALSE;
3744     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3745         IF (x_msg_data IS NULL) THEN
3746             FND_MSG_PUB.Count_And_Get
3747             (      p_encoded   =>  FND_API.G_FALSE
3748                ,   p_count     =>  x_msg_count
3749                ,   p_data      =>  x_msg_data
3750             );
3751         END IF;
3752         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3753         RETURN FALSE;
3754     WHEN NO_DATA_FOUND THEN
3755         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3756         IF (x_msg_data IS NOT NULL) THEN
3757             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs ';
3758         ELSE
3759             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs ';
3760         END IF;
3761         RETURN FALSE;
3762     WHEN OTHERS THEN
3763         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3764         IF (x_msg_data IS NOT NULL) THEN
3765             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs ';
3766         ELSE
3767             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Initialize_Bsc_Recs ';
3768         END IF;
3769         RETURN FALSE;
3770 END Initialize_Bsc_Recs;
3771 
3772 /*******************************************************************************
3773                    FUNCTION TO INTIALIZE PMF DIMENSION RECORDS
3774 ********************************************************************************/
3775 FUNCTION Initialize_Pmf_Recs
3776 (       p_Dim_Level_Rec     IN  OUT   NOCOPY    BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
3777     ,   x_return_status         OUT   NOCOPY    VARCHAR2
3778     ,   x_msg_count             OUT   NOCOPY    NUMBER
3779     ,   x_msg_data              OUT   NOCOPY    VARCHAR2
3780 )
3781 RETURN BOOLEAN IS
3782     l_count                     NUMBER;
3783     l_sql                       VARCHAR2(32000);
3784     l_dimshortname              VARCHAR2(32000);--the size is copied from PMF code
3785     l_prefix                    VARCHAR2(32000)  := '%PK_KEY%';
3786     l_flag                      BOOLEAN         :=  TRUE;
3787     l_Recursive                 VARCHAR2(1);
3788 
3789     --meastmon Fix bug#3337923 Performance issue: remove UPPER from left part to allow use of indexes
3790     CURSOR  allTabCol1 IS
3791     SELECT  Column_Name
3792     FROM    ALL_TAB_COLUMNS
3793     WHERE   Table_Name  =    UPPER(p_Dim_Level_Rec.Bsc_Level_Name)
3794     AND     Column_Name LIKE l_prefix
3795     AND     Owner       =    BSC_APPS.get_user_schema('APPS');
3796 
3797     --meastmon Fix bug#3337923 Performance issue: remove UPPER from left part to allow use of indexes
3798     CURSOR  allTabCol2 IS
3799     SELECT  Column_Name
3800     FROM    ALL_TAB_COLUMNS
3801     WHERE   Table_Name = UPPER(p_Dim_Level_Rec.Bsc_Level_Name)
3802     AND    (Column_Name LIKE '%DESCRIPTION%'
3803              OR Column_Name LIKE '%NAME%'
3804                OR Column_Name LIKE '%PK')
3805     AND     ROWNUM < 2
3806     AND     Owner  = BSC_APPS.get_user_schema('APPS');
3807 
3808 BEGIN
3809     FND_MSG_PUB.Initialize;
3810     x_return_status := FND_API.G_RET_STS_SUCCESS;
3811     -- Check if underlying View or table exists.
3812 
3813     --Default values if view does not exists
3814     p_Dim_Level_Rec.Bsc_Level_Name_Column       :=  'VALUE';
3815     p_Dim_Level_Rec.Bsc_Level_Pk_Key            :=  'ID';
3816     --BSC_SYS_DIM_LEVELS_B.Level_Pk_Col should be short_name to keep it unique
3817     --p_Dim_Level_Rec.Bsc_Pk_Col                  :=   p_Dim_Level_Rec.Bsc_Level_Short_Name;
3818 
3819     --Comented for Bug#4758995
3820     --p_Dim_Level_Rec.Bsc_Pk_Col                  :=   REPLACE(p_Dim_Level_Rec.Bsc_Level_Short_Name ,' ', '_');
3821 
3822     IF ((p_Dim_Level_Rec.Bsc_Source IS NULL) OR (p_Dim_Level_Rec.Bsc_Source <> 'PMF')) THEN
3823         RAISE           FND_API.G_EXC_ERROR;
3824     END IF;
3825     IF (p_Dim_Level_Rec.Bsc_Level_Short_Name IS NULL) THEN
3826         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
3827         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
3828         FND_MSG_PUB.ADD;
3829         RAISE FND_API.G_EXC_ERROR;
3830     END IF;
3831     IF ((p_Dim_Level_Rec.Source IS NULL) OR ((p_Dim_Level_Rec.Source <> 'OLTP') AND (p_Dim_Level_Rec.Source <> 'EDW'))) THEN
3832         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SOURCE_TYPE');
3833         FND_MSG_PUB.ADD;
3834         RAISE FND_API.G_EXC_ERROR;
3835     END IF;
3836     --Initialize 'l_Dim_Level_Rec' record with the default values
3837     IF (p_Dim_Level_Rec.Bsc_Level_User_Key_Size IS NULL) THEN
3838         p_Dim_Level_Rec.Bsc_Level_User_Key_Size     :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Code_Default_Size;  --default size
3839     END IF;
3840     IF (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size IS NULL) THEN
3841         p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size     :=  BSC_BIS_DIM_OBJ_PUB.Dim_Obj_Name_Default_Size; --default size
3842     END IF;
3843     IF (p_Dim_Level_Rec.Bsc_Level_Abbreviation IS NULL) THEN
3844         IF (p_Dim_Level_Rec.Bsc_Level_Short_Name IS NULL) THEN
3845             RAISE           FND_API.G_EXC_ERROR;
3846         ELSE
3847             p_Dim_Level_Rec.Bsc_Level_Abbreviation  :=  SUBSTR(REPLACE(p_Dim_Level_Rec.Bsc_Level_Short_Name, ' ', ''), 1, 8);
3848         END IF;
3849     END IF;
3850 
3851     -- Added for Bug#4758995
3852     p_Dim_Level_Rec.Bsc_Pk_Col := BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col
3853                                     (       p_Dim_Level_Rec  => p_Dim_Level_Rec
3854                                         ,   x_return_status  => x_return_status
3855                                         ,   x_msg_count      => x_msg_count
3856                                         ,   x_msg_data       => x_msg_data
3857                                     );
3858     IF (x_return_status  <> FND_API.G_RET_STS_SUCCESS) THEN
3859         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3860     END IF;
3861 
3862 
3863     IF (p_Dim_Level_Rec.Source = 'OLTP') THEN
3864         IF ((p_Dim_Level_Rec.Bsc_Level_Name IS NOT NULL)) THEN
3865             -- Bug 3751932 -- AND (NOT BSC_UTILITY.is_Table_View_Exists(p_Dim_Level_Rec.Bsc_Level_Name))) THEN
3866             p_Dim_Level_Rec.Bsc_Level_Name_Column       :=  'VALUE';
3867             p_Dim_Level_Rec.Bsc_Level_Pk_Key            :=  'ID';
3868         ELSE
3869             l_flag  := FALSE;
3870         END IF;
3871     ELSE -- IF EDW THEN
3872         IF (BSC_UTILITY.is_Table_View_Exists(p_Dim_Level_Rec.Bsc_Level_Name)) THEN
3873             p_Dim_Level_Rec.Bsc_Level_Name_Column   :=  'VALUE';
3874             p_Dim_Level_Rec.Bsc_Level_Pk_Key        :=  'ID';
3875         ELSIF (NOT BSC_UTILITY.is_Table_View_Exists(p_Dim_Level_Rec.Bsc_Level_Short_Name||'_LTC')) THEN
3876             IF (NOT BSC_UTILITY.is_Table_View_Exists(p_Dim_Level_Rec.Bsc_Level_Short_Name)) THEN
3877                 l_prefix := '%PK_KEY%';
3878             ELSE
3879                 p_Dim_Level_Rec.Bsc_Level_Name     :=  p_Dim_Level_Rec.Bsc_Level_Short_Name;
3880                 IF (allTabCol1%ISOPEN) THEN
3881                     CLOSE allTabCol1;
3882                 END IF;
3883                 OPEN allTabCol1;
3884                     FETCH allTabCol1 INTO p_Dim_Level_Rec.Bsc_Level_Pk_Key;
3885                 CLOSE allTabCol1;
3886                 IF (allTabCol2%ISOPEN) THEN
3887                     CLOSE allTabCol2;
3888                 END IF;
3889                 OPEN allTabCol2;
3890                     FETCH allTabCol2 INTO p_Dim_Level_Rec.Bsc_Level_Name_Column;
3891                 CLOSE allTabCol2;
3892             END IF;
3893         ELSE
3894             p_Dim_Level_Rec.Bsc_Level_Name     :=  p_Dim_Level_Rec.Bsc_Level_Short_Name||'_LTC';
3895             IF (allTabCol1%ISOPEN) THEN
3896                 CLOSE allTabCol1;
3897             END IF;
3898             OPEN allTabCol1;
3899                 FETCH allTabCol1 INTO p_Dim_Level_Rec.Bsc_Level_Pk_Key;
3900             CLOSE allTabCol1;
3901 
3902             IF (allTabCol2%ISOPEN) THEN
3903                 CLOSE allTabCol2;
3904             END IF;
3905             OPEN allTabCol2;
3906                 FETCH allTabCol2 INTO p_Dim_Level_Rec.Bsc_Level_Name_Column;
3907             CLOSE allTabCol2;
3908         END IF;
3909     END IF;
3910     --p_Dim_Level_Rec.Bsc_Level_View_Name will be NULL only in Create Case
3911     IF (p_Dim_Level_Rec.Bsc_Level_View_Name  IS NULL) THEN
3912         p_Dim_Level_Rec.Bsc_Level_View_Name   :=  bsc_utility.get_valid_bsc_master_tbl_name(p_Dim_Level_Rec.Bsc_Level_Short_Name);
3913     END IF;
3914     IF (NOT is_Valid_Identifier(p_Dim_Level_Rec.Bsc_Level_View_Name)) THEN
3915         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
3916         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'), TRUE);
3917         FND_MESSAGE.SET_TOKEN('SQL_VALUE', p_Dim_Level_Rec.Bsc_Level_View_Name);
3918         FND_MSG_PUB.ADD;
3919         RAISE FND_API.G_EXC_ERROR;
3920     END IF;
3921 
3922     SELECT COUNT(1) INTO l_count
3923     FROM   BSC_SYS_DIM_LEVELS_B
3924     WHERE  DIM_LEVEL_ID           <> p_Dim_Level_Rec.Bsc_Level_Id
3925     AND    UPPER(LEVEL_TABLE_NAME) = p_Dim_Level_Rec.Bsc_Level_View_Name;
3926     IF (l_count <> 0) THEN
3927         FND_MESSAGE.SET_NAME('BSC','BSC_D_TABLE_NAME_EXIST');
3928         FND_MESSAGE.SET_TOKEN('TABLE_NAME', p_Dim_Level_Rec.Bsc_Level_View_Name);
3929         FND_MSG_PUB.ADD;
3930         RAISE FND_API.G_EXC_ERROR;
3931     END IF;
3932 
3933     RETURN TRUE;
3934 EXCEPTION
3935     WHEN FND_API.G_EXC_ERROR THEN
3936         IF (allTabCol1%ISOPEN) THEN
3937             CLOSE allTabCol1;
3938         END IF;
3939         IF (allTabCol2%ISOPEN) THEN
3940             CLOSE allTabCol2;
3941         END IF;
3942         IF (x_msg_data IS NULL) THEN
3943             FND_MSG_PUB.Count_And_Get
3944             (      p_encoded   =>  FND_API.G_FALSE
3945                ,   p_count     =>  x_msg_count
3946                ,   p_data      =>  x_msg_data
3947             );
3948         END IF;
3949         x_return_status :=  FND_API.G_RET_STS_ERROR;
3950         RETURN FALSE;
3951     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3952         IF (allTabCol1%ISOPEN) THEN
3953             CLOSE allTabCol1;
3954         END IF;
3955         IF (allTabCol2%ISOPEN) THEN
3956             CLOSE allTabCol2;
3957         END IF;
3958         IF (x_msg_data IS NULL) THEN
3959             FND_MSG_PUB.Count_And_Get
3960             (      p_encoded   =>  FND_API.G_FALSE
3961                ,   p_count     =>  x_msg_count
3962                ,   p_data      =>  x_msg_data
3963             );
3964         END IF;
3965         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3966         RETURN FALSE;
3967     WHEN NO_DATA_FOUND THEN
3968         IF (allTabCol1%ISOPEN) THEN
3969             CLOSE allTabCol1;
3970         END IF;
3971         IF (allTabCol2%ISOPEN) THEN
3972             CLOSE allTabCol2;
3973         END IF;
3974         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3975         IF (x_msg_data IS NOT NULL) THEN
3976             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs ';
3977         ELSE
3978             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs ';
3979         END IF;
3980         RETURN FALSE;
3981     WHEN OTHERS THEN
3982         IF (allTabCol1%ISOPEN) THEN
3983             CLOSE allTabCol1;
3984         END IF;
3985         IF (allTabCol2%ISOPEN) THEN
3986             CLOSE allTabCol2;
3987         END IF;
3988         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3989         IF (x_msg_data IS NOT NULL) THEN
3990             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs ';
3991         ELSE
3992             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs ';
3993         END IF;
3994         RETURN FALSE;
3995 END Initialize_Pmf_Recs;
3996 
3997 
3998 /* ---------------------------------------------------
3999    This procedure check if the End to End KPI is anabled
4000    in the database
4001    This return:
4002      'Y'     End to End KPI enabled in this environment
4003      'N'     End to End KPI disabled in this environment
4004 ----------------------------------------------------------*/
4005 FUNCTION Check_END_TO_END_KPI_FLAG RETURN VARCHAR2
4006  IS
4007   cursor c_End_to_ent_kpi_flag IS
4008   SELECT property_value
4009   FROM bsc_sys_init
4010   WHERE property_code = 'TEMP_END_KPI';
4011   l_END_TO_END_KPI_FLAG VARCHAR2(1);
4012 
4013 BEGIN
4014 /*      *********  Please READ before chage this code **********
4015         About Check_END_TO_END_KPI_FLAG
4016         This is a temporary validation to support environments with
4017         end to end kpis internaly. A separate ARU will create a variable in
4018         bsc_sys_init to anable this procedure to create the views to support
4019         end to end kpis.  See login in Check_END_TO_END_KPI_FLAG.
4020 
4021         When End to end kpis be released We must to removed this validation and
4022         comment the old view defenition and force bscup.sql changing its version
4023         to force the system to updated the pmf view.
4024       *********  Please READ: **********  */
4025 
4026  l_END_TO_END_KPI_FLAG := 'N';
4027  for cd in c_End_to_ent_kpi_flag loop
4028     if cd.property_value = 'Y' then
4029         l_END_TO_END_KPI_FLAG :=  'Y';
4030     end if;
4031  end loop;
4032  RETURN l_END_TO_END_KPI_FLAG;
4033 
4034 EXCEPTION
4035     WHEN OTHERS THEN
4036     RETURN 'N';
4037 
4038 END Check_END_TO_END_KPI_FLAG;
4039 
4040 /*******************************************************************************
4041                       FUNCTION TO CREATE PMF DIMENSION-OBJ VIEWS
4042 ********************************************************************************/
4043 
4044 FUNCTION Create_Pmf_Views
4045 (       p_Dim_Level_Rec     IN  OUT   NOCOPY    BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4046     ,   x_return_status         OUT   NOCOPY    VARCHAR2
4047     ,   x_msg_count             OUT   NOCOPY    NUMBER
4048     ,   x_msg_data              OUT   NOCOPY    VARCHAR2
4049 )
4050 RETURN BOOLEAN IS
4051     l_sql   VARCHAR2(32000);
4052     l_count NUMBER;
4053     l_Rel_Select1 VARCHAR2(1000);
4054     l_Rel_Select2 VARCHAR2(1000);
4055     l_Rel_Where   VARCHAR2(1000);
4056     l_Recursive   VARCHAR2(1);
4057 
4058     CURSOR  c_par_dim_ids IS
4059      SELECT
4060        b.relation_col AS rel_col,
4061        (SELECT level_pk_col
4062         FROM bsc_sys_dim_levels_b
4063         WHERE dim_level_id =b.parent_dim_level_id) AS pk_col
4064      FROM
4065        bsc_sys_dim_level_rels_v b
4066      WHERE
4067        b.dim_level_id= p_Dim_Level_Rec.Bsc_Level_Id;
4068 BEGIN
4069     FND_MSG_PUB.Initialize;
4070     x_return_status := FND_API.G_RET_STS_SUCCESS;
4071     SAVEPOINT CreateBSCPmfViewPMD;
4072 
4073     BSC_APPS.Init_Bsc_Apps;
4074     IF ((p_Dim_Level_Rec.Bsc_Source IS NULL) OR (p_Dim_Level_Rec.Bsc_Source <> 'PMF')) THEN
4075         RAISE           FND_API.G_EXC_ERROR;
4076     END IF;
4077     IF (p_Dim_Level_Rec.Bsc_Level_Short_Name IS NULL) THEN
4078         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4079         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_SHORT_NAME'), TRUE);
4080         FND_MSG_PUB.ADD;
4081         RAISE FND_API.G_EXC_ERROR;
4082     END IF;
4083     IF (p_Dim_Level_Rec.Bsc_Level_Pk_Key IS NULL) THEN
4084         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4085         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_PK_COL'), TRUE);
4086         FND_MSG_PUB.ADD;
4087         RAISE FND_API.G_EXC_ERROR;
4088     END IF;
4089     IF (p_Dim_Level_Rec.Bsc_Level_Name_Column IS NULL) THEN
4090         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4091         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_COL'), TRUE);
4092         FND_MSG_PUB.ADD;
4093         RAISE FND_API.G_EXC_ERROR;
4094     END IF;
4095     IF (p_Dim_Level_Rec.Bsc_Level_View_Name IS NULL) THEN
4096         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4097         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'), TRUE);
4098         FND_MSG_PUB.ADD;
4099         RAISE FND_API.G_EXC_ERROR;
4100     END IF;
4101     IF ((p_Dim_Level_Rec.Bsc_Level_Name IS NOT NULL) AND (is_Valid_Identifier(p_Dim_Level_Rec.Bsc_Level_Name))) THEN
4102 
4103        /**********  Please READ before chage this code **********
4104         About Check_END_TO_END_KPI_FLAG
4105         This is a temporary validation to support environments with
4106         end to end kpis internaly. A separate ARU will create a variable in
4107         bsc_sys_init to anable this procedure to create the views to support
4108         end to end kpis.  See login in Check_END_TO_END_KPI_FLAG.
4109         *********  Please READ: **********  */
4110 
4111         -- Modified for Zero Code issue for MVs for Bug#3739872
4112         -- added if condition enableVarchar2Implementation for Bug#3836170
4113         IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.enableVarchar2Implementation = FND_API.G_TRUE) THEN
4114            -- This defenition is to  support KPI END TO END
4115 
4116          FOR par_rec IN c_par_dim_ids LOOP
4117            l_Rel_Select1 := l_Rel_Select1 || ',' || par_rec.pk_col || ',' || par_rec.pk_col || '_USR';
4118            l_Rel_Select2 := l_Rel_Select2 || ','
4119                                || 'DECODE( ' || 'TO_CHAR(' || par_rec.rel_col || ') ' || ', '
4120                                              || 'TO_CHAR(' || BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_VIEW_ZCODE || ') ' || ', '
4121                                              || 'TO_CHAR(' || BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_VIEW_ZCODE_ALIAS || ') ' || ', '
4122                                              || 'TO_CHAR(' || par_rec.rel_col || ')) '
4123                                || ', ' ||' TO_CHAR('|| par_rec.rel_col || ') ';
4124 
4125          END LOOP;
4126 
4127          l_sql   :=  ' CREATE OR REPLACE VIEW ' || p_Dim_Level_Rec.Bsc_Level_View_Name ||
4128                         ' (CODE, USER_CODE, NAME' || l_Rel_Select1 || ') ' ||
4129                         ' AS SELECT DISTINCT ' ||
4130                         ' DECODE( ' || 'TO_CHAR(' || p_Dim_Level_Rec.Bsc_Level_Pk_Key       || ') ' || ', '
4131                                     || 'TO_CHAR(' || BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_VIEW_ZCODE || ') ' || ', '
4132                                     || 'TO_CHAR(' || BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_VIEW_ZCODE_ALIAS || ') ' || ', '
4133                                     || 'TO_CHAR(' || p_Dim_Level_Rec.Bsc_Level_Pk_Key       || ')) ' || ', ' ||
4134                           'TO_CHAR(' || p_Dim_Level_Rec.Bsc_Level_Pk_Key || ') ' || ', ' ||
4135                           p_Dim_Level_Rec.Bsc_Level_Name_Column || l_Rel_Select2 ||
4136                         ' FROM ' || p_Dim_Level_Rec.Bsc_Level_Name;
4137         ELSE
4138             --this is old view defenition, as in 11i.BSC.G
4139             l_sql   :=  ' CREATE OR REPLACE VIEW ' || p_Dim_Level_Rec.Bsc_Level_View_Name || '(' ||
4140                         ' CODE, USER_CODE, NAME) ' ||
4141                         ' AS SELECT ROWNUM, ROWNUM, A.' || p_Dim_Level_Rec.Bsc_Level_Name_Column ||
4142                         ' FROM (SELECT DISTINCT ' ||
4143                           p_Dim_Level_Rec.Bsc_Level_Name_Column ||
4144                         ' FROM ' || p_Dim_Level_Rec.Bsc_Level_Name ||
4145                         ' WHERE UPPER(' || p_Dim_Level_Rec.Bsc_Level_Name_Column || ') NOT LIKE ''UNASSIGNED%''' ||
4146                         ' AND UPPER(' || p_Dim_Level_Rec.Bsc_Level_Name_Column || ') NOT LIKE ''INVALID%''' ||
4147                         ' AND ROWNUM < 26) A';
4148         END IF;
4149 
4150         BEGIN
4151             --update Table_Type  =  1, which is a indication of view exists
4152             UPDATE BSC_SYS_DIM_LEVELS_B
4153             SET    Table_Type  =  1
4154             WHERE  Short_Name  =  p_Dim_Level_Rec.Bsc_Level_Short_Name;
4155 
4156             BSC_APPS.Do_Ddl_AT(l_sql, ad_ddl.create_view, p_Dim_Level_Rec.Bsc_Level_View_Name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4157 
4158         EXCEPTION
4159             --if exception, it means PMF View does not exists,
4160             --in this case update Table_Type  =  -1, which is a indication of view does not exists
4161             WHEN OTHERS THEN
4162                 IF (NOT BSC_UTILITY.is_Table_View_Exists(p_Dim_Level_Rec.Bsc_Level_View_Name)) THEN
4163                     UPDATE BSC_SYS_DIM_LEVELS_B
4164                     SET    Table_Type  = -1
4165                     WHERE  Short_Name  =  p_Dim_Level_Rec.Bsc_Level_Short_Name;
4166                 END IF;
4167         END;
4168     ELSE
4169         --update Table_Type  =  -1, which is a indication of view does not exists
4170         UPDATE BSC_SYS_DIM_LEVELS_B
4171         SET    Table_Type  = -1
4172         WHERE  Short_Name  =  p_Dim_Level_Rec.Bsc_Level_Short_Name;
4173     END IF;
4174 
4175     RETURN TRUE;
4176 EXCEPTION
4177     WHEN FND_API.G_EXC_ERROR THEN
4178         ROLLBACK TO CreateBSCPmfViewPMD;
4179         IF (x_msg_data IS NULL) THEN
4180             FND_MSG_PUB.Count_And_Get
4181             (      p_encoded   =>  FND_API.G_FALSE
4182                ,   p_count     =>  x_msg_count
4183                ,   p_data      =>  x_msg_data
4184             );
4185         END IF;
4186         x_return_status :=  FND_API.G_RET_STS_ERROR;
4187         RETURN FALSE;
4188     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4189         ROLLBACK TO CreateBSCPmfViewPMD;
4190         IF (x_msg_data IS NULL) THEN
4191             FND_MSG_PUB.Count_And_Get
4192             (      p_encoded   =>  FND_API.G_FALSE
4193                ,   p_count     =>  x_msg_count
4194                ,   p_data      =>  x_msg_data
4195             );
4196         END IF;
4197         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4198         RETURN FALSE;
4199     WHEN NO_DATA_FOUND THEN
4200         ROLLBACK TO CreateBSCPmfViewPMD;
4201         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4202         IF (x_msg_data IS NOT NULL) THEN
4203             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views ';
4204         ELSE
4205             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views ';
4206         END IF;
4207         RETURN FALSE;
4208     WHEN OTHERS THEN
4209         ROLLBACK TO CreateBSCPmfViewPMD;
4210         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4211         IF (x_msg_data IS NOT NULL) THEN
4212             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views ';
4213         ELSE
4214             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views ';
4215         END IF;
4216         RETURN FALSE;
4217 END Create_Pmf_Views;
4218 
4219 /*******************************************************************************
4220                          FUNCTION TO CREATE BSC DIMENSIONS
4221 ********************************************************************************/
4222 FUNCTION Create_Bsc_Master_Tabs
4223 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4224     ,   x_return_status         OUT NOCOPY  VARCHAR2
4225     ,   x_msg_count             OUT NOCOPY  NUMBER
4226     ,   x_msg_data              OUT NOCOPY  VARCHAR2
4227 )
4228 RETURN BOOLEAN IS
4229     l_sql_stmt                  VARCHAR2(32000);
4230 
4231     l_master_table              BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4232     l_input_table               BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4233     l_view_name                 BSC_SYS_DIM_LEVELS_B.Level_View_Name%TYPE;
4234     l_col_names                 VARCHAR2(32000)  :=  NULL;
4235     l_code_name                 VARCHAR2(25);
4236     l_count                     NUMBER          := 0;
4237 
4238     CURSOR  c_view_cols IS
4239     SELECT  column_name
4240     FROM    ALL_TAB_COLUMNS
4241     WHERE   TABLE_NAME  = l_master_table
4242     AND     column_name NOT IN ('LANGUAGE', 'SOURCE_LANG')
4243     AND     column_name IS NOT NULL
4244     AND     OWNER = BSC_APPS.get_user_schema;
4245 
4246     l_rollback_ddl_stmts BSC_APPS.t_array_ddl_stmts;
4247     l_num_rollback_ddl_stmts NUMBER := 0;
4248 
4249 BEGIN
4250     FND_MSG_PUB.Initialize;
4251     x_return_status := FND_API.G_RET_STS_SUCCESS;
4252     SAVEPOINT CreateBSCMasTabsPMD;
4253 
4254     BSC_APPS.Init_Bsc_Apps;
4255     IF ((p_Dim_Level_Rec.Bsc_Source IS NULL) OR (p_Dim_Level_Rec.Bsc_Source <> 'BSC')) THEN
4256         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_DATA_SOURCE');
4257         FND_MSG_PUB.ADD;
4258         RAISE FND_API.G_EXC_ERROR;
4259     END IF;
4260     IF (p_Dim_Level_Rec.Bsc_Level_Id IS NULL) THEN
4261         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4262         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_ID'), TRUE);
4263         FND_MSG_PUB.ADD;
4264         RAISE FND_API.G_EXC_ERROR;
4265     END IF;
4266     IF (p_Dim_Level_Rec.Bsc_Level_Name IS NULL) THEN
4267         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4268         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
4269         FND_MSG_PUB.ADD;
4270         RAISE FND_API.G_EXC_ERROR;
4271     END IF;
4272     IF (p_Dim_Level_Rec.Bsc_Level_View_Name IS NULL) THEN
4273         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4274         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'), TRUE);
4275         FND_MSG_PUB.ADD;
4276         RAISE FND_API.G_EXC_ERROR;
4277     END IF;
4278     IF (p_Dim_Level_Rec.Bsc_Level_Abbreviation IS NULL) THEN
4279         p_Dim_Level_Rec.Bsc_Level_Abbreviation  :=  SUBSTR(REPLACE(p_Dim_Level_Rec.Bsc_Level_Short_Name, ' ', ''), 1, 8);
4280     END IF;
4281 
4282     IF(INSTR(p_Dim_Level_Rec.Bsc_Level_Name, 'BSC_D_') = 1) THEN
4283         p_Dim_Level_Rec.Bsc_Level_Name   :=  SUBSTR(p_Dim_Level_Rec.Bsc_Level_Name, 7, LENGTH(p_Dim_Level_Rec.Bsc_Level_Name));
4284     END IF;
4285     l_master_table  :=  'BSC_D_'||UPPER(p_Dim_Level_Rec.Bsc_Level_Name);
4286 
4287     IF (NOT is_Valid_Identifier(l_master_table)) THEN
4288         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
4289         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
4290         FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_master_table);
4291         FND_MSG_PUB.ADD;
4292         RAISE FND_API.G_EXC_ERROR;
4293     END IF;
4294 
4295     l_input_table   :=  'BSC_DI_'||p_Dim_Level_Rec.Bsc_Level_Id;
4296 
4297     l_view_name     :=  'BSC_D_'||p_Dim_Level_Rec.Bsc_Level_Id||'_VL';
4298 
4299     IF (p_Dim_Level_Rec.Bsc_Pk_Col IS NULL) THEN
4300         p_Dim_Level_Rec.Bsc_Pk_Col          :=  SUBSTR(p_Dim_Level_Rec.Bsc_Level_Name , 1, 22)||'_CODE';
4301     END IF;
4302 
4303     p_Dim_Level_Rec.Bsc_Level_Name      :=  l_master_table;
4304     p_Dim_Level_Rec.Bsc_Level_View_Name :=  l_view_name;
4305 
4306     SELECT COUNT(1) INTO l_count
4307     FROM   BSC_SYS_DIM_LEVELS_B
4308     WHERE  DIM_LEVEL_ID <> p_Dim_Level_Rec.Bsc_Level_Id
4309     AND    LEVEL_TABLE_NAME = l_master_table
4310     AND    SOURCE <> 'PMF';
4311 
4312     IF (l_count <> 0) THEN
4313         FND_MESSAGE.SET_NAME('BSC','BSC_D_TABLE_NAME_EXIST');
4314         FND_MESSAGE.SET_TOKEN('TABLE_NAME', p_Dim_Level_Rec.Bsc_Level_Name);
4315         FND_MSG_PUB.ADD;
4316         RAISE FND_API.G_EXC_ERROR;
4317     END IF;
4318     --Need to initiliaze in order to Do_DDL works fine
4319 
4320     l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4321                     ' WHERE  OBJECT_NAME =   :1';
4322 
4323     EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_master_table;
4324 
4325     IF (l_count <> 0) THEN
4326         l_sql_stmt    := 'DROP TABLE '||l_master_table;
4327         BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.drop_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4328     END IF;
4329 
4330     -- CHANGED THIS TO REARRANGE THE COLS MASTER TABLES
4331     -- BUG #3081595
4332     l_sql_stmt    :=  ' CREATE TABLE  '||l_master_table||
4333                       ' ( CODE           NUMBER        NOT NULL,'||
4334                       '   USER_CODE      VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||'),  ' ||
4335                       '   NAME           VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size||'),  '||
4336                       '   LANGUAGE       VARCHAR2(4)   NOT NULL,'||
4337                       '   SOURCE_LANG    VARCHAR2(4)   NOT NULL )'||
4338                       ' '||' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Table_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
4339 
4340     BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4341 
4342     -- in case we need to rollback the ddl
4343     l_num_rollback_ddl_stmts := l_num_rollback_ddl_stmts + 1;
4344     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).sql_stmt := 'DROP TABLE '||l_master_table;
4345     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).stmt_type := ad_ddl.drop_table;
4346     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).object_name := l_master_table;
4347 
4348     l_sql_stmt    :=  ' CREATE UNIQUE INDEX '||l_master_table||'_U1 '||
4349                       ' ON '||l_master_table||' (CODE,LANGUAGE) '||' '||
4350                       ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
4351 
4352     BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4353 
4354     -- Create a new UNIQUE INDEX for Loader Performance - Bug #3090828
4355     l_sql_stmt    :=  ' CREATE UNIQUE INDEX '||l_master_table||'_U2 '||
4356                       ' ON '||l_master_table||' (USER_CODE,LANGUAGE) '||' '||
4357                       ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
4358 
4359     BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4360 
4361     l_col_names   :=  NULL;
4362     --Bug #3081595
4363     l_col_names   :=  'USER_CODE, NAME ';
4364 
4365     l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4366                     ' WHERE  OBJECT_NAME =   :1';
4367 
4368     EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_input_table;
4369 
4370     IF (l_count <> 0) THEN
4371         l_sql_stmt    := 'DROP TABLE '||l_input_table;
4372         BSC_APPS.Do_Ddl_AT(l_sql_stmt,    ad_ddl.drop_table,  l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4373     END IF;
4374     l_sql_stmt    :=  ' CREATE TABLE   '||l_input_table||' '||' TABLESPACE '||
4375                         BSC_APPS.Get_Tablespace_Name(BSC_APPS.Input_Table_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause||
4376                       ' AS SELECT '||l_col_names||' FROM   '||l_master_table||' WHERE 1 = 2';
4377 
4378     BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.create_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4379 
4380     -- in case we need to rollback the ddl
4381     l_num_rollback_ddl_stmts := l_num_rollback_ddl_stmts + 1;
4382     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).sql_stmt := 'DROP TABLE '||l_input_table;
4383     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).stmt_type := ad_ddl.drop_table;
4384     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).object_name := l_input_table;
4385 
4386     l_sql_stmt    :=  ' CREATE UNIQUE INDEX '||l_input_table||'_U1 '||
4387                       ' ON '||l_input_table||' (USER_CODE) '||' '||
4388                       ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Input_Index_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
4389 
4390     BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.create_index, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4391 
4392     l_col_names :=  NULL;
4393     FOR cd IN c_view_cols LOOP
4394         IF (l_col_names IS NULL )THEN
4395             l_col_names   :=  cd.column_name;
4396         ELSE
4397             l_col_names   :=  l_col_names ||', '|| cd.column_name;
4398         END IF;
4399     END LOOP;
4400 
4401     l_sql_stmt  :=  ' CREATE OR REPLACE VIEW '||l_view_name||' AS ('  ||
4402                     ' SELECT '||l_col_names||
4403                     ' FROM   '||l_master_table||
4404                     ' WHERE LANGUAGE = USERENV(''LANG''))';
4405 
4406     BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.create_view, l_view_name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4407 
4408     -- in case we need to rollback the ddl
4409     l_num_rollback_ddl_stmts := l_num_rollback_ddl_stmts + 1;
4410     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).sql_stmt := 'DROP VIEW '||l_view_name;
4411     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).stmt_type := ad_ddl.drop_view;
4412     l_rollback_ddl_stmts(l_num_rollback_ddl_stmts).object_name := l_view_name;
4413 
4414 
4415     FOR i_project IN 0..5 LOOP
4416         IF (i_project = 0) THEN
4417             l_code_name := 'ALL';
4418         ELSE
4419             l_code_name := p_Dim_Level_Rec.Bsc_Level_Abbreviation || TO_CHAR(i_project);
4420         END IF;
4421 
4422        l_sql_stmt :=    ' INSERT  INTO '||l_master_table||
4423                         ' (CODE, USER_CODE, NAME, LANGUAGE, SOURCE_LANG)  '||
4424                         ' SELECT     '||i_project||' AS CODE, '||
4425                         ' '''||TO_CHAR(i_project)||''' AS USER_CODE, '||
4426                         ' '''||l_code_name||''' AS NAME,    L.LANGUAGE_CODE, '||
4427                         '  USERENV(''LANG'') '||
4428                         ' FROM    FND_LANGUAGES L '||
4429                         ' WHERE   L.INSTALLED_FLAG IN (''I'', ''B'') '||
4430                         ' AND     NOT EXISTS '||
4431                         ' ( SELECT NULL FROM   '||l_master_table||
4432                         ' T WHERE  T.CODE = :1 '||
4433                         ' AND    T.LANGUAGE     = L.LANGUAGE_CODE) ';
4434 
4435         EXECUTE IMMEDIATE l_sql_stmt USING i_project;
4436     END LOOP;
4437     --insert into BSC_DB_TABLES_RELS & BSC_DB_TABLES
4438 
4439     INSERT INTO BSC_DB_TABLES_RELS
4440                 (Table_Name,  Source_Table_Name, Relation_Type)
4441     VALUES      (l_master_table, l_input_table, 0);
4442 
4443     INSERT INTO BSC_DB_TABLES
4444                 (Table_Name, Table_Type, Periodicity_Id,
4445                  Source_Data_Type, Source_File_Name)
4446     VALUES      (l_input_table, 2, 0, 0, NULL);
4447     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
4448 
4449     RETURN TRUE;
4450 EXCEPTION
4451     WHEN FND_API.G_EXC_ERROR THEN
4452         ROLLBACK TO CreateBSCMasTabsPMD;
4453         IF (x_msg_data IS NULL) THEN
4454             FND_MSG_PUB.Count_And_Get
4455             (      p_encoded   =>  FND_API.G_FALSE
4456                ,   p_count     =>  x_msg_count
4457                ,   p_data      =>  x_msg_data
4458             );
4459         END IF;
4460 
4461         x_return_status :=  FND_API.G_RET_STS_ERROR;
4462 
4463         -- try to rollback ddl stmts
4464         BSC_APPS.Execute_DDL_Stmts_AT(l_rollback_ddl_stmts, l_num_rollback_ddl_stmts, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4465 
4466         RETURN FALSE;
4467     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4468         ROLLBACK TO CreateBSCMasTabsPMD;
4469         IF (x_msg_data IS NULL) THEN
4470             FND_MSG_PUB.Count_And_Get
4471             (      p_encoded   =>  FND_API.G_FALSE
4472                ,   p_count     =>  x_msg_count
4473                ,   p_data      =>  x_msg_data
4474             );
4475         END IF;
4476         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4477 
4478 
4479         -- try to rollback ddl stmts
4480         BSC_APPS.Execute_DDL_Stmts_AT(l_rollback_ddl_stmts, l_num_rollback_ddl_stmts, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4481 
4482         RETURN FALSE;
4483     WHEN NO_DATA_FOUND THEN
4484         ROLLBACK TO CreateBSCMasTabsPMD;
4485         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4486         IF (x_msg_data IS NOT NULL) THEN
4487             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs ';
4488         ELSE
4489             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs ';
4490         END IF;
4491 
4492         -- try to rollback ddl stmts
4493         BSC_APPS.Execute_DDL_Stmts_AT(l_rollback_ddl_stmts, l_num_rollback_ddl_stmts, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4494 
4495         RETURN FALSE;
4496     WHEN OTHERS THEN
4497         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4498         IF (x_msg_data IS NOT NULL) THEN
4499             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs ';
4500         ELSE
4501             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs ';
4502         END IF;
4503 
4504         ROLLBACK TO CreateBSCMasTabsPMD;
4505 
4506         -- try to rollback ddl stmts
4507         BSC_APPS.Execute_DDL_Stmts_AT(l_rollback_ddl_stmts, l_num_rollback_ddl_stmts, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4508 
4509         RETURN FALSE;
4510 END Create_Bsc_Master_Tabs;
4511 /*******************************************************************************
4512                FUNCTION TO ALTER BSC DIMENSION OBJECTS MASTER TABLES
4513 ********************************************************************************/
4514 FUNCTION Alter_Bsc_Master_Tabs
4515 (       p_Dim_Level_Rec     IN  OUT NOCOPY  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4516     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4517     ,   x_return_status         OUT NOCOPY  VARCHAR2
4518     ,   x_msg_count             OUT NOCOPY  NUMBER
4519     ,   x_msg_data              OUT NOCOPY  VARCHAR2
4520 )
4521 RETURN BOOLEAN IS
4522     l_sql_stmt                  VARCHAR2(32000);
4523     l_master_table              BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4524     l_input_table               BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4525     l_view_name                 BSC_SYS_DIM_LEVELS_B.Level_View_Name%TYPE;
4526     l_col_names                 VARCHAR2(32000)  :=  NULL;
4527     l_old_mas_name              VARCHAR2(60);
4528     l_abbr                      VARCHAR2(30);
4529     l_count                     NUMBER          := 0;
4530     l_flag                      BOOLEAN;
4531     l_Create_View               BOOLEAN := FALSE;
4532     l_bind_variable             VARCHAR2(100);
4533     e_mlog_exception            EXCEPTION;
4534     l_error_msg                 VARCHAR2(4000);
4535 
4536     CURSOR  c_view_cols IS
4537     SELECT  column_name
4538     FROM    ALL_TAB_COLUMNS
4539     WHERE   TABLE_NAME  = l_master_table
4540     AND     column_name IS NOT NULL
4541     AND     column_name NOT IN ('LANGUAGE', 'SOURCE_LANG')
4542     AND     OWNER = BSC_APPS.get_user_schema;
4543 
4544     --cursor to see, if this dimension object is used in many to many relations
4545     CURSOR  c_rel_type IS
4546     SELECT  parent_dim_level_id
4547     FROM    bsc_sys_dim_level_rels
4548     WHERE   dim_level_id  = p_Dim_Level_Rec.Bsc_Level_Id
4549     AND     relation_type = 2;
4550 
4551     CURSOR  c_db_tables IS
4552     SELECT  DISTINCT TAB.Table_Name                 AS TABLE_NAME
4553          ,  NVL(COL.Source_Column, COL.Column_Name) AS COLUMN_NAME
4554     FROM    BSC_DB_TABLES_COLS   COL
4555          ,  BSC_DB_TABLES        TAB
4556     WHERE   TAB.Table_Name           =  COL.Table_Name
4557     AND     TAB.Table_Type           =  0
4558     AND    (UPPER(COL.Column_Name))  =  UPPER(p_Dim_Level_Rec.Bsc_Pk_Col);
4559 
4560     CURSOR  c_One_To_N_Index IS
4561     SELECT  B.Level_Pk_Col
4562     FROM    BSC_SYS_DIM_LEVEL_RELS   A
4563          ,  BSC_SYS_DIM_LEVELS_B     B
4564     WHERE   A.Dim_Level_Id  = p_Dim_Level_Rec.Bsc_Level_Id
4565     AND     B.Dim_Level_Id  = A.Parent_Dim_Level_Id
4566     AND     A.Relation_Type = 1;
4567 
4568 BEGIN
4569     FND_MSG_PUB.Initialize;
4570     x_return_status := FND_API.G_RET_STS_SUCCESS;
4571     SAVEPOINT AlterBSCMasTabsPMD;
4572 
4573     BSC_APPS.Init_Bsc_Apps;
4574     IF ((p_Dim_Level_Rec.Bsc_Source IS NULL) OR (p_Dim_Level_Rec.Bsc_Source <> 'BSC')) THEN
4575         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_DATA_SOURCE');
4576         FND_MSG_PUB.ADD;
4577         RAISE FND_API.G_EXC_ERROR;
4578     END IF;
4579     IF (p_Dim_Level_Rec.Bsc_Level_Id IS NULL) THEN
4580         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4581         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_ID'), TRUE);
4582         FND_MSG_PUB.ADD;
4583         RAISE FND_API.G_EXC_ERROR;
4584     END IF;
4585     IF (p_Dim_Level_Rec.Bsc_Level_Name IS NULL) THEN
4586         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4587         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
4588         FND_MSG_PUB.ADD;
4589         RAISE FND_API.G_EXC_ERROR;
4590     END IF;
4591     IF (p_Dim_Level_Rec.Bsc_Level_View_Name IS NULL) THEN
4592         FND_MESSAGE.SET_NAME('BSC','BSC_REQ_FIELD_MISSING');
4593         FND_MESSAGE.SET_TOKEN('FIELD_NAME', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_VIEW_NAME'), TRUE);
4594         FND_MSG_PUB.ADD;
4595         RAISE FND_API.G_EXC_ERROR;
4596     END IF;
4597     l_master_table  :=  UPPER(p_Dim_Level_Rec.Bsc_Level_Name);
4598 
4599     IF (NOT is_Valid_Identifier(l_master_table)) THEN
4600         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
4601         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_TAB_NAME'), TRUE);
4602         FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_master_table);
4603         FND_MSG_PUB.ADD;
4604         RAISE FND_API.G_EXC_ERROR;
4605     END IF;
4606 
4607     l_input_table   :=  'BSC_DI_'||p_Dim_Level_Rec.Bsc_Level_Id;
4608     l_view_name     :=  'BSC_D_'||p_Dim_Level_Rec.Bsc_Level_Id||'_VL';
4609 
4610     SELECT COUNT(1) INTO l_count
4611     FROM   BSC_SYS_DIM_LEVELS_B
4612     WHERE  DIM_LEVEL_ID     <> p_Dim_Level_Rec.Bsc_Level_Id
4613     AND    LEVEL_TABLE_NAME = l_master_table;
4614     IF (l_count <> 0) THEN
4615         FND_MESSAGE.SET_NAME('BSC','BSC_D_TABLE_NAME_EXIST');
4616         FND_MESSAGE.SET_TOKEN('TABLE_NAME', p_Dim_Level_Rec.Bsc_Level_Name);
4617         FND_MSG_PUB.ADD;
4618         RAISE FND_API.G_EXC_ERROR;
4619     END IF;
4620     --check if old master tables, views, input table exists in the system.
4621     --if they do not exists than call BSC_BIS_DIM_OBJ_PUB.Create_Bsc_Master_Tabs otherwise proceed further
4622     l_flag      :=  TRUE;
4623     l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4624                     ' WHERE  OBJECT_NAME =   :1';
4625 
4626     EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING p_Dim_Level_Rec_Old.Bsc_Level_Name;
4627     IF (l_count = 0) THEN
4628         l_flag  := FALSE;
4629     END IF;
4630     l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4631                     ' WHERE  OBJECT_NAME =   :1';
4632     l_bind_variable :=  'BSC_D_'||p_Dim_Level_Rec_Old.Bsc_Level_Id||'_VL';
4633     EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_bind_variable;
4634     IF (l_count = 0) THEN
4635         l_flag  := FALSE;
4636     END IF;
4637     l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4638                     ' WHERE  OBJECT_NAME =   :1';
4639 
4640     l_bind_variable :=  'BSC_DI_'||p_Dim_Level_Rec_Old.Bsc_Level_Id;
4641     EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_bind_variable;
4642     IF (l_count = 0) THEN
4643         l_flag  := FALSE;
4644     END IF;
4645     IF (NOT l_flag) THEN
4646         --The following part of the code will only be executed if
4647         --master table, input table or view does not exists.
4648         --This secition will be called in the case of data corruption only.
4649         FND_MESSAGE.SET_NAME('BSC','BSC_DB_ERROR');
4650         FND_MSG_PUB.ADD;
4651         RAISE FND_API.G_EXC_ERROR;
4652     ELSE
4653         --check if Level_Pk_Col is differnt, is so update table BSC_DB_TABLES_COLS
4654         IF(UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) <> UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col)) THEN
4655             UPDATE BSC_DB_TABLES_COLS
4656             SET    Source_Column         = p_Dim_Level_Rec_Old.Bsc_Pk_Col
4657             WHERE  UPPER(Column_Name)    = UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col)
4658             AND    Source_Column IS NULL;
4659 
4660             UPDATE BSC_DB_TABLES_COLS
4661             SET    Column_Name         = p_Dim_Level_Rec.Bsc_Pk_Col
4662             WHERE  UPPER(Column_Name)  = UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col);
4663         END IF;
4664         --check if user-code size and disp-key size are different
4665         IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size)
4666             OR (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_Disp_Key_Size)) THEN
4667             IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size < p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size)
4668               OR (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size < p_Dim_Level_Rec_Old.Bsc_Level_Disp_Key_Size)) THEN
4669                     FND_MESSAGE.SET_NAME('BSC','BSC_CODE_SIZE_NOT_DECREASED');
4670                     FND_MSG_PUB.ADD;
4671                     RAISE FND_API.G_EXC_ERROR;
4672             END IF;
4673             l_Create_View := TRUE;
4674 
4675             l_sql_stmt  :=  'ALTER TABLE '||p_Dim_Level_Rec_Old.Bsc_Level_Name||
4676                             ' MODIFY USER_CODE VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') '||
4677                             ' MODIFY NAME   VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size||')  ';
4678 
4679             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, p_Dim_Level_Rec_Old.Bsc_Level_Name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4680 
4681 
4682             l_sql_stmt  :=  'ALTER TABLE BSC_DI_'||p_Dim_Level_Rec_Old.Bsc_Level_Id||'  '||
4683                             ' MODIFY USER_CODE VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') '||
4684                             ' MODIFY NAME   VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size||')  ';
4685 
4686             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, 'BSC_DI_'||p_Dim_Level_Rec_Old.Bsc_Level_Id, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4687             IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size)) THEN
4688                 FOR cd IN c_db_tables LOOP
4689                     l_sql_stmt  :=  ' ALTER TABLE '||cd.Table_Name||
4690                                     ' MODIFY '||cd.Column_Name||
4691                                     ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') ';
4692                     BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, cd.TABLE_NAME, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4693                 END LOOP;
4694             END IF;
4695 
4696             /********************************************************
4697              Here we will synch up the MLOG tables for the current dimension object
4698              ********************************************************/
4699             IF NOT (BSC_SYNC_MVLOGS.Sync_dim_table_mv_log(p_Dim_Level_Rec_Old.Bsc_Level_Name,l_error_msg)) THEN
4700               RAISE e_mlog_exception;
4701             END IF;
4702         END IF;
4703         IF (l_master_table <> UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Name)) THEN
4704            l_Create_View := TRUE;
4705            l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4706                             ' WHERE  OBJECT_NAME =   :1';
4707 
4708             EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_master_table;
4709             IF (l_count <> 0) THEN
4710                 l_sql_stmt    := 'DROP TABLE '||l_master_table;
4711                 BSC_APPS.Do_Ddl_AT(l_sql_stmt,    ad_ddl.drop_table,  l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4712             END IF;
4713             l_sql_stmt    :=  ' CREATE TABLE   '||l_master_table||' '||' TABLESPACE '||
4714                                 BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Table_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause||
4715                               ' AS SELECT * FROM '||p_Dim_Level_Rec_Old.Bsc_Level_Name;
4716 
4717             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4718             l_sql_stmt    :=  ' CREATE UNIQUE INDEX '||l_master_table||'_U1 '||
4719                               ' ON '||l_master_table||' (CODE, LANGUAGE) '||' '||
4720                               ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.Bsc_Storage_Clause;
4721 
4722             BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4723 
4724             -- Create a new UNIQUE INDEX for Loader Performance - Bug #3090828
4725             l_sql_stmt    :=  ' CREATE UNIQUE INDEX '||l_master_table||'_U2 '||
4726                               ' ON '||l_master_table||' (USER_CODE, LANGUAGE) '||' '||
4727                               ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.Bsc_Storage_Clause;
4728             BSC_APPS.Do_Ddl_AT(l_sql_stmt, ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4729             l_count := 1;
4730             FOR cd IN c_One_To_N_Index LOOP
4731                 -- Create a new Non-Unique INDEX for Loader Performance - Bug #3120190
4732 
4733                 IF (LENGTH(l_master_table||'_N'||l_count) <= 30) THEN
4734                     l_sql_stmt    :=  ' CREATE INDEX '||l_master_table||'_N'||l_count||' '||
4735                                       ' ON '||l_master_table||' ('||cd.Level_Pk_Col||') '||' '||
4736                                       ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
4737 
4738                     BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4739                     l_count := l_count + 1;
4740                 ELSE
4741                     EXIT;
4742                 END IF;
4743             END LOOP;
4744             l_sql_stmt    := 'DROP TABLE '||p_Dim_Level_Rec_Old.Bsc_Level_Name;
4745 
4746             BSC_APPS.Do_Ddl_AT(l_sql_stmt,    ad_ddl.drop_table,  p_Dim_Level_Rec_Old.Bsc_Level_Name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4747             --update BSC_DB_TABLES_RELS
4748             UPDATE BSC_DB_TABLES_RELS
4749             SET    Table_Name         = l_master_table
4750             WHERE  Source_Table_Name  = l_input_table;
4751         END IF;
4752         IF (l_Create_View) THEN
4753 
4754             l_col_names :=  NULL;
4755             FOR cd IN c_view_cols LOOP
4756                 IF (l_col_names IS NULL )THEN
4757                     l_col_names   :=  cd.column_name;
4758                 ELSE
4759                     l_col_names   :=  l_col_names ||', '|| cd.column_name;
4760                 END IF;
4761             END LOOP;
4762 
4763             l_sql_stmt  :=  ' CREATE OR REPLACE VIEW '||l_view_name||' AS ('  ||
4764                             ' SELECT '||l_col_names||
4765                             ' FROM   '||l_master_table||
4766                             ' WHERE LANGUAGE = USERENV(''LANG''))';
4767 
4768             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_view, l_view_name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4769         END IF;
4770         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables
4771                     (       p_Dim_Level_Rec       =>  p_Dim_Level_Rec
4772                         ,   p_Dim_Level_Rec_Old   =>  p_Dim_Level_Rec_Old
4773                         ,   x_return_status       =>  x_return_status
4774                         ,   x_msg_count           =>  x_msg_count
4775                         ,   x_msg_data            =>  x_msg_data
4776                     );
4777                     IF (NOT l_flag) THEN
4778                         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
4779                     END IF;
4780         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables
4781                     (       p_Dim_Level_Rec     =>  p_Dim_Level_Rec
4782                         ,   p_Dim_Level_Rec_Old =>  p_Dim_Level_Rec_Old
4783                         ,   x_return_status     =>  x_return_status
4784                         ,   x_msg_count         =>  x_msg_count
4785                         ,   x_msg_data          =>  x_msg_data
4786                     );
4787                     IF (NOT l_flag) THEN
4788                         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
4789                     END IF;
4790         RETURN TRUE;
4791     END IF;
4792 EXCEPTION
4793     WHEN e_mlog_exception THEN
4794         ROLLBACK TO AlterBSCMasTabsPMD;
4795         x_msg_data      := NULL;
4796         x_msg_data      := l_error_msg || ' -> BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs';
4797         x_return_status :=  FND_API.G_RET_STS_ERROR;
4798         RETURN FALSE;
4799 
4800     WHEN FND_API.G_EXC_ERROR THEN
4801         ROLLBACK TO AlterBSCMasTabsPMD;
4802         IF (x_msg_data IS NULL) THEN
4803             FND_MSG_PUB.Count_And_Get
4804             (      p_encoded   =>  FND_API.G_FALSE
4805                ,   p_count     =>  x_msg_count
4806                ,   p_data      =>  x_msg_data
4807             );
4808         END IF;
4809         x_return_status :=  FND_API.G_RET_STS_ERROR;
4810         RETURN FALSE;
4811     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4812         ROLLBACK TO AlterBSCMasTabsPMD;
4813         IF (x_msg_data IS NULL) THEN
4814             FND_MSG_PUB.Count_And_Get
4815             (      p_encoded   =>  FND_API.G_FALSE
4816                ,   p_count     =>  x_msg_count
4817                ,   p_data      =>  x_msg_data
4818             );
4819         END IF;
4820         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4821         RETURN FALSE;
4822     WHEN NO_DATA_FOUND THEN
4823         ROLLBACK TO AlterBSCMasTabsPMD;
4824         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4825         IF (x_msg_data IS NOT NULL) THEN
4826             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs ';
4827         ELSE
4828             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs ';
4829         END IF;
4830         RETURN FALSE;
4831     WHEN OTHERS THEN
4832         ROLLBACK TO AlterBSCMasTabsPMD;
4833         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4834         IF (x_msg_data IS NOT NULL) THEN
4835             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs ';
4836         ELSE
4837             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_Bsc_Master_Tabs ';
4838         END IF;
4839         RETURN FALSE;
4840 END Alter_Bsc_Master_Tabs;
4841 /*******************************************************************************
4842                FUNCTION TO ALTER M x N Tables
4843 ********************************************************************************/
4844 FUNCTION Alter_M_By_N_Tables
4845 (       p_Dim_Level_Rec     IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4846     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
4847     ,   x_return_status         OUT NOCOPY  VARCHAR2
4848     ,   x_msg_count             OUT NOCOPY  NUMBER
4849     ,   x_msg_data              OUT NOCOPY  VARCHAR2
4850 )
4851 RETURN BOOLEAN IS
4852     l_count             NUMBER;
4853     l_abbreviation      BSC_SYS_DIM_LEVELS_B.Abbreviation%TYPE;
4854     l_sql_stmt          VARCHAR2(32000);
4855     l_old_mas_name      BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4856     l_master_table      BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4857     l_input_table       BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
4858     l_Tbl_Statements    BSC_APPS.Autonomous_Statements_Tbl_Type;
4859     e_mlog_exception    EXCEPTION;
4860     l_error_msg         VARCHAR2(4000);
4861 
4862     CURSOR  c_MN_Tables  IS
4863     SELECT  Dim_Level_Id
4864     FROM    BSC_SYS_DIM_LEVEL_RELS
4865     WHERE   Parent_Dim_Level_Id = p_Dim_Level_Rec.Bsc_Level_Id
4866     AND     Relation_Type       = 2;
4867 BEGIN
4868     FND_MSG_PUB.Initialize;
4869     x_return_status := FND_API.G_RET_STS_SUCCESS;
4870     BSC_APPS.Init_Bsc_Apps;
4871 
4872     SAVEPOINT AlterBSCMxNPMD;
4873     IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size = p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size) AND
4874          (UPPER(p_Dim_Level_Rec.Bsc_Level_Abbreviation) = UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Abbreviation)) AND
4875           (UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) = UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col))) THEN
4876           RETURN TRUE;
4877     END IF;
4878     FOR cd IN c_MN_Tables LOOP
4879         SELECT  Abbreviation
4880         INTO    l_abbreviation
4881         FROM    BSC_SYS_DIM_LEVELS_B
4882         WHERE   dim_level_id = cd.Dim_Level_Id;
4883 
4884         IF (cd.Dim_Level_Id > p_Dim_Level_Rec.Bsc_Level_Id) THEN
4885             l_input_table :=  'BSC_DI_'||p_Dim_Level_Rec.Bsc_Level_Id||'_'||cd.Dim_Level_Id;
4886         ELSE
4887             l_input_table :=  'BSC_DI_'||cd.Dim_Level_Id||'_'||p_Dim_Level_Rec.Bsc_Level_Id;
4888         END IF;
4889         IF (l_abbreviation > p_Dim_Level_Rec.Bsc_Level_Abbreviation) THEN
4890             l_master_table  :=  'BSC_D_'||UPPER(p_Dim_Level_Rec.Bsc_Level_Abbreviation)||'_'||UPPER(l_abbreviation);
4891         ELSE
4892             l_master_table  :=  'BSC_D_'||UPPER(l_abbreviation)||'_'||UPPER(p_Dim_Level_Rec.Bsc_Level_Abbreviation);
4893         END IF;
4894 
4895         l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4896                         ' WHERE  OBJECT_NAME =   :1';
4897 
4898         EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_input_table;
4899         IF (l_count = 0) THEN
4900             x_msg_data  :=  'Input Table does not exists '||l_input_table;
4901             RAISE FND_API.G_EXC_ERROR;
4902         END IF;
4903         --if abbreviation is different than drop and create master tables
4904         IF (UPPER(p_Dim_Level_Rec.Bsc_Level_Abbreviation) <> UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Abbreviation)) THEN
4905             IF (UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Abbreviation) > UPPER(l_abbreviation)) THEN
4906                 l_old_mas_name  :=  'BSC_D_'||UPPER(l_abbreviation)||'_'||UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Abbreviation);
4907             ELSE
4908                 l_old_mas_name  :=  'BSC_D_'||UPPER(p_Dim_Level_Rec_Old.Bsc_Level_Abbreviation)||'_'||UPPER(l_abbreviation);
4909             END IF;
4910 
4911             l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4912                             ' WHERE  OBJECT_NAME =   :1';
4913 
4914             EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_master_table;
4915             IF (l_count <> 0) THEN
4916                 l_sql_stmt    := 'DROP TABLE '||l_master_table;
4917                 BSC_APPS.Do_Ddl_AT(l_sql_stmt,    ad_ddl.drop_table,  l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4918             END IF;
4919             l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
4920                             ' WHERE  OBJECT_NAME =   :1';
4921 
4922             EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_old_mas_name;
4923             IF (l_count = 0) THEN
4924                 x_msg_data  :=  'Master Table does not exists '||l_old_mas_name;
4925                 RAISE FND_API.G_EXC_ERROR;
4926             END IF;
4927             l_sql_stmt    :=  ' CREATE TABLE   '||l_master_table||' '||' TABLESPACE '||
4928                                 BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Table_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause||
4929                               ' AS SELECT * FROM '||l_old_mas_name;
4930 
4931             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4932 
4933             --meastmon 02-27-2004: Here is missing the sql statement. I found this by casualty. So fixing
4934             -- -----
4935             ---Need to update the following table when there is change in abbrevation bug#4091924
4936 
4937             Update_M_By_N_Relation_col
4938             ( p_Dim_Level_Id         => cd.Dim_Level_Id
4939             , p_Parent_Dim_Level_Id  => p_Dim_Level_Rec.Bsc_Level_Id
4940             , p_Relation_Col         => l_master_table
4941             , x_return_status        => x_return_status
4942             , x_msg_count            => x_msg_count
4943             , x_msg_data             => x_msg_data
4944             );
4945 
4946             IF(x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4947               RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
4948             END IF;
4949 
4950             l_sql_stmt    := 'DROP TABLE '||l_old_mas_name;
4951             -- -----
4952             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.drop_table,   l_old_mas_name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4953 
4954             --update BSC_DB_TABLES_RELS
4955             UPDATE BSC_DB_TABLES_RELS
4956             SET    Table_Name         = l_master_table
4957             WHERE  Source_Table_Name  = l_input_table;
4958         END IF;
4959         --if level_pk_col is different than change the names of table columns
4960         IF (UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) <> UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col)) THEN
4961 
4962             l_Tbl_Statements.DELETE;
4963             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' ADD ('||p_Dim_Level_Rec.Bsc_Pk_Col||' NUMBER )';
4964 
4965             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4966             l_Tbl_Statements(0).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
4967             l_Tbl_Statements(0).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
4968             l_Tbl_Statements(0).x_Statement_Type        :=  AD_DDL.Alter_Table;
4969             l_Tbl_Statements(0).x_Statement             :=  l_sql_stmt;
4970             l_Tbl_Statements(0).x_Object_Name           :=  l_master_table;
4971 
4972             l_sql_stmt  := 'UPDATE '||l_master_table||' SET '||
4973                             p_Dim_Level_Rec.Bsc_Pk_Col||' = '||p_Dim_Level_Rec_Old.Bsc_Pk_Col;
4974 
4975             --EXECUTE IMMEDIATE l_sql_stmt;
4976             l_Tbl_Statements(1).x_Fnd_Apps_Schema       :=  NULL;
4977             l_Tbl_Statements(1).x_Bsc_Apps_Short_Name   :=  NULL;
4978             l_Tbl_Statements(1).x_Statement_Type        :=  NULL;
4979             l_Tbl_Statements(1).x_Statement             :=  l_sql_stmt;
4980             l_Tbl_Statements(1).x_Object_Name           :=  NULL;
4981 
4982             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' DROP COLUMN '||p_Dim_Level_Rec_Old.Bsc_Pk_Col;
4983 
4984             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4985             l_Tbl_Statements(2).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
4986             l_Tbl_Statements(2).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
4987             l_Tbl_Statements(2).x_Statement_Type        :=  AD_DDL.Alter_Table;
4988             l_Tbl_Statements(2).x_Statement             :=  l_sql_stmt;
4989             l_Tbl_Statements(2).x_Object_Name           :=  l_master_table;
4990             BSC_APPS.Do_Ddl_AT(x_Statements_Tbl  => l_Tbl_Statements);
4991 
4992             l_Tbl_Statements.DELETE;
4993             l_sql_stmt  := 'ALTER TABLE '||l_input_table||' ADD ('||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
4994                            ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||'))';
4995 
4996             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
4997             l_Tbl_Statements(0).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
4998             l_Tbl_Statements(0).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
4999             l_Tbl_Statements(0).x_Statement_Type        :=  AD_DDL.Alter_Table;
5000             l_Tbl_Statements(0).x_Statement             :=  l_sql_stmt;
5001             l_Tbl_Statements(0).x_Object_Name           :=  l_master_table;
5002 
5003             l_sql_stmt  := 'UPDATE '||l_input_table||' SET '||
5004                             p_Dim_Level_Rec.Bsc_Pk_Col||'_USR = '||p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5005 
5006             --EXECUTE IMMEDIATE l_sql_stmt;
5007             l_Tbl_Statements(1).x_Fnd_Apps_Schema       :=  NULL;
5008             l_Tbl_Statements(1).x_Bsc_Apps_Short_Name   :=  NULL;
5009             l_Tbl_Statements(1).x_Statement_Type        :=  NULL;
5010             l_Tbl_Statements(1).x_Statement             :=  l_sql_stmt;
5011             l_Tbl_Statements(1).x_Object_Name           :=  NULL;
5012 
5013             l_sql_stmt  := 'ALTER TABLE '||l_input_table||' DROP COLUMN '||p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5014 
5015             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5016             l_Tbl_Statements(2).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5017             l_Tbl_Statements(2).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5018             l_Tbl_Statements(2).x_Statement_Type        :=  AD_DDL.Alter_Table;
5019             l_Tbl_Statements(2).x_Statement             :=  l_sql_stmt;
5020             l_Tbl_Statements(2).x_Object_Name           :=  l_master_table;
5021             BSC_APPS.Do_Ddl_AT(x_Statements_Tbl  => l_Tbl_Statements);
5022 
5023         ELSIF (p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size) THEN
5024             l_sql_stmt  :=  ' ALTER TABLE '||l_input_table||
5025                             ' MODIFY '||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
5026                             ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') ';
5027             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5028         END IF;
5029 
5030         /********************************************************************
5031          Here we need to call the API BSC_SYNC_MVLOGS.Sync_dim_table_mv_log
5032          This API will synch up the data in MLOGS corresponding to the dimension
5033          object.
5034          We need to call this API in the following scenarios.
5035           1.When Name and USER_CODE size are changed.
5036           2.When parent col is added or removed from the child dimension object table.
5037         *******************************************************************/
5038         IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size)
5039             OR (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_Disp_Key_Size)) THEN
5040             IF NOT (BSC_SYNC_MVLOGS.Sync_dim_table_mv_log(l_master_table,l_error_msg)) THEN
5041                 RAISE e_mlog_exception;
5042             END IF;
5043        END IF;
5044     END LOOP;
5045 
5046     RETURN TRUE;
5047 EXCEPTION
5048     WHEN e_mlog_exception THEN
5049         ROLLBACK TO AlterBSCMxNPMD;
5050         x_msg_data      := NULL;
5051         x_msg_data      := l_error_msg || ' -> BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables ';
5052         x_return_status :=  FND_API.G_RET_STS_ERROR;
5053         RETURN FALSE;
5054     WHEN FND_API.G_EXC_ERROR THEN
5055         ROLLBACK TO AlterBSCMxNPMD;
5056         IF (x_msg_data IS NULL) THEN
5057             FND_MSG_PUB.Count_And_Get
5058             (      p_encoded   =>  FND_API.G_FALSE
5059                ,   p_count     =>  x_msg_count
5060                ,   p_data      =>  x_msg_data
5061             );
5062         END IF;
5063         x_return_status :=  FND_API.G_RET_STS_ERROR;
5064         RETURN FALSE;
5065     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5066         ROLLBACK TO AlterBSCMxNPMD;
5067         IF (x_msg_data IS NULL) THEN
5068             FND_MSG_PUB.Count_And_Get
5069             (      p_encoded   =>  FND_API.G_FALSE
5070                ,   p_count     =>  x_msg_count
5071                ,   p_data      =>  x_msg_data
5072             );
5073         END IF;
5074         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5075         RETURN FALSE;
5076     WHEN NO_DATA_FOUND THEN
5077         ROLLBACK TO AlterBSCMxNPMD;
5078         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5079         IF (x_msg_data IS NOT NULL) THEN
5080             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables ';
5081         ELSE
5082             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables ';
5083         END IF;
5084         RETURN FALSE;
5085     WHEN OTHERS THEN
5086         ROLLBACK TO AlterBSCMxNPMD;
5087         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5088         IF (x_msg_data IS NOT NULL) THEN
5089             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables ';
5090         ELSE
5091             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_M_By_N_Tables ';
5092         END IF;
5093         RETURN FALSE;
5094 END Alter_M_By_N_Tables;
5095 
5096 /*******************************************************************************
5097                FUNCTION TO ALTER One x N Child Tables
5098 ********************************************************************************/
5099 FUNCTION Alter_One_By_N_Tables
5100 (       p_Dim_Level_Rec     IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
5101     ,   p_Dim_Level_Rec_Old IN              BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
5102     ,   x_return_status         OUT NOCOPY  VARCHAR2
5103     ,   x_msg_count             OUT NOCOPY  NUMBER
5104     ,   x_msg_data              OUT NOCOPY  VARCHAR2
5105 )
5106 RETURN BOOLEAN IS
5107     l_count             NUMBER;
5108     l_sql_stmt          VARCHAR2(32000);
5109     l_master_table      BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
5110     l_input_table       BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
5111     l_view_name         BSC_SYS_DIM_LEVELS_B.Level_Table_Name%TYPE;
5112     l_col_names         VARCHAR2(32000);
5113     l_index_Name        VARCHAR2(100) := NULL;
5114     l_index_Count       NUMBER;
5115     l_flag              BOOLEAN;
5116     l_Create_View       BOOLEAN := FALSE;
5117     l_Tbl_Statements    BSC_APPS.Autonomous_Statements_Tbl_Type;
5118     e_mlog_exception    EXCEPTION;
5119     l_error_msg         VARCHAR2(4000);
5120 
5121     --cursor to get the columns for creation of view based on master-table
5122     CURSOR  c_view_cols IS
5123     SELECT  column_name
5124     FROM    ALL_TAB_COLUMNS
5125     WHERE   TABLE_NAME  = l_master_table
5126     AND     column_name NOT IN ('LANGUAGE', 'SOURCE_LANG')
5127     AND     column_name IS NOT NULL
5128     AND     OWNER = BSC_APPS.get_user_schema;
5129 
5130     --cursor to know the index on Column
5131     CURSOR  c_Parent_Index_Name IS
5132     SELECT  Index_Name
5133     FROM    ALL_IND_COLUMNS
5134     WHERE   Table_Name  = l_master_table
5135     AND     Column_Name = UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col)
5136     AND     INDEX_OWNER = BSC_APPS.get_user_schema;
5137 
5138     CURSOR  c_One_by_N IS
5139     SELECT  Dim_Level_Id
5140     FROM    BSC_SYS_DIM_LEVEL_RELS
5141     WHERE   parent_dim_level_id = p_Dim_Level_Rec.Bsc_Level_Id
5142     AND     relation_type = 1;
5143 BEGIN
5144     FND_MSG_PUB.Initialize;
5145     x_return_status := FND_API.G_RET_STS_SUCCESS;
5146     BSC_APPS.Init_Bsc_Apps;
5147 
5148     SAVEPOINT AlterBSCOnexNPMD;
5149     IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size = p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size) AND
5150           (UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) = UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col))) THEN
5151           RETURN TRUE;
5152     END IF;
5153     FOR cd IN c_One_by_N LOOP
5154         l_Create_View   := FALSE;
5155 
5156         SELECT  Level_Table_Name
5157         INTO    l_master_table
5158         FROM    BSC_SYS_DIM_LEVELS_B
5159         WHERE   dim_level_id = cd.dim_level_id;
5160 
5161         l_master_table  :=   UPPER(l_master_table);
5162         l_input_table   :=  'BSC_DI_'||cd.Dim_Level_Id;
5163         l_view_name     :=  'BSC_D_'||cd.Dim_Level_Id||'_VL';
5164 
5165         l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
5166                         ' WHERE  OBJECT_NAME =   :1';
5167 
5168         EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_master_table;
5169         IF (l_count = 0) THEN
5170             x_msg_data  :=  'Master Table does not exists '||l_master_table;
5171             RAISE FND_API.G_EXC_ERROR;
5172         END IF;
5173 
5174         l_sql_stmt  :=  ' SELECT COUNT(1) FROM   USER_OBJECTS '||
5175                         ' WHERE  OBJECT_NAME =   :1';
5176 
5177         EXECUTE IMMEDIATE l_sql_stmt INTO l_count USING l_input_table;
5178         IF (l_count = 0) THEN
5179             x_msg_data  :=  'Input Table does not exists '||l_input_table;
5180             RAISE FND_API.G_EXC_ERROR;
5181         END IF;
5182         --if level_pk_col is different than change the names of table columns
5183         IF (UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) <> UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col)) THEN
5184             l_Create_View   := TRUE;
5185             --get the name of index on original column.
5186             l_index_Name  := NULL;
5187             OPEN  c_Parent_Index_Name;
5188                 FETCH c_Parent_Index_Name INTO l_index_Name;
5189             CLOSE c_Parent_Index_Name;
5190             IF (l_index_Name IS NULL) THEN
5191                 l_flag        := TRUE;
5192                 l_index_Name  := l_master_table||'_N1';
5193                 IF (LENGTH(l_index_Name) <= 30) THEN
5194                     l_index_Count := 2;
5195                     WHILE (l_flag) LOOP
5196                         SELECT  COUNT(1) INTO l_count
5197                         FROM    ALL_INDEXES
5198                         WHERE   INDEX_NAME = l_index_Name
5199                         AND     OWNER      = BSC_APPS.get_user_schema;
5200 
5201                         IF (l_count = 0) THEN
5202                             l_flag  := FALSE;
5203                             EXIT;
5204                         ELSE
5205                             l_index_Name  := l_master_table||'_N'||l_index_Count;
5206                             l_index_Count := l_index_Count + 1;
5207                         END IF;
5208                     END LOOP;
5209                 END IF;
5210             END IF;
5211             l_Tbl_Statements.DELETE;
5212             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' ADD ('||p_Dim_Level_Rec.Bsc_Pk_Col||' NUMBER)';
5213 
5214             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5215             l_Tbl_Statements(0).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5216             l_Tbl_Statements(0).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5217             l_Tbl_Statements(0).x_Statement_Type        :=  AD_DDL.Alter_Table;
5218             l_Tbl_Statements(0).x_Statement             :=  l_sql_stmt;
5219             l_Tbl_Statements(0).x_Object_Name           :=  l_master_table;
5220 
5221             l_sql_stmt  := 'UPDATE '||l_master_table||' SET '||
5222                             p_Dim_Level_Rec.Bsc_Pk_Col ||' = '||p_Dim_Level_Rec_Old.Bsc_Pk_Col;
5223 
5224             --EXECUTE IMMEDIATE l_sql_stmt;
5225             l_Tbl_Statements(1).x_Fnd_Apps_Schema       :=  NULL;
5226             l_Tbl_Statements(1).x_Bsc_Apps_Short_Name   :=  NULL;
5227             l_Tbl_Statements(1).x_Statement_Type        :=  NULL;
5228             l_Tbl_Statements(1).x_Statement             :=  l_sql_stmt;
5229             l_Tbl_Statements(1).x_Object_Name           :=  NULL;
5230 
5231             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' DROP COLUMN '||p_Dim_Level_Rec_Old.Bsc_Pk_Col;
5232 
5233             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5234             l_Tbl_Statements(2).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5235             l_Tbl_Statements(2).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5236             l_Tbl_Statements(2).x_Statement_Type        :=  AD_DDL.Alter_Table;
5237             l_Tbl_Statements(2).x_Statement             :=  l_sql_stmt;
5238             l_Tbl_Statements(2).x_Object_Name           :=  l_master_table;
5239             BSC_APPS.Do_Ddl_AT(x_Statements_Tbl  => l_Tbl_Statements);
5240 
5241             l_Tbl_Statements.DELETE;
5242             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' ADD ('||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
5243                            ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||'))';
5244 
5245             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5246             l_Tbl_Statements(0).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5247             l_Tbl_Statements(0).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5248             l_Tbl_Statements(0).x_Statement_Type        :=  AD_DDL.Alter_Table;
5249             l_Tbl_Statements(0).x_Statement             :=  l_sql_stmt;
5250             l_Tbl_Statements(0).x_Object_Name           :=  l_master_table;
5251 
5252 
5253             l_sql_stmt  := 'UPDATE '||l_master_table||' SET '||
5254                             p_Dim_Level_Rec.Bsc_Pk_Col||'_USR = '||p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5255 
5256             --EXECUTE IMMEDIATE l_sql_stmt;
5257             l_Tbl_Statements(1).x_Fnd_Apps_Schema       :=  NULL;
5258             l_Tbl_Statements(1).x_Bsc_Apps_Short_Name   :=  NULL;
5259             l_Tbl_Statements(1).x_Statement_Type        :=  NULL;
5260             l_Tbl_Statements(1).x_Statement             :=  l_sql_stmt;
5261             l_Tbl_Statements(1).x_Object_Name           :=  NULL;
5262             l_sql_stmt  := 'ALTER TABLE '||l_master_table||' DROP COLUMN '||
5263                             p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5264 
5265             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5266             l_Tbl_Statements(2).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5267             l_Tbl_Statements(2).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5268             l_Tbl_Statements(2).x_Statement_Type        :=  AD_DDL.Alter_Table;
5269             l_Tbl_Statements(2).x_Statement             :=  l_sql_stmt;
5270             l_Tbl_Statements(2).x_Object_Name           :=  l_master_table;
5271             BSC_APPS.Do_Ddl_AT(x_Statements_Tbl  => l_Tbl_Statements);
5272 
5273             l_Tbl_Statements.DELETE;
5274             l_sql_stmt  := 'ALTER TABLE '||l_input_table||' ADD ('||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
5275                            ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||'))';
5276 
5277             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5278             l_Tbl_Statements(0).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5279             l_Tbl_Statements(0).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5280             l_Tbl_Statements(0).x_Statement_Type        :=  AD_DDL.Alter_Table;
5281             l_Tbl_Statements(0).x_Statement             :=  l_sql_stmt;
5282             l_Tbl_Statements(0).x_Object_Name           :=  l_master_table;
5283 
5284             l_sql_stmt  := 'UPDATE '||l_input_table||' SET '||
5285                             p_Dim_Level_Rec.Bsc_Pk_Col||'_USR = '||p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5286 
5287             --EXECUTE IMMEDIATE l_sql_stmt;
5288             l_Tbl_Statements(1).x_Fnd_Apps_Schema       :=  NULL;
5289             l_Tbl_Statements(1).x_Bsc_Apps_Short_Name   :=  NULL;
5290             l_Tbl_Statements(1).x_Statement_Type        :=  NULL;
5291             l_Tbl_Statements(1).x_Statement             :=  l_sql_stmt;
5292             l_Tbl_Statements(1).x_Object_Name           :=  NULL;
5293 
5294 
5295             l_sql_stmt  := 'ALTER TABLE '||l_input_table||' DROP COLUMN '||
5296                             p_Dim_Level_Rec_Old.Bsc_Pk_Col||'_USR';
5297 
5298             --BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5299             l_Tbl_Statements(2).x_Fnd_Apps_Schema       :=  BSC_APPS.Fnd_Apps_Schema;
5300             l_Tbl_Statements(2).x_Bsc_Apps_Short_Name   :=  BSC_APPS.Bsc_Apps_Short_Name;
5301             l_Tbl_Statements(2).x_Statement_Type        :=  AD_DDL.Alter_Table;
5302             l_Tbl_Statements(2).x_Statement             :=  l_sql_stmt;
5303             l_Tbl_Statements(2).x_Object_Name           :=  l_master_table;
5304             BSC_APPS.Do_Ddl_AT(x_Statements_Tbl  => l_Tbl_Statements);
5305 
5306             /********************************************************
5307             Here we need to update the relation_col column in BSC_SYS_DIM_LEVEL_RELS
5308             table whenever we are changing the level_pk_col of the parent.
5309             /*******************************************************/
5310             UPDATE  BSC_SYS_DIM_LEVEL_RELS
5311             SET     RELATION_COL = p_Dim_Level_Rec.Bsc_Pk_Col
5312             WHERE   dim_level_id = cd.Dim_Level_Id
5313             AND     parent_dim_level_id = p_Dim_Level_Rec.Bsc_Level_Id
5314             AND     relation_type = 1;
5315 
5316             --Due to DB restrictions, index can't be created if length is > 30 characters.
5317             IF (LENGTH(l_index_Name) <= 30) THEN
5318                 l_sql_stmt    :=  ' CREATE INDEX '||l_index_Name||' '||
5319                                   ' ON '||l_master_table||' ('||p_Dim_Level_Rec.Bsc_Pk_Col||') '||' '||
5320                                   ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(BSC_APPS.Dimension_Index_Tbs_Type)||' '||BSC_APPS.bsc_storage_clause;
5321                 BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_index, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5322             END IF;
5323         ELSIF (p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size) THEN
5324             l_Create_View   := TRUE;
5325 
5326             l_sql_stmt  :=  ' ALTER TABLE '||l_master_table||
5327                             ' MODIFY '||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
5328                             ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') ';
5329 
5330             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_master_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5331 
5332             l_sql_stmt  :=  ' ALTER TABLE '||l_input_table||
5333                             ' MODIFY '||p_Dim_Level_Rec.Bsc_Pk_Col||'_USR '||
5334                             ' VARCHAR2('||p_Dim_Level_Rec.Bsc_Level_User_Key_Size||') ';
5335 
5336             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.alter_table, l_input_table, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5337         END IF;
5338         IF (l_Create_View) THEN
5339             l_col_names :=  NULL;
5340             FOR cd IN c_view_cols LOOP
5341                 IF (l_col_names IS NULL )THEN
5342                     l_col_names   :=  cd.column_name;
5343                 ELSE
5344                     l_col_names   :=  l_col_names ||', '|| cd.column_name;
5345                 END IF;
5346             END LOOP;
5347 
5348             l_sql_stmt  :=  ' CREATE OR REPLACE VIEW '||l_view_name||' AS ('  ||
5349                             ' SELECT '||l_col_names||
5350                             ' FROM   '||l_master_table||
5351                             ' WHERE LANGUAGE = USERENV(''LANG''))';
5352 
5353             BSC_APPS.Do_Ddl_AT(l_sql_stmt,   ad_ddl.create_view, l_view_name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
5354         END IF;
5355 
5356         --Now synch up the MLOG tables with the new User_Key_Size and Disp_Key_Size
5357 
5358         IF ((p_Dim_Level_Rec.Bsc_Level_User_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_User_Key_Size)
5359             OR (p_Dim_Level_Rec.Bsc_Level_Disp_Key_Size <> p_Dim_Level_Rec_Old.Bsc_Level_Disp_Key_Size)
5360             OR(UPPER(p_Dim_Level_Rec.Bsc_Pk_Col) <> UPPER(p_Dim_Level_Rec_Old.Bsc_Pk_Col))) THEN
5361             IF NOT (BSC_SYNC_MVLOGS.Sync_dim_table_mv_log(l_master_table,l_error_msg)) THEN
5362                 RAISE e_mlog_exception;
5363             END IF;
5364         END IF;
5365     END LOOP;
5366 
5367     RETURN TRUE;
5368 EXCEPTION
5369     WHEN e_mlog_exception THEN
5370         IF (c_Parent_Index_Name%ISOPEN) THEN
5371           CLOSE c_Parent_Index_Name;
5372         END IF;
5373         ROLLBACK TO AlterBSCOnexNPMD;
5374         x_msg_data      := NULL;
5375         x_msg_data      := l_error_msg || ' -> BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables ';
5376         x_return_status :=  FND_API.G_RET_STS_ERROR;
5377         RETURN FALSE;
5378     WHEN FND_API.G_EXC_ERROR THEN
5379         IF (c_Parent_Index_Name%ISOPEN) THEN
5380             CLOSE c_Parent_Index_Name;
5381         END IF;
5382         ROLLBACK TO AlterBSCOnexNPMD;
5383         IF (x_msg_data IS NULL) THEN
5384             FND_MSG_PUB.Count_And_Get
5385             (      p_encoded   =>  FND_API.G_FALSE
5386                ,   p_count     =>  x_msg_count
5387                ,   p_data      =>  x_msg_data
5388             );
5389         END IF;
5390         x_return_status :=  FND_API.G_RET_STS_ERROR;
5391         RETURN FALSE;
5392     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5393         IF (c_Parent_Index_Name%ISOPEN) THEN
5394             CLOSE c_Parent_Index_Name;
5395         END IF;
5396         ROLLBACK TO AlterBSCOnexNPMD;
5397         IF (x_msg_data IS NULL) THEN
5398             FND_MSG_PUB.Count_And_Get
5399             (      p_encoded   =>  FND_API.G_FALSE
5400                ,   p_count     =>  x_msg_count
5401                ,   p_data      =>  x_msg_data
5402             );
5403         END IF;
5404         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5405         RETURN FALSE;
5406     WHEN NO_DATA_FOUND THEN
5407         IF (c_Parent_Index_Name%ISOPEN) THEN
5408             CLOSE c_Parent_Index_Name;
5409         END IF;
5410         ROLLBACK TO AlterBSCOnexNPMD;
5411         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5412         IF (x_msg_data IS NOT NULL) THEN
5413             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables ';
5414         ELSE
5415             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables ';
5416         END IF;
5417         RETURN FALSE;
5418     WHEN OTHERS THEN
5419         IF (c_Parent_Index_Name%ISOPEN) THEN
5420             CLOSE c_Parent_Index_Name;
5421         END IF;
5422         ROLLBACK TO AlterBSCOnexNPMD;
5423         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5424         IF (x_msg_data IS NOT NULL) THEN
5425             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables ';
5426         ELSE
5427             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Alter_One_By_N_Tables ';
5428         END IF;
5429         RETURN FALSE;
5430 END Alter_One_By_N_Tables;
5431 /********************************************************************************
5432       FUNCTION TO CHECK IF PASSED PARAMETER IS IS A SQL KEY-WORD OR NOT
5433 ********************************************************************************/
5434 FUNCTION is_SQL_Key_Word
5435 (
5436     p_value   IN  VARCHAR2
5437 ) RETURN BOOLEAN IS
5438     l_key_words VARCHAR2(3000);
5439     l_result    VARCHAR2(30);
5440     l_value     VARCHAR2(30);
5441     l_flag      BOOLEAN  :=  FALSE;
5442 BEGIN
5443     IF(p_value IS NULL) THEN
5444         RETURN l_flag;
5445     ELSE
5446         l_key_words := 'ACCESS, ADD, ALL, ALTER, AND, ANY, ARRAY, AS, ASC, AT, AUDIT, AUTHID, AVG, BEGIN, BETWEEN, BINARY_INTEGER, ';
5447         l_key_words :=  l_key_words||'BODY, BOOLEAN, BULK, BY, CASE, CHAR, CHAR_BASE, CHECK, CLOSE, CLUSTER, COALESCE, COLLECT, ';
5448         l_key_words :=  l_key_words||'COLUMN, COMMENT, COMMIT, COMPRESS, CONNECT, CONSTANT, CREATE, CURRENT, CURRVAL, CURSOR, DATE, ';
5449         l_key_words :=  l_key_words||'DAY, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DO, DROP, ELSE, ELSIF, END, ';
5450         l_key_words :=  l_key_words||'EXCEPTION, EXCLUSIVE, EXECUTE, EXISTS, EXIT, EXTENDS, EXTRACT, FALSE, FETCH, FILE, FLOAT, ';
5451         l_key_words :=  l_key_words||'FOR, FORALL, FROM, FUNCTION, GOTO, GRANT, GROUP, HAVING, HEAP, HOUR, IDENTIFIED, IF, ';
5452         l_key_words :=  l_key_words||'IMMEDIATE, IN, INCREMENT, INDEX, INDICATOR, INITIAL, INSERT, INTEGER, INTERFACE, ';
5453         l_key_words :=  l_key_words||'INTERSECT, INTERVAL, INTO, IS, ISOLATION, JAVA, LEVEL, LIKE, LIMITED, LOCK, LONG, LOOP, ';
5454         l_key_words :=  l_key_words||'MAX, MAXEXTENTS, MIN, MINUS, MINUTE, MLSLABEL, MOD, MODE, MODIFY, MONTH, NATURAL, NATURALN, ';
5455         l_key_words :=  l_key_words||'NEW, NEXTVAL, NOAUDIT, NOCOMPRESS, NOCOPY, NOT, NOWAIT, NULL, NULLIF, NUMBER, NUMBER_BASE, ';
5456         l_key_words :=  l_key_words||'OCIROWID, OF, OFFLINE, ON, ONLINE, OPAQUE, OPEN, OPERATOR, OPTION, OR, ORDER, ORGANIZATION, ';
5457         l_key_words :=  l_key_words||'OTHERS, OUT, PACKAGE, PARTITION, PCTFREE, PLS_INTEGER, POSITIVE, POSITIVEN, PRAGMA, PRIOR, ';
5458         l_key_words :=  l_key_words||'PRIVATE, PRIVILEGES, PROCEDURE, PUBLIC, RAISE, RANGE, RAW, REAL, RECORD, REF, RELEASE, ';
5459         l_key_words :=  l_key_words||'RENAME, RESOURCE, RETURN, REVERSE, REVOKE, ROLLBACK, ROW, ROWID, ROWNUM, ROWS, ROWTYPE, ';
5460         l_key_words :=  l_key_words||'SAVEPOINT, SECOND, SELECT, SEPARATE, SESSION, SET, SHARE, SIZE, SMALLINT, SPACE, SQL, ';
5461         l_key_words :=  l_key_words||'SQLCODE, SQLERRM, START, STDDEV, SUBTYPE, SUCCESSFUL, SUM, SYNONYM, SYSDATE, TABLE, THEN, ';
5462         l_key_words :=  l_key_words||'TIME, TIMESTAMP, TIMEZONE_ABBR, TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_REGION, TO, ';
5463         l_key_words :=  l_key_words||'TRIGGER, TRUE, TYPE, UI, UID, UNION, UNIQUE, UPDATE, USER, VALIDATE, VALUES, VARCHAR, ';
5464         l_key_words :=  l_key_words||'VARCHAR2, VIEW, WHENEVER, WHERE, WITH ';
5465         l_value     :=  UPPER(p_value);
5466         WHILE (is_more(     p_dim_short_names  =>  l_key_words
5467                         ,   p_dim_name         =>  l_result)
5468         ) LOOP
5469             IF(l_result = l_value) THEN
5470                 l_flag  :=  TRUE;
5471                 EXIT;
5472             END IF;
5473         END LOOP;
5474         RETURN l_flag;
5475     END IF;
5476 END is_SQL_Key_Word;
5477 
5478 FUNCTION get_bis_dimension_id
5479 (
5480    p_dim_short_name   IN  VARCHAR2
5481 ) RETURN NUMBER IS
5482     CURSOR c_dim_short_name IS
5483     SELECT dimension_id
5484     FROM   BIS_DIMENSIONS
5485     WHERE  short_name = p_dim_short_name;
5486 
5487     l_dim_id    BISFV_DIMENSION_LEVELS.dimension_id%TYPE;
5488 BEGIN
5489     IF (c_dim_short_name%ISOPEN) THEN
5490         CLOSE c_dim_short_name;
5491     END IF;
5492     OPEN  c_dim_short_name;
5493         FETCH  c_dim_short_name  INTO l_dim_id;
5494     CLOSE  c_dim_short_name;
5495     RETURN l_dim_id;
5496 END get_bis_dimension_id;
5497 
5498 /********************************************************************************
5499     WARNING : -
5500     This function will return false if any changes to Dimensions, Dimension-Objects
5501     will results in structural changes. This is designed to fulfil the UI screen
5502     need and not a generic function so it should not be called internally from any
5503     other APIs without proper impact analysis.
5504 ********************************************************************************/
5505 FUNCTION is_KPI_Flag_For_DimObject
5506 (       p_dim_obj_short_name        IN          VARCHAR2
5507     ,   p_Source                    IN          VARCHAR2
5508     ,   p_source_table              IN          VARCHAR2
5509     ,   p_table_column              IN          VARCHAR2
5510     ,   p_prototype_default_value   IN          VARCHAR2
5511     ,   p_maximum_code_size         IN          NUMBER
5512     ,   p_maximum_name_size         IN          NUMBER
5513     ,   p_dim_short_names           IN          VARCHAR2
5514 ) RETURN VARCHAR2 IS
5515     l_Msg_Data              VARCHAR2(32000);
5516     l_msg_count             NUMBER;
5517 
5518     l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
5519     l_dim_Grp_name          BSC_SYS_DIM_GROUPS_TL.short_name%TYPE;
5520     l_MTab_Tbl              BSC_BIS_DIM_OBJ_PUB.KPI_Dim_Set_Table_Type;
5521 
5522     l_count                 NUMBER;
5523     l_strut_flag            BOOLEAN := FALSE;
5524     l_child_struct_flag     BOOLEAN := FALSE;
5525     l_flag                  BOOLEAN;
5526     l_counter               NUMBER := 0;
5527     l_duplicate_flag        BOOLEAN;
5528 
5529     l_kpi_names             VARCHAR2(8000);
5530     l_new_dim_Grps          VARCHAR2(8000);
5531     l_old_dim_Grps          VARCHAR2(8000);
5532     l_child_dim_obj_list    VARCHAR2 (32000);
5533 
5534     CURSOR   c_Old_Dim_Obj_Rec  IS
5535     SELECT   dim_level_id
5536           ,  level_table_name
5537           ,  user_key_size
5538           ,  disp_key_size
5539           ,  NVL(source, 'BSC')
5540           ,  abbreviation
5541           ,  level_pk_col
5542     FROM     BSC_SYS_DIM_LEVELS_VL
5543     WHERE    short_name = p_dim_obj_short_name;
5544 
5545     CURSOR   c_Dimension_Names IS
5546     SELECT   Short_Name
5547     FROM     BSC_SYS_DIM_GROUPS_VL
5548     WHERE    dim_group_id IN
5549             (SELECT  dim_group_id
5550              FROM    BSC_SYS_DIM_LEVELS_BY_GROUP
5551              WHERE   dim_level_id = l_bsc_dim_obj_rec.Bsc_Level_Id);
5552 
5553     CURSOR   c_Kpi_Dim_Set IS
5554     SELECT   DISTINCT C.Name||'['||C.Indicator||']' Name
5555             , C.Indicator
5556     FROM     BSC_KPI_DIM_LEVELS_B    A
5557           ,  BSC_SYS_DIM_LEVELS_B    D
5558           ,  BSC_KPIS_VL             C
5559     WHERE    A.Level_Table_Name      =  D.Level_Table_Name
5560     AND      D.Dim_Level_Id          =  l_bsc_dim_obj_rec.Bsc_Level_Id
5561     AND      C.share_flag           <>  2
5562     AND      C.Indicator             =  A.Indicator;
5563 
5564     CURSOR   c_Kpi_Dim_Set1 IS
5565     SELECT   DISTINCT C.Name||'['||C.Indicator||']' Name
5566             ,C.Indicator
5567     FROM     BSC_KPI_DIM_LEVELS_B    A
5568           ,  BSC_SYS_DIM_LEVELS_B    D
5569           ,  BSC_KPIS_VL             C
5570     WHERE    A.Level_Table_Name      =  D.Level_Table_Name
5571     AND      C.share_flag           <>  2
5572     AND      C.Indicator             =  A.Indicator
5573     AND      INSTR(','||l_child_dim_obj_list||',', ','||D.dim_level_id||',') > 0;
5574 
5575     CURSOR   c_Dim_Set_Kpi IS
5576     SELECT   DISTINCT B.Name||'['||B.Indicator||']' Name
5577             ,B.Indicator
5578     FROM     BSC_KPI_DIM_GROUPS     A
5579           ,  BSC_KPIS_VL            B
5580           ,  BSC_SYS_DIM_GROUPS_VL  C
5581     WHERE    A.INDICATOR      =  B.INDICATOR
5582     AND      A.dim_group_id   =  C.Dim_Group_ID
5583     AND      B.share_flag    <>  2
5584     AND      INSTR(l_new_dim_Grps, ','||C.Short_Name||',') > 0;
5585 BEGIN
5586 
5587     FND_MSG_PUB.Initialize;
5588     IF ((p_dim_obj_short_name IS NULL) AND (p_Source IS NULL)) THEN
5589         RETURN NULL;
5590     END IF;
5591     IF (NOT BSC_UTILITY.isBscInProductionMode()) THEN
5592         RETURN NULL;
5593     END IF;
5594 
5595     IF (p_dim_obj_short_name IS NOT NULL) THEN
5596         OPEN c_old_dim_obj_rec;
5597             FETCH    c_old_dim_obj_rec
5598             INTO     l_bsc_dim_obj_rec.Bsc_Level_Id
5599                    , l_bsc_dim_obj_rec.Bsc_Level_Name
5600                    , l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size
5601                    , l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size
5602                    , l_bsc_dim_obj_rec.Bsc_Source
5603                    , l_bsc_dim_obj_rec.Bsc_Level_Abbreviation
5604                    , l_bsc_dim_obj_rec.Bsc_Pk_Col;
5605         CLOSE c_old_dim_obj_rec;
5606         IF (l_bsc_dim_obj_rec.Bsc_Level_Id IS NULL) THEN
5607            RETURN NULL;
5608         END IF;
5609         IF (l_bsc_dim_obj_rec.Bsc_Source <> 'BSC') THEN
5610             RETURN NULL;
5611         END IF;
5612         IF ((l_bsc_dim_obj_rec.Bsc_Level_Name <> NVL(p_source_table, l_bsc_dim_obj_rec.Bsc_Level_Name)) OR
5613                 (l_bsc_dim_obj_rec.Bsc_Pk_Col <> NVL(p_table_column, l_bsc_dim_obj_rec.Bsc_Pk_Col)))THEN
5614                 l_strut_flag := TRUE;
5615         END IF;
5616 
5617         l_counter :=0;
5618 
5619         IF (l_strut_flag) THEN
5620             FOR cd IN c_kpi_dim_set LOOP
5621                 l_MTab_Tbl(l_counter).p_kpi_id :=  cd.Indicator;
5622                 l_MTab_Tbl(l_counter).p_Name   :=  cd.Name;
5623                 l_counter :=  l_counter + 1;
5624             END LOOP;
5625         END IF;
5626     ELSIF (p_Source <> 'BSC') THEN
5627         RETURN NULL;
5628     END IF;
5629     l_new_dim_Grps   :=  ',';
5630     IF ((l_bsc_dim_obj_rec.Bsc_Level_Id IS NULL) AND (p_dim_short_names IS NOT NULL)) THEN
5631         l_old_dim_Grps   :=  UPPER(p_dim_short_names);
5632         WHILE (is_more(p_dim_short_names   =>  l_old_dim_Grps
5633                    ,   p_dim_name          =>  l_dim_Grp_name
5634         )) LOOP
5635             l_strut_flag   :=  TRUE;
5636             l_new_dim_Grps :=  l_new_dim_Grps||l_dim_Grp_name||',';
5637         END LOOP;
5638     ELSIF (p_dim_short_names IS NOT NULL) THEN
5639         l_old_dim_Grps   :=  UPPER(p_dim_short_names);
5640         WHILE (is_more(p_dim_short_names   =>  l_old_dim_Grps
5641                      , p_dim_name          =>  l_dim_Grp_name
5642         )) LOOP
5643             SELECT  COUNT(0)
5644             INTO    l_count
5645             FROM    BSC_SYS_DIM_LEVELS_BY_GROUP   A
5646                  ,  BSC_SYS_DIM_GROUPS_VL         B
5647             WHERE   A.Dim_Level_Id      =    l_bsc_dim_obj_rec.Bsc_Level_Id
5648             AND     B.Short_Name        =    l_dim_Grp_name
5649             AND     B.Dim_Group_Id      =    A.Dim_Group_Id;
5650 
5651             IF (l_count = 0) THEN
5652                 l_strut_flag   :=  TRUE;
5653                 l_new_dim_Grps :=  l_new_dim_Grps||l_dim_Grp_name||',';
5654             END IF;
5655         END LOOP;
5656     END IF;
5657 
5658     IF (l_bsc_dim_obj_rec.Bsc_Level_Id IS NOT NULL) THEN
5659         FOR cd IN c_dimension_names LOOP
5660             l_flag           :=  TRUE;
5661             IF (p_dim_short_names IS NOT NULL) THEN
5662                 l_old_dim_Grps   :=  UPPER(p_dim_short_names);
5663 
5664                 WHILE (is_more(p_dim_short_names   =>  l_old_dim_Grps
5665                            ,   p_dim_name          =>  l_dim_Grp_name
5666                 )) LOOP
5667 
5668                     IF (l_dim_Grp_name = cd.Short_Name) THEN
5669                        l_flag   := FALSE;
5670                        EXIT;
5671                     END IF;
5672                 END LOOP;
5673             END IF;
5674             IF (l_flag) THEN
5675                 l_new_dim_Grps :=  l_new_dim_Grps||cd.Short_Name||',';
5676             END IF;
5677         END LOOP;
5678     END IF;
5679 
5680     IF ((l_new_dim_Grps IS NOT NULL) AND (l_new_dim_Grps  <>  ',')) THEN
5681         FOR cd IN c_dim_set_kpi LOOP
5682             l_duplicate_flag := FALSE;
5683             FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
5684                 IF(l_MTab_Tbl(i).p_kpi_id=cd.Indicator)THEN
5685                     l_duplicate_flag := TRUE;
5686                     EXIT;
5687                 END IF;
5688             END LOOP;
5689 
5690             IF(NOT l_duplicate_flag) THEN
5691                 l_MTab_Tbl(l_counter).p_kpi_id :=  cd.Indicator;
5692                 l_MTab_Tbl(l_counter).p_Name   :=  cd.Name;
5693                 l_counter :=  l_counter + 1;
5694             END IF;
5695         END LOOP;
5696     END IF;
5697 
5698     FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
5699       IF(l_kpi_names IS NULL)THEN
5700         l_kpi_names := l_MTab_Tbl(i).p_Name;
5701       ELSE
5702         l_kpi_names := l_kpi_names||', '||l_MTab_Tbl(i).p_Name;
5703       END IF;
5704     END LOOP;
5705 
5706     IF (l_kpi_names IS NOT NULL) THEN
5707         FND_MESSAGE.SET_NAME('BSC','BSC_PMD_KPI_STRUCT_INVALID');
5708         FND_MESSAGE.SET_TOKEN('INDICATORS', l_kpi_names);
5709         FND_MSG_PUB.ADD;
5710         RAISE FND_API.G_EXC_ERROR;
5711     END IF;
5712     /***********************************************************
5713       Check for display format changes here
5714     /************************************************************/
5715     IF((l_kpi_names IS NULL) AND (p_Source ='BSC'))THEN
5716       IF(BSC_BIS_DIM_OBJ_PUB.is_Obj_Display_Frmt_Change
5717          (
5718                 p_dim_obj_short_name     => p_dim_obj_short_name
5719             ,   p_Source                 => p_Source
5720             ,   p_source_table           => p_source_table
5721             ,   p_table_column           => p_table_column
5722             ,   p_prototype_default_value=> p_prototype_default_value
5723             ,   p_maximum_code_size      => p_maximum_code_size
5724             ,   p_maximum_name_size      => p_maximum_name_size
5725             ,   p_dim_short_names        => p_dim_short_names
5726             ,   x_obj_names              => l_kpi_names
5727          ))THEN
5728          IF(l_kpi_names IS NOT NULL)THEN
5729            FND_MESSAGE.SET_NAME('BSC','BSC_CHANG_OBJ_DISP_FORMAT');
5730            FND_MESSAGE.SET_TOKEN('OBJS', l_kpi_names);
5731            FND_MSG_PUB.ADD;
5732            RAISE FND_API.G_EXC_ERROR;
5733          END IF;
5734       END IF;
5735     END IF;
5736 
5737     RETURN NULL;
5738 EXCEPTION
5739     WHEN FND_API.G_EXC_ERROR THEN
5740         IF (l_Msg_Data IS NULL) THEN
5741             FND_MSG_PUB.Count_And_Get
5742             (      p_encoded   =>  FND_API.G_FALSE
5743                ,   p_count     =>  l_msg_count
5744                ,   p_data      =>  l_Msg_Data
5745             );
5746         END IF;
5747         RETURN l_Msg_Data;
5748     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5749         IF (l_Msg_Data IS NULL) THEN
5750             FND_MSG_PUB.Count_And_Get
5751             (      p_encoded   =>  FND_API.G_FALSE
5752                ,   p_count     =>  l_msg_count
5753                ,   p_data      =>  l_Msg_Data
5754             );
5755         END IF;
5756         RETURN l_Msg_Data;
5757     WHEN OTHERS THEN
5758         RETURN NULL;
5759 END is_KPI_Flag_For_DimObject;
5760 
5761 FUNCTION is_config_impact_dim_obj
5762 (       p_Dim_Obj_Short_Name        IN          VARCHAR2
5763     ,   p_Dim_Short_Names           IN          VARCHAR2
5764 ) RETURN VARCHAR2 IS
5765 
5766    TYPE index_by_table IS Record
5767    (       p_no_dim_object       VARCHAR2(32000)
5768    );
5769    TYPE index_by_table_type IS TABLE OF index_by_table INDEX BY BINARY_INTEGER;
5770    TYPE index_by_table_kpi IS Record
5771    (
5772            kpi_id     NUMBER
5773         ,  dim_set_id NUMBER
5774    );
5775    TYPE index_by_table_type_kpi IS TABLE OF index_by_table_kpi INDEX BY BINARY_INTEGER;
5776    dim_objs_array index_by_table_type;
5777    kpi_dim_set_array index_by_table_type_kpi;
5778    l_dim_sht_names       VARCHAR2(32000);
5779    l_dim_short_name      VARCHAR2(32000);
5780    l_kpi_id              NUMBER;
5781    l_dim_set_id          NUMBER;
5782    l_is_found            BOOLEAN;
5783    l_count_temp          NUMBER;
5784    l_Msg_Data            VARCHAR2(32000);
5785    l_msg_count           NUMBER;
5786 
5787    CURSOR cr_kpidimset_dim IS
5788    SELECT   A. INDICATOR
5789            ,A.DIM_SET_ID
5790    FROM     BSC_KPI_DIM_GROUPS A
5791            ,BSC_SYS_DIM_GROUPS_VL B
5792    WHERE    A.DIM_GROUP_ID = B.DIM_GROUP_ID
5793    AND      B.SHORT_NAME =  l_dim_short_name;
5794 
5795    CURSOR cr_dimobj_in_dimset IS
5796    SELECT B.SHORT_NAME
5797    FROM   BSC_SYS_DIM_LEVELS_B B
5798          ,BSC_KPI_DIM_LEVEL_PROPERTIES KDL
5799    WHERE  B.DIM_LEVEL_ID = KDL.DIM_LEVEL_ID
5800    AND    KDL.indicator = l_kpi_id
5801    AND    KDL.dim_set_id = l_dim_set_id;
5802 
5803    i NUMBER;
5804    l_no_dim_object       VARCHAR2(32000);
5805 
5806 BEGIN
5807 
5808    FND_MSG_PUB.Initialize;
5809    IF(p_Dim_Short_Names IS NOT NULL) THEN
5810      l_dim_sht_names := p_Dim_Short_Names;
5811      WHILE(Is_More(p_dim_short_names => l_dim_sht_names,p_dim_name =>l_dim_short_name)) LOOP
5812        OPEN cr_kpidimset_dim ;
5813        -- bug#3405498 meastmon 28-jan-2004: The following is not supported in 8i
5814        --FETCH cr_kpidimset_dim  BULK COLLECT INTO kpi_dim_set_array;
5815        kpi_dim_set_array.delete;
5816        i:= 0;
5817        LOOP
5818            FETCH cr_kpidimset_dim INTO l_kpi_id, l_dim_set_id;
5819            EXIT WHEN cr_kpidimset_dim%NOTFOUND;
5820            i:= i+1;
5821            kpi_dim_set_array(i).kpi_id := l_kpi_id;
5822            kpi_dim_set_array(i).dim_set_id := l_dim_set_id;
5823        END LOOP;
5824        CLOSE cr_kpidimset_dim;
5825 
5826        FOR index_loop IN 1..(kpi_dim_set_array.COUNT) LOOP
5827          l_kpi_id := kpi_dim_set_array(index_loop).kpi_id;
5828          l_dim_set_id  := kpi_dim_set_array(index_loop).dim_set_id;
5829          l_is_found := FALSE;
5830          IF(cr_dimobj_in_dimset%ISOPEN) THEN
5831            CLOSE cr_dimobj_in_dimset;
5832          END IF;
5833          OPEN  cr_dimobj_in_dimset;
5834          -- bug#3405498 meastmon 28-jan-2004: The following is not supported in 8i
5835          --FETCH cr_dimobj_in_dimset  BULK COLLECT INTO dim_objs_array;
5836          dim_objs_array.delete;
5837          i:= 0;
5838          LOOP
5839              FETCH cr_dimobj_in_dimset INTO l_no_dim_object;
5840              EXIT WHEN cr_dimobj_in_dimset%NOTFOUND;
5841              i := i+1;
5842              dim_objs_array(i).p_no_dim_object := l_no_dim_object;
5843          END LOOP;
5844          CLOSE cr_dimobj_in_dimset;
5845 
5846          FOR index_loop IN 1..(dim_objs_array.COUNT) LOOP
5847            IF(p_Dim_Obj_Short_Name = dim_objs_array(index_loop).p_no_dim_object) THEN
5848              l_is_found := TRUE;
5849            END IF;
5850          END LOOP;
5851          IF((l_is_found = FALSE) AND  (dim_objs_array.COUNT >= BSC_BIS_KPI_MEAS_PUB.Config_Limit_Dim)) THEN
5852            FND_MESSAGE.SET_NAME('BSC','BSC_PMD_IMPACT_KPI_SPACE');
5853            FND_MESSAGE.SET_TOKEN('CONTINUE', BSC_APPS.Get_Lookup_Value('BSC_UI_KPIDESIGNER', 'YES'), TRUE);
5854            FND_MESSAGE.SET_TOKEN('CANCEL', BSC_APPS.Get_Lookup_Value('BSC_UI_KPIDESIGNER', 'NO'), TRUE);
5855            FND_MSG_PUB.ADD;
5856            RAISE FND_API.G_EXC_ERROR;
5857          END IF;
5858        END LOOP;
5859      END LOOP;
5860    END IF;
5861    IF(cr_dimobj_in_dimset%ISOPEN) THEN
5862      CLOSE cr_dimobj_in_dimset;
5863    END IF;
5864    IF(cr_kpidimset_dim%ISOPEN) THEN
5865      CLOSE cr_kpidimset_dim;
5866    END IF;
5867    RETURN NULL;
5868 EXCEPTION
5869    WHEN FND_API.G_EXC_ERROR THEN
5870      IF (l_Msg_Data IS NULL) THEN
5871        FND_MSG_PUB.Count_And_Get
5872        (      p_encoded   =>  FND_API.G_FALSE
5873           ,   p_count     =>  l_msg_count
5874           ,   p_data      =>  l_Msg_Data
5875        );
5876      END IF;
5877      IF(cr_kpidimset_dim%ISOPEN) THEN
5878        CLOSE cr_kpidimset_dim;
5879      END IF;
5880      IF(cr_dimobj_in_dimset%ISOPEN) THEN
5881        CLOSE cr_dimobj_in_dimset;
5882      END IF;
5883      RETURN  l_Msg_Data;
5884    WHEN OTHERS THEN
5885      IF(cr_kpidimset_dim%ISOPEN) THEN
5886             CLOSE cr_kpidimset_dim;
5887      END IF;
5888      IF(cr_dimobj_in_dimset%ISOPEN) THEN
5889             CLOSE cr_dimobj_in_dimset;
5890      END IF;
5891    RETURN NULL;
5892 END is_config_impact_dim_obj;
5893 /*******************************************************************************
5894 ********************************************************************************/
5895 FUNCTION Get_Dim_Obj_Source
5896 (   p_dim_obj_id IN NUMBER   := NULL
5897   , p_short_Name IN VARCHAR2 := NULL
5898 ) RETURN VARCHAR2 IS
5899     l_Data_Source BSC_SYS_DIM_LEVELS_B.Source%TYPE := NULL;
5900 
5901     CURSOR  c_dim_obj_source_id IS
5902     SELECT  Source
5903     FROM    BSC_SYS_DIM_LEVELS_B
5904     WHERE   Dim_Level_Id = p_dim_obj_id;
5905 
5906     CURSOR  c_dim_obj_source_name IS
5907     SELECT  Source
5908     FROM    BSC_SYS_DIM_LEVELS_B
5909     WHERE   Short_Name = p_short_Name;
5910 BEGIN
5911     IF (p_dim_obj_id IS NOT NULL) THEN
5912         IF (c_dim_obj_source_id%ISOPEN) THEN
5913             CLOSE c_dim_obj_source_id;
5914         END IF;
5915         OPEN c_dim_obj_source_id;
5916             FETCH    c_dim_obj_source_id INTO l_Data_Source;
5917         CLOSE c_dim_obj_source_id;
5918     ELSIF (p_short_Name IS NOT NULL) THEN
5919         IF (c_dim_obj_source_name%ISOPEN) THEN
5920             CLOSE c_dim_obj_source_name;
5921         END IF;
5922         OPEN c_dim_obj_source_name;
5923             FETCH    c_dim_obj_source_name INTO l_Data_Source;
5924         CLOSE c_dim_obj_source_name;
5925     END IF;
5926     RETURN  l_Data_Source;
5927 EXCEPTION
5928     WHEN OTHERS THEN
5929         IF (c_dim_obj_source_id%ISOPEN) THEN
5930             CLOSE c_dim_obj_source_id;
5931         END IF;
5932         IF (c_dim_obj_source_name%ISOPEN) THEN
5933             CLOSE c_dim_obj_source_name;
5934         END IF;
5935         RETURN NULL;
5936 END Get_Dim_Obj_Source;
5937 /*********************************************************************************************
5938                          Returns the Dimension Object ID of BIS
5939 *********************************************************************************************/
5940 FUNCTION Get_Bis_Dim_Obj_ID
5941 (  p_Short_Name  IN BIS_LEVELS.Short_Name%TYPE
5942 ) RETURN NUMBER IS
5943 
5944     l_dim_id    BIS_LEVELS.Level_ID%TYPE;
5945 
5946     CURSOR  c_Dim_Group_Id IS
5947     SELECT  Level_ID
5948     FROM    BIS_LEVELS
5949     WHERE   Short_Name  = p_Short_Name;
5950 BEGIN
5951     IF (c_Dim_Group_Id%ISOPEN) THEN
5952         CLOSE c_Dim_Group_Id;
5953     END IF;
5954     OPEN  c_Dim_Group_Id;
5955         FETCH  c_Dim_Group_Id  INTO l_dim_id;
5956     CLOSE  c_Dim_Group_Id;
5957     RETURN l_dim_id;
5958 EXCEPTION
5959     WHEN OTHERS THEN
5960         IF (c_Dim_Group_Id%ISOPEN) THEN
5961             CLOSE c_Dim_Group_Id;
5962         END IF;
5963         RETURN l_dim_id;
5964 END Get_Bis_Dim_Obj_ID;
5965 
5966 /*********************************************************************************************
5967                          Returns the Dimension Object ID of BSC
5968 *********************************************************************************************/
5969 FUNCTION Get_Bsc_Dim_Obj_ID
5970 (  p_Short_Name  IN BSC_SYS_DIM_LEVELS_B.Short_Name%TYPE
5971 ) RETURN NUMBER IS
5972 
5973     l_dim_id    BSC_SYS_DIM_LEVELS_B.Dim_Level_ID%TYPE;
5974 
5975     CURSOR  c_Dim_Group_Id IS
5976     SELECT  Dim_Level_ID
5977     FROM    BSC_SYS_DIM_LEVELS_B
5978     WHERE   Short_Name  = p_Short_Name;
5979 BEGIN
5980     IF (c_Dim_Group_Id%ISOPEN) THEN
5981         CLOSE c_Dim_Group_Id;
5982     END IF;
5983     OPEN  c_Dim_Group_Id;
5984         FETCH  c_Dim_Group_Id  INTO l_dim_id;
5985     CLOSE  c_Dim_Group_Id;
5986 
5987     RETURN l_dim_id;
5988 EXCEPTION
5989     WHEN OTHERS THEN
5990         IF (c_Dim_Group_Id%ISOPEN) THEN
5991             CLOSE c_Dim_Group_Id;
5992         END IF;
5993         RETURN l_dim_id;
5994 END Get_Bsc_Dim_Obj_ID;
5995 
5996 /*********************************************************************************************
5997                          Refresh BSC-PMF Dimension Object View of BSC
5998 *********************************************************************************************/
5999 PROCEDURE Refresh_BSC_PMF_Dim_View
6000 (       p_Short_Name          IN             VARCHAR2
6001     ,   x_return_status       OUT NOCOPY     VARCHAR2
6002     ,   x_msg_count           OUT NOCOPY     NUMBER
6003     ,   x_msg_data            OUT NOCOPY     VARCHAR2
6004 ) IS
6005     l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
6006     l_flag                  BOOLEAN;
6007 
6008     CURSOR    c_Pmf_Dim_Obj is
6009     SELECT    A.Short_Name
6010             , A.Source       PMF_Source
6011             , A.Level_Values_View_Name
6012             , A.Hide_In_Design
6013             , B.Level_Table_Name
6014             , B.Dim_Level_Id
6015     FROM      BIS_LEVELS             A
6016             , BSC_SYS_DIM_LEVELS_B   B
6017     WHERE     A.Short_Name        =  B.Short_Name
6018     AND       B.Source            = 'PMF'
6019     AND       A.Source            = 'OLTP';
6020 
6021     -- Cursor to filter out by SHORT_NAME
6022     CURSOR    c_Pmf_Dim_Obj_SN is
6023     SELECT    A.Short_Name
6024             , A.Source       PMF_Source
6025             , A.Level_Values_View_Name
6026             , A.Hide_In_Design
6027             , B.Level_Table_Name
6028             , B.Dim_Level_Id
6029     FROM      BIS_LEVELS             A
6030             , BSC_SYS_DIM_LEVELS_B   B
6031     WHERE     A.Short_Name        =  B.Short_Name
6032     AND       B.Source            = 'PMF'
6033     AND       A.Source            = 'OLTP'
6034     AND       B.Short_Name        = p_Short_Name;
6035 BEGIN
6036 
6037     IF (p_Short_Name IS NULL) THEN
6038         FOR PMF_CD IN c_Pmf_Dim_Obj LOOP
6039           IF (NVL(PMF_CD.Hide_In_Design,'F') <> 'T') THEN
6040             l_bsc_dim_obj_rec.Bsc_Source              :=  'PMF';
6041             l_bsc_dim_obj_rec.Bsc_Level_View_Name     :=   PMF_CD.Level_Table_Name;      -- name of BSC View to be refereshed
6042             l_bsc_dim_obj_rec.Bsc_Level_Name          :=   PMF_CD.Level_Values_View_Name;-- name of PMF View
6043             l_bsc_dim_obj_rec.Bsc_Level_Short_Name    :=   PMF_CD.Short_Name;
6044             l_bsc_dim_obj_rec.Source                  :=   PMF_CD.PMF_Source;
6045             l_bsc_dim_obj_rec.Bsc_Level_Id            :=   PMF_CD.Dim_Level_Id;
6046 
6047             -- Calls Initialize_Pmf_Recs and Create_Pmf_Views APIs
6048             BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs
6049             (       p_Dim_Level_Rec   => l_bsc_dim_obj_rec
6050                 ,   x_return_status   => x_return_status
6051                 ,   x_msg_count       => x_msg_count
6052                 ,   x_msg_data        => x_msg_data
6053             );
6054           END IF;
6055 
6056         END LOOP;
6057     ELSE
6058         FOR PMF_CD IN c_Pmf_Dim_Obj_SN LOOP
6059           IF (NVL(PMF_CD.Hide_In_Design,'F') <> 'T') THEN
6060             l_bsc_dim_obj_rec.Bsc_Source              :=  'PMF';
6061             l_bsc_dim_obj_rec.Bsc_Level_View_Name     :=   PMF_CD.Level_Table_Name;      -- name of BSC View to be refereshed
6062             l_bsc_dim_obj_rec.Bsc_Level_Name          :=   PMF_CD.Level_Values_View_Name;-- name of PMF View
6063             l_bsc_dim_obj_rec.Bsc_Level_Short_Name    :=   PMF_CD.Short_Name;
6064             l_bsc_dim_obj_rec.Source                  :=   PMF_CD.PMF_Source;
6065             l_bsc_dim_obj_rec.Bsc_Level_Id            :=   PMF_CD.Dim_Level_Id;
6066             -- Calls Initialize_Pmf_Recs and Create_Pmf_Views APIs
6067             BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs
6068             (       p_Dim_Level_Rec   => l_bsc_dim_obj_rec
6069                 ,   x_return_status   => x_return_status
6070                 ,   x_msg_count       => x_msg_count
6071                 ,   x_msg_data        => x_msg_data
6072             );
6073           END IF;
6074 
6075         END LOOP;
6076     END IF;
6077 EXCEPTION
6078     WHEN FND_API.G_EXC_ERROR THEN
6079         IF (x_msg_data IS NULL) THEN
6080             FND_MSG_PUB.Count_And_Get
6081             (      p_encoded   =>  FND_API.G_FALSE
6082                ,   p_count     =>  x_msg_count
6083                ,   p_data      =>  x_msg_data
6084             );
6085         END IF;
6086         x_return_status :=  FND_API.G_RET_STS_ERROR;
6087     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6088         IF (x_msg_data IS NULL) THEN
6089             FND_MSG_PUB.Count_And_Get
6090             (      p_encoded   =>  FND_API.G_FALSE
6091                ,   p_count     =>  x_msg_count
6092                ,   p_data      =>  x_msg_data
6093             );
6094         END IF;
6095         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6096     WHEN OTHERS THEN
6097         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6098         IF (x_msg_data IS NOT NULL) THEN
6099             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Refresh_BSC_PMF_Dim_View';
6100         ELSE
6101             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Refresh_BSC_PMF_Dim_View';
6102         END IF;
6103 END Refresh_BSC_PMF_Dim_View;
6104 --=======================================================================================
6105 
6106 /*********************************************************************************************
6107                          Remove BSC-PMF EDW Dimension Object View of BSC
6108 *********************************************************************************************/
6109 PROCEDURE Remove_BSC_PMF_EDW_Dim_View
6110 (       x_return_status       OUT NOCOPY     VARCHAR2
6111     ,   x_msg_count           OUT NOCOPY     NUMBER
6112     ,   x_msg_data            OUT NOCOPY     VARCHAR2
6113 ) IS
6114     l_sql            VARCHAR2(50);
6115     CURSOR    c_Pmf_Dim_Obj_Edw is
6116     SELECT    A.Short_Name
6117             , B.Level_Table_Name
6118     FROM      BIS_LEVELS           A
6119            ,  BSC_SYS_DIM_LEVELS_B B
6120     WHERE     A.Short_Name =  B.Short_Name
6121     AND       B.Source     = 'PMF'
6122     AND       A.Source     = 'EDW'
6123     AND       B.TABLE_TYPE = 1; -- Identify EDW with existing Views
6124 BEGIN
6125 
6126     FOR PMF_EDW IN c_Pmf_Dim_Obj_Edw LOOP
6127         UPDATE BSC_SYS_DIM_LEVELS_B
6128         SET    Table_Type  =  -1
6129         WHERE  Short_Name  =  PMF_EDW.Short_Name;
6130 
6131         l_sql := 'DROP VIEW ' || PMF_EDW.Level_Table_Name;
6132         BSC_APPS.Do_Ddl_AT(l_sql, ad_ddl.drop_view, PMF_EDW.Level_Table_Name, BSC_APPS.fnd_apps_schema, BSC_APPS.bsc_apps_short_name);
6133     END LOOP;
6134 EXCEPTION
6135     WHEN OTHERS THEN
6136         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6137         IF (x_msg_data IS NOT NULL) THEN
6138             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Remove_BSC_PMF_EDW_Dim_View';
6139         ELSE
6140             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Remove_BSC_PMF_EDW_Dim_View';
6141         END IF;
6142 END Remove_BSC_PMF_EDW_Dim_View;
6143 --=======================================================================================
6144 
6145 PROCEDURE Init_Create_Pmf_Recs
6146 (       p_Dim_Level_Rec     IN  OUT   NOCOPY    BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
6147     ,   x_return_status         OUT   NOCOPY    VARCHAR2
6148     ,   x_msg_count             OUT   NOCOPY    NUMBER
6149     ,   x_msg_data              OUT   NOCOPY    VARCHAR2
6150 ) IS
6151     l_flag                      BOOLEAN         :=  TRUE;
6152 BEGIN
6153     FND_MSG_PUB.Initialize;
6154     x_return_status := FND_API.G_RET_STS_SUCCESS;
6155 
6156     l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Initialize_Pmf_Recs
6157                 (     p_Dim_Level_Rec     =>  p_Dim_Level_Rec
6158                     , x_return_status     =>  x_return_status
6159                     , x_msg_count         =>  x_msg_count
6160                     , x_msg_data          =>  x_msg_data
6161                 );
6162 
6163     IF (l_flag) THEN
6164         l_flag  :=  BSC_BIS_DIM_OBJ_PUB.Create_Pmf_Views
6165                     (    p_Dim_Level_Rec  =>  p_Dim_Level_Rec
6166                        , x_return_status  =>  x_return_status
6167                        , x_msg_count      =>  x_msg_count
6168                        , x_msg_data       =>  x_msg_data
6169                     );
6170     END IF;
6171 
6172     -- This is called from concurrent programs and upgrade scripts
6173     -- so, we need to process all the Dimension Objects, even if some fail
6174 EXCEPTION
6175     WHEN FND_API.G_EXC_ERROR THEN
6176         IF (x_msg_data IS NULL) THEN
6177             FND_MSG_PUB.Count_And_Get
6178             (      p_encoded   =>  FND_API.G_FALSE
6179                ,   p_count     =>  x_msg_count
6180                ,   p_data      =>  x_msg_data
6181             );
6182         END IF;
6183         x_return_status :=  FND_API.G_RET_STS_ERROR;
6184     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6185         IF (x_msg_data IS NULL) THEN
6186             FND_MSG_PUB.Count_And_Get
6187             (      p_encoded   =>  FND_API.G_FALSE
6188                ,   p_count     =>  x_msg_count
6189                ,   p_data      =>  x_msg_data
6190             );
6191         END IF;
6192         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6193     WHEN NO_DATA_FOUND THEN
6194         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6195         IF (x_msg_data IS NOT NULL) THEN
6196             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs ';
6197         ELSE
6198             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs ';
6199         END IF;
6200     WHEN OTHERS THEN
6201         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6202         IF (x_msg_data IS NOT NULL) THEN
6203             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs ';
6204         ELSE
6205             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Init_Create_Pmf_Recs ';
6206         END IF;
6207 END Init_Create_Pmf_Recs;
6208 --=======================================================================================
6209 FUNCTION Get_Table_Type_Value(
6210              p_Short_Name IN BSC_SYS_DIM_LEVELS_B.Short_Name%TYPE
6211 ) RETURN NUMBER IS
6212 
6213   l_Return NUMBER;
6214 
6215 BEGIN
6216 
6217     SELECT TABLE_TYPE
6218     INTO   l_Return
6219     FROM   BSC_SYS_DIM_LEVELS_B
6220     WHERE  SHORT_NAME = p_Short_Name;
6221 
6222     RETURN l_Return;
6223 
6224 EXCEPTION
6225     WHEN OTHERS THEN
6226         RETURN -1;
6227 END Get_Table_Type_Value;
6228 
6229 
6230 FUNCTION Is_Default_Value(
6231     p_value IN  VARCHAR2
6232 ) RETURN BOOLEAN IS
6233 BEGIN
6234     IF (p_value is NULL) THEN
6235         RETURN FALSE;
6236     END IF;
6237 
6238     IF (UPPER(p_value) = 'PMD_1') THEN
6239         RETURN TRUE;
6240     ELSE
6241         RETURN FALSE;
6242     END IF;
6243 EXCEPTION
6244     WHEN OTHERS THEN
6245         RETURN FALSE;
6246 END Is_Default_Value;
6247 /********************************************************************
6248       Check no of independent dimension objects in dimension set
6249 *********************************************************************/
6250 
6251 PROCEDURE check_indp_dimobjs
6252 (
6253         p_dim_id                IN    NUMBER
6254     ,   x_return_status         OUT   NOCOPY    VARCHAR2
6255     ,   x_msg_count             OUT   NOCOPY    NUMBER
6256     ,   x_msg_data              OUT   NOCOPY    VARCHAR2
6257 ) IS
6258     l_kpi_id                NUMBER;
6259     l_dim_set_id            NUMBER;
6260     l_count                 NUMBER;
6261     l_indp_dimobj           NUMBER;
6262     l_affected_kpis         VARCHAR2(32000);
6263     l_kpi_name              VARCHAR2(20000);
6264     l_is_kpi_affected       BOOLEAN;
6265 
6266     CURSOR   cr_kpi_dimset_dimobj IS
6267     SELECT   LEV.INDICATOR,LEV.dim_set_id,COUNT(LEV.dim_level_index)
6268     FROM     BSC_KPI_DIM_LEVELS_B LEV,
6269              BSC_KPI_DIM_LEVEL_PROPERTIES prop
6270     WHERE    lev.INDICATOR = prop.INDICATOR
6271     AND      lev.dim_Set_id = prop.dim_set_id
6272     AND      prop.dim_level_id = p_dim_id
6273     GROUP BY lev.INDICATOR,lev.dim_set_id;
6274 
6275 
6276 BEGIN
6277     l_is_kpi_affected := FALSE;
6278     OPEN cr_kpi_dimset_dimobj;
6279     LOOP
6280         FETCH cr_kpi_dimset_dimobj INTO l_kpi_id,l_dim_set_id,l_count;
6281         EXIT WHEN cr_kpi_dimset_dimobj%NOTFOUND;
6282         IF( l_count > bsc_utility.NO_IND_DIM_OBJ_LIMIT) THEN
6283             l_indp_dimobj := 0;
6284             l_indp_dimobj := bsc_utility.get_nof_independent_dimobj
6285                              (    p_Kpi_Id        =>  l_kpi_id
6286                                 , p_Dim_Set_Id    =>  l_dim_set_id
6287                              );
6288             IF(l_indp_dimobj >bsc_utility.NO_IND_DIM_OBJ_LIMIT) THEN
6289                 SELECT NAME INTO l_kpi_name
6290                 FROM   BSC_KPIS_VL
6291                 WHERE  INDICATOR = l_kpi_id;
6292 
6293                 IF(l_affected_kpis IS NULL) THEN
6294                     l_affected_kpis := '['||l_kpi_name||']';
6295                 ELSE
6296                     IF(INSTR(l_affected_kpis,l_kpi_name) = 0) THEN
6297                         l_affected_kpis := l_affected_kpis ||','|| '['||l_kpi_name||']';
6298                     END IF;
6299                 END IF;
6300                 l_is_kpi_affected := TRUE;
6301             END IF;
6302 
6303         END IF;
6304     END LOOP;
6305     CLOSE cr_kpi_dimset_dimobj;
6306     IF(l_is_kpi_affected) THEN
6307         FND_MESSAGE.SET_NAME('BSC','BSC_IND_DIMOBJ_LIMIT');
6308         FND_MESSAGE.SET_TOKEN('NAME_LIST',l_affected_kpis);
6309         FND_MSG_PUB.ADD;
6310         RAISE FND_API.G_EXC_ERROR;
6311     END IF;
6312 
6313 EXCEPTION
6314 
6315     WHEN FND_API.G_EXC_ERROR THEN
6316         IF (cr_kpi_dimset_dimobj%ISOPEN) THEN
6317             CLOSE cr_kpi_dimset_dimobj;
6318         END IF;
6319         IF (x_msg_data IS NULL) THEN
6320             FND_MSG_PUB.Count_And_Get
6321             (      p_encoded   =>  FND_API.G_FALSE
6322                ,   p_count     =>  x_msg_count
6323                ,   p_data      =>  x_msg_data
6324             );
6325         END IF;
6326 
6327         x_return_status :=  FND_API.G_RET_STS_ERROR;
6328     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6329         IF (cr_kpi_dimset_dimobj%ISOPEN) THEN
6330             CLOSE cr_kpi_dimset_dimobj;
6331         END IF;
6332         IF (x_msg_data IS NULL) THEN
6333             FND_MSG_PUB.Count_And_Get
6334             (      p_encoded   =>  FND_API.G_FALSE
6335                ,   p_count     =>  x_msg_count
6336                ,   p_data      =>  x_msg_data
6337             );
6338         END IF;
6339         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6340 
6341     WHEN OTHERS THEN
6342         IF (cr_kpi_dimset_dimobj%ISOPEN) THEN
6343             CLOSE cr_kpi_dimset_dimobj;
6344         END IF;
6345         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6346         IF (x_msg_data IS NOT NULL) THEN
6347             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
6348         ELSE
6349             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Update_Dim_Object ';
6350         END IF;
6351 
6352 END check_indp_dimobjs;
6353 
6354 /*=======================================================================================
6355     This procedure will strip off the invalid characters(NLS Characters,some invalid characters
6356     from the given string and returns the valid string
6357 =======================================================================================*/
6358 FUNCTION  get_valid_ddlentry_frm_name(
6359     p_name          IN VARCHAR2
6360 )RETURN VARCHAR2 IS
6361 
6362 l_asc           number;
6363 l_valid_string   varchar2(80);
6364 l_char          varchar2(1);
6365 l_alias         VARCHAR2(30);
6366 
6367 BEGIN
6368      l_valid_string := null;
6369         -- Valid values - numbers/alphabets/underscore
6370     for i in 1..length(p_name) loop
6371         begin
6372             l_char := substr(p_name, i, 1);
6373         exception
6374             when others then
6375                 l_char := ' ';/* comsuming this exception as substr() will throw exception for NLS charactes and whole procedure is not being executed */
6376         end;
6377 
6378         l_asc := ascii(l_char);
6379         If ((l_asc >= 48 And l_asc <= 57)) or
6380             (l_asc >= 65 And l_asc <= 90) or
6381             (l_asc >= 97 And l_asc <= 122) or
6382             (l_asc = 95) Then
6383             l_valid_string := l_valid_string || l_char;
6384         end if;
6385     end loop;
6386 
6387     RETURN l_valid_string;
6388 
6389 EXCEPTION
6390     WHEN OTHERS THEN
6391         RETURN l_valid_string;
6392 END get_valid_ddlentry_frm_name;
6393 --=======================================================================================
6394 PROCEDURE Validate_PMF_Views
6395 ( p_Dim_Obj_Short_Name            IN  VARCHAR2
6396        , p_Dim_Obj_View_Name             IN  VARCHAR2
6397        , x_Return_Status                 OUT NOCOPY VARCHAR2
6398        , x_Msg_Count                     OUT NOCOPY NUMBER
6399        , x_Msg_Data                      OUT NOCOPY VARCHAR2
6400 )
6401 IS
6402   l_View_Return_Value   NUMBER;
6403   l_Count               NUMBER;
6404   l_Parent_Cols         VARCHAR2(2000);
6405   l_View_Name           VARCHAR2(30);
6406   l_Parent_Exists       VARCHAR2(1);
6407 
6408     CURSOR c_Rel_Levels IS
6409     SELECT   R.SHORT_NAME             CHILD_SHORT_NAME
6410            , R.RELATION_COL           PARENT_COL
6411            , L.LEVEL_VALUES_VIEW_NAME VIEW_NAME
6412     FROM     BSC_SYS_DIM_LEVEL_RELS_V R
6413            , BIS_LEVELS               L
6414     WHERE  R.SHORT_NAME  = L.SHORT_NAME
6415     AND    L.SHORT_NAME  = p_Dim_Obj_Short_Name
6416     AND    R.SOURCE      = 'PMF';
6417 
6418 BEGIN
6419 
6420     FND_MSG_PUB.Initialize;
6421     x_Return_Status     := FND_API.G_RET_STS_SUCCESS;
6422 
6423     l_Count := 0;
6424     l_Parent_Cols := NULL;
6425 
6426     FOR cRelLevels IN c_Rel_Levels LOOP
6427       IF (l_Count = 0) THEN
6428          l_Parent_Cols := cRelLevels.PARENT_COL;
6429          l_View_Name   := cRelLevels.VIEW_NAME;
6430       ELSE
6431          l_Parent_Cols := l_Parent_Cols ||', '||cRelLevels.PARENT_COL;
6432       END IF;
6433       l_Count := l_Count + 1;
6434 
6435     END LOOP;
6436 
6437     l_Parent_Exists := FND_API.G_FALSE;
6438 
6439     IF (l_Count = 0) THEN
6440        IF (p_Dim_Obj_View_Name IS NOT NULL) THEN
6441           l_View_Name := p_Dim_Obj_View_Name;
6442        ELSE
6443          BEGIN
6444             SELECT L.LEVEL_VALUES_VIEW_NAME
6445             INTO   l_View_Name
6446             FROM   BIS_LEVELS L
6447             WHERE  L.SHORT_NAME = p_Dim_Obj_Short_Name;
6448          EXCEPTION
6449             WHEN OTHERS THEN
6450               l_View_Name := NULL;
6451          END;
6452        END IF;
6453     ELSIF (l_Count > 0) THEN
6454        l_Parent_Exists := FND_API.G_TRUE;
6455     END IF;
6456 
6457     IF (p_Dim_Obj_Short_Name = 'HRI_PER_USRDR_H') THEN
6458       l_View_Return_Value := BSC_BIS_DIM_OBJ_PUB.Validate_PMF_Base_View_Mgr(
6459                                p_View_Name        => l_View_Name
6460                              , p_Parent_Id_Exists => l_Parent_Exists
6461                              , p_Parent_Column    => l_Parent_Cols
6462                              );
6463     ELSE
6464       l_View_Return_Value := BSC_BIS_DIM_OBJ_PUB.Validate_PMF_Base_View(
6465                                p_View_Name        => l_View_Name
6466                              , p_Parent_Id_Exists => l_Parent_Exists
6467                              , p_Parent_Column    => l_Parent_Cols
6468                              );
6469     END IF;
6470 
6471     IF (l_View_Return_Value = C_TABLE_NOT_EXIST) THEN
6472        x_Msg_Data  :=  'BSC_DIM_VIEW_NOT_EXIST';
6473        RAISE FND_API.G_EXC_ERROR;
6474     ELSIF (l_View_Return_Value = C_UNKNOWN_ERROR) THEN
6475        x_Msg_Data  :=  'BSC_DIM_VIEW_NOT_EXIST';
6476        RAISE FND_API.G_EXC_ERROR;
6477     ELSIF (l_View_Return_Value = C_COLUMN_NOT_EXIST) THEN
6478        x_Msg_Data  :=  'BSC_DIM_VIEW_INVALID';
6479        RAISE FND_API.G_EXC_ERROR;
6480     END IF;
6481 
6482 
6483 EXCEPTION
6484     WHEN FND_API.G_EXC_ERROR THEN
6485         x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6486     WHEN OTHERS THEN
6487         x_Msg_Data      :=  'BSC_DIM_VIEW_NOT_EXIST';
6488         x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6489 END Validate_PMF_Views;
6490 
6491 /*
6492   Validates BSC type dim object view source
6493 */
6494 PROCEDURE Validate_BSC_Views
6495 ( p_Dim_Obj_Short_Name            IN  VARCHAR2
6496 , x_Return_Status                 OUT NOCOPY VARCHAR2
6497 , x_Msg_Count                     OUT NOCOPY NUMBER
6498 , x_Msg_Data                      OUT NOCOPY VARCHAR2
6499 )
6500 IS
6501 
6502   l_flag  bsc_sys_dim_levels_b.table_type%TYPE;
6503   CURSOR c_bsc_table_type_flag IS
6504     SELECT table_type
6505       FROM bsc_sys_dim_levels_b
6506       WHERE short_name = p_Dim_Obj_Short_Name;
6507 
6508 BEGIN
6509 
6510   FND_MSG_PUB.Initialize;
6511   x_Return_Status := FND_API.G_RET_STS_SUCCESS;
6512 
6513   IF (c_bsc_table_type_flag%ISOPEN) THEN
6514     CLOSE c_bsc_table_type_flag;
6515   END IF;
6516 
6517   OPEN c_bsc_table_type_flag;
6518   FETCH c_bsc_table_type_flag INTO l_flag;
6519 
6520   IF (c_bsc_table_type_flag%FOUND) THEN
6521     IF (l_flag <> 1) THEN  -- '1' means that BSC view exists
6522       x_Msg_Data  :=  'BSC_DIM_VIEW_NOT_EXIST';
6523       RAISE FND_API.G_EXC_ERROR;
6524     END IF;
6525   END IF;
6526 
6527   CLOSE c_bsc_table_type_flag;
6528 
6529 EXCEPTION
6530   WHEN FND_API.G_EXC_ERROR THEN
6531     x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6532     IF (c_bsc_table_type_flag%ISOPEN) THEN
6533       CLOSE c_bsc_table_type_flag;
6534     END IF;
6535   WHEN OTHERS THEN
6536     x_Msg_Data      :=  'BSC_DIM_VIEW_NOT_EXIST';
6537     x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6538     IF (c_bsc_table_type_flag%ISOPEN) THEN
6539       CLOSE c_bsc_table_type_flag;
6540     END IF;
6541 END Validate_BSC_Views;
6542 
6543 /*
6544   Validates dim object view source.
6545   Called from Report Designer.
6546 */
6547 PROCEDURE Validate_Dim_object_Views
6548 ( p_Dim_Obj_Short_Name            IN  VARCHAR2
6549 , p_Dim_Obj_View_Name             IN  VARCHAR2
6550 , x_Return_Status                 OUT NOCOPY VARCHAR2
6551 , x_Msg_Count                     OUT NOCOPY NUMBER
6552 , x_Msg_Data                      OUT NOCOPY VARCHAR2
6553 )
6554 IS
6555 BEGIN
6556 
6557   FND_MSG_PUB.Initialize;
6558   x_Return_Status     := FND_API.G_RET_STS_SUCCESS;
6559 
6560   IF ('PMF' = BIS_PMF_GET_DIMLEVELS_PVT.get_dim_level_source(p_Dim_Obj_Short_Name)) THEN
6561     IF (INSTR(p_Dim_Obj_Short_Name, 'FII_ROLLING_') = 0) THEN
6562       Validate_PMF_Views
6563         ( p_Dim_Obj_Short_Name => p_Dim_Obj_Short_Name
6564         , p_Dim_Obj_View_Name  => p_Dim_Obj_View_Name
6565         , x_Return_Status      => x_Return_Status
6566         , x_Msg_Count          => x_Msg_Count
6567         , x_Msg_Data           => x_Msg_Data
6568         );
6569     END IF;
6570   ELSE
6571     Validate_BSC_Views
6572       ( p_Dim_Obj_Short_Name => p_Dim_Obj_Short_Name
6573       , x_Return_Status      => x_Return_Status
6574       , x_Msg_Count          => x_Msg_Count
6575       , x_Msg_Data           => x_Msg_Data
6576       );
6577   END IF;
6578 
6579 EXCEPTION
6580   WHEN FND_API.G_EXC_ERROR THEN
6581     x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6582   WHEN OTHERS THEN
6583     x_Msg_Data      :=  'BSC_DIM_VIEW_NOT_EXIST';
6584     x_Return_Status :=  FND_API.G_RET_STS_ERROR;
6585 END Validate_Dim_object_Views;
6586 
6587 --=======================================================================================
6588 FUNCTION Validate_PMF_Base_View (
6589              p_View_Name        IN VARCHAR2
6590            , p_Parent_Id_Exists IN VARCHAR2
6591            , p_Parent_Column    IN VARCHAR2
6592 ) RETURN NUMBER IS
6593   l_Sql            VARCHAR2(4000);
6594   l_Select_Clause  VARCHAR2(4000);
6595   l_Id             VARCHAR2(4000);
6596   l_Parent_Id      VARCHAR2(4000);
6597   l_Value          VARCHAR2(4000);
6598 
6599   l_Count          NUMBER := 0;
6600 BEGIN
6601 
6602   IF (p_View_Name IS NULL) THEN
6603     RETURN C_TABLE_NOT_EXIST;
6604   END IF;
6605 
6606   IF (p_Parent_Id_Exists = FND_API.G_TRUE) THEN
6607      IF (p_Parent_Column IS NOT NULL) THEN
6608         l_Select_Clause := C_SELECT_CLAUSE || ', ' || p_Parent_Column || ' ';
6609      ELSE
6610         l_Select_Clause := C_SELECT_PARENT_CLAUSE;
6611      END IF;
6612   ELSE
6613      l_Select_Clause := C_SELECT_CLAUSE;
6614   END IF;
6615 
6616   l_Sql :=    C_SELECT   || l_Select_Clause
6617            || C_FROM     || p_View_Name
6618            || C_WHERE    || C_WHERE_CLAUSE ;
6619 
6620   IF (p_Parent_Id_Exists = FND_API.G_TRUE) THEN
6621     l_Sql := 'SELECT COUNT(1) FROM ('|| l_Sql || ')' ;
6622     EXECUTE IMMEDIATE l_Sql INTO l_Count;
6623   ELSE
6624     EXECUTE IMMEDIATE l_Sql INTO l_Id, l_Value;
6625   END IF;
6626 
6627   RETURN C_SUCCESS_NO_ERROR;
6628 
6629 EXCEPTION
6630   WHEN NO_DATA_FOUND THEN
6631   -- Return success, view is ok, but there is no data
6632      RETURN C_SUCCESS_NO_ERROR;
6633 
6634   WHEN OTHERS THEN
6635     IF (SQLCODE = C_ORA_ERR_TAB_NOT_EXIST) THEN
6636       RETURN C_TABLE_NOT_EXIST;
6637     ELSIF ((SQLCODE = C_ORA_ERR_COL_NOT_EXIST) OR (SQLCODE = C_ORA_ERR_COL_NOT_EXIST1)) THEN
6638       RETURN C_COLUMN_NOT_EXIST;
6639     END IF;
6640 
6641     RETURN C_UNKNOWN_ERROR;
6642 END Validate_PMF_Base_View;
6643 
6644 
6645 FUNCTION Validate_PMF_Base_View_Mgr (
6646   p_view_name        IN VARCHAR2
6647 , p_parent_id_exists IN VARCHAR2
6648 , p_parent_column    IN VARCHAR2
6649 ) RETURN NUMBER
6650 IS
6651   l_col_name       VARCHAR2(30);
6652   l_view_status    VARCHAR2(100);
6653   l_is_id          BOOLEAN := FALSE;
6654   l_is_value       BOOLEAN := FALSE;
6655   l_is_parent_id   BOOLEAN := FALSE;
6656 
6657   CURSOR c_column_names IS
6658     SELECT column_name
6659       FROM user_tab_columns
6660       WHERE table_name = p_view_name;
6661 
6662   CURSOR c_view_status IS
6663     SELECT status
6664       FROM user_objects
6665       WHERE object_name = p_view_name
6666       AND   object_type = 'VIEW';
6667 BEGIN
6668 
6669   IF (p_view_name IS NULL) THEN
6670     RETURN C_TABLE_NOT_EXIST;
6671   END IF;
6672 
6673   IF (c_view_status%ISOPEN) THEN
6674     CLOSE c_view_status;
6675   END IF;
6676   OPEN c_view_status;
6677   FETCH c_view_status INTO l_view_status;
6678   IF (l_view_status IS NULL OR UPPER(l_view_status) <> 'VALID') THEN
6679     RETURN C_TABLE_NOT_EXIST;
6680   END IF;
6681   CLOSE c_view_status ;
6682 
6683   IF (c_column_names%ISOPEN) THEN
6684     CLOSE c_column_names;
6685   END IF;
6686   OPEN c_column_names;
6687   LOOP
6688     FETCH c_column_names INTO l_col_name;
6689     EXIT WHEN c_column_names%NOTFOUND;
6690     IF (UPPER(l_col_name) = 'ID') THEN
6691       l_is_id := TRUE;
6692     ELSIF (UPPER(l_col_name) = 'VALUE') THEN
6693       l_is_value := TRUE;
6694     ELSIF (UPPER(l_col_name) = p_parent_column) THEN
6695       l_is_parent_id := TRUE;
6696     END IF;
6697   END LOOP;
6698   CLOSE c_column_names ;
6699 
6700   IF (p_parent_id_exists = FND_API.G_TRUE AND p_parent_column IS NOT NULL) THEN
6701     IF ((NOT l_is_id) OR (NOT l_is_value) OR (NOT l_is_parent_id)) THEN
6702       RETURN C_COLUMN_NOT_EXIST;
6703     END IF;
6704   ELSE
6705     IF ((NOT l_is_id) OR (NOT l_is_value)) THEN
6706       RETURN C_COLUMN_NOT_EXIST;
6707     END IF;
6708   END IF;
6709 
6710   RETURN C_SUCCESS_NO_ERROR;
6711 
6712 EXCEPTION
6713   WHEN OTHERS THEN
6714     IF (c_column_names%ISOPEN) THEN
6715       CLOSE c_column_names;
6716     END IF;
6717     IF (c_view_status%ISOPEN) THEN
6718       CLOSE c_view_status;
6719     END IF;
6720     RETURN C_UNKNOWN_ERROR;
6721 END Validate_PMF_Base_View_Mgr;
6722 
6723 
6724 FUNCTION check_sametype_dims
6725 (       p_dim_obj_name              IN  VARCHAR2
6726     ,   p_dim_obj_short_name        IN  VARCHAR2
6727     ,   p_dim_obj_source            IN  VARCHAR2
6728     ,   p_dim_short_names           IN  VARCHAR2
6729     ,   p_Restrict_Dim_Validate     IN  VARCHAR2   := NULL
6730     ,   x_return_status             OUT    NOCOPY   VARCHAR2
6731     ,   x_msg_count                 OUT    NOCOPY   NUMBER
6732     ,   x_msg_data                  OUT    NOCOPY   VARCHAR2
6733 ) RETURN BOOLEAN
6734 IS
6735 
6736     l_source             VARCHAR2(20);
6737     l_true               BOOLEAN;
6738     l_dim_obj_name       VARCHAR2(32000);
6739     l_dim_name           VARCHAR2(32000);
6740     l_dim_grp_id         NUMBER;
6741     l_dim_short_name     VARCHAR2(32000);
6742     l_count              NUMBER;
6743     l_exist              NUMBER;
6744 
6745     CURSOR C_SOURCE_DIM IS
6746     SELECT DISTINCT SOURCE,DIM_NAME,DIM_ID,SHORT_NAME
6747     FROM BSC_BIS_DIM_VL
6748     WHERE SOURCE IS NOT NULL
6749     AND INSTR(','||p_dim_short_names ||',',','||short_name||',') > 0;
6750 
6751     CURSOR C_SOURCE_DIM_OBJS IS
6752     SELECT SYS.SOURCE,SYS.SHORT_NAME,SYS.NAME
6753     FROM   BSC_SYS_DIM_LEVELS_VL SYS,
6754            BSC_SYS_DIM_LEVELS_BY_GROUP GRP
6755     WHERE  SYS.dim_level_id = GRP.dim_level_id
6756     AND    GRP.dim_group_id = l_dim_grp_id;
6757 
6758 BEGIN
6759     x_return_status := FND_API.G_RET_STS_SUCCESS;
6760     l_true  := FALSE;
6761 
6762     -- added to relax checking for mixed type of Dimension Objects within a Dimension
6763     -- for Autogenerated reports and removing the disctiction, BSC 5.3
6764     IF (p_Restrict_Dim_Validate IS NOT NULL OR BIS_UTILITIES_PUB.Enable_Generated_Source_Report = FND_API.G_FALSE) THEN
6765         FOR CTYPE IN C_SOURCE_DIM LOOP
6766             l_dim_name       := CTYPE.DIM_NAME;
6767             l_dim_grp_id     := CTYPE.DIM_ID;
6768             l_dim_short_name := CTYPE.SHORT_NAME;
6769 
6770             SELECT COUNT(1) into l_count
6771             FROM  BSC_SYS_DIM_LEVELS_BY_GROUP GRP
6772             WHERE GRP.dim_group_id = l_dim_grp_id;
6773 
6774             SELECT COUNT(1) into l_exist
6775             FROM   BSC_SYS_DIM_LEVELS_VL SYS,
6776                    BSC_SYS_DIM_LEVELS_BY_GROUP GRP
6777             WHERE  SYS.dim_level_id = GRP.dim_level_id
6778             AND    GRP.dim_group_id = l_dim_grp_id
6779             AND    SYS.SHORT_NAME = p_dim_obj_short_name;
6780 
6781             IF (l_count >= bsc_utility.MAX_DIM_IN_DIM_SET AND l_exist = 0 AND p_dim_obj_source = 'BSC' AND CTYPE.SOURCE = 'BSC') THEN
6782                FND_MESSAGE.SET_NAME('BSC','BSC_DIM_SHUTTLE_OVERFLOW');
6783                FND_MSG_PUB.ADD;
6784                return TRUE;
6785             END IF;
6786 
6787             IF(CTYPE.SOURCE <> p_dim_obj_source AND BSC_UTILITY.Is_Internal_Dimension(l_dim_short_name) = FND_API.G_FALSE) THEN
6788                 l_true  :=  TRUE;
6789                 FOR CD IN C_SOURCE_DIM_OBJS LOOP
6790                     l_dim_obj_name := cd.name;
6791                     IF(l_source IS NULL) THEN
6792                         l_source := CD.SOURCE;
6793                     END IF;
6794                     IF ((l_dim_short_name = BSC_BIS_DIMENSION_PUB.Unassigned_Dim) AND
6795                         (l_source = 'BSC')) THEN
6796                         EXIT;
6797                     END IF;
6798                     IF((l_source <> CD.SOURCE)OR (l_source <> p_dim_obj_source)) THEN
6799                         EXIT;
6800                     END IF;
6801                 END LOOP;
6802                 EXIT;
6803             END IF;
6804         END LOOP;
6805 
6806         IF (l_true) THEN
6807             FND_MESSAGE.SET_NAME('BSC','BSC_DIM_DIMOBJ_MIXED_TYPE');
6808             FND_MESSAGE.SET_TOKEN('DIMENSION',  l_dim_name);
6809             FND_MESSAGE.SET_TOKEN('DIM_OBJECT', p_dim_obj_name);
6810             FND_MSG_PUB.ADD;
6811             return l_true;
6812         END IF;
6813     END IF;
6814 
6815     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
6816     RETURN l_true;
6817 
6818 EXCEPTION
6819     WHEN OTHERS THEN
6820         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6821         IF (x_msg_data IS NULL) THEN
6822             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIMENSION_PUB.is_Valid_Dim_Grp_Rels ';
6823         END IF;
6824 
6825         RETURN l_true;
6826 END check_sametype_dims;
6827 
6828 
6829 --=======================================================================================
6830 
6831 
6832 --=======================================================================================
6833 
6834 /************************************************************************
6835  Name   : is_Obj_Display_Frmt_Change
6836  Description    : This API will validate if the dimension object proeprties
6837                   will result in format changes.
6838                   Following properties of dimension object will result in
6839                   Format changes
6840                   1.p_maximum_code_size
6841                   2.p_maximum_name_size
6842                   3.p_prototype_default_value
6843 Input :  p_dim_obj_short_name : dim object short name
6844          p_Source             : Source of the dimension object
6845          p_source_table       : dim object table name
6846          p_table_column       : column name of the dimension object
6847          p_prototype_default_value : prototype prefix value for dim level values
6848          p_maximum_code_size  : size of the user code
6849          p_maximum_name_size  : size of the display key name
6850          p_dim_short_names    :  dimension short names within which this dim obj is assigned
6851 output   : x_obj_names  : comma separated objective names which are effected because of this change
6852            TRUE         : Display format has changed
6853            FALSE        : Display format has not changed
6854 /************************************************************************/
6855 
6856 FUNCTION is_Obj_Display_Frmt_Change
6857 (       p_dim_obj_short_name        IN          VARCHAR2
6858     ,   p_Source                    IN          VARCHAR2
6859     ,   p_source_table              IN          VARCHAR2
6860     ,   p_table_column              IN          VARCHAR2
6861     ,   p_prototype_default_value   IN          VARCHAR2
6862     ,   p_maximum_code_size         IN          NUMBER
6863     ,   p_maximum_name_size         IN          NUMBER
6864     ,   p_dim_short_names           IN          VARCHAR2
6865     ,   x_obj_names                 OUT NOCOPY  VARCHAR2
6866 ) RETURN BOOLEAN IS
6867 
6868   l_MTab_Tbl              BSC_BIS_DIM_OBJ_PUB.KPI_Dim_Set_Table_Type;
6869   l_bsc_dim_obj_rec       BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type;
6870   l_obj_names             VARCHAR2(8000);
6871   l_child_dim_obj_list    VARCHAR2 (32000);
6872   l_disp_format_flag      BOOLEAN := FALSE;
6873   l_child_disp_fm_flag    BOOLEAN := FALSE;
6874   l_counter               NUMBER;
6875   l_duplicate_flag        BOOLEAN;
6876   l_return_flag           BOOLEAN := FALSE;
6877   l_maximum_code_size     BSC_SYS_DIM_LEVELS_VL.user_key_size%TYPE;
6878   l_maximum_name_size     BSC_SYS_DIM_LEVELS_VL.disp_key_size%TYPE;
6879 
6880 
6881   CURSOR   c_Old_Dim_Obj_Rec  IS
6882   SELECT   dim_level_id
6883         ,  level_table_name
6884         ,  user_key_size
6885         ,  disp_key_size
6886         ,  NVL(source, 'BSC')
6887         ,  abbreviation
6888         ,  level_pk_col
6889   FROM     BSC_SYS_DIM_LEVELS_VL
6890   WHERE    short_name = p_dim_obj_short_name;
6891 
6892   CURSOR   c_Kpi_Dim_Set1 IS
6893   SELECT   DISTINCT C.Name||'['||C.Indicator||']' Name
6894           ,C.Indicator
6895   FROM     BSC_KPI_DIM_LEVELS_B    A
6896         ,  BSC_SYS_DIM_LEVELS_B    D
6897         ,  BSC_KPIS_VL             C
6898   WHERE    A.Level_Table_Name      =  D.Level_Table_Name
6899   AND      C.share_flag           <>  2
6900   AND      C.Indicator             =  A.Indicator
6901   AND      INSTR(','||l_child_dim_obj_list||',', ','||D.dim_level_id||',') > 0;
6902 
6903   CURSOR   c_Kpi_Dim_Set IS
6904   SELECT   DISTINCT C.Name||'['||C.Indicator||']' Name
6905           , C.Indicator
6906   FROM     BSC_KPI_DIM_LEVELS_B    A
6907         ,  BSC_SYS_DIM_LEVELS_B    D
6908         ,  BSC_KPIS_VL             C
6909   WHERE    A.Level_Table_Name      =  D.Level_Table_Name
6910   AND      D.Dim_Level_Id          =  l_bsc_dim_obj_rec.Bsc_Level_Id
6911   AND      C.share_flag           <>  2
6912   AND      C.Indicator             =  A.Indicator;
6913 
6914 BEGIN
6915      IF (p_dim_obj_short_name IS NOT NULL) THEN
6916 
6917         OPEN   c_old_dim_obj_rec;
6918         FETCH  c_old_dim_obj_rec
6919         INTO   l_bsc_dim_obj_rec.Bsc_Level_Id
6920             ,  l_bsc_dim_obj_rec.Bsc_Level_Name
6921             ,  l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size
6922             ,  l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size
6923             ,  l_bsc_dim_obj_rec.Bsc_Source
6924             ,  l_bsc_dim_obj_rec.Bsc_Level_Abbreviation
6925             ,  l_bsc_dim_obj_rec.Bsc_Pk_Col;
6926         CLOSE c_old_dim_obj_rec;
6927 
6928         l_maximum_name_size := p_maximum_name_size;
6929         l_maximum_code_size := p_maximum_code_size;
6930 
6931         IF(l_maximum_code_size<BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_CODE_MIN_SIZE )THEN
6932          l_maximum_code_size :=NULL;
6933         END IF;
6934 
6935         IF(l_maximum_name_size<BSC_BIS_DIM_OBJ_PUB.DIM_OBJ_NAME_MIN_SIZE )THEN
6936           l_maximum_name_size :=NULL;
6937         END IF;
6938 
6939         IF((l_bsc_dim_obj_rec.Bsc_Level_Abbreviation <> NVL(p_prototype_default_value, l_bsc_dim_obj_rec.Bsc_Level_Abbreviation)) OR
6940             (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size <> NVL(l_maximum_code_size,l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size)) OR
6941              (l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size <> NVL(l_maximum_name_size, l_bsc_dim_obj_rec.Bsc_Level_Disp_Key_Size)))THEN
6942                 l_disp_format_flag := TRUE;
6943         END IF;
6944 
6945         IF (l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size <> NVL(l_maximum_code_size, l_bsc_dim_obj_rec.Bsc_Level_User_Key_Size)) THEN
6946            l_child_disp_fm_flag := TRUE;
6947         END IF;
6948         l_counter :=0;
6949 
6950         IF (l_disp_format_flag) THEN
6951             FOR cd IN c_kpi_dim_set LOOP
6952                 l_MTab_Tbl(l_counter).p_kpi_id :=  cd.Indicator;
6953                 l_MTab_Tbl(l_counter).p_Name   :=  cd.Name;
6954                 l_counter :=  l_counter + 1;
6955             END LOOP;
6956 
6957             l_child_dim_obj_list:= NULL;
6958 
6959             IF (l_child_disp_fm_flag) THEN
6960                l_child_dim_obj_list := Get_Child_Dim_Objs(p_Dim_Level_Id => l_bsc_dim_obj_rec.Bsc_Level_Id);
6961                IF (l_child_dim_obj_list IS NOT NULL) THEN
6962                     FOR ckds IN c_Kpi_Dim_Set1 LOOP
6963                        l_duplicate_flag := FALSE;
6964                        FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
6965                          IF(l_MTab_Tbl(i).p_kpi_id=ckds.Indicator)THEN
6966                            l_duplicate_flag := TRUE;
6967                            EXIT;
6968                          END IF;
6969                        END LOOP;
6970 
6971                        IF(NOT l_duplicate_flag) THEN
6972                          l_MTab_Tbl(l_counter).p_kpi_id :=  ckds.Indicator;
6973                          l_MTab_Tbl(l_counter).p_Name   :=  ckds.Name;
6974                          l_counter :=  l_counter + 1;
6975                        END IF;
6976                     END LOOP;
6977                 END IF;
6978             END IF;
6979         END IF;
6980         FOR i IN 0..(l_MTab_Tbl.COUNT-1) LOOP
6981           IF(l_obj_names IS NULL)THEN
6982             l_obj_names := l_MTab_Tbl(i).p_Name;
6983           ELSE
6984             l_obj_names := l_obj_names||', '||l_MTab_Tbl(i).p_Name;
6985           END IF;
6986         END LOOP;
6987      END IF;
6988 
6989      x_obj_names := l_obj_names;
6990      IF(l_disp_format_flag)THEN
6991       l_return_flag := TRUE;
6992      END IF;
6993 
6994      RETURN l_return_flag;
6995 
6996 END is_Obj_Display_Frmt_Change;
6997 
6998 /******************************************************************************/
6999 -- Added for Bug#4758995
7000 FUNCTION Is_Recursive_Relationship
7001 (
7002       p_Short_Name       IN VARCHAR2
7003     , x_Relation_Col     OUT NOCOPY VARCHAR2
7004     , x_Data_Source      OUT NOCOPY VARCHAR2
7005     , x_Data_Source_Type OUT NOCOPY VARCHAR2
7006 ) RETURN VARCHAR2 IS
7007     l_Count NUMBER;
7008 
7009     CURSOR c_Rels IS
7010         SELECT R.RELATION_COL,
7011                R.DATA_SOURCE,
7012                R.DATA_SOURCE_TYPE
7013         FROM  BSC_SYS_DIM_LEVEL_RELS_V R
7014         WHERE R.DIM_LEVEL_ID      = R.PARENT_DIM_LEVEL_ID
7015         AND   R.SHORT_NAME        = p_Short_Name
7016         AND   R.PARENT_SHORT_NAME = p_Short_Name
7017         AND   R.SOURCE            = BSC_UTILITY.c_PMF
7018         AND   R.PARENT_SOURCE     = BSC_UTILITY.c_PMF;
7019 BEGIN
7020     l_Count := 0;
7021 
7022     FOR cRE IN c_Rels LOOP
7023         x_Relation_Col      := cRE.RELATION_COL;
7024         x_Data_Source       := cRE.DATA_SOURCE;
7025         x_Data_Source_Type  := cRE.DATA_SOURCE_TYPE;
7026 
7027         l_Count := l_Count + 1;
7028     END LOOP;
7029 
7030     IF (l_Count = 1) THEN
7031         RETURN FND_API.G_TRUE;
7032     ELSE
7033         RETURN FND_API.G_FALSE;
7034     END IF;
7035 
7036 EXCEPTION
7037     WHEN OTHERS THEN
7038         RETURN FND_API.G_FALSE;
7039 END Is_Recursive_Relationship;
7040 /******************************************************************************/
7041 
7042 
7043 /******************************************************************************/
7044 -- Added for Bug#4758995
7045 FUNCTION Get_Unique_Level_Pk_Col
7046 (       p_Dim_Level_Rec  IN  BSC_DIMENSION_LEVELS_PUB.Bsc_Dim_Level_Rec_Type
7047     ,   x_return_status  OUT NOCOPY   VARCHAR2
7048     ,   x_msg_count      OUT NOCOPY   NUMBER
7049     ,   x_msg_data       OUT NOCOPY   VARCHAR2
7050 ) RETURN VARCHAR2 IS
7051     l_Dim_Object_Name BSC_SYS_DIM_LEVELS_VL.NAME%TYPE;
7052     l_Level_Pk_Col    BSC_SYS_DIM_LEVELS_VL.LEVEL_PK_COL%TYPE;
7053     l_temp_var        VARCHAR2(1000);
7054     l_alias           VARCHAR2(1000);
7055     l_flag            BOOLEAN;
7056     l_count           NUMBER;
7057 
7058     CURSOR c_Lvl_Pk_Col IS
7059       SELECT D.LEVEL_PK_COL
7060       FROM   BSC_SYS_DIM_LEVELS_B D
7061       WHERE  D.SHORT_NAME = p_Dim_Level_Rec.Bsc_Level_Short_Name;
7062 BEGIN
7063 
7064     FND_MSG_PUB.Initialize;
7065     x_return_status := FND_API.G_RET_STS_SUCCESS;
7066 
7067     IF (p_Dim_Level_Rec.Bsc_Dim_Level_Long_Name IS NOT NULL) THEN
7068         l_Dim_Object_Name := REPLACE(p_Dim_Level_Rec.Bsc_Level_Name, ' ', '');
7069     ELSE
7070         l_Dim_Object_Name := REPLACE(p_Dim_Level_Rec.Bsc_Level_Short_Name ,' ', '_');
7071     END IF;
7072 
7073     l_Level_Pk_Col := p_Dim_Level_Rec.Bsc_Pk_Col;
7074     IF (l_Level_Pk_Col IS NULL) THEN
7075         FOR cLPK IN c_Lvl_Pk_Col LOOP
7076          l_Level_Pk_Col := cLPK.LEVEL_PK_COL;
7077         END LOOP;
7078 
7079         IF (l_Level_Pk_Col IS NULL) THEN
7080             l_Level_Pk_Col  :=  SUBSTR(l_Dim_Object_Name, 7, LENGTH(l_Dim_Object_Name))||'_CODE';
7081         END IF;
7082 
7083         IF (NOT is_Valid_Identifier(l_Level_Pk_Col)) THEN
7084 	    IF (LENGTH(l_Level_Pk_Col) > 26) THEN
7085 	       l_Level_Pk_Col := SUBSTR(l_Level_Pk_Col, 1, 26);
7086 	    END IF;
7087             l_Level_Pk_Col  :=  'BSC_'||l_Level_Pk_Col;
7088         END IF;
7089     ELSIF (NOT is_Valid_Identifier(l_Level_Pk_Col)) THEN
7090         FND_MESSAGE.SET_NAME('BSC','BSC_INVALID_SQL_IDENTIFIER');
7091         FND_MESSAGE.SET_TOKEN('SQL_IDENT', BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIM_OBJ_PK_COL'), TRUE);
7092         FND_MESSAGE.SET_TOKEN('SQL_VALUE', l_Level_Pk_Col);
7093         FND_MSG_PUB.ADD;
7094         RAISE FND_API.G_EXC_ERROR;
7095     END IF;
7096     IF(is_SQL_Key_Word(l_Level_Pk_Col)) THEN
7097         l_Level_Pk_Col  :=  l_Level_Pk_Col||'_CODE';
7098     END IF;
7099 
7100     l_Level_Pk_Col  :=  SUBSTR(l_Level_Pk_Col, 1, 26);
7101     l_flag          :=  TRUE;
7102     l_alias         :=  NULL;
7103     l_temp_var      :=  l_Level_Pk_Col;
7104     WHILE (l_flag) LOOP
7105         SELECT COUNT(1) INTO l_count
7106         FROM   BSC_SYS_DIM_LEVELS_B
7107         WHERE  SHORT_NAME       <> p_Dim_Level_Rec.Bsc_Level_Short_Name
7108         AND    UPPER(LEVEL_PK_COL)  = UPPER(l_temp_var);
7109         IF (l_count = 0) THEN
7110             l_flag            :=  FALSE;
7111             l_Level_Pk_Col    :=  l_temp_var;
7112         END IF;
7113         l_alias     :=  BSC_BIS_DIM_OBJ_PUB.get_Next_Alias(l_alias);
7114         l_temp_var  :=  SUBSTR(l_Level_Pk_Col, 1, 18)||l_alias||'_CODE';
7115     END LOOP;
7116 
7117     RETURN l_Level_Pk_Col;
7118 
7119 EXCEPTION
7120     WHEN FND_API.G_EXC_ERROR THEN
7121         IF (x_msg_data IS NULL) THEN
7122             FND_MSG_PUB.Count_And_Get
7123             (      p_encoded   =>  FND_API.G_FALSE
7124                ,   p_count     =>  x_msg_count
7125                ,   p_data      =>  x_msg_data
7126             );
7127         END IF;
7128         x_Return_Status :=  FND_API.G_RET_STS_ERROR;
7129         RETURN NULL;
7130     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7131         IF (x_msg_data IS NULL) THEN
7132             FND_MSG_PUB.Count_And_Get
7133             (      p_encoded   =>  FND_API.G_FALSE
7134                ,   p_count     =>  x_msg_count
7135                ,   p_data      =>  x_msg_data
7136             );
7137         END IF;
7138         x_Return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
7139         RETURN NULL;
7140     WHEN NO_DATA_FOUND THEN
7141         x_Return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
7142         IF (x_msg_data IS NOT NULL) THEN
7143             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col ';
7144         ELSE
7145             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col ';
7146         END IF;
7147         RETURN NULL;
7148     WHEN OTHERS THEN
7149         x_Return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
7150         IF (x_msg_data IS NOT NULL) THEN
7151             x_msg_data      :=  x_msg_data||' -> BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col ';
7152         ELSE
7153             x_msg_data      :=  SQLERRM||' at BSC_BIS_DIM_OBJ_PUB.Get_Unique_Level_Pk_Col ';
7154         END IF;
7155         RETURN NULL;
7156 END Get_Unique_Level_Pk_Col;
7157 /******************************************************************************/
7158 
7159 
7160 /********************************************************************************
7161     This is a Public API, used by Backend to validate and create the BSC views
7162     for existing source dimension Objects. Bug #4992082
7163     It first validates if corresponding bis view is valid then try to create a
7164     BSC wrapper view on top of the existing valid view.
7165 ********************************************************************************/
7166 
7167 PROCEDURE Validate_Refresh_BSC_PMF_Views
7168 ( p_Dim_Obj_Short_Name    IN  VARCHAR2
7169 , x_Return_Status         OUT NOCOPY VARCHAR2
7170 , x_Msg_Count             OUT NOCOPY NUMBER
7171 , x_Msg_Data              OUT NOCOPY VARCHAR2
7172 )
7173 IS
7174 l_name                VARCHAR2(300);
7175 l_dim_obj_view_name   VARCHAR2(30);
7176 l_source              VARCHAR2(5);
7177 BEGIN
7178 
7179 SELECT bsc.name, bis.LEVEL_VALUES_VIEW_NAME, bsc.source
7180 INTO l_name, l_Dim_Obj_View_Name, l_source
7181 FROM bsc_sys_dim_levels_vl bsc, bis_levels_vl bis
7182 WHERE bsc.short_name = bis.short_name
7183 AND bsc.short_name = p_Dim_Obj_Short_Name;
7184 
7185 IF (l_source = BSC_UTILITY.c_PMF) THEN
7186   BSC_BIS_DIM_OBJ_PUB.Validate_PMF_Views(
7187     p_Dim_Obj_Short_Name => p_Dim_Obj_Short_Name
7188    ,p_Dim_Obj_View_Name  => l_Dim_Obj_View_Name
7189    ,x_Return_Status      => x_Return_Status
7190    ,x_Msg_Count          => x_Msg_Count
7191    ,x_Msg_Data           => x_Msg_Data
7192   );
7193 
7194   IF (x_Return_Status <> FND_API.G_RET_STS_SUCCESS AND x_Msg_Data IS NOT NULL) THEN
7195     FND_MESSAGE.SET_NAME('BSC',x_Msg_Data);
7196     FND_MESSAGE.SET_TOKEN('DIM_OBJ', l_name, TRUE);
7197     FND_MSG_PUB.ADD;
7198     RAISE FND_API.G_EXC_ERROR;
7199   END IF;
7200 END IF;
7201 
7202 BSC_BIS_DIM_OBJ_PUB.Refresh_BSC_PMF_Dim_View(
7203   p_Short_Name    => p_Dim_Obj_Short_Name
7204  ,x_return_status => x_Return_Status
7205  ,x_msg_count     => x_msg_count
7206  ,x_msg_data      => x_Msg_Data
7207 );
7208 
7209 EXCEPTION
7210   WHEN OTHERS THEN
7211     FND_MSG_PUB.Count_And_Get
7212     (   p_encoded   =>  FND_API.G_FALSE
7213       , p_count     =>  x_msg_count
7214       , p_data      =>  x_Msg_Data
7215     );
7216 END Validate_Refresh_BSC_PMF_Views;
7217 
7218 /****************************************************************************************************
7219 This API takes dimension and dimension object short Names, finds all the dimension groups of the
7220 reports containing that dim+dimobject combination. It then cascades the "All Enable/Disable" property
7221 to the dim groups. This API doesnot take care of where clauses as of now.
7222 p_Dim_Obj_Short_Name : Dimension Object Short Name
7223 p_Dim_Short_Name     : Dimension Short Name
7224 p_All_Flag           : "All" flag value
7225 ****************************************************************************************************/
7226 
7227 PROCEDURE Cascade_Dim_Props_Into_Dim_Grp (
7228   p_Dim_Obj_Short_Name              IN  VARCHAR2
7229   , p_Dim_Short_Name                IN  VARCHAR2
7230   , p_All_Flag                      IN  NUMBER
7231   , x_Return_Status                 OUT NOCOPY VARCHAR2
7232   , x_Msg_Count                     OUT NOCOPY NUMBER
7233   , x_Msg_Data                      OUT NOCOPY VARCHAR2
7234 ) IS
7235     l_Dim_DimObj_Sht_Name       VARCHAR2(1000);
7236     l_Dim_Short_Name            BIS_DIMENSIONS.SHORT_NAME%TYPE;
7237     CURSOR c_dim_groups IS
7238     SELECT
7239       bis_dim.short_name
7240     FROM
7241       ak_regions reg,
7242       ak_region_items reg_item,
7243       bis_dimensions bis_dim
7244     WHERE
7245       reg_item.attribute2    = l_Dim_DimObj_Sht_Name
7246       AND reg.region_code    = reg_item.region_code
7247       AND bis_dim.short_name = reg.attribute12
7248       AND bis_util.is_seeded(bis_dim.created_by,'T','F') = 'F'
7249       AND NVL(hide_in_design,'F') = 'T';
7250 BEGIN
7251     FND_MSG_PUB.Initialize;
7252     x_Return_Status := FND_API.G_RET_STS_SUCCESS;
7253     l_Dim_DimObj_Sht_Name := p_Dim_Short_Name || '+' || p_Dim_Obj_Short_Name;
7254     IF (l_Dim_DimObj_Sht_Name IS NOT NULL) THEN
7255       OPEN c_dim_groups;
7256       LOOP
7257         FETCH c_dim_groups INTO l_Dim_Short_Name;
7258         EXIT WHEN c_dim_groups%NOTFOUND;
7259           UPDATE
7260             bsc_sys_dim_levels_by_group
7261           SET
7262             total_flag = p_All_Flag
7263           WHERE
7264             dim_level_id = BSC_BIS_DIM_OBJ_PUB.Get_Bsc_Dim_Obj_ID(p_Dim_Obj_Short_Name)
7265             AND   dim_group_id = BSC_BIS_DIMENSION_PUB.Get_Bsc_Dimension_ID(l_Dim_Short_Name);
7266       END LOOP;
7267     END IF;
7268 EXCEPTION
7269   WHEN OTHERS THEN
7270     FND_MSG_PUB.Count_And_Get
7271     (   p_encoded   =>  FND_API.G_FALSE
7272       , p_count     =>  x_msg_count
7273       , p_data      =>  x_Msg_Data
7274     );
7275     x_Return_Status :=  FND_API.G_RET_STS_ERROR;
7276 END Cascade_Dim_Props_Into_Dim_Grp;
7277 
7278 
7279 END BSC_BIS_DIM_OBJ_PUB;