DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_BIS_CUSTOM_KPI_UTIL_PUB

Source


1 PACKAGE BODY BSC_BIS_CUSTOM_KPI_UTIL_PUB AS
2 /* $Header: BSCCSUBB.pls 120.9 2007/10/10 06:42:39 bijain ship $ */
3 
4 /*
5 REM +=======================================================================+
6 REM |    Copyright (c) 2004 Oracle Corporation, Redwood Shores, CA, USA     |
7 REM |                         All rights reserved.                          |
8 REM +=======================================================================+
9 REM | FILENAME                                                              |
10 REM |     BSCCSUBB.pls                                                      |
11 REM |                                                                       |
12 REM | DESCRIPTION                                                           |
13 REM |     Module: Wrapper API for Configure KPI List Page                   |
14 REM |                                                                       |
15 REM | NOTES                                                                 |
16 REM |                                                                       |
17 REM | HISTORY                                                               |
18 REM |     13-Aug-04    rpenneru   Created.                                  |
19 REM |     17-AUG-04    adrao      Modified API SetGlobalFlag and added API  |
20 REM |                             Is_BSC52_Applied for Bug@3836170          |
21 REM |     05-OCT-04    ankgoel    Bug#3933075 Moved Get_Pmf_Metadata_By_Objective
22 REM |                             and get_Region_Code here from BSCCRUDB.pls|
23 REM |     11-Feb-05    sawu       Bug#4057761: added get_Next_Alias and     |
24 REM |                             Get_Unqiue_Tab_Name, Get_Unqiue_Tab_Group_Name|
25 REM |     30-Mar-05    wleung     hardcode Get_Max_Tab_Name_Length() and     |
26 REM |                             Get_Max_Tab_Grp_Name_Length                |
27 REM |     27-MAR-05    adrao      Modified API is_Report_S2E for Bug#4331964|
28 REM |     29-APR-05    ankagarw   Modified API Is_Short_Name_Available for Bug#4336571|
29 REM |                             Made it public.                           |
30 REM |     09-MAY-05    adrao      Added API is_Objective_Report_Type        |
31 REM |                             and is_Objective_Page_Type                |
32 REM |     26-SEP-2005 arhegde bug# 4624100 Moved get_format_mask code to    |
33 REM |          BSC_BIS_CUSTOM_KPI_UTIL_PUB from BSC_BIS_KPI_CRUD_PUB since  |
34 REM |          pure BIS can use it too.                                     |
35 REM |     10-MAY-2006 visuri  bug#5130750 Data Corruption issue             |
36 REM |     09-FEB-1007 ashankar Simulation ER 5386112                        |
37 REM |     03-APR-2007 amitgupt    modified for bug 5959433                  |
38 REM |     02-Oct-2007 bijain   Bug#6327035  Changing the display name of a  |
39 REM |                 DashBord for End to End Kpi should update BSC MetaData|
40 REM +=======================================================================+
41 */
42 
43 -- changed to use BSC_KPI_ANALYSIS_OPTIONS_B
44 -- BSC_KPIS_B.SHORT_NAME and BSC_TABS_B.SHORT_NAME have existed before Start-to-End KPI.
45 
46 
47 PROCEDURE SetGlobalFlag
48 IS
49 
50  TYPE Ref_Cur IS REF CURSOR;
51  Flag_Cur   Ref_Cur;
52  sql_query      VARCHAR2(2000);
53  rec_count      NUMBER;
54  BEGIN
55 
56   IF(Flag_Cur%ISOPEN) THEN
57     CLOSE Flag_Cur;
58   END IF;
59 
60   sql_query := 'select count(1) from sys.all_tab_columns where table_name = ''BSC_DB_MEASURE_GROUPS_TL'' and COLUMN_NAME  = ''SHORT_NAME'' ';
61   OPEN Flag_Cur FOR sql_query;
62     FETCH Flag_Cur INTO rec_count;
63   CLOSE Flag_Cur;
64 
65   IF (rec_count > 0) THEN
66     BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 := BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_52;
67   ELSE
68     BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 := BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_511;
69   END IF;
70  EXCEPTION
71   WHEN OTHERS THEN
72   BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 := BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_511;
73 END SetGlobalFlag;
74 
75 
76 FUNCTION IS_NOT_NULL(p_name VARCHAR2)
77   RETURN VARCHAR2 IS
78   BEGIN
79     IF (p_name IS NULL) THEN
80       RETURN FND_API.G_FALSE;
81     END IF;
82     RETURN FND_API.G_TRUE;
83 END IS_NOT_NULL;
84 
85 
86 /*this function will return 'T' (FND_API.G_TRUE) if the passed short_name of Measure
87   is created through KPI End to End module otherwise 'F' (FND_API.G_FALSE)
88 
89   This function assumes the Short_Name passed is valid and exists in
90   BSC Metadata. It will not be checked from BSC tables due to performance reasons.
91 
92   p_Short_Name Corresponds to BSC_SYS_MEASURES.Short_Name
93 */
94 FUNCTION is_KPI_EndToEnd_Measure(p_Short_Name VARCHAR2)
95 RETURN VARCHAR2 IS
96   l_Count NUMBER;
97 BEGIN
98     IF (p_Short_Name IS NULL) THEN
99         RETURN FND_API.G_FALSE;
100     END IF;
101 
102     l_Count := 0;
103 
104     SELECT COUNT(1) INTO l_Count
105     FROM   bis_indicators
106     WHERE  short_name         = p_Short_Name
107     AND    actual_data_source IS NOT NULL
108     AND    actual_data_source_type = 'AK';
109 
110     IF (l_Count = 0) THEN
111         RETURN FND_API.G_FALSE;
112     ELSE
113         RETURN FND_API.G_TRUE;
114     END IF;
115 EXCEPTION
116     WHEN OTHERS THEN
117         RETURN FND_API.G_FALSE;
118 END is_KPI_EndToEnd_Measure;
119 
120 procedure update_kpi_End_To_End_Name(
121   p_Commit                       IN         VARCHAR2 := FND_API.G_FALSE
122   ,p_Name                        IN         VARCHAR2
123   ,p_Short_Name                  IN         VARCHAR2
124   ,x_Return_Status               OUT NOCOPY VARCHAR2
125   ,x_Msg_Count                   OUT NOCOPY NUMBER
126   ,x_Msg_Data                    OUT NOCOPY VARCHAR2
127 ) IS
128 
129   l_tab_id                       BSC_TABS_B.TAB_ID%TYPE;
130   l_kpi_group_id                 BSC_TAB_IND_GROUPS_B.IND_GROUP_ID%TYPE;
131   l_kpi_id                       BSC_KPIS_B.INDICATOR%TYPE;
132   l_tab_name                     BSC_TABS_VL.NAME%TYPE;
133   l_tab_ind_group_name           BSC_TAB_IND_GROUPS_VL.NAME%TYPE;
134   not_S_To_E_Kpi                 EXCEPTION;
135 
136 BEGIN
137   SAVEPOINT UpdateEndToEndKPIName;
138   FND_MSG_PUB.Initialize;
139   x_Return_Status :=  FND_API.G_RET_STS_SUCCESS;
140 
141   l_tab_id        := BSC_BIS_KPI_CRUD_PUB.Get_Tab_Id(p_Short_Name);
142   l_kpi_group_id  := BSC_BIS_KPI_CRUD_PUB.Get_Group_Id(p_Short_Name);
143   l_kpi_id        := BSC_BIS_KPI_CRUD_PUB.Get_Kpi_Id(p_Short_Name);
144 
145   IF(BSC_BIS_KPI_CRUD_PUB.C_INVALID_ENTITY <> l_tab_id) THEN
146       l_tab_name := BSC_BIS_CUSTOM_KPI_UTIL_PUB.Get_Unqiue_Tab_Name(p_Name, l_tab_id);
147       BSC_PMF_UI_WRAPPER.Update_Tab(
148       p_commit          =>  p_Commit
149       ,p_tab_id         =>  l_tab_id
150       ,p_tab_name       =>  l_tab_name
151       ,p_tab_help       =>  l_tab_name
152       ,x_return_status  =>  x_Return_Status
153       ,x_msg_count      =>  x_Msg_Count
154       ,x_msg_data       =>  x_Msg_Data
155     );
156   ELSE
157     RAISE not_S_To_E_Kpi;
158   END IF;
159 
160   IF ((x_return_status IS NOT NULL) AND (x_return_status  <> FND_API.G_RET_STS_SUCCESS)) THEN
161     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
162   END IF;
163 
164   IF(BSC_BIS_KPI_CRUD_PUB.C_INVALID_ENTITY <> l_kpi_group_id) THEN
165     l_tab_ind_group_name := BSC_BIS_CUSTOM_KPI_UTIL_PUB.Get_Unqiue_Tab_Group_Name(p_Name,l_kpi_group_id);
166     BSC_PMF_UI_WRAPPER.Update_Kpi_Group(
167       p_commit          =>  p_Commit
168       ,p_kpi_group_id   =>  l_kpi_group_id
169       ,p_kpi_group_name =>  l_tab_ind_group_name
170       ,p_kpi_group_help =>  l_tab_ind_group_name
171       ,x_return_status  =>  x_Return_Status
172       ,x_msg_count      =>  x_Msg_Count
173       ,x_msg_data       =>  x_Msg_Data
174     );
175   ELSE
176     RAISE not_S_To_E_Kpi;
177   END IF;
178 
179   IF ((x_return_status IS NOT NULL) AND (x_return_status  <> FND_API.G_RET_STS_SUCCESS)) THEN
180     RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
181   END IF;
182   IF(-1000 <> l_kpi_id) THEN
183     BSC_PMF_UI_WRAPPER.Update_Kpi(
184       p_commit          =>  p_Commit
185       ,p_kpi_id         =>  l_kpi_id
186       ,p_kpi_name       =>  p_Name
187       ,p_kpi_help       =>  p_Name
188       ,x_return_status  =>  x_Return_Status
189       ,x_msg_count      =>  x_Msg_Count
190       ,x_msg_data       =>  x_Msg_Data
191     );
192   ELSE
193     RAISE not_S_To_E_Kpi;
194   END IF;
195 
196   IF ((x_return_status IS NOT NULL) AND (x_return_status  <> FND_API.G_RET_STS_SUCCESS)) THEN
197     RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
198   END IF;
199 
200   IF (p_Commit = FND_API.G_TRUE) THEN
201     COMMIT;
202   END IF;
203 
204 EXCEPTION
205   WHEN not_S_To_E_Kpi THEN
206     ROLLBACK TO UpdateEndToEndKPIName;
207   WHEN OTHERS THEN
208     x_Return_Status  := FND_API.G_RET_STS_ERROR;
209     ROLLBACK TO UpdateEndToEndKPIName;
210     IF (x_msg_data IS NOT NULL) THEN
211       x_msg_data      :=  x_msg_data||' -> BSC_BIS_CUSTOM_KPI_UTIL_PUB.update_kpi_End_To_End_Name ';
212     ELSE
213       x_msg_data      :=  SQLERRM||' at BSC_BIS_CUSTOM_KPI_UTIL_PUB.update_kpi_End_To_End_Name ';
214     END IF;
215 END update_kpi_End_To_End_Name;
216 FUNCTION is_KPI_EndToEnd_Measure(p_Measure_Id NUMBER)
217   RETURN VARCHAR2 IS
218     TYPE Ref_Cur IS REF CURSOR;
219     Flag_Cur    Ref_Cur;
220     sql_query       VARCHAR2(2000);
221     l_count NUMBER :=0;
222 
223   BEGIN
224 
225     IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.Is_Short_Name_Available = FND_API.G_FALSE) THEN
226         RETURN FND_API.G_FALSE;
227     END IF;
228 
229     IF(Flag_Cur%ISOPEN) THEN
230       CLOSE Flag_Cur;
231     END IF;
232 
233     sql_query := 'SELECT count(1) FROM  BSC_SYS_MEASURES a,BSC_DB_MEASURE_COLS_VL b '
234                  ||'  , BSC_DB_MEASURE_GROUPS_VL c '
235                  ||'  WHERE a.measure_col = b.measure_col '
236                  ||' AND a.measure_id = :p_measure_id'
237                          ||' AND b.measure_group_id = c.measure_group_id '
238                  ||' AND c.short_name IS NOT NULL ';
239     OPEN Flag_Cur FOR sql_query USING p_Measure_Id;
240       FETCH Flag_Cur INTO l_count;
241     CLOSE Flag_Cur;
242     IF (l_count > 0) THEN
243       RETURN FND_API.G_TRUE;
244     END IF;
245     RETURN FND_API.G_FALSE;
246   EXCEPTION
247     WHEN OTHERS THEN
248         RETURN FND_API.G_FALSE;
249 END is_KPI_EndToEnd_Measure;
250 
251 
252 FUNCTION is_KPI_EndToEnd_MeasureGroup(p_Short_Name VARCHAR2)
253   RETURN VARCHAR2 IS
254   BEGIN
255     RETURN IS_NOT_NULL(p_Short_Name);
256   EXCEPTION
257     WHEN OTHERS THEN
258       RETURN FND_API.G_FALSE;
259 END is_KPI_EndToEnd_MeasureGroup;
260 
261 
262 FUNCTION is_KPI_EndToEnd_MeasureGroup(p_Measure_Group_Id NUMBER)
263   RETURN VARCHAR2 IS
264   TYPE Ref_Cur IS REF CURSOR;
265   Flag_Cur  Ref_Cur;
266   sql_query         VARCHAR2(2000);
267   rec_count     NUMBER;
268 
269   BEGIN
270 
271     IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.Is_Short_Name_Available = FND_API.G_FALSE) THEN
272         RETURN FND_API.G_FALSE;
273     END IF;
274 
275     IF(Flag_Cur%ISOPEN) THEN
276       CLOSE Flag_Cur;
277     END IF;
278 
279     sql_query := 'select count(1) from bsc_db_measure_groups_vl where short_name is not null and measure_group_id = :p_measure_group_id';
280     OPEN Flag_Cur FOR sql_query USING p_Measure_Group_Id;
281       FETCH Flag_Cur INTO rec_count;
282     CLOSE Flag_Cur;
283 
284     IF (rec_count > 0) THEN
285       RETURN FND_API.G_TRUE;
286     END IF;
287     RETURN FND_API.G_FALSE;
288 
289   EXCEPTION
290     WHEN OTHERS THEN
291       RETURN FND_API.G_FALSE;
292 END is_KPI_EndToEnd_MeasureGroup;
293 
294 
295 FUNCTION is_KPI_EndToEnd_MeasureCol(p_Measure_Col VARCHAR2,p_MesGrp_Short_Name VARCHAR2)
296   RETURN VARCHAR2 IS
297   BEGIN
298     RETURN BSC_BIS_CUSTOM_KPI_UTIL_PUB.is_KPI_EndToEnd_MeasureGroup(p_MesGrp_Short_Name);
299   EXCEPTION
300     WHEN OTHERS THEN
301         RETURN FND_API.G_FALSE;
302 END is_KPI_EndToEnd_MeasureCol;
303 
304 
305 FUNCTION is_KPI_EndToEnd_MeasureCol(p_Measure_Col VARCHAR2)
306   RETURN VARCHAR2
307   IS
308   CURSOR c_MeasureGrp IS
309     SELECT measure_group_id FROM BSC_DB_MEASURE_COLS_VL
310     WHERE measure_col = p_Measure_Col;
311 
312   l_Measure_Group_Id BSC_DB_MEASURE_COLS_VL.MEASURE_GROUP_ID%TYPE;
313 
314   BEGIN
315     IF(c_MeasureGrp%ISOPEN) THEN
316       CLOSE c_MeasureGrp;
317     END IF;
318 
319     OPEN c_MeasureGrp;
320     FETCH c_MeasureGrp INTO l_Measure_Group_Id;
321     CLOSE c_MeasureGrp;
322     RETURN BSC_BIS_CUSTOM_KPI_UTIL_PUB.is_KPI_EndToEnd_MeasureGroup(l_Measure_Group_Id);
323 
324   EXCEPTION
325     WHEN OTHERS THEN
326         RETURN FND_API.G_FALSE;
327 END is_KPI_EndToEnd_MeasureCol;
328 
329 
330 /*this function will return 'T' (FND_API.G_TRUE) if the passed short_name of scorecard
331   is created through KPI End to End module otherwise 'F' (FND_API.G_FALSE).
332 
333   This function assumes the Short_Name passed is valid and exists in
334   BSC Metadata. It will not be checked from BSC tables due to performance reasons.
335 
336   p_Short_Name Corresponds to BSC_TABS_B.Short_Name
337 */
338 FUNCTION is_KPI_EndToEnd_Scorecard(p_Short_Name VARCHAR2)
339   RETURN VARCHAR2 IS
340   BEGIN
341      RETURN IS_NOT_NULL(p_Short_Name);
342   EXCEPTION
343     WHEN OTHERS THEN
344         RETURN FND_API.G_FALSE;
345 END is_KPI_EndToEnd_Scorecard;
346 
347 
348 FUNCTION Get_User_Function_Name(p_function_name VARCHAR2) RETURN VARCHAR2
349 IS
350   l_user_function_name   VARCHAR2(100);
351 BEGIN
352   l_user_function_name := p_function_name;
353   SELECT a.user_function_name
354   INTO l_user_function_name
355   FROM fnd_form_functions_vl a
356   WHERE a.function_name = p_function_name;
357 
358   IF (l_user_function_name IS NULL) THEN
359     l_user_function_name := p_function_name;
360   END IF;
361 
362   RETURN l_user_function_name;
363 EXCEPTION
364    WHEN NO_DATA_FOUND THEN RETURN p_function_name;
365    WHEN OTHERS THEN RETURN p_function_name;
366 END Get_User_Function_Name;
367 
368 
369 -- Check if ODF with short_names has been applied or not
370 FUNCTION enableVarchar2Implementation
371 RETURN VARCHAR2 IS
372 BEGIN
373     IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.Is_Short_Name_Available = FND_API.G_FALSE) THEN
374         RETURN FND_API.G_FALSE;
375     END IF;
376 
377     RETURN FND_API.G_TRUE;
378 EXCEPTION
379   WHEN OTHERS THEN
380      RETURN FND_API.G_FALSE;
381 END enableVarchar2Implementation;
382 
383 
384 -- Returns/Inits if SHORT_NAME is available via ODF or not.
385 FUNCTION Is_Short_Name_Available
386 RETURN VARCHAR2 IS
387 BEGIN
388 
389     IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_UNINIT) THEN
390       BSC_BIS_CUSTOM_KPI_UTIL_PUB.setGlobalFlag;
391     END IF;
392 
393     IF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_511) THEN
394         RETURN FND_API.G_FALSE;
395     ELSIF (BSC_BIS_CUSTOM_KPI_UTIL_PUB.G_MDDD_52 = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_BSC_PATCH_LEVEL_52) THEN
396         RETURN FND_API.G_TRUE;
397     END IF;
398 
399     RETURN FND_API.G_FALSE;
400 EXCEPTION
401   WHEN OTHERS THEN
402      RETURN FND_API.G_FALSE;
403 END Is_Short_Name_Available;
404 
405 /*
406   PL/SQL API to return region_code
407 */
408 
409 FUNCTION get_Region_Code (
410             p_Kpi_Id NUMBER
411           , p_AO_Id NUMBER := NULL
412 ) RETURN VARCHAR2 IS
413   l_Region_Code  VARCHAR2(80);
414 BEGIN
415 
416    IF (p_Kpi_Id IS NULL) THEN
417      RETURN NULL;
418    END IF;
419 
420    IF ((p_AO_Id IS NOT NULL) AND (p_AO_Id <> -1)) THEN
421      l_Region_Code := BSC_UTILITY.C_BSC_UNDERSCORE || p_Kpi_Id || '_' || p_AO_Id;
422    ELSE
423      l_Region_Code := BSC_UTILITY.C_BSC_UNDERSCORE || p_Kpi_Id ;
424    END IF;
425 
426    RETURN l_Region_Code;
427 
428 END get_Region_Code;
429 
430 
431 -- ankgoel: bug#3759819
432 -- This API assumes that the Input parameters are not NULL
433 PROCEDURE Get_Pmf_Metadata_By_Objective(
434   p_Dataset_Id         IN         NUMBER
435 , p_Measure_Short_Name IN         VARCHAR2
436 , x_Actual_Source_Type OUT NOCOPY VARCHAR2
437 , x_Actual_Source      OUT NOCOPY VARCHAR2
438 , x_Function_Name      OUT NOCOPY VARCHAR2
439 )
440 IS
441   CURSOR c_KpiAo IS
442     SELECT indicator kpiId, analysis_option0 aoId
443     FROM bsc_kpi_analysis_measures_b
444     WHERE dataset_id = p_Dataset_Id;
445 
446   l_Analysis_Option  NUMBER;
447   l_Region_Code      VARCHAR2(30);
448   l_Kpi_Id           NUMBER;
449 BEGIN
450 
451   FOR Kpi_Ao IN c_KpiAo LOOP
452     l_Kpi_Id := Kpi_Ao.kpiId;
453     l_Analysis_Option := Kpi_Ao.aoId;
454   END LOOP;
455 
456   l_Region_Code        := Get_Region_Code (l_Kpi_Id, l_Analysis_Option);
457   x_Actual_Source_Type := BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_AK_DATASOURCE;
458 
459   IF (l_Region_Code IS NOT NULL) THEN
460     x_Actual_Source      := l_Region_Code || '.' || p_Measure_Short_Name;
461   ELSE
462     x_Actual_Source      := NULL;
463   END IF;
464 
465   x_Function_Name      := l_Region_Code;
466 
467 EXCEPTION
468   WHEN OTHERS THEN
469     RAISE;
470 END Get_Pmf_Metadata_By_Objective;
471 
472 --added for bug#4057761
473 FUNCTION get_Next_Alias(
474  p_Alias        IN   VARCHAR2
475 ) RETURN VARCHAR2
476 IS
477   l_alias     VARCHAR2(5);
478   l_return    VARCHAR2(5);
479   l_count     NUMBER;
480 BEGIN
481   IF (p_Alias IS NULL) THEN
482     l_return :=  'A';
483   ELSE
484     l_count := LENGTH(p_Alias);
485     IF (l_count = 1) THEN
486       l_return   := 'A0';
487     ELSIF (l_count > 1) THEN
488       l_alias     :=  SUBSTR(p_Alias, 2);
489       l_count     :=  TO_NUMBER(l_alias)+1;
490       l_return    :=  'A'||TO_CHAR(l_count);
491     END IF;
492   END IF;
493   RETURN l_return;
494 END get_Next_Alias;
495 
496 FUNCTION Get_Max_Tab_Name_Length
497 RETURN NUMBER IS
498   l_fnd_length             NUMBER;
499   l_tab_length             NUMBER;
500 BEGIN
501 /*
502   SELECT data_length INTO l_fnd_length
503   FROM SYS.ALL_TAB_COLUMNS
504   WHERE table_name = 'FND_FORM_FUNCTIONS_TL'
505   AND column_name = 'USER_FUNCTION_NAME';
506 
507   SELECT data_length INTO l_tab_length
508   FROM SYS.ALL_TAB_COLUMNS
509   WHERE table_name = 'BSC_TABS_TL'
510   AND column_name = 'NAME';
511 
512   --return the min of these two
513   IF (l_fnd_length > l_tab_length) THEN
514     RETURN l_tab_length;
515   ELSE
516     RETURN l_fnd_length;
517   END IF;
518   */
519   RETURN 80;
520 END Get_Max_Tab_Name_Length;
521 
522 FUNCTION Get_Max_Tab_Grp_Name_Length
523 RETURN NUMBER IS
524   l_fnd_length             NUMBER;
525   l_tab_group_length       NUMBER;
526 BEGIN
527 /*
528   SELECT data_length INTO l_fnd_length
529   FROM SYS.ALL_TAB_COLUMNS
530   WHERE table_name = 'FND_FORM_FUNCTIONS_TL'
531   AND column_name = 'USER_FUNCTION_NAME';
532 
533   SELECT data_length INTO l_tab_group_length
534   FROM SYS.ALL_TAB_COLUMNS
535   WHERE table_name = 'BSC_TAB_IND_GROUPS_TL'
536   AND column_name = 'NAME';
537 
538   --return the min of these two
539   IF (l_fnd_length > l_tab_group_length) THEN
540     RETURN l_tab_group_length;
541   ELSE
542     RETURN l_fnd_length;
543   END IF;
544   */
545   RETURN 80;
546 END Get_Max_Tab_Grp_Name_Length;
547 
548 FUNCTION Get_Unqiue_Tab_Name(
549  p_tab_name        BSC_TABS_TL.NAME%TYPE
550 ) RETURN BSC_TABS_TL.NAME%TYPE IS
551  l_tab_name        BSC_TABS_TL.NAME%TYPE;
552  l_flag            BOOLEAN := TRUE;
553  l_count           NUMBER;
554  l_loop_count      NUMBER := 0;
555  l_alias           VARCHAR2(5) := NULL;
556  l_max_tab_length  NUMBER;
557  l_overflow        NUMBER;
558 BEGIN
559  IF (p_tab_name IS NULL) THEN
560   l_tab_name := 'A'; --extended alias
561  ELSE
562   l_tab_name := trim(p_tab_name);
563  END IF;
564 
565  l_max_tab_length := Get_Max_Tab_Name_Length;
566 
567  WHILE ((l_flag) AND (l_loop_count < BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_MAX_LOOP_COUNT)) LOOP
568    SELECT count(1) INTO l_count
569    FROM BSC_TABS_VL
570    WHERE UPPER(trim(name)) = UPPER(l_tab_name);
571 
572    IF (l_count = 0) THEN
573     l_flag := FALSE;
574    ELSE
575     l_alias      := get_Next_Alias(l_alias);
576     l_loop_count := l_loop_count + 1;    --prevent infinite loop should alias exhausted
577     --prevent overflow
578     l_overflow := LENGTH(p_tab_name) + LENGTH(l_alias) - l_max_tab_length;
579     IF (l_overflow > 0) THEN
580       l_tab_name := SUBSTR(p_tab_name, 1, LENGTH(p_tab_name)-l_overflow) || l_alias;
581     ELSE
582       l_tab_name := p_tab_name || l_alias;
583     END IF;
584    END IF;
585  END LOOP;
586 
587  RETURN l_tab_name;
588 
589 EXCEPTION
590  WHEN OTHERS THEN
591   RETURN p_tab_name;
592 END Get_Unqiue_Tab_Name;
593 
594 FUNCTION Get_Unqiue_Tab_Name(
595  p_tab_name        BSC_TABS_TL.NAME%TYPE,
596  p_tab_id          BSC_TABS_TL.TAB_ID%TYPE
597 ) RETURN BSC_TABS_TL.NAME%TYPE IS
598  l_tab_name        BSC_TABS_TL.NAME%TYPE;
599  l_flag            BOOLEAN := TRUE;
600  l_count           NUMBER;
601  l_loop_count      NUMBER := 0;
602  l_alias           VARCHAR2(5) := NULL;
603  l_max_tab_length  NUMBER;
604  l_overflow        NUMBER;
605 BEGIN
606  IF (p_tab_name IS NULL) THEN
607   l_tab_name := 'A'; --extended alias
608  ELSE
609   l_tab_name := trim(p_tab_name);
610  END IF;
611 
612  l_max_tab_length := Get_Max_Tab_Name_Length;
613 
614  WHILE ((l_flag) AND (l_loop_count < BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_MAX_LOOP_COUNT)) LOOP
615    SELECT count(1) INTO l_count
616    FROM BSC_TABS_VL
617    WHERE UPPER(trim(name)) = UPPER(l_tab_name)
618          AND tab_id <> p_tab_id;
619 
620    IF (l_count = 0) THEN
621     l_flag := FALSE;
622    ELSE
623     l_alias      := get_Next_Alias(l_alias);
624     l_loop_count := l_loop_count + 1;    --prevent infinite loop should alias exhausted
625     --prevent overflow
626     l_overflow := LENGTH(p_tab_name) + LENGTH(l_alias) - l_max_tab_length;
627     IF (l_overflow > 0) THEN
628       l_tab_name := SUBSTR(p_tab_name, 1, LENGTH(p_tab_name)-l_overflow) || l_alias;
629     ELSE
630       l_tab_name := p_tab_name || l_alias;
631     END IF;
632    END IF;
633  END LOOP;
634 
635  RETURN l_tab_name;
636 
637 EXCEPTION
638  WHEN OTHERS THEN
639   RETURN p_tab_name;
640 END Get_Unqiue_Tab_Name;
641 
642 FUNCTION Get_Unqiue_Tab_Group_Name(
643  p_tab_grp_name        BSC_TAB_IND_GROUPS_TL.NAME%TYPE
644 ) RETURN BSC_TAB_IND_GROUPS_TL.NAME%TYPE IS
645  l_tab_grp_name         BSC_TAB_IND_GROUPS_TL.NAME%TYPE;
646  l_flag                 BOOLEAN := TRUE;
647  l_count                NUMBER;
648  l_loop_count      NUMBER := 0;
649  l_alias                VARCHAR2(5) := NULL;
650  l_max_tab_grp_length   NUMBER;
651  l_overflow             NUMBER;
652 BEGIN
653  IF (p_tab_grp_name IS NULL) THEN
654   l_tab_grp_name := 'A'; --extended alias
655  ELSE
656   l_tab_grp_name := trim(p_tab_grp_name);
657  END IF;
658 
659  l_max_tab_grp_length := Get_Max_Tab_Grp_Name_Length;
660 
661  WHILE ((l_flag) AND (l_loop_count < BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_MAX_LOOP_COUNT)) LOOP
662    SELECT count(1) INTO l_count
663    FROM BSC_TAB_IND_GROUPS_VL
664    WHERE UPPER(trim(name)) = UPPER(l_tab_grp_name);
665 
666    IF (l_count = 0) THEN
667     l_flag := FALSE;
668    ELSE
669     l_alias      := get_Next_Alias(l_alias);
670     l_loop_count := l_loop_count + 1;    --prevent infinite loop should alias exhausted
671     --prevent overflow
672     l_overflow := LENGTH(p_tab_grp_name) + LENGTH(l_alias) - l_max_tab_grp_length;
673     IF (l_overflow > 0) THEN
674       l_tab_grp_name := SUBSTR(p_tab_grp_name, 1, LENGTH(p_tab_grp_name)-l_overflow) || l_alias;
675     ELSE
676       l_tab_grp_name := p_tab_grp_name || l_alias;
677     END IF;
678    END IF;
679  END LOOP;
680 
681  RETURN l_tab_grp_name;
682 
683 EXCEPTION
684  WHEN OTHERS THEN
685   RETURN p_tab_grp_name;
686 END Get_Unqiue_Tab_Group_Name;
687 
688 FUNCTION Get_Unqiue_Tab_Group_Name(
689  p_tab_grp_name        BSC_TAB_IND_GROUPS_TL.NAME%TYPE,
690  p_tab_grp_id          BSC_TAB_IND_GROUPS_TL.IND_GROUP_ID%TYPE
691 ) RETURN BSC_TAB_IND_GROUPS_TL.NAME%TYPE IS
692  l_tab_grp_name         BSC_TAB_IND_GROUPS_TL.NAME%TYPE;
693  l_flag                 BOOLEAN := TRUE;
694  l_count                NUMBER;
695  l_loop_count      NUMBER := 0;
696  l_alias                VARCHAR2(5) := NULL;
697  l_max_tab_grp_length   NUMBER;
698  l_overflow             NUMBER;
699 BEGIN
700  IF (p_tab_grp_name IS NULL) THEN
701   l_tab_grp_name := 'A'; --extended alias
702  ELSE
703   l_tab_grp_name := trim(p_tab_grp_name);
704  END IF;
705 
706  l_max_tab_grp_length := Get_Max_Tab_Grp_Name_Length;
707 
708  WHILE ((l_flag) AND (l_loop_count < BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_MAX_LOOP_COUNT)) LOOP
709    SELECT count(1) INTO l_count
710    FROM BSC_TAB_IND_GROUPS_VL
711    WHERE UPPER(trim(name)) = UPPER(l_tab_grp_name)
712          AND IND_GROUP_ID <> p_tab_grp_id;
713 
714    IF (l_count = 0) THEN
715     l_flag := FALSE;
716    ELSE
717     l_alias      := get_Next_Alias(l_alias);
718     l_loop_count := l_loop_count + 1;    --prevent infinite loop should alias exhausted
719     --prevent overflow
720     l_overflow := LENGTH(p_tab_grp_name) + LENGTH(l_alias) - l_max_tab_grp_length;
721     IF (l_overflow > 0) THEN
722       l_tab_grp_name := SUBSTR(p_tab_grp_name, 1, LENGTH(p_tab_grp_name)-l_overflow) || l_alias;
723     ELSE
724       l_tab_grp_name := p_tab_grp_name || l_alias;
725     END IF;
726    END IF;
727  END LOOP;
728 
729  RETURN l_tab_grp_name;
730 
731 EXCEPTION
732  WHEN OTHERS THEN
733   RETURN p_tab_grp_name;
734 END Get_Unqiue_Tab_Group_Name;
735 
736 -- API to check if the report is S2E or AG Report.
737 
738 FUNCTION is_Report_S2E(
739    p_Region_Function_Name IN VARCHAR2
740 ) RETURN VARCHAR2
741 IS
742   l_Count  NUMBER;
743 BEGIN
744 
745   l_Count  := 0;
746 
747   SELECT COUNT(1) INTO l_Count
748   FROM   BSC_KPIS_B K
749   WHERE  K.SHORT_NAME = p_Region_Function_Name;
750 
751   IF l_Count <> 0 THEN
752     RETURN 'N';
753   END IF;
754 
755   RETURN 'Y';
756 
757 EXCEPTION
758   WHEN OTHERS THEN
759      RETURN 'N';
760 END is_Report_S2E;
761 
762 
763 -- given the objective short_name, tells us if the
764 -- the Objective was created form Report Designer.
765 FUNCTION is_Objective_Report_Type (
766     p_Short_Name IN VARCHAR2
767 ) RETURN VARCHAR2
768 IS
769     l_Count  NUMBER;
770 BEGIN
771 
772     IF(p_Short_Name IS NULL) THEN
773         RETURN FND_API.G_FALSE;
774     END IF;
775 
776     SELECT COUNT(1) INTO l_Count
777     FROM   BIS_DISPLAY_FORM_FUNC_V B
778     WHERE  B.FUNCTION_NAME = p_Short_Name
779     AND    B.OBJECT_TYPE   = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_OBJECT_TYPE_REPORT;
780     --//For Simulation Objectives we are creating AG Reports but we don't want it to be projected as
781     --//as the report.thats why we are checking the condition that even if form function exists
782     --//and the objective config_type is 7then it should be treated as an objective not as a report.
783 
784     IF (l_Count <> 0) THEN
785         SELECT COUNT(0)
786         INTO   l_Count
787         FROM   bsc_kpis_b
788         WHERE  short_name = p_Short_Name
789         AND    config_Type =7;
790         IF(l_Count <> 0) THEN
791           RETURN FND_API.G_FALSE;
792         ELSE
793          RETURN FND_API.G_TRUE;
794         END IF;
795     ELSE -- Bug#4476730
796         SELECT COUNT(1) INTO l_Count
797         FROM   BSC_KPIS_B
798         WHERE  SHORT_NAME     = p_Short_Name
799         AND    PROTOTYPE_FLAG = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_DELETED_OBJECTIVE_FLAG; -- deleted flag
800         -- bug 5959433 we don't need following condition here
801         -- in simulation flow code won't come here
802         --AND    config_type =7;
803 
804         IF (l_Count <> 0) THEN
805             RETURN FND_API.G_TRUE;
806         ELSE
807             RETURN FND_API.G_FALSE;
808         END IF;
809     END IF;
810 
811     RETURN FND_API.G_FALSE;
812 
813 EXCEPTION
814     WHEN OTHERS THEN
815         RETURN FND_API.G_FALSE;
816 END is_Objective_Report_Type;
817 
818 
819 -- given the objective short_name, tells us if the
820 -- the Objective was created from Page Designer/Configure.
821 FUNCTION is_Objective_Page_Type (
822     p_Short_Name IN VARCHAR2
823 ) RETURN VARCHAR2
824 IS
825     l_Count  NUMBER;
826 BEGIN
827     SELECT COUNT(1) INTO l_Count
828     FROM   BIS_DISPLAY_FORM_FUNC_V B
829     WHERE  B.FUNCTION_NAME = p_Short_Name
830     AND    B.OBJECT_TYPE   = BSC_BIS_CUSTOM_KPI_UTIL_PUB.C_OBJECT_TYPE_PAGE;
831 
832     IF (l_Count <> 0) THEN
833         RETURN FND_API.G_TRUE;
834     END IF;
835 
836     RETURN FND_API.G_FALSE;
837 
838 EXCEPTION
839     WHEN OTHERS THEN
840         RETURN FND_API.G_FALSE;
841 END is_Objective_Page_Type;
842 
843 
844 -- Added for Bug#4369210
845 FUNCTION Is_Objective_AutoGen_Type (
846     p_Short_Name IN VARCHAR2
847 ) RETURN VARCHAR2
848 IS
849     l_Count          NUMBER;
850     l_Region_Code    AK_REGIONS.REGION_CODE%TYPE;
851     l_Source_Type    AK_REGIONS.ATTRIBUTE10%TYPE;
852 BEGIN
853 
854     IF (p_Short_Name IS NULL) THEN
855         RETURN FND_API.G_FALSE;
856     END IF;
857 
858     -- we populate the Objective with FUNCTION_NAME of the report.
859     l_Region_Code := BIS_PMV_UTIL.GetReportRegion(p_Short_Name);
860 
861     SELECT R.ATTRIBUTE10 INTO l_Source_Type
862     FROM   AK_REGIONS R
863     WHERE  R.REGION_CODE = l_Region_Code;
864 
865     IF (l_Source_Type = C_BSC_DATA_SOURCE) THEN
866         RETURN FND_API.G_TRUE;
867     END IF;
868 
869     RETURN FND_API.G_FALSE;
870 
871 EXCEPTION
872     WHEN OTHERS THEN
873         RETURN FND_API.G_FALSE;
874 END Is_Objective_AutoGen_Type;
875 
876 /*
877  * Moved from BSC_BIS_KPI_CRUD_PUB since it is used by non-BSC too
878  * WAM KPI shows the formats in the drop-down from this table.
879  */
880 FUNCTION Get_Format_Mask (
881   p_Format_Id NUMBER
882 ) RETURN VARCHAR2 IS
883 
884   l_Format_Mask  VARCHAR2(15);
885   l_Format_Id    NUMBER;
886 
887 BEGIN
888 
889   l_Format_Id := p_Format_Id;
890 
891   -- Check for standard format ids
892   IF (p_Format_Id NOT IN (0, 1, 2, 5, 6, 7)) THEN
893     l_Format_Id := 0;
894   END IF;
895 
896   -- Changed the Format Mask to use 0
897   SELECT REPLACE(FORMAT,'#','9') FORMAT
898     INTO   l_Format_Mask
899     FROM   BSC_SYS_FORMATS
900     WHERE  FORMAT_ID = l_Format_Id;
901 
902   RETURN l_Format_Mask;
903 END Get_Format_Mask;
904 
905 
906 END BSC_BIS_CUSTOM_KPI_UTIL_PUB;