DBA Data[Home] [Help]

PACKAGE BODY: APPS.ISC_DBI_SUTIL_PKG

Source


1 PACKAGE BODY ISC_DBI_SUTIL_PKG AS
2 /*$Header: iscdbisutilb.pls 120.1 2005/06/14 11:25:38 appldev  $ */
3 
4 
5 /*++++++++++++++++++++++++++++++++++++++++*/
6 /* Local Functions
7 /*++++++++++++++++++++++++++++++++++++++++*/
8 PROCEDURE init_dim_map (p_dim_map out NOCOPY
9                         poa_dbi_util_pkg.poa_dbi_dim_map,
10                         p_mv_set IN VARCHAR2);
11 
12 FUNCTION get_mv (p_mv_set IN VARCHAR2,
13          p_mv_level_flag IN VARCHAR2,
14          p_view_by IN VARCHAR2,
15          p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
16     RETURN VARCHAR2;
17 
18 FUNCTION get_col_name (p_dim_name VARCHAR2)
19     RETURN VARCHAR2;
20 
21 FUNCTION get_table (p_dim_name VARCHAR2)
22     RETURN VARCHAR2;
23 
24 FUNCTION get_security_where_clause(p_org_value IN VARCHAR2, p_trend IN VARCHAR2 DEFAULT 'N', p_mv_set IN VARCHAR2)
25     RETURN VARCHAR2;
26 
27 FUNCTION get_additional_where_clause(p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map, p_mv_set IN VARCHAR2, p_view_by IN VARCHAR2)
28     RETURN VARCHAR2;
29 
30 FUNCTION get_mv_flag_where_clause (p_mv_flag_type IN VARCHAR2, p_trend IN VARCHAR2 DEFAULT 'N',
31                    p_mv IN VARCHAR2 DEFAULT '', p_mv_where_clause IN VARCHAR2)
32     RETURN VARCHAR2;
33 
34 FUNCTION get_flag_where_clause(p_trend IN VARCHAR2 DEFAULT 'N')
35     RETURN VARCHAR2;
36 
37 FUNCTION get_flag_where_clause2(p_trend IN VARCHAR2 DEFAULT 'N')
38     RETURN VARCHAR2;
39 
40 PROCEDURE update_col_name (p_dim_map IN out NOCOPY poa_dbi_util_pkg.poa_dbi_dim_map,
41                            p_mv_set IN VARCHAR2,
42 			   p_dim_name VARCHAR2);
43 
44 PROCEDURE get_join_info (p_view_by IN varchar2,
45                          p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map,
46                          x_join_tbl OUT NOCOPY
47                          poa_dbi_util_pkg.POA_DBI_JOIN_TBL,
48                          p_mv_set IN VARCHAR2);
49 
50 PROCEDURE populate_in_join_tbl(p_in_join_tbl out NOCOPY poa_dbi_util_pkg.poa_dbi_in_join_tbl,
51 	                       p_view_by in VARCHAR2,
52                                p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map);
53 
54 FUNCTION get_mv_level_flag (p_mv_flag_type VARCHAR2,
55                             p_dim_name VARCHAR2,
56                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
57     RETURN VARCHAR2;
58 
59 FUNCTION get_flag_one_val (p_dim_name VARCHAR2,
60                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
61     RETURN VARCHAR2;
62 
63 FUNCTION get_flag_two_val (p_dim_name VARCHAR2,
64                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
65     RETURN VARCHAR2;
66 
67 FUNCTION get_flag_three_val (p_dim_name VARCHAR2,
68                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
69     RETURN VARCHAR2;
70 
71 FUNCTION get_flag_four_val (p_dim_name VARCHAR2,
72                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
73     RETURN VARCHAR2;
74 
75 FUNCTION get_flag_five_val (p_dim_name VARCHAR2,
76                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
77     RETURN VARCHAR2;
78 
79 FUNCTION get_mv_where_clause_flag (p_mv IN VARCHAR2)
80     RETURN VARCHAR2;
81 
82 /*++++++++++++++++++++++++++++++++++++++++*/
83 /* Function Definitions
84 /*++++++++++++++++++++++++++++++++++++++++*/
85 
86 /* process_parameters
87 
88     Generic routine to process the parameters passed in from the PMV
89     page.
90 
91     Points of note:
92     p_mv_level_flag - all report queries using this
93                       package will use a flag to decide which rows of
94                       their MVs they will need to query.
95 
96 */
97 PROCEDURE process_parameters (p_param IN BIS_PMV_PAGE_PARAMETER_TBL,
98                               p_view_by OUT NOCOPY VARCHAR2,
99                               p_view_by_col_name OUT NOCOPY VARCHAR2,
100                               p_comparison_type OUT NOCOPY VARCHAR2,
101                               p_xtd OUT NOCOPY VARCHAR2,
102                               p_cur_suffix OUT NOCOPY VARCHAR2,
103                               p_where_clause OUT NOCOPY VARCHAR2,
104                               p_mv OUT NOCOPY VARCHAR2,
105                               p_join_tbl OUT NOCOPY
106                               poa_dbi_util_pkg.poa_dbi_join_tbl,
107                               p_mv_level_flag OUT NOCOPY VARCHAR2,
108                               p_trend IN VARCHAR2,
109                               p_func_area IN VaRCHAR2,
110                               p_version IN VARCHAR2,
111                               p_role IN VARCHAR2,
112                               p_mv_set IN VARCHAR2,
113                               p_mv_flag_type IN VARCHAR2 DEFAULT 'NONE',
114 			      p_in_join_tbl OUT NOCOPY
115 			      poa_dbi_util_pkg.poa_dbi_in_join_tbl)
116 IS
117     l_dim_map poa_dbi_util_pkg.poa_dbi_dim_map;
118     l_dim_bmap NUMBER;
119     l_org_val VARCHAR2 (120);
120 
121     l_as_of_date DATE;
122     l_prev_as_of_date DATE;
123     l_nested_pattern NUMBER;
124 
125     l_mv_where_clause VARCHAR2(1); -- Determines if MV Flag Where Clause needs to be appended.
126 
127     l_stmt_id NUMBER;
128 
129 BEGIN
130 
131     l_mv_where_clause := 'Y';
132     l_stmt_id := 0;
133 
134     -- initialize the dimension map with all the required dimensions.
135     l_dim_bmap := 0;
136     l_org_val := NULL;
137     l_stmt_id := 10;
138     init_dim_map (p_dim_map => l_dim_map,
139               p_mv_set => p_mv_set);
140 
141     -- Get the various parameter values from the utility package.
142     -- This package will also compute the l_dim_bmap
143     l_stmt_id := 20;
144     poa_dbi_util_pkg.get_parameter_values (p_param => p_param,
145                                            p_dim_map => l_dim_map,
146                                            p_view_by => p_view_by,
147                                            p_comparison_type => p_comparison_type,
148                                            p_xtd => p_xtd,
149                                            p_as_of_date => l_as_of_date,
150                                            p_prev_as_of_date => l_prev_as_of_date,
151                                            p_cur_suffix => p_cur_suffix,
152                                            p_nested_pattern => l_nested_pattern,
153                                            p_dim_bmap => l_dim_bmap);
154 
155     l_stmt_id := 25;
156     -- In certain cases, we may need to use different dimension cols from the MVs
157     update_col_name(l_dim_map,p_mv_set,p_view_by);
158 
159     -- Find out the view by column name
160     l_stmt_id := 30;
161     IF (l_dim_map.exists (p_view_by)) THEN
162         p_view_by_col_name := l_dim_map(p_view_by).col_name;
163     END IF;
164 
165     -- Get the org values
166     IF (l_dim_map.exists ('ORGANIZATION+ORGANIZATION')) THEN
167         l_org_val := l_dim_map ('ORGANIZATION+ORGANIZATION').value;
168     END IF;
169 
170     -- Finally get the join info based on the dimension level parameters
171     -- passed in.
172     l_stmt_id := 40;
173     get_join_info (p_view_by => p_view_by,
174                p_dim_map => l_dim_map,
175                x_join_tbl => p_join_tbl,
176                p_mv_set => p_mv_set);
177 
178     -- Get the flag value for MV aggregation
179     l_stmt_id := 50;
180     p_mv_level_flag := get_mv_level_flag (p_mv_flag_type => p_mv_flag_type,
181                           		  p_dim_name => p_view_by,
182                                           p_dim_map => l_dim_map);
183 
184     -- Get the MV we need to join to.
185     l_stmt_id := 60;
186     p_mv := get_mv (p_mv_set => p_mv_set,
187                 p_mv_level_flag => p_mv_level_flag,
188                 p_view_by => p_view_by,
189                 p_dim_map => l_dim_map);
190 
191     -- Determine if MV Flag Where Clause needs to be appended. By default the value is 'Y'
192     l_stmt_id := 70;
193     l_mv_where_clause := get_mv_where_clause_flag (p_mv => p_mv);
194 
195     -- Get the dimension level specific where clauses
196     -- and the security where clause.
197     l_stmt_id := 80;
198     p_where_clause := poa_dbi_util_pkg.get_where_clauses (p_dim_map => l_dim_map,
199                                                           p_trend => p_trend);
200 
201     -- Attach the optional MV flag where clause
202     l_stmt_id := 90;
203     p_where_clause := p_where_clause ||
204                        get_mv_flag_where_clause (p_mv_flag_type => p_mv_flag_type,
205                                      p_trend => p_trend,
206                                      p_mv => p_mv,
207                                      p_mv_where_clause => l_mv_where_clause);
208 
209     -- Attach the security clause
210     l_stmt_id := 100;
211     p_where_clause := p_where_clause ||
212                    get_security_where_clause (p_org_value => l_org_val,
213                                p_trend => p_trend,
214                                p_mv_set => p_mv_set);
215 
216     -- Attach the additional where clauses
217     l_stmt_id := 110;
218     p_where_clause := p_where_clause ||
219                    get_additional_where_clause (p_dim_map => l_dim_map,
220                                p_mv_set => p_mv_set,
221                                p_view_by => p_view_by);
222 
223     l_stmt_id := 120;
224     -- Add extra join conditions (if necessary)
225     populate_in_join_tbl(p_in_join_tbl => p_in_join_tbl,
226                          p_view_by => p_view_by,
227                          p_dim_map => l_dim_map);
228 
229 
230 END process_parameters;
231 
232 /*++++++++++++++++++++++++++++++++++++++++*/
233 /* To determine if the MV where flag clause
234    is required.
235 /*++++++++++++++++++++++++++++++++++++++++*/
236 /*  get_mv_where_clause_flag
237     If the MV definition does not have a
238     MV Level Flag or an aggregation
239     level flag return 'N' else return 'Y'
240 */
241 FUNCTION get_mv_where_clause_flag (p_mv IN VARCHAR2)
242      RETURN VARCHAR2
243 IS
244     l_mv_where_clause_flag VARCHAR2(1);
245 BEGIN
246     l_mv_where_clause_flag :=
247         (CASE p_mv
248             WHEN 'ISC_DBI_CFM_003_MV' THEN
249                  'N'
250             ELSE
251                  'Y'
252         END);
253     RETURN l_mv_where_clause_flag;
254 END get_mv_where_clause_flag;
255 
256 /*++++++++++++++++++++++++++++++++++++++++*/
257 /* Where clause building routine
258 /*++++++++++++++++++++++++++++++++++++++++*/
259 /*  get_mv_flag_where_clause
260 
261     Depending on which MV flag is being used, get a different
262     where clause statement. The flag type is determined by p_mv_flag_type:
263     'FLAG1' - service_level, unsecured org, carrier
264     'FLAG2' - service_level, carrier
265     'FLAG3' - unsecured org,customer for isc_trn_005_mv; item_category & customer  for isc_dbi_fm_0000_mv
266     'FLAG4' - subinventory, inventory category
267     'FLAG5' - inventory category, item
268 
269 */
270 FUNCTION get_mv_flag_where_clause (p_mv_flag_type IN VARCHAR2,
271                    p_trend IN VARCHAR2 DEFAULT 'N',
272                    p_mv IN VARCHAR2 DEFAULT '',
273                    p_mv_where_clause IN VARCHAR2)
274     RETURN VARCHAR2
275 IS
276 
277     l_mv_flag_where_clause VARCHAR2 (200);
278 
279 BEGIN
280     l_mv_flag_where_clause := '';
281 
282     IF (p_mv_where_clause = 'Y') THEN
283         l_mv_flag_where_clause :=
284              (CASE p_mv_flag_type
285                 WHEN 'FLAG1' THEN
286 		    get_flag_where_clause (p_trend)
287                 WHEN 'FLAG2' THEN
288 		    get_flag_where_clause (p_trend)
289                 WHEN 'FLAG3' THEN
290                     get_flag_where_clause (p_trend)
291                 WHEN 'FLAG4' THEN
292                     get_flag_where_clause (p_trend)
293                 WHEN 'FLAG5' THEN
294                     get_flag_where_clause2 (p_trend)
295                 ELSE
296                     ''
297               END);
298     END IF;
299 
300     RETURN l_mv_flag_where_clause;
301 
305 /* get_flag_where_clause
302 END get_mv_flag_where_clause;
303 
304 
306     Return the where clause for ISC specific agg_level flag.
307     Can be used for flag1, flag2, flag3, flag4
308 */
309 FUNCTION get_flag_where_clause(p_trend IN VARCHAR2 DEFAULT 'N')
310     RETURN VARCHAR2
311 IS
312     l_flag_where_clause VARCHAR2 (200);
313 
314 BEGIN
315 
316     l_flag_where_clause := 'AND fact.agg_level = :ISC_AGG_FLAG ';
317     RETURN l_flag_where_clause;
318 
319 END get_flag_where_clause;
320 
321 /* get_flag_where_clause2
322     Return the where clause for ISC specific agg_level flag.
323     Can be used for flag5
324 */
325 FUNCTION get_flag_where_clause2(p_trend IN VARCHAR2 DEFAULT 'N')
326     RETURN VARCHAR2
327 IS
328     l_flag_where_clause2 VARCHAR2 (200);
329 
330 BEGIN
331 
332     l_flag_where_clause2 := 'AND fact.agg_level = :ISC_AGG_FLAG2 ';
333     RETURN l_flag_where_clause2;
334 
335 END get_flag_where_clause2;
336 
337 /* get_security_where_clause
338     For ISC, this is quite simple.
339 */
340 
341 FUNCTION get_security_where_clause(p_org_value IN VARCHAR2, p_trend IN VARCHAR2 DEFAULT 'N', p_mv_set IN VARCHAR2)
342     RETURN VARCHAR2
343 IS
344 
345     l_sec_where_clause VARCHAR2(1000);
346 
347 BEGIN
348 
349     l_sec_where_clause :='';
350 
351   if(p_org_value is null or p_org_value = '' or p_org_value = 'All')
352     then l_sec_where_clause :=
353         (CASE p_mv_set
354             WHEN 'BQ1' THEN ' ' -- no organization security for TM reports
355             WHEN 'BY1' THEN ' '
356             WHEN 'BW1' THEN ' '
357             WHEN 'BX1' THEN ' '
358             WHEN 'BZ1' THEN ' '
359             WHEN 'BP1' THEN ' '
360             WHEN 'BP2' THEN ' '
361             WHEN 'BT1' THEN ' '
362             WHEN 'BU1' THEN ' '
363             WHEN 'C01' THEN ' '
364             WHEN 'C11' THEN ' '
365             WHEN 'C21' THEN ' '
366 	    WHEN 'C31' THEN ' '
367             WHEN 'C32' THEN ' '
368             WHEN 'C41' THEN ' '
369             WHEN 'C42' THEN ' '
370             ELSE 'AND (EXISTS
371 		(SELECT 1
372 		FROM org_access o
373 		WHERE o.responsibility_id = fnd_global.resp_id
374 		AND o.resp_application_id = fnd_global.resp_appl_id
375 		AND o.organization_id = fact.inv_org_id)
376 	OR EXISTS
377 		(SELECT 1
378 		FROM mtl_parameters org
379 		WHERE org.organization_id = fact.inv_org_id
380 		AND NOT EXISTS
381 			(SELECT 1
382 			FROM org_access ora
383 			WHERE org.organization_id = ora.organization_id)))'
384         END);
385   end if;
386 
387   return l_sec_where_clause;
388 
389 END get_security_where_clause;
390 
391 
392 /*++++++++++++++++++++++++++++++++++++++++*/
393 /* Functions to get the MV
394 /*++++++++++++++++++++++++++++++++++++++++*/
395 /*  get_mv
396 
397     Gets the MV for the content group concerned.
398 
399     The p_mv_set parameter is used to determine which MV is being
400     used i.e. when p_mv_set:
401     'BQ1','BY1','BZ1','C01' - Rated Freight Cost per Unit Weight/Vol so use isc_trn_000_mv
402     'C11','C21' - Rated Freight Cost per Dist so use isc_trn_006_mv
403     'BW1','BX1' - On-Time Arrival Rate/Trend so use isc_trn_001_mv
404     'BP1' - Trip Stop Arrival Performance Trend: use isc_trn_001_mv
405     'BP2' - Trip Stop Arrival Performance Trend: use isc_trn_002_mv
406     'BT1','BU1' - Freight Cost Recovery Rate: use isc_trn_005_mv or isc_dbi_fm_0000_mv
407     'RS1' - WMS Release To Ship: use isc_wms_000_mv
408     'RS2' - WMS Release To Ship: use isc_wms_001_mv
409 
410 */
411 FUNCTION get_mv (p_mv_set IN VARCHAR2,
412          p_mv_level_flag IN VARCHAR2,
413          p_view_by IN VARCHAR2,
414          p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
415     RETURN VARCHAR2
416 
417 IS
418     l_mv_name VARCHAR2(1000);
419     l_bt1_mv  VARCHAR2(1000);
420     l_item_val VARCHAR2 (120);
421     l_cust_val VARCHAR2 (120);
422     l_item_needed boolean;
423     l_cust_needed boolean;
424 
425 BEGIN
426     l_mv_name := '';
427     l_bt1_mv := '';
428     l_item_val := NULL;
429     l_cust_val := NULL;
430     l_item_needed:=false;
431     l_cust_needed:=false;
432 
433 
434     -- For Freight Cost Recovery Rate Report/Trend, figure out which MV to hit
435     IF (p_mv_set = 'BT1' OR p_mv_set = 'BU1' ) THEN
436 
437         IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
438             l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
439         END IF;
440 
441         IF (p_dim_map.exists ('CUSTOMER+FII_CUSTOMERS')) THEN
442             l_cust_val := p_dim_map ('CUSTOMER+FII_CUSTOMERS').value;
443         END IF;
444 
445         -- If customer or item is needed, use isc_dbi_fm_0000_mv, else use isc_trn_005_mv
446         IF ( (l_item_val IS NULL OR l_item_val = 'All')
447                 AND p_view_by <> 'ITEM+ENI_ITEM_ORG') THEN
448             l_item_needed := false;
449         ELSE l_item_needed := true;
450         END IF;
451 
452         IF ( (l_cust_val IS NULL OR l_cust_val = 'All')
453                     AND p_view_by <> 'CUSTOMER+FII_CUSTOMERS') THEN
454             l_cust_needed := false;
455         ELSE l_cust_needed := true;
456         END IF;
457 
458         IF ( l_cust_needed OR l_item_needed ) THEN
459             l_bt1_mv:='isc_dbi_fm_0000_mv';
460         ELSE l_bt1_mv:= 'isc_trn_005_mv';
461         END IF;
462     END IF;
463 
464     -- Based on the program calling, use different MVs
465     l_mv_name :=
466         (CASE p_mv_set
470             WHEN 'BY1' THEN 'isc_trn_000_mv'
467             WHEN 'BQ1' THEN 'isc_trn_000_mv'
468             WHEN 'BW1' THEN 'isc_trn_001_mv'
469             WHEN 'BX1' THEN 'isc_trn_001_mv'
471             WHEN 'BZ1' THEN 'isc_trn_000_mv'
472             WHEN 'C01' THEN 'isc_trn_000_mv'
473             WHEN 'C11' THEN 'isc_trn_006_mv'
474             WHEN 'C21' THEN 'isc_trn_006_mv'
475             WHEN 'BP1' THEN 'isc_trn_001_mv'
476             WHEN 'BP2' THEN 'isc_trn_002_mv'
477             WHEN 'C31' THEN 'isc_trn_003_mv'
478 	    WHEN 'C32' THEN 'isc_trn_004_mv'
479 	    WHEN 'C41' THEN 'isc_trn_003_mv'
480 	    WHEN 'C42' THEN 'isc_trn_004_mv'
481             WHEN 'BT1' THEN l_bt1_mv
482             WHEN 'BU1' THEN l_bt1_mv
483             WHEN 'RS1' THEN 'isc_wms_000_mv'
484             WHEN 'RS2' THEN 'isc_wms_001_mv'
485             ELSE ''
486         END);
487 
488     RETURN l_mv_name;
489 
490 END get_mv;
491 
492 /*++++++++++++++++++++++++++++++++++++++++*/
493 /* Function to add extra where clauses if needed
494 /*++++++++++++++++++++++++++++++++++++++++*/
495 /*  get_additional_where_clause
496 
497     This function adds additional filter conditions
498     Used when p_mv_set:
499     'BT1','BU1' - Freight Cost Recovery Rate -  filter on top_node_flag if it is needed and specifies the extra where
500        clauses if hitting ISC_DBI_FM_0000_MV and prod cat has been specified.
501 
502 */
503 FUNCTION get_additional_where_clause (p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map,
504          p_mv_set IN VARCHAR2,p_view_by IN VARCHAR2)
505     RETURN VARCHAR2
506 
507 IS
508     l_item_val VARCHAR2 (120);
509     l_cust_val VARCHAR2 (120);
510     l_pcat_val VARCHAR2 (120);
511     l_item_needed boolean;
512     l_cust_needed boolean;
513     l_where_clause VARCHAR2 (10000);
514 
515 BEGIN
516 
517     l_where_clause := '';
518 
519     -- For Freight Cost Recovery Rate Report/Trend, figure out if top_node_flag where clause is needed
520     IF (p_mv_set = 'BT1' OR p_mv_set = 'BU1' ) THEN
521 	l_where_clause := ' AND (fact.freight_charge_amt_g is not null OR fact.freight_cost_amt_g is not null)';
522         IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
523             l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
524         END IF;
525 
526         IF (p_dim_map.exists ('CUSTOMER+FII_CUSTOMERS')) THEN
527             l_cust_val := p_dim_map ('CUSTOMER+FII_CUSTOMERS').value;
528         END IF;
529 
530         IF (p_dim_map.exists ('ITEM+ENI_ITEM_VBH_CAT')) THEN
531             l_pcat_val := p_dim_map ('ITEM+ENI_ITEM_VBH_CAT').value;
532         END IF;
533 
534         -- Top node Where clause is only needed when isc_trn_005_mv is used and Product Category is 'All'
535         IF ( (l_item_val IS NULL OR l_item_val = 'All')
536                 AND p_view_by <> 'ITEM+ENI_ITEM_ORG') THEN
537             l_item_needed := false;
538         ELSE l_item_needed := true;
539         END IF;
540 
541         IF ( (l_cust_val IS NULL OR l_cust_val = 'All')
542                     AND p_view_by <> 'CUSTOMER+FII_CUSTOMERS') THEN
543             l_cust_needed := false;
544         ELSE l_cust_needed := true;
545         END IF;
546 
547         IF ( NOT l_cust_needed AND NOT l_item_needed ) THEN
548             IF (l_pcat_val IS NULL OR l_pcat_val = 'All') THEN
549                 l_where_clause := l_where_clause || '
550                    AND fact.top_node_flag = ''Y'' ';
551             END IF;
552         END IF;
553 
554         -- Only	add this where clause if the prod cat is specified
555         IF NOT (l_pcat_val IS NULL OR l_pcat_val = 'All') THEN
556           IF l_cust_needed OR l_item_needed THEN -- extra joins are needed if hitting ISC_DBI_FM_0000_MV
557             l_where_clause := l_where_clause || ' AND fact.prod_category_id = eni_cat.child_id
558 	          AND eni_cat.parent_id IN &ITEM+ENI_ITEM_VBH_CAT
559 	          AND eni_cat.dbi_flag = ''Y''
560 	          AND eni_cat.object_type = ''CATEGORY_SET''
561 	          AND eni_cat.object_id = mdcs.category_set_id
562 	          AND mdcs.functional_area_id = 11 ';
563           ELSE l_where_clause := l_where_clause || ' AND fact.prod_category_id in &ITEM+ENI_ITEM_VBH_CAT ';
564           END IF;
565         END IF;
566 
567     END IF;
568 
569     RETURN l_where_clause;
570 
571 END get_additional_where_clause;
572 
573 
574 PROCEDURE populate_in_join_tbl(
575 	  p_in_join_tbl out NOCOPY poa_dbi_util_pkg.poa_dbi_in_join_tbl,
576 	  p_view_by in VARCHAR2,
577           p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
578  IS
579 
580     l_in_join_rec poa_dbi_util_pkg.POA_DBI_IN_JOIN_REC;
581     l_pcat_val VARCHAR2 (120);
582     l_cust_val VARCHAR2 (120);
583     l_item_val VARCHAR2 (120);
584     l_item_needed boolean;
585     l_cust_needed boolean;
586 
587  BEGIN
588 
589      p_in_join_tbl := poa_dbi_util_pkg.poa_dbi_in_join_tbl();
590 
591      IF (p_dim_map.exists ('ITEM+ENI_ITEM_VBH_CAT')) THEN
592          l_pcat_val := p_dim_map ('ITEM+ENI_ITEM_VBH_CAT').value;
593      END IF;
594 
595      IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
596          l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
597      END IF;
598 
599      IF (p_dim_map.exists ('CUSTOMER+FII_CUSTOMERS')) THEN
600          l_cust_val := p_dim_map ('CUSTOMER+FII_CUSTOMERS').value;
601      END IF;
602 
603      IF ( (l_item_val IS NULL OR l_item_val = 'All')
604              AND p_view_by <> 'ITEM+ENI_ITEM_ORG') THEN
605          l_item_needed := false;
606      ELSE l_item_needed := true;
607      END IF;
608 
609      IF ( (l_cust_val IS NULL OR l_cust_val = 'All')
613      END IF;
610                  AND p_view_by <> 'CUSTOMER+FII_CUSTOMERS') THEN
611          l_cust_needed := false;
612      ELSE l_cust_needed := true;
614 
615      -- If a product category has been specified and you're hitting ISC_DBI_FM_0000_MV
616      IF (l_item_needed OR l_cust_needed) AND
617         NOT (l_pcat_val IS NULL OR l_pcat_val = 'All') THEN
618        l_in_join_rec.table_name := 'eni_denorm_hierarchies';
619        l_in_join_rec.table_alias := 'eni_cat';
620        p_in_join_tbl.extend;
621        p_in_join_tbl(p_in_join_tbl.count) := l_in_join_rec;
622 
623        l_in_join_rec.table_name := 'mtl_default_category_sets';
624        l_in_join_rec.table_alias := 'mdcs';
625        p_in_join_tbl.extend;
626        p_in_join_tbl(p_in_join_tbl.count) := l_in_join_rec;
627 
628     END IF;
629 
630  END populate_in_join_tbl;
631 
632 
633 /*++++++++++++++++++++++++++++++++++++++++*/
634 /* Setting up list of dimensions to track
635 /*++++++++++++++++++++++++++++++++++++++++*/
636 /*  init_dim_map
637 
638     Initialize the dimension map with all needed dimensions.
639 
640     This function needs to keep track of all possible dimensions
641     the DBI 7.1 reports are interested in. The POA utility package
642     get_parameter_values functions looks at the parameter table
643     passed in by PMV. For parameters names for which it finds a
644     matching key in this dimension map table, it records the value.
645     In other words, if the dimension map does not have an entry for
646     ORGANIZATION+ORGANIZATION, then PMV's organization parameter
647     will never be recorded.
648 
649     For ISC's DBI 7.1, the needed dimensions levels are:
650     ORGANIZATION+ORGANIZATION - Organization
651     ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE - Transportation Mode
652     ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER - Freight Carrier
653     ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL - Service Level
654     CURRENCY+FII_CURRENCIES - Currency
655     ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION - Shipment Direction
656     ITEM+ENI_ITEM_INV_CAT - Inventory Category
657     ITEM+ENI_ITEM_ORG - Item
658     ITEM+ENI_ITEM_VBH_CAT - Product Category
659     CUSTOMER+FII_CUSTOMERS - Customers
660     ORGANIZATION+ORGANIZATION_SUBINVENTORY - Subinventory
661     ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION - Unsecured Organization
662 
663 
664 */
665 PROCEDURE init_dim_map (p_dim_map out NOCOPY
666                             poa_dbi_util_pkg.poa_dbi_dim_map,
667                         p_mv_set IN VARCHAR2)
668 IS
669 
670     l_dim_rec poa_dbi_util_pkg.poa_dbi_dim_rec;
671 
672 BEGIN
673 
674     -- Inventory Category dimension level
675     l_dim_rec.col_name := get_col_name ('ITEM+ENI_ITEM_INV_CAT');
676     l_dim_rec.view_by_table := get_table ('ITEM+ENI_ITEM_INV_CAT');
677     l_dim_rec.generate_where_clause := 'Y';
678     p_dim_map('ITEM+ENI_ITEM_INV_CAT') := l_dim_rec;
679 
680     -- Item dimension level
681     l_dim_rec.col_name := get_col_name ('ITEM+ENI_ITEM_ORG');
682     l_dim_rec.view_by_table := get_table ('ITEM+ENI_ITEM_ORG');
683     l_dim_rec.generate_where_clause := 'Y';
684     p_dim_map('ITEM+ENI_ITEM_ORG') := l_dim_rec;
685 
686     -- Organzation dimension level
687     l_dim_rec.col_name := get_col_name ('ORGANIZATION+ORGANIZATION');
688     l_dim_rec.view_by_table := get_table('ORGANIZATION+ORGANIZATION');
689     l_dim_rec.generate_where_clause := 'Y';
690     p_dim_map('ORGANIZATION+ORGANIZATION') := l_dim_rec;
691 
692     -- Unsecured Organzation dimension level
693     l_dim_rec.col_name := get_col_name ('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION');
694     l_dim_rec.view_by_table := get_table('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION');
695     l_dim_rec.generate_where_clause := 'Y';
696     p_dim_map('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION') := l_dim_rec;
697 
698     -- Mode dimension level
699     l_dim_rec.col_name := get_col_name ('ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE');
700     l_dim_rec.view_by_table := get_table('ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE');
701     l_dim_rec.generate_where_clause := 'Y';
702     p_dim_map('ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE') := l_dim_rec;
703 
704     -- Carrier Dimension Level
705     l_dim_rec.col_name := get_col_name ('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER');
706     l_dim_rec.view_by_table := get_table('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER');
707     l_dim_rec.generate_where_clause := 'Y';
708     p_dim_map('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER') := l_dim_rec;
709 
710     -- Service Level Dimension Level
711     l_dim_rec.col_name := get_col_name ('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL');
712     l_dim_rec.view_by_table := get_table('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL');
713     l_dim_rec.generate_where_clause := 'Y';
714     p_dim_map('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL') := l_dim_rec;
715 
716     -- Shipment Direction Dimension Level
717     l_dim_rec.col_name := get_col_name ('ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION');
718     l_dim_rec.view_by_table := get_table('ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION');
719     l_dim_rec.generate_where_clause := 'Y';
720     p_dim_map('ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION') := l_dim_rec;
721 
722     -- Product Category Dimension Level
723     l_dim_rec.col_name := get_col_name ('ITEM+ENI_ITEM_VBH_CAT');
724     l_dim_rec.view_by_table := get_table('ITEM+ENI_ITEM_VBH_CAT');
725     l_dim_rec.generate_where_clause := 'N';
726     p_dim_map('ITEM+ENI_ITEM_VBH_CAT') := l_dim_rec;
727 
728     -- Customer dimension level
729     l_dim_rec.col_name := get_col_name ('CUSTOMER+FII_CUSTOMERS');
730     l_dim_rec.view_by_table := get_table('CUSTOMER+FII_CUSTOMERS');
731     l_dim_rec.generate_where_clause := 'Y';
732     p_dim_map('CUSTOMER+FII_CUSTOMERS') := l_dim_rec;
733 
737     l_dim_rec.generate_where_clause := 'Y';
734     -- Subinventory dimension level
735     l_dim_rec.col_name := get_col_name ('ORGANIZATION+ORGANIZATION_SUBINVENTORY');
736     l_dim_rec.view_by_table := get_table('ORGANIZATION+ORGANIZATION_SUBINVENTORY');
738     p_dim_map('ORGANIZATION+ORGANIZATION_SUBINVENTORY') := l_dim_rec;
739 
740 END init_dim_map;
741 
742 
743 /*++++++++++++++++++++++++++++++++++++++++*/
744 /* Dimension level join tables and columns
745 /*++++++++++++++++++++++++++++++++++++++++*/
746 /*  get_col_name
747 
748     Get the column name of the viewby join tables that the query will
749     have to join to.
750 */
751 FUNCTION get_col_name (p_dim_name VARCHAR2)
752     RETURN VARCHAR2
753 IS
754 
755   l_col_name VARCHAR2(100);
756 
757 BEGIN
758 
759   l_col_name :=
760     (CASE p_dim_name
761         WHEN 'ORGANIZATION+ORGANIZATION' THEN 'inv_org_id'
762         WHEN 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION' THEN 'inv_org_id'
763         WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN 'item_category_id'
764         WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN 'prod_category_id'--product category
765         WHEN 'ITEM+ENI_ITEM_ORG' THEN 'item_id'
766         WHEN 'CUSTOMER+FII_CUSTOMERS' THEN 'customer_id'
767         WHEN 'ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE' THEN 'mode_of_transport'
768         WHEN 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER' THEN 'carrier_id'
769         WHEN 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL' THEN 'service_level'
770         WHEN 'ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION' THEN 'shipment_direction'
771 	WHEN 'ORGANIZATION+ORGANIZATION_SUBINVENTORY' THEN 'subinventory_code'
772         ELSE ''
773     END);
774 
775   RETURN l_col_name;
776 
777 END get_col_name;
778 
779 /*++++++++++++++++++++++++++++++++++++++++*/
780 /* Dimension level columns
781 /*++++++++++++++++++++++++++++++++++++++++*/
782 /*  update_col_name
783 
784     Update the name of the viewby dimension columns the report will
785     hit in the MVs.
786 */
787 PROCEDURE update_col_name (p_dim_map IN out NOCOPY poa_dbi_util_pkg.poa_dbi_dim_map, p_mv_set IN VARCHAR2, p_dim_name VARCHAR2)
788 IS
789 
790   l_pcat_val VARCHAR2 (120);
791   l_item_val VARCHAR2 (120);
792   l_cust_val VARCHAR2 (120);
793   l_item_needed boolean;
794   l_cust_needed boolean;
795 
796 BEGIN
797 
798   -- For Freight Cost Recovery Rate Report, we will use prod_category_id or imm_child_id when viewby=prod cat
799   IF ( p_mv_set = 'BT1' AND p_dim_map.exists ('ITEM+ENI_ITEM_VBH_CAT')) THEN
800 
801     IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
802         l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
803     END IF;
804 
805     IF (p_dim_map.exists ('CUSTOMER+FII_CUSTOMERS')) THEN
806         l_cust_val := p_dim_map ('CUSTOMER+FII_CUSTOMERS').value;
807     END IF;
808 
809     IF ( (l_item_val IS NULL OR l_item_val = 'All')
810                 AND p_dim_name <> 'ITEM+ENI_ITEM_ORG') THEN
811         l_item_needed := false;
812     ELSE l_item_needed := true;
813     END IF;
814 
815     IF ( (l_cust_val IS NULL OR l_cust_val = 'All')
816                 AND p_dim_name <> 'CUSTOMER+FII_CUSTOMERS') THEN
817         l_cust_needed := false;
818     ELSE l_cust_needed := true;
819     END IF;
820 
821 
822     l_pcat_val := p_dim_map ('ITEM+ENI_ITEM_VBH_CAT').value;
823     -- We want to use imm_child_id column when we are hitting ISC_TRN_005_MV (when neither item or customer are needed)
824     IF ( NOT (l_pcat_val IS NULL OR l_pcat_val = 'All') AND
825              NOT l_cust_needed AND
826              NOT l_item_needed) THEN
827         p_dim_map('ITEM+ENI_ITEM_VBH_CAT').col_name := 'imm_child_id';
828     END IF;
829   END IF;
830 
831 END update_col_name;
832 
833 
834 /*  get_table
835 
836     Return the join table based on the dimension
837         Product Category - eni_item_vbh_cat_v
838         Customer - fii_customers_v
839 */
840 FUNCTION get_table (p_dim_name VARCHAR2)
841     RETURN VARCHAR2
842 IS
843     l_table VARCHAR2(4000);
844 
845 BEGIN
846 
847     l_table :=
848         (CASE p_dim_name
849             WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN 'eni_item_inv_cat_v'
850             WHEN 'ITEM+ENI_ITEM_ORG' THEN 'eni_item_org_v '
851             WHEN 'ORGANIZATION+ORGANIZATION' THEN '(select organization_id id, name value from hr_all_organization_units_tl where language = userenv(''LANG''))'
852             WHEN 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION' THEN 'opi_inv_unsec_organizations_v'
853             WHEN 'CUSTOMER+FII_CUSTOMERS' THEN 'fii_customers_v'
854             WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN 'eni_item_vbh_nodes_v'
855             WHEN 'ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE' THEN 'isc_transportation_mode_v'
856             WHEN 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER' THEN 'isc_freight_carrier_v'
857             WHEN 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL' THEN 'isc_carrier_service_level_v'
858             WHEN 'ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION' THEN 'isc_shipment_direction_v'
859 	    WHEN 'ORGANIZATION+ORGANIZATION_SUBINVENTORY' THEN 'opi_subinventories_v'
860             ELSE ''
861         END);
862 
863     RETURN l_table;
864 
865 END get_table;
866 
867 /*  Function: get_join_info
868 */
869 PROCEDURE get_join_info (p_view_by IN varchar2,
870                          p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map,
871                          x_join_tbl OUT NOCOPY
872                             poa_dbi_util_pkg.POA_DBI_JOIN_TBL,
873                          p_mv_set IN VARCHAR2)
874 IS
875     l_join_rec poa_dbi_util_pkg.POA_DBI_JOIN_REC;
876 
877 BEGIN
878 
879     -- reinitialize the join table
883     -- there is nothing to join to. Can this ever be true?
880     x_join_tbl := poa_dbi_util_pkg.POA_DBI_JOIN_TBL ();
881 
882     -- If the view by column is not in the bitmap, then
884     IF (NOT p_dim_map.exists(p_view_by)) THEN
885         RETURN;
886     END IF;
887 
888     -- Otherwise, join to a table
889     -- The view by table
890     l_join_rec.table_name := p_dim_map(p_view_by).view_by_table;
891     l_join_rec.table_alias := 'v';
892     -- the fact column to join to
893     l_join_rec.fact_column := p_dim_map(p_view_by).col_name;
894 
895     -- depending on the dimension level, select the appropriate
896     -- join table column name
897     l_join_rec.column_name :=
898     (CASE p_view_by
899         WHEN 'ORGANIZATION+ORGANIZATION' THEN
900              'id'
901         WHEN 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION' THEN
902              'id'
903         WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN
904              'id'
905         WHEN 'ITEM+ENI_ITEM_ORG' THEN
906              'id'
907         WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN
908              'id'
909         WHEN 'CUSTOMER+FII_CUSTOMERS' THEN
910              'id'
911 	WHEN 'ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE' THEN
912              'id'
913 	WHEN 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER' THEN
914              'id'
915 	WHEN 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL' THEN
916              'id'
917 	WHEN 'ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION' THEN
918              'id'
919 	WHEN 'ORGANIZATION+ORGANIZATION_SUBINVENTORY' THEN
920 	     'id'
921         ELSE
922              ''
923     END);
924 
925     l_join_rec.dim_outer_join :=
926     (CASE p_view_by
927         WHEN 'ORGANIZATION+ORGANIZATION' THEN
928              'N'
929         WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN
930              'N'
931         WHEN 'ITEM+ENI_ITEM_ORG' THEN
932              'N'
933         ELSE
934              'N'
935     END);
936 
937     l_join_rec.additional_where_clause :=
938     (CASE p_view_by
939         WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN
940              ' v.parent_id = v.child_id '
941     END);
942 
943     -- Add the join table
944     x_join_tbl.extend;
945     x_join_tbl(x_join_tbl.count) := l_join_rec;
946 
947     -- Get the uom join
948     IF (p_view_by = 'ITEM+ENI_ITEM_ORG') THEN
949         l_join_rec.table_name := 'mtl_units_of_measure_vl';
950         l_join_rec.table_alias := 'v2';
951         l_join_rec.fact_column :='uom';
952         l_join_rec.column_name := 'uom_code';
953         l_join_rec.dim_outer_join := 'N';
954 
955         x_join_tbl.extend;
956         x_join_tbl(x_join_tbl.count) := l_join_rec;
957     END IF;
958 
959 END get_join_info;
960 
961 
962 /*++++++++++++++++++++++++++++++++++++++++*/
963 /* View by information for outer queries
964 /*++++++++++++++++++++++++++++++++++++++++*/
965 /*
966     For the status_sql, get the name of the viewby column.
967 */
968 FUNCTION get_view_by_col_name (p_dim_name VARCHAR2)
969     RETURN VARCHAR2
970 IS
971   l_col_name VARCHAR2(60);
972 BEGIN
973 
974     l_col_name :=
975         (CASE p_dim_name
976             WHEN 'ORGANIZATION+ORGANIZATION' THEN
977                 ' v.value'
978             WHEN 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION' THEN
979                 ' v.value'
980             WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN
981                 ' v.value'
982             WHEN 'ITEM+ENI_ITEM_ORG' THEN
983                 ' v.value'
984             WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN
985                 ' v.value'
986             WHEN 'CUSTOMER+FII_CUSTOMERS' THEN
987                 ' v.value'
988             WHEN 'ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE' THEN
989                 ' v.value'
990             WHEN 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL' THEN
991                 ' v.value'
992             WHEN 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER' THEN
993                 ' v.value'
994             WHEN 'ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION' THEN
995                 ' v.value'
996             WHEN 'ORGANIZATION+ORGANIZATION_SUBINVENTORY' THEN
997                 ' v.value'
998             ELSE ' '
999         END);
1000 
1001     RETURN l_col_name;
1002 END get_view_by_col_name;
1003 
1004 FUNCTION get_view_by_select_clause (p_viewby IN VARCHAR2)
1005     RETURN VARCHAR2
1006 IS
1007     l_view_by_sel VARCHAR2(200);
1008     l_view_by_col VARCHAR2 (100);
1009 BEGIN
1010 
1011     l_view_by_col := get_view_by_col_name (p_viewby);
1012 
1013     l_view_by_sel :=
1014         (CASE p_viewby
1015             WHEN 'ORGANIZATION+ORGANIZATION' THEN
1016                  l_view_by_col || ' VIEWBY,
1017                  v.id VIEWBYID, '
1018             WHEN 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION' THEN
1019                  l_view_by_col || ' VIEWBY,
1020                  v.id VIEWBYID, '
1021             WHEN 'ITEM+ENI_ITEM_INV_CAT' THEN
1022                  l_view_by_col || ' VIEWBY,
1023                   v.id VIEWBYID, '
1024             WHEN 'ITEM+ENI_ITEM_ORG' THEN
1025                  l_view_by_col || ' VIEWBY ,
1026                   v.id VIEWBYID, '
1027             WHEN 'ITEM+ENI_ITEM_VBH_CAT' THEN
1028                  l_view_by_col || ' VIEWBY,
1029                   v.id VIEWBYID, '
1030             WHEN 'CUSTOMER+FII_CUSTOMERS' THEN
1031                  l_view_by_col || ' VIEWBY ,
1032                   v.id VIEWBYID, '
1033             WHEN 'ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE' THEN
1034                  l_view_by_col || ' VIEWBY ,
1035                   v.id VIEWBYID, '
1039             WHEN 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL' THEN
1036             WHEN 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER' THEN
1037                  l_view_by_col || ' VIEWBY ,
1038                   v.id VIEWBYID, '
1040                  l_view_by_col || ' VIEWBY ,
1041                   v.id VIEWBYID, '
1042             WHEN 'ISC_SHIPMENT_DIRECTION+ISC_SHIPMENT_DIRECTION' THEN
1043                  l_view_by_col || ' VIEWBY ,
1044                   v.id VIEWBYID, '
1045             WHEN 'ORGANIZATION+ORGANIZATION_SUBINVENTORY' THEN
1046                  l_view_by_col || ' VIEWBY,
1047                  v.id VIEWBYID, '
1048             ELSE ''
1049         END);
1050 
1051     return l_view_by_sel;
1052 
1053 END get_view_by_select_clause;
1054 
1055 /*++++++++++++++++++++++++++++++++++++++++*/
1056 /* MV level aggregation flag
1057 /*++++++++++++++++++++++++++++++++++++++++*/
1058 
1059 /*  get_mv_level_flag
1060 
1061     Return the MV level flag based on what is requested in p_mv_flag_type:
1062     'FLAG1' -  flag for service_level, unsecured organization, carrier.
1063     'FLAG2' -  flag for service_level, carrier.
1064     'FLAG3' -  flag for unsecured org, item, prod cat, and customer
1065     'FLAG4' -  flag for subinventory, inventory category
1066     'FLAG5' -  flag for inventory category, item
1067 */
1068 FUNCTION get_mv_level_flag (p_mv_flag_type VARCHAR2,
1069                             p_dim_name VARCHAR2,
1070                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1071     RETURN VARCHAR2
1072 IS
1073 
1074     l_mv_level_flag VARCHAR2 (10);
1075 
1076 BEGIN
1077 
1078     l_mv_level_flag :=
1079         (CASE p_mv_flag_type
1080             WHEN  'FLAG1' THEN
1081                 get_flag_one_val (p_dim_name, p_dim_map)
1082             WHEN  'FLAG2' THEN
1083                 get_flag_two_val (p_dim_name, p_dim_map)
1084             WHEN  'FLAG3' THEN
1085                 get_flag_three_val (p_dim_name, p_dim_map)
1086             WHEN  'FLAG4' THEN
1087                 get_flag_four_val (p_dim_name, p_dim_map)
1088             WHEN  'FLAG5' THEN
1089                 get_flag_five_val (p_dim_name, p_dim_map)
1090             ELSE
1091                 ''
1092         END);
1093 
1094     RETURN l_mv_level_flag;
1095 
1096 END get_mv_level_flag;
1097 
1098 
1099 
1100 /* get_flag_one_val
1101 
1102     Compute the flag1 value based on the parameters passed to
1103     determine the aggregation level of the MV rows that the query will
1104     have to run against.
1105 */
1106 FUNCTION get_flag_one_val (p_dim_name VARCHAR2,
1107                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1108     RETURN VARCHAR2
1109 IS
1110 
1111     l_flag_one varchar2(1);
1112 
1113     l_org_val VARCHAR2 (120);
1114     l_mode_val VARCHAR2 (120);
1115     l_serv_val VARCHAR2 (120);
1116     l_carrier_val VARCHAR2 (120);
1117 
1118     l_org_needed boolean;
1119     l_serv_needed boolean;
1120     l_carrier_needed boolean;
1121 
1122 BEGIN
1123 
1124     l_org_val := NULL;
1125     l_mode_val := NULL;
1126     l_serv_val := NULL;
1127     l_carrier_val := NULL;
1128 
1129     l_org_needed :=false;
1130     l_serv_needed :=false;
1131     l_carrier_needed :=false;
1132 
1133     -- Get the mode, service_level, unsecured org, and carrier values
1134     IF (p_dim_map.exists ('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION')) THEN
1135         l_org_val := p_dim_map ('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION').value;
1136     END IF;
1137 
1138     IF (p_dim_map.exists ('ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE')) THEN
1139         l_mode_val := p_dim_map ('ISC_TRANSPORTATION_MODE+ISC_TRANSPORTATION_MODE').value;
1140     END IF;
1141 
1142     IF (p_dim_map.exists ('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL')) THEN
1143         l_serv_val := p_dim_map ('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL').value;
1144     END IF;
1145 
1146     IF (p_dim_map.exists ('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER')) THEN
1147         l_carrier_val := p_dim_map ('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER').value;
1148     END IF;
1149 
1150     -- Find out which dimensions are needed to hit the proper grouping sets in the MVs
1151     IF ( l_org_val IS NULL OR l_org_val = 'All' ) THEN
1152         l_org_needed := false;
1153     ELSE l_org_needed := true;
1154     END IF;
1155 
1156     IF ( (l_serv_val IS NULL OR l_serv_val = 'All')
1157                  AND p_dim_name <> 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL') THEN
1158         l_serv_needed := false;
1159     ELSE l_serv_needed := true;
1160     END IF;
1161 
1162     IF ( (l_carrier_val IS NULL OR l_carrier_val = 'All')
1163                  AND p_dim_name <> 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER') THEN
1164         l_carrier_needed := false;
1165     ELSE l_carrier_needed := true;
1166     END IF;
1167 
1168     -- Calculate the flag values depending on which dimensions are needed
1169     CASE
1170         WHEN (    l_serv_needed AND     l_org_needed AND     l_carrier_needed) THEN l_flag_one := 0;
1171         WHEN (    l_serv_needed AND     l_org_needed AND NOT l_carrier_needed) THEN l_flag_one := 1;
1172         WHEN (    l_serv_needed AND NOT l_org_needed AND     l_carrier_needed) THEN l_flag_one := 2;
1173         WHEN (    l_serv_needed AND NOT l_org_needed AND NOT l_carrier_needed) THEN l_flag_one := 3;
1174         WHEN (NOT l_serv_needed AND     l_org_needed AND     l_carrier_needed) THEN l_flag_one := 4;
1175         WHEN (NOT l_serv_needed AND     l_org_needed AND NOT l_carrier_needed) THEN l_flag_one := 5;
1176         WHEN (NOT l_serv_needed AND NOT l_org_needed AND     l_carrier_needed) THEN l_flag_one := 6;
1177         WHEN (NOT l_serv_needed AND NOT l_org_needed AND NOT l_carrier_needed) THEN l_flag_one := 7;
1181 
1178     END CASE;
1179 
1180     RETURN l_flag_one;
1182 END get_flag_one_val;
1183 
1184 /* get_flag_two_val
1185 
1186     Compute the flag2 value based on the parameters passed to
1187     determine the aggregation level of the MV rows that the query will
1188     have to run against.
1189 */
1190 FUNCTION get_flag_two_val (p_dim_name VARCHAR2,
1191                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1192     RETURN VARCHAR2
1193 IS
1194 
1195     l_flag_two varchar2(1);
1196 
1197     l_serv_val VARCHAR2 (120);
1198     l_carrier_val VARCHAR2 (120);
1199 
1200     l_serv_needed boolean;
1201     l_carrier_needed boolean;
1202 
1203 BEGIN
1204 
1205     l_serv_val := NULL;
1206     l_carrier_val := NULL;
1207 
1208     l_serv_needed:=false;
1209     l_carrier_needed:=false;
1210 
1211     -- Get the service_level, and carrier values
1212     IF (p_dim_map.exists ('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL')) THEN
1213         l_serv_val := p_dim_map ('ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL').value;
1214     END IF;
1215 
1216     IF (p_dim_map.exists ('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER')) THEN
1217         l_carrier_val := p_dim_map ('ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER').value;
1218     END IF;
1219 
1220     -- Find out which dimensions are needed to hit the proper grouping sets in the MVs
1221     IF ( (l_serv_val IS NULL OR l_serv_val = 'All')
1222                  AND p_dim_name <> 'ISC_CARRIER_SERVICE_LEVEL+ISC_CARRIER_SERVICE_LEVEL') THEN
1223         l_serv_needed := false;
1224     ELSE l_serv_needed := true;
1225     END IF;
1226 
1227     IF ( (l_carrier_val IS NULL OR l_carrier_val = 'All')
1228                  AND p_dim_name <> 'ISC_FREIGHT_CARRIER+ISC_FREIGHT_CARRIER') THEN
1229         l_carrier_needed := false;
1230     ELSE l_carrier_needed := true;
1231     END IF;
1232 
1233     -- Calculate the flag values depending on which dimensions are needed
1234     CASE
1235         WHEN (    l_serv_needed  AND     l_carrier_needed) THEN l_flag_two := 0;
1236         WHEN (    l_serv_needed  AND NOT l_carrier_needed) THEN l_flag_two := 1;
1237         WHEN (NOT l_serv_needed  AND     l_carrier_needed) THEN l_flag_two := 2;
1238         WHEN (NOT l_serv_needed  AND NOT l_carrier_needed) THEN l_flag_two := 3;
1239     END CASE;
1240 
1241     RETURN l_flag_two;
1242 
1243 END get_flag_two_val;
1244 
1245 /* get_flag_three_val
1246 
1247     Compute the flag_three value based on the parameters passed to
1248     determine the aggregation level of the MV rows that the query will
1249     have to run against.
1250 */
1251 FUNCTION get_flag_three_val (p_dim_name VARCHAR2,
1252                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1253     RETURN VARCHAR2
1254 IS
1255 
1256     l_flag_three varchar2(1);
1257 
1258     l_org_val VARCHAR2 (120);
1259     l_pcat_val VARCHAR2 (120);
1260     l_item_val VARCHAR2 (120);
1261     l_cust_val VARCHAR2 (120);
1262 
1263     l_org_needed boolean;
1264     l_pcat_needed boolean;
1265     l_item_needed boolean;
1266     l_cust_needed boolean;
1267 
1268 BEGIN
1269 
1270     l_org_val := NULL;
1271     l_pcat_val := NULL;
1272     l_item_val := NULL;
1273     l_cust_val := NULL;
1274 
1275     l_org_needed:=false;
1276     l_pcat_needed:=false;
1277     l_item_needed:=false;
1278     l_cust_needed:=false;
1279 
1280     -- Get the unsecured org, item, cat, and cust values
1281     IF (p_dim_map.exists ('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION')) THEN
1282         l_org_val := p_dim_map ('ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION').value;
1283     END IF;
1284 
1285     IF (p_dim_map.exists ('ITEM+ENI_ITEM_VBH_CAT')) THEN
1286         l_pcat_val := p_dim_map ('ITEM+ENI_ITEM_VBH_CAT').value;
1287     END IF;
1288 
1289     IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
1290         l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
1291     END IF;
1292 
1293     IF (p_dim_map.exists ('CUSTOMER+FII_CUSTOMERS')) THEN
1294         l_cust_val := p_dim_map ('CUSTOMER+FII_CUSTOMERS').value;
1295     END IF;
1296 
1297     -- Find out which dimensions are needed to hit the proper grouping sets in the MVs
1298     IF ( (l_org_val IS NULL OR l_org_val = 'All')
1299                 AND p_dim_name <> 'ORGANIZATION+OPI_INV_UNSEC_ORGANIZATION') THEN
1300         l_org_needed := false;
1301     ELSE l_org_needed := true;
1302     END IF;
1303 
1304     IF ( (l_pcat_val IS NULL OR l_pcat_val = 'All')
1305                 AND p_dim_name <> 'ITEM+ENI_ITEM_VBH_CAT') THEN
1306         l_pcat_needed := false;
1307     ELSE l_pcat_needed := true;
1308     END IF;
1309 
1310     IF ( (l_item_val IS NULL OR l_item_val = 'All')
1311                 AND p_dim_name <> 'ITEM+ENI_ITEM_ORG') THEN
1312         l_item_needed := false;
1313     ELSE l_item_needed := true;
1314     END IF;
1315 
1316     IF ( (l_cust_val IS NULL OR l_cust_val = 'All')
1317                 AND p_dim_name <> 'CUSTOMER+FII_CUSTOMERS') THEN
1318         l_cust_needed := false;
1319     ELSE l_cust_needed := true;
1320     END IF;
1321 
1322     -- Calculate the flag values depending on which dimensions are needed
1323     CASE
1324         WHEN (    l_cust_needed AND     l_item_needed AND     l_pcat_needed AND     l_org_needed) THEN l_flag_three := 0;
1325         WHEN (    l_cust_needed AND     l_item_needed AND     l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 0;
1326         WHEN (    l_cust_needed AND     l_item_needed AND NOT l_pcat_needed AND     l_org_needed) THEN l_flag_three := 0;
1327         WHEN (    l_cust_needed AND     l_item_needed AND NOT l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 0;
1331         WHEN (    l_cust_needed AND NOT l_item_needed AND NOT l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 2;
1328         WHEN (    l_cust_needed AND NOT l_item_needed AND     l_pcat_needed AND     l_org_needed) THEN l_flag_three := 0;
1329         WHEN (    l_cust_needed AND NOT l_item_needed AND     l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 0;
1330         WHEN (    l_cust_needed AND NOT l_item_needed AND NOT l_pcat_needed AND     l_org_needed) THEN l_flag_three := 2;
1332         WHEN (NOT l_cust_needed AND     l_item_needed AND     l_pcat_needed AND     l_org_needed) THEN l_flag_three := 1;
1333         WHEN (NOT l_cust_needed AND     l_item_needed AND     l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 1;
1334         WHEN (NOT l_cust_needed AND     l_item_needed AND NOT l_pcat_needed AND     l_org_needed) THEN l_flag_three := 1;
1335         WHEN (NOT l_cust_needed AND     l_item_needed AND NOT l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 1;
1336         WHEN (NOT l_cust_needed AND NOT l_item_needed AND     l_pcat_needed AND     l_org_needed) THEN l_flag_three := 0;
1337         WHEN (NOT l_cust_needed AND NOT l_item_needed AND     l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 1;
1338         WHEN (NOT l_cust_needed AND NOT l_item_needed AND NOT l_pcat_needed AND     l_org_needed) THEN l_flag_three := 0;
1339         WHEN (NOT l_cust_needed AND NOT l_item_needed AND NOT l_pcat_needed AND NOT l_org_needed) THEN l_flag_three := 1;
1340     END CASE;
1341 
1342     RETURN l_flag_three;
1343 
1344 END get_flag_three_val;
1345 
1346 /* get_flag_four_val
1347 
1348     Compute the flag_four value based on the parameters passed to
1349     determine the aggregation level of the MV rows that the query will
1350     have to run against.
1351 */
1352 FUNCTION get_flag_four_val (p_dim_name VARCHAR2,
1353                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1354     RETURN VARCHAR2
1355 IS
1356 
1357     l_flag_four varchar2(1);
1358 
1359     l_sub_val VARCHAR2 (120);
1360     l_cat_val VARCHAR2 (120);
1361     l_item_val VARCHAR2 (120);
1362 
1363 BEGIN
1364 
1365     l_sub_val := NULL;
1366     l_cat_val := NULL;
1367     l_item_val := NULL;
1368 
1369     -- Get the subinventory, category, and item values
1370     IF (p_dim_map.exists ('ORGANIZATION+ORGANIZATION_SUBINVENTORY')) THEN
1371         l_sub_val := p_dim_map ('ORGANIZATION+ORGANIZATION_SUBINVENTORY').value;
1372     END IF;
1373 
1374     IF (p_dim_map.exists ('ITEM+ENI_ITEM_INV_CAT')) THEN
1375         l_cat_val := p_dim_map ('ITEM+ENI_ITEM_INV_CAT').value;
1376     END IF;
1377 
1378     IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
1379         l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
1380     END IF;
1381 
1382     IF ((l_item_val IS NULL OR l_item_val = 'All') AND (l_cat_val IS NULL OR l_cat_val = 'All'))
1383       THEN
1384         IF (p_dim_name = 'ITEM+ENI_ITEM_ORG' OR p_dim_name = 'ITEM+ENI_ITEM_INV_CAT')
1385   	  THEN l_flag_four := '0';
1386         ELSIF (p_dim_name = 'ORGANIZATION+ORGANIZATION_SUBINVENTORY')
1387           THEN l_flag_four := '3';
1388         ELSE
1389 	  IF (l_sub_val IS NULL OR l_sub_val = 'All')
1390 	    THEN l_flag_four := '7';
1391 	  ELSE l_flag_four := '3';
1392 	  END IF;
1393         END IF;
1394     ELSE
1395       l_flag_four := '0';
1396     END IF;
1397 
1398     RETURN l_flag_four;
1399 
1400 END get_flag_four_val;
1401 
1402 /* get_flag_five_val
1403 
1404     Compute the flag5 value based on the parameters passed to
1405     determine the aggregation level of the MV rows that the query will
1406     have to run against.
1407 */
1408 FUNCTION get_flag_five_val (p_dim_name VARCHAR2,
1409                             p_dim_map IN poa_dbi_util_pkg.poa_dbi_dim_map)
1410     RETURN VARCHAR2
1411 IS
1412 
1413     l_flag_five varchar2(1);
1414 
1415     l_cat_val VARCHAR2 (120);
1416     l_item_val VARCHAR2 (120);
1417 
1418 BEGIN
1419 
1420     l_cat_val := NULL;
1421     l_item_val := NULL;
1422 
1423     -- Get the category and item values
1424     IF (p_dim_map.exists ('ITEM+ENI_ITEM_INV_CAT')) THEN
1425         l_cat_val := p_dim_map ('ITEM+ENI_ITEM_INV_CAT').value;
1426     END IF;
1427 
1428     IF (p_dim_map.exists ('ITEM+ENI_ITEM_ORG')) THEN
1429         l_item_val := p_dim_map ('ITEM+ENI_ITEM_ORG').value;
1430     END IF;
1431 
1432 
1433     IF (l_item_val IS NULL OR l_item_val = 'All')
1434       THEN
1435         IF (p_dim_name = 'ITEM+ENI_ITEM_ORG')
1436   	  THEN l_flag_five := '0'; -- item
1437         ELSIF (p_dim_name = 'ITEM+ENI_ITEM_INV_CAT')
1438           THEN l_flag_five := '1'; -- inventory category
1439         ELSE
1440 	  IF (l_cat_val IS NULL OR l_cat_val = 'All')
1441 	    THEN l_flag_five := '3'; -- all
1442 	  ELSE l_flag_five := '1'; -- inventory category
1443 	  END IF;
1444         END IF;
1445     ELSE
1446       l_flag_five := '0'; -- item
1447     END IF;
1448 
1449     RETURN l_flag_five;
1450 
1451 END get_flag_five_val;
1452 
1453 /* rate_str
1454 
1455     Gets the string for percentage/ratio change of two specified strings.
1456     Better than copying CASE statements everywhere
1457 */
1458 FUNCTION rate_str (p_numerator IN VARCHAR2,
1459                       p_denominator IN VARCHAR2,
1460                       p_rate_type IN VARCHAR2,
1461                       p_measure_name IN VARCHAR2)
1462     RETURN VARCHAR2
1463 IS
1464     l_nvl_denominator VARCHAR2 (100);
1465     l_nvl_numerator VARCHAR2 (100);
1466 
1467 BEGIN
1468 
1469     l_nvl_denominator  := 'nvl('||p_denominator||',0)';
1470     l_nvl_numerator  := 'nvl('||p_numerator||',0)';
1471 
1472         -- if rate is a ratio
1473         if(p_rate_type = 'RATIO') then
1477            ' || p_measure_name || ' ';
1474           return 'CASE WHEN ' || l_nvl_denominator || ' = 0 THEN to_number (NULL)
1475            ' || ' ELSE (' || l_nvl_numerator || '/' || p_denominator || ')
1476            ' || 'END
1478         end if;
1479 
1480         -- if rate is a percent
1481         return 'CASE WHEN ' || l_nvl_denominator || ' = 0 THEN to_number (NULL)
1482          ' || ' ELSE (' || l_nvl_numerator || '/' || p_denominator || ') * 100
1483          ' || 'END
1484          ' || p_measure_name || ' ';
1485 
1486 END rate_str;
1487 
1488 /* pos_denom_percent_str
1489 
1490     Gets the string for percentage change of two specified strings if
1491     the denominator is positive and greater than 0.
1492     Better than copying CASE statements everywhere.
1493 */
1494 FUNCTION pos_denom_percent_str (p_numerator IN VARCHAR2,
1495                                 p_denominator IN VARCHAR2,
1496                                 p_measure_name IN VARCHAR2)
1497     RETURN VARCHAR2
1498 IS
1499     l_percentage_calc VARCHAR2 (600);
1500     l_nvl_denominator VARCHAR2 (100);
1501     l_nvl_numerator VARCHAR2 (100);
1502 
1503 BEGIN
1504 
1505     l_nvl_denominator  := 'nvl('||p_denominator||',0)';
1506     l_nvl_numerator  := 'nvl('||p_numerator||',0)';
1507 
1508     l_percentage_calc :=
1509         'CASE WHEN ' || l_nvl_denominator || ' <= 0 THEN to_number (NULL)
1510         ' || ' ELSE (' || l_nvl_numerator || '/' || p_denominator || ') *100
1511         ' || 'END
1512         ' || p_measure_name || ' ';
1513 
1514     return l_percentage_calc;
1515 
1516 END pos_denom_percent_str;
1517 
1518 
1519 /* change_str
1520     Get the percentage change string. Better than writing out all the case
1521     statements
1522 */
1523 FUNCTION change_str (p_new_numerator IN VARCHAR2,
1524                      p_old_numerator IN VARCHAR2,
1525                      p_denominator IN VARCHAR2,
1526                      p_measure_name IN VARCHAR2)
1527     RETURN VARCHAR2
1528 IS
1529     l_change_calc VARCHAR2 (1000);
1530     l_nvl_denominator VARCHAR2 (1000);
1531     l_nvl_new_numerator VARCHAR2 (1000);
1532     l_nvl_old_numerator VARCHAR2 (1000);
1533 
1534 BEGIN
1535 
1536     l_nvl_denominator := 'nvl('||p_denominator||',0)';
1537     l_nvl_new_numerator := 'nvl('||p_new_numerator||',0)';
1538     l_nvl_old_numerator := 'nvl('||p_old_numerator||',0)';
1539 
1540     l_change_calc :=
1541         'CASE WHEN ' || l_nvl_denominator || ' = 0 THEN to_number (NULL)
1542         ' || '     ELSE ((' || l_nvl_new_numerator || ' - ' || l_nvl_old_numerator
1543           || ')/ abs (' || p_denominator || ')) * 100
1544         ' || '     END			' || p_measure_name || ' ';
1545 
1546     RETURN l_change_calc;
1547 END change_str;
1548 
1549 
1550 /* change_rate_str
1551     Get the change in percentage/ratio string. Better than writing out all the case
1552     statements
1553 */
1554 FUNCTION change_rate_str (p_new_numerator IN VARCHAR2,
1555                          p_new_denominator IN VARCHAR2,
1556                          p_old_numerator IN VARCHAR2,
1557                          p_old_denominator IN VARCHAR2,
1558                          p_rate_type IN VARCHAR2,
1559                          p_measure_name IN VARCHAR2)
1560     RETURN VARCHAR2
1561 IS
1562     l_nvl_new_denominator VARCHAR2(1000);
1563     l_nvl_old_denominator VARCHAR2(1000);
1564     l_nvl_new_numerator VARCHAR2(1000);
1565     l_nvl_old_numerator VARCHAR2(1000);
1566 
1567 BEGIN
1568 
1569     l_nvl_new_denominator := 'nvl('||p_new_denominator||',0)';
1570     l_nvl_old_denominator := 'nvl('||p_old_denominator||',0)';
1571     l_nvl_new_numerator := 'nvl('||p_new_numerator||',0)';
1572     l_nvl_old_numerator := 'nvl('||p_old_numerator||',0)';
1573 
1574         -- if rate is a ratio
1575         if(p_rate_type = 'RATIO') then
1576           return  'CASE WHEN ' || l_nvl_old_denominator || ' = 0 THEN to_number (NULL)
1577            ' || 'WHEN ' || l_nvl_new_denominator || ' = 0 THEN to_number (NULL)
1578            ' || ' ELSE ((' || l_nvl_new_numerator || '/'
1579                            || l_nvl_new_denominator ||
1580            ') -
1581            ' || '(' || l_nvl_old_numerator || '/'
1582                     || l_nvl_old_denominator || '))
1583            ' || 'END
1584            ' || p_measure_name || ' ';
1585         end if;
1586 
1587         -- if rate is a percent
1588         return  'CASE WHEN ' || l_nvl_old_denominator || ' = 0 THEN to_number (NULL)
1589          ' || 'WHEN ' || l_nvl_new_denominator || ' = 0 THEN to_number (NULL)
1590          ' || ' ELSE ((' || l_nvl_new_numerator || '/'
1591                          || l_nvl_new_denominator ||
1592          ') -
1593          ' || '(' || l_nvl_old_numerator || '/'
1594                   || l_nvl_old_denominator || '))*100
1595          ' || 'END
1596          ' || p_measure_name || ' ';
1597 
1598 END change_rate_str;
1599 
1600 
1601 /* Build the fact view by columns string using the join table
1602    for queries using windowing.
1603 */
1604 FUNCTION get_fact_select_columns (p_join_tbl IN
1605                                   poa_dbi_util_pkg.POA_DBI_JOIN_TBL)
1606     RETURN VARCHAR2
1607 IS
1608     l_fact_select_cols VARCHAR2(400);
1609 BEGIN
1610 
1611     l_fact_select_cols := '';
1612 
1613     FOR l_num IN p_join_tbl.first .. p_join_tbl.last
1614     LOOP
1615         IF (p_join_tbl.exists(l_num)) THEN
1616             l_fact_select_cols := l_fact_select_cols ||
1617                                   p_join_tbl(l_num).fact_column || ',
1618                                   ';
1619         END IF;
1620     END LOOP;
1621     -- trim trailing comma and carriage returns, and add a space
1622     l_fact_select_cols := rtrim (l_fact_select_cols, ',
1623                                                        ') || ' ';
1624 
1625     return l_fact_select_cols;
1626 
1627 END get_fact_select_columns;
1628 
1629 
1630 /* get_global_weight_uom
1631     Gets the global weight unit of measure
1632  */
1633 FUNCTION get_global_weight_uom RETURN VARCHAR2
1634 IS
1635     l_weight_uom VARCHAR2(400);
1636 BEGIN
1637 
1638     select gu_weight_uom into l_weight_uom from wsh_global_parameters;
1639 
1640     RETURN l_weight_uom;
1641 
1642 END get_global_weight_uom;
1643 
1644 
1645 /* get_global_volume_uom
1646     Gets the global volume unit of measure
1647  */
1648 FUNCTION get_global_volume_uom RETURN VARCHAR2
1649 IS
1650     l_volume_uom VARCHAR2(400);
1651 BEGIN
1652 
1653     select gu_volume_uom into l_volume_uom from wsh_global_parameters;
1654 
1655     RETURN l_volume_uom;
1656 
1657 END get_global_volume_uom;
1658 
1659 
1660 /* get_global_distance_uom
1661     Gets the global distance unit of measure
1662  */
1663 FUNCTION get_global_distance_uom RETURN VARCHAR2
1664 IS
1665     l_distance_uom VARCHAR2(400);
1666 BEGIN
1667 
1668     select gu_distance_uom into l_distance_uom from wsh_global_parameters;
1669 
1670     RETURN l_distance_uom;
1671 
1672 END get_global_distance_uom;
1673 
1674 END ISC_DBI_SUTIL_PKG;