DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_COMMON_DIMENSIONS_PUB

Source


1 PACKAGE BODY BSC_COMMON_DIMENSIONS_PUB AS
2 /* $Header: BSCPLIBB.pls 120.3.12000000.1 2007/07/17 07:44:12 appldev noship $ */
3 
4 
5 -- The following API saves LIST BUTTON (Common Dimension) configuration
6 -- for a particular SCORECARD.
7 -- INPUT :
8 --      p_new_list_config     A semicolon(;) seperated values of common dimension objects
9 --                            that have to be saved.
10 --      p_old_list_config     A semicolon(;) seperated values of common dimension objects
11 --                            that were saved. When there are no common dimensions saved,
12 --                            this is empty.
13 -- NOTE:1.  Each common dimension object record contains a commma seperated list of the following
14 --          properties in order:
15 --          (dim_level_index, dim_level_id, parent_level_index, parent_level_id)
16 --          And then each such dimension object record is seperated by a semicolon.
17 --      2.  When we want to delete existing common dimension objects,
18 --          p_new_list_config should be an empty string.
19 --      3.  When there is no common dimension configuration, the p_old_list_config is empty
20 
21 PROCEDURE save_list_button_config
22 (p_tab_id                 IN               NUMBER
23 ,p_new_list_config        IN               VARCHAR2
24 ,p_old_list_config        IN               VARCHAR2
25 ,p_commit                 IN               VARCHAR2 := FND_API.G_FALSE
26 ,x_return_status          OUT       NOCOPY VARCHAR2
27 ,x_msg_count              OUT       NOCOPY NUMBER
28 ,x_msg_data               OUT       NOCOPY VARCHAR2
29 ) IS
30 
31 BEGIN
32   IF (p_tab_id IS NOT NULL) THEN
33 
34     BSC_COMMON_DIMENSIONS_PVT.reset_dim_default_value
35     (
36        p_Tab_Id         =>  p_tab_id
37       ,x_return_status  =>  x_return_status
38       ,x_msg_count      =>  x_msg_count
39       ,x_msg_data       =>  x_msg_data
40     );
41     IF(x_return_status IS NOT NULL AND x_return_status <>FND_API.G_RET_STS_SUCCESS ) THEN
42      RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
43     END IF;
44 
45     BSC_COMMON_DIMENSIONS_PVT.delete_common_dimensions(
46         p_tab_id            =>   p_tab_id
47        ,p_commit            =>   FND_API.G_FALSE
48        ,x_return_status     =>   x_return_status
49        ,x_msg_count         =>   x_msg_count
50        ,x_msg_data          =>   x_msg_data
51     );
52 
53     IF (p_new_list_config IS NOT NULL) THEN
54       BSC_COMMON_DIMENSIONS_PVT.insert_common_dimensions(
55          p_tab_id            =>   p_tab_id
56         ,p_new_list_config   =>   p_new_list_config
57         ,p_commit            =>   FND_API.G_FALSE
58         ,x_return_status     =>   x_return_status
59         ,x_msg_count         =>   x_msg_count
60         ,x_msg_data          =>   x_msg_data
61     );
62 
63     END IF;
64 
65     BSC_COMMON_DIMENSIONS_PUB.update_user_list_access(
66          p_tab_id            =>   p_tab_id
67         ,p_new_list_config   =>   p_new_list_config
68         ,p_old_list_config   =>   p_old_list_config
69         ,p_commit            =>   FND_API.G_FALSE
70         ,x_return_status     =>   x_return_status
71         ,x_msg_count         =>   x_msg_count
72         ,x_msg_data          =>   x_msg_data
73     );
74 
75 
76     --VALIDATE common dimensions
77     BSC_COMMON_DIM_LEVELS_PUB.Check_Common_Dim_Levels(
78          p_commit            =>   FND_API.G_FALSE
79         ,p_Tab_Id            =>   p_tab_id
80         ,x_return_status     =>   x_return_status
81         ,x_msg_count         =>   x_msg_count
82         ,x_msg_data          =>   x_msg_data
83     );
84 
85 
86 
87   END IF;
88 EXCEPTION
89     WHEN FND_API.G_EXC_ERROR THEN
90         FND_MSG_PUB.Count_And_Get
91         (      p_encoded   =>  FND_API.G_FALSE
92            ,   p_count     =>  x_msg_count
93            ,   p_data      =>  x_msg_data
94         );
95 
96         x_return_status :=  FND_API.G_RET_STS_ERROR;
97         RAISE;
98     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
99         FND_MSG_PUB.Count_And_Get
100         (      p_encoded   =>  FND_API.G_FALSE
101            ,   p_count     =>  x_msg_count
102            ,   p_data      =>  x_msg_data
103         );
104         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
105 
106         RAISE;
107     WHEN NO_DATA_FOUND THEN
108         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
109         IF (x_msg_data IS NOT NULL) THEN
110             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.save_list_button_config ';
111         ELSE
112             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.save_list_button_config ';
113         END IF;
114 
115         RAISE;
116     WHEN OTHERS THEN
117         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
118         IF (x_msg_data IS NOT NULL) THEN
119             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.save_list_button_config ';
120         ELSE
121             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.save_list_button_config ';
122         END IF;
123 
124         RAISE;
125 END save_list_button_config;
126 
127 
128 
129 
130 -- The following API provides the access to common dimensions.
131 --
132 -- INPUT :
133 --      p_new_list_config     A semicolon(;) seperated values of common dimension objects
134 --                            that have to be saved.
135 --      p_old_list_config     A semicolon(;) seperated values of common dimension objects
136 --                            that were saved. When there are no common dimensions saved,
137 --                            this is empty.
138 -- NOTE:    Each common dimension object record contains a commma seperated list of the following
139 --          properties in order:
140 --          (dim_level_index, dim_level_id, parent_level_index, parent_level_id)
141 
142 
143 PROCEDURE update_user_list_access
144 (
145  p_tab_id                 IN               NUMBER
146 ,p_new_list_config        IN               VARCHAR2
147 ,p_old_list_config        IN               VARCHAR2
148 ,p_commit                 IN               VARCHAR2 := FND_API.G_FALSE
149 ,x_return_status          OUT       NOCOPY VARCHAR2
150 ,x_msg_count              OUT       NOCOPY NUMBER
151 ,x_msg_data               OUT       NOCOPY VARCHAR2
152 ) IS
153 
154 CURSOR c_new_list_config IS
155    SELECT *
156    FROM bsc_sys_com_dim_levels
157    WHERE tab_id = p_tab_id
158    ORDER BY dim_level_index;
159 
160 CURSOR c_tab_responsibilities IS
161    SELECT responsibility_id
162    FROM BSC_USER_TAB_ACCESS
163    WHERE tab_id = p_tab_id
164      AND (end_date IS NULL OR end_date >= SYSDATE);
165 
166 CURSOR c_tab_kpis IS
167    SELECT DISTINCT kpi_measure_id, indicator
168    FROM bsc_kpi_analysis_measures_b
169    WHERE indicator IN (SELECT DISTINCT ti.indicator
170                        FROM bsc_tab_indicators ti
171                        WHERE ti.tab_id = p_tab_id);
172 
173 l_new_dim_obj_recs          BSC_UTILITY.varchar_tabletype;
174 l_new_dim_obj_cnt           NUMBER;
175 l_new_dim_props             BSC_UTILITY.varchar_tabletype;
176 l_new_cnt                   NUMBER;
177 
178 l_old_dim_obj_recs          BSC_UTILITY.varchar_tabletype;
179 l_old_dim_obj_cnt           NUMBER;
180 l_old_dim_props             BSC_UTILITY.varchar_tabletype;
181 l_old_cnt                   NUMBER;
182 
183 l_index                     NUMBER;
184 l_user_id                   NUMBER;
185 l_login_id                  NUMBER;
186 l_dim_level_index           NUMBER;
187 
188 BEGIN
189   IF (p_tab_id IS NOT NULL) THEN
190 
191     IF (p_old_list_config IS NULL) THEN
192       l_old_dim_obj_cnt := 0;
193     ELSE
194       BSC_UTILITY.Parse_String(
195                 p_List         =>   p_old_list_config,
196                 p_Separator    =>   ';',
197                 p_List_Data    =>   l_old_dim_obj_recs,
198                 p_List_number  =>   l_old_dim_obj_cnt
199                 );
200     END IF;
201 
202     IF (p_new_list_config IS NULL) THEN
203       l_new_dim_obj_cnt := 0;
204     ELSE
205       BSC_UTILITY.Parse_String(
206                  p_List         =>     p_new_list_config,
207                  p_Separator    =>     ';',
208                  p_List_Data    =>     l_new_dim_obj_recs,
209                  p_List_number  =>     l_new_dim_obj_cnt
210                    );
211     END IF;
212 
213     IF (l_old_dim_obj_cnt = l_new_dim_obj_cnt) THEN
214       RETURN;
215     END IF;
216 
217 
218     BSC_COMMON_DIMENSIONS_PUB.change_prototype_flag(
219                p_prototype_flag  =>  BSC_DESIGNER_PVT.G_ActionFlag.GAA_Color,
220                p_tab_id          =>  p_tab_id,
221                p_dim_level_id    =>  NULL,
222                p_commit          =>  p_commit,
223                x_return_status   =>  x_return_status,
224                x_msg_count       =>  x_msg_count,
225                x_msg_data        =>  x_msg_data
226               );
227 
228     FOR cd IN c_tab_kpis LOOP
229 
230        IF (cd.indicator IS NOT NULL AND cd.kpi_measure_id IS NOT NULL) THEN
231          BSC_KPI_COLOR_PROPERTIES_PUB.Change_Prototype_Flag
232                   (  p_objective_id    =>  cd.indicator
233                    , p_kpi_measure_id  =>  cd.kpi_measure_id
234                    , p_prototype_flag  =>  7
235                    , x_return_status   =>  x_return_status
236                    , x_msg_count       =>  x_msg_count
237                    , x_msg_data        =>  x_msg_data
238                   );
239        END IF;
240     END LOOP;
241 
242     IF (l_old_dim_obj_cnt > l_new_dim_obj_cnt) THEN
243         l_index := l_new_dim_obj_cnt;
244     ELSE
245         l_index := l_old_dim_obj_cnt;
246     END IF;
247     BSC_COMMON_DIMENSIONS_PVT.delete_user_list_access (
248                   p_tab_id               => p_tab_id
249                  ,p_dim_level_index      => l_index
250                  ,p_commit               => FND_API.G_FALSE
251                  ,x_return_status        => x_return_status
252                  ,x_msg_count            => x_msg_count
253      ,x_msg_data             => x_msg_data
254     );
255 
256     --DELETE FROM BSC_USER_LIST_ACCESS WHERE tab_id = p_tab_id AND DIM_LEVEL_INDEX >= (l_index-1);
257 
258     l_user_id := fnd_global.USER_ID;
259     l_login_id := fnd_global.LOGIN_ID;
260     FOR cd IN c_tab_responsibilities LOOP
261       FOR i IN 1..l_new_dim_obj_cnt LOOP
262         l_new_cnt :=  0;
263         BSC_UTILITY.Parse_String(
264                  p_List         =>     l_new_dim_obj_recs(i),
265                  p_Separator    =>     ',',
266                  p_List_Data    =>     l_new_dim_props,
267                  p_List_number  =>     l_new_cnt);
268 
269         IF (l_new_cnt > 0) THEN
270 
271           l_dim_level_index := TO_NUMBER(l_new_dim_props(1));
272 
273           IF (l_dim_level_index IS NOT NULL) THEN
274             IF (l_dim_level_index > l_index-1) THEN
278               ,p_dim_level_index    =>  l_dim_level_index
275               BSC_COMMON_DIMENSIONS_PVT.insert_user_list_access(
276                p_responsibility_id  =>  cd.responsibility_id
277               ,p_tab_id             =>  p_tab_id
279               ,p_dim_level_value    =>  0
280               ,p_creation_date      =>  SYSDATE
281               ,p_created_by         =>  l_user_id
282               ,p_last_update_date   =>  SYSDATE
283               ,p_last_updated_by    =>  l_login_id
284               ,p_last_update_login  =>  NULL
285               ,p_commit             =>  FND_API.G_FALSE
286               ,x_return_status      =>  x_return_status
287               ,x_msg_count          =>  x_msg_count
288               ,x_msg_data           =>  x_msg_data
289               );
290             END IF;
291 
292             --INSERT INTO bsc_user_list_access(responsibility_id,tab_id,dim_level_index,dim_level_value,creation_date,created_by,last_update_date,last_updated_by,last_update_login)
293             --VALUES (cd.responsibility_id, p_tab_id, l_dim_level_index, 0, SYSDATE, l_user_id,SYSDATE, l_login_id, null);
294 
295           END IF;
296         END IF;
297       END LOOP;
298     END LOOP;
299   END IF;
300 EXCEPTION
301     WHEN FND_API.G_EXC_ERROR THEN
302         FND_MSG_PUB.Count_And_Get
303         (      p_encoded   =>  FND_API.G_FALSE
304            ,   p_count     =>  x_msg_count
305            ,   p_data      =>  x_msg_data
306         );
307 
308         x_return_status :=  FND_API.G_RET_STS_ERROR;
309         RAISE;
310     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
311         FND_MSG_PUB.Count_And_Get
312         (      p_encoded   =>  FND_API.G_FALSE
313            ,   p_count     =>  x_msg_count
314            ,   p_data      =>  x_msg_data
315         );
316         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
317 
318         RAISE;
319     WHEN NO_DATA_FOUND THEN
320         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
321         IF (x_msg_data IS NOT NULL) THEN
322             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.update_user_list_access ';
323         ELSE
324             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.update_user_list_access ';
325         END IF;
326 
327         RAISE;
328     WHEN OTHERS THEN
329         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
330         IF (x_msg_data IS NOT NULL) THEN
331             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.update_user_list_access ';
332         ELSE
333             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.update_user_list_access ';
334         END IF;
335 
336         RAISE;
337 END update_user_list_access;
338 
339 
340 --  The following API sets a particular prototype flag to all the
341 --  indicators under a scorecard, if the input parameter p_tab_id
342 --  is not null. If the input parameter p_dim_level_id is also not null,
343 --  then the prototype flag is set to all the indicators that contain
344 --  the dimension level in that scorecard.
345 
346 PROCEDURE change_prototype_flag
347 (
348   p_prototype_flag         IN               NUMBER
349  ,p_tab_id                 IN               NUMBER
350  ,p_dim_level_id           IN               NUMBER
351  ,p_commit                 IN               VARCHAR2 := FND_API.G_FALSE
352  ,x_return_status          OUT       NOCOPY VARCHAR2
353  ,x_msg_count              OUT       NOCOPY NUMBER
354  ,x_msg_data               OUT       NOCOPY VARCHAR2
355 
356 ) IS
357 
358 --CURSOR for all indicators in a tab
359 CURSOR c_inds IS
360   SELECT DISTINCT ti.indicator
361   FROM bsc_tab_indicators ti
362   WHERE ti.tab_id = p_tab_id;
363 --CURSOR for indicators that contain particular dim level
364 CURSOR c_inds_levels  IS
365   SELECT DISTINCT ti.indicator
366   FROM bsc_tab_indicators ti, bsc_sys_dim_levels_b sd, bsc_kpi_dim_levels_b kd
367   WHERE ti.tab_id = p_tab_id AND sd.dim_level_id = p_dim_level_id AND
368         kd.indicator = ti.indicator AND kd.level_table_name = sd.level_table_name;
369 
370 BEGIN
371   IF (p_tab_id IS NOT NULL) THEN
372 
373     IF (p_dim_level_id IS NOT NULL) THEN
374       FOR cd IN c_inds_levels LOOP
375         BSC_DESIGNER_PVT.ActionFlag_Change(
376             x_indicator => cd.indicator,
377             x_newflag   => p_prototype_flag
378             );
379       END LOOP;
380 
381     ELSE
382       FOR cd IN c_inds LOOP
383         BSC_DESIGNER_PVT.ActionFlag_Change(
384              x_indicator => cd.indicator,
385              x_newflag   => p_prototype_flag
386              );
387       END LOOP;
388     END IF;
389 
390   END IF;
391 
392 EXCEPTION
393     WHEN FND_API.G_EXC_ERROR THEN
394         FND_MSG_PUB.Count_And_Get
395         (      p_encoded   =>  FND_API.G_FALSE
396            ,   p_count     =>  x_msg_count
397            ,   p_data      =>  x_msg_data
398         );
399 
400         x_return_status :=  FND_API.G_RET_STS_ERROR;
401         RAISE;
402     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
403         FND_MSG_PUB.Count_And_Get
404         (      p_encoded   =>  FND_API.G_FALSE
405            ,   p_count     =>  x_msg_count
406            ,   p_data      =>  x_msg_data
407         );
408         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
409 
410         RAISE;
411     WHEN NO_DATA_FOUND THEN
412         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
413         IF (x_msg_data IS NOT NULL) THEN
414             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.change_prototype_flag ';
415         ELSE
416             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.change_prototype_flag ';
417         END IF;
418 
419         RAISE;
420     WHEN OTHERS THEN
421         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
422         IF (x_msg_data IS NOT NULL) THEN
423             x_msg_data      :=  x_msg_data||' -> BSC_COMMON_DIMENSIONS_PUB.change_prototype_flag ';
424         ELSE
425             x_msg_data      :=  SQLERRM||' at BSC_COMMON_DIMENSIONS_PUB.change_prototype_flag ';
426         END IF;
427 
428         RAISE;
429 END change_prototype_flag;
430 
431 END BSC_COMMON_DIMENSIONS_PUB;