[Home] [Help]
PACKAGE BODY: APPS.MSD_COMPOSITE_GROUPING
Source
1 PACKAGE BODY MSD_COMPOSITE_GROUPING AS -- body
2 /* $Header: MSDCMGRB.pls 120.1 2006/01/19 23:12:42 sjagathe noship $ */
3
4 TYPE stream_rec_type IS RECORD
5 ( p_stream_id NUMBER,
6 l_stream_count NUMBER,
7 l_distinct_distributions NUMBER,
8 l_base_stream_id NUMBER,
9 l_group NUMBER,
10 l_reading_level_string VARCHAR2(300),
11 l_dimension_clause VARCHAR2(300),
12 l_groupable NUMBER );
13
14 TYPE stream_tbl_type IS TABLE OF stream_rec_type
15 INDEX BY BINARY_INTEGER;
16
17 TYPE CharTblTyp IS TABLE OF VARCHAR2(255);
18 TYPE NumTblTyp IS TABLE OF NUMBER;
19
20 lb_stream_id NumTblTyp;
21 lb_geo_dim CharTblTyp;
22 lb_org_dim CharTblTyp;
23 lb_prd_dim CharTblTyp;
24 lb_rep_dim CharTblTyp;
25 lb_chn_dim CharTblTyp;
26 lb_dcs_dim CharTblTyp;
27 lb_ud1_dim CharTblTyp;
28 lb_ud2_dim CharTblTyp;
29 lb_base_stream_id NumTblTyp;
30
31 lb_cs_definition_id NumTblTyp;
32 lb_dimension_code CharTblTyp;
33 lb_level_id NumTblTyp;
34
35 v_group_number PLS_INTEGER;
36 v_counter PLS_INTEGER;
37 v_final_tbl stream_tbl_type;
38 v_index PLS_INTEGER;
39
40 v_threshold_overlap NUMBER;
41
42
43 PROCEDURE LOG_DEBUG( pBUFF IN VARCHAR2)
44 IS
45 BEGIN
46
47 IF G_MSC_DEBUG = 'Y' THEN
48
49 FND_FILE.PUT_LINE( FND_FILE.LOG, pBUFF);
50
51 ELSE
52 NULL;
53 --DBMS_OUTPUT.PUT_LINE( pBUFF);
54
55 END IF;
56
57 END LOG_DEBUG;
58
59 PROCEDURE LOG_MESSAGE( pBUFF IN VARCHAR2)
60 IS
61 BEGIN
62
63 FND_FILE.PUT_LINE( FND_FILE.LOG, pBUFF);
64
65 END LOG_MESSAGE;
66
67 FUNCTION GET_DIM_CODE (p_level_id IN NUMBER)
68 RETURN VARCHAR2 AS
69
70 lv_dimension_code VARCHAR2(10);
71 BEGIN
72
73 select dimension_code
74 into lv_dimension_code
75 from msd_levels
76 where level_id=p_level_id
77 and plan_type is NULL; -- Bug# 4928951
78
79 /* The above fix requires plan_type column (with value as NULL) to be
80 present in msd_levels even if liability code is removed. If the
81 column is removed, the condition on plan_type must be removed */
82
83 return lv_dimension_code||'_DIM';
84
85 END GET_DIM_CODE;
86
87 FUNCTION number_of_designators (p_cs_definition_id IN NUMBER)
88 RETURN NUMBER AS
89
90 lv_desig_count NUMBER;
91
92 BEGIN
93
94 select count(*) into lv_desig_count
95 from (select distinct cs_name from msd_cs_data where cs_definition_id=p_cs_definition_id);
96
97
98 return lv_desig_count;
99
100 END number_of_designators;
101
102 FUNCTION GET_STREAM_COUNT (p_cs_definition_id IN NUMBER)
103 RETURN NUMBER AS
104
105 lv_count NUMBER;
106 BEGIN
107
108 select count(*)
109 into lv_count
110 from MSD_DISTINCT_DIM_VAL_TEMP
111 where stream_id=p_cs_definition_id;
112
113 return lv_count;
114
115 END GET_STREAM_COUNT;
116
117
118 PROCEDURE GET_LEVEL_ID ( p_cs_definition_id IN NUMBER,
119 p_dimension_code IN VARCHAR2)
120 IS
121
122 CURSOR a(p_cs_definition_id NUMBER,p_dimension_code VARCHAR2) IS
123 select to_number(decode(p_dimension_code,'PRD',attribute_2,'GEO',attribute_6,'ORG',attribute_10,'REP',attribute_18,'CHN',attribute_22,'UD1',attribute_26,'UD2',attribute_30,'DCS',attribute_45))
124 from msd_cs_data
125 where cs_definition_id= p_cs_definition_id
126 and cs_data_id = (select min(cs_data_id) from msd_cs_data where cs_definition_id=p_cs_definition_id);
127
128 lv_collect_level_id NUMBER;
129 lv_error_text VARCHAR2(2000);
130
131 BEGIN
132
133 LOG_DEBUG('Entered in GET_LEVEL_ID with p_cs_definition_id='||p_cs_definition_id||' and p_dimension_code ='||p_dimension_code);
134
135 OPEN a(p_cs_definition_id,p_dimension_code);
136
137 FETCH a INTO lv_collect_level_id;
138 LOG_DEBUG('The value of lv_collect_level_id is '||lv_collect_level_id);
139 UPDATE MSD_CS_DTLS_TEMP
140 SET COLLECT_LEVEL_ID = lv_collect_level_id
141 WHERE DIMENSION_CODE = p_dimension_code
142 AND CS_DEFINITION_ID = p_cs_definition_id;
143
144 CLOSE a;
145
146
147 EXCEPTION
148 WHEN OTHERS THEN
149
150 lv_error_text :=SQLERRM;
151 LOG_DEBUG(lv_error_text);
152
153 END GET_LEVEL_ID;
154
155 PROCEDURE get_boundaries(p_index IN NUMBER,
156 p_lower OUT NOCOPY NUMBER,
157 p_upper OUT NOCOPY NUMBER,
158 p_stream_tbl IN stream_tbl_type)
159 IS
160
161 l_counter PLS_INTEGER;
162
163
164 BEGIN
165
166 LOG_DEBUG('started get_boundaries');
167 l_counter :=1;
168
169 FOR i IN 1..p_stream_tbl.COUNT LOOP
170
171 IF p_stream_tbl(i).l_groupable = p_index THEN
172 p_lower := l_counter;
173 EXIT;
174 ELSE
175 l_counter := l_counter+1;
176 END IF;
177
178 END LOOP;
179
180
181 FOR i IN l_counter..p_stream_tbl.COUNT LOOP
182
183 IF p_stream_tbl(i).l_groupable = p_index+1 THEN
184 p_upper := l_counter-1;
185 EXIT;
186 ELSE
187 IF i <> p_stream_tbl.COUNT THEN
188 l_counter := l_counter +1;
189 ELSE
190 p_upper := i;
191 END IF;
192 END IF;
193
194 END LOOP;
195
196 EXCEPTION
197 WHEN OTHERS THEN
198 LOG_DEBUG('inside when others error- get_boundaries');
199 LOG_DEBUG(SQLERRM);
200
201 END get_boundaries;
202
203 PROCEDURE LOAD_SHIPMENT_STREAM
204 IS
205
206 CURSOR shipment IS
207 SELECT DISTINCT x.ship_to_loc,
208 x.inv_org,
209 x.item,
210 x.sales_rep,
211 x.sales_channel,
212 x.user_defined1,
213 x.user_defined2,
214 null -- dcs level value
215 FROM msd_shipment_data_v x;
216
217 lv_stream_id NUMBER;
218
219 BEGIN
220
221 -- MSD_SHIPMENT_HISTORY
222
223 select cs_definition_id into lv_stream_id
224 from msd_cs_definitions
225 where name='MSD_SHIPMENT_HISTORY';
226
227 OPEN shipment;
228 FETCH shipment BULK COLLECT INTO
229 lb_geo_dim,
230 lb_org_dim,
231 lb_prd_dim,
232 lb_rep_dim,
233 lb_chn_dim,
234 lb_ud1_dim,
235 lb_ud2_dim,
236 lb_dcs_dim;
237
238
239 IF shipment%ROWCOUNT > 0 THEN
240
241 FORALL j IN lb_geo_dim.FIRST..lb_geo_dim.LAST
242 INSERT INTO MSD_DISTINCT_DIM_VAL_TEMP
243 ( STREAM_ID,
244 GEO_DIM,
245 ORG_DIM,
246 PRD_DIM,
247 REP_DIM,
248 CHN_DIM,
249 UD1_DIM,
250 UD2_DIM,
251 DCS_DIM,
252 BASE_STREAM_ID )
253 VALUES
254 ( lv_stream_id,
255 lb_geo_dim(j),
256 lb_org_dim(j),
257 lb_prd_dim(j),
258 lb_rep_dim(j),
259 lb_chn_dim(j),
260 lb_ud1_dim(j),
261 lb_ud2_dim(j),
262 lb_dcs_dim(j),
263 lv_stream_id);
264
265 END IF;
266 CLOSE shipment;
267
268 INSERT INTO MSD_CS_DTLS_TEMP
269 ( CS_DEFINITION_ID,
270 DIMENSION_CODE,
271 COLLECT_LEVEL_ID )
272 SELECT a.cs_definition_id,
273 a.dimension_code,
274 a.collect_level_id
275 FROM msd_cs_defn_dim_dtls a, msd_cs_definitions b
276 WHERE a.cs_definition_id = b.cs_definition_id
277 AND b.cs_definition_id = lv_stream_id
278 AND a.dimension_code <> 'TIM'
279 AND a.collect_flag='Y'
280 AND b.strict_flag='Y'
281 AND b.valid_flag='Y'
282 AND b.enable_flag='Y'
283 AND EXISTS (select 1 from msd_shipment_data where rownum=1);
284
285 --MSD_SHIPMENT_ORIG_HISTORY ??
286
287
288 EXCEPTION
289 WHEN OTHERS THEN
290 LOG_DEBUG ('when others error -LOAD_SHIPMENT_STREAM');
291
292 END LOAD_SHIPMENT_STREAM;
293
294 PROCEDURE LOAD_BOOKING_STREAM
295 IS
296
297 CURSOR booking IS
298 SELECT DISTINCT x.ship_to_loc,
299 x.inv_org,
300 x.item,
301 x.sales_rep,
302 x.sales_channel,
303 x.user_defined1,
304 x.user_defined2,
305 null -- dcs level value
306 FROM msd_booking_data_v x;
307
308 lv_stream_id NUMBER;
309
310 BEGIN
311
312 -- MSD_BOOKING_HISTORY
313
314 select cs_definition_id into lv_stream_id
315 from msd_cs_definitions
316 where name='MSD_BOOKING_HISTORY';
317
318 OPEN booking;
319 FETCH booking BULK COLLECT INTO
320 lb_geo_dim,
321 lb_org_dim,
322 lb_prd_dim,
323 lb_rep_dim,
324 lb_chn_dim,
325 lb_ud1_dim,
326 lb_ud2_dim,
327 lb_dcs_dim;
328
329
330 IF booking%ROWCOUNT > 0 THEN
331
332 FORALL j IN lb_geo_dim.FIRST..lb_geo_dim.LAST
333 INSERT INTO MSD_DISTINCT_DIM_VAL_TEMP
334 ( STREAM_ID,
335 GEO_DIM,
336 ORG_DIM,
337 PRD_DIM,
338 REP_DIM,
339 CHN_DIM,
340 UD1_DIM,
341 UD2_DIM,
342 DCS_DIM,
343 BASE_STREAM_ID )
344 VALUES
345 ( lv_stream_id,
346 lb_geo_dim(j),
347 lb_org_dim(j),
348 lb_prd_dim(j),
349 lb_rep_dim(j),
350 lb_chn_dim(j),
351 lb_ud1_dim(j),
352 lb_ud2_dim(j),
353 lb_dcs_dim(j),
354 lv_stream_id);
355
356 END IF;
357 CLOSE booking;
358
359 INSERT INTO MSD_CS_DTLS_TEMP
360 ( CS_DEFINITION_ID,
361 DIMENSION_CODE,
362 COLLECT_LEVEL_ID )
363 SELECT a.cs_definition_id,
364 a.dimension_code,
365 a.collect_level_id
366 FROM msd_cs_defn_dim_dtls a, msd_cs_definitions b
367 WHERE a.cs_definition_id = b.cs_definition_id
368 AND b.cs_definition_id = lv_stream_id
369 AND a.dimension_code <> 'TIM'
370 AND a.collect_flag='Y'
371 AND b.strict_flag='Y'
372 AND b.valid_flag='Y'
373 AND b.enable_flag='Y'
374 AND EXISTS (select 1 from msd_booking_data where rownum=1);
375
376 --MSD_BOOKING_ORIG_HISTORY ??
377
378 EXCEPTION
379 WHEN OTHERS THEN
380 LOG_DEBUG ('when others error -LOAD_BOOKING_STREAM');
381
382 END LOAD_BOOKING_STREAM;
383
384 PROCEDURE LOAD_MFG_FORECAST
385 IS
386
387 CURSOR mfg_forecast IS
388 select distinct ship_to_loc_pk.level_value,
389 org_pk.level_value,
390 item_pk.level_value,
391 null,
392 sales_channel_pk.level_value,
393 null,
394 null,
395 dcs_pk.level_value
396 from
397 msd_mfg_forecast mbd,
398 msd_level_values org_pk,
399 msd_level_values dcs_pk,
400 msd_level_values item_pk,
401 msd_level_values sales_channel_pk,
402 msd_level_values ship_to_loc_pk
403 WHERE (org_pk.instance = mbd.instance and org_pk.sr_level_pk = mbd.sr_inv_org_pk and org_pk.level_id = 7)
404 AND (dcs_pk.instance = mbd.instance and dcs_pk.sr_level_pk = mbd.sr_demand_class_pk and dcs_pk.level_id = 34)
405 AND (item_pk.instance = mbd.instance and item_pk.sr_level_pk = mbd.sr_item_pk and item_pk.level_id = 1)
406 AND (sales_channel_pk.instance(+) = mbd.instance and sales_channel_pk.sr_level_pk(+) = mbd.sr_sales_channel_pk and sales_channel_pk.level_id(+) = 27)
407 AND (ship_to_loc_pk.instance(+) = mbd.instance and ship_to_loc_pk.sr_level_pk(+) = mbd.sr_ship_to_loc_pk and ship_to_loc_pk.level_id(+) = 11);
408
409 lv_stream_id NUMBER;
410 lv_forecast_designator NUMBER;
411
412 BEGIN
413
414 select cs_definition_id into lv_stream_id
415 from msd_cs_definitions
416 where name='MSD_MANUFACTURING_FORECAST';
417
418 select count(*) into lv_forecast_designator
419 from ( select distinct forecast_designator from msd_mfg_forecast);
420
421 IF ( lv_forecast_designator = 1 ) THEN
422
423 OPEN mfg_forecast;
424 FETCH mfg_forecast BULK COLLECT INTO
425 lb_geo_dim,
426 lb_org_dim,
427 lb_prd_dim,
428 lb_rep_dim,
429 lb_chn_dim,
430 lb_ud1_dim,
431 lb_ud2_dim,
432 lb_dcs_dim;
433
434
435 IF mfg_forecast%ROWCOUNT > 0 THEN
436
437 FORALL j IN lb_geo_dim.FIRST..lb_geo_dim.LAST
438 INSERT INTO MSD_DISTINCT_DIM_VAL_TEMP
439 ( STREAM_ID,
440 GEO_DIM,
441 ORG_DIM,
442 PRD_DIM,
443 REP_DIM,
444 CHN_DIM,
445 UD1_DIM,
446 UD2_DIM,
447 DCS_DIM,
448 BASE_STREAM_ID )
449 VALUES
450 ( lv_stream_id,
451 lb_geo_dim(j),
452 lb_org_dim(j),
453 lb_prd_dim(j),
454 lb_rep_dim(j),
455 lb_chn_dim(j),
456 lb_ud1_dim(j),
457 lb_ud2_dim(j),
458 lb_dcs_dim(j),
459 lv_stream_id);
460
461 END IF;
462 CLOSE mfg_forecast;
463
464 INSERT INTO MSD_CS_DTLS_TEMP
465 ( CS_DEFINITION_ID,
466 DIMENSION_CODE,
467 COLLECT_LEVEL_ID )
468 SELECT a.cs_definition_id,
469 a.dimension_code,
470 a.collect_level_id
471 FROM msd_cs_defn_dim_dtls a, msd_cs_definitions b
472 WHERE a.cs_definition_id = b.cs_definition_id
473 AND b.cs_definition_id = lv_stream_id
474 AND a.dimension_code <> 'TIM'
475 AND a.collect_flag='Y'
476 AND b.strict_flag='Y'
477 AND b.valid_flag='Y'
478 AND b.enable_flag='Y'
479 AND EXISTS (select 1 from MSD_MFG_FCST_CS_V where rownum=1);
480
481 ELSE
482 NULL;
483 END IF;
484
485 EXCEPTION
486 WHEN OTHERS THEN
487 LOG_DEBUG ('when others error -LOAD_MFG_FORECAST');
488
489 END LOAD_MFG_FORECAST;
493 IS
490
491
492 PROCEDURE get_in_order ( p_stream_tbl IN OUT NOCOPY stream_tbl_type )
494
495 temp_rec stream_rec_type;
496 l_max_index NUMBER;
497
498 BEGIN
499
500 FOR i in 1..p_stream_tbl.COUNT
501 LOOP
502
503 l_max_index := i ;
504
505 FOR j in i+1..p_stream_tbl.COUNT
506 LOOP
507
508 IF p_stream_tbl(j).l_distinct_distributions > p_stream_tbl(l_max_index).l_distinct_distributions
509 THEN
510
511 l_max_index := j;
512
513 END IF;
514
515 END LOOP;
516
517
518 temp_rec := p_stream_tbl(l_max_index);
519 p_stream_tbl(l_max_index) := p_stream_tbl(i);
520 p_stream_tbl(i) := temp_rec ;
521
522 END LOOP;
523
524 EXCEPTION
525 WHEN OTHERS THEN
526 LOG_DEBUG ('when others error -get_in_order');
527
528 END get_in_order;
529
530
531
532
533 PROCEDURE MSD_ASSIGN_GROUPS (p_stream_tbl IN OUT NOCOPY stream_tbl_type)
534
535
536 IS
537
538 l_grouped BOOLEAN;
539 l_base_stream_index NUMBER;
540 lv_sql_stmt VARCHAR2(2000);
541 l_temp_rec stream_rec_type;
542
543 l_overlap NUMBER;
544 l_current_group NUMBER;
545
546
547 BEGIN
548
549 LOG_MESSAGE('Entered in MSD_ASSIGN_GROUPS');
550
551 LOG_MESSAGE ('Number of streams in this particular stream set :'||p_stream_tbl.COUNT);
552
553 /* For Logging purpose */
554 FOR j in 1..p_stream_tbl.COUNT
555 LOOP
556 LOG_MESSAGE ( 'Element '||j||': '||p_stream_tbl(j).p_stream_id||', '||p_stream_tbl(j).l_reading_level_string||', '||p_stream_tbl(j).l_groupable );
557 END LOOP;
558
559
560
561
562 IF p_stream_tbl.COUNT = 1 THEN
563
564 v_group_number := v_group_number + 1;
565 p_stream_tbl(1).l_group := v_group_number;
566
567 LOG_DEBUG('Value of v_group_number '||v_group_number);
568
569 v_counter := v_counter + 1;
570 v_final_tbl(v_counter) := p_stream_tbl(1);
571
572 LOG_DEBUG('Value of v_counter '||v_counter);
573
574 /* LOG_DEBUG('*********SHOW v_final_tbl when count is one-starts********');
575
576
577 For Logging purpose
578 FOR j in 1..v_final_tbl.COUNT
579 LOOP
580 LOG_DEBUG ( 'Element '||j||': '||v_final_tbl(j).p_stream_id||', '||v_final_tbl(j).l_reading_level_string||', '||v_final_tbl(j).l_groupable||', '||v_final_tbl(j).l_group );
581 END LOOP;
582
583
584
585 LOG_DEBUG('*********SHOW v_final_tbl when count is one-ends********'); */
586
587 ELSE
588
589 LOG_DEBUG ('***********SORTING STARTS***************** ');
590
591 get_in_order(p_stream_tbl);
592
593
594 FOR j in 1..p_stream_tbl.COUNT
595 LOOP
596 LOG_DEBUG ( 'Element '||j||': '||p_stream_tbl(j).p_stream_id||', '||p_stream_tbl(j).l_distinct_distributions||', '||p_stream_tbl(j).l_dimension_clause );
597 END LOOP;
598
599 LOG_DEBUG ('***********SORTING ENDS***************** ');
600
601
602 v_group_number := v_group_number + 1;
603 p_stream_tbl(1).l_group := v_group_number;
604
605 LOG_DEBUG('Value of v_group_number '||v_group_number);
606
607 l_current_group :=v_group_number;
608
609
610 FOR i IN 2..p_stream_tbl.COUNT
611 LOOP
612
613 l_grouped := FALSE;
614 l_base_stream_index := 0;
615
616 LOG_DEBUG('-------Value of i is:'||i||'--------');
617
618 FOR j IN REVERSE 1..(i-1)
619 LOOP
620
621 LOG_DEBUG('-------Value of j is:'||j||'--------');
622
623 IF ( (not l_grouped) AND (p_stream_tbl(j).l_base_stream_id = p_stream_tbl(j).p_stream_id) ) THEN
624
625 lv_sql_stmt := ' select sum(count(*))/2 '
626 ||' from MSD_DISTINCT_DIM_VAL_TEMP '
627 ||' where base_stream_id in ( :l_id1, :l_id2 ) '
628 ||' group by '||p_stream_tbl(i).l_dimension_clause
629 ||' having count(*) > 1 ';
630
631 LOG_DEBUG('------SQL statement1 to be executed is : '||lv_sql_stmt);
632 LOG_DEBUG('------Parameters are l_id1'||p_stream_tbl(i).l_base_stream_id);
633 LOG_DEBUG('------Parameters are l_id2'||p_stream_tbl(j).l_base_stream_id);
634
635
636 EXECUTE IMMEDIATE lv_sql_stmt INTO l_overlap USING p_stream_tbl(i).l_base_stream_id,
637 p_stream_tbl(j).l_base_stream_id;
638
639 LOG_DEBUG('---- Value of l_overlap is : '||l_overlap||'--------');
640
641 IF (( l_overlap/(p_stream_tbl(i).l_stream_count + p_stream_tbl(j).l_distinct_distributions - l_overlap)) > v_threshold_overlap )
642 THEN
643
644 LOG_DEBUG('----Passes the threshold value----------');
645
646 l_grouped := TRUE;
650 p_stream_tbl(j).l_distinct_distributions := p_stream_tbl(j).l_distinct_distributions + p_stream_tbl(i).l_stream_count - l_overlap;
647 p_stream_tbl(i).l_group := p_stream_tbl(j).l_group;
648 l_base_stream_index := j;
649 p_stream_tbl(i).l_base_stream_id := p_stream_tbl(j).p_stream_id;
651
652 /*
653 lv_sql_stmt := ' UPDATE MSD_DISTINCT_DIM_VAL_TEMP '
654 ||' SET base_stream_id = 0 '
655 || ' WHERE rowid in ( select min(rowid) '
656 ||' from MSD_DISTINCT_DIM_VAL_TEMP '
657 ||' where base_stream_id in (:l_id1, :l_id2) '
658 ||' group by '||p_stream_tbl(i).l_dimension_clause
659 ||' having count(*) > 1)'; */
660
661 lv_sql_stmt := ' UPDATE MSD_DISTINCT_DIM_VAL_TEMP '
662 ||' SET BASE_STREAM_ID = 0 '
663 ||' WHERE ROWID IN ( select x.rowid from '
664 ||' (select geo_dim,org_dim,prd_dim,rep_dim,chn_dim,dcs_dim,ud1_dim,ud2_dim from MSD_DISTINCT_DIM_VAL_TEMP where base_stream_id=:l_id1) x, '
665 ||' (select geo_dim,org_dim,prd_dim,rep_dim,chn_dim,dcs_dim,ud1_dim,ud2_dim from MSD_DISTINCT_DIM_VAL_TEMP where base_stream_id=:l_id2) y '
666 ||' where nvl(x.geo_dim,-1) = nvl(y.geo_dim,-1) '
667 ||' and nvl(x.org_dim,-1) = nvl(y.org_dim,-1) '
668 ||' and nvl(x.prd_dim,-1) = nvl(y.prd_dim,-1) '
669 ||' and nvl(x.rep_dim,-1) = nvl(y.rep_dim,-1) '
670 ||' and nvl(x.chn_dim,-1) = nvl(y.chn_dim,-1) '
671 ||' and nvl(x.dcs_dim,-1) = nvl(y.dcs_dim,-1) '
672 ||' and nvl(x.ud1_dim,-1) = nvl(y.ud1_dim,-1) '
673 ||' and nvl(x.ud2_dim,-1) = nvl(y.ud2_dim,-1) )';
674
675
676 LOG_DEBUG('------SQL statement2 to be executed is : '||lv_sql_stmt);
677 LOG_DEBUG('------Parameters are l_id1'||p_stream_tbl(i).p_stream_id);
678 LOG_DEBUG('------Parameters are l_id2'||p_stream_tbl(j).p_stream_id);
679
680 EXECUTE IMMEDIATE lv_sql_stmt USING p_stream_tbl(i).p_stream_id,
681 p_stream_tbl(j).p_stream_id;
682
683
684
685 UPDATE MSD_DISTINCT_DIM_VAL_TEMP
686 SET base_stream_id = p_stream_tbl(j).p_stream_id
687 WHERE stream_id = p_stream_tbl(i).p_stream_id
688 AND base_stream_id = p_stream_tbl(i).p_stream_id;
689
690 END IF; /* check for p_threshold */
691
692
693 ELSIF l_grouped AND ( p_stream_tbl(j).l_base_stream_id = p_stream_tbl(j).p_stream_id ) THEN
694
695 LOG_DEBUG('-------Entered in the conditioned where l_grouped is TRUE-----');
696
697 IF p_stream_tbl(j).l_distinct_distributions < p_stream_tbl(l_base_stream_index).l_distinct_distributions
698 THEN
699
700 LOG_DEBUG('---------Entered in the swapping-----');
701
702 l_temp_rec := p_stream_tbl(j);
703 p_stream_tbl(j) := p_stream_tbl(l_base_stream_index);
704 p_stream_tbl(l_base_stream_index) := l_temp_rec;
705
706 l_base_stream_index := j;
707
708 END IF;
709
710 END IF;
711
712
713
714 END LOOP; /* for j */
715
716
717 IF p_stream_tbl(i).l_group IS NULL THEN
718
719 LOG_DEBUG('------Entered in the condition -> where l_group is still NULL--------');
720
721 l_current_group :=l_current_group + 1;
722 v_group_number := v_group_number + 1;
723 p_stream_tbl(i).l_group := l_current_group;
724
725 LOG_DEBUG('Value of v_group_number '||v_group_number);
726
727 END IF;
728
729 END LOOP; /* for i */
730
731
732 LOG_DEBUG('----- OUT of i LOOP , incrementing the value of v_counter-------');
733
734 FOR i IN 1..p_stream_tbl.COUNT LOOP
735
736 v_counter := v_counter + 1;
737 v_final_tbl(v_counter) := p_stream_tbl(i);
738
739 LOG_DEBUG('Value of v_counter '||v_counter);
740
741 END LOOP;
742
743 END IF;
744
745
746 IF v_counter = v_index - 1 THEN
747
748 LOG_MESSAGE ('Procedure MSD_ASSIGN_GROUPS is sucessfully completed for all the groupable set of streams');
749
750 --LOG_DEBUG ('value of v_final_tbl.COUNT '||v_final_tbl.COUNT);
751
752 /* -- For Logging purpose
753 FOR j in 1..v_final_tbl.COUNT
754 LOOP
758
755 LOG_DEBUG ( 'Element '||j||': '||v_final_tbl(j).p_stream_id||', '||v_final_tbl(j).l_reading_level_string||', '||v_final_tbl(j).l_groupable||', '||v_final_tbl(j).l_group );
756 END LOOP;
757 */
759 END IF;
760
761
762 EXCEPTION
763 WHEN OTHERS THEN
764 LOG_DEBUG ('when others error -MSD_ASSIGN_GROUPS');
765 ROLLBACK;
766 LOG_DEBUG(SQLERRM);
767
768 END MSD_ASSIGN_GROUPS;
769
770
771 PROCEDURE MSD_GROUP_STREAMS ( ERRBUF OUT NOCOPY VARCHAR2,
772 RETCODE OUT NOCOPY NUMBER,
773 p_mode IN NUMBER DEFAULT SYS_NO,
774 p_threshold_overlap IN NUMBER DEFAULT NULL)
775 IS
776
777 stream_tbl1 stream_tbl_type;
778 stream_tbl2 stream_tbl_type;
779 stream_tbl3 stream_tbl_type;
780
781 lv_cs_definition_id NUMBER;
782 lv_dimension_code VARCHAR2(10);
783 lv_cur_stmt VARCHAR2(2000);
784
785 lv_reading_level_string VARCHAR2(255);
786 lv_dimension_clause VARCHAR2(255);
787 lv_stream_count NUMBER;
788
789
790 lv_groupable PLS_INTEGER;
791 x_var PLS_INTEGER;
792 l_lower PLS_INTEGER;
793 l_upper PLS_INTEGER;
794
795
796 CURSOR c IS
797 SELECT DISTINCT x.cs_definition_id,
798 x.attribute_8,
799 x.attribute_12,
800 x.attribute_4,
801 x.attribute_20,
802 x.attribute_24,
803 x.attribute_28,
804 x.attribute_32,
805 x.attribute_47,
806 x.cs_definition_id
807 FROM msd_cs_data x;
808
809 CURSOR c1 IS
810 SELECT a.cs_definition_id,a.dimension_code,a.collect_level_id
811 FROM msd_cs_defn_dim_dtls a, msd_cs_definitions b
812 WHERE a.cs_definition_id = b.cs_definition_id
813 AND a.dimension_code <> 'TIM'
814 AND a.collect_flag='Y'
815 AND b.strict_flag='Y'
816 AND b.valid_flag='Y'
817 AND b.enable_flag='Y'
818 AND ( ( b.multiple_stream_flag='N') OR ( b.multiple_stream_flag='Y' and MSD_COMPOSITE_GROUPING.number_of_designators(b.cs_definition_id)=1 ))
819 AND EXISTS (select 1 from msd_cs_data where cs_definition_id=a.cs_definition_id) ;
820 --need to elimintate custom streams having multiple streams with more than one designator.
821
822 CURSOR c2 IS
823 SELECT cs_definition_id,dimension_code
824 FROM MSD_CS_DTLS_TEMP
825 WHERE COLLECT_LEVEL_ID IS NULL;
826
827 TYPE mastcurtyp IS REF CURSOR;
828 c3 mastcurtyp;
829
830 --Made c3 Cursor dynamic for Bug 3476620.
831 /*
832 CURSOR c3 IS
833 SELECT cs_definition_id stream_id,
834 MSD_COMPOSITE_GROUPING.GET_STREAM_COUNT(cs_definition_id) stream_count,
835 MSD_COMPOSITE_GROUPING.GET_STREAM_COUNT(cs_definition_id) distinct_stream_count,
836 cs_definition_id base_stream_id,
837 dim1||decode(dim2,NULL,'',','||dim2)||decode(dim3,NULL,'',','||dim3)||decode(dim4,NULL,'',','||dim4)||decode(dim5,NULL,'',','||dim5)||decode(dim6,NULL,'',','||dim6)||decode(dim7,NULL,'',','||dim7)||decode(dim8,NULL,'',','||dim8)
838 reading_level_string,
839 MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim1)||decode(dim2,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim2))||decode(dim3,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim3))||decode(dim4,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim4))||
840 decode(dim5,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim5))||decode(dim6,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim6))||decode(dim7,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim7))||
841 decode(dim8,NULL,'',','||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim8)) dimension_clause
842 FROM
843 (select cs_definition_id,collect_level_id as dim1,
844 LEAD(collect_level_id,1) over (partition by cs_definition_id order by collect_level_id) as dim2,
845 LEAD(collect_level_id,2) over (partition by cs_definition_id order by collect_level_id) as dim3,
846 LEAD(collect_level_id,3) over (partition by cs_definition_id order by collect_level_id) as dim4,
847 LEAD(collect_level_id,4) over (partition by cs_definition_id order by collect_level_id) as dim5,
848 LEAD(collect_level_id,5) over (partition by cs_definition_id order by collect_level_id) as dim6,
849 LEAD(collect_level_id,6) over (partition by cs_definition_id order by collect_level_id) as dim7,
850 LEAD(collect_level_id,7) over (partition by cs_definition_id order by collect_level_id) as dim8,
851 row_number() over (partition by cs_definition_id order by collect_level_id) as rno
852 from MSD_CS_DTLS_TEMP )
853 WHERE rno=1
854 ORDER BY dim1,dim2,dim3,dim4,dim5,dim6,dim7,dim8;
855 */
856
857 BEGIN
858
859 v_threshold_overlap := p_threshold_overlap;
860 v_threshold_overlap :=0.85; -- Hardcoded Threshold percentage
861
862 ----- populating the temporary tables MSD_DISTINCT_DIM_VAL_TEMP and MSD_CS_DTLS_TEMP -------
863
864 --TRUNCATE TABLE MSD_DISTINCT_DIM_VAL_TEMP;
865
866 OPEN c;
867 FETCH c BULK COLLECT INTO
868 lb_stream_id,
869 lb_geo_dim,
870 lb_org_dim,
871 lb_prd_dim,
872 lb_rep_dim,
873 lb_chn_dim,
874 lb_ud1_dim,
875 lb_ud2_dim,
876 lb_dcs_dim,
877 lb_base_stream_id;
878
879 IF c%ROWCOUNT > 0 THEN
880
884 GEO_DIM,
881 FORALL j IN lb_stream_id.FIRST..lb_stream_id.LAST
882 INSERT INTO MSD_DISTINCT_DIM_VAL_TEMP
883 ( STREAM_ID,
885 ORG_DIM,
886 PRD_DIM,
887 REP_DIM,
888 CHN_DIM,
889 UD1_DIM,
890 UD2_DIM,
891 DCS_DIM,
892 BASE_STREAM_ID )
893 VALUES
894 ( lb_stream_id(j),
895 lb_geo_dim(j),
896 lb_org_dim(j),
897 lb_prd_dim(j),
898 lb_rep_dim(j),
899 lb_chn_dim(j),
900 lb_ud1_dim(j),
901 lb_ud2_dim(j),
902 lb_dcs_dim(j),
903 lb_base_stream_id(j));
904
905 END IF;
906 CLOSE c;
907
908 --TRUNCATE TABLE MSD_CS_DTLS_TEMP;
909
910 OPEN c1;
911 FETCH c1 BULK COLLECT INTO
912 lb_cs_definition_id,
913 lb_dimension_code,
914 lb_level_id;
915
916 IF c1%ROWCOUNT > 0 THEN
917
918 FORALL j IN lb_cs_definition_id.FIRST..lb_cs_definition_id.LAST
919 INSERT INTO MSD_CS_DTLS_TEMP
920 ( CS_DEFINITION_ID,
921 DIMENSION_CODE,
922 COLLECT_LEVEL_ID )
923 VALUES
924 ( lb_cs_definition_id(j),
925 lb_dimension_code(j),
926 lb_level_id(j) );
927
928 END IF;
929 CLOSE c1;
930
931 LOAD_SHIPMENT_STREAM;
932
933 LOAD_BOOKING_STREAM;
934
935 LOAD_MFG_FORECAST;
936
937 OPEN c2;
938 LOOP
939 FETCH c2 INTO lv_cs_definition_id,lv_dimension_code;
940 EXIT WHEN c2%NOTFOUND;
941 GET_LEVEL_ID (lv_cs_definition_id,lv_dimension_code);
942 END LOOP;
943 CLOSE c2;
944
945 COMMIT;
946
947 ---- Both Temporary tables are populated by here -------------
948
949 --Made c3 Cursor dynamic for Bug 3476620.
950 lv_cur_stmt := ' SELECT cs_definition_id stream_id, '
951 ||' MSD_COMPOSITE_GROUPING.GET_STREAM_COUNT(cs_definition_id) stream_count, '
952 ||' MSD_COMPOSITE_GROUPING.GET_STREAM_COUNT(cs_definition_id) distinct_stream_count, '
953 ||' cs_definition_id base_stream_id, '
954 ||' dim1||decode(dim2,NULL,'''','',''||dim2)||decode(dim3,NULL,'''','',''||dim3)||decode(dim4,NULL,'''','',''||dim4)||decode(dim5,NULL,'''','',''||dim5)||decode(dim6,NULL,'''','',''||dim6)|| '
955 ||' decode(dim7,NULL,'''','',''||dim7)||decode(dim8,NULL,'''','',''||dim8) reading_level_string, '
956 ||' MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim1)||decode(dim2,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim2))||decode(dim3,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim3))|| '
957 ||' decode(dim4,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim4))|| '
958 ||' decode(dim5,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim5))||decode(dim6,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim6))||decode(dim7,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim7))|| '
959 ||' decode(dim8,NULL,'''','',''||MSD_COMPOSITE_GROUPING.GET_DIM_CODE(dim8)) dimension_clause '
960 ||' FROM '
961 ||' (select cs_definition_id,collect_level_id as dim1, '
962 ||' LEAD(collect_level_id,1) over (partition by cs_definition_id order by collect_level_id) as dim2, '
963 ||' LEAD(collect_level_id,2) over (partition by cs_definition_id order by collect_level_id) as dim3, '
964 ||' LEAD(collect_level_id,3) over (partition by cs_definition_id order by collect_level_id) as dim4, '
965 ||' LEAD(collect_level_id,4) over (partition by cs_definition_id order by collect_level_id) as dim5, '
966 ||' LEAD(collect_level_id,5) over (partition by cs_definition_id order by collect_level_id) as dim6, '
967 ||' LEAD(collect_level_id,6) over (partition by cs_definition_id order by collect_level_id) as dim7, '
968 ||' LEAD(collect_level_id,7) over (partition by cs_definition_id order by collect_level_id) as dim8, '
969 ||' row_number() over (partition by cs_definition_id order by collect_level_id) as rno '
970 ||' from MSD_CS_DTLS_TEMP ) '
971 ||' WHERE rno=1 '
972 ||' ORDER BY dim1,dim2,dim3,dim4,dim5,dim6,dim7,dim8 ';
973
974 /* Populating the pl/sql table for all the possible streams to be grouped */
975
976 OPEN c3 FOR lv_cur_stmt; --Made c3 Cursor dynamic for Bug 3476620.
977 v_index :=1;
978
979 LOOP
980
981 LOG_DEBUG (' Value of v_index '||v_index);
982 FETCH c3 INTO stream_tbl1(v_index).p_stream_id,
983 stream_tbl1(v_index).l_stream_count,
984 stream_tbl1(v_index).l_distinct_distributions,
985 stream_tbl1(v_index).l_base_stream_id,
986 stream_tbl1(v_index).l_reading_level_string,
987 stream_tbl1(v_index).l_dimension_clause;
988
989 EXIT WHEN c3%NOTFOUND;
990 v_index := v_index + 1;
991
992 END LOOP;
993
994 CLOSE c3;
995
996
997
998
999 /* Forming the set of streams that can be grouped */
1000 lv_groupable :=1;
1001 stream_tbl1(1).l_groupable := lv_groupable;
1002
1003 FOR i IN 2..stream_tbl1.COUNT
1004 LOOP
1005 LOG_DEBUG (' Value of lv_groupable '||lv_groupable);
1006 IF stream_tbl1(i).l_reading_level_string = stream_tbl1(i-1).l_reading_level_string THEN
1010 stream_tbl1(i).l_groupable := lv_groupable;
1007 stream_tbl1(i).l_groupable := lv_groupable;
1008 ELSE
1009 lv_groupable := lv_groupable + 1;
1011 END IF;
1012
1013 END LOOP;
1014
1015 /* For Logging purpose */
1016 FOR j in 1..stream_tbl1.COUNT
1017 LOOP
1018 LOG_MESSAGE ( 'Element '||j||': '||stream_tbl1(j).p_stream_id||', '||stream_tbl1(j).l_reading_level_string||', '||stream_tbl1(j).l_groupable );
1019 END LOOP;
1020
1021
1022
1023
1024 ---- Calling function MSD_ASSIGN_GROUPS for each set of groupable streams----------
1025
1026 v_group_number := 0;
1027 v_counter := 0;
1028
1029 FOR i IN 1..lv_groupable
1030 LOOP
1031
1032 get_boundaries(i,l_lower,l_upper,stream_tbl1);
1033
1034 LOG_DEBUG (' i ='||i);
1035 LOG_DEBUG('l_lower '||l_lower);
1036 LOG_DEBUG('l_upper '||l_upper);
1037
1038
1039 x_var := 1;
1040 FOR j IN l_lower..l_upper
1041 LOOP
1042 LOG_DEBUG ('x_var is'||x_var);
1043 stream_tbl2(x_var) :=stream_tbl1(j);
1044 x_var := x_var + 1;
1045 END LOOP;
1046
1047 MSD_ASSIGN_GROUPS ( stream_tbl2 );
1048
1049 stream_tbl2 := stream_tbl3;
1050
1051 END LOOP;
1052
1053
1054
1055
1056
1057 ---- Based on the application mode updating/displaying or displaying the Composite grouping
1058
1059 IF p_mode = SYS_YES THEN
1060
1061 LOG_MESSAGE('-------APPLICATION MODE is YES---------');
1062
1063 LOG_MESSAGE('*************FINAL OUTPUT - STARTS**************');
1064
1065 UPDATE MSD_CS_DEFINITIONS
1066 SET COMPOSITE_GROUP_CODE = to_number(NULL);
1067
1068
1069 FOR j in 1..v_final_tbl.COUNT
1070 LOOP
1071 LOG_MESSAGE ( 'Element '||j||': '||v_final_tbl(j).p_stream_id||', '||v_final_tbl(j).l_dimension_clause||', '||v_final_tbl(j).l_group);
1072
1073 UPDATE MSD_CS_DEFINITIONS
1074 SET COMPOSITE_GROUP_CODE = v_final_tbl(j).l_group
1075 WHERE CS_DEFINITION_ID = v_final_tbl(j).p_stream_id;
1076
1077 END LOOP;
1078
1079 LOG_MESSAGE('*************FINAL OUTPUT - ENDS**************');
1080
1081 COMMIT;
1082
1083 ELSE
1084
1085 LOG_MESSAGE('-----APPLICATION MODE is NO------');
1086
1087 LOG_MESSAGE('*************FINAL OUTPUT - STARTS**************');
1088
1089 /* For Logging purpose */
1090 FOR j in 1..v_final_tbl.COUNT
1091 LOOP
1092 LOG_MESSAGE ( 'Element '||j||': '||v_final_tbl(j).p_stream_id||', '||v_final_tbl(j).l_dimension_clause||', '||v_final_tbl(j).l_group);
1093 END LOOP;
1094
1095 LOG_MESSAGE('*************FINAL OUTPUT - ENDS**************');
1096
1097 END IF;
1098
1099 RETCODE := G_SUCCESS;
1100
1101 EXCEPTION
1102 WHEN OTHERS THEN
1103 LOG_DEBUG ('when others error -msd_group_streams');
1104 ROLLBACK;
1105 RETCODE := G_ERROR;
1106 LOG_DEBUG(SQLERRM);
1107
1108
1109 END MSD_GROUP_STREAMS;
1110
1111 END MSD_COMPOSITE_GROUPING;