DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_DIMENSION_KEYS_PKG

Source


1 Package Body BSC_DIMENSION_KEYS_PKG AS
2 /* $Header: BSCDKEYB.pls 120.0 2005/09/15 23:40 appldev noship $ */
3 
4 
5 g_keys_table  varchar2(100);
6 g_session_id  number;
7 -- Non XTD
8 g_periodicities BIS_PMV_PAGE_PARAMETER_TBL;
9 -- XTD specific
10 g_xtd_type varchar2(100);
11 g_xtd_periodicity number;
12 g_xtd_date  dbms_sql.varchar2_table;
13 g_xtd_period  dbms_sql.number_table;
14 g_xtd_year  dbms_sql.number_table;
15 
16 g_dimensions BIS_PMV_PAGE_PARAMETER_TBL;
17 g_measures BIS_PMV_PAGE_PARAMETER_TBL;
18 g_user_periods TabTimePeriods;
19 
20 PROCEDURE initialize_parameters(
21 p_parameters IN BIS_PMV_PAGE_PARAMETER_TBL) IS
22 BEGIN
23   g_periodicities := BIS_PMV_PAGE_PARAMETER_TBL();
24   g_periodicities.delete;
25   g_dimensions := BIS_PMV_PAGE_PARAMETER_TBL();
26   g_dimensions.delete;
27   g_measures := BIS_PMV_PAGE_PARAMETER_TBL();
28   g_measures.delete;
29 
30   FOR i IN 1..p_parameters.count LOOP
31     if p_parameters(i).Parameter_name='PERIODICITY' then
32       --dbms_output.put_line('g_periodicities:start');
33       g_periodicities.extend;
34       g_periodicities(g_periodicities.last):=p_parameters(i);
35       --dbms_output.put_line('g_periodicities:added'||g_periodicities.last);
36     elsif p_parameters(i).Parameter_name='KEYS TABLE' then
37       --dbms_output.put_line('keys table');
38       g_keys_table := p_parameters(i).parameter_value;
39       --dbms_output.put_line('g_keys_table added:'||g_keys_table);
40     elsif p_parameters(i).Parameter_name='SESSION ID' then
41       --dbms_output.put_line('g_session_id:start');
42       g_session_id := nvl(p_parameters(i).parameter_id, to_number(p_parameters(i).parameter_value));
43       --dbms_output.put_line('g_session_id:'||g_session_id);
44     elsif p_parameters(i).Parameter_name='XTD DATE' then
45       --dbms_output.put_line('g_xtd_date start');
46       g_xtd_date(g_xtd_date.count+1) := p_parameters(i).parameter_value;
47       --dbms_output.put_line('g_xtd_date:'||g_xtd_date(g_xtd_date.count));
48     elsif p_parameters(i).Parameter_name='XTD PERIOD' then
49       --dbms_output.put_line('g_xtd_period start');
50       g_xtd_period(g_xtd_period.count+1) := nvl(p_parameters(i).parameter_id, p_parameters(i).parameter_value);
51       --dbms_output.put_line('g_xtd_period end');
52 	elsif p_parameters(i).Parameter_name='XTD YEAR' then
53 	  --dbms_output.put_line('g_xtd_year start');
54       g_xtd_year(g_xtd_year.count+1) := nvl(p_parameters(i).parameter_id, p_parameters(i).parameter_value);
55       --dbms_output.put_line('g_xtd_year end');
56     elsif p_parameters(i).Parameter_name='XTD TYPE' then
57       --dbms_output.put_line('g_xtd_type start');
58       g_xtd_type := p_parameters(i).parameter_value;
59       --dbms_output.put_line('g_xtd_type end');
60     elsif p_parameters(i).Parameter_name='XTD PERIODICITY' then
61       --dbms_output.put_line('g_xtd_periodicity start');
62       g_xtd_periodicity := nvl(p_parameters(i).parameter_id, p_parameters(i).parameter_value);
63       --dbms_output.put_line('g_xtd_periodicity end');
64     elsif p_parameters(i).Parameter_name='DIMENSION'then
65       --dbms_output.put_line('Dimension start');
66       g_dimensions.extend;
67       g_dimensions(g_dimensions.last):=p_parameters(i);
68       --dbms_output.put_line('Dimension end '||g_dimensions.last);
69     elsif p_parameters(i).Parameter_name='MEASURE'then
70       --dbms_output.put_line('Measure start');
71       g_measures.extend;
72       g_measures(g_measures.last):=p_parameters(i);
73       --dbms_output.put_line('Measure end '||g_measures.last);
74     end if;
75   END LOOP;
76   exception when others then
77     --dbms_output.put_line('Exception in initialize_parameters:'||sqlerrm);
78     raise;
79 END;
80 
81 Procedure populate_xtd_keys(
82 p_kpi varchar2,
83 p_dim_set varchar2,
84 p_option_string varchar2,
85 p_error_message OUT nocopy varchar2) is
86 begin
87   for i in 1..g_xtd_date.count loop
88     bsc_bsc_xtd_pkg.populate_rpt_keys(
89                                 g_keys_table,
90                                 g_session_id,
91                                 p_kpi,
92                                 g_xtd_date(i),
93                                 g_xtd_period(i),
94                                 g_xtd_year(i),
95                                 g_xtd_periodicity,
96                                 g_xtd_type,
97                                 p_option_string,
98                                 p_error_message);
99   end loop;
100   --dbms_output.put_line('Completed populate_xtd_keys:'||p_error_message);
101   exception when others then
102     --dbms_output.put_line('Exception in populate_xtd_keys:'||sqlerrm);
103     raise;
104 end;
105 
106 function get_periodicity_info(p_periodicity_id number,
107   p_calendar_id OUT NOCOPY NUMBER,
108   p_custom OUT NOCOPY number,
109   p_db_column_name OUT NOCOPY VARCHAR2,
110   p_error_message OUT NOCOPY VARCHAR2)
111   return boolean is
112 cursor cType IS
113 select calendar_id, custom_code, db_column_name from bsc_sys_periodicities
114 where periodicity_id=p_periodicity_id
115 -- ignore these type of periodicities, they are std periodicites but dont have a db_column_name
116 and periodicity_type not in (11,12);
117 begin
118   open cType;
119   fetch cType into p_calendar_id, p_custom, p_db_column_name;
120   close cType;
121   if (p_custom is null or p_db_column_name is null) then
122     p_error_message := 'Invalid Periodicity id '||p_periodicity_id;
123     return false;
124   end if;
125   return true;
126   exception when others then
127     --dbms_output.put_line('Exception in get_periodicity_info:'||sqlerrm);
128     raise;
129 end;
130 
131 procedure split_string (p_string varchar2, p_separator varchar2, p_first out nocopy varchar2, p_second out nocopy varchar2) is
132 l_position number;
133 begin
134   p_first := p_string;
135   p_second := p_string;
136   l_position := instr(p_string, p_separator);
137   if (l_position > 0) then
138     p_first := substr(p_string, 1, l_position-1);
139     if instr(p_string, p_separator, l_position+length(p_separator)+1)>0 then
140       raise reporting_keys_exception;
141     end if;
142     p_second := substr(p_string, l_position+length(p_separator), length(p_string));
143   else  -- single value like 100.2004 with no TO
144     p_first := p_string;
145     p_second := p_string;
146   end if;
147   exception when others then
148     --dbms_output.put_line('Exception in split_string:'||sqlerrm);
149     raise;
150 end;
151 
152 function get_parsed_periodicities(p_index number) return TimePeriod IS
153 l_value varchar2(1000);
154 l_from varchar2(1000);
155 l_to varchar2(1000);
156 l_to_position number;
157 l_time_period TimePeriod;
158 l_start_period varchar2(100);
159 l_start_year varchar2(100);
160 l_end_period varchar2(100);
161 l_end_year varchar2(100);
162 
163 begin
164   l_value := g_periodicities(p_index).parameter_value;
165   split_string(l_value, ' TO ', l_from, l_to);
166   split_string(l_from, '.', l_start_period, l_start_year);
167   split_string(l_to, '.', l_end_period, l_end_year);
168   --dbms_output.put_line('start period='||l_start_period||', start_year='||l_start_year||', end period='||l_end_period||', end year='||l_end_year);
169   l_time_period.start_period := to_number(l_start_period);
170   l_time_period.start_year := to_number(l_start_year);
171   l_time_period.end_period := to_number(l_end_period);
172   l_time_period.end_year := to_number(l_end_year);
173   return l_time_period;
174   exception when others then
175     --dbms_output.put_line('Exception in get_parsed_periodicities:'||sqlerrm);
176     raise;
177 end;
178 
179 Function parse_periods return TabTimePeriods is
180 
181 l_period TimePeriod;
182 
183 l_create_new_period boolean;
184 l_periods TabTimePeriods;
185 
186 begin
187   for i in 1..g_periodicities.count loop
188     l_periods (l_periods .count+1) := get_parsed_periodicities(i);
189   end loop;
190   return l_periods;
191   exception when others then
192     --dbms_output.put_line('Exception in parse_periods:'||sqlerrm);
193     raise;
194 end;
195 
196 Procedure populate_nonxtd_keys(
197 p_kpi varchar2,
198 p_dim_set varchar2,
199 p_option_string varchar2,
200 p_error_message OUT nocopy varchar2) is
201 l_periodicity_id number;
202 l_custom number;
203 l_db_column_name varchar2(100);
204 l_calendar_id number;
205 
206 l_period_start_period dbms_sql.number_table;
207 l_period_start_year dbms_sql.number_table;
208 l_period_end_period dbms_sql.number_table;
209 l_period_end_year dbms_sql.number_table;
210 l_stmt varchar2(1000);
211 
212 begin
213   l_periodicity_id := g_periodicities(1).parameter_id;
214   if (get_periodicity_info(l_periodicity_id, l_calendar_id, l_custom, l_db_column_name, p_error_message)=false) then
215     --dbms_output.put_line('get_periodicity_info returned false : '||p_error_message);
216     raise reporting_keys_exception;
217   end if;
218   g_user_periods := parse_periods;
219   for i in 1..g_user_periods.count loop
220     l_period_start_period(i) := g_user_periods(i).start_period;
221 	l_period_start_year(i) := g_user_periods(i).start_year;
222     l_period_end_period(i) := g_user_periods(i).end_period;
223 	l_period_end_year(i) := g_user_periods(i).end_year;
224   end loop;
225 
226   if (l_custom=0) then -- std periodicites, goto db calendar
227     l_stmt := 'INSERT into '||g_keys_table||'(
228                SESSION_ID,
229                REPORT_DATE,
230                XTD_PERIOD,
231                XTD_YEAR,
232                XTD_PERIODICITY,
233                PERIOD,
234                YEAR,
235                PERIOD_TYPE_ID,
236                PERIODICITY_ID,
237                PERIOD_FLAG,
238                DAY_COUNT,
239                ROLLING_FLAG,
240                LAST_UPDATE_DATE)
241               select
242                 :1,
243                 null,
244                 null,
245                 null,
246                 null, '||
247                 l_db_column_name||
248                 ', year,
249                 null,
250                 :2,
251                 null,
252                 null,
253                 :3,
254                 sysdate
255               from bsc_db_calendar
256              where year between :4 and :5
257                and '||l_db_column_name||' between :6 and :7
258                and calendar_id = :8';
259     forall i in 1..g_user_periods.count
260       execute immediate l_stmt using g_session_id, l_periodicity_id, 'N',
261       l_period_start_year(i), l_period_end_year(i), l_period_start_period(i),
262       l_period_end_period(i), l_calendar_id;
263   else -- custom periodicitie, goto bsc_sys_periods
264       l_stmt := 'INSERT into '||g_keys_table||'(
265                SESSION_ID,
266                REPORT_DATE,
267                XTD_PERIOD,
268                XTD_YEAR,
269                XTD_PERIODICITY,
270                PERIOD,
271                YEAR,
272                PERIOD_TYPE_ID,
273                PERIODICITY_ID,
274                PERIOD_FLAG,
275                DAY_COUNT,
276                ROLLING_FLAG,
277                LAST_UPDATE_DATE)
278               select
279                 :1,
280                 null,
281                 period_id,
282                 year,
283                 :2,
284                 period_id,
285                 year,
286                 null,
287                 :3,
288                  0,
289                  null,
290                 :4,
291                 sysdate
292               from bsc_sys_periods
293              where
294               year between :5 and :6
295                and period_id between :7 and :8
296                and periodicity_id = :9';
297     forall i in 1..g_user_periods.count
298       execute immediate l_stmt using g_session_id, l_periodicity_id, l_periodicity_id, 'N',
299       l_period_start_year(i), l_period_end_year(i), l_period_start_period(i), l_period_end_period(i), l_periodicity_id;
300   end if;
301   -- mark the last period as 1
302   execute immediate 'update '||g_keys_table||' set period_flag=1 where period = (select max(period) from '||g_keys_table||' group by periodicity_id)';
303   exception when others then
304     --dbms_output.put_line('Exception in populate_nonxtd_keys:'||sqlerrm);
305     raise;
306 end;
307 
308 function is_measure_short_name(p_measure varchar2) return boolean is
309 l_count number;
310 begin
311   select count(1) into l_count from bsc_sys_measures where short_name=p_measure;
312   if (l_count > 0) then
313     return true;
314   end if;
315   return false;
316 end;
317 
318 Procedure Limit_AW(p_kpi varchar2, p_dim_set number) is
319 
320 l_parameters BIS_PMV_PAGE_PARAMETER_TBL;
321 l_parameter BIS_PMV_PAGE_PARAMETER_REC;
322 b_pmv_measure boolean;
323 begin
324   l_parameters := BIS_PMV_PAGE_PARAMETER_TBL();
325   -- rearrange data for AW call
326   --dbms_output.put_line('going to check dimensions');
327   --dbms_output.put_line('count='||g_dimensions.count );
328   for i in 1..g_dimensions.count loop
329     --dbms_output.put_line('0');
330     l_parameter := g_dimensions(i);
331     l_parameters.extend;
332     --dbms_output.put_line('1 '||g_dimensions(i).dimension);
333     l_parameter.parameter_name := g_dimensions(i).dimension;
334     --dbms_output.put_line('2');
335     l_parameter.parameter_id :=  g_dimensions(i).parameter_id;
336     --dbms_output.put_line('3');
337     l_parameter.parameter_value := g_dimensions(i).parameter_value;
338     --dbms_output.put_line('4');
339     l_parameter.dimension := g_dimensions(i).parameter_name;--'DIMENSION'
340     l_parameters(l_parameters.last) := l_parameter;
341   end loop;
342    --dbms_output.put_line('going to check measures');
343   for i in 1..g_measures.count loop
344     l_parameter := g_measures(i);
345     l_parameters.extend;
346     if (i=1) then
347       b_pmv_measure := is_measure_short_name(g_measures(i).parameter_value);
348     end if;
349     l_parameter.parameter_name := g_measures(i).parameter_value;
350     l_parameter.parameter_id :=  g_measures(i).parameter_id;
351     l_parameter.parameter_value := g_measures(i).parameter_value;
352     l_parameter.dimension := g_measures(i).parameter_name;--'MEASURE'
353     l_parameters(l_parameters.last) := l_parameter;
354   end loop;
355   -- xtd parameters
356   if (g_xtd_type is not null) then -- XTD query
357     l_parameters.extend;
358     l_parameter.parameter_name := g_keys_table;
359     l_parameter.parameter_id :=  null;
360     l_parameter.parameter_value := null;
361     l_parameter.dimension := 'XTD KEYS TABLE';
362     l_parameters(l_parameters.last) := l_parameter;
363     l_parameters.extend;
364     l_parameter.parameter_name := g_session_id;
365     l_parameter.parameter_id :=  null;
366     l_parameter.parameter_value := null;
367     l_parameter.dimension := 'XTD SESSION ID';
368     l_parameters(l_parameters.last) := l_parameter;
369     for i in 1..g_xtd_date.count loop
370       l_parameters.extend;
371       l_parameter.parameter_name := g_xtd_date(i);
372       l_parameter.parameter_id :=  null;
373       l_parameter.parameter_value := null;
374       l_parameter.dimension := 'XTD REPORT DATE';
375       l_parameters(l_parameters.last) := l_parameter;
376     end loop;
377   else-- non XTD query
378     for i in 1..g_periodicities.count loop
379       l_parameters.extend;
380       l_parameter.parameter_name := g_periodicities(i).parameter_id;
381       l_parameter.parameter_id :=  null;
382       l_parameter.parameter_value := g_periodicities(i).parameter_value;
383       l_parameter.dimension := g_periodicities(i).parameter_value;
384       l_parameters(l_parameters.last) := l_parameter;
385     end loop;
386   end if;
387   --dbms_output.put_line('Calling aw_read.limit :'||bsc_mo_helper_pkg.get_time);
388   if (b_pmv_measure) then
389     bsc_aw_read.limit_dimensions_pmv(p_kpi, p_dim_set, l_parameters);
390   else
391     bsc_aw_read.limit_dimensions(p_kpi, p_dim_set, l_parameters);
392   end if;
393   --dbms_output.put_line('Calling aw_read.limit :'||bsc_mo_helper_pkg.get_time);
394 
395 end;
396 
397 Procedure initialize_query (
398 p_kpi varchar2,
399 p_dim_set varchar2,
400 p_parameters BIS_PMV_PAGE_PARAMETER_TBL,
401 p_option_string varchar2,
402 p_error_message out nocopy varchar2
403 ) is
404 --
405 l_status varchar2(400);
406 l_start number;
407 l_end number;
408 Begin
409   --dbms_output.put_line('Initialize Query :'||bsc_mo_helper_pkg.get_time);
410   l_start := dbms_utility.get_time;
411   initialize_parameters(p_parameters);
412   if (g_xtd_type is not null) then -- XTD query
413     populate_xtd_keys(p_kpi, p_dim_set, p_option_string, p_error_message);
414   else
415     populate_nonxtd_keys(p_kpi, p_dim_set, p_option_string, p_error_message);
416   end if;
417   l_end := dbms_utility.get_time;
418   --dbms_output.put_line('calling internal limit api, time so far = '||(l_end-l_start));
419    l_start := dbms_utility.get_time;
420   limit_aw(p_kpi, p_dim_set);
421    l_end := dbms_utility.get_time;
422    --dbms_output.put_line('completed internal limit api, time so far = '||(l_end-l_start));
423 exception when others then
424     --dbms_output.put_line('Exception in initialize_query:'||sqlerrm);
425     raise;
426 End;
427 END BSC_DIMENSION_KEYS_PKG;