[Home] [Help]
PACKAGE BODY: APPS.MSC_POST_PRO
Source
1 PACKAGE BODY MSC_POST_PRO
2 -- $Header: MSCPOSTB.pls 120.22 2011/10/13 09:19:37 vjuluri ship $
3 AS
4
5 MAXVALUE CONSTANT NUMBER := 999999;
6
7 PG_DEBUG VARCHAR2(1) := NVL(FND_PROFILE.value('MSC_ATP_DEBUG'), 'N');
8
9 -- for summary enhancement
10 G_ALLOC_ATP VARCHAR2(1);
11 G_CLASS_HRCHY NUMBER;
12 G_ALLOC_METHOD NUMBER;
13
14 -- Declaration of new private procedures for summary enhancement - Begin
15 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id IN NUMBER,
16 p_applsys_schema IN varchar2);
17 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id IN NUMBER,
18 p_share_partition IN varchar2,
19 p_optimized_plan IN NUMBER, -- 1:Yes, 2:No
20 p_full_refresh IN NUMBER, -- 1:Yes, 2:No
21 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
22 p_plan_type IN NUMBER, -- ATP4drp
23 p_last_refresh_number IN NUMBER,
24 p_new_refresh_number IN NUMBER,
25 p_sys_date IN DATE);
26 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id IN NUMBER,
27 p_sys_date IN DATE);
28 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id IN NUMBER,
29 p_sys_date IN DATE);
30 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id IN NUMBER,
31 p_sys_date IN DATE);
32 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id IN NUMBER,
33 p_sys_date IN DATE);
34 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id IN NUMBER,
35 p_sys_date IN DATE);
36 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id IN NUMBER,
37 p_last_refresh_number IN NUMBER,
38 p_new_refresh_number IN NUMBER,
39 p_sys_date IN DATE);
40 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id IN NUMBER,
41 p_last_refresh_number IN NUMBER,
42 p_new_refresh_number IN NUMBER,
43 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
44 p_sys_date IN DATE);
45 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id IN NUMBER,
46 p_sys_date IN DATE);
47 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id IN NUMBER,
48 p_last_refresh_number IN NUMBER,
49 p_new_refresh_number IN NUMBER,
50 p_sys_date IN DATE);
51 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id IN NUMBER,
52 p_plan_start_date IN DATE,
53 p_sys_date IN DATE);
54 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id IN NUMBER,
55 p_plan_start_date IN DATE,
56 p_sys_date IN DATE);
57 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id IN NUMBER,
58 p_plan_start_date IN DATE,
59 p_sys_date IN DATE);
60 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id IN NUMBER,
61 p_plan_start_date IN DATE,
62 p_sys_date IN DATE);
63 PROCEDURE LOAD_RES_DATA_NET(p_plan_id IN NUMBER,
64 p_last_refresh_number IN NUMBER,
65 p_new_refresh_number IN NUMBER,
66 p_sys_date IN DATE);
67 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id IN NUMBER,
68 p_share_partition IN varchar2);
69 -- Declaration of new private procedures for summary enhancement - End
70
71
72
73 PROCEDURE LOAD_SUPPLY_DEMAND ( ERRBUF OUT NoCopy VARCHAR2,
74 RETCODE OUT NoCopy NUMBER,
75 P_INSTANCE_ID IN NUMBER,
76 P_COLLECT_TYPE IN NUMBER)
77 AS
78
79 -- p_collect type is used to decide on what entity do we need to do full refresh on:
80 -- 1- Full refresh on Sales Orders -- ATP is not available
81 -- 2- Full refresh on supply/demands-- ATP is available
82 -- 3- Full refresh on both S/O and S/D -- ATP is not available
83
84 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
85 'ATP_SUMMARY_SO',
86 'ATP_SUMMARY_SD');
87 l_instance_id number;
88 i number;
89 l_org_ids MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
90 i integer;
91 l_sql_stmt varchar2(3000);
92 l_sql_stmt_1 varchar2(3000);
93 l_applsys_schema varchar2(10);
94 l_msc_schema VARCHAR2(30);
95 l_retval BOOLEAN;
96 dummy1 varchar2(10);
97 dummy2 varchar2(10);
98 l_count number;
99 l_sysdate_seq_num NUMBER;
100 l_default_atp_rule_id NUMBER;
101 l_calendar_code VARCHAR2(14);
102 l_calendar_exception_set_id NUMBER;
103 l_default_demand_class VARCHAR2(34);
104 l_organization_id number;
105 l_inv_ctp number;
106 l_partition_name varchar2(30);
107 l_table_name varchar2(30);
108 l_ret_code number;
109 l_err_msg varchar2(1000);
110 l_summary_flag number;
111 l_enable_summary_mode varchar2(1);
112 l_sys_date date;
113 l_user_id number;
114
115 l_org_code VARCHAR2(7);
116 l_sys_next_date date;
117 -- Bug 2516506
118 l_instance_code varchar2(3);
119 -- rajjain 12/20/2002
120 l_spid VARCHAR2(12);
121
122 BEGIN
123 -- Bug 3304390 Disable Trace
124 -- Deleted Related code.
125
126 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
127 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
128
129 l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
130 msc_util.msc_log(' l_enable_summary_mode := ' || l_enable_summary_mode);
131 IF l_enable_summary_mode <> 'Y' THEN
132 msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
133 RETCODE := G_WARNING;
134 RETURN;
135 END IF;
136
137 IF l_inv_ctp = 4 THEN
138 -- we are not doing ODS ATP so we wont continue
139 msc_util.msc_log('Not Doing ODS ATP. Please check profile - INV: Capable to Promise. Will Exit ');
140 RETCODE := G_WARNING;
141 RETURN;
142 ELSIF l_inv_ctp <> 5 THEN
143 l_inv_ctp := 5;
144 END IF;
145
146 -- Bug 2516506 - get instance_code as well
147 -- SELECT NVL(summary_flag, 1)
148 -- into l_summary_flag
149 SELECT NVL(summary_flag, 1), instance_code
150 into l_summary_flag, l_instance_code
151 FROM msc_apps_instances
152 where instance_id = p_instance_id;
153
154 msc_util.msc_log('l_summary_flag := ' || l_summary_flag);
155 -- 2301524: Summary is not supported for sites using backlog workbench
156 IF l_summary_flag = 200 THEN
157 msc_util.msc_log('Site is Using backlog workbench');
158 msc_util.msc_log('Summary Approach is not supported for sites using backlog workbench');
159 RETCODE := G_WARNING;
160 RETURN;
161 ELSIF l_summary_flag = 2 THEN
162 msc_util.msc_log('Full summary is in progress for the same instance by other session');
163 RETCODE := G_ERROR;
164 RETURN;
165 ELSIF ((P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 2)) and (NVL(l_summary_flag, 1) <> 3) THEN
166 msc_util.msc_log('Tables have not been succefully summarized. Net Change/ Targeted summarization'
167 || ' can not be run without sucessfully running complete summarization ');
168 RETCODE := G_ERROR;
169 RETURN;
170 END IF;
171
172 msc_util.msc_log('sr_instance_id := ' || P_INSTANCE_ID);
173 msc_util.msc_log('Collection _type := ' || P_COLLECT_TYPE);
174 RETCODE := G_SUCCESS;
175 msc_util.msc_log('Begin Post Processing');
176 l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
177 SELECT a.oracle_username
178 INTO l_msc_schema
179 FROM FND_ORACLE_USERID a,
180 FND_PRODUCT_INSTALLATIONS b
181 WHERE a.oracle_id = b.oracle_id
182 AND b.application_id = 724;
183
184 msc_util.msc_log('l_applsys_schema ;= ' || l_applsys_schema);
185 msc_util.msc_log('dummy1 := ' || dummy1);
186 msc_util.msc_log('dummy2 := ' || dummy2);
187 msc_util.msc_log('l_msc_schema := ' || l_msc_schema);
188
189 --check whether the partitions exist in tables or not. In not then error out
190
191 IF (P_COLLECT_TYPE = 3) THEN
192 --- for full collection, check if partition exist or not
193 -- if partition doesn't exist for partial chnage then we wont make this far
194 FOR i in 1..atp_summ_tab.count LOOP
195 l_table_name := 'MSC_' || atp_summ_tab(i);
196 l_partition_name := atp_summ_tab(i)|| '__' || p_instance_id;
197 BEGIN
198 SELECT count(*)
199 INTO l_count
200 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
201 --FROM DBA_TAB_PARTITIONS
202 FROM ALL_TAB_PARTITIONS
203 WHERE TABLE_NAME = l_table_name
204 AND PARTITION_NAME = l_partition_name
205 AND table_owner = l_msc_schema;
206 EXCEPTION
207 WHEN OTHERS THEN
208 msc_util.msc_log('Inside Exception');
209 l_count := 0;
210 END;
211 IF (l_count = 0) THEN
212 -- Bug 2516506
213 FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_INS_PARTITION_MISSING');
214 FND_MESSAGE.SET_TOKEN('INSTANCE_CODE', l_instance_code);
215 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
216 msc_util.msc_log(FND_MESSAGE.GET);
217 RETCODE := G_ERROR;
218 RETURN;
219 END IF;
220 END LOOP;
221 END IF;
222
223 --- update the tbl_status so that user can't do ATP in full refresh mode
224 IF (P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 3) THEN
225 BEGIN
226 UPDATE msc_apps_instances
227 set so_tbl_status = 2,
228 summary_flag = 2
229 where instance_id = p_instance_id;
230
231 -- commit the change
232 commit;
233 END;
234 END IF;
235
236 l_sys_date := sysdate;
237 l_user_id := FND_GLOBAL.USER_ID;
238 msc_util.msc_log('l_sys_date := ' || l_sys_date);
239 msc_util.msc_log('l_user_id := ' || l_user_id);
240
241 /* rajjain 02/17/2003 GOP Performance Improvement - ODS Summary changes begin
242 * Now we do summarization for all the organizations in one go*/
243 IF (p_collect_type = 1) OR (p_collect_type = 3) THEN
244 msc_util.msc_log('Sales Order, should be full collection');
245
246 INSERT INTO MSC_TEMP_SUMM_SO (
247 organization_id,
248 inventory_item_id,
249 demand_class,
250 sd_date,
251 sd_qty,
252 plan_id,
253 sr_instance_id,
254 last_update_date,
255 last_updated_by,
256 creation_date,
257 created_by)
258 (SELECT so.organization_id,
259 so.inventory_item_id,
260 so.demand_class,
261 so.SD_DATE,
262 sum(so.sd_qty),
263 -1,
264 p_instance_id,
265 l_sys_date,
266 l_user_id,
267 l_sys_date,
268 l_user_id
269 FROM
270 (SELECT
271 I.organization_id,
272 I.inventory_item_id,
273 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1, NVL(D.DEMAND_CLASS,
274 NVL(TP.default_demand_class,'@@@')), '@@@') demand_class,
275 DECODE(D.RESERVATION_TYPE,2,C2.next_date, trunc(D.REQUIREMENT_DATE)) SD_DATE,
276 (D.PRIMARY_UOM_QUANTITY-
277 GREATEST(NVL(D.RESERVATION_QUANTITY,0),
278 D.COMPLETED_QUANTITY)) sd_qty
279 FROM
280 MSC_SYSTEM_ITEMS I,
281 MSC_ATP_RULES R,
282 MSC_SALES_ORDERS D,
283 MSC_CALENDAR_DATES C,
284 MSC_CALENDAR_DATES C2,
285 MSC_TRADING_PARTNERS TP
286 WHERE I.ATP_FLAG = 'Y'
287 AND I.ORGANIZATION_ID = TP.SR_TP_ID
288 AND I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
289 AND I.PLAN_ID = -1
290 AND I.BOM_ITEM_TYPE <> 5
291 AND R.RULE_ID = NVL(I.ATP_RULE_ID, TP.default_atp_rule_id)
292 AND R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
293 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
294 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
295 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
296 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
297 AND D.DEMAND_SOURCE_TYPE <>
298 DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
299 AND D.PRIMARY_UOM_QUANTITY >
300 GREATEST(NVL(D.RESERVATION_QUANTITY,0),
301 D.COMPLETED_QUANTITY)
302 AND (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
303 (SELECT S.SUB_INVENTORY_CODE
304 FROM MSC_SUB_INVENTORIES S
305 WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
306 AND S.PLAN_ID = I.PLAN_ID
307 AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
308 AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
309 1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
310 AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
311 2, 1, S.NETTING_TYPE)))
312 AND (D.RESERVATION_TYPE = 2
313 OR D.PARENT_DEMAND_ID IS NULL
314 OR (D.RESERVATION_TYPE = 3 AND
315 ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
316 (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
317 AND C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
318 NULL, C.PRIOR_SEQ_NUM,
319 C2.next_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
320 AND C.CALENDAR_CODE = TP.CALENDAR_CODE
321 AND C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
322 AND C.EXCEPTION_SET_ID = -1
323 AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
324 AND C2.CALENDAR_CODE = TP.calendar_code
325 AND C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
326 AND C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
327 AND C2.CALENDAR_DATE = TRUNC(l_sys_date)
328 AND TP.SR_INSTANCE_ID = p_instance_id
329 AND TP.PARTNER_TYPE = 3
330 ) SO
331 GROUP BY so.inventory_item_id, so.organization_id, so.demand_class,
332 so.sd_date, -1, p_instance_id, l_sys_date, l_user_id);
333
334 END IF;
335 msc_util.msc_log('Load SD details in msc_atp_summary_sd table');
336
337 IF (P_COLLECT_TYPE= 2 ) OR (P_COLLECT_TYPE= 3 ) THEN
338 msc_util.msc_log('Load SD Details, ODS Case');
339
340 INSERT INTO MSC_TEMP_SUMM_SD (
341 organization_id,
342 inventory_item_id,
343 demand_class,
344 sd_date,
345 sd_qty,
346 plan_id,
347 sr_instance_id,
348 last_update_date,
349 last_updated_by,
350 creation_date,
351 created_by)
352 (SELECT sd.organization_id,
353 sd.inventory_item_id,
354 sd.demand_class,
355 sd.SD_DATE,
356 sum(sd.sd_qty),
357 -1,
358 p_instance_id,
359 l_sys_date,
360 l_user_id,
361 l_sys_date,
362 l_user_id
363 FROM
364 (SELECT I.organization_id,
365 DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
366 I.INVENTORY_ITEM_ID) inventory_item_id,
367 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 , NVL(D.DEMAND_CLASS,
368 NVL(TP.default_demand_class,'@@@')), '@@@') demand_class,
369 C.PRIOR_DATE SD_DATE, -- 2859130
370 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY
371 FROM
372 MSC_SYSTEM_ITEMS I,
373 MSC_SYSTEM_ITEMS I2,
374 MSC_ATP_RULES R,
375 MSC_DEMANDS D,
376 MSC_CALENDAR_DATES C,
377 MSC_CALENDAR_DATES C2,
378 MSC_TRADING_PARTNERS TP
379 WHERE I.ATP_FLAG = 'Y'
380 AND I.ORGANIZATION_ID = TP.SR_TP_ID
381 AND I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
382 AND I.PLAN_ID = -1
383 AND I.BOM_ITEM_TYPE <> 5
384 AND I.PLAN_ID = I2.PLAN_ID
385 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
386 AND I2.ORGANIZATION_ID = I.ORGANIZATION_ID
387 AND I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID,
388 I.INVENTORY_ITEM_ID)
389 AND R.RULE_ID = NVL(I.ATP_RULE_ID ,TP.default_atp_rule_id)
390 AND R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
391 AND D.PLAN_ID = I.PLAN_ID
392 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
393 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
394 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
395 AND USING_REQUIREMENT_QUANTITY <> 0
396 AND D.ORIGINATION_TYPE in (
397 DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
398 DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
399 DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
400 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
401 DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
402 AND C.CALENDAR_CODE = TP.calendar_code
403 AND C.EXCEPTION_SET_ID = -1
404 AND C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
405 AND C.CALENDAR_DATE BETWEEN TRUNC(D.USING_ASSEMBLY_DEMAND_DATE)
406 AND TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
407 D.USING_ASSEMBLY_DEMAND_DATE))
408 AND C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
409 NULL, C.PRIOR_SEQ_NUM,
410 C2.next_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
411 AND C2.CALENDAR_CODE = TP.calendar_code
412 AND C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
413 AND C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
414 AND C2.CALENDAR_DATE = TRUNC(l_sys_date)
415 AND TP.SR_INSTANCE_ID = p_instance_id
416 AND TP.PARTNER_TYPE = 3
417 UNION ALL
418 SELECT
419 I.organization_id,
420 I.inventory_item_id,
421 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
422 NVL(DECODE(S.ORDER_TYPE, 5,
423 MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
424 S.DEMAND_CLASS), NVL(TP.default_demand_class, '@@@')), '@@@')
425 demand_class,
426 C.NEXT_DATE SD_DATE, -- 2859130 remove trunc
427 Decode(order_type, -- 2859130 remove trunc
428 30, Decode(Sign(S.Daily_rate * (C.Calendar_date -
429 TRUNC(S.FIRST_UNIT_START_DATE))- S.qty_completed),
430 -1,S.Daily_rate*(C.Calendar_date - TRUNC(S.First_Unit_Start_date)+1)
431 - S.qty_completed, S.Daily_rate),
432 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) ) SD_QTY
433 FROM
434 MSC_SYSTEM_ITEMS I,
435 MSC_SYSTEM_ITEMS I2,
436 MSC_ATP_RULES R,
437 MSC_SUPPLIES S,
438 MSC_SUB_INVENTORIES MSI,
439 MSC_CALENDAR_DATES C,
440 MSC_CALENDAR_DATES C2,
441 MSC_TRADING_PARTNERS TP
442 WHERE I.ATP_FLAG = 'Y'
443 AND I.ORGANIZATION_ID = TP.SR_TP_ID
444 AND I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
445 AND I.PLAN_ID = -1
446 AND I.PLAN_ID = I2.PLAN_ID
447 AND I.ORGANIZATION_ID = I2.ORGANIZATION_ID
448 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
449 AND NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) =
450 I2.INVENTORY_ITEM_ID
451 AND DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
452 AND R.RULE_ID = NVL(I.ATP_RULE_ID, TP.default_atp_rule_id)
453 AND R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
454 AND S.PLAN_ID = I.PLAN_ID
455 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
456 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
457 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
458 -- 2859130 remove trunc
459 AND Decode(S.order_type, 30, S.Daily_rate*
460 (C.Calendar_date - TRUNC(S.First_Unit_Start_date) + 1) ,
461 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)) >
462 Decode(S.order_type, 30, S.qty_completed,0)
463 AND (S.ORDER_TYPE IN (
464 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
465 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
466 DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
467 DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
468 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
469 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1),
470 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
471 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
472 DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
473 DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
474 DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
475 DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1),
476 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
477 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
478 OR
479 ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
480 S.ORDER_TYPE = 5
481 AND exists (SELECT '1'
482 FROM MSC_DESIGNATORS
483 WHERE INVENTORY_ATP_FLAG = 1
484 AND DESIGNATOR_TYPE = 2
485 AND DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
486 AND C.CALENDAR_CODE = TP.calendar_code
487 AND C.EXCEPTION_SET_ID = TP.calendar_exception_set_id
488 AND C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
489 AND C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,
490 S.NEW_SCHEDULE_DATE))
491 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE,
492 NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
493 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
494 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
495 AND C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
496 DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
497 NULL, C.NEXT_SEQ_NUM,
498 C2.next_seq_num - NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
499 AND C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(SYSDATE),
500 28, TRUNC(SYSDATE),
501 C.NEXT_DATE) -- to_date removed to avoid GSCC error
502 AND MSI.plan_id (+) = -1
503 AND MSI.organization_id (+) = S.ORGANIZATION_ID
504 AND MSI.sr_instance_id (+) = S.sr_instance_id
505 AND MSI.sub_inventory_code (+) = S.subinventory_code
506 AND NVL(MSI.inventory_atp_code,1) <> 2
507 AND C2.CALENDAR_CODE = TP.calendar_code
508 AND C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
509 AND C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
510 AND C2.CALENDAR_DATE = TRUNC(l_sys_date)
511 AND TP.SR_INSTANCE_ID = p_instance_id
512 AND TP.PARTNER_TYPE = 3
513 ) SD
514 GROUP BY sd.inventory_item_id, sd.organization_id, sd.demand_class,
515 sd.sd_date, -1, p_instance_id, l_sys_date, l_user_id);
516
517 END IF;
518 -- rajjain 02/17/2003 GOP Performance Improvement - ODS Summary changes end
519
520 ---exchange partition
521 IF (P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 3) THEN
522 msc_util.msc_log('Swap partition for Slaes Orders. Only for full collection');
523 ---- Create index on MSC_ATP_SUMMARY_SO
524 BEGIN
525 msc_util.msc_log('Create index on MSC_TEMP_SUMM_SO');
526 l_sql_stmt_1 := 'create UNIQUE index MSC_TEMP_SUMM_SO_N1 on MSC_TEMP_SUMM_SO ' ||
527 '
528 -- NOLOGGING
529 (sr_instance_id, organization_id, inventory_item_id, sd_date, demand_class)
530 storage(INITIAL 40K NEXT 2M PCTINCREASE 0)'; --tablespace ' || l_tbspace(i);
531 msc_util.msc_log('Before create index on MSC_atp_summary_so: ');
532 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
533 APPLICATION_SHORT_NAME => 'MSC',
534 STATEMENT_TYPE => ad_ddl.create_index,
535 STATEMENT => l_sql_stmt_1,
536 OBJECT_NAME => 'MSC_TEMP_SUMM_SO');
537 END;
538 --analyze temp table
539 fnd_stats.gather_table_stats(l_msc_schema, 'MSC_TEMP_SUMM_SO', granularity => 'ALL');
540
541 l_partition_name := 'ATP_SUMMARY_SO__' || to_char(p_instance_id);
542 msc_util.msc_log('Sales order partition name := ' || l_partition_name);
543 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SO exchange partition ' || l_partition_name ||
544 ' with table MSC_TEMP_SUMM_SO'||
545 ' including indexes without validation';
546
547 BEGIN
548 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SO: ');
549 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
550 APPLICATION_SHORT_NAME => 'MSC',
551 STATEMENT_TYPE => ad_ddl.alter_table,
552 STATEMENT => l_sql_stmt,
553 OBJECT_NAME => 'MSC_ATP_SUMMARY_SO');
554 END;
555 END IF;
556
557 IF (P_COLLECT_TYPE = 2) OR (P_COLLECT_TYPE = 3) THEN
558 ----swap partiton for supplies and demand part
559 msc_util.msc_log('swap partition for supply-demand');
560 BEGIN
561 l_sql_stmt_1 := 'create unique index MSC_TEMP_SUMM_SD_N1 on MSC_TEMP_SUMM_SD ' ||
562 '
563 -- NOLOGGING
564 (plan_id, sr_instance_id, organization_id,inventory_item_id,sd_date, demand_class)
565 storage(INITIAL 40K NEXT 2M PCTINCREASE 0)'; --tablespace ' || l_tbspace(i);
566 msc_util.msc_log('Before create index on MSC_atp_summary_sd: ');
567 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
568 APPLICATION_SHORT_NAME => 'MSC',
569 STATEMENT_TYPE => ad_ddl.create_index,
570 STATEMENT => l_sql_stmt_1,
571 OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
572 END;
573 ---analyze supply demand table
574 fnd_stats.gather_table_stats(l_msc_schema, 'MSC_TEMP_SUMM_SD', granularity => 'ALL');
575
576 l_partition_name := 'ATP_SUMMARY_SD__' || to_char(p_instance_id) ;
577
578 msc_util.msc_log('Partition name for msc_atp_summary table sd part := ' || l_partition_name);
579
580 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD exchange partition ' || l_partition_name ||
581 ' with table MSC_TEMP_SUMM_SD'||
582 ' including indexes without validation';
583
584 BEGIN
585 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_sd: ');
586 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
587 APPLICATION_SHORT_NAME => 'MSC',
588 STATEMENT_TYPE => ad_ddl.alter_table,
589 STATEMENT => l_sql_stmt,
590 OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
591 END;
592 END IF;
593
594 ---- clean tables
595 MSC_POST_PRO.CLEAN_TABLES(l_applsys_schema);
596
597 --update the so_tbl_status to 1 so that user can do ATP
598 BEGIN
599 UPDATE msc_apps_instances
600 set so_tbl_status = 1,
601 summary_flag = 3
602 where instance_id = p_instance_id;
603 --- commit the change
604 commit;
605 END;
606
607 ERRBUF := null;
608 RETCODE := G_SUCCESS;
609 commit;
610
611 EXCEPTION
612 WHEN OTHERS THEN
613 msc_util.msc_log('Inside main exception');
614 msc_util.msc_log(sqlerrm);
615 ERRBUF := sqlerrm;
616 RETCODE := G_ERROR;
617 --- clean tables
618 MSC_POST_PRO.CLEAN_TABLES(l_applsys_schema);
619 ----update so_tbl_status
620 BEGIN
621 UPDATE msc_apps_instances
622 set so_tbl_status = 1,
623 summary_flag = 1
624 where instance_id = p_instance_id;
625 END;
626 commit;
627
628
629 END LOAD_SUPPLY_DEMAND;
630
631 -- 24x7
632 -- Function logic modified.
633 PROCEDURE LOAD_PLAN_SD ( ERRBUF OUT NoCopy VARCHAR2,
634 RETCODE OUT NoCopy NUMBER,
635 p_plan_id IN NUMBER,
636 p_calling_module IN NUMBER := 1) /* Bug 3478888 Added input parameter
637 to identify how ATP Post Plan Processing
638 has been launched */
639 IS
640
641 share_partition VARCHAR2(1);
642 l_applsys_schema varchar2(10);
643 l_msc_schema VARCHAR2(30);
644 l_retval BOOLEAN;
645 dummy1 varchar2(10);
646 dummy2 varchar2(10);
647 l_partition_name varchar2(30);
648 l_table_name varchar2(30);
649 l_ret_code number;
650 l_err_msg varchar2(1000);
651 l_inv_ctp number;
652 l_summary_flag number;
653 l_plan_id number;
654 i number;
655 l_count number;
656 l_sysdate date;
657 l_user_id number;
658 l_alloc_atp VARCHAR2(1);
659 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
660 'ATP_SUMMARY_SD',
661 'ATP_SUMMARY_RES',
662 'ATP_SUMMARY_SUP');
663 -- Bug 2516506
664 l_plan_name varchar2(10);
665
666 -- 24x7
667 l_old_plan number;
668 l_plan_to_use number;
669 l_24_plan number;
670
671 l_new_plan_id number;
672 l_new_cp_plan_id number;
673 l_old_plan_id number;
674 l_old_cp_plan_id number;
675 -- rajjain 12/20/2002
676 l_spid VARCHAR2(12);
677
678 -- 2859130
679 l_optimized_plan number;
680 l_old_optimized_plan number;
681
682 -- time_phased_atp
683 l_member_count number;
684 l_return_status varchar2(1);
685 l_alloc_type number;
686 l_demand_priority varchar2(1);
687 l_time_phased_pf number;
688
689 -- summary enhancement
690 l_plan_start_date date;
691 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
692 l_plan_type NUMBER := 0;
693 l_organization_id MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
694 l_sr_instance_id MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
695 j pls_integer;
696 l_is_cmro number := 0; --bug 7209209
697 BEGIN
698 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Calling Module: ' || p_calling_module);
699
700 -- Bug 3304390 Disable Trace
701 -- Commented out
702 -- rajjain 12/20/2002 begin
703 -- IF G_TRACE = 'N' AND PG_DEBUG in ('T', 'C') THEN
704 -- SELECT spid
705 -- INTO l_spid
706 -- FROM v$process
707 -- WHERE addr = (SELECT paddr FROM v$session
708 -- WHERE audsid=userenv('SESSIONID'));
709 -- msc_util.msc_log('LOAD_PLAN_SD: ' || 'spid: ' || l_spid);
710 -- dbms_session.set_sql_trace(true);
711 -- G_TRACE := 'Y';
712 -- END IF;
713 -- rajjain 12/20/2002 end
714 -- End Bug 3304390 Disable Trace
715
716 -- For summary enhancement - initiallizing retcode with success
717 RETCODE := G_SUCCESS;
718
719 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
720 msc_util.msc_log('LOAD_PLAN_SD: ' || 'inv_ctp := ' || l_inv_ctp);
721 IF l_inv_ctp <> 4 THEN
722 -- we are not doing PDS ATP so we wont continue
723 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Not Doing PDS ATP. Please check profile - INV: Capable to Promise". Will Exit ');
724 RETCODE := G_WARNING;
725 RETURN;
726 ELSE
727
728 -- 24x7 Switch
729 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Trying to see if this is a 24x7 run');
730 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Plan ID : ' || p_plan_id);
731 BEGIN
732
733 -- 2859130
734 select newp.plan_id, NVL(newp.copy_plan_id, -1),
735 DECODE(newp.plan_type, 4, 2,
736 DECODE(daily_material_constraints, 1, 1,
737 DECODE(daily_resource_constraints, 1, 1,
738 DECODE(weekly_material_constraints, 1, 1,
739 DECODE(weekly_resource_constraints, 1, 1,
740 DECODE(period_material_constraints, 1, 1,
741 DECODE(period_resource_constraints, 1, 1, 2)
742 )
743 )
744 )
745 )
746 )
747 ),
748 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
749 newp.plan_type
750 into l_new_plan_id, l_new_cp_plan_id, l_optimized_plan, l_plan_type
751 from msc_plans newp
752 where newp.plan_id = p_plan_id;
753
754 EXCEPTION
755 WHEN NO_DATA_FOUND THEN
756 msc_util.msc_log('Unable to find plan data');
757 RETCODE := G_ERROR;
758 ERRBUF := sqlerrm;
759 RETURN;
760 END;
761
762 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Plan Type : ' || l_plan_type);
763 IF l_plan_type = 4 THEN
764 IF PG_DEBUG in ('Y', 'C') THEN
765 msc_util.msc_log('LOAD_PLAN_SD: Do not Launch process for IO Plan');
766 END IF;
767 RETCODE := G_SUCCESS;
768 RETURN;
769 END IF;
770
771 -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD from atp_snapshot_hook
772
773 select organization_id, sr_instance_id
774 BULK COLLECT INTO l_organization_id, l_sr_instance_id
775 from msc_plan_organizations
776 WHERE plan_id=p_plan_id;
777
778 --FORALL j IN l_organization_id.first.. l_organization_id.last
779 FOR j IN l_organization_id.first.. l_organization_id.last LOOP
780 UPDATE msc_system_items mst1
781 SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS
782 FROM msc_system_items mst2
783 WHERE mst2.sr_instance_id=mst1.sr_instance_id
784 AND mst2.organization_id=mst1.organization_id
785 AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
786 AND mst2.plan_id=-1
787 )
788 WHERE plan_id=p_plan_id
789 AND mst1.ORGANIZATION_ID = l_organization_id(j)
790 AND mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
791 --populate replenish to order flag for option items as well.
792 AND mst1.bom_item_type in (1,2,4,5)
793 --bug 3713374: Missing brackets was making OR condition to be stand alone filtering criteria
794 AND (mst1.atp_flag <> 'N' OR mst1.atp_components_flag <> 'N');
795
796 --5027568
797 msc_util.msc_log('LOAD_PLAN_SD: deleting reservation records from msc_demands'); --5027568
798
799 Delete MSC_DEMANDS
800 where origination_type = -100
801 and plan_id = p_plan_id
802 and ORGANIZATION_ID = l_organization_id(j)
803 and sr_instance_id = l_sr_instance_id(j);
804
805 msc_util.msc_log('LOAD_PLAN_SD: no of records deleted: '|| SQL%ROWCOUNT);
806 --5027568, to insert a record for hard reservation in msc_demands.
807
808 msc_util.msc_log('LOAD_PLAN_SD: populating msc_demands with reservation records');
809
810 INSERT INTO MSC_DEMANDS(
811 DEMAND_ID,
812 USING_REQUIREMENT_QUANTITY,
813 RESERVED_QUANTITY,
814 USING_ASSEMBLY_DEMAND_DATE,
815 DEMAND_TYPE,
816 DEMAND_SOURCE_TYPE,
817 ORIGINATION_TYPE,
818 USING_ASSEMBLY_ITEM_ID,
819 PLAN_ID,
820 ORGANIZATION_ID,
821 INVENTORY_ITEM_ID,
822 SALES_ORDER_LINE_ID,
823 SR_INSTANCE_ID,
824 LAST_UPDATE_DATE,
825 LAST_UPDATED_BY,
826 CREATION_DATE,
827 CREATED_BY,
828 DEMAND_CLASS,
829 REFRESH_NUMBER,
830 ORDER_NUMBER,
831 APPLIED,
832 STATUS,
833 CUSTOMER_ID,
834 SHIP_TO_SITE_ID,
835 RECORD_SOURCE,
836 ATP_SYNCHRONIZATION_FLAG,
837 DMD_SATISFIED_DATE,
838 DISPOSITION_ID,
839 LINK_TO_LINE_ID,
840 wip_supply_type,
841 ORIGINAL_ITEM_ID )
842 (select
843 msc_demands_s.nextval,
844 RESERVED_QUANTITY,
845 0, --putting 0 in reserved qty
846 sysdate, --USING_ASSEMBLY_DEMAND_DATE,
847 DEMAND_TYPE,
848 DEMAND_SOURCE_TYPE,
849 -100, -- putting orgination_type as -100 so that planning UI will not pick it up.
850 USING_ASSEMBLY_ITEM_ID,
851 PLAN_ID,
852 ORGANIZATION_ID,
853 INVENTORY_ITEM_ID,
854 SALES_ORDER_LINE_ID,
855 SR_INSTANCE_ID,
856 LAST_UPDATE_DATE,
857 LAST_UPDATED_BY,
858 CREATION_DATE,
859 CREATED_BY,
860 DEMAND_CLASS,
861 REFRESH_NUMBER,
862 ORDER_NUMBER,
863 APPLIED,
864 STATUS,
865 CUSTOMER_ID,
866 SHIP_TO_SITE_ID,
867 RECORD_SOURCE,
868 ATP_SYNCHRONIZATION_FLAG,
869 DMD_SATISFIED_DATE,
870 DISPOSITION_ID,
871 LINK_TO_LINE_ID,
872 wip_supply_type,
873 ORIGINAL_ITEM_ID
874 from msc_demands
875 where plan_id = p_plan_id
876 and reserved_quantity <> 0
877 and organization_id = l_organization_id(j)
878 and sr_instance_id = l_sr_instance_id(j)
879 and origination_type in (30,6)
880 );
881
882 msc_util.msc_log('LOAD_PLAN_SD: no of records updated: '|| SQL%ROWCOUNT);
883 END LOOP;
884 --5027568
885
886 l_plan_to_use := -1;
887 l_24_plan := 0;
888
889 if l_new_cp_plan_id > 0 then
890 -- the plan that is passed in is the new copy.
891 -- this is what we need to process.
892 -- this will happen when we are called from planning
893 l_plan_to_use := p_plan_id ;
894 l_old_plan := l_new_cp_plan_id;
895 l_24_plan := 1;
896 else
897 -- the plan id we got does not look like a copy.
898 -- check to see if there is a plan with a copy plan_id
899 -- equal to this
900 BEGIN
901
902 -- 2859130
903 select plan_id,
904 DECODE(plan_type, 4, 2,
905 DECODE(daily_material_constraints, 1, 1,
906 DECODE(daily_resource_constraints, 1, 1,
907 DECODE(weekly_material_constraints, 1, 1,
908 DECODE(weekly_resource_constraints, 1, 1,
909 DECODE(period_material_constraints, 1, 1,
910 DECODE(period_resource_constraints, 1, 1, 2)
911 )
912 )
913 )
914 )
915 )
916 )
917 into l_old_plan_id, l_old_optimized_plan
918 from msc_plans
919 where copy_plan_id = p_plan_id;
920 EXCEPTION
921 when NO_DATA_FOUND then
922 l_plan_to_use := p_plan_id;
923 END;
924
925 if (NVL(l_old_plan_id, -1) > 0) then
926 -- there is a copy plan for this plan
927 -- we need to use this.
928 -- this is the case when post_pro is launched
929 -- as a separate concurrent proram
930 l_plan_to_use := l_old_plan_id;
931 l_old_plan := p_plan_id;
932 l_24_plan := 1;
933 l_optimized_plan := l_old_optimized_plan; -- 2859130
934 msc_util.msc_log ('---- A Copy plan found ----');
935 msc_util.msc_log (' A copy of the plan for a 24x7 plan run was found');
936 msc_util.msc_log (' Switching to that plan ID for future processing');
937 msc_util.msc_log (' The plan ID that will be used : ' || l_plan_to_use);
938
939 else
940 l_plan_to_use := p_plan_id;
941 end if;
942 end if;
943 msc_util.msc_log ('After processing the plan ID');
944 msc_util.msc_log ('The following plan ID will be used for further post processing');
945 msc_util.msc_log ('Using plan : ' || l_plan_to_use);
946
947 --bug 7209209 start
948 /* Find out if this is CMRO scenario */
949 FOR j IN l_organization_id.first.. l_organization_id.last LOOP
950 select count(*)
951 into l_is_cmro
952 from msc_sales_orders so
953 where demand_source_type = 100
954 and organization_id=l_organization_id(j)
955 and sr_instance_id = l_sr_instance_id(j);
956
957 if(l_is_cmro > 0) then
958 exit;
959 end if;
960 END LOOP;
961
962 if(l_is_cmro > 0) then
963 msc_util.msc_log ('This is a CMRO scenario...');
964 FORALL j IN l_organization_id.first.. l_organization_id.last
965 update msc_demands dem
966 set demand_source_type = (select distinct demand_source_type
967 from msc_sales_orders so
968 where so.sales_order_number = dem.order_number
969 and so.organization_id = dem.organization_id
970 and so.sr_instance_id = dem.sr_instance_id
971 and so.inventory_item_id = dem.inventory_item_id
972 )
973 where organization_id = l_organization_id(j)
974 and sr_instance_id = l_sr_instance_id(j)
975 and origination_type in (6,30)
976 and plan_id = l_plan_to_use;
977 end if;
978 --bug 7209209 end
979
980 -- Begin ATP4drp In case we are dealing with a DRP plan reset variables.
981 IF l_plan_type = 5 THEN
982 G_ALLOC_ATP := 'N';
983 G_CLASS_HRCHY := 2;
984 G_ALLOC_METHOD := 2;
985 -- Do not Call Populate_ATF_Dates for PF ATP.
986 IF PG_DEBUG in ('Y', 'C') THEN
987 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
988 msc_util.msc_log('G_ALLOC_ATP := ' || G_ALLOC_ATP);
989 msc_util.msc_log('LOAD_PLAN_SD: DRP Plan Populate ATF_Dates not called');
990 msc_util.msc_log('LOAD_PLAN_SD: G_ALLOC_ATP ' || G_ALLOC_ATP);
991 msc_util.msc_log('LOAD_PLAN_SD: DRP Plan Allocation not supported');
992 msc_util.msc_log('LOAD_PLAN_SD: DRP Plan, Hence Post Plan Pegging not called');
993 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
994 END IF;
995 ELSE -- Carry out processing for non-DRP plan.
996 G_ALLOC_ATP := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
997 G_CLASS_HRCHY := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
998 G_ALLOC_METHOD := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
999
1000 msc_util.msc_log('G_ALLOC_ATP := ' || G_ALLOC_ATP);
1001 msc_util.msc_log('G_CLASS_HRCHY := ' || G_CLASS_HRCHY);
1002 msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1003 -- time_phased_atp changes begin
1004 /* Populate ATF dates*/
1005 MSC_ATP_PF.Populate_ATF_Dates(l_plan_to_use, l_member_count, l_return_status);
1006
1007 /* Print error in conc log file if return status is not success*/
1008 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1009 msc_util.msc_log('Return status after call to Populate_ATF_Dates is ' || l_return_status);
1010 msc_util.msc_log(' ');
1011 msc_util.msc_log('******************************************************************');
1012 msc_util.msc_log('* WARNING *');
1013 msc_util.msc_log('* Please note that the results of post plan processing may not *');
1014 msc_util.msc_log('* be accurate for product family/product family member items. *');
1015 msc_util.msc_log('* Please re-run ATP Post Plan Processing seperately to ensure *');
1016 msc_util.msc_log('* correct ATP results *');
1017 msc_util.msc_log('******************************************************************');
1018 msc_util.msc_log(' ');
1019 END IF;
1020
1021 /* Call pf_post_plan_proc procedure only if:
1022 o There are finite member items having ATF set up. This is to make sure
1023 that the customers not using time phased ATP are not affected.
1024 */
1025 IF l_member_count > 0 THEN
1026 msc_util.msc_log('Found finite member items having ATF.');
1027
1028 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1029 msc_util.msc_log('Calling pf_post_plan_proc for pre-allocation, supplies rollup and bucketing');
1030 l_demand_priority := 'Y';
1031 ELSE
1032 msc_util.msc_log('Calling pf_post_plan_proc for supplies rollup and bucketing');
1033 l_demand_priority := 'N';
1034 END IF;
1035 msc_atp_pf.pf_post_plan_proc(ERRBUF, RETCODE, l_plan_to_use, l_demand_priority);
1036 -- time_phased_atp changes end
1037
1038 -- Begin CTO ODR Simplified Pegging Generation
1039 msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1040
1041 MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1042
1043 msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1044 IF RETCODE = G_SUCCESS THEN
1045 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1046 ELSIF RETCODE = G_WARNING THEN
1047 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1048 ELSE
1049 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1050 -- RETURN;
1051 END IF;
1052 -- End CTO ODR Simplified Pegging Generation
1053
1054 -- for summary enhancement
1055 ELSIF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1056 -- we are doing Allocated ATP so we need to call post_plan_allocation
1057 msc_util.msc_log('Doing demand priority allocated ATP. Will call post_plan_allocation ');
1058
1059 msc_post_pro.post_plan_allocation(ERRBUF, RETCODE, l_plan_to_use);
1060
1061 IF RETCODE <> G_SUCCESS THEN
1062 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan allocation failed. Will exit');
1063 RETURN;
1064 END IF;
1065 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan allocation completed successfully');
1066
1067 -- Begin CTO ODR Simplified Pegging Generation
1068 msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1069
1070 MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1071
1072 msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1073 IF RETCODE = G_SUCCESS THEN
1074 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1075 ELSIF RETCODE = G_WARNING THEN
1076 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1077 ELSE
1078 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1079 -- RETURN;
1080 END IF;
1081 -- End CTO ODR Simplified Pegging Generation
1082
1083 -- for summary enhancement - synchronization call moved to end
1084 -- 24x7 Hooks
1085 /*
1086 if (l_24_plan > 0) then
1087 -- call 24x7 ATP Synchronize
1088 msc_util.msc_log ('Calling 24x7 Synchronization');
1089 MSC_ATP_24X7.Call_Synchronize (ERRBUF, RETCODE, l_old_plan);
1090 end if;
1091 RETURN;
1092 */
1093 ELSE -- Always carry out post_plan_pegging.
1094
1095 -- Begin CTO ODR Simplified Pegging Generation
1096 msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1097
1098 MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1099
1100 msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1101 IF RETCODE = G_SUCCESS THEN
1102 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1103 ELSIF RETCODE = G_WARNING THEN
1104 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1105 ELSE
1106 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1107 --RETURN;
1108 END IF;
1109 END IF;
1110 END IF;
1111 -- ATP4drp End
1112
1113 END IF;
1114
1115 IF ((NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N') = 'Y')
1116 AND (G_ALLOC_ATP = 'N' -- After summary ehancement summary will be
1117 OR (G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1) -- supported fot demand priority based
1118 ) -- allocated ATP
1119 ) THEN
1120 msc_util.msc_log('begin Loading data for plan ' || l_plan_to_use);
1121
1122 share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
1123 msc_util.msc_log('share_partition := ' || share_partition);
1124
1125 -- for summary enhancement - backlog workbench will be supported with summary
1126 /*
1127 SELECT NVL(SUMMARY_FLAG,1)
1128 into l_summary_flag
1129 from msc_apps_instances
1130 where rownum = 1;
1131
1132 IF NVL(l_summary_flag,1) = 200 THEN
1133 msc_util.msc_log('Summary Approach is not supported for sites using backlog workbench');
1134 RETCODE := G_WARNING;
1135 RETURN;
1136 END IF;
1137 */
1138
1139 -- Bug 2516506 - select plan name also
1140 SELECT NVL(SUMMARY_FLAG,1), COMPILE_DESIGNATOR, trunc(plan_start_date)
1141 into l_summary_flag, l_plan_name, l_plan_start_date
1142 from msc_plans
1143 where plan_id = l_plan_to_use;
1144
1145 -- for summary enhancement
1146 IF NVL(l_summary_flag,1) NOT IN (G_SF_SUMMARY_NOT_RUN, G_SF_PREALLOC_COMPLETED, G_SF_ATPPEG_COMPLETED, G_SF_SUMMARY_COMPLETED) THEN
1147 msc_util.msc_log('LOAD_PLAN_SD: ' || 'Another session is running post-plan processing for this plan');
1148 RETCODE := G_ERROR;
1149 RETURN;
1150 END IF;
1151
1152 l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
1153 SELECT a.oracle_username
1154 INTO l_msc_schema
1155 FROM FND_ORACLE_USERID a,
1156 FND_PRODUCT_INSTALLATIONS b
1157 WHERE a.oracle_id = b.oracle_id
1158 AND b.application_id = 724;
1159
1160 FOR i in 1..atp_summ_tab.count LOOP
1161 l_table_name := 'MSC_' || atp_summ_tab(i);
1162 IF (share_partition = 'Y') THEN
1163 l_plan_id := MAXVALUE;
1164 ELSE
1165 l_plan_id := l_plan_to_use;
1166 END IF;
1167
1168 l_partition_name := atp_summ_tab(i)|| '_' || l_plan_id;
1169 msc_util.msc_log('l_partition_name := ' || l_partition_name);
1170
1171 BEGIN
1172 SELECT count(*)
1173 INTO l_count
1174 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
1175 --FROM DBA_TAB_PARTITIONS
1176 FROM ALL_TAB_PARTITIONS
1177 WHERE TABLE_NAME = l_table_name
1178 AND PARTITION_NAME = l_partition_name
1179 AND table_owner = l_msc_schema;
1180 EXCEPTION
1181 WHEN OTHERS THEN
1182 msc_util.msc_log('Inside Exception');
1183 l_count := 0;
1184 END;
1185 IF (l_count = 0) THEN
1186 -- Bug 2516506
1187 FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_PLAN_PARTITION_MISSING');
1188 FND_MESSAGE.SET_TOKEN('PLAN_NAME', l_plan_name);
1189 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
1190 msc_util.msc_log(FND_MESSAGE.GET);
1191 RETCODE := G_ERROR;
1192 RETURN;
1193 END IF;
1194 END LOOP;
1195
1196 BEGIN
1197 update msc_plans
1198 set summary_flag = G_SF_FULL_SUMMARY_RUNNING -- for summary enhancement: ATP is up hereafter
1199 where plan_id = l_plan_to_use;
1200 commit;
1201 EXCEPTION
1202 WHEN OTHERS THEN
1203 ERRBUF := sqlerrm;
1204 RETCODE := G_ERROR;
1205 RETURN;
1206 END;
1207
1208
1209 msc_util.msc_log('LOAD_PLAN_SD: ' || 'share_partition := ' || share_partition);
1210 l_sysdate := sysdate;
1211 l_user_id := FND_GLOBAL.USER_ID;
1212
1213 BEGIN -- Enclose summary specific operations within BEGIN-EXCEPTION-END block for summary enhancement
1214
1215 IF share_partition='N' THEN
1216 -- Need to truncate partitions in all tables in one go as it causes implicit commit - for summary enhancement
1217 Truncate_Summ_Plan_Partition(l_plan_to_use, l_applsys_schema);
1218 END IF;
1219
1220 -- s/d processing moved to new procedure with summary enhancement
1221 IF l_member_count > 0 THEN
1222 -- PF setup exists
1223 l_time_phased_pf := 1;
1224 ELSE
1225 -- PF setup does not exist
1226 l_time_phased_pf := 2;
1227 END IF;
1228 MSC_POST_PRO.LOAD_PLAN_SUMMARY_SD(l_plan_to_use,
1229 share_partition,
1230 l_optimized_plan,
1231 1, -- p_full_refresh : Full summation
1232 l_time_phased_pf, -- p_time_phased_pf : Time phased pf setup exists
1233 l_plan_type, -- ATP4drp Pass plan_type as a parameter
1234 null, -- p_last_refresh_number : Null for full summation
1235 null, -- p_new_refresh_number : Null for full summation
1236 l_sysdate);
1237 -- ATP4drp Call Resource summation only for non-DRP plan
1238 IF l_plan_type <> 5 THEN
1239 MSC_POST_PRO.LOAD_RESOURCES(l_plan_to_use,
1240 share_partition,
1241 l_applsys_schema,
1242 1, -- Full summation
1243 l_plan_start_date,
1244 l_sysdate);
1245 END IF;
1246 -- End ATP4drp
1247 MSC_POST_PRO.INSERT_SUPPLIER_DATA(l_plan_to_use,
1248 share_partition,
1249 l_applsys_schema,
1250 1, -- Full summation
1251 l_sysdate);
1252
1253 -- refresh number should be updated before gather stats as gathering stats causes implicit commit
1254 BEGIN
1255 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'updating summary flag and refresh number');
1256 update msc_plans
1257 set summary_flag = G_SF_SUMMARY_COMPLETED, -- For summary enhancement
1258 latest_refresh_number = (SELECT apps_lrn
1259 FROM MSC_PLAN_REFRESHES
1260 WHERE plan_id = l_plan_to_use)
1261 where plan_id = l_plan_to_use;
1262 END;
1263
1264 -- All stats should be gathered in one go as that also causes imlpicit commit - for summary enhancement
1265 Gather_Summ_Plan_Stats(l_plan_to_use, share_partition);
1266
1267 RETCODE := G_SUCCESS;
1268 commit;
1269
1270 EXCEPTION
1271 WHEN OTHERS THEN
1272 ROLLBACK;
1273
1274 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1275 update msc_plans
1276 set summary_flag = G_SF_PREALLOC_COMPLETED
1277 where plan_id = l_plan_to_use;
1278 ELSE
1279 update msc_plans
1280 set summary_flag = G_SF_SUMMARY_NOT_RUN
1281 where plan_id = l_plan_to_use;
1282 END IF;
1283 commit;
1284 END;
1285 END IF; --IF NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N') = 'Y' THEN
1286
1287 -- 24x7 Hooks
1288 if (l_24_plan > 0) then
1289 -- Bug 3478888 Reset ATP_SYNCHRONIZATION_FLAG only if ATP Post Plan Processing
1290 -- is launched from plan
1291 if p_calling_module = 2 then
1292 -- Reset the ATP_SYNCHRONIZATION_FLAG to 0 for the original plan.
1293 -- Moved this from MSCPLAPB.pls
1294 msc_util.msc_debug('Update atp_synchronization_flag for 24x7 plan to support re-run after sync failure');
1295
1296 update msc_demands
1297 set atp_synchronization_flag = 0 -- null
1298 where (plan_id, sr_instance_id, organization_id) IN
1299 (select mpo.plan_id, mpo.sr_instance_id, mpo.organization_id
1300 from msc_plan_organizations mpo
1301 where mpo.plan_id = l_old_plan)
1302 and origination_type in (6,30);
1303
1304 COMMIT;
1305 end if;
1306
1307 -- call 24x7 ATP Synchronize
1308 msc_util.msc_log ('Calling 24x7 Synchronization');
1309 MSC_ATP_24X7.Call_Synchronize (ERRBUF, RETCODE, l_old_plan);
1310 end if;
1311 EXCEPTION
1312 WHEN OTHERS THEN
1313 -- For summary enhancement - No need to reset summary_flag here
1314 /*
1315 BEGIN
1316 update msc_plans
1317 set summary_flag = 1
1318 where plan_id = l_plan_to_use;
1319 commit;
1320 END;
1321 */
1322
1323 msc_util.msc_log('Inside main exception');
1324 msc_util.msc_log(sqlerrm);
1325 ERRBUF := sqlerrm;
1326 RETCODE := G_ERROR;
1327
1328 -- For summary enhancement - Need to rollback incomplete changes
1329 ROLLBACK;
1330 END LOAD_PLAN_SD;
1331
1332
1333 -- For summary enhancement - Entry point for Incremental PDS Summary
1334 PROCEDURE Load_Net_Plan(
1335 ERRBUF OUT NoCopy VARCHAR2,
1336 RETCODE OUT NoCopy NUMBER,
1337 p_plan_id IN NUMBER)
1338 IS
1339 l_spid VARCHAR2(12);
1340 l_inv_ctp number;
1341 l_summary_flag NUMBER;
1342 l_plan_completion_date Date;
1343 l_enable_summary_mode varchar2(1);
1344 l_time_phased NUMBER;
1345 l_last_refresh_number NUMBER;
1346 l_new_refresh_number NUMBER;
1347 l_share_partition VARCHAR2(1);
1348 l_plan_start_date DATE;
1349 l_sysdate DATE;
1350 -- ATP4drp define new plan_type variable.
1351 l_plan_type NUMBER;
1352 BEGIN
1353 -- Bug 3304390 Disable Trace
1354 -- Deleted Related Code.
1355
1356 RETCODE := G_SUCCESS;
1357 l_sysdate := sysdate;
1358
1359 msc_util.msc_log ('Load_Net_Plan: ' || 'Plan ID : ' || p_plan_id);
1360
1361 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
1362 msc_util.msc_log('Load_Net_Plan: ' || 'inv_ctp := ' || l_inv_ctp);
1363 IF l_inv_ctp <> 4 THEN
1364 -- we are not doing PDS ATP so we wont continue
1365 msc_util.msc_log('Load_Net_Plan: ' || 'Not Doing PDS ATP. Please check profile - INV: Capable to Promise". Will Exit ');
1366 RETCODE := G_WARNING;
1367 RETURN;
1368 END IF;
1369
1370 l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
1371 msc_util.msc_log('Load_Net_Plan: ' || 'l_enable_summary_mode := ' || l_enable_summary_mode);
1372 IF l_enable_summary_mode = 'N' THEN
1373 -- summary is not enabled so we wont continue
1374 msc_util.msc_log('Load_Net_Plan: ' || 'Not Doing Summary ATP. Please check profile - MSC: Enable ATP Summary Mode. Will Exit ');
1375 RETCODE := G_WARNING;
1376 RETURN;
1377 END IF;
1378
1379 BEGIN
1380 select summary_flag,
1381 plan_completion_date,
1382 latest_refresh_number,
1383 trunc(plan_start_date),
1384 -- ATP4drp obtain plan_type info.
1385 plan_type
1386 into l_summary_flag, l_plan_completion_date, l_last_refresh_number, l_plan_start_date, l_plan_type
1387 -- End ATP4drp
1388 from msc_plans
1389 where plan_id = p_plan_id;
1390 EXCEPTION
1391 WHEN NO_DATA_FOUND THEN
1392 msc_util.msc_log('Unable to find plan data');
1393 RETCODE := G_ERROR;
1394 ERRBUF := sqlerrm;
1395 RETURN;
1396 END;
1397
1398 IF l_plan_completion_date IS NULL THEN
1399 msc_util.msc_log('Load_Net_Plan: ' || 'Either the plan is currently running or it ' ||
1400 'did not complete successfully or it was never run. Will exit');
1401 RETCODE := G_WARNING;
1402 RETURN;
1403 END IF;
1404
1405 --IF NVL(l_summary_flag,1) <> G_SF_SUMMARY_COMPLETED THEN 4754549 excluded 6 meaning 24X7 synch completed successfully.
1406 IF NVL(l_summary_flag,1) not in ( G_SF_SUMMARY_COMPLETED,G_SF_SYNC_SUCCESS)THEN
1407 msc_util.msc_log('Load_Net_Plan: ' || 'Full summary was not run. l_summary_flag is ' || l_summary_flag || '. Will Exit');
1408 RETCODE := G_ERROR;
1409 RETURN;
1410 END IF;
1411
1412 -- Re-arranged code to keep variables initialization in one place.
1413 -- ATP4drp Re-set variables to disable Allocation and PF
1414 IF l_plan_type = 5 THEN
1415 l_time_phased := 2;
1416 G_ALLOC_ATP := 'N';
1417 G_CLASS_HRCHY := 2;
1418 G_ALLOC_METHOD := 2;
1419 IF PG_DEBUG in ('Y', 'C') THEN
1420 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
1421 msc_sch_wb.atp_debug('Load_Net_Plan: ' || 'PF and Allocated ATP not applicable for DRP plans');
1422 msc_util.msc_log('G_ALLOC_ATP := ' || G_ALLOC_ATP);
1423 msc_util.msc_log('G_CLASS_HRCHY := ' || G_CLASS_HRCHY);
1424 msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1425 END IF;
1426 ELSE -- ATP4drp Execute rest for only for non-DRP plans
1427 G_ALLOC_ATP := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
1428 G_CLASS_HRCHY := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
1429 G_ALLOC_METHOD := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
1430
1431 msc_util.msc_log('G_ALLOC_ATP := ' || G_ALLOC_ATP);
1432 msc_util.msc_log('G_CLASS_HRCHY := ' || G_CLASS_HRCHY);
1433 msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1434
1435 IF G_ALLOC_ATP = 'Y' AND (G_CLASS_HRCHY <> 1 OR G_ALLOC_METHOD <> 1) THEN
1436 msc_util.msc_log('Load_Net_Plan: ' || 'Summary not supported for User-defined allocation. Will Exit ');
1437 RETCODE := G_WARNING;
1438 RETURN;
1439 END IF;
1440
1441 -- Check if time phased pf setup exists
1442 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1443 -- does not matter for demand priority allocation as anyway we look at the alloc tables
1444 l_time_phased := NULL;
1445 ELSE
1446
1447 BEGIN
1448 --bug3663487 start SQL_ID 9428030
1449 -- ATP4drp Removed commented code for fetch from msc_system_items.
1450 SELECT 1
1451 INTO l_time_phased
1452 FROM msc_system_items i ,msc_plan_organizations po
1453 WHERE po.plan_id = p_plan_id
1454 AND i.aggregate_time_fence_date IS NOT NULL
1455 AND i.plan_id = po.plan_id
1456 AND i.organization_id = po.organization_id
1457 AND i.sr_instance_id = po.sr_instance_id
1458 AND rownum = 1;
1459 --bug3663487 end
1460 EXCEPTION
1461 WHEN NO_DATA_FOUND THEN
1462 l_time_phased := 2;
1463 END;
1464
1465 END IF;
1466
1467 END IF;
1468 -- End ATP4drp
1469
1470
1471 BEGIN
1472 update msc_plans
1473 set summary_flag = G_SF_NET_SUMMARY_RUNNING
1474 where plan_id = p_plan_id;
1475 commit;
1476 EXCEPTION
1477 WHEN OTHERS THEN
1478 ERRBUF := sqlerrm;
1479 RETCODE := G_ERROR;
1480 RETURN;
1481 END;
1482
1483 -- Obtain the new refresh number
1484 SELECT max(refresh_number)
1485 INTO l_new_refresh_number
1486 FROM (SELECT refresh_number
1487 FROM msc_demands
1488 WHERE plan_id = p_plan_id
1489
1490 UNION ALL
1491
1492 SELECT refresh_number
1493 FROM msc_supplies
1494 WHERE plan_id = p_plan_id
1495
1496 UNION ALL
1497
1498 SELECT refresh_number
1499 FROM msc_resource_requirements
1500 WHERE plan_id = p_plan_id
1501 );
1502
1503 IF l_new_refresh_number IS NULL THEN
1504 -- No data to summarize
1505 msc_util.msc_log('Load_Net_Plan: ' || 'No data to summarize. Will Exit');
1506 RETCODE := G_WARNING;
1507 RETURN;
1508 END IF;
1509
1510 IF l_new_refresh_number = l_last_refresh_number THEN
1511 -- No change since last summary
1512 msc_util.msc_log('Load_Net_Plan: ' || 'No change since last summary');
1513 msc_util.msc_log('Load_Net_Plan: ' || 'updating summary flag and refresh number');
1514 update msc_plans
1515 set summary_flag = G_SF_SUMMARY_COMPLETED,
1516 latest_refresh_number = l_new_refresh_number
1517 where plan_id = p_plan_id;
1518 RETCODE := G_SUCCESS;
1519 RETURN;
1520 END IF;
1521
1522 MSC_POST_PRO.LOAD_PLAN_SUMMARY_SD(p_plan_id,
1523 null, -- p_share_partition -> Not required for
1524 null, -- p_optimized_plan, -> incremental summation
1525 2, -- Incremental summation
1526 l_time_phased,
1527 l_plan_type, -- ATP4drp Pass plan_type as a parameter
1528 l_last_refresh_number,
1529 l_new_refresh_number,
1530 l_sysdate);
1531
1532 -- ATP4drp Call Resource summation only for non-DRP plan
1533 IF l_plan_type <> 5 THEN
1534 MSC_POST_PRO.LOAD_RESOURCES(p_plan_id,
1535 null, -- p_share_partition -> Not required for
1536 null, -- p_optimized_plan, -> incremental summation
1537 2, -- Incremental summation
1538 l_plan_start_date,
1539 l_sysdate,
1540 l_last_refresh_number,
1541 l_new_refresh_number);
1542 END IF;
1543 -- End ATP4drp
1544
1545 MSC_POST_PRO.INSERT_SUPPLIER_DATA(p_plan_id,
1546 null, -- p_share_partition -> Not required for
1547 null, -- p_applsys_schema -> incremental summation
1548 2, -- Incremental summation
1549 l_sysdate,
1550 l_last_refresh_number,
1551 l_new_refresh_number);
1552
1553 BEGIN
1554 msc_util.msc_log ('Load_Net_Plan: ' || 'updating summary flag and refresh number');
1555 update msc_plans
1556 set summary_flag = G_SF_SUMMARY_COMPLETED, -- For summary enhancement
1557 latest_refresh_number = l_new_refresh_number
1558 where plan_id = p_plan_id;
1559 END;
1560
1561 -- All stats should be gathered in one go as that also causes imlpicit commit - for summary enhancement
1562 l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
1563 msc_util.msc_log('Load_Net_Plan: ' || 'l_share_partition := ' || l_share_partition);
1564 Gather_Summ_Plan_Stats(p_plan_id, l_share_partition);
1565
1566 RETCODE := G_SUCCESS;
1567 commit;
1568
1569
1570 EXCEPTION
1571 WHEN OTHERS THEN
1572 msc_util.msc_log('Load_Net_Plan: Inside main exception');
1573 msc_util.msc_log(sqlerrm);
1574 ERRBUF := sqlerrm;
1575 RETCODE := G_ERROR;
1576
1577 -- For summary enhancement - Need to rollback incomplete changes
1578 ROLLBACK;
1579
1580 update msc_plans
1581 set summary_flag = G_SF_SUMMARY_COMPLETED
1582 where plan_id = p_plan_id;
1583 commit;
1584 END Load_Net_Plan;
1585
1586
1587 PROCEDURE CLEAN_TABLES(p_applsys_schema IN varchar2
1588 )
1589 IS
1590 l_sql_stmt varchar2(300);
1591 BEGIN
1592 --- clean up the tables
1593 msc_util.msc_log('Inside clean_tables_procedure ');
1594 l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SO';
1595
1596 BEGIN
1597 msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SO');
1598 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1599 APPLICATION_SHORT_NAME => 'MSC',
1600 STATEMENT_TYPE => ad_ddl.truncate_table,
1601 STATEMENT => l_sql_stmt,
1602 OBJECT_NAME => 'MSC_TEMP_SUMM_SO');
1603 EXCEPTION
1604 WHEN OTHERS THEN
1605 msc_util.msc_log(sqlerrm);
1606 msc_util.msc_log('Truncate table MSC_TEMP_SUMM_SO failed');
1607 END;
1608 l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SD';
1609
1610 BEGIN
1611 msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SD');
1612 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1613 APPLICATION_SHORT_NAME => 'MSC',
1614 STATEMENT_TYPE => ad_ddl.truncate_table,
1615 STATEMENT => l_sql_stmt,
1616 OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
1617 EXCEPTION
1618 WHEN OTHERS THEN
1619 msc_util.msc_log(sqlerrm);
1620 msc_util.msc_log('Truncate table MSC_TEMP_SUMM_SD failed');
1621 END;
1622 l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SO_N1';
1623
1624 BEGIN
1625 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SO_N1');
1626 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1627 APPLICATION_SHORT_NAME => 'MSC',
1628 STATEMENT_TYPE => ad_ddl.drop_index,
1629 STATEMENT => l_sql_stmt,
1630 OBJECT_NAME => 'MSC_TEMP_SUMM_SO_N1');
1631 EXCEPTION
1632 WHEN OTHERS THEN
1633 msc_util.msc_log(sqlerrm);
1634 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SO_N1 failed');
1635 END;
1636
1637 l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SD_N1';
1638
1639 BEGIN
1640 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SD_N1');
1641 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1642 APPLICATION_SHORT_NAME => 'MSC',
1643 STATEMENT_TYPE => ad_ddl.drop_index,
1644 STATEMENT => l_sql_stmt,
1645 OBJECT_NAME => 'MSC_TEMP_SUMM_SD_N1');
1646 EXCEPTION
1647 WHEN OTHERS THEN
1648 msc_util.msc_log(sqlerrm);
1649 msc_util.msc_log('Drop index MSC_TEMP_SUMM_SD_N1 failed');
1650 END;
1651
1652 END CLEAN_TABLES;
1653
1654 PROCEDURE INSERT_SUPPLIER_DATA(p_plan_id IN NUMBER,
1655 p_share_partition IN varchar2,
1656 p_applsys_schema IN varchar2,
1657 p_full_refresh IN NUMBER, -- 1:Yes, 2:No
1658 p_sys_date IN DATE, -- For summary enhancement
1659 p_last_refresh_number IN NUMBER, -- For summary enhancement
1660 p_new_refresh_number IN NUMBER) -- For summary enhancement
1661 AS
1662 l_partition_name varchar2(30);
1663 L_SQL_STMT varchar2(300);
1664 L_SQL_STMT_1 varchar2(300);
1665 l_sysdate date;
1666 l_user_id number;
1667
1668 BEGIN
1669 l_sysdate := sysdate;
1670 l_user_id := FND_GLOBAL.USER_ID;
1671
1672 ---profile option for including purchase order
1673 MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE := NVL(FND_PROFILE.VALUE('MSC_PO_DOCK_DATE_CALC_PREF'), 2);
1674
1675 IF p_full_refresh = 1 THEN -- Full refresh - for summary enhancement
1676
1677 -- Data for share_partition='N' has already been deleted
1678 IF p_share_partition = 'Y' THEN
1679 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Share partition ');
1680 --- first delete data from the table
1681 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Delete Data from msc_atp_summary_sup');
1682 delete MSC_ATP_SUMMARY_SUP where plan_id = p_plan_id;
1683 END IF;
1684
1685 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Loading complete summary in MSC_ATP_SUMMARY_SUP');
1686 -- The actual SQL is moved to new procedure for summary enhancement
1687 LOAD_SUP_DATA_FULL(p_plan_id, p_sys_date);
1688 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'After loading complete summary in MSC_ATP_SUMMARY_SUP');
1689
1690 -- Code to gather stats was here. Removed for summary enhancement as stats are gathered right in the end.
1691
1692 ELSE
1693
1694 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Loading net summary in MSC_ATP_SUMMARY_SUP');
1695 LOAD_SUP_DATA_NET(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
1696 msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'After loading net summary in MSC_ATP_SUMMARY_SUP');
1697
1698
1699 END IF;
1700
1701 END INSERT_SUPPLIER_DATA;
1702
1703
1704 FUNCTION get_tolerance_defined( p_plan_id IN NUMBER,
1705 p_instance_id IN NUMBER,
1706 p_organization_id IN NUMBER,
1707 p_inventory_item_id IN NUMBER,
1708 p_supplier_id IN NUMBER,
1709 p_supplier_site_id IN NUMBER)
1710 RETURN NUMBER
1711 IS
1712 l_count number;
1713 BEGIN
1714
1715 SELECT count(*)
1716 INTO l_count
1717 FROM msc_supplier_flex_fences
1718 WHERE plan_id = p_plan_id
1719 AND sr_instance_id = p_instance_id
1720 AND organization_id = p_organization_id
1721 AND inventory_item_id = p_inventory_item_id
1722 AND supplier_id = p_supplier_id
1723 AND supplier_site_id = p_supplier_site_id;
1724 return l_count;
1725 EXCEPTION
1726 WHEN NO_DATA_FOUND THEN
1727 return 0;
1728 END get_tolerance_defined;
1729
1730
1731 PROCEDURE LOAD_RESOURCES (p_plan_id IN NUMBER,
1732 p_share_partition IN varchar2,
1733 p_applsys_schema IN varchar2,
1734 p_full_refresh IN NUMBER, -- 1:Yes, 2:No -- for summary enhancement
1735 p_plan_start_date IN DATE, -- for summary enhancement
1736 p_sys_date IN DATE, -- for summary enhancement
1737 p_last_refresh_number IN NUMBER DEFAULT NULL, -- for summary enhancement
1738 p_new_refresh_number IN NUMBER DEFAULT NULL) -- for summary enhancement
1739 AS
1740 l_optimized_plan number;
1741 l_constraint_plan number;
1742 l_use_bor number;
1743 l_count number;
1744 l_partition_name varchar2(30);
1745 L_SQL_STMT varchar2(300);
1746 L_SQL_STMT_1 varchar2(300);
1747 l_MSO_Batch_flag varchar2(1);
1748 l_use_batching number;
1749 l_sysdate date;
1750 l_user_id number;
1751 BEGIN
1752
1753 l_MSO_Batch_flag := NVL(fnd_profile.value('MSO_BATCHABLE_FLAG'),'N');
1754 msc_util.msc_log('LOAD_RESOURCES: ' || 'mso batchable flag := ' || l_MSO_Batch_flag );
1755 Begin
1756 SELECT decode(designator_type, 2, 1, 0),
1757 DECODE(plans.plan_type, 4, 2,
1758 DECODE(daily_material_constraints, 1, 1,
1759 DECODE(daily_resource_constraints, 1, 1,
1760 DECODE(weekly_material_constraints, 1, 1,
1761 DECODE(weekly_resource_constraints, 1, 1,
1762 DECODE(period_material_constraints, 1, 1,
1763 DECODE(period_resource_constraints, 1, 1, 2)
1764 )
1765 )
1766 )
1767 )
1768 )
1769 ),
1770 DECODE(l_MSO_Batch_Flag, 'Y', DECODE(plans.plan_type, 4, 0,2,0, -- filter out MPS plans
1771 DECODE(daily_material_constraints, 1, 1,
1772 DECODE(daily_resource_constraints, 1, 1,
1773 DECODE(weekly_material_constraints, 1, 1,
1774 DECODE(weekly_resource_constraints, 1, 1,
1775 DECODE(period_material_constraints, 1, 1,
1776 DECODE(period_resource_constraints, 1, 1, 0)
1777 )
1778 )
1779 )
1780 )
1781 )
1782 ), 0)
1783 INTO l_use_bor, l_optimized_plan, l_constraint_plan
1784 FROM msc_designators desig,
1785 msc_plans plans
1786 WHERE plans.plan_id = p_plan_id
1787 AND desig.designator = plans.compile_designator
1788 AND desig.sr_instance_id = plans.sr_instance_id
1789 AND desig.organization_id = plans.organization_id;
1790 EXCEPTION WHEN NO_DATA_FOUND THEN
1791 msc_util.msc_log('LOAD_RESOURCES: ' || 'In Exception : ' || sqlcode || ': ' || sqlerrm);
1792 l_use_bor := 0;
1793 l_optimized_plan := 2;
1794 l_constraint_plan := 0;
1795 END;
1796
1797 msc_util.msc_log('LOAD_RESOURCES: ' || 'l_use_bor := ' || l_use_bor);
1798 msc_util.msc_log('LOAD_RESOURCES: ' || 'l_optimized_plan := ' || l_optimized_plan);
1799 msc_util.msc_log('LOAD_RESOURCES: ' || 'l_constraint_plan := ' || l_constraint_plan);
1800
1801 IF (l_MSO_Batch_Flag = 'Y') and (l_use_bor = 0) and (l_constraint_plan = 1) THEN
1802 msc_util.msc_log('LOAD_RESOURCES: ' || 'Do Batching');
1803 l_use_batching := 1;
1804 ELSE
1805 msc_util.msc_log('LOAD_RESOURCES: ' || 'No Batching');
1806 l_use_batching := 0;
1807 END IF;
1808 l_sysdate := sysdate;
1809 l_user_id := FND_GLOBAL.USER_ID;
1810
1811 IF p_full_refresh = 1 THEN -- Full refresh - for summary enhancement
1812
1813 -- Data for share_partition='N' has already been deleted
1814 IF p_share_partition = 'Y' THEN
1815 msc_util.msc_log('LOAD_RESOURCES: ' || 'Share partition ');
1816 --- first delete data from the table
1817 msc_util.msc_log('LOAD_RESOURCES: ' || 'Delete Data from MSC_ATP_SUMMARY_RES');
1818 DELETE MSC_ATP_SUMMARY_RES where plan_id = p_plan_id;
1819 msc_util.msc_log('LOAD_RESOURCES: ' || 'After deleting old resources info');
1820 END IF;
1821
1822 -- The actual SQLs moved to private procedures for modularity : summary enhancement
1823 IF l_use_batching = 1 THEN
1824 msc_util.msc_log('LOAD_RESOURCES: ' || 'Doing Batching');
1825
1826 --2859130
1827 IF nvl(l_optimized_plan, 2) <> 1 THEN
1828 msc_util.msc_log('LOAD_RESOURCES: ' || 'Unconstrained plan.');
1829 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1830
1831 load_res_full_unopt_batch(p_plan_id, p_plan_start_date, p_sys_date);
1832
1833 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1834 ELSE
1835 -- constrained plan
1836 msc_util.msc_log('LOAD_RESOURCES: ' || 'Constrained plan.');
1837 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1838
1839 load_res_full_opt_batch(p_plan_id, p_plan_start_date, p_sys_date);
1840
1841 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1842 END IF;
1843
1844 ELSE --- if l_use_batching =1
1845 msc_util.msc_log('LOAD_RESOURCES: ' || 'Not doing Batching');
1846
1847 --2859130
1848 IF nvl(l_optimized_plan, 2) <> 1 THEN
1849 msc_util.msc_log('LOAD_RESOURCES: ' || 'Unconstrained plan.');
1850 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1851
1852 load_res_full_unopt_nobatch(p_plan_id, p_plan_start_date, p_sys_date);
1853
1854 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1855 ELSE
1856 -- 2859130 constrained plan
1857 msc_util.msc_log('LOAD_RESOURCES: ' || 'Constrained plan.');
1858 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1859
1860 load_res_full_opt_nobatch(p_plan_id, p_plan_start_date, p_sys_date);
1861
1862 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1863 END IF;
1864
1865 END IF; --- if l_use_batching = 1
1866
1867 -- Code to gather stats was here. Removed for summary enhancement as stats are gathered right in the end.
1868
1869 ELSE -- Net refresh - for summary enhancement
1870 -- IF p_full_refresh = 1 THEN -- Full refresh - for summary enhancement
1871
1872 msc_util.msc_log('LOAD_RESOURCES: ' || 'Loading net summary in MSC_ATP_SUMMARY_RES');
1873 -- since at this point we need to bother only about ATP generated records we dont look for opt/unopt or batching
1874 load_res_data_net(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
1875 msc_util.msc_log('LOAD_RESOURCES: ' || 'After loading net summary in MSC_ATP_SUMMARY_RES');
1876
1877 END IF;
1878 END LOAD_RESOURCES;
1879
1880
1881 Procedure Clean_Plan_Tables( p_applsys_schema IN varchar2 )
1882 IS
1883 l_sql_stmt varchar2(100);
1884 BEGIN
1885
1886 l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SD';
1887
1888 BEGIN
1889 msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SD');
1890 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1891 APPLICATION_SHORT_NAME => 'MSC',
1892 STATEMENT_TYPE => ad_ddl.truncate_table,
1893 STATEMENT => l_sql_stmt,
1894 OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
1895 EXCEPTION
1896 WHEN OTHERS THEN
1897 msc_util.msc_log(sqlerrm);
1898 msc_util.msc_log('Truncate table failed');
1899 END;
1900
1901 l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SD_N1';
1902
1903 BEGIN
1904 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SD_N1');
1905 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1906 APPLICATION_SHORT_NAME => 'MSC',
1907 STATEMENT_TYPE => ad_ddl.drop_index,
1908 STATEMENT => l_sql_stmt,
1909 OBJECT_NAME => 'MSC_TEMP_SUMM_SD_N1');
1910 EXCEPTION
1911 WHEN OTHERS THEN
1912 msc_util.msc_log(sqlerrm);
1913 msc_util.msc_log('Truncate table failed');
1914 END;
1915
1916 l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SUP';
1917
1918 BEGIN
1919 msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SUP');
1920 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1921 APPLICATION_SHORT_NAME => 'MSC',
1922 STATEMENT_TYPE => ad_ddl.truncate_table,
1923 STATEMENT => l_sql_stmt,
1924 OBJECT_NAME => 'MSC_TEMP_SUMM_SUP');
1925 EXCEPTION
1926 WHEN OTHERS THEN
1927 msc_util.msc_log(sqlerrm);
1928 msc_util.msc_log('Truncate table MSC_TEMP_SUMM_SUP failed');
1929 END;
1930
1931 l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SUP_N1';
1932
1933 BEGIN
1934 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SUP_N1');
1935 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1936 APPLICATION_SHORT_NAME => 'MSC',
1937 STATEMENT_TYPE => ad_ddl.drop_index,
1938 STATEMENT => l_sql_stmt,
1939 OBJECT_NAME => 'MSC_TEMP_SUMM_SUP_N1');
1940 EXCEPTION
1941 WHEN OTHERS THEN
1942 msc_util.msc_log(sqlerrm);
1943 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SUP_N1 failed');
1944 END;
1945
1946 l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_RES';
1947
1948 BEGIN
1949 msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_RES');
1950 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1951 APPLICATION_SHORT_NAME => 'MSC',
1952 STATEMENT_TYPE => ad_ddl.truncate_table,
1953 STATEMENT => l_sql_stmt,
1954 OBJECT_NAME => 'MSC_TEMP_SUMM_RES');
1955 EXCEPTION
1956 WHEN OTHERS THEN
1957 msc_util.msc_log(sqlerrm);
1958 msc_util.msc_log('Truncate table MSC_TEMP_SUMM_RES failed');
1959 END;
1960
1961 l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_RES_N1';
1962
1963 BEGIN
1964 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_RES_N1');
1965 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1966 APPLICATION_SHORT_NAME => 'MSC',
1967 STATEMENT_TYPE => ad_ddl.drop_index,
1968 STATEMENT => l_sql_stmt,
1969 OBJECT_NAME => 'MSC_TEMP_SUMM_RES_N1');
1970 EXCEPTION
1971 WHEN OTHERS THEN
1972 msc_util.msc_log(sqlerrm);
1973 msc_util.msc_log('Drop Index MSC_TEMP_SUMM_RES_N1 failed');
1974 END;
1975 END Clean_Plan_Tables;
1976
1977
1978 PROCEDURE LOAD_NET_SO (
1979 ERRBUF OUT NoCopy VARCHAR2,
1980 RETCODE OUT NoCopy NUMBER,
1981 P_INSTANCE_ID IN NUMBER
1982 )
1983 IS
1984 TYPE number_arr IS TABLE OF NUMBER;
1985 l_inv_ctp NUMBER;
1986 l_sd_date date;
1987 l_sd_qty NUMBER;
1988 l_refresh_number NUMBER;
1989 l_organization_id NUMBER;
1990 l_old_sd_date DATE;
1991 l_old_sd_qty NUMBER;
1992 l_demand_class varchar2(30);
1993 l_inventory_item_id number;
1994 l_instance_id number;
1995 l_default_atp_rule_id NUMBER;
1996 l_sysdate_seq_num NUMBER;
1997 l_calendar_code VARCHAR2(20);
1998 l_default_demand_class VARCHAR2(10);
1999 l_calendar_exception_set_id NUMBER;
2000 l_summary_flag NUMBER;
2001
2002 l_org_ids number_arr;
2003 l_enable_summary_mode VARCHAR2(1);
2004 l_sysdate date;
2005 l_user_id number;
2006
2007 l_org_code VARCHAR2(7);
2008 l_sys_next_date date;
2009 -- rajjain 12/20/2002
2010 l_spid VARCHAR2(12);
2011 l_apps_lrn NUMBER; --Bug3049003
2012 l_reserved_quantity Number;
2013 l_reservation_date date;
2014 l_refresh_number1 number;
2015 l_count number :=0;
2016 -- new records cursor
2017
2018 CURSOR NET_CHANGE_SO_NEW (l_refresh_number number,
2019 l_instance_id number,
2020 l_organization_id NUMBER,
2021 l_calendar_code VARCHAR2,
2022 l_calendar_exception_set_id NUMBER) IS
2023 SELECT D.organization_id,
2024 D.inventory_item_id,
2025 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2026 NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2027 ---bug 2287148: move reservations to sysdate
2028 DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.REQUIREMENT_DATE)) SD_DATE,
2029 SUM ( (D.PRIMARY_UOM_QUANTITY -
2030 GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2031 D.COMPLETED_QUANTITY)) ) sd_qty
2032 FROM
2033 MSC_SALES_ORDERS D,
2034 MSC_ATP_RULES R,
2035 MSC_SYSTEM_ITEMS I
2036 WHERE D.SR_INSTANCE_ID = l_instance_id
2037 AND I.REFRESH_NUMBER > l_refresh_number -- get all new flag items
2038 AND I.ORGANIZATION_ID = l_organization_id
2039 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2040 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2041 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2042 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2043 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2044 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2045 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2046 AND D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2047 D.COMPLETED_QUANTITY)
2048 AND I.NEW_ATP_FLAG = 'Y' -- New flag to indicate new ATPable item.
2049 AND I.plan_id = -1
2050 AND ((D.PARENT_DEMAND_ID IS NOT NULL) OR -- new sales order and
2051 -- equivalently D.reservation_type = 1
2052 -- the demand for which the sales_order has been pegged
2053 (D.RESERVATION_TYPE = 2 AND D.DEMAND_SOURCE_LINE IS NOT NULL))
2054 AND (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2055 (SELECT S.SUB_INVENTORY_CODE
2056 FROM MSC_SUB_INVENTORIES S
2057 WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2058 AND S.PLAN_ID = I.PLAN_ID
2059 AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2060 AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2061 1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2062 AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2063 2, 1, S.NETTING_TYPE)))
2064 AND (D.RESERVATION_TYPE = 2
2065 OR D.PARENT_DEMAND_ID IS NULL
2066 OR (D.RESERVATION_TYPE = 3 AND
2067 ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2068 (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2069 AND EXISTS
2070 (SELECT 1
2071 FROM msc_calendar_dates c
2072 WHERE C.PRIOR_SEQ_NUM >=
2073 DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2074 NULL, C.PRIOR_SEQ_NUM,
2075 MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM
2076 (D.ORGANIZATION_ID, P_INSTANCE_ID, l_sysdate)
2077 - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2078 AND C.CALENDAR_CODE = l_CALENDAR_CODE
2079 AND C.SR_INSTANCE_ID = p_instance_id
2080 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2081 AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2082 )
2083 GROUP BY D.organization_id,
2084 D.inventory_item_id,
2085 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2086 NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2087 -- rajjain 02/06/2003 Bug 2782882
2088 DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.REQUIREMENT_DATE));
2089
2090 -- reservation type cursor
2091 --bug 5357370,This cursor selects sales order which have unreserved
2092
2093 CURSOR NET_CHANGE_UNRESRV(l_refresh_number number,
2094 l_instance_id number,
2095 l_organization_id NUMBER
2096 ) IS
2097 SELECT
2098 D.organization_id,
2099 D.inventory_item_id,
2100 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2101 NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2102 trunc(D.REQUIREMENT_DATE) SD_DATE,
2103 sum(d.old_RESERVATION_QUANTITY) sd_qty
2104 FROM
2105 MSC_SALES_ORDERS D,
2106 MSC_ATP_RULES R,
2107 MSC_SYSTEM_ITEMS I
2108 WHERE D.SR_INSTANCE_ID = l_instance_id
2109 AND D.REFRESH_NUMBER > l_refresh_number
2110 AND I.ORGANIZATION_ID = l_organization_id
2111 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2112 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2113 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2114 AND I.plan_id = -1
2115 AND I.ATP_FLAG = 'Y' -- Get ATP'able items which have
2116 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2117 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2118 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2119 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2120 AND (D.RESERVATION_TYPE=1 and reservation_quantity=0 and old_reservation_quantity <>0)
2121 AND D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2122 NVL(D.COMPLETED_QUANTITY,0))
2123 AND (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2124 (SELECT S.SUB_INVENTORY_CODE
2125 FROM MSC_SUB_INVENTORIES S
2126 WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2127 AND S.PLAN_ID = I.PLAN_ID
2128 AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2129 AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2130 1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2131 AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2132 2, 1, S.NETTING_TYPE)))
2133 AND EXISTS
2134 (SELECT 1
2135 FROM msc_calendar_dates c
2136 WHERE C.PRIOR_SEQ_NUM >=
2137 DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2138 NULL, C.PRIOR_SEQ_NUM,
2139 MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2140 P_INSTANCE_ID,
2141 l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2142 AND C.CALENDAR_CODE = l_CALENDAR_CODE
2143 AND C.SR_INSTANCE_ID = p_instance_id
2144 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2145 AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2146 )
2147 GROUP BY D.organization_id,
2148 D.inventory_item_id,
2149 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2150 NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2151 trunc(D.REQUIREMENT_DATE);
2152
2153 --bug 5357370,This cursor selects sales order which have been reserved
2154 --we need these to subtract the quantity from the original date when they were schedules and move to sysdate
2155
2156 CURSOR NET_CHANGE_RESRV (l_refresh_number number,
2157 l_instance_id number,
2158 l_organization_id NUMBER
2159 ) IS
2160 SELECT
2161 D.organization_id,
2162 D.inventory_item_id,
2163 NVL(D.DEMAND_CLASS,'@@@') demand_class ,
2164 trunc(d.requirement_date) SD_DATE,
2165 sum(nvl(d.old_primary_uom_quantity, 0) - d.primary_uom_quantity) SD_QTY
2166 -- QUESTION ? Does the above SUM actually result in a DELTA??
2167 FROM
2168 msc_sales_orders d
2169 WHERE
2170 d.reservation_type =2
2171 and d.refresh_number > l_refresh_number
2172 and d.organization_id = l_organization_id
2173 and d.sr_instance_id =l_instance_id
2174 GROUP BY
2175 D.organization_id,
2176 D.inventory_item_id,
2177 NVL(D.DEMAND_CLASS,'@@@'),
2178 trunc(d.requirement_date);
2179
2180
2181 CURSOR NET_CHANGE_SO_RSRV (l_refresh_number number,
2182 l_instance_id number,
2183 l_organization_id NUMBER,
2184 l_calendar_code VARCHAR2,
2185 l_calendar_exception_set_id NUMBER) IS
2186 SELECT D.organization_id,
2187 D.inventory_item_id,
2188 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2189 NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2190 ---bug 2287148: move reservations to sysdate
2191 DECODE(D.RESERVATION_TYPE,2,l_sys_next_date, trunc(D.REQUIREMENT_DATE)) SD_DATE,
2192 sum(d.primary_uom_quantity -nvl(d.old_primary_uom_quantity, 0)) sd_qty
2193 --SUM ( (D.PRIMARY_UOM_QUANTITY -
2194 --GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2195 --NVL(D.COMPLETED_QUANTITY,0))) ) sd_qty
2196 -- QUESTION ? Does the above SUM actually result in a DELTA??
2197 FROM
2198 MSC_SALES_ORDERS D,
2199 MSC_ATP_RULES R,
2200 MSC_SYSTEM_ITEMS I
2201 WHERE D.SR_INSTANCE_ID = l_instance_id
2202 AND D.REFRESH_NUMBER > l_refresh_number
2203 AND I.ORGANIZATION_ID = l_organization_id
2204 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2205 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2206 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2207 AND I.plan_id = -1
2208 AND I.ATP_FLAG = 'Y' -- Get ATP'able items which have
2209 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2210 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2211 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2212 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2213 AND D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2214 NVL(D.COMPLETED_QUANTITY,0))
2215 --AND D.DEMAND_SOURCE_LINE is NULL -- new inventory reservations.
2216 AND D.RESERVATION_TYPE <> 1 -- Not a Sales Order item.
2217 AND (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2218 (SELECT S.SUB_INVENTORY_CODE
2219 FROM MSC_SUB_INVENTORIES S
2220 WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2221 AND S.PLAN_ID = I.PLAN_ID
2222 AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2223 AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2224 1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2225 AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2226 2, 1, S.NETTING_TYPE)))
2227 AND (D.RESERVATION_TYPE = 2
2228 OR D.PARENT_DEMAND_ID IS NULL
2229 OR (D.RESERVATION_TYPE = 3 AND
2230 ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2231 (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2232 AND EXISTS
2233 (SELECT 1
2234 FROM msc_calendar_dates c
2235 WHERE C.PRIOR_SEQ_NUM >=
2236 DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2237 NULL, C.PRIOR_SEQ_NUM,
2238 MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2239 P_INSTANCE_ID,
2240 l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2241 AND C.CALENDAR_CODE = l_CALENDAR_CODE
2242 AND C.SR_INSTANCE_ID = p_instance_id
2243 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2244 AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2245 )
2246 GROUP BY D.organization_id,
2247 D.inventory_item_id,
2248 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2249 NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2250 -- rajjain 02/06/2003 Bug 2782882
2251 DECODE(D.RESERVATION_TYPE,2,l_sys_next_date, trunc(D.REQUIREMENT_DATE))
2252 UNION ALL
2253 SELECT D.organization_id,
2254 D.inventory_item_id,
2255 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2256 NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2257 ---bug 2287148: move reservations to sysdate
2258 -- bug 5357370: since reservation_type 1 is only selected when it is shipped, we need to either use sysdate if we had reservation or use oldrequirement date if we did not have reservation
2259 decode(NVL(D.old_reservation_quantity, 0), 0, trunc(nvl(D.old_requirement_date, D.requirement_date)), l_sys_next_date) SD_DATE,
2260 -- DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.old_REQUIREMENT_DATE)) SD_DATE,
2261 --5125969 In cases of reservation type 1 and some complete qty
2262 --we want to substract that from total qty
2263 SUM(DECODE(D.RESERVATION_TYPE,1, -1*D.COMPLETED_QUANTITY,
2264 -1*(NVL(D.old_PRIMARY_UOM_QUANTITY,0) -
2265 GREATEST(NVL(D.old_RESERVATION_QUANTITY,0),
2266 NVL(D.old_COMPLETED_QUANTITY,0))))) sd_qty
2267 -- QUESTION ? Does the above SUM actually result in a DELTA??
2268 -- ANSWER : We are subtratcting the sum of the old quantities.
2269 FROM
2270 MSC_SALES_ORDERS D,
2271 MSC_ATP_RULES R,
2272 MSC_SYSTEM_ITEMS I
2273 WHERE D.SR_INSTANCE_ID = l_instance_id
2274 AND D.REFRESH_NUMBER > l_refresh_number
2275 AND I.ORGANIZATION_ID = l_organization_id
2276 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2277 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2278 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2279 AND I.plan_id = -1
2280 AND I.ATP_FLAG = 'Y' -- Get ATP'able items which have
2281 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2282 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2283 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2284 AND D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2285 --5125969 Also consider rows where completed_qty is not 0
2286 AND (D.OLD_PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.OLD_RESERVATION_QUANTITY,0),
2287 NVL(D.OLD_COMPLETED_QUANTITY,0))
2288 OR ((NVL(D.COMPLETED_QUANTITY,0) <> 0)AND D.OLD_PRIMARY_UOM_QUANTITY-NVL(D.OLD_COMPLETED_QUANTITY,0)>0))
2289 --5125969 Include reservation type 1 when complete qty is not 0
2290 AND ((D.DEMAND_SOURCE_LINE is NULL -- new inventory reservations.
2291 AND
2292 D.RESERVATION_TYPE <> 1) -- Not a Sales Order item.
2293 OR (D.RESERVATION_TYPE = 1 AND NVL(D.COMPLETED_QUANTITY,0) <> 0))
2294
2295 AND (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2296 (SELECT S.SUB_INVENTORY_CODE
2297 FROM MSC_SUB_INVENTORIES S
2298 WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2299 AND S.PLAN_ID = I.PLAN_ID
2300 AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2301 AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2302 1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2303 AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2304 2, 1, S.NETTING_TYPE)))
2305 AND (D.RESERVATION_TYPE = 2
2306 OR D.PARENT_DEMAND_ID IS NULL
2307 OR (D.RESERVATION_TYPE = 3 AND
2308 ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2309 (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2310 AND EXISTS
2311 (SELECT 1
2312 FROM msc_calendar_dates c
2313 WHERE C.PRIOR_SEQ_NUM >=
2314 DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2315 NULL, C.PRIOR_SEQ_NUM,
2316 MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2317 P_INSTANCE_ID,
2318 l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2319 AND C.CALENDAR_CODE = l_CALENDAR_CODE
2320 AND C.SR_INSTANCE_ID = p_instance_id
2321 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2322 AND C.CALENDAR_DATE = TRUNC(D.old_REQUIREMENT_DATE)
2323 )
2324 GROUP BY D.organization_id,
2325 D.inventory_item_id,
2326 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2327 NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2328 -- rajjain 02/06/2003 Bug 2782882
2329 decode(NVL(D.old_reservation_quantity, 0), 0, trunc(nvl(D.old_requirement_date, D.requirement_date)), l_sys_next_date);
2330
2331
2332 BEGIN
2333 -- Bug 3304390 Disable Trace
2334 -- Deleted Related Code
2335
2336 l_instance_id := p_instance_id;
2337 l_sysdate := sysdate;
2338 l_user_id := FND_GLOBAL.USER_ID;
2339 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
2340 l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
2341
2342 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
2343 msc_util.msc_log(' l_enable_summary_mode := ' || l_enable_summary_mode);
2344
2345 IF l_enable_summary_mode <> 'Y' THEN
2346 msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
2347 RETCODE := G_WARNING;
2348 RETURN;
2349 END IF;
2350
2351 IF l_inv_ctp = 4 THEN
2352 -- we are not doing ODS ATP so we wont continue
2353 msc_util.msc_log('Not Doing ODS ATP. Please check profile - INV: Capable to Promise. Will Exit ');
2354 RETCODE := G_WARNING;
2355 RETURN;
2356 ELSIF l_inv_ctp <> 5 THEN
2357 l_inv_ctp := 5;
2358 END IF;
2359
2360 SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0),apps_lrn ---LCID
2361 INTO l_summary_flag,l_refresh_number,l_apps_lrn ---bug3049003
2362 from msc_apps_instances
2363 where instance_id = p_instance_id;
2364
2365 IF NVL(l_summary_flag, 1) = 2 THEN
2366 msc_util.msc_log('Another session is running Complete summary for this instance');
2367 RETCODE := G_ERROR;
2368 RETURN;
2369 ELSIF (NVL(l_summary_flag, 1) = 1) THEN
2370 msc_util.msc_log('Partial summary of tables can be done only after complete summary has been run successfuly');
2371 RETCODE := G_ERROR;
2372 RETURN;
2373 END IF;
2374
2375 msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2376
2377 /* SELECT sr_tp_id
2378 BULK COLLECT INTO l_org_ids
2379 FROM msc_trading_partners
2380 WHERE sr_instance_id = p_instance_id and partner_type = 3;*/
2381
2382 SELECT ORGANIZATION_ID ---bug3049003
2383 BULK COLLECT INTO l_org_ids
2384 FROM msc_instance_orgs
2385 WHERE sr_instance_id = p_instance_id
2386 and org_lrn=l_apps_lrn
2387 and enabled_flag=1;
2388
2389 msc_util.msc_log(' org count := ' || l_org_ids.count);
2390
2391 -- Update summary record per organization
2392 FOR i in 1..l_org_ids.count LOOP
2393 l_organization_id := l_org_ids(i);
2394 msc_util.msc_log('processing org '|| i ||' := '||l_organization_id);
2395
2396 MSC_ATP_PROC.get_org_default_info(p_instance_id,
2397 l_organization_id,
2398 l_default_atp_rule_id,
2399 l_calendar_code,
2400 l_calendar_exception_set_id,
2401 l_default_demand_class,
2402 l_org_code);
2403
2404 msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
2405 msc_util.msc_log('l_calendar_exception_set_id := ' || l_calendar_exception_set_id);
2406 msc_util.msc_log('l_default_atp_rule_id := ' || l_default_atp_rule_id);
2407 msc_util.msc_log('l_default_demand_class := ' || l_default_demand_class);
2408 BEGIN
2409 SELECT cal.next_date
2410 INTO l_sys_next_date
2411 FROM msc_calendar_dates cal
2412 WHERE cal.exception_set_id = l_calendar_exception_set_id
2413 AND cal.calendar_code = l_calendar_code
2414 AND cal.calendar_date = TRUNC(l_sysdate)
2415 AND cal.sr_instance_id = p_instance_id ;
2416 EXCEPTION
2417 WHEN OTHERS THEN
2418 null;
2419 END;
2420
2421 OPEN NET_CHANGE_SO_NEW ( l_refresh_number ,
2422 l_instance_id ,
2423 l_organization_id ,
2424 l_calendar_code ,
2425 l_calendar_exception_set_id );
2426 msc_util.msc_log('after opening cursor NET_CHANGE_SO_NEW');
2427
2428 LOOP
2429 FETCH NET_CHANGE_SO_NEW INTO
2430 l_organization_id,
2431 l_inventory_item_id,
2432 l_demand_class,
2433 l_sd_date,
2434 l_sd_qty;
2435
2436 EXIT WHEN NET_CHANGE_SO_NEW%NOTFOUND;
2437
2438 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2439 msc_util.msc_log('l_demand_class := ' || l_organization_id);
2440 msc_util.msc_log('l_sd_date := ' || l_sd_date);
2441 msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2442 msc_util.msc_log('l_old_sd_date := ' || l_old_sd_date);
2443 msc_util.msc_log('l_old_sd_qty := ' || l_old_sd_qty);
2444 msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2445
2446 --- With 9i the entire set can be accomplished in one MERGE statement.
2447 --- Insert the new record
2448 BEGIN
2449 INSERT INTO MSC_ATP_SUMMARY_SO
2450 (plan_id,
2451 sr_instance_id,
2452 organization_id,
2453 inventory_item_id,
2454 demand_class,
2455 sd_date,
2456 sd_qty,
2457 last_update_date,
2458 last_updated_by,
2459 creation_date,
2460 created_by)
2461 VALUES (-1, p_instance_id, l_organization_id,
2462 l_inventory_item_id, l_demand_class, trunc(l_sd_date),
2463 l_sd_qty, l_sysdate, l_user_id ,
2464 l_sysdate, l_user_id
2465 );
2466 COMMIT;
2467 EXCEPTION
2468 -- If a record has already been inserted by another process
2469 WHEN DUP_VAL_ON_INDEX THEN
2470 -- Update the record.
2471 UPDATE MSC_ATP_SUMMARY_SO
2472 SET sd_qty = sd_qty + l_sd_qty, -- The value is now a DELTA
2473 last_update_date = l_sysdate,
2474 last_updated_by = l_user_id
2475 WHERE plan_id = -1
2476 AND sr_instance_id = p_instance_id
2477 AND organization_id = l_organization_id
2478 AND inventory_item_id = l_inventory_item_id
2479 AND demand_class = l_demand_class
2480 AND trunc(sd_date) = trunc(l_sd_date);
2481
2482 COMMIT;
2483 END;
2484
2485 END LOOP; --- end of fetch loop
2486
2487 CLOSE NET_CHANGE_SO_NEW;
2488 msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2489 msc_util.msc_log('l_instance_id := ' || l_instance_id);
2490 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2491
2492 ----bug 5357370,We will remove the unreserved quantity from sysdate and add the quantity to the schedule date
2493 OPEN NET_CHANGE_UNRESRV(l_refresh_number ,
2494 l_instance_id ,
2495 l_organization_id
2496 ) ;
2497 msc_util.msc_log('after opening cursor NET_CHANGE_UNRESRV');
2498 msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2499 msc_util.msc_log('l_instance_id := ' || l_instance_id);
2500 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2501
2502 LOOP
2503 FETCH NET_CHANGE_UNRESRV INTO
2504 l_organization_id,
2505 l_inventory_item_id,
2506 l_demand_class,
2507 l_sd_date,
2508 l_sd_qty;
2509
2510 EXIT WHEN NET_CHANGE_UNRESRV%NOTFOUND;
2511
2512 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2513 msc_util.msc_log('l_demand_class := ' || l_demand_class);
2514 msc_util.msc_log('l_sd_date := ' || l_sd_date);
2515 msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2516 msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2517
2518 UPDATE MSC_ATP_SUMMARY_SO
2519 SET sd_qty = sd_qty + l_sd_qty, -- APPLY THE DELTA
2520 last_update_date = l_sysdate,
2521 last_updated_by = l_user_id
2522 WHERE plan_id = -1
2523 AND sr_instance_id = p_instance_id
2524 AND organization_id = l_organization_id
2525 AND inventory_item_id = l_inventory_item_id
2526 AND demand_class = l_demand_class
2527 AND trunc(sd_date) = trunc(l_sd_date);
2528 IF (SQL%NOTFOUND) THEN
2529 BEGIN
2530 INSERT INTO MSC_ATP_SUMMARY_SO
2531 (plan_id,
2532 sr_instance_id,
2533 organization_id,
2534 inventory_item_id,
2535 demand_class,
2536 sd_date,
2537 sd_qty,
2538 last_update_date,
2539 last_updated_by,
2540 creation_date,
2541 created_by)
2542 VALUES ( -1,
2543 p_instance_id,
2544 l_organization_id,
2545 l_inventory_item_id,
2546 l_demand_class,
2547 trunc(l_sd_date),
2548 l_sd_qty,
2549 l_sysdate,
2550 l_user_id ,
2551 l_sysdate,
2552 l_user_id
2553 );
2554 EXCEPTION
2555
2556 -- If a record has already been inserted by another process
2557 -- If insert fails then update.
2558 WHEN DUP_VAL_ON_INDEX THEN
2559 -- Update the record.
2560 update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2561 set sd_qty = (sd_qty + l_sd_qty),
2562 last_update_date = l_sysdate,
2563 last_updated_by = l_user_id
2564 where inventory_item_id = l_inventory_item_id
2565 and sr_instance_id = p_instance_id
2566 and organization_id = l_organization_id
2567 and sd_date = trunc(l_sd_date)
2568 and demand_class = l_demand_class ;
2569
2570 END;
2571 END IF;
2572
2573 UPDATE MSC_ATP_SUMMARY_SO
2574 SET sd_qty = sd_qty - l_sd_qty, -- APPLY THE DELTA
2575 last_update_date = l_sysdate,
2576 last_updated_by = l_user_id
2577 WHERE plan_id = -1
2578 AND sr_instance_id = p_instance_id
2579 AND organization_id = l_organization_id
2580 AND inventory_item_id = l_inventory_item_id
2581 AND demand_class = l_demand_class
2582 AND trunc(sd_date) = trunc(l_sys_next_date);
2583 IF (SQL%NOTFOUND) THEN
2584 BEGIN
2585 INSERT INTO MSC_ATP_SUMMARY_SO
2586 (plan_id,
2587 sr_instance_id,
2588 organization_id,
2589 inventory_item_id,
2590 demand_class,
2591 sd_date,
2592 sd_qty,
2593 last_update_date,
2594 last_updated_by,
2595 creation_date,
2596 created_by)
2597 VALUES ( -1,
2598 p_instance_id,
2599 l_organization_id,
2600 l_inventory_item_id,
2601 l_demand_class,
2602 trunc(l_sys_next_date),
2603 - l_sd_qty,
2604 l_sysdate,
2605 l_user_id ,
2606 l_sysdate,
2607 l_user_id
2608 );
2609 EXCEPTION
2610
2611 -- If a record has already been inserted by another process
2612 -- If insert fails then update.
2613 WHEN DUP_VAL_ON_INDEX THEN
2614 -- Update the record.
2615 update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2616 set sd_qty = (sd_qty - l_sd_qty),
2617 last_update_date = l_sysdate,
2618 last_updated_by = l_user_id
2619 where inventory_item_id = l_inventory_item_id
2620 and sr_instance_id = p_instance_id
2621 and organization_id = l_organization_id
2622 and sd_date = trunc(l_sys_next_date)
2623 and demand_class = l_demand_class ;
2624
2625 END;
2626 END IF;
2627 commit;
2628 END LOOP; --- end of fetch loop
2629
2630 CLOSE NET_CHANGE_UNRESRV;
2631
2632 ----bug 5357370,Remove the Reservation records from the date they were originally scheduled.
2633 OPEN NET_CHANGE_RESRV(l_refresh_number ,
2634 l_instance_id ,
2635 l_organization_id
2636 ) ;
2637
2638 msc_util.msc_log('after opening cursor NET_CHANGE_RESRV');
2639 msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2640 msc_util.msc_log('l_instance_id := ' || l_instance_id);
2641 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2642
2643 LOOP
2644 FETCH NET_CHANGE_RESRV INTO
2645 l_organization_id,
2646 l_inventory_item_id,
2647 l_demand_class,
2648 l_sd_date,
2649 l_sd_qty;
2650
2651 EXIT WHEN NET_CHANGE_RESRV%NOTFOUND;
2652
2653 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2654 msc_util.msc_log('l_demand_class := ' || l_demand_class);
2655 msc_util.msc_log('l_sd_date := ' || l_sd_date);
2656 msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2657 msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2658
2659 UPDATE MSC_ATP_SUMMARY_SO
2660 SET sd_qty = sd_qty + l_sd_qty, -- APPLY THE DELTA
2661 last_update_date = l_sysdate,
2662 last_updated_by = l_user_id
2663 WHERE plan_id = -1
2664 AND sr_instance_id = p_instance_id
2665 AND organization_id = l_organization_id
2666 AND inventory_item_id = l_inventory_item_id
2667 AND demand_class = l_demand_class
2668 AND trunc(sd_date) = trunc(l_sd_date);
2669 IF (SQL%NOTFOUND) THEN
2670 BEGIN
2671 INSERT INTO MSC_ATP_SUMMARY_SO
2672 (plan_id,
2673 sr_instance_id,
2674 organization_id,
2675 inventory_item_id,
2676 demand_class,
2677 sd_date,
2678 sd_qty,
2679 last_update_date,
2680 last_updated_by,
2681 creation_date,
2682 created_by)
2683 VALUES ( -1,
2684 p_instance_id,
2685 l_organization_id,
2686 l_inventory_item_id,
2687 l_demand_class,
2688 trunc(l_sd_date),
2689 l_sd_qty,
2690 l_sysdate,
2691 l_user_id ,
2692 l_sysdate,
2693 l_user_id
2694 );
2695 EXCEPTION
2696
2697 -- If a record has already been inserted by another process
2698 -- If insert fails then update.
2699 WHEN DUP_VAL_ON_INDEX THEN
2700 -- Update the record.
2701 update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2702 set sd_qty = (sd_qty + l_sd_qty),
2703 last_update_date = l_sysdate,
2704 last_updated_by = l_user_id
2705 where inventory_item_id = l_inventory_item_id
2706 and sr_instance_id = p_instance_id
2707 and organization_id = l_organization_id
2708 and sd_date = trunc(l_sd_date)
2709 and demand_class = l_demand_class ;
2710
2711 END;
2712 END IF;
2713 commit;
2714 END LOOP; --- end of fetch loop
2715
2716 CLOSE NET_CHANGE_RESRV;
2717
2718 OPEN NET_CHANGE_SO_RSRV ( l_refresh_number,
2719 l_instance_id,
2720 l_organization_id,
2721 l_calendar_code,
2722 l_calendar_exception_set_id );
2723 msc_util.msc_log('after opening cursor NET_CHANGE_SO_RSRV');
2724 msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
2725 msc_util.msc_log('l_calendar_exception_set_id := ' ||
2726 TO_CHAR(l_calendar_exception_set_id));
2727
2728
2729 LOOP
2730 FETCH NET_CHANGE_SO_RSRV INTO
2731 l_organization_id,
2732 l_inventory_item_id,
2733 l_demand_class,
2734 l_sd_date,
2735 l_sd_qty;
2736
2737 EXIT WHEN NET_CHANGE_SO_RSRV%NOTFOUND;
2738
2739 msc_util.msc_log('l_organization_id := ' || l_organization_id);
2740 msc_util.msc_log('l_demand_class := ' || l_demand_class);
2741 msc_util.msc_log('l_sd_date := ' || l_sd_date);
2742 msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2743 msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2744
2745
2746 --- With 9i the entire set can be accomplished in one MERGE statement.
2747 --- Try to update it first and then
2748
2749 UPDATE MSC_ATP_SUMMARY_SO
2750 SET sd_qty = sd_qty + l_sd_qty, -- APPLY THE DELTA
2751 last_update_date = l_sysdate,
2752 last_updated_by = l_user_id
2753 WHERE plan_id = -1
2754 AND sr_instance_id = p_instance_id
2755 AND organization_id = l_organization_id
2756 AND inventory_item_id = l_inventory_item_id
2757 AND demand_class = l_demand_class
2758 AND trunc(sd_date) = trunc(l_sd_date);
2759 --COMMIT; 5078448
2760
2761
2762 --- if not found insert it.
2763 IF (SQL%NOTFOUND) THEN
2764 --- Insert the new record
2765 BEGIN
2766 INSERT INTO MSC_ATP_SUMMARY_SO
2767 (plan_id,
2768 sr_instance_id,
2769 organization_id,
2770 inventory_item_id,
2771 demand_class,
2772 sd_date,
2773 sd_qty,
2774 last_update_date,
2775 last_updated_by,
2776 creation_date,
2777 created_by)
2778 VALUES (-1, p_instance_id, l_organization_id,
2779 l_inventory_item_id, l_demand_class, trunc(l_sd_date),
2780 l_sd_qty, l_sysdate, l_user_id ,
2781 l_sysdate, l_user_id
2782 );
2783 --COMMIT; 5078448
2784 EXCEPTION
2785 -- If a record has already been inserted by another process
2786 -- If insert fails then update.
2787 WHEN DUP_VAL_ON_INDEX THEN
2788 -- Update the record.
2789 UPDATE MSC_ATP_SUMMARY_SO
2790 SET sd_qty = sd_qty + l_sd_qty, -- The value is a DELTA
2791 last_update_date = l_sysdate,
2792 last_updated_by = l_user_id
2793 WHERE plan_id = -1
2794 AND sr_instance_id = p_instance_id
2795 AND organization_id = l_organization_id
2796 AND inventory_item_id = l_inventory_item_id
2797 AND demand_class = l_demand_class
2798 AND trunc(sd_date) = trunc(l_sd_date);
2799
2800 --COMMIT; 5078448
2801 END;
2802 END IF;
2803 COMMIT; --5078448
2804
2805 END LOOP; --- end of fetch loop
2806
2807 CLOSE NET_CHANGE_SO_RSRV;
2808
2809 END LOOP;
2810
2811 -- Take care of OUT parameters
2812 ERRBUF := null;
2813 RETCODE := G_SUCCESS;
2814
2815 EXCEPTION
2816 WHEN OTHERS THEN
2817 IF (NET_CHANGE_SO_RSRV%ISOPEN) THEN
2818 CLOSE NET_CHANGE_SO_RSRV;
2819 END IF;
2820 IF (NET_CHANGE_SO_NEW%ISOPEN) THEN
2821 CLOSE NET_CHANGE_SO_NEW;
2822 END IF;
2823 --- update summary flag in msc_apps_instances so that summary not available to use
2824 update msc_apps_instances
2825 set summary_flag = 1
2826 where instance_id = p_instance_id;
2827 msc_util.msc_log('An error occured while running net change on Sales Orders');
2828 msc_util.msc_log('Complete refresh would need to be run to activate Summary ATP');
2829 msc_util.msc_log('Inside main exception');
2830 msc_util.msc_log(sqlerrm);
2831 ERRBUF := sqlerrm;
2832 RETCODE := G_ERROR;
2833 END LOAD_NET_SO;
2834
2835
2836 PROCEDURE LOAD_NET_SD (
2837 ERRBUF OUT NoCopy VARCHAR2,
2838 RETCODE OUT NoCopy NUMBER,
2839 P_INSTANCE_ID IN NUMBER
2840 )
2841 IS
2842 TYPE number_arr IS TABLE OF NUMBER;
2843 l_organization_id NUMBER;
2844 l_default_atp_rule_id NUMBER;
2845 l_sysdate_seq_num NUMBER;
2846 l_calendar_code VARCHAR2(20);
2847 l_default_demand_class VARCHAR2(10);
2848 l_calendar_exception_set_id NUMBER;
2849 l_org_ids number_arr;
2850 l_refresh_number NUMBER;
2851 l_sd_date DATE;
2852 l_sd_qty NUMBER;
2853 l_inventory_item_id NUMBER;
2854 l_demand_class varchar(30);
2855 l_inv_ctp number;
2856 l_summary_flag number;
2857 l_enable_summary_mode varchar2(1);
2858 l_sysdate date;
2859 l_user_id number;
2860
2861 l_org_code VARCHAR2(7);
2862
2863 -- rajjain 12/20/2002
2864 l_spid VARCHAR2(12);
2865 l_apps_lrn NUMBER; --Bug3049003
2866
2867 -- Cursor is defined such that the four way union actually returns a DELTA (SUPPLY - DEMAND)
2868
2869 CURSOR c_net_supply_demand (l_refresh_number NUMBER,
2870 p_instance_id NUMBER,
2871 l_organization_id NUMBER,
2872 l_default_atp_rule_id NUMBER,
2873 l_sysdate_seq_num NUMBER,
2874 l_calendar_code VARCHAR2,
2875 l_default_demand_class VARCHAR2,
2876 l_calendar_exception_set_id NUMBER
2877 ) IS
2878 SELECT inventory_item_id, demand_class, SD_DATE, sum(sd_qty) SD_QTY
2879 FROM
2880 ((SELECT
2881 --- bug 2162571: Use Pf's id if doing PF based ATP
2882 DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
2883 I.INVENTORY_ITEM_ID) inventory_item_id,
2884 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 , NVL(D.DEMAND_CLASS,
2885 NVL(l_default_demand_class,'@@@')), '@@@') demand_class,
2886 C.PRIOR_DATE SD_DATE,
2887 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY
2888 --2 SD_TYPE
2889 FROM MSC_CALENDAR_DATES C,
2890 MSC_DEMANDS D,
2891 MSC_ATP_RULES R,
2892 MSC_SYSTEM_ITEMS I,
2893 MSC_SYSTEM_ITEMS I2
2894 WHERE I.ATP_FLAG = 'Y' --- I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
2895 AND I.ORGANIZATION_ID = l_organization_id
2896 AND I.SR_INSTANCE_ID = p_instance_id
2897 AND I.PLAN_ID = -1
2898 --- bug 2162571
2899 AND I.PLAN_ID = I2.PLAN_ID
2900 AND I.ORGANIZATION_ID = I2.ORGANIZATION_ID
2901 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
2902 AND I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID)
2903 AND D.REFRESH_NUMBER > l_refresh_number
2904 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
2905 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2906 AND D.PLAN_ID = I.PLAN_ID
2907 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2908 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2909 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2910 -- 1243985
2911 AND USING_REQUIREMENT_QUANTITY <> 0
2912 AND D.ORIGINATION_TYPE in (
2913 DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
2914 DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
2915 DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
2916 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
2917 DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
2918 -- Bug 1530311, forecast to be excluded
2919 AND C.CALENDAR_CODE = l_calendar_code
2920 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2921 AND C.SR_INSTANCE_ID = p_instance_id
2922 -- since we store repetitive schedule demand in different ways for
2923 -- ods (total quantity on start date) and pds (daily quantity from
2924 -- start date to end date), we need to make sure we only
2925 -- select work day for pds's repetitive schedule demand.
2926 AND C.CALENDAR_DATE BETWEEN TRUNC(D.USING_ASSEMBLY_DEMAND_DATE) AND
2927 TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
2928 D.USING_ASSEMBLY_DEMAND_DATE))
2929 AND C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE ,
2930 NULL, C.PRIOR_SEQ_NUM,
2931 l_sysdate_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2932 )
2933 UNION ALL -- with old demand information
2934 (SELECT
2935 --- bug 2162571
2936 --I.inventory_item_id,
2937 DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
2938 I.INVENTORY_ITEM_ID) inventory_item_id,
2939 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 , NVL(D.DEMAND_CLASS,
2940 NVL(l_default_demand_class,'@@@')), '@@@') demand_class,
2941 C.PRIOR_DATE SD_DATE,
2942 NVL(D.OLD_USING_REQUIREMENT_QUANTITY,0) SD_QTY
2943 --2 SD_TYPE
2944 FROM MSC_CALENDAR_DATES C,
2945 MSC_DEMANDS D,
2946 MSC_ATP_RULES R,
2947 MSC_SYSTEM_ITEMS I,
2948 MSC_SYSTEM_ITEMS I2
2949 WHERE I.ATP_FLAG = 'Y' --- I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
2950 AND I.ORGANIZATION_ID = l_organization_id
2951 AND I.SR_INSTANCE_ID = p_instance_id
2952 AND I.PLAN_ID = -1
2953 --- bug 2162571
2954 AND I.PLAN_ID = I2.PLAN_ID
2955 AND I.ORGANIZATION_ID = I2.ORGANIZATION_ID
2956 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
2957 AND I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID)
2958
2959 AND D.REFRESH_NUMBER > l_refresh_number
2960 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
2961 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2962 AND D.PLAN_ID = I.PLAN_ID
2963 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2964 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2965 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
2966 -- 1243985
2967 AND NVL(D.OLD_USING_REQUIREMENT_QUANTITY,0) <> 0
2968 AND D.ORIGINATION_TYPE in (
2969 DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
2970 DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
2971 DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
2972 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
2973 DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
2974 -- Bug 1530311, forecast to be excluded
2975 AND C.CALENDAR_CODE = l_calendar_code
2976 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2977 AND C.SR_INSTANCE_ID = p_instance_id
2978 -- since we store repetitive schedule demand in different ways for
2979 -- ods (total quantity on start date) and pds (daily quantity from
2980 -- start date to end date), we need to make sure we only
2981 -- select work day for pds's repetitive schedule demand.
2982 AND C.CALENDAR_DATE BETWEEN TRUNC(D.OLD_USING_ASSEMBLY_DEMAND_DATE) AND
2983 TRUNC(NVL(D.OLD_ASSEMBLY_DEMAND_COMP_DATE,
2984 D.OLD_USING_ASSEMBLY_DEMAND_DATE))
2985 AND C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE ,
2986 NULL, C.PRIOR_SEQ_NUM,
2987 l_sysdate_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2988 )
2989 UNION ALL -- new supplies information
2990 (SELECT /*+ ordered index(C,MSC_CALENDAR_DATES_U1) */I.inventory_item_id, -- 5098576/5199686
2991 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2992 NVL(DECODE(S.ORDER_TYPE,
2993 5, MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
2994 S.DEMAND_CLASS), NVL(l_default_demand_class, '@@@')), '@@@'),
2995 C.NEXT_DATE SD_DATE,
2996 --- bug 1843471, 2619493
2997 Decode(order_type, -- 2859130 remove trunc
2998 30, Decode(Sign(S.Daily_rate * (C.Calendar_date -
2999 TRUNC(S.FIRST_UNIT_START_DATE))- S.qty_completed),
3000 -1,S.Daily_rate* (C.Calendar_date - TRUNC(S.First_Unit_Start_date) +1) -
3001 S.qty_completed, S.Daily_rate),
3002 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) ) SD_QTY
3003 -- Changed the order of the tables for 5098576/5199686
3004 FROM MSC_SYSTEM_ITEMS I,
3005 MSC_SYSTEM_ITEMS I2,
3006 MSC_SUPPLIES S,
3007 MSC_ATP_RULES R,
3008 MSC_SUB_INVENTORIES MSI,
3009 MSC_CALENDAR_DATES C
3010
3011 /* FROM MSC_CALENDAR_DATES C,
3012 MSC_SUPPLIES S,
3013 MSC_ATP_RULES R,
3014 MSC_SYSTEM_ITEMS I,
3015 --- bug 2162571 add to another table to get info about product family
3016 MSC_SYSTEM_ITEMS I2,
3017 MSC_SUB_INVENTORIES MSI*/ -- commented for 5098576/5199686
3018 WHERE I.ATP_FLAG = 'Y' ---I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
3019 AND I.ORGANIZATION_ID = l_organization_id
3020 AND I.SR_INSTANCE_ID = p_instance_id
3021 AND I.PLAN_ID = -1
3022 AND I.PLAN_ID = I2.PLAN_ID
3023 --- bug 2162571: add system items tables to itself to filter out supplies of
3024 -- product family members if we are doing PF based atp on the member
3025 -- the logic is:1. If it is a regular member then we consider supplies ond demand of that itme
3026 -- 2. If we do product family with config PF --> A then
3027 -- a. If atp flag on PF is yes then we consider supplies of PF and demand of A
3028 -- b. If atp flag on PF in 'N' then we consider supplies and demands of A
3029 AND I.ORGANIZATION_ID = I2.ORGANIZATION_ID
3030 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
3031 AND NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) = I2.INVENTORY_ITEM_ID
3032 --- in case of PF, if atp_flag on PF is yes then we want to filter out supplies of A
3033 -- For A, the following condition will be true only if ATP_FLAG on PF is 'N'
3034 --- and therefore we will consider supplies of A. If atp_flag on PF is 'Y"
3035 -- then following condition will be false and we will omit supplies of A
3036 AND DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
3037 AND S.REFRESH_NUMBER > l_refresh_number
3038 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
3039 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
3040 AND S.PLAN_ID = I.PLAN_ID
3041 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
3042 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
3043 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
3044 ---bug 1843471, 2619493
3045 AND Decode(S.order_type, 30, S.Daily_rate* (C.Calendar_date -- 2859130 remove trunc
3046 - TRUNC(S.First_Unit_Start_date) + 1),
3047 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)) >
3048 Decode(S.order_type, 30, S.qty_completed,0)
3049 AND (S.ORDER_TYPE IN (
3050 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
3051 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
3052 DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
3053 DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
3054 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
3055 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1) ,
3056 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
3057 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
3058 DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
3059 DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
3060 DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
3061 DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1) ,
3062 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
3063 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
3064 OR ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
3065 S.ORDER_TYPE = 5
3066 AND exists (SELECT '1'
3067 FROM MSC_DESIGNATORS
3068 WHERE INVENTORY_ATP_FLAG = 1
3069 AND DESIGNATOR_TYPE = 2
3070 AND DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
3071 AND C.CALENDAR_CODE = l_calendar_code
3072 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
3073 AND C.SR_INSTANCE_ID = p_instance_id
3074 AND C.CALENDAR_DATE BETWEEN
3075 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
3076 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE,
3077 NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
3078 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
3079 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
3080 AND C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
3081 DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
3082 NULL, C.NEXT_SEQ_NUM, l_sysdate_seq_num -
3083 NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
3084 AND C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(l_sysdate),
3085 28, TRUNC(l_sysdate),
3086 C.NEXT_DATE)
3087 --- filter out non-atpable sub-inventories
3088 AND MSI.plan_id (+) = -1
3089 AND MSI.organization_id (+) = l_organization_id
3090 AND MSI.sr_instance_id (+) = p_instance_id
3091 AND MSI.sub_inventory_code (+) = S.subinventory_code
3092 AND NVL(MSI.inventory_atp_code,1) <> 2
3093 -- filter out non-atpable subinventories
3094 )
3095 UNION ALL -- with old supplies information
3096 (SELECT /*+ ordered index(C,MSC_CALENDAR_DATES_U1) */I.inventory_item_id, -- 5098576/5199686
3097 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
3098 NVL(DECODE(S.ORDER_TYPE,
3099 5, MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
3100 S.DEMAND_CLASS), NVL(l_default_demand_class, '@@@')), '@@@'),
3101 C.NEXT_DATE SD_DATE,
3102 --- bug 1843471, 2619493
3103 -- 2859130 remove trunc on calendar_date
3104 -1 * Decode(order_type,
3105 30, Decode(Sign(NVL(S.OLD_Daily_rate,0) * (C.Calendar_date -
3106 TRUNC(S.OLD_FIRST_UNIT_START_DATE))- NVL(S.OLD_qty_completed,0)),
3107 -1,NVL(S.OLD_Daily_rate,0)* (C.Calendar_date -
3108 TRUNC(S.OLD_First_Unit_Start_date) +1) -
3109 NVL(S.OLD_qty_completed,0), NVL(S.OLD_Daily_rate,0)),
3110 NVL( NVL(S.OLD_FIRM_QUANTITY,S.OLD_NEW_ORDER_QUANTITY),0) ) SD_QTY
3111
3112 /*FROM MSC_CALENDAR_DATES C,
3113 MSC_SUPPLIES S,
3114 MSC_ATP_RULES R,
3115 MSC_SYSTEM_ITEMS I,
3116 MSC_SYSTEM_ITEMS I2,
3117 MSC_SUB_INVENTORIES MSI*/
3118 -- Commented 5098576./5199686
3119 -- changed order of tables for 5098576/5199686
3120 FROM MSC_SYSTEM_ITEMS I,
3121 MSC_SYSTEM_ITEMS I2,
3122 MSC_SUPPLIES S,
3123 MSC_ATP_RULES R,
3124 MSC_SUB_INVENTORIES MSI,
3125 MSC_CALENDAR_DATES C
3126
3127 WHERE I.ATP_FLAG = 'Y'
3128 AND I.ORGANIZATION_ID = l_organization_id
3129 AND I.SR_INSTANCE_ID = p_instance_id
3130 AND I.PLAN_ID = -1
3131 AND I.PLAN_ID = I2.PLAN_ID
3132 --- bug 2162571: add system items tables to itself to filter out supplies of
3133 -- product family members if we are doing PF based atp on the member
3134 -- the logic is:1. If it is a regular member then we consider supplies ond demand of that itme
3135 -- 2. If we do product family with config PF --> A then
3136 -- a. If atp flag on PF is yes then we consider supplies of PF and demand of A
3137 -- b. If atp flag on PF in 'N' then we consider supplies and demands of A
3138 AND I.ORGANIZATION_ID = I2.ORGANIZATION_ID
3139 AND I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
3140 AND NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) = I2.INVENTORY_ITEM_ID
3141 --- in case of PF, if atp_flag on PF is yes then we want to filter out supplies of A
3142 -- For A, the following condition will be true only if ATP_FLAG on PF is 'N'
3143 --- and therefore we will consider supplies of A. If atp_flag on PF is 'Y"
3144 -- then following condition will be false and we will omit supplies of A
3145 AND DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
3146 AND S.REFRESH_NUMBER > l_refresh_number
3147 AND R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
3148 AND R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
3149 AND S.PLAN_ID = I.PLAN_ID
3150 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
3151 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
3152 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
3153 ---bug 1843471, 2619493
3154 -- 2859130 remove trunc
3155 AND Decode(S.order_type, 30, NVL(S.OLD_Daily_rate,0)* (C.Calendar_date
3156 - TRUNC(S.OLD_First_Unit_Start_date) + 1),
3157 NVL(NVL(S.OLD_FIRM_QUANTITY,S.OLD_NEW_ORDER_QUANTITY),0) ) >
3158 Decode(S.order_type, 30, NVL(S.OLD_qty_completed,0),0)
3159 AND (S.ORDER_TYPE IN (
3160 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
3161 DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
3162 DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
3163 DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
3164 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
3165 DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1) ,
3166 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
3167 DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
3168 DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
3169 DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
3170 DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
3171 DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1) ,
3172 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
3173 DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
3174 OR ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
3175 S.ORDER_TYPE = 5
3176 AND exists (SELECT '1'
3177 FROM MSC_DESIGNATORS
3178 WHERE INVENTORY_ATP_FLAG = 1
3179 AND DESIGNATOR_TYPE = 2
3180 AND DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
3181 AND C.CALENDAR_CODE = l_calendar_code
3182 AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
3183 AND C.SR_INSTANCE_ID = p_instance_id
3184 AND C.CALENDAR_DATE BETWEEN
3185 TRUNC(NVL(S.OLD_FIRM_DATE,S.OLD_NEW_SCHEDULE_DATE))
3186 AND TRUNC(NVL(S.OLD_LAST_UNIT_COMPLETION_DATE,
3187 NVL(S.OLD_FIRM_DATE,S.OLD_NEW_SCHEDULE_DATE)))
3188 AND DECODE(S.OLD_LAST_UNIT_COMPLETION_DATE,
3189 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
3190 AND C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
3191 DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
3192 NULL, C.NEXT_SEQ_NUM, l_sysdate_seq_num -
3193 NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
3194 AND C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(l_sysdate),
3195 28, TRUNC(l_sysdate),
3196 C.NEXT_DATE)
3197 --- filter out non-atpable sub-inventories
3198 AND MSI.plan_id (+) = -1
3199 AND MSI.organization_id (+) = l_organization_id
3200 AND MSI.sr_instance_id (+) = p_instance_id
3201 AND MSI.sub_inventory_code (+) = S.subinventory_code
3202 AND NVL(MSI.inventory_atp_code,1) <> 2
3203 -- filter out non-atpable subinventories
3204 )
3205 )
3206 GROUP BY inventory_item_id, demand_class, sd_date ;
3207
3208 BEGIN
3209 -- Bug 3304390 Disable Trace
3210 -- Deleted Related Code.
3211
3212 ---- select org ids for the instance as we are going to do the summary per organization
3213
3214 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
3215 l_sysdate := sysdate;
3216 l_user_id := FND_GLOBAL.USER_ID;
3217 l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
3218
3219 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
3220 msc_util.msc_log('l_enable_summary_mode := ' || l_enable_summary_mode);
3221
3222 IF l_enable_summary_mode <> 'Y' THEN
3223 msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
3224 RETCODE := G_WARNING;
3225 RETURN;
3226 END IF;
3227
3228 IF l_inv_ctp <> 5 THEN
3229 -- we are not doing ODS ATP so we wont continue
3230 msc_util.msc_log('Not Doing ODS ATP. Will Exit ');
3231 RETCODE := G_WARNING;
3232 RETURN;
3233 END IF;
3234
3235 /* SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0) ---LCID
3236 INTO l_summary_flag, l_refresh_number
3237 from msc_apps_instances
3238 where instance_id = p_instance_id;*/
3239
3240 SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0),apps_lrn ---LCID
3241 INTO l_summary_flag,l_refresh_number,l_apps_lrn ---bug3049003
3242 from msc_apps_instances
3243 where instance_id = p_instance_id;
3244
3245 msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
3246
3247 IF l_summary_flag = 2 THEN
3248 msc_util.msc_log('Another session is running full summary for this instance');
3249 RETCODE := G_ERROR;
3250 RETURN;
3251 ELSIF (NVL(l_summary_flag, 0) = 2 ) THEN
3252 msc_util.msc_log('Partial summary of tables can be done only after complete summary has been run successfuly');
3253 RETCODE := G_ERROR;
3254 RETURN;
3255 END IF;
3256
3257 /*SELECT sr_tp_id
3258 BULK COLLECT INTO l_org_ids
3259 FROM msc_trading_partners
3260 WHERE sr_instance_id = p_instance_id and partner_type = 3;*/
3261
3262
3263 SELECT ORGANIZATION_ID ---bug3049003
3264 BULK COLLECT INTO l_org_ids
3265 FROM msc_instance_orgs
3266 WHERE sr_instance_id = p_instance_id
3267 and org_lrn=l_apps_lrn
3268 and enabled_flag=1;
3269
3270 msc_util.msc_log(' org count := ' || l_org_ids.count);
3271
3272 -- Update summary record per organization
3273 FOR i in 1..l_org_ids.count LOOP
3274 l_organization_id := l_org_ids(i);
3275 msc_util.msc_log('processing org '|| i ||' := '||l_organization_id);
3276
3277 MSC_ATP_PROC.get_org_default_info ( p_instance_id,
3278 l_organization_id,
3279 l_default_atp_rule_id,
3280 l_calendar_code,
3281 l_calendar_exception_set_id,
3282 l_default_demand_class,
3283 l_org_code);
3284
3285 msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
3286 msc_util.msc_log('l_calendar_exception_set_id := ' || l_calendar_exception_set_id);
3287 msc_util.msc_log('l_default_atp_rule_id := ' || l_default_atp_rule_id);
3288 msc_util.msc_log('l_default_demand_class := ' || l_default_demand_class);
3289
3290 BEGIN
3291 SELECT cal.next_seq_num
3292 INTO l_sysdate_seq_num
3293 FROM msc_calendar_dates cal
3294 WHERE cal.exception_set_id = l_calendar_exception_set_id
3295 AND cal.calendar_code = l_calendar_code
3296 AND cal.calendar_date = TRUNC(l_sysdate)
3297 AND cal.sr_instance_id = p_instance_id ;
3298 EXCEPTION
3299 WHEN OTHERS THEN
3300 null;
3301 END;
3302
3303 OPEN C_NET_SUPPLY_DEMAND (l_refresh_number,
3304 p_instance_id,
3305 l_organization_id,
3306 l_default_atp_rule_id,
3307 l_sysdate_seq_num,
3308 l_calendar_code,
3309 l_default_demand_class,
3310 l_calendar_exception_set_id);
3311
3312 msc_util.msc_log('after opening cursor C_NET_SUPPLY_DEMAND');
3313
3314 LOOP
3315 FETCH C_NET_SUPPLY_DEMAND INTO
3316 l_inventory_item_id,
3317 l_demand_class,
3318 l_sd_date,
3319 l_sd_qty;
3320
3321 EXIT WHEN C_NET_SUPPLY_DEMAND%NOTFOUND;
3322
3323 msc_util.msc_log('l_demand_class := ' || l_demand_class);
3324 msc_util.msc_log('l_sd_date := ' || l_sd_date);
3325 msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
3326 msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
3327
3328 --- With 9i the entire set can be accomplished in one MERGE statement.
3329 --- Try to update record first and then
3330 UPDATE MSC_ATP_SUMMARY_SD
3331 SET sd_qty = sd_qty + l_sd_qty, -- APPLY THE DELTA
3332 last_update_date = l_sysdate,
3333 last_updated_by = l_user_id
3334 WHERE plan_id = -1
3335 AND sr_instance_id = p_instance_id
3336 AND organization_id = l_organization_id
3337 AND inventory_item_id = l_inventory_item_id
3338 AND demand_class = l_demand_class
3339 AND trunc(sd_date) = trunc(l_sd_date);
3340 --COMMIT; 5078448
3341
3342 --- if not found insert it.
3343 IF (SQL%NOTFOUND) THEN
3344 --- Insert the new record
3345 BEGIN
3346 INSERT INTO MSC_ATP_SUMMARY_SD
3347 (plan_id,
3348 sr_instance_id,
3349 organization_id,
3350 inventory_item_id,
3351 demand_class,
3352 sd_date,
3353 sd_qty,
3354 last_update_date,
3355 last_updated_by,
3356 creation_date,
3357 created_by)
3358 VALUES (-1, p_instance_id, l_organization_id,
3359 l_inventory_item_id, l_demand_class, trunc(l_sd_date),
3360 l_sd_qty, l_sysdate, l_user_id ,
3361 l_sysdate, l_user_id
3362 );
3363 --COMMIT; 5078448
3364 EXCEPTION
3365 -- If a record has already been inserted by another process
3366 -- If insert fails then update.
3367 WHEN DUP_VAL_ON_INDEX THEN
3368 -- Update the record.
3369 UPDATE MSC_ATP_SUMMARY_SD
3370 SET sd_qty = sd_qty + l_sd_qty, -- The value is a DELTA
3371 last_update_date = l_sysdate,
3372 last_updated_by = l_user_id
3373 WHERE plan_id = -1
3374 AND sr_instance_id = p_instance_id
3375 AND organization_id = l_organization_id
3376 AND inventory_item_id = l_inventory_item_id
3377 AND demand_class = l_demand_class
3378 AND trunc(sd_date) = trunc(l_sd_date);
3379
3380 --COMMIT; 5078448
3381 END;
3382 END IF;
3383 COMMIT; --5078448
3384
3385 END LOOP;
3386
3387 CLOSE C_NET_SUPPLY_DEMAND;
3388
3389 END LOOP;
3390
3391 -- TAke care of OUT parameters
3392 ERRBUF := null;
3393 RETCODE := G_SUCCESS;
3394
3395 EXCEPTION
3396 WHEN OTHERS THEN
3397
3398 IF (C_NET_SUPPLY_DEMAND%ISOPEN) THEN
3399 CLOSE C_NET_SUPPLY_DEMAND;
3400 END IF;
3401 --- update summary flag in msc_apps_instances so that summary not available to use
3402 update msc_apps_instances
3403 set summary_flag = 1
3404 where instance_id = p_instance_id;
3405 msc_util.msc_log('An error occured while running net change on Sales Orders');
3406 msc_util.msc_log('Complete refresh would need to be run to activate Summary ATP');
3407
3408 msc_util.msc_log('Inside main exception');
3409 msc_util.msc_log(sqlerrm);
3410 ERRBUF := sqlerrm;
3411 RETCODE := G_ERROR;
3412
3413 END LOAD_NET_SD;
3414
3415
3416 PROCEDURE CREATE_PLAN_PARTITIONS( p_plan_id IN NUMBER,
3417 p_applsys_schema IN VARCHAR2,
3418 p_share_partition IN VARCHAR2,
3419 p_owner IN VARCHAR2,
3420 p_ret_code OUT NoCopy NUMBER,
3421 p_err_msg OUT NoCopy VARCHAR2)
3422 AS
3423 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3424 'ATP_SUMMARY_SD',
3425 'ATP_SUMMARY_RES',
3426 'ATP_SUMMARY_SUP');
3427 i NUMBER;
3428 l_partition_name VARCHAR2(30);
3429 l_name VARCHAR2(30);
3430 l_split_partition VARCHAR2(30);
3431 l_summary_flag varchar2(30);
3432 l_plan_id number;
3433 l_higher_plan number;
3434 l_sql_stmt varchar2(1000);
3435 l_table_name varchar2(30);
3436
3437 CURSOR C_PLAN IS
3438 SELECT plan_id
3439 FROM msc_plans
3440 WHERE plan_id > p_plan_id
3441 AND NVL(SUMMARY_FLAG, 0) <> 0
3442 ORDER BY plan_id;
3443
3444 BEGIN
3445 msc_util.msc_log('p_plan_id := ' || p_plan_id);
3446 msc_util.msc_log('p_applsys_schema := ' || p_applsys_schema);
3447 msc_util.msc_log('p_share_partition := ' || p_share_partition);
3448 msc_util.msc_log('p_owner := ' || p_owner);
3449
3450 p_ret_code := G_SUCCESS;
3451 p_err_msg := null;
3452
3453 For i in 1..atp_summ_tab.COUNT LOOP
3454
3455 IF p_share_partition = 'Y' then
3456 l_partition_name := atp_summ_tab(i) || '_' || MAXVALUE;
3457 l_plan_id := MAXVALUE;
3458 ELSE
3459 l_partition_name := atp_summ_tab(i) || '_' || p_plan_id;
3460 l_plan_id := p_plan_id;
3461 END IF;
3462 l_table_name := 'MSC_' || atp_summ_tab(i);
3463 msc_util.msc_log('table := ' || l_table_name);
3464 msc_util.msc_log('partition_name : '|| l_partition_name);
3465 BEGIN
3466 IF p_share_partition = 'Y' then
3467 BEGIN
3468 SELECT partition_name
3469 INTO l_name
3470 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3471 FROM all_tab_partitions
3472 WHERE table_name = l_table_name
3473 AND table_owner = p_owner
3474 AND partition_name = l_partition_name;
3475
3476 msc_util.msc_log('found partition_name : '|| l_name);
3477 EXCEPTION
3478 WHEN no_data_found THEN
3479 l_summary_flag := 0;
3480 msc_util.msc_log('before create partition_name : '|| l_partition_name);
3481 END;
3482 ELSE
3483 SELECT NVL(summary_flag, 0)
3484 INTO l_summary_flag
3485 FROM msc_plans
3486 WHERE plan_id = p_plan_id;
3487 END IF;
3488
3489 msc_util.msc_log('summary_flag for plan : '|| p_plan_id || ' : '|| l_summary_flag);
3490
3491 IF l_summary_flag <> 0 THEN
3492 msc_util.msc_log('found partition for plan_id : '|| p_plan_id);
3493 p_ret_code := G_SUCCESS;
3494 p_err_msg := null;
3495 RETURN;
3496 ELSIF l_summary_flag = 0 THEN
3497 msc_util.msc_log('l_plan_id:= ' || l_plan_id);
3498
3499 OPEN C_PLAN;
3500 FETCH C_PLAN INTO l_higher_plan;
3501 msc_util.msc_log('l_higher_plan : ' || l_higher_plan);
3502
3503 IF C_PLAN%NOTFOUND THEN
3504 l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3505 || l_partition_name
3506 || ' VALUES LESS THAN ('
3507 || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3508 || ')';
3509 ELSE -- IF C_PLAN%NOTFOUND THEN
3510
3511 l_split_partition := atp_summ_tab(i) || '_' || to_char(l_higher_plan);
3512
3513 l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3514 || l_split_partition || ' AT ( -1, ' || to_char(l_plan_id) || ')'
3515 || ' INTO ( PARTITION ' || l_partition_name || ','
3516 || ' PARTITION ' || l_split_partition || ')';
3517 END IF; -- C_PLAN%NOTFOUND THEN
3518
3519 msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3520 CLOSE C_PLAN;
3521
3522 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
3523 APPLICATION_SHORT_NAME => 'MSC',
3524 STATEMENT_TYPE => ad_ddl.alter_table,
3525 STATEMENT => l_sql_stmt,
3526 OBJECT_NAME => l_table_name);
3527 msc_util.msc_log('Create Partition successful');
3528 END IF; -- l_summary_flag <> 0 THEN
3529 EXCEPTION
3530 WHEN no_data_found THEN
3531 msc_util.msc_log('Plan Not Found : ' || p_plan_id );
3532 p_ret_code := G_ERROR;
3533 p_err_msg := sqlerrm;
3534 RETURN;
3535 END;
3536
3537 END LOOP;
3538
3539 EXCEPTION
3540 WHEN OTHERS THEN
3541 msc_util.msc_log('In exception of CREATE_PLAN_PARTITIONS');
3542 p_ret_code := G_ERROR;
3543 p_err_msg := sqlerrm;
3544 END CREATE_PLAN_PARTITIONS;
3545
3546
3547 PROCEDURE CREATE_INST_PARTITIONS(p_instance_id IN NUMBER,
3548 p_applsys_schema IN VARCHAR2,
3549 p_owner IN VARCHAR2,
3550 p_ret_code OUT NoCopy NUMBER,
3551 p_err_msg OUT NoCopy VARCHAR2)
3552 AS
3553 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3554 'ATP_SUMMARY_SD',
3555 'ATP_SUMMARY_SO');
3556 i NUMBER;
3557 l_partition_name VARCHAR2(30);
3558 l_split_partition VARCHAR2(30);
3559 l_summary_flag varchar2(30);
3560 l_higher_instance number;
3561 l_sql_stmt varchar2(1000);
3562 l_table_name varchar2(30);
3563
3564 CURSOR C_INST IS
3565 SELECT instance_id
3566 FROM msc_apps_instances
3567 WHERE instance_id > p_instance_id
3568 AND NVL(summary_flag, 0) <> 0
3569 ORDER BY instance_id;
3570
3571 BEGIN
3572 msc_util.msc_log('p_instance_id := ' || p_instance_id);
3573 msc_util.msc_log('p_applsys_schema := ' || p_applsys_schema);
3574 msc_util.msc_log('p_owner := ' || p_owner);
3575
3576 p_ret_code := G_SUCCESS;
3577 p_err_msg := null;
3578
3579 For i in 1..atp_summ_tab.COUNT LOOP
3580
3581 l_partition_name := atp_summ_tab(i) || '__' || p_instance_id;
3582
3583 l_table_name := 'MSC_' || atp_summ_tab(i);
3584 msc_util.msc_log('table := ' || l_table_name);
3585 msc_util.msc_log('partition_name : '|| l_partition_name);
3586 BEGIN
3587 SELECT NVL(summary_flag, 0)
3588 INTO l_summary_flag
3589 FROM msc_apps_instances
3590 WHERE instance_id = p_instance_id;
3591
3592 msc_util.msc_log('summary_flag for instance : '|| p_instance_id || ' : '|| l_summary_flag);
3593
3594 IF l_summary_flag <> 0 THEN
3595 msc_util.msc_log('found partition for instance_id : '|| p_instance_id);
3596 p_ret_code := G_SUCCESS;
3597 p_err_msg := null;
3598 RETURN;
3599 ELSIF l_summary_flag = 0 THEN
3600 msc_util.msc_log('p_instance_id : ' || p_instance_id);
3601
3602 OPEN C_INST;
3603 FETCH C_INST INTO l_higher_instance;
3604
3605 IF C_INST%NOTFOUND THEN
3606 l_split_partition := atp_summ_tab(i) || '_0';
3607 ELSE -- IF C_INST%NOTFOUND THEN
3608 l_split_partition := atp_summ_tab(i) || '__' || l_higher_instance;
3609 END IF; -- C_INST%NOTFOUND THEN
3610
3611 CLOSE C_INST;
3612
3613 IF l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3614 l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3615 || l_split_partition || ' AT ( '
3616 || to_char(p_instance_id +1) || ')'
3617 || ' INTO ( PARTITION ' || l_partition_name || ','
3618 || ' PARTITION ' || l_split_partition || ')';
3619 ELSIF l_table_name = 'MSC_ATP_SUMMARY_SD' THEN
3620 l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3621 || l_split_partition || ' AT ( -1, '
3622 || to_char(p_instance_id +1) || ')'
3623 || ' INTO ( PARTITION ' || l_partition_name || ','
3624 || ' PARTITION ' ||l_split_partition || ')';
3625 END IF; -- l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3626 msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3627 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
3628 APPLICATION_SHORT_NAME => 'MSC',
3629 STATEMENT_TYPE => ad_ddl.alter_table,
3630 STATEMENT => l_sql_stmt,
3631 OBJECT_NAME => l_table_name);
3632 msc_util.msc_log('Create Partition successful');
3633 END IF; -- l_summary_flag <> 0 THEN
3634 EXCEPTION
3635 WHEN no_data_found THEN
3636 msc_util.msc_log('Instance Not Found : ' || p_instance_id );
3637 p_ret_code := G_ERROR;
3638 p_err_msg := sqlerrm;
3639 RETURN;
3640 END;
3641
3642 END LOOP;
3643
3644 EXCEPTION
3645 WHEN OTHERS THEN
3646 msc_util.msc_log('In exception of CREATE_INST_PARTITIONS');
3647 p_ret_code := G_ERROR;
3648 p_err_msg := sqlerrm;
3649 END CREATE_INST_PARTITIONS;
3650
3651
3652
3653 PROCEDURE CREATE_PARTITIONS( ERRBUF OUT NoCopy VARCHAR2,
3654 RETCODE OUT NoCopy NUMBER)
3655 AS
3656
3657 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3658 'ATP_SUMMARY_SO',
3659 'ATP_SUMMARY_SD',
3660 'ATP_SUMMARY_RES',
3661 'ATP_SUMMARY_SUP',
3662 'ALLOC_DEMANDS',
3663 'ALLOC_SUPPLIES',
3664 -- CTO ODR Simplified Pegging
3665 'ATP_PEGGING');
3666 i NUMBER;
3667 j NUMBER;
3668 l_partition_name VARCHAR2(30);
3669 l_split_partition VARCHAR2(30);
3670 l_summary_flag varchar2(30);
3671 l_higher_instance number;
3672 l_sql_stmt varchar2(1000);
3673 l_table_name varchar2(30);
3674 INSTANCE_IDS MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
3675 PLAN_IDS MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
3676 l_applsys_schema varchar2(10);
3677 l_msc_schema VARCHAR2(30);
3678 l_retval BOOLEAN;
3679 dummy1 varchar2(10);
3680 dummy2 varchar2(10);
3681 l_count number;
3682 l_share_partition varchar2(1);
3683 l_plan_id number;
3684 -- rajjain 12/20/2002
3685 l_spid VARCHAR2(12);
3686
3687
3688 BEGIN
3689 -- Bug 3304390 Disable Trace
3690 -- Deleted Related Code
3691
3692 l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
3693 SELECT a.oracle_username
3694 INTO l_msc_schema
3695 FROM FND_ORACLE_USERID a,
3696 FND_PRODUCT_INSTALLATIONS b
3697 WHERE a.oracle_id = b.oracle_id
3698 AND b.application_id = 724;
3699
3700
3701 RETCODE := G_SUCCESS;
3702 ERRBUF := null;
3703
3704 BEGIN
3705 SELECT INSTANCE_ID
3706 BULK COLLECT INTO INSTANCE_IDS
3707 ---bug 2389523: use msc_ins_partitions instead of
3708 -- msc_apps_instances to look for existing instance partitions
3709 --FROM MSC_APPS_INSTANCES
3710 FROM MSC_INST_PARTITIONS
3711 ORDER BY INSTANCE_ID;
3712 END;
3713
3714 --- create Instance partitions
3715
3716 FOR j in 1..INSTANCE_IDS.COUNT LOOP
3717
3718 msc_util.msc_log('j := ' || j);
3719 For i in 1..2 LOOP --- loop for only first two enteries of the atp_summ_tab array
3720
3721 l_partition_name := atp_summ_tab(i) || '__' || INSTANCE_IDS(j);
3722 l_table_name := 'MSC_' || atp_summ_tab(i);
3723 l_split_partition := atp_summ_tab(i) || '_0';
3724 msc_util.msc_log('table := ' || l_table_name);
3725 msc_util.msc_log('partition_name : '|| l_partition_name);
3726 BEGIN
3727 BEGIN
3728 SELECT count(*)
3729 INTO l_count
3730 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3731 --FROM DBA_TAB_PARTITIONS
3732 FROM ALL_TAB_PARTITIONS
3733 WHERE TABLE_NAME = l_table_name
3734 AND PARTITION_NAME = l_partition_name
3735 AND table_owner = l_msc_schema;
3736 EXCEPTION
3737 WHEN OTHERS THEN
3738 msc_util.msc_log('Inside Exception');
3739 l_count := 1;
3740 END;
3741 msc_util.msc_log('l_count := ' || l_count);
3742 IF l_count = 0 THEN
3743 ---partition doesn't exist
3744
3745
3746 IF l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3747 l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3748 || l_split_partition || ' AT ( '
3749 || to_char(instance_ids(j) +1) || ')'
3750 || ' INTO ( PARTITION ' || l_partition_name || ','
3751 || ' PARTITION ' || l_split_partition || ')';
3752 ELSIF l_table_name = 'MSC_ATP_SUMMARY_SD' THEN
3753 l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3754 || l_split_partition || ' AT ( -1, '
3755 || to_char(instance_ids(j) +1) || ')'
3756 || ' INTO ( PARTITION ' || l_partition_name || ','
3757 || ' PARTITION ' ||l_split_partition || ')';
3758 END IF; -- l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3759 msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3760 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3761 APPLICATION_SHORT_NAME => 'MSC',
3762 STATEMENT_TYPE => ad_ddl.alter_table,
3763 STATEMENT => l_sql_stmt,
3764 OBJECT_NAME => l_table_name);
3765 msc_util.msc_log('Create Partition successful');
3766 ELSE
3767 msc_util.msc_log('Partition for instance ' || instance_ids(j) || ' already exists');
3768 END IF;
3769 END;
3770
3771 END LOOP;
3772 END LOOP;
3773
3774 l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
3775 msc_util.msc_log('l_share_partition := ' || l_share_partition);
3776
3777 IF l_share_partition = 'Y' then
3778 msc_util.msc_log('Share partition is on');
3779 ---first we check if _999999 partition exists on MSC_SYSTEM_ITEMS or not.
3780 ---1) If it exists then the _999999 partition might or might not exist om
3781 --- the atp summary tables. In this case we check and create it if it doesn't exist
3782 ---2) If partition on msc_system_items doesn't exist then that means customer is running
3783 --- create APS partition proram for the first time. So we let create_partition_pvt
3784 --- in MSCPRPRB.pls create the patitions
3785 l_table_name := 'MSC_SYSTEM_ITEMS';
3786 l_partition_name := 'SYSTEM_ITEMS' || '_' || MAXVALUE;
3787
3788 BEGIN
3789 select count(*)
3790 into l_count
3791 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3792 --from dba_tab_partitions
3793 from ALL_tab_partitions
3794 where table_name = l_table_name
3795 and table_owner = l_msc_schema
3796 and partition_name = l_partition_name;
3797 EXCEPTION
3798 WHEN OTHERS THEN
3799 l_count := 1;
3800 END;
3801 msc_util.msc_log('Count of partition om msc_system_items := ' || l_count);
3802 IF l_count > 0 THEN --- patiton on msc_system items exist
3803
3804
3805
3806 For i in 2..atp_summ_tab.COUNT LOOP
3807
3808 l_partition_name := atp_summ_tab(i) || '_' || MAXVALUE;
3809 l_plan_id := MAXVALUE;
3810 l_table_name := 'MSC_' || atp_summ_tab(i);
3811 msc_util.msc_log('table := ' || l_table_name);
3812 msc_util.msc_log('partition_name : '|| l_partition_name);
3813
3814 BEGIN
3815 select count(*)
3816 into l_count
3817 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3818 --from dba_tab_partitions
3819 from all_tab_partitions
3820 where table_name = l_table_name
3821 and table_owner = l_msc_schema
3822 and partition_name = l_partition_name;
3823 EXCEPTION
3824 WHEN OTHERS THEN
3825 l_count := 1;
3826 END;
3827 IF (l_count = 0) THEN
3828
3829 l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3830 || l_partition_name
3831 || ' VALUES LESS THAN ('
3832 || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3833 || ')';
3834 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3835 APPLICATION_SHORT_NAME => 'MSC',
3836 STATEMENT_TYPE => ad_ddl.alter_table,
3837 STATEMENT => l_sql_stmt,
3838 OBJECT_NAME => atp_summ_tab(i));
3839
3840 msc_util.msc_log('Create Partition successful');
3841 ELSE
3842 msc_util.msc_log('Plan partition for plan ' || l_plan_id || ' already exists');
3843 END IF; -- l_summary_flag <> 0 THEN
3844
3845 END LOOP; --- For i in 2..atp_summ_tab.COUNT LOOP
3846 ELSE
3847 msc_util.msc_log(' No partition on msc_system_items exist.');
3848 msc_util.msc_log('Partitions will be created by the main program');
3849 END IF; -- if l_count > 0
3850
3851 ELSE --- IF l_share_partition = 'Y' then
3852 --- create plan partitions
3853 --- select plan_ids
3854 BEGIN
3855 select plan_id
3856 bulk collect into plan_ids
3857 --bug 2389523: use msc_plan_partitions instead of msc_plans
3858 --from msc_plans
3859 from msc_plan_partitions
3860 order by plan_id;
3861
3862 END;
3863
3864 msc_util.msc_log('plan count := ' || plan_ids.count);
3865 FOR j in 1..plan_ids.count LOOP
3866 msc_util.msc_log('j := ' || j );
3867 msc_util.msc_log('plan_ids := ' || plan_ids(j));
3868
3869 For i in 2..atp_summ_tab.COUNT LOOP
3870
3871 l_partition_name := atp_summ_tab(i) || '_' || ABS(plan_ids(j));
3872 l_plan_id := plan_ids(j);
3873 l_table_name := 'MSC_' || atp_summ_tab(i);
3874 msc_util.msc_log('table := ' || l_table_name);
3875 msc_util.msc_log('partition_name : '|| l_partition_name);
3876
3877 BEGIN
3878 select count(*)
3879 into l_count
3880 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3881 --from dba_tab_partitions
3882 from all_tab_partitions
3883 where table_name = l_table_name
3884 and table_owner = l_msc_schema
3885 and partition_name = l_partition_name;
3886 EXCEPTION
3887 WHEN OTHERS THEN
3888 l_count := 1;
3889 END;
3890 IF (l_count = 0) AND (l_plan_id <> -1) THEN
3891
3892 l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3893 || l_partition_name
3894 || ' VALUES LESS THAN ('
3895 || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3896 || ')';
3897 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3898 APPLICATION_SHORT_NAME => 'MSC',
3899 STATEMENT_TYPE => ad_ddl.alter_table,
3900 STATEMENT => l_sql_stmt,
3901 OBJECT_NAME => atp_summ_tab(i));
3902
3903 msc_util.msc_log('Create Partition successful');
3904 ELSE
3905 msc_util.msc_log('Plan partition for plan ' || l_plan_id || ' already exists');
3906 END IF; -- l_summary_flag <> 0 THEN
3907
3908 END LOOP;
3909 END LOOP;
3910 END IF; -- IF l_share_partition = 'Y' then
3911 msc_util.msc_log('After Create Partitions');
3912
3913 EXCEPTION
3914 WHEN OTHERS THEN
3915 msc_util.msc_log('In exception of CREATE_PARTITIONS');
3916 msc_util.msc_log('sqlerrm := ' || sqlerrm);
3917 RETCODE := G_ERROR;
3918 ERRBUF := sqlerrm;
3919 END CREATE_PARTITIONS;
3920
3921 PROCEDURE LAUNCH_CONC_PROG(ERRBUF IN OUT NoCopy VARCHAR2,
3922 RETCODE IN OUT NoCopy NUMBER,
3923 P_INSTANCE_ID IN NUMBER,
3924 P_COLLECT_TYPE IN NUMBER,
3925 REFRESH_SO IN NUMBER,
3926 REFRESH_SD IN NUMBER)
3927 AS
3928 -- rajjain 12/20/2002
3929 l_spid VARCHAR2(12);
3930
3931 BEGIN
3932 -- Bug 3304390 Disable Trace
3933 -- Deleted Related Code.
3934
3935 IF P_COLLECT_TYPE = 1 THEN ---- full refresh
3936
3937 IF REFRESH_SO = 1 THEN -- full refresh S/O and S/D
3938
3939 MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 3);
3940
3941 ELSE
3942
3943 MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 2); --full S/D
3944 IF RETCODE <> G_SUCCESS THEN
3945 RETURN;
3946 END IF;
3947 MSC_POST_PRO.LOAD_NET_SO(ERRBUF, RETCODE, P_INSTANCE_ID); -- Net S/O
3948
3949 END IF;
3950
3951 ELSIF P_COLLECT_TYPE = 2 THEN ---- Net change Refresh
3952
3953 MSC_POST_PRO.LOAD_NET_SO(ERRBUF, RETCODE, P_INSTANCE_ID); -- Net SO
3954 IF RETCODE <> G_SUCCESS THEN
3955 RETURN;
3956 END IF;
3957 MSC_POST_PRO.LOAD_NET_SD(ERRBUF, RETCODE, P_INSTANCE_ID); -- Net SD
3958
3959 ELSIF P_COLLECT_TYPE = 3 THEN ---TARGETED
3960
3961 IF REFRESH_SO = 1 AND REFRESH_SD = 1 THEN
3962
3963 MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 3); -- full S/O, S/D
3964
3965 ELSIF REFRESH_SO = 1 THEN
3966
3967 MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 1); -- full S/O
3968
3969 ELSIF REFRESH_SD = 1 THEN
3970
3971 MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 2); -- full S/D
3972
3973 END IF;
3974 END IF;
3975 IF RETCODE <> G_SUCCESS THEN
3976 RETURN;
3977 END IF;
3978 --- update the summary refresh number with refresh number
3979 --- Summary refresh number is used by net change/targeted refresh.
3980 --- Net Chnage/Targeted refresh is done only for those
3981 --- Sales orders or supply/demands where refresh number is greater than summary refresh number
3982 --- This is done this way to avoid summarizing in partial refresh if it is run erroneously after
3983 --- full refresh by user.
3984 UPDATE msc_apps_instances
3985 SET summary_refresh_number = LCID
3986 WHERE instance_id = p_instance_id;
3987
3988 commit; --bug3049003
3989
3990 END LAUNCH_CONC_PROG;
3991
3992
3993 -- 2/14/2002 ngoel, added this procedure for cleaning pre-allocating demands and supplies temp tables
3994 -- while using pegging from the plan in case allocation method profile is set to "Use Planning Output".
3995
3996 -- 6/19/2002 ngoel, modified this procedure to drop dynamically created temp tables
3997 -- Added input parameters to drop newly added temp table MSC_ALLOC_TEMP_ as well for forecast at PF
3998 PROCEDURE clean_temp_tables(
3999 p_applsys_schema IN varchar2,
4000 p_plan_id IN NUMBER,
4001 p_plan_id2 IN NUMBER,
4002 p_demand_priority IN VARCHAR2)
4003 IS
4004 l_sql_stmt VARCHAR2(1000);
4005 BEGIN
4006 -- Drop newly added temp table for forecast at PF as well
4007 IF p_demand_priority = 'Y' THEN
4008 l_sql_stmt := 'DROP TABLE MSC_ALLOC_TEMP_' || to_char(p_plan_id2);
4009
4010 BEGIN
4011 msc_util.msc_log(l_sql_stmt);
4012 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4013 APPLICATION_SHORT_NAME => 'MSC',
4014 STATEMENT_TYPE => ad_ddl.drop_table,
4015 STATEMENT => l_sql_stmt,
4016 OBJECT_NAME => 'MSC_ALLOC_TEMP_' || to_char(p_plan_id2));
4017 EXCEPTION
4018 WHEN OTHERS THEN
4019 msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4020 msc_util.msc_log(l_sql_stmt || ' failed');
4021 END;
4022 END IF;
4023
4024 IF p_plan_id = p_plan_id2 THEN -- Means share plan partition is No
4025 l_sql_stmt := 'DROP TABLE MSC_TEMP_ALLOC_DEM_' || to_char(p_plan_id);
4026
4027 BEGIN
4028 msc_util.msc_log(l_sql_stmt);
4029 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4030 APPLICATION_SHORT_NAME => 'MSC',
4031 STATEMENT_TYPE => ad_ddl.drop_table,
4032 STATEMENT => l_sql_stmt,
4033 OBJECT_NAME => 'MSC_TEMP_ALLOC_DEM_' || to_char(p_plan_id));
4034 EXCEPTION
4035 WHEN OTHERS THEN
4036 msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4037 msc_util.msc_log(l_sql_stmt || ' failed');
4038 END;
4039
4040 l_sql_stmt := 'DROP TABLE MSC_TEMP_ALLOC_SUP_' || to_char(p_plan_id);
4041
4042 BEGIN
4043 msc_util.msc_log(l_sql_stmt);
4044 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4045 APPLICATION_SHORT_NAME => 'MSC',
4046 STATEMENT_TYPE => ad_ddl.drop_table,
4047 STATEMENT => l_sql_stmt,
4048 OBJECT_NAME => 'MSC_TEMP_ALLOC_SUP_' || to_char(p_plan_id));
4049 EXCEPTION
4050 WHEN OTHERS THEN
4051 msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4052 msc_util.msc_log(l_sql_stmt || ' failed');
4053 END;
4054 END IF;
4055 END clean_temp_tables;
4056
4057
4058 -- 2/14/2002 ngoel, added this procedure for pre-allocating demands and supplies using
4059 -- pegging from the plan in case allocation method profile is set to "Demand Priority".
4060
4061 -- 6/19/2002 ngoel, modified to use dynamically created temp tables instead of pre-seeded temp tables
4062 -- in case profile "MSC: Share Plan Partition" is "No". This was needed to enable multiple plan support.
4063
4064 PROCEDURE post_plan_allocation(
4065 ERRBUF OUT NoCopy VARCHAR2,
4066 RETCODE OUT NoCopy NUMBER,
4067 p_plan_id IN NUMBER)
4068 IS
4069
4070 G_ERROR NUMBER := 1;
4071 G_SUCCESS NUMBER := 0;
4072 MAXVALUE CONSTANT NUMBER := 999999;
4073
4074 l_retval BOOLEAN;
4075 l_sysdate DATE;
4076 i NUMBER;
4077 l_alloc_method NUMBER;
4078 l_class_hrchy NUMBER;
4079 l_count NUMBER;
4080 l_inv_ctp NUMBER;
4081 l_plan_id NUMBER;
4082 l_ret_code NUMBER;
4083 l_summary_flag NUMBER;
4084 l_user_id NUMBER;
4085 dummy1 VARCHAR2(10);
4086 dummy2 VARCHAR2(10);
4087 l_alloc_atp VARCHAR2(1);
4088 l_applsys_schema VARCHAR2(10);
4089 l_err_msg VARCHAR2(1000);
4090 l_ind_tbspace VARCHAR2(30);
4091 l_insert_stmt VARCHAR2(8000); -- ssurendr: increased the string length
4092 l_msc_schema VARCHAR2(30);
4093 l_other_dc VARCHAR2(30) := '-1';
4094 l_partition_name VARCHAR2(30);
4095 l_share_partition VARCHAR2(1);
4096 l_sql_stmt VARCHAR2(300);
4097 l_sql_stmt_1 VARCHAR2(8000);
4098 l_table_name VARCHAR2(30);
4099 l_tbspace VARCHAR2(30);
4100 l_temp_table VARCHAR2(30);
4101 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
4102 'ALLOC_DEMANDS',
4103 'ALLOC_SUPPLIES');
4104 -- Bug 2516506
4105 l_plan_name varchar2(10);
4106
4107 -- 2566795
4108 cur_handler NUMBER;
4109 rows_processed NUMBER;
4110 l_hash_size NUMBER := -1;
4111 l_sort_size NUMBER := -1;
4112 l_parallel_degree NUMBER := 1;
4113
4114 -- project atp
4115 l_excess_supply_by_dc varchar2(1);
4116
4117 BEGIN
4118 msc_util.msc_log('Begin procedure post_plan_allocation');
4119
4120 l_inv_ctp := FND_PROFILE.value('INV_CTP');
4121 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
4122
4123 IF l_inv_ctp <> 4 THEN
4124 -- we are not doing PDS ATP so we wont continue
4125 msc_util.msc_log('Not Doing PDS ATP. Will Exit ');
4126 RETCODE := G_ERROR;
4127 RETURN;
4128 END IF;
4129
4130 l_alloc_atp := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
4131 msc_util.msc_log('l_alloc_atp := ' || l_alloc_atp);
4132
4133 IF l_alloc_atp <> 'Y' THEN
4134 -- we are not doing Allocated ATP so we wont continue
4135 msc_util.msc_log('Not Doing Allocated ATP. Will Exit ');
4136 RETCODE := G_ERROR;
4137 RETURN;
4138 END IF;
4139
4140 l_class_hrchy := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
4141 msc_util.msc_log('l_class_hrchy := ' || l_class_hrchy);
4142
4143 IF l_class_hrchy <> 1 THEN
4144 -- we are not doing Demand Class based AATP so we wont continue
4145 msc_util.msc_log('Not Doing Demand Class based AATP. Will Exit ');
4146 RETCODE := G_ERROR;
4147 RETURN;
4148 END IF;
4149
4150 l_alloc_method := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
4151 msc_util.msc_log('l_alloc_method := ' || l_alloc_method);
4152
4153 IF l_alloc_method <> 1 THEN
4154 -- we are not doing Demand Class based AATP using pegging from planning so we wont continue
4155 msc_util.msc_log('Not Doing Demand Class based AATP using pegging from planning. Will Exit ');
4156 RETCODE := G_ERROR;
4157 RETURN;
4158 END IF;
4159
4160 -- rajjain project atp changes 07/24/2003 begin
4161 l_excess_supply_by_dc := NVL(FND_PROFILE.VALUE('MSC_EXCESS_SUPPLY_BY_DC'), 'N');
4162 msc_util.msc_log('l_excess_supply_by_dc := ' || l_excess_supply_by_dc);
4163
4164 BEGIN
4165 msc_util.msc_log('Calling custom procedure MSC_ATP_CUSTOM.Custom_Pre_Allocation...');
4166 MSC_ATP_CUSTOM.Custom_Pre_Allocation(p_plan_id);
4167 msc_util.msc_log('End MSC_ATP_CUSTOM.Custom_Pre_Allocation.');
4168 EXCEPTION
4169 WHEN OTHERS THEN
4170 msc_util.msc_log('Error in custom procedure call');
4171 msc_util.msc_log('Error Code: '|| sqlerrm);
4172 END;
4173 -- rajjain project atp changes 07/24/2003 end
4174
4175 msc_util.msc_log('begin Loading pre-allocation demand/supply data for plan: ' || p_plan_id);
4176 RETCODE := G_SUCCESS;
4177
4178 l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
4179
4180 msc_util.msc_log('l_share_partition := ' || l_share_partition);
4181
4182 -- Bug 2516506 - select plan name also
4183 -- SELECT NVL(summary_flag,1)
4184 -- INTO l_summary_flag
4185 SELECT NVL(summary_flag,1), compile_designator
4186 INTO l_summary_flag, l_plan_name
4187 FROM msc_plans
4188 WHERE plan_id = p_plan_id;
4189
4190 IF NVL(l_summary_flag,1) = 2 THEN
4191 msc_util.msc_log('Another session is running post-plan allocation program for this plan');
4192 RETCODE := G_ERROR;
4193 RETURN;
4194 END IF;
4195
4196 l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
4197 SELECT a.oracle_username,
4198 sysdate,
4199 FND_GLOBAL.USER_ID
4200 INTO l_msc_schema,
4201 l_sysdate,
4202 l_user_id
4203 FROM fnd_oracle_userid a,
4204 fnd_product_installations b
4205 WHERE a.oracle_id = b.oracle_id
4206 AND b.application_id = 724;
4207
4208 FOR i in 1..atp_summ_tab.count LOOP
4209
4210 l_table_name := 'MSC_' || atp_summ_tab(i);
4211
4212 IF (l_share_partition = 'Y') THEN
4213 l_plan_id := MAXVALUE;
4214 ELSE
4215 l_plan_id := p_plan_id;
4216 END IF;
4217
4218 l_partition_name := atp_summ_tab(i)|| '_' || l_plan_id;
4219 msc_util.msc_log('l_partition_name := ' || l_partition_name);
4220
4221 BEGIN
4222 SELECT count(*)
4223 INTO l_count
4224 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
4225 --FROM dba_tab_partitions
4226 FROM all_tab_partitions
4227 WHERE table_name = l_table_name
4228 AND partition_name = l_partition_name
4229 AND table_owner = l_msc_schema;
4230 EXCEPTION
4231 WHEN OTHERS THEN
4232 msc_util.msc_log('Inside Exception');
4233 l_count := 0;
4234 END;
4235
4236 IF (l_count = 0) THEN
4237 -- Bug 2516506
4238 FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_PLAN_PARTITION_MISSING');
4239 FND_MESSAGE.SET_TOKEN('PLAN_NAME', l_plan_name);
4240 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
4241 msc_util.msc_log(FND_MESSAGE.GET);
4242 RETCODE := G_ERROR;
4243 RETURN;
4244 END IF;
4245 END LOOP;
4246
4247 BEGIN
4248 update msc_plans
4249 set summary_flag = 2
4250 where plan_id = p_plan_id;
4251 commit;
4252 EXCEPTION
4253 WHEN OTHERS THEN
4254 ERRBUF := sqlerrm;
4255 RETCODE := G_ERROR;
4256 RETURN;
4257 END;
4258
4259 msc_util.msc_log('l_share_partition := ' || l_share_partition);
4260
4261 -- performance bug 2566795. dsting: forward port from 1157
4262
4263 BEGIN
4264 SELECT NVL(pre_alloc_hash_size, -1),
4265 NVL(pre_alloc_sort_size, -1),
4266 NVL(pre_alloc_parallel_degree, 1)
4267 INTO l_hash_size,
4268 l_sort_size,
4269 l_parallel_degree
4270 FROM msc_atp_parameters
4271 WHERE rownum = 1;
4272 EXCEPTION
4273 WHEN others THEN
4274 msc_util.msc_log('Error getting performance param: ' || sqlcode || ': ' || sqlerrm);
4275 l_hash_size := -1;
4276 l_sort_size := -1;
4277 l_parallel_degree := 1;
4278 END;
4279
4280 msc_util.msc_log('Hash: ' || l_hash_size || ' Sort: ' || l_sort_size || ' Parallel: ' || l_parallel_degree);
4281
4282 IF NVL(l_hash_size, -1) <> -1 THEN
4283 l_sql_stmt_1 := 'alter session set hash_area_size = ' || to_char(l_hash_size);
4284 msc_util.msc_log('l_sql_stmt : ' || l_sql_stmt_1);
4285 execute immediate l_sql_stmt_1;
4286 END IF;
4287
4288 IF NVL(l_sort_size, -1) <> -1 THEN
4289 l_sql_stmt_1 := 'alter session set sort_area_size = ' || to_char(l_sort_size);
4290 msc_util.msc_log('l_sql_stmt : ' || l_sql_stmt_1);
4291 execute immediate l_sql_stmt_1;
4292 END IF;
4293
4294 IF l_share_partition = 'Y' THEN
4295
4296 msc_util.msc_log('Inside shared partition');
4297
4298 -- first delete the existing data from tables
4299 msc_util.msc_log('before deleteing data from the table');
4300
4301 DELETE MSC_ALLOC_DEMANDS where plan_id = p_plan_id;
4302 msc_util.msc_log('After deleting data from MSC_ALLOC_DEMANDS table');
4303
4304 DELETE MSC_ALLOC_SUPPLIES where plan_id = p_plan_id;
4305 msc_util.msc_log('After deleting data from MSC_ALLOC_SUPPLIES table');
4306
4307 /* --------------------------------------------------------------- */
4308 -- 2566795
4309 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4310 -- to move demand on non-working day to prior working day.
4311
4312 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4313 plan_id,
4314 inventory_item_id,
4315 organization_id,
4316 sr_instance_id,
4317 demand_class,
4318 demand_date,
4319 allocated_quantity,
4320 parent_demand_id,
4321 origination_type,
4322 order_number,
4323 sales_order_line_id,
4324 demand_source_type, --cmro
4325 created_by,
4326 creation_date,
4327 last_updated_by,
4328 last_update_date,
4329 demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
4330 request_date,--bug3263368
4331 --bug3684383 added as in Insert_SD_Into_Details_Temp we need these columns populated
4332 -- to show partner name and location.
4333 customer_id,
4334 ship_to_site_id)
4335 ( -- Bug 3370201
4336 SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4337 -- causing performance issues which in turn causes ORA-01555: snapshot too old
4338 --/*+ use_hash(mv) parallel(mv,' || to_char(l_parallel_degree) || ')
4339 -- full(peg1.d1) full(peg1.d2) full(peg1.peg1) full(peg1.peg2) full(mv) */
4340 -- -- 2859130 full(peg1.cal)
4341 peg1.plan_id,
4342 peg1.inventory_item_id,
4343 peg1.organization_id,
4344 peg1.sr_instance_id,
4345 NVL(mv.demand_class, :def_num),
4346 peg1.demand_date,
4347 SUM(peg1.allocated_quantity) - MIN(peg1.reserved_quantity), --5027568
4348 peg1.demand_id,
4349 peg1.origination_type,
4350 peg1.order_number,
4351 peg1.sales_order_line_id,
4352 peg1.demand_source_type, --cmro
4353 :l_user_id,
4354 :l_sysdate,
4355 :l_user_id,
4356 :l_sysdate,
4357 MIN(peg1.demand_quantity), -- ssurendr 25-NOV-2002: added for alloc w/b
4358 peg1.request_date, --bug3263368
4359 --bug3684383
4360 peg1.customer_id,
4361 peg1.ship_to_site_id
4362 -- min is used to select distinct values as demand_quantity would be
4363 -- repeating for the same demand_id
4364 FROM
4365 -- use inline view so that view parallel hint could be used.
4366 -- msc_demand_pegging_v peg1,
4367 -- 2859130 (SELECT /*+ ordered use_hash(d2 peg2 peg1 d1 tp cal)
4368 (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4369 -- causing performance issues which in turn causes ORA-01555: snapshot too old
4370 --/*+ ordered use_hash(d2 peg2 peg1 tp)
4371 -- parallel(d2,' || to_char(l_parallel_degree) || ')
4372 -- parallel(d1,' || to_char(l_parallel_degree) || ')
4373 -- parallel(peg2,' || to_char(l_parallel_degree) || ')
4374 -- parallel(peg1,' || to_char(l_parallel_degree) || ')*/
4375 -- time_phased_atp
4376 -- parallel(tp,' || to_char(l_parallel_degree) || ')
4377
4378 -- 2859130
4379 -- parallel(cal,' || to_char(l_parallel_degree) || ')
4380 peg2.plan_id,
4381 peg2.inventory_item_id,
4382 peg2.organization_id,
4383 peg2.sr_instance_id,
4384 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4385 NVL(d1.demand_class, :def_num) demand_class,
4386 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4387 2, NVL(d2.PLANNED_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE),
4388 NVL(d2.SCHEDULE_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE))) demand_date,----plan by request date, promise date or schedule date
4389 -- cal.prior_date demand_date, -- 2859130
4390 -- cal.calendar_date demand_date,
4391 peg2.allocated_quantity,
4392 DECODE( d2.origination_type, 30, NVL(d2.reserved_quantity, 0), 0) reserved_quantity, --5027568
4393 d2.demand_id,
4394 d2.origination_type,
4395 --d2.order_number,
4396 -- rajjain 04/25/2003 Bug 2771075
4397 -- For Planned Order Demands We will populate disposition_id
4398 -- in order_number column
4399 decode(d2.origination_type, 1, to_char(d2.disposition_id), d2.order_number) order_number,
4400 d2.sales_order_line_id,
4401 d2.demand_source_type, --cmro
4402 decode(d2.origination_type, 4, d2.daily_demand_rate,
4403 d2.using_requirement_quantity) demand_quantity , -- rajjain 02/06/2003 Bug 2782882
4404 decode(d2.order_date_type_code,2,d2.request_date,
4405 d2.request_ship_date)request_date, --bug3263368
4406 --peg2.demand_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
4407 --bug3684383
4408 d2.customer_id,
4409 d2.ship_to_site_id
4410 FROM msc_demands d2,
4411 msc_full_pegging peg2,
4412 msc_full_pegging peg1 ,
4413 msc_demands d1
4414 -- time_phased_atp
4415 -- msc_trading_partners tp
4416 -- 2859130
4417 -- msc_calendar_dates cal
4418 WHERE peg2.plan_id = peg1.plan_id
4419 AND peg2.end_pegging_id = peg1.pegging_id
4420 AND peg2.sr_instance_id = peg1.sr_instance_id
4421 AND d1.plan_id = peg1.plan_id
4422 AND d1.demand_id = peg1.demand_id
4423 AND d1.sr_instance_id = peg1.sr_instance_id
4424 AND d2.plan_id = peg2.plan_id
4425 AND d2.demand_id = peg2.demand_id
4426 AND d2.sr_instance_id = peg2.sr_instance_id
4427 AND d2.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)
4428 -- time_phased_atp
4429 -- AND tp.sr_tp_id = peg2.organization_id
4430 -- AND tp.partner_type = 3 -- bug2646304
4431 -- AND tp.sr_instance_id = peg2.sr_instance_id
4432 -- 2859130
4433 -- AND tp.sr_instance_id = cal.sr_instance_id
4434 -- AND tp.calendar_code = cal.calendar_code
4435 -- AND tp.calendar_exception_set_id = cal.exception_set_id
4436 -- AND TRUNC(d2.using_assembly_demand_date) = cal.calendar_date
4437 ) peg1,
4438 msc_item_hierarchy_mv mv
4439 WHERE peg1.plan_id = :p_plan_id
4440 AND peg1.inventory_item_id = mv.inventory_item_id(+)
4441 AND peg1.organization_id = mv.organization_id (+)
4442 AND peg1.sr_instance_id = mv.sr_instance_id (+)
4443 AND peg1.demand_date >= mv.effective_date (+)
4444 AND peg1.demand_date <= mv.disable_date (+)
4445 AND peg1.demand_class = mv.demand_class (+)
4446 AND mv.level_id (+) = -1
4447 GROUP BY
4448 peg1.plan_id,
4449 peg1.inventory_item_id,
4450 peg1.organization_id,
4451 peg1.sr_instance_id,
4452 NVL(mv.demand_class, :def_num),
4453 peg1.demand_date,
4454 peg1.demand_id,
4455 peg1.origination_type,
4456 peg1.order_number,
4457 peg1.sales_order_line_id,
4458 peg1.demand_source_type,--cmro
4459 :l_user_id,
4460 :l_sysdate,
4461 :l_user_id,
4462 :l_sysdate,
4463 peg1.request_date,
4464 --bug3684383
4465 peg1.customer_id,
4466 peg1.ship_to_site_id)';
4467
4468 -- performance bug 2566795
4469 -- parallel hint can't be used with union all. Use two queries instead
4470
4471 -- UNION ALL
4472 msc_util.msc_log('After Generating the sql');
4473
4474 -- Obtain cursor handler for sql_stmt
4475 cur_handler := DBMS_SQL.OPEN_CURSOR;
4476
4477 DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4478 msc_util.msc_log('After parsing the sql');
4479
4480 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4481 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4482 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4483 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4484 msc_util.msc_log('after binding the variables');
4485
4486 -- Execute the cursor
4487 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4488 msc_util.msc_log('After executing the cursor');
4489
4490 msc_util.msc_log('rows processed: ' || rows_processed);
4491 msc_util.msc_log('After inserting in msc_alloc_demands part 1');
4492
4493 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4494 -- to move demand on non-working day to prior working day.
4495
4496 /* time_phased_atp - project atp forward port
4497 * If the profile is set to 'Yes' then:
4498 * o If the supply pegged to the demand has a demand class existing on allocation rule then
4499 * allocate the demand to that demand class.
4500 * o If the supply pegged to the demand has a demand class not present on allocation rule then
4501 * allocate the demand to 'OTHER'.
4502 * o If the supply pegged to the demand does not have a demand class present, allocate the demand
4503 * to 'OTHER'.
4504 * Else: Allocate the demand to 'OTHER'*/
4505 IF l_excess_supply_by_dc = 'Y' THEN
4506 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4507 plan_id,
4508 inventory_item_id,
4509 organization_id,
4510 sr_instance_id,
4511 demand_class,
4512 demand_date,
4513 allocated_quantity,
4514 parent_demand_id,
4515 origination_type,
4516 order_number,
4517 sales_order_line_id,
4518 demand_source_type, --cmro
4519 created_by,
4520 creation_date,
4521 last_updated_by,
4522 last_update_date,
4523 demand_quantity,
4524 request_date)--bug3263368
4525 (
4526 SELECT --5053818
4527 pegging_v.plan_id plan_id,
4528 pegging_v.inventory_item_id,
4529 pegging_v.organization_id,
4530 pegging_v.sr_instance_id,
4531 NVL(mv.demand_class, :def_num) demand_class,
4532 pegging_v.demand_date,
4533 SUM(pegging_v.allocated_quantity),
4534 pegging_v.demand_id,
4535 pegging_v.origination_type,
4536 pegging_v.order_number,
4537 pegging_v.sales_order_line_id,
4538 pegging_v.demand_source_type,--cmro
4539 :l_user_id,
4540 :l_sysdate,
4541 :l_user_id,
4542 :l_sysdate,
4543 MIN(pegging_v.demand_quantity),
4544 pegging_v.request_date --bug3263368
4545 FROM
4546 (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4547 -- causing performance issues which in turn causes ORA-01555: snapshot too old
4548 --/*+ ordered use_hash(peg2 peg1 d s)
4549 -- parallel(peg2,' || to_char(l_parallel_degree) || ')
4550 -- parallel(peg1,' || to_char(l_parallel_degree) || ')
4551 -- parallel(d,' || to_char(l_parallel_degree) || ')
4552 -- parallel(s,' || to_char(l_parallel_degree) || ')
4553 -- full(peg2) full(peg1) full(d) full(s) */
4554 peg1.plan_id plan_id,
4555 peg1.inventory_item_id,
4556 peg1.organization_id,
4557 peg1.sr_instance_id,
4558 NVL(s.demand_class, :def_num) demand_class,
4559 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4560 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4561 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4562 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))) demand_date,--plan by request date, promise date or schedule date
4563 peg1.allocated_quantity,
4564 d.demand_id,
4565 d.origination_type,
4566 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number) order_number,
4567 d.sales_order_line_id,
4568 d.demand_source_type, --cmro
4569 decode(d.origination_type, 4, d.daily_demand_rate,
4570 d.using_requirement_quantity) demand_quantity ,
4571 decode(d.order_date_type_code,2,d.request_date,
4572 d.request_ship_date)request_date --bug3263368
4573 FROM msc_full_pegging peg2,
4574 msc_full_pegging peg1,
4575 msc_demands d,
4576 msc_supplies s
4577 WHERE peg1.plan_id = :p_plan_id
4578 AND peg2.plan_id = peg1.plan_id
4579 AND peg2.pegging_id = peg1.end_pegging_id
4580 AND peg2.demand_id IN (-1, -2)
4581 AND d.demand_id = peg1.demand_id
4582 AND peg1.plan_id = d.plan_id
4583 AND d.sr_instance_id = peg1.sr_instance_id
4584 AND peg1.sr_instance_id=s.sr_instance_id
4585 AND peg1.plan_id = s.plan_id
4586 AND peg1.transaction_id = s.transaction_id
4587 AND d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)) pegging_v,
4588 msc_item_hierarchy_mv mv
4589 WHERE pegging_v.inventory_item_id = mv.inventory_item_id(+)
4590 AND pegging_v.organization_id = mv.organization_id (+)
4591 AND pegging_v.sr_instance_id = mv.sr_instance_id (+)
4592 AND pegging_v.demand_date >= mv.effective_date (+)
4593 AND pegging_v.demand_date <= mv.disable_date (+)
4594 AND pegging_v.demand_class = mv.demand_class (+)
4595 AND mv.level_id (+) = -1
4596 GROUP BY
4597 pegging_v.plan_id,
4598 pegging_v.inventory_item_id,
4599 pegging_v.organization_id,
4600 pegging_v.sr_instance_id,
4601 NVL(mv.demand_class, :def_num),
4602 pegging_v.demand_date,
4603 pegging_v.demand_id,
4604 pegging_v.origination_type,
4605 pegging_v.order_number,
4606 pegging_v.sales_order_line_id,
4607 pegging_v.demand_source_type,--cmro
4608 :l_user_id,
4609 :l_sysdate,
4610 :l_user_id,
4611 :l_sysdate,
4612 pegging_v.request_date)';
4613 ELSE
4614 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4615 plan_id,
4616 inventory_item_id,
4617 organization_id,
4618 sr_instance_id,
4619 demand_class,
4620 demand_date,
4621 allocated_quantity,
4622 parent_demand_id,
4623 origination_type,
4624 order_number,
4625 sales_order_line_id,
4626 demand_source_type, --cmro
4627 created_by,
4628 creation_date,
4629 last_updated_by,
4630 last_update_date,
4631 demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
4632 request_date)--bug3263368
4633 (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4634 -- causing performance issues which in turn causes ORA-01555: snapshot too old
4635 --/*+ ordered use_hash(peg2 peg1 d)
4636 -- parallel(peg2,' || to_char(l_parallel_degree) || ')
4637 -- parallel(peg1,' || to_char(l_parallel_degree) || ')
4638 -- parallel(d,' || to_char(l_parallel_degree) || ')
4639 -- full(peg2) full(peg1) full(d) */
4640 -- time_phased_atp
4641 -- parallel(tp,' || to_char(l_parallel_degree) || ')
4642 -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4643 -- full(cal)
4644 peg1.plan_id plan_id,
4645 peg1.inventory_item_id,
4646 peg1.organization_id,
4647 peg1.sr_instance_id,
4648 :def_num demand_class,
4649 -- cal.prior_date, -- 2859130
4650 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4651 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4652 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4653 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
4654 SUM(peg1.allocated_quantity),
4655 d.demand_id,
4656 d.origination_type,
4657 --d.order_number,
4658 -- rajjain 04/25/2003 Bug 2771075
4659 -- For Planned Order Demands We will populate disposition_id
4660 -- in order_number column
4661 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
4662 d.sales_order_line_id,
4663 d.demand_source_type, --cmro
4664 :l_user_id,
4665 :l_sysdate,
4666 :l_user_id,
4667 :l_sysdate,
4668 MIN(decode(d.origination_type, 4, d.daily_demand_rate,
4669 d.using_requirement_quantity)), -- rajjain 02/06/2003 Bug 2782882
4670 --MIN(peg1.demand_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
4671 -- min is used to select distinct values as demand_quantity would be
4672 -- repeating for the same demand_id
4673 --decode(d.order_date_type_code,2,d2.request_date,
4674 decode(d.order_date_type_code,2,d.request_date, -- Bug 3370201
4675 d.request_ship_date)request_date --bug3263368
4676 FROM msc_full_pegging peg2,
4677 msc_full_pegging peg1,
4678 msc_demands d
4679 -- time_phased_atp msc_trading_partners tp
4680 -- 2859130 msc_calendar_dates cal
4681 WHERE peg1.plan_id = :p_plan_id
4682 AND peg2.plan_id = peg1.plan_id
4683 AND peg2.pegging_id = peg1.end_pegging_id
4684 AND peg2.demand_id IN (-1, -2)
4685 AND d.demand_id = peg1.demand_id
4686 AND peg1.plan_id = d.plan_id
4687 AND d.sr_instance_id = peg1.sr_instance_id
4688 AND d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)
4689 --AND tp.sr_tp_id = peg1.organization_id
4690 --AND tp.partner_type = 3 -- bug2646304
4691 --AND tp.sr_instance_id = peg1.sr_instance_id
4692 --AND tp.sr_instance_id = cal.sr_instance_id
4693 --AND tp.calendar_code = cal.calendar_code
4694 --AND tp.calendar_exception_set_id = cal.exception_set_id
4695 --AND TRUNC(d.using_assembly_demand_date) = cal.calendar_date
4696 GROUP BY
4697 peg1.plan_id,
4698 peg1.inventory_item_id,
4699 peg1.organization_id,
4700 peg1.sr_instance_id,
4701 :def_num,
4702 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4703 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4704 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4705 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
4706 -- 2859130 cal.prior_date,
4707 d.demand_id,
4708 d.origination_type,
4709 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
4710 d.sales_order_line_id,
4711 d.demand_source_type,--cmro
4712 :l_user_id,
4713 :l_sysdate,
4714 :l_user_id,
4715 :l_sysdate,
4716 --decode(d.order_date_type_code,2,d2.request_date,
4717 decode(d.order_date_type_code,2,d.request_date, -- Bug 3370201
4718 d.request_ship_date) --bug3263368
4719 )';
4720 END IF;
4721 -- time_phased_atp - project atp forward port
4722
4723 msc_util.msc_log('After Generating the sql');
4724
4725 -- Parse cursor handler for sql_stmt: Don't open as its already opened
4726
4727 DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4728 msc_util.msc_log('After parsing the sql');
4729
4730 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4731 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4732 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4733 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4734 msc_util.msc_log('after binding the variables');
4735
4736 -- Execute the cursor
4737 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4738 msc_util.msc_log('After executing the cursor');
4739
4740 msc_util.msc_log('rows processed: ' || rows_processed);
4741 msc_util.msc_log('after inserting item data into MSC_ALLOC_DEMANDS tables');
4742
4743 /* ------------------------------------------------------------------ */
4744
4745 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4746 -- to move demand on non-working day to prior working day.
4747
4748 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4749 plan_id,
4750 inventory_item_id,
4751 organization_id,
4752 sr_instance_id,
4753 demand_class,
4754 supply_date,
4755 allocated_quantity,
4756 parent_transaction_id,
4757 order_type,
4758 order_number,
4759 schedule_designator_id,
4760 created_by,
4761 creation_date,
4762 last_updated_by,
4763 last_update_date,
4764 supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
4765 (
4766 SELECT /*+ use_hash(peg1 mv) parallel(mv,' || to_char(l_parallel_degree) || ') */
4767 peg1.plan_id plan_id,
4768 peg1.inventory_item_id,
4769 peg1.organization_id,
4770 peg1.sr_instance_id,
4771 NVL(mv.demand_class, :def_num) demand_class,
4772 peg1.supply_date,
4773 SUM(peg1.allocated_quantity),
4774 peg1.transaction_id,
4775 peg1.order_type,
4776 peg1.order_number,
4777 peg1.schedule_designator_id,
4778 :l_user_id,
4779 :l_sysdate,
4780 :l_user_id,
4781 :l_sysdate,
4782 MIN(peg1.supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
4783 -- min is used to select distinct values as supply_quantity would be
4784 -- repeating for the same transaction_id
4785 FROM -- msc_supply_pegging_v peg1,
4786 (SELECT --5053818
4787 -- time_phased_atp
4788 -- parallel(tp,' || to_char(l_parallel_degree) || ')
4789 -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4790 peg2.plan_id,
4791 peg2.inventory_item_id,
4792 peg2.organization_id,
4793 peg2.sr_instance_id,
4794 NVL (d.demand_class, :def_num) demand_class,
4795 trunc(s.new_schedule_date) supply_date,
4796 -- cal.next_date supply_date, --2859130
4797 peg2.allocated_quantity,
4798 peg2.transaction_id,
4799 s.order_type,
4800 s.order_number,
4801 s.schedule_designator_id ,
4802 nvl(s.firm_quantity,s.new_order_quantity) supply_quantity -- rajjain 02/06/2003 Bug 2782882
4803 --peg2.supply_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
4804 FROM msc_supplies s,
4805 msc_full_pegging peg2,
4806 msc_full_pegging peg1,
4807 msc_demands d
4808 -- time_phased_atp msc_trading_partners tp
4809 -- 2859130 msc_calendar_dates cal
4810 WHERE peg2.plan_id = peg1.plan_id
4811 AND peg2.end_pegging_id = peg1.pegging_id
4812 AND d.plan_id = peg1.plan_id
4813 AND d.demand_id = peg1.demand_id
4814 AND d.sr_instance_id = peg1.sr_instance_id
4815 AND d.inventory_item_id = peg1.inventory_item_id
4816 AND s.plan_id = peg2.plan_id
4817 AND s.transaction_id = peg2.transaction_id
4818 AND s.sr_instance_id = peg2.sr_instance_id
4819 -- time_phased_atp
4820 -- AND tp.sr_tp_id = peg2.organization_id
4821 -- AND tp.partner_type = 3 -- bug2646304
4822 -- AND tp.sr_instance_id = peg2.sr_instance_id
4823 -- 2859130 AND tp.sr_instance_id = cal.sr_instance_id
4824 --AND tp.calendar_code = cal.calendar_code
4825 --AND tp.calendar_exception_set_id = cal.exception_set_id
4826 --AND TRUNC(s.new_schedule_date) = cal.calendar_date
4827 ) peg1,
4828 msc_item_hierarchy_mv mv
4829 WHERE peg1.plan_id = :p_plan_id
4830 AND peg1.inventory_item_id = mv.inventory_item_id(+)
4831 AND peg1.organization_id = mv.organization_id (+)
4832 AND peg1.sr_instance_id = mv.sr_instance_id (+)
4833 AND peg1.supply_date >= mv.effective_date (+)
4834 AND peg1.supply_date <= mv.disable_date (+)
4835 AND peg1.demand_class = mv.demand_class (+)
4836 AND mv.level_id (+) = -1
4837 GROUP BY
4838 peg1.plan_id,
4839 peg1.inventory_item_id,
4840 peg1.organization_id,
4841 peg1.sr_instance_id,
4842 NVL(mv.demand_class, :def_num),
4843 peg1.supply_date,
4844 peg1.transaction_id,
4845 peg1.order_type,
4846 peg1.order_number,
4847 peg1.schedule_designator_id,
4848 :l_user_id,
4849 :l_sysdate,
4850 :l_user_id,
4851 :l_sysdate)';
4852
4853 msc_util.msc_log('After Generating first supplies sql');
4854
4855 -- Parse cursor handler for sql_stmt: Don't open as its already opened
4856
4857 DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4858 msc_util.msc_log('After parsing first supplies sql');
4859
4860 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4861 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4862 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4863 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4864 msc_util.msc_log('after binding the variables');
4865
4866 -- Execute the cursor
4867 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4868 msc_util.msc_log('After executing first supplies cursor');
4869
4870 msc_util.msc_log('rows processed: ' || rows_processed);
4871
4872 msc_util.msc_log('After inserting in msc_alloc_supplies part 1');
4873
4874 -- parallel hint can't be used with union all. Use two query instead
4875
4876 --UNION ALL
4877
4878 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4879 -- to move demand on non-working day to prior working day.
4880
4881 /* time_phased_atp - project atp forward port
4882 * If the profile is set to 'Yes' then:
4883 * o If supply has a demand class existing on allocation rule then
4884 * allocate the supply to that demand class.
4885 * o If supply has a demand class not present on allocation rule then
4886 * allocate the supply to 'OTHER'.
4887 * o If supply does not have a demand class present, allocate the supply
4888 * to 'OTHER'.
4889 * Else: Allocate the supply to 'OTHER'*/
4890 IF l_excess_supply_by_dc = 'Y' THEN
4891 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4892 plan_id,
4893 inventory_item_id,
4894 organization_id,
4895 sr_instance_id,
4896 demand_class,
4897 supply_date,
4898 allocated_quantity,
4899 parent_transaction_id,
4900 order_type,
4901 order_number,
4902 schedule_designator_id,
4903 created_by,
4904 creation_date,
4905 last_updated_by,
4906 last_update_date,
4907 supply_quantity)
4908 (
4909 SELECT --5053818
4910 pegging_v.plan_id plan_id,
4911 pegging_v.inventory_item_id,
4912 pegging_v.organization_id,
4913 pegging_v.sr_instance_id,
4914 NVL(mv.demand_class, :def_num) demand_class,
4915 pegging_v.supply_date,
4916 SUM(pegging_v.allocated_quantity),
4917 pegging_v.transaction_id,
4918 pegging_v.order_type,
4919 pegging_v.order_number,
4920 pegging_v.schedule_designator_id,
4921 :l_user_id,
4922 :l_sysdate,
4923 :l_user_id,
4924 :l_sysdate,
4925 MIN(pegging_v.supply_quantity)
4926 FROM
4927 (SELECT --5053818
4928 peg1.plan_id plan_id,
4929 peg1.inventory_item_id,
4930 peg1.organization_id,
4931 peg1.sr_instance_id,
4932 NVL(s.demand_class, :def_num) demand_class,
4933 TRUNC(s.new_schedule_date) supply_date,
4934 peg1.allocated_quantity,
4935 peg1.transaction_id,
4936 s.order_type,
4937 s.order_number,
4938 s.schedule_designator_id,
4939 nvl(s.firm_quantity,s.new_order_quantity) supply_quantity
4940 FROM msc_full_pegging peg2,
4941 msc_full_pegging peg1,
4942 msc_supplies s
4943 WHERE peg1.plan_id = :p_plan_id
4944 AND peg2.plan_id = peg1.plan_id
4945 AND peg2.pegging_id = peg1.end_pegging_id
4946 AND peg2.demand_id IN (-1, -2)
4947 AND s.plan_id = peg1.plan_id
4948 AND s.transaction_id = peg1.transaction_id
4949 AND s.sr_instance_id = peg1.sr_instance_id) pegging_v,
4950 msc_item_hierarchy_mv mv
4951 WHERE pegging_v.inventory_item_id = mv.inventory_item_id(+)
4952 AND pegging_v.organization_id = mv.organization_id (+)
4953 AND pegging_v.sr_instance_id = mv.sr_instance_id (+)
4954 AND pegging_v.supply_date >= mv.effective_date (+)
4955 AND pegging_v.supply_date <= mv.disable_date (+)
4956 AND pegging_v.demand_class = mv.demand_class (+)
4957 AND mv.level_id (+) = -1
4958 GROUP BY
4959 pegging_v.plan_id,
4960 pegging_v.inventory_item_id,
4961 pegging_v.organization_id,
4962 pegging_v.sr_instance_id,
4963 NVL(mv.demand_class, :def_num),
4964 pegging_v.supply_date,
4965 pegging_v.transaction_id,
4966 pegging_v.order_type,
4967 pegging_v.order_number,
4968 pegging_v.schedule_designator_id,
4969 :l_user_id,
4970 :l_sysdate,
4971 :l_user_id,
4972 :l_sysdate)';
4973
4974 ELSE
4975 l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4976 plan_id,
4977 inventory_item_id,
4978 organization_id,
4979 sr_instance_id,
4980 demand_class,
4981 supply_date,
4982 allocated_quantity,
4983 parent_transaction_id,
4984 order_type,
4985 order_number,
4986 schedule_designator_id,
4987 created_by,
4988 creation_date,
4989 last_updated_by,
4990 last_update_date,
4991 supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
4992 (
4993 SELECT --5053818
4994 -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
4995 -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4996 peg1.plan_id plan_id,
4997 peg1.inventory_item_id,
4998 peg1.organization_id,
4999 peg1.sr_instance_id,
5000 :def_num demand_class,
5001 trunc(s.new_schedule_date),
5002 -- cal.next_date, --2859130
5003 -- cal.calendar_date,
5004 SUM(peg1.allocated_quantity),
5005 peg1.transaction_id,
5006 s.order_type,
5007 s.order_number,
5008 s.schedule_designator_id,
5009 :l_user_id,
5010 :l_sysdate,
5011 :l_user_id,
5012 :l_sysdate,
5013 MIN(nvl(s.firm_quantity,s.new_order_quantity)) -- rajjain 02/06/2003 Bug 2782882
5014 --MIN(peg1.supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
5015 -- min is used to select distinct values as supply_quantity would be
5016 -- repeating for the same transaction_id
5017 FROM msc_full_pegging peg2,
5018 msc_full_pegging peg1,
5019 msc_supplies s
5020 -- time_phased_atp msc_trading_partners tp
5021 -- 2859130 msc_calendar_dates cal
5022 WHERE peg1.plan_id = :p_plan_id
5023 AND peg2.plan_id = peg1.plan_id
5024 AND peg2.pegging_id = peg1.end_pegging_id
5025 AND peg2.demand_id IN (-1, -2)
5026 AND s.plan_id = peg1.plan_id
5027 AND s.transaction_id = peg1.transaction_id
5028 AND s.sr_instance_id = peg1.sr_instance_id
5029 -- time_phased_atp
5030 -- AND tp.sr_tp_id = peg1.organization_id
5031 -- AND tp.partner_type = 3 -- bug2646304
5032 -- AND tp.sr_instance_id = peg1.sr_instance_id
5033 -- 2859130 AND tp.sr_instance_id = cal.sr_instance_id
5034 -- AND tp.calendar_code = cal.calendar_code
5035 -- AND tp.calendar_exception_set_id = cal.exception_set_id
5036 -- AND TRUNC(s.new_schedule_date) = cal.calendar_date
5037 GROUP BY
5038 peg1.plan_id,
5039 peg1.inventory_item_id,
5040 peg1.organization_id,
5041 peg1.sr_instance_id,
5042 :def_num,
5043 trunc(s.new_schedule_date),
5044 -- 2859130 cal.next_date,
5045 peg1.transaction_id,
5046 s.order_type,
5047 s.order_number,
5048 s.schedule_designator_id,
5049 :l_user_id,
5050 :l_sysdate,
5051 :l_user_id,
5052 :l_sysdate)';
5053 END IF;
5054 -- time_phased_atp - project atp forward port
5055
5056 msc_util.msc_log('After Generating second supplies sql');
5057
5058 -- Parse cursor handler for sql_stmt: Don't open as its already opened
5059
5060 DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
5061 msc_util.msc_log('After parsing second supplies sql');
5062
5063 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5064 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5065 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5066 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5067 msc_util.msc_log('after binding the variables');
5068
5069 -- Execute the cursor
5070 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5071 msc_util.msc_log('After executing second supplies cursor');
5072
5073 msc_util.msc_log('rows processed: ' || rows_processed);
5074 msc_util.msc_log('After inserting in msc_alloc_supplies part 2');
5075
5076 msc_util.msc_log('after inserting item data into MSC_ALLOC_SUPPLIES tables');
5077
5078 msc_util.msc_log('Analyze Plan partition for MSC_ALLOC_DEMANDS');
5079 fnd_stats.gather_table_stats(ownname=>l_msc_schema,tabname=>'MSC_ALLOC_DEMANDS',
5080 partname=>'ALLOC_DEMANDS_999999',
5081 granularity=>'PARTITION',
5082 percent =>10);
5083
5084 msc_util.msc_log('Analyze Plan partition for MSC_ALLOC_SUPPLIES');
5085 fnd_stats.gather_table_stats(ownname=>l_msc_schema,tabname=>'MSC_ALLOC_SUPPLIES',
5086 partname=>'ALLOC_SUPPLIES_999999',
5087 granularity=>'PARTITION',
5088 percent =>10);
5089 ELSE
5090 -- IF l_share_partition = 'Y' THEN
5091 msc_util.msc_log('not a shared plan partition, insert data into temp tables');
5092
5093 l_temp_table := 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id);
5094
5095 msc_util.msc_log('temp table : ' || l_temp_table);
5096
5097 SELECT t.tablespace_name, NVL(i.def_tablespace_name, t.tablespace_name)
5098 INTO l_tbspace, l_ind_tbspace
5099 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
5100 --FROM dba_tab_partitions t,
5101 -- dba_part_indexes i
5102 FROM all_tab_partitions t,
5103 all_part_indexes i
5104 WHERE t.table_owner = l_msc_schema
5105 AND t.table_name = 'MSC_ALLOC_DEMANDS'
5106 AND t.partition_name = 'ALLOC_DEMANDS_' || to_char(l_plan_id)
5107 AND i.owner (+) = t.table_owner
5108 AND i.table_name (+) = t.table_name
5109 AND rownum = 1;
5110
5111 msc_util.msc_log('tb space : ' || l_tbspace);
5112 msc_util.msc_log('ind tbspace : ' || l_ind_tbspace);
5113
5114 --bug 6113544
5115 l_insert_stmt := 'CREATE TABLE ' || l_temp_table
5116 || ' TABLESPACE ' || l_tbspace
5117 || ' PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)'
5118 || ' as select * from MSC_ALLOC_DEMANDS where 1=2 ';
5119
5120 /*
5121 l_insert_stmt := 'CREATE TABLE ' || l_temp_table || '(
5122 PLAN_ID NUMBER NOT NULL,
5123 INVENTORY_ITEM_ID NUMBER NOT NULL,
5124 ORGANIZATION_ID NUMBER NOT NULL,
5125 SR_INSTANCE_ID NUMBER NOT NULL,
5126 DEMAND_CLASS VARCHAR2(30) , --bug3272444
5127 DEMAND_DATE DATE NOT NULL,
5128 PARENT_DEMAND_ID NUMBER NOT NULL,
5129 ALLOCATED_QUANTITY NUMBER NOT NULL,
5130 ORIGINATION_TYPE NUMBER NOT NULL,
5131 ORDER_NUMBER VARCHAR2(62),
5132 SALES_ORDER_LINE_ID NUMBER,
5133 OLD_DEMAND_DATE DATE,
5134 OLD_ALLOCATED_QUANTITY NUMBER,
5135 CREATED_BY NUMBER NOT NULL,
5136 CREATION_DATE DATE NOT NULL,
5137 LAST_UPDATED_BY NUMBER NOT NULL,
5138 LAST_UPDATE_DATE DATE NOT NULL,
5139 DEMAND_QUANTITY NUMBER, -- ssurendr 25-NOV-2002: added for alloc w/b
5140 PF_DISPLAY_FLAG NUMBER, -- For time_phased_atp
5141 ORIGINAL_ITEM_ID NUMBER, -- For time_phased_atp
5142 ORIGINAL_ORIGINATION_TYPE NUMBER, -- For time_phased_atp
5143 ORIGINAL_DEMAND_DATE DATE, -- For time_phased_atp
5144 SOURCE_ORGANIZATION_ID NUMBER, -- For time_phased_atp --bug3272444
5145 USING_ASSEMBLY_ITEM_ID NUMBER, -- For time_phased_atp --bug3272444
5146 CUSTOMER_ID NUMBER, -- For time_phased_atp
5147 SHIP_TO_SITE_ID NUMBER, -- For time_phased_atp
5148 REFRESH_NUMBER NUMBER, --bug3272444
5149 OLD_REFRESH_NUMBER NUMBER, --bug3272444
5150 DEMAND_SOURCE_TYPE NUMBER, --cmro
5151 REQUEST_DATE DATE) --bug3263368
5152 TABLESPACE ' || l_tbspace || '
5153 -- NOLOGGING
5154 PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)';
5155 */
5156 msc_util.msc_log('before creating table : ' || l_temp_table);
5157 BEGIN
5158 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5159 APPLICATION_SHORT_NAME => 'MSC',
5160 STATEMENT_TYPE => ad_ddl.create_table,
5161 STATEMENT => l_insert_stmt,
5162 OBJECT_NAME => l_temp_table);
5163 msc_util.msc_log('after creating table : ' || l_temp_table);
5164
5165 EXCEPTION
5166 WHEN others THEN
5167 msc_util.msc_log(sqlcode || ': ' || sqlerrm);
5168 msc_util.msc_log('Exception of create table : ' || l_temp_table);
5169
5170 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5171 APPLICATION_SHORT_NAME => 'MSC',
5172 STATEMENT_TYPE => ad_ddl.drop_table,
5173 STATEMENT => 'DROP TABLE ' || l_temp_table,
5174 OBJECT_NAME => l_temp_table);
5175
5176 msc_util.msc_log('After Drop table : ' ||l_temp_table);
5177 msc_util.msc_log('Before exception create table : ' ||l_temp_table);
5178
5179 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5180 APPLICATION_SHORT_NAME => 'MSC',
5181 STATEMENT_TYPE => ad_ddl.create_table,
5182 STATEMENT => l_insert_stmt,
5183 OBJECT_NAME => l_temp_table);
5184 msc_util.msc_log('After exception create table : ' ||l_temp_table);
5185 END;
5186
5187 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5188 -- to move demand on non-working day to prior working day.
5189
5190 -- cannot use append with other hints
5191 --l_insert_stmt := 'INSERT /*+ APPEND */ INTO ' || l_temp_table || '(
5192 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5193 plan_id,
5194 inventory_item_id,
5195 organization_id,
5196 sr_instance_id,
5197 demand_class,
5198 demand_date,
5199 allocated_quantity,
5200 parent_demand_id,
5201 origination_type,
5202 order_number,
5203 sales_order_line_id,
5204 demand_source_type,--cmro
5205 created_by,
5206 creation_date,
5207 last_updated_by,
5208 last_update_date,
5209 demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
5210 request_date,-- Bug 3370201
5211 --bug3684383
5212 customer_id,
5213 ship_to_site_id)
5214 (
5215 SELECT --5053818
5216 -- full(peg1.tp)
5217 -- full(peg1.cal)
5218 peg1.plan_id,
5219 peg1.inventory_item_id,
5220 peg1.organization_id,
5221 peg1.sr_instance_id,
5222 NVL(mv.demand_class, :def_num) demand_class,
5223 peg1.demand_date,
5224 (SUM(peg1.allocated_quantity)- MIN(peg1.reserved_quantity)) allocated_quantity, --5027568
5225 peg1.demand_id,
5226 peg1.origination_type,
5227 peg1.order_number,
5228 peg1.sales_order_line_id,
5229 peg1.demand_source_type,--cmro
5230 :l_user_id created_by,
5231 :l_sysdate creation_date,
5232 :l_user_id last_updated_by,
5233 :l_sysdate last_update_date,
5234 MIN(peg1.demand_quantity) demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
5235 -- min is used to select distinct values as demand_quantity would be
5236 -- repeating for the same demand_id
5237 peg1.request_date, -- Bug 3370201
5238 --bug3684383
5239 peg1.customer_id,
5240 peg1.ship_to_site_id
5241 FROM
5242 -- use inline view so that view parallel hint could be used.
5243 -- msc_demand_pegging_v peg1,
5244 (SELECT --5053818
5245 -- parallel(tp,' || to_char(l_parallel_degree) || ')
5246 -- parallel(cal,' || to_char(l_parallel_degree) || ')
5247 peg2.plan_id,
5248 peg2.inventory_item_id,
5249 peg2.organization_id,
5250 peg2.sr_instance_id,
5251 NVL(d1.demand_class, :def_num) demand_class,
5252 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5253 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5254 2, NVL(d2.PLANNED_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE),
5255 NVL(d2.SCHEDULE_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE))) demand_date, --plan by request date, promise date or schedule date
5256 -- cal.prior_date demand_date,
5257 -- cal.calendar_date demand_date, -- 2859130
5258 peg2.allocated_quantity,
5259 DECODE( d2.origination_type, 30, NVL(d2.reserved_quantity, 0), 0) reserved_quantity, --5027568
5260 d2.demand_id,
5261 d2.origination_type,
5262 --d2.order_number,
5263 -- rajjain 04/25/2003 Bug 2771075
5264 -- For Planned Order Demands We will populate disposition_id
5265 -- in order_number column
5266 decode(d2.origination_type, 1, to_char(d2.disposition_id), d2.order_number) order_number,
5267 d2.sales_order_line_id,
5268 d2.demand_source_type,--cmro
5269 decode(d2.origination_type, 4, d2.daily_demand_rate,
5270 d2.using_requirement_quantity) demand_quantity, -- rajjain 02/06/2003 Bug 2782882
5271 --peg2.demand_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
5272 decode(d2.order_date_type_code,2,d2.request_date,
5273 d2.request_ship_date) request_date, -- Bug 3370201
5274 --bug3684383
5275 d2.customer_id,
5276 d2.ship_to_site_id
5277 FROM msc_demands d2,
5278 msc_full_pegging peg2,
5279 msc_full_pegging peg1,
5280 msc_demands d1
5281 -- time_phased_atp msc_trading_partners tp
5282 -- 2859130 msc_calendar_dates cal
5283 WHERE peg2.plan_id = peg1.plan_id
5284 AND peg2.end_pegging_id = peg1.pegging_id
5285 AND peg2.sr_instance_id = peg1.sr_instance_id
5286 AND d1.plan_id = peg1.plan_id
5287 AND d1.demand_id = peg1.demand_id
5288 AND d1.sr_instance_id = peg1.sr_instance_id
5289 AND d2.plan_id = peg2.plan_id
5290 AND d2.demand_id = peg2.demand_id
5291 AND d2.sr_instance_id = peg2.sr_instance_id
5292 AND d2.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)
5293 -- time_phased_atp
5294 -- AND tp.sr_tp_id = peg2.organization_id
5295 -- AND tp.partner_type = 3 -- bug2646304
5296 -- AND tp.sr_instance_id = peg2.sr_instance_id
5297 -- 2859130
5298 -- AND tp.sr_instance_id = cal.sr_instance_id
5299 --AND tp.calendar_code = cal.calendar_code
5300 --AND tp.calendar_exception_set_id = cal.exception_set_id
5301 --AND TRUNC(d2.using_assembly_demand_date) = cal.calendar_date
5302 ) peg1,
5303 msc_item_hierarchy_mv mv
5304 WHERE peg1.plan_id = :p_plan_id
5305 AND peg1.inventory_item_id = mv.inventory_item_id(+)
5306 AND peg1.organization_id = mv.organization_id (+)
5307 AND peg1.sr_instance_id = mv.sr_instance_id (+)
5308 AND peg1.demand_date >= mv.effective_date (+)
5309 AND peg1.demand_date <= mv.disable_date (+)
5310 AND peg1.demand_class = mv.demand_class (+)
5311 AND mv.level_id (+) = -1
5312 GROUP BY
5313 peg1.plan_id,
5314 peg1.inventory_item_id,
5315 peg1.organization_id,
5316 peg1.sr_instance_id,
5317 NVL(mv.demand_class, :def_num),
5318 peg1.demand_date,
5319 peg1.demand_id,
5320 peg1.origination_type,
5321 peg1.order_number,
5322 peg1.sales_order_line_id,
5323 peg1.demand_source_type,--cmro
5324 :l_user_id,
5325 :l_sysdate,
5326 :l_user_id,
5327 :l_sysdate,
5328 peg1.request_date, -- Bug 3370201
5329 --bug3684383
5330 peg1.customer_id,
5331 peg1.ship_to_site_id)';
5332
5333 msc_util.msc_log('After Generating the sql');
5334
5335 -- Obtain cursor handler for sql_stmt
5336 cur_handler := DBMS_SQL.OPEN_CURSOR;
5337
5338 DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5339 msc_util.msc_log('After parsing the sql');
5340
5341 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5342 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5343 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5344 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5345
5346 msc_util.msc_log('after binding the variables');
5347
5348 -- Execute the cursor
5349 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5350 msc_util.msc_log('After executing the cursor');
5351
5352 -- parallel hint can't be used with union all. Use two query instead */
5353
5354 -- UNION ALL
5355
5356 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5357 -- to move demand on non-working day to prior working day.
5358
5359 /* time_phased_atp - project atp forward port
5360 * If the profile is set to 'Yes' then:
5361 * o If the supply pegged to the demand has a demand class existing on allocation rule then
5362 * allocate the demand to that demand class.
5363 * o If the supply pegged to the demand has a demand class not present on allocation rule then
5364 * allocate the demand to 'OTHER'.
5365 * o If the supply pegged to the demand does not have a demand class present, allocate the supply
5366 * to 'OTHER'.
5367 * Else: Allocate the demand to 'OTHER'*/
5368 IF l_excess_supply_by_dc = 'Y' THEN
5369 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5370 plan_id,
5371 inventory_item_id,
5372 organization_id,
5373 sr_instance_id,
5374 demand_class,
5375 demand_date,
5376 allocated_quantity,
5377 parent_demand_id,
5378 origination_type,
5379 order_number,
5380 sales_order_line_id,
5381 demand_source_type,--cmro
5382 created_by,
5383 creation_date,
5384 last_updated_by,
5385 last_update_date,
5386 demand_quantity,
5387 request_date) -- Bug 3370201
5388 (
5389 SELECT --5053818
5390 pegging_v.plan_id plan_id,
5391 pegging_v.inventory_item_id,
5392 pegging_v.organization_id,
5393 pegging_v.sr_instance_id,
5394 NVL(mv.demand_class, :def_num) demand_class,
5395 pegging_v.demand_date,
5396 SUM(pegging_v.allocated_quantity),
5397 pegging_v.demand_id,
5398 pegging_v.origination_type,
5399 pegging_v.order_number,
5400 pegging_v.sales_order_line_id,
5401 pegging_v.demand_source_type,--cmro
5402 :l_user_id,
5403 :l_sysdate,
5404 :l_user_id,
5405 :l_sysdate,
5406 MIN(pegging_v.demand_quantity),
5407 pegging_v.request_date -- Bug 3370201
5408 FROM
5409 (SELECT --5053818
5410 peg1.plan_id plan_id,
5411 peg1.inventory_item_id,
5412 peg1.organization_id,
5413 peg1.sr_instance_id,
5414 NVL(s.demand_class, :def_num) demand_class,
5415 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5416 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5417 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5418 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))) demand_date,--plan by request date, promise date or schedule date
5419 peg1.allocated_quantity,
5420 d.demand_id,
5421 d.origination_type,
5422 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number) order_number,
5423 d.sales_order_line_id,
5424 d.demand_source_type,--cmro
5425 decode(d.origination_type, 4, d.daily_demand_rate,
5426 d.using_requirement_quantity) demand_quantity,
5427 decode(d.order_date_type_code,2,d.request_date,
5428 d.request_ship_date) request_date -- Bug 3370201
5429 FROM msc_full_pegging peg2,
5430 msc_full_pegging peg1,
5431 msc_demands d,
5432 msc_supplies s
5433 WHERE peg1.plan_id = :p_plan_id
5434 AND peg2.plan_id = peg1.plan_id
5435 AND peg2.pegging_id = peg1.end_pegging_id
5436 AND peg2.demand_id IN (-1, -2)
5437 AND d.demand_id = peg1.demand_id
5438 AND peg1.plan_id = d.plan_id
5439 AND d.sr_instance_id = peg1.sr_instance_id
5440 AND peg1.sr_instance_id=s.sr_instance_id
5441 AND peg1.plan_id = s.plan_id
5442 AND peg1.transaction_id = s.transaction_id
5443 AND d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)) pegging_v,
5444 msc_item_hierarchy_mv mv
5445 WHERE pegging_v.inventory_item_id = mv.inventory_item_id(+)
5446 AND pegging_v.organization_id = mv.organization_id (+)
5447 AND pegging_v.sr_instance_id = mv.sr_instance_id (+)
5448 AND pegging_v.demand_date >= mv.effective_date (+)
5449 AND pegging_v.demand_date <= mv.disable_date (+)
5450 AND pegging_v.demand_class = mv.demand_class (+)
5451 AND mv.level_id (+) = -1
5452 GROUP BY
5453 pegging_v.plan_id,
5454 pegging_v.inventory_item_id,
5455 pegging_v.organization_id,
5456 pegging_v.sr_instance_id,
5457 NVL(mv.demand_class, :def_num),
5458 pegging_v.demand_date,
5459 pegging_v.demand_id,
5460 pegging_v.origination_type,
5461 pegging_v.order_number,
5462 pegging_v.sales_order_line_id,
5463 pegging_v.demand_source_type,--cmro
5464 :l_user_id,
5465 :l_sysdate,
5466 :l_user_id,
5467 :l_sysdate,
5468 pegging_v.request_date)'; -- Bug 3370201
5469 ELSE
5470 -- cannot use append with other hints
5471 --l_insert_stmt := 'INSERT /*+ APPEND */ INTO ' || l_temp_table || '(
5472 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5473 plan_id,
5474 inventory_item_id,
5475 organization_id,
5476 sr_instance_id,
5477 demand_class,
5478 demand_date,
5479 allocated_quantity,
5480 parent_demand_id,
5481 origination_type,
5482 order_number,
5483 sales_order_line_id,
5484 demand_source_type,--cmro
5485 created_by,
5486 creation_date,
5487 last_updated_by,
5488 last_update_date,
5489 demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
5490 request_date) -- Bug 3370201
5491 (SELECT --5053818
5492 -- time_phased_atp
5493 -- parallel(tp,' || to_char(l_parallel_degree) || ')
5494 -- 2859130 full(cal)
5495 --parallel(cal,' || to_char(l_parallel_degree) || ')
5496 peg1.plan_id plan_id,
5497 peg1.inventory_item_id,
5498 peg1.organization_id,
5499 peg1.sr_instance_id,
5500 :def_num demand_class,
5501 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5502 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5503 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5504 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date -- 2859130
5505 -- cal.prior_date,
5506 SUM(peg1.allocated_quantity),
5507 d.demand_id,
5508 d.origination_type,
5509 --d.order_number,
5510 -- rajjain 04/25/2003 Bug 2771075
5511 -- For Planned Order Demands We will populate disposition_id
5512 -- in order_number column
5513 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
5514 d.sales_order_line_id,
5515 d.demand_source_type,--cmro
5516 :l_user_id,
5517 :l_sysdate,
5518 :l_user_id,
5519 :l_sysdate,
5520 MIN(decode(d.origination_type, 4, d.daily_demand_rate,
5521 d.using_requirement_quantity)), -- rajjain 02/06/2003 Bug 2782882
5522 --MIN(peg1.demand_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
5523 -- min is used to select distinct values as demand_quantity would be
5524 -- repeating for the same demand_id
5525 decode(d.order_date_type_code,2,d.request_date,
5526 d.request_ship_date) request_date -- Bug 3370201
5527 FROM msc_full_pegging peg2,
5528 msc_full_pegging peg1,
5529 msc_demands d
5530 -- time_phased_atp msc_trading_partners tp
5531 -- 2859130 msc_calendar_dates cal
5532 WHERE peg1.plan_id = :p_plan_id
5533 AND peg2.plan_id = peg1.plan_id
5534 AND peg2.pegging_id = peg1.end_pegging_id
5535 AND peg2.demand_id IN (-1, -2)
5536 AND d.demand_id = peg1.demand_id
5537 AND peg1.plan_id = d.plan_id
5538 AND d.sr_instance_id = peg1.sr_instance_id
5539 AND d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31,70)
5540 -- time_phased_atp
5541 --AND tp.sr_tp_id = peg1.organization_id
5542 --AND tp.partner_type = 3 -- bug2646304
5543 --AND tp.sr_instance_id = peg1.sr_instance_id
5544 -- 2859130 AND tp.sr_instance_id = cal.sr_instance_id
5545 --AND tp.calendar_code = cal.calendar_code
5546 --AND tp.calendar_exception_set_id = cal.exception_set_id
5547 --AND TRUNC(d.using_assembly_demand_date) = cal.calendar_date
5548 GROUP BY
5549 peg1.plan_id,
5550 peg1.inventory_item_id,
5551 peg1.organization_id,
5552 peg1.sr_instance_id,
5553 :def_num,
5554 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5555 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5556 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5557 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
5558 --cal.prior_date,
5559 d.demand_id,
5560 d.origination_type,
5561 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
5562 d.sales_order_line_id,
5563 d.demand_source_type,--cmro
5564 :l_user_id,
5565 :l_sysdate,
5566 :l_user_id,
5567 :l_sysdate,
5568 decode(d.order_date_type_code,2,d.request_date,
5569 d.request_ship_date) -- Bug 3370201
5570 )';
5571 END IF;
5572 -- time_phased_atp - project atp forward port
5573
5574 msc_util.msc_log('After Generating the sql');
5575
5576 -- Parse cursor handler for sql_stmt: Don't open as its already opened
5577
5578 DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5579 msc_util.msc_log('After parsing the sql');
5580
5581 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5582 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5583 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5584 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5585 msc_util.msc_log('after binding the variables');
5586
5587 -- Execute the cursor
5588 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5589 msc_util.msc_log('After executing the cursor');
5590
5591 msc_util.msc_log('after inserting item data into MSC_TEMP_ALLOC_DEMANDS table');
5592
5593 commit;
5594
5595 msc_util.msc_log('before creating indexes on temp demand table');
5596 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N1 ON ' || l_temp_table || '
5597 --NOLOGGING
5598 (plan_id, inventory_item_id, organization_id, sr_instance_id, demand_class, demand_date)
5599 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5600
5601 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N1');
5602
5603 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5604 APPLICATION_SHORT_NAME => 'MSC',
5605 STATEMENT_TYPE => ad_ddl.create_index,
5606 STATEMENT => l_sql_stmt_1,
5607 OBJECT_NAME => l_temp_table);
5608
5609 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N1');
5610
5611 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N2 ON ' || l_temp_table || '
5612 -- NOLOGGING
5613 --Bug 3629191
5614 (plan_id,
5615 sales_order_line_id)
5616 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5617
5618 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N2');
5619
5620 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5621 APPLICATION_SHORT_NAME => 'MSC',
5622 STATEMENT_TYPE => ad_ddl.create_index,
5623 STATEMENT => l_sql_stmt_1,
5624 OBJECT_NAME => l_temp_table);
5625
5626 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N2');
5627
5628 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N3 ON ' || l_temp_table || '
5629 -- NOLOGGING
5630 --Bug 3629191
5631 (plan_id,
5632 parent_demand_id)
5633 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5634
5635 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N3');
5636
5637 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5638 APPLICATION_SHORT_NAME => 'MSC',
5639 STATEMENT_TYPE => ad_ddl.create_index,
5640 STATEMENT => l_sql_stmt_1,
5641 OBJECT_NAME => l_temp_table);
5642
5643 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N3');
5644 msc_util.msc_log('Done creating indexes on temp demand table');
5645
5646
5647 l_temp_table := 'MSC_TEMP_ALLOC_SUP_' || to_char(l_plan_id);
5648
5649 SELECT t.tablespace_name, NVL(i.def_tablespace_name, t.tablespace_name)
5650 INTO l_tbspace, l_ind_tbspace
5651 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
5652 --FROM dba_tab_partitions t,
5653 -- dba_part_indexes i
5654 FROM all_tab_partitions t,
5655 all_part_indexes i
5656 WHERE t.table_owner = l_msc_schema
5657 AND t.table_name = 'MSC_ALLOC_SUPPLIES'
5658 AND t.partition_name = 'ALLOC_SUPPLIES_' || to_char(l_plan_id)
5659 AND i.owner (+) = t.table_owner
5660 AND i.table_name (+) = t.table_name
5661 AND rownum = 1;
5662
5663 msc_util.msc_log('tb space : ' || l_tbspace);
5664 msc_util.msc_log('ind tbspace : ' || l_ind_tbspace);
5665
5666 --bug 6113544
5667 l_insert_stmt := 'CREATE TABLE ' || l_temp_table
5668 || ' TABLESPACE ' || l_tbspace
5669 || ' PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)'
5670 || ' as select * from msc_alloc_supplies where 1=2 ';
5671
5672 /*
5673 l_insert_stmt := 'CREATE TABLE ' || l_temp_table || '(
5674 PLAN_ID NUMBER NOT NULL,
5675 INVENTORY_ITEM_ID NUMBER NOT NULL,
5676 ORGANIZATION_ID NUMBER NOT NULL,
5677 SR_INSTANCE_ID NUMBER NOT NULL,
5678 DEMAND_CLASS VARCHAR2(30) , --bug3272444
5679 SUPPLY_DATE DATE NOT NULL,
5680 PARENT_TRANSACTION_ID NUMBER NOT NULL,
5681 ALLOCATED_QUANTITY NUMBER NOT NULL,
5682 ORDER_TYPE NUMBER NOT NULL,
5683 ORDER_NUMBER VARCHAR2(240),
5684 SCHEDULE_DESIGNATOR_ID NUMBER,
5685 SALES_ORDER_LINE_ID NUMBER,
5686 OLD_SUPPLY_DATE DATE,
5687 OLD_ALLOCATED_QUANTITY NUMBER,
5688 STEALING_FLAG NUMBER,
5689 CREATED_BY NUMBER NOT NULL,
5690 CREATION_DATE DATE NOT NULL,
5691 LAST_UPDATED_BY NUMBER NOT NULL,
5692 LAST_UPDATE_DATE DATE NOT NULL,
5693 FROM_DEMAND_CLASS VARCHAR2(80), -- ssurendr 25-NOV-2002: added for alloc w/b
5694 SUPPLY_QUANTITY NUMBER, -- ssurendr 25-NOV-2002: added for alloc w/b
5695 ORIGINAL_ORDER_TYPE NUMBER, -- For time_phased_atp --bug3272444
5696 ORIGINAL_ITEM_ID NUMBER, -- For time_phased_atp --bug3272444
5697 CUSTOMER_ID NUMBER, -- For time_phased_atp
5698 SHIP_TO_SITE_ID NUMBER,
5699 REFRESH_NUMBER NUMBER,
5700 OLD_REFRESH_NUMBER NUMBER, --bug3272444
5701 ATO_MODEL_LINE_ID NUMBER,
5702 --ATO_MODEL_LINE_ID NUMBER) -- For time_phased_atp commented as part of cmro
5703 DEMAND_SOURCE_TYPE NUMBER) --cmro
5704 TABLESPACE ' || l_tbspace || '
5705 -- NOLOGGING
5706 PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)';
5707 */
5708
5709 msc_util.msc_log('before creating table : ' || l_temp_table);
5710 BEGIN
5711 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5712 APPLICATION_SHORT_NAME => 'MSC',
5713 STATEMENT_TYPE => ad_ddl.create_table,
5714 STATEMENT => l_insert_stmt,
5715 OBJECT_NAME => l_temp_table);
5716 msc_util.msc_log('after creating table : ' || l_temp_table);
5717
5718 EXCEPTION
5719 WHEN others THEN
5720 msc_util.msc_log(sqlcode || ': ' || sqlerrm);
5721 msc_util.msc_log('Exception of create table : ' || l_temp_table);
5722
5723 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5724 APPLICATION_SHORT_NAME => 'MSC',
5725 STATEMENT_TYPE => ad_ddl.drop_table,
5726 STATEMENT => 'DROP TABLE ' || l_temp_table,
5727 OBJECT_NAME => l_temp_table);
5728
5729 msc_util.msc_log('After Drop table : ' ||l_temp_table);
5730 msc_util.msc_log('Before exception create table : ' ||l_temp_table);
5731
5732 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5733 APPLICATION_SHORT_NAME => 'MSC',
5734 STATEMENT_TYPE => ad_ddl.create_table,
5735 STATEMENT => l_insert_stmt,
5736 OBJECT_NAME => l_temp_table);
5737 msc_util.msc_log('After exception create table : ' ||l_temp_table);
5738 END;
5739
5740 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5741 -- to move demand on non-working day to prior working day.
5742
5743 -- cannot use append with other hints
5744 --l_insert_stmt := 'INSERT INTO /*+ APPEND */ ' || l_temp_table || '(
5745 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5746 plan_id,
5747 inventory_item_id,
5748 organization_id,
5749 sr_instance_id,
5750 demand_class,
5751 supply_date,
5752 allocated_quantity,
5753 parent_transaction_id,
5754 order_type,
5755 order_number,
5756 schedule_designator_id,
5757 created_by,
5758 creation_date,
5759 last_updated_by,
5760 last_update_date,
5761 supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
5762 (
5763 SELECT --5053818
5764 peg1.plan_id plan_id,
5765 peg1.inventory_item_id,
5766 peg1.organization_id,
5767 peg1.sr_instance_id,
5768 NVL(mv.demand_class, :def_num) demand_class,
5769 peg1.supply_date,
5770 SUM(peg1.allocated_quantity) allocated_quantity,
5771 peg1.transaction_id,
5772 peg1.order_type,
5773 peg1.order_number,
5774 peg1.schedule_designator_id,
5775 :l_user_id created_by,
5776 :l_sysdate creation_date,
5777 :l_user_id last_updated_by,
5778 :l_sysdate last_update_date,
5779 MIN(peg1.supply_quantity) supply_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
5780 -- min is used to select distinct values as supply_quantity would be
5781 -- repeating for the same transaction_id
5782 FROM -- msc_supply_pegging_v peg1,
5783 (SELECT --5053818
5784 -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
5785 -- parallel(cal,' || to_char(l_parallel_degree) || ')
5786 peg2.plan_id,
5787 peg2.inventory_item_id,
5788 peg2.organization_id,
5789 peg2.sr_instance_id,
5790 NVL (d.demand_class, :def_num) demand_class,
5791 trunc(s.new_schedule_date) supply_date,
5792 -- cal.next_date supply_date,
5793 -- cal.calendar_date supply_date, -- 2859130
5794 peg2.allocated_quantity,
5795 peg2.transaction_id,
5796 s.order_type,
5797 s.order_number,
5798 s.schedule_designator_id,
5799 nvl(s.firm_quantity,s.new_order_quantity) supply_quantity -- rajjain 02/06/2003 Bug 2782882
5800 --peg2.supply_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
5801 FROM msc_supplies s,
5802 msc_full_pegging peg2,
5803 msc_full_pegging peg1,
5804 msc_demands d
5805 -- time_phased_atp msc_trading_partners tp
5806 -- 2859130 msc_calendar_dates cal
5807 WHERE peg2.plan_id = peg1.plan_id
5808 AND peg2.end_pegging_id = peg1.pegging_id
5809 AND d.plan_id = peg1.plan_id
5810 AND d.demand_id = peg1.demand_id
5811 AND d.sr_instance_id = peg1.sr_instance_id
5812 AND d.inventory_item_id = peg1.inventory_item_id
5813 AND s.plan_id = peg2.plan_id
5814 AND s.transaction_id = peg2.transaction_id
5815 AND s.sr_instance_id = peg2.sr_instance_id
5816 -- time_phased_atp
5817 --AND tp.sr_tp_id = peg2.organization_id
5818 --AND tp.partner_type = 3 -- bug2646304
5819 --AND tp.sr_instance_id = peg2.sr_instance_id
5820 -- 2859130 AND tp.sr_instance_id = cal.sr_instance_id
5821 --AND tp.calendar_code = cal.calendar_code
5822 --AND tp.calendar_exception_set_id = cal.exception_set_id
5823 --AND TRUNC(s.new_schedule_date) = cal.calendar_date
5824 ) peg1,
5825 msc_item_hierarchy_mv mv
5826 WHERE peg1.plan_id = :p_plan_id
5827 AND peg1.inventory_item_id = mv.inventory_item_id(+)
5828 AND peg1.organization_id = mv.organization_id (+)
5829 AND peg1.sr_instance_id = mv.sr_instance_id (+)
5830 AND peg1.supply_date >= mv.effective_date (+)
5831 AND peg1.supply_date <= mv.disable_date (+)
5832 AND peg1.demand_class = mv.demand_class (+)
5833 AND mv.level_id (+) = -1
5834 GROUP BY
5835 peg1.plan_id,
5836 peg1.inventory_item_id,
5837 peg1.organization_id,
5838 peg1.sr_instance_id,
5839 NVL(mv.demand_class, :def_num),
5840 peg1.supply_date,
5841 peg1.transaction_id,
5842 peg1.order_type,
5843 peg1.order_number,
5844 peg1.schedule_designator_id,
5845 :l_user_id,
5846 :l_sysdate,
5847 :l_user_id,
5848 :l_sysdate)';
5849
5850 msc_util.msc_log('After Generating first supplies sql');
5851
5852 -- Parse cursor handler for sql_stmt: Don't open as its already opened
5853
5854 DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5855 msc_util.msc_log('After parsing first supplies sql');
5856
5857 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5858 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5859 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5860 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5861 msc_util.msc_log('after binding the variables');
5862
5863 -- Execute the cursor
5864 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5865 msc_util.msc_log('After executing first supplies cursor');
5866
5867 msc_util.msc_log('After inserting in msc_alloc_supplies part 1');
5868
5869 -- parallel hint can't be used with union all. Use two query instead */
5870
5871 -- UNION ALL
5872
5873 -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5874 -- to move demand on non-working day to prior working day.
5875
5876 /* time_phased_atp - project atp forward port
5877 * If the profile is set to 'Yes' then:
5878 * o If supply has a demand class existing on allocation rule then
5879 * allocate the supply to that demand class.
5880 * o If supply has a demand class not present on allocation rule then
5881 * allocate the supply to 'OTHER'.
5882 * o If supply does not have a demand class present, allocate the supply
5883 * to 'OTHER'.
5884 * Else: Allocate the supply to 'OTHER'*/
5885 IF l_excess_supply_by_dc = 'Y' THEN
5886 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5887 plan_id,
5888 inventory_item_id,
5889 organization_id,
5890 sr_instance_id,
5891 demand_class,
5892 supply_date,
5893 allocated_quantity,
5894 parent_transaction_id,
5895 order_type,
5896 order_number,
5897 schedule_designator_id,
5898 created_by,
5899 creation_date,
5900 last_updated_by,
5901 last_update_date,
5902 supply_quantity)
5903 (
5904 SELECT --5053818
5905 pegging_v.plan_id plan_id,
5906 pegging_v.inventory_item_id,
5907 pegging_v.organization_id,
5908 pegging_v.sr_instance_id,
5909 NVL(mv.demand_class, :def_num) demand_class,
5910 pegging_v.supply_date,
5911 SUM(pegging_v.allocated_quantity),
5912 pegging_v.transaction_id,
5913 pegging_v.order_type,
5914 pegging_v.order_number,
5915 pegging_v.schedule_designator_id,
5916 :l_user_id,
5917 :l_sysdate,
5918 :l_user_id,
5919 :l_sysdate,
5920 MIN(pegging_v.supply_quantity)
5921 FROM
5922 (SELECT --5053818
5923 peg1.plan_id plan_id,
5924 peg1.inventory_item_id,
5925 peg1.organization_id,
5926 peg1.sr_instance_id,
5927 NVL(s.demand_class, :def_num) demand_class,
5928 trunc(s.new_schedule_date) supply_date,
5929 peg1.allocated_quantity,
5930 peg1.transaction_id,
5931 s.order_type,
5932 s.order_number,
5933 s.schedule_designator_id,
5934 nvl(s.firm_quantity,s.new_order_quantity) supply_quantity
5935 FROM msc_full_pegging peg2,
5936 msc_full_pegging peg1,
5937 msc_supplies s
5938 WHERE peg1.plan_id = :p_plan_id
5939 AND peg2.plan_id = peg1.plan_id
5940 AND peg2.pegging_id = peg1.end_pegging_id
5941 AND peg2.demand_id IN (-1, -2)
5942 AND s.plan_id = peg1.plan_id
5943 AND s.transaction_id = peg1.transaction_id
5944 AND s.sr_instance_id = peg1.sr_instance_id) pegging_v,
5945 msc_item_hierarchy_mv mv
5946 WHERE pegging_v.inventory_item_id = mv.inventory_item_id(+)
5947 AND pegging_v.organization_id = mv.organization_id (+)
5948 AND pegging_v.sr_instance_id = mv.sr_instance_id (+)
5949 AND pegging_v.supply_date >= mv.effective_date (+)
5950 AND pegging_v.supply_date <= mv.disable_date (+)
5951 AND pegging_v.demand_class = mv.demand_class (+)
5952 AND mv.level_id (+) = -1
5953 GROUP BY
5954 pegging_v.plan_id,
5955 pegging_v.inventory_item_id,
5956 pegging_v.organization_id,
5957 pegging_v.sr_instance_id,
5958 NVL(mv.demand_class, :def_num),
5959 pegging_v.supply_date,
5960 pegging_v.transaction_id,
5961 pegging_v.order_type,
5962 pegging_v.order_number,
5963 pegging_v.schedule_designator_id,
5964 :l_user_id,
5965 :l_sysdate,
5966 :l_user_id,
5967 :l_sysdate)';
5968
5969 ELSE
5970 -- cannot use append with other hints
5971 --l_insert_stmt := 'INSERT INTO /*+ APPEND */ ' || l_temp_table || '(
5972 l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5973 plan_id,
5974 inventory_item_id,
5975 organization_id,
5976 sr_instance_id,
5977 demand_class,
5978 supply_date,
5979 allocated_quantity,
5980 parent_transaction_id,
5981 order_type,
5982 order_number,
5983 schedule_designator_id,
5984 created_by,
5985 creation_date,
5986 last_updated_by,
5987 last_update_date,
5988 supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
5989 (
5990 SELECT --5053818
5991 -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
5992 --2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
5993 peg1.plan_id plan_id,
5994 peg1.inventory_item_id,
5995 peg1.organization_id,
5996 peg1.sr_instance_id,
5997 :def_num demand_class,
5998 trunc(s.new_schedule_date),
5999 -- cal.next_date,
6000 --cal.calendar_date, -- 2859130
6001 SUM(peg1.allocated_quantity),
6002 peg1.transaction_id,
6003 s.order_type,
6004 s.order_number,
6005 s.schedule_designator_id,
6006 :l_user_id,
6007 :l_sysdate,
6008 :l_user_id,
6009 :l_sysdate,
6010 MIN(nvl(s.firm_quantity,s.new_order_quantity)) -- rajjain 02/06/2003 Bug 2782882
6011 --MIN(peg1.supply_quantity) -- ssurendr 25-NOV-2002: added for alloc w/b
6012 -- min is used to select distinct values as supply_quantity would be
6013 -- repeating for the same transaction_id
6014 FROM msc_full_pegging peg2,
6015 msc_full_pegging peg1,
6016 msc_supplies s
6017 -- msc_trading_partners tp
6018 -- msc_calendar_dates cal
6019 WHERE peg1.plan_id = :p_plan_id
6020 AND peg2.plan_id = peg1.plan_id
6021 AND peg2.pegging_id = peg1.end_pegging_id
6022 AND peg2.demand_id IN (-1, -2)
6023 AND s.plan_id = peg1.plan_id
6024 AND s.transaction_id = peg1.transaction_id
6025 AND s.sr_instance_id = peg1.sr_instance_id
6026 -- time_phased_atp
6027 --AND tp.sr_tp_id = peg1.organization_id
6028 --AND tp.partner_type = 3 -- bug2646304
6029 --AND tp.sr_instance_id = peg1.sr_instance_id
6030 -- 2859130 AND tp.sr_instance_id = cal.sr_instance_id
6031 --AND tp.calendar_code = cal.calendar_code
6032 --AND tp.calendar_exception_set_id = cal.exception_set_id
6033 --AND TRUNC(s.new_schedule_date) = cal.calendar_date
6034 GROUP BY
6035 peg1.plan_id,
6036 peg1.inventory_item_id,
6037 peg1.organization_id,
6038 peg1.sr_instance_id,
6039 :def_num,
6040 trunc(s.new_schedule_date),
6041 -- cal.next_date, -- 2859130
6042 peg1.transaction_id,
6043 s.order_type,
6044 s.order_number,
6045 s.schedule_designator_id,
6046 :l_user_id,
6047 :l_sysdate,
6048 :l_user_id,
6049 :l_sysdate)';
6050 END IF;
6051 -- time_phased_atp - project atp forward port
6052
6053 msc_util.msc_log('After Generating second supplies sql');
6054
6055 -- Parse cursor handler for sql_stmt: Don't open as its already opened
6056
6057 DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
6058 msc_util.msc_log('After parsing second supplies sql');
6059
6060 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
6061 DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
6062 DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
6063 DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
6064 msc_util.msc_log('after binding the variables');
6065
6066 -- Execute the cursor
6067 rows_processed := DBMS_SQL.EXECUTE(cur_handler);
6068 msc_util.msc_log('After executing second supplies cursor');
6069
6070 msc_util.msc_log('After inserting in msc_alloc_supplies part 2');
6071 commit;
6072
6073 msc_util.msc_log('before creating indexes on temp supply table');
6074 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N1 ON ' || l_temp_table || '
6075 -- NOLOGGING
6076 (plan_id, inventory_item_id, organization_id, sr_instance_id, demand_class, supply_date)
6077 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6078
6079 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N1');
6080
6081 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6082 APPLICATION_SHORT_NAME => 'MSC',
6083 STATEMENT_TYPE => ad_ddl.create_index,
6084 STATEMENT => l_sql_stmt_1,
6085 OBJECT_NAME => l_temp_table);
6086
6087 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N1');
6088
6089 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N2 ON ' || l_temp_table || '
6090 -- NOLOGGING
6091 --Bug 3629191
6092 (plan_id,
6093 parent_transaction_id)
6094 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6095
6096 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N2');
6097
6098 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6099 APPLICATION_SHORT_NAME => 'MSC',
6100 STATEMENT_TYPE => ad_ddl.create_index,
6101 STATEMENT => l_sql_stmt_1,
6102 OBJECT_NAME => l_temp_table);
6103
6104 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N2');
6105
6106 -- 2623646
6107 l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N3 ON ' || l_temp_table || '
6108 -- NOLOGGING
6109 --Bug 3629191
6110 (plan_id,
6111 sales_order_line_id)
6112 STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6113
6114 msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N3');
6115
6116 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6117 APPLICATION_SHORT_NAME => 'MSC',
6118 STATEMENT_TYPE => ad_ddl.create_index,
6119 STATEMENT => l_sql_stmt_1,
6120 OBJECT_NAME => l_temp_table);
6121
6122 msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N3');
6123
6124 msc_util.msc_log('Gather Table Stats for Allocated S/D Tables');
6125
6126 fnd_stats.gather_table_stats(l_msc_schema, 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id), granularity => 'ALL');
6127 fnd_stats.gather_table_stats(l_msc_schema, 'MSC_TEMP_ALLOC_SUP_' || to_char(l_plan_id), granularity => 'ALL');
6128
6129 msc_util.msc_log('swap partition for demands');
6130 l_partition_name := 'ALLOC_DEMANDS_' || to_char(l_plan_id);
6131
6132 msc_util.msc_log('Partition name for msc_alloc_demands table : ' || l_partition_name);
6133
6134 -- swap partiton for supplies and demand part
6135
6136 l_sql_stmt := 'ALTER TABLE msc_alloc_demands EXCHANGE PARTITION ' || l_partition_name ||
6137 ' with table MSC_TEMP_ALLOC_DEM_'|| to_char(l_plan_id) ||
6138 ' including indexes without validation';
6139
6140 BEGIN
6141 msc_util.msc_log('Before alter table msc_alloc_demands');
6142 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6143 APPLICATION_SHORT_NAME => 'MSC',
6144 STATEMENT_TYPE => ad_ddl.alter_table,
6145 STATEMENT => l_sql_stmt,
6146 OBJECT_NAME => 'MSC_ALLOC_DEMANDS');
6147 END;
6148
6149 msc_util.msc_log('swap partition for supplies');
6150 l_partition_name := 'ALLOC_SUPPLIES_' || to_char(l_plan_id);
6151
6152 msc_util.msc_log('Partition name for msc_alloc_supplies table : ' || l_partition_name);
6153
6154 l_sql_stmt := 'ALTER TABLE msc_alloc_supplies EXCHANGE PARTITION ' || l_partition_name ||
6155 ' with table MSC_TEMP_ALLOC_SUP_'|| to_char(l_plan_id) ||
6156 ' including indexes without validation';
6157
6158 BEGIN
6159 msc_util.msc_log('Before alter table msc_alloc_supplies');
6160 ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6161 APPLICATION_SHORT_NAME => 'MSC',
6162 STATEMENT_TYPE => ad_ddl.alter_table,
6163 STATEMENT => l_sql_stmt,
6164 OBJECT_NAME => 'MSC_ALLOC_SUPPLIES');
6165 END;
6166
6167 msc_util.msc_log('Call procedure clean_temp_tables');
6168
6169 -- clean temp tables after exchanging partitions
6170 clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6171
6172 msc_util.msc_log('After procedure clean_temp_tables');
6173
6174 END IF; -- IF l_share_partition = 'Y'
6175
6176 --5027568
6177 --insert reservation_records to msc_alloc_demands.
6178 msc_util.msc_log('inserting reservation rows in msc_alloc_demands');
6179 INSERT INTO MSC_ALLOC_DEMANDS(
6180 plan_id,
6181 inventory_item_id,
6182 organization_id,
6183 sr_instance_id,
6184 demand_class,
6185 demand_date,
6186 allocated_quantity,
6187 parent_demand_id,
6188 origination_type,
6189 order_number,
6190 sales_order_line_id,
6191 created_by,
6192 creation_date,
6193 last_updated_by,
6194 last_update_date,
6195 demand_quantity
6196 )
6197 (SELECT
6198 plan_id,
6199 USING_ASSEMBLY_ITEM_ID,
6200 ORGANIZATION_ID,
6201 SR_INSTANCE_ID,
6202 DECODE(DEMAND_CLASS, NULL, '-1', MSC_AATP_FUNC.Get_Hierarchy_Demand_Class(
6203 NULL,
6204 NULL,
6205 USING_ASSEMBLY_ITEM_ID,
6206 ORGANIZATION_ID,
6207 SR_INSTANCE_ID,
6208 TRUNC(SYSDATE),
6209 NULL,
6210 DEMAND_CLASS)), --bug 13064033
6211 TRUNC(SYSDATE),
6212 using_requirement_quantity,
6213 demand_id,
6214 origination_type,
6215 ORDER_NUMBER,
6216 SALES_ORDER_LINE_ID,
6217 CREATED_BY,
6218 CREATION_DATE,
6219 LAST_UPDATED_BY,
6220 LAST_UPDATE_DATE,
6221 using_requirement_quantity
6222 from msc_demands
6223 where plan_id = p_plan_id
6224 and origination_type = -100
6225 and using_requirement_quantity <> 0
6226 );
6227 msc_util.msc_log('inserted reservation rows in msc_alloc_demands :' || SQL%ROWCOUNT);
6228
6229 BEGIN
6230 update msc_plans
6231 set summary_flag = 3
6232 where plan_id = p_plan_id;
6233 END;
6234
6235 RETCODE := G_SUCCESS;
6236 commit;
6237
6238 msc_util.msc_log('End procedure post_plan_allocation');
6239
6240 EXCEPTION
6241 WHEN OTHERS THEN
6242 msc_util.msc_log('Inside main exception of post_plan_allocation');
6243 msc_util.msc_log(sqlerrm);
6244 ERRBUF := sqlerrm;
6245
6246 BEGIN
6247 update msc_plans
6248 set summary_flag = 1
6249 where plan_id = p_plan_id;
6250 commit;
6251 END;
6252
6253 RETCODE := G_ERROR;
6254 IF (l_share_partition = 'Y') THEN
6255 ROLLBACK;
6256 ELSE
6257 msc_util.msc_log('Call procedure clean_temp_tables in exception');
6258
6259 -- clean temp tables after exchanging partitions
6260 IF l_plan_id IS NOT NULL THEN
6261 clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6262 END IF;
6263
6264 msc_util.msc_log('After procedure clean_temp_tables in exception');
6265 END IF;
6266 END post_plan_allocation;
6267
6268 -- ngoel 5/7/2002, added new API to be called from planning process to launch concurrent program
6269 -- for post-plan process for summary/ pre-allocation process.
6270
6271 procedure atp_post_plan_proc(
6272 p_plan_id IN NUMBER,
6273 p_alloc_mode IN NUMBER := 0,
6274 p_summary_mode IN NUMBER := 0,
6275 x_retcode OUT NoCopy NUMBER,
6276 x_errbuf OUT NoCopy VARCHAR2
6277 )
6278 IS
6279 l_count NUMBER:=0; -- bug 10173431
6280 l_count1 NUMBER:=0; -- bug 10173431
6281 l_inv_ctp NUMBER;
6282 l_alloc_atp VARCHAR2(1);
6283 l_class_hrchy NUMBER;
6284 l_alloc_method NUMBER;
6285 l_enable_summary_mode VARCHAR2(1);
6286 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6287 --l_submit_request VARCHAR2(1) := 'N';
6288 l_request_id NUMBER;
6289
6290 -- 24x7 ATP
6291 l_copy_plan_id NUMBER;
6292
6293 BEGIN
6294 msc_util.msc_log('Begin procedure atp_post_plan_proc');
6295 msc_util.msc_log('plan : ' || p_plan_id);
6296 msc_util.msc_log('Allocation Mode : ' || p_alloc_mode);
6297 msc_util.msc_log('Summary Mode : ' || p_summary_mode);
6298
6299 x_retcode := G_SUCCESS;
6300
6301 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
6302
6303 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
6304
6305 /* time_phased_atp changes begin
6306 Always call atp post plan processing conc prog if PDS
6307 IF l_enable_summary_mode = 'Y' AND l_inv_ctp = 4 AND l_alloc_atp = 'N' THEN
6308 l_submit_request := 'Y';
6309 ELSIF l_inv_ctp = 4 AND l_alloc_atp = 'Y' AND l_class_hrchy = 1 AND l_alloc_method = 1 THEN
6310 l_submit_request := 'Y';
6311 END IF;
6312
6313 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6314 IF l_inv_ctp = 4 THEN
6315 l_submit_request := 'Y';
6316 END IF;*/
6317 -- time_phased_atp changes end
6318
6319 ---bug 3274373
6320 IF l_inv_ctp = 4 THEN
6321
6322 -- Bug 3491498, check if plan is ATPable. Moved up to check it prior to refresh MSC_ATP_PLAN_SN
6323 SELECT count(*)
6324 INTO l_count
6325 FROM msc_plans plans,
6326 msc_designators desig
6327 WHERE desig.inventory_atp_flag = 1
6328 AND plans.plan_id = p_plan_id
6329 AND plans.compile_designator = desig.designator
6330 AND plans.sr_instance_id = desig.sr_instance_id
6331 AND plans.organization_id = desig.organization_id
6332 AND plans.plan_completion_date is not null
6333 AND plans.data_completion_date is not null
6334 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6335 AND plans.plan_type <> 4;
6336
6337 msc_util.msc_log('Count for plan : ' || l_count);
6338
6339 IF l_count > 0 THEN
6340 msc_util.msc_log('Before refreshing MSC_ATP_PLAN_SN');
6341 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6342 'MSC',
6343 'MSCREFMV',
6344 NULL, -- description
6345 NULL, -- start time
6346 FALSE, -- sub request
6347 'MSC_ATP_PLAN_SN',
6348 724);
6349 msc_util.msc_log('Request id for refreshing snapshot := ' || l_request_id);
6350 msc_util.msc_log('After refreshing MSC_ATP_PLAN_SN');
6351 END IF; --IF l_count = 0 THEN
6352 END IF;
6353
6354 -- Bug 3491498, moved prior to call to refresh MSC_ATP_PLAN_SN
6355 /*
6356 SELECT count(*)
6357 INTO l_count
6358 FROM msc_plans plans,
6359 msc_designators desig
6360 WHERE desig.inventory_atp_flag = 1
6361 AND plans.plan_id = p_plan_id
6362 AND plans.compile_designator = desig.designator
6363 AND plans.sr_instance_id = desig.sr_instance_id
6364 AND plans.organization_id = desig.organization_id
6365 AND plans.plan_completion_date is not null
6366 AND plans.data_completion_date is not null;
6367
6368 msc_util.msc_log('Count for plan : ' || l_count);
6369 msc_util.msc_log('l_submit_request : ' || l_submit_request);
6370 */
6371
6372 -- 24x7 ATP
6373 BEGIN
6374 select nvl (copy_plan_id, -1)
6375 into l_copy_plan_id
6376 from msc_plans
6377 where plan_id = p_plan_id
6378 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6379 AND plan_type <> 4;
6380 EXCEPTION
6381 when others then
6382 l_copy_plan_id := -1;
6383 END;
6384
6385 msc_util.msc_log ('l_copy_plan_id = '||l_copy_plan_id);
6386 -- bug 10173431
6387 IF l_copy_plan_id > 0 THEN
6388
6389 SELECT count(*)
6390 INTO l_count1
6391 FROM msc_plans plans,
6392 msc_designators desig
6393 WHERE desig.inventory_atp_flag = 1
6394 AND plans.plan_id = l_copy_plan_id
6395 AND plans.compile_designator = desig.designator
6396 AND plans.sr_instance_id = desig.sr_instance_id
6397 AND plans.organization_id = desig.organization_id
6398 AND plans.plan_completion_date is not null
6399 AND plans.data_completion_date is not null
6400 AND plans.plan_type <> 4;
6401
6402 END IF;
6403
6404 msc_util.msc_log ('Count for l_count1 = '||l_count1);
6405 if (l_copy_plan_id > 0 and l_count1 > 0) then
6406 -- plan copy exists . force the execution of other things.
6407 l_count := 1;
6408 msc_util.msc_log ('Plan determined to be a 24x7 plan');
6409 end if;
6410
6411 IF l_count = 0 THEN
6412 UPDATE msc_plans
6413 SET summary_flag = 1
6414 WHERE plan_id = p_plan_id;
6415
6416 COMMIT;
6417 RETURN;
6418 END IF;
6419
6420 BEGIN
6421 msc_util.msc_log('before launching concurrent program');
6422 -- Bug 3292949
6423 UPDATE msc_plans
6424 SET summary_flag = 1
6425 WHERE plan_id = p_plan_id;
6426 msc_util.msc_log('Reset summary flag back to default:1 before conc prg launch');
6427 -- End Bug 3292949
6428 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6429 'MSC',
6430 'MSC_ATP_PDS_SUMM',
6431 NULL, -- description
6432 NULL, -- start time
6433 FALSE, -- sub request
6434 p_plan_id,
6435 2); -- Bug 3478888 Pass calling module as 2 as
6436 -- ATP Post Plan Processing is called from planning
6437
6438 UPDATE msc_plans /* for 24x7 ATP */
6439 SET request_id = l_request_id
6440 WHERE plan_id = p_plan_id;
6441
6442 COMMIT;
6443
6444 msc_util.msc_log('Request ID :' || l_request_id);
6445
6446 EXCEPTION
6447 WHEN OTHERS THEN
6448 msc_util.msc_log ('Conc. program error : ' || sqlcode || ':' || sqlerrm);
6449 x_retcode := G_ERROR;
6450 x_errbuf := sqlerrm;
6451 END;
6452 END atp_post_plan_proc;
6453
6454 /*
6455 * dsting 7/24/2002
6456 *
6457 * Deletes entries from mrp_atp_schedule_temp and mrp_atp_details_temp
6458 * older than p_hours old
6459 *
6460 */
6461 PROCEDURE ATP_Purge_MRP_Temp(
6462 ERRBUF OUT NoCopy VARCHAR2,
6463 RETCODE OUT NoCopy NUMBER,
6464 p_hours IN NUMBER
6465 )
6466 IS
6467 l_retain_date DATE;
6468 -- rajjain 12/20/2002
6469 l_spid VARCHAR2(12);
6470 l_mrp_schema VARCHAR2(30); --bug3545959
6471 l_msc_schema VARCHAR2(30); --bug3940999
6472 BEGIN
6473
6474 -- Bug 3304390 Disable Trace
6475 -- Deleted Related Code.
6476
6477 RETCODE := G_SUCCESS;
6478
6479 msc_util.msc_log('********** MRP_ATP_Purge_Temp **********');
6480 msc_util.msc_log('p_hours: ' || p_hours );
6481
6482 IF NVL(p_hours,0) > 0 THEN
6483
6484 l_retain_date := sysdate - p_hours/24;
6485
6486 msc_util.msc_log('Delete records older than l_retain_date ' ||
6487 to_char(l_retain_date, 'DD:MM:YYYY hh24:mi:ss'));
6488 msc_util.msc_log('Now sysdate: ' ||
6489 to_char(sysdate, 'DD:MM:YYYY hh24:mi:ss'));
6490
6491
6492 DELETE FROM mrp_atp_schedule_temp
6493 WHERE last_update_date < l_retain_date;
6494
6495 msc_util.msc_log('Records Deleted from mrp_atp_schedule_temp : ' ||
6496 SQL%ROWCOUNT);
6497
6498 --3670695: issue commit so that rollback segment is freed
6499 commit;
6500
6501 DELETE FROM mrp_atp_details_temp
6502 WHERE last_update_date < l_retain_date;
6503
6504 msc_util.msc_log('Records Deleted from mrp_atp_details_temp : ' ||
6505 SQL%ROWCOUNT);
6506 --bug3940999
6507 DELETE FROM msc_atp_src_profile_temp
6508 WHERE last_update_date < l_retain_date;
6509
6510 msc_util.msc_log('Records Deleted from msc_atp_src_profile_temp : ' ||
6511 SQL%ROWCOUNT);
6512
6513 ELSE
6514 msc_util.msc_log('completely purging temp tables');
6515 --bug3545959 start
6516 SELECT a.oracle_username
6517 INTO l_mrp_schema
6518 FROM FND_ORACLE_USERID a,
6519 FND_PRODUCT_INSTALLATIONS b
6520 WHERE a.oracle_id = b.oracle_id
6521 AND b.application_id = 704;
6522
6523 msc_util.msc_log('l_mrp_schema: ' || l_mrp_schema );
6524 --bug3545959 end
6525 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_schedule_temp';
6526 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_details_temp';
6527
6528 --bug3940999
6529 SELECT a.oracle_username
6530 INTO l_msc_schema
6531 FROM FND_ORACLE_USERID a,
6532 FND_PRODUCT_INSTALLATIONS b
6533 WHERE a.oracle_id = b.oracle_id
6534 AND b.application_id = 724;
6535
6536 msc_util.msc_log('l_msc_schema: ' || l_msc_schema );
6537
6538 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_msc_schema ||'.msc_atp_src_profile_temp';
6539
6540 END IF;
6541
6542 commit;
6543 EXCEPTION
6544 WHEN others THEN
6545 msc_util.msc_log('Error while purging temp tables : ' ||
6546 sqlcode || ' : ' || sqlerrm);
6547 rollback;
6548 END ATP_Purge_MRP_Temp;
6549
6550
6551 -- New procedure for summary enhancement
6552 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id IN NUMBER,
6553 p_share_partition IN varchar2,
6554 p_optimized_plan IN NUMBER, -- 1:Yes, 2:No
6555 p_full_refresh IN NUMBER, -- 1:Yes, 2:No
6556 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
6557 p_plan_type IN NUMBER, -- ATP4drp
6558 p_last_refresh_number IN NUMBER,
6559 p_new_refresh_number IN NUMBER,
6560 p_sys_date IN DATE)
6561 IS
6562 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
6563 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
6564 l_supplier_id_tab MRP_ATP_PUB.number_arr;
6565 l_supplier_site_id_tab MRP_ATP_PUB.number_arr;
6566 l_sd_date_tab MRP_ATP_PUB.date_arr;
6567 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
6568 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6569 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6570 l_ins_supplier_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6571 l_ins_supplier_site_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6572 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
6573 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6574
6575 -- ATPR4drp
6576 l_plan_type NUMBER;
6577 BEGIN
6578 msc_util.msc_log('************ LOAD_PLAN_SUMMARY_SD begin *************');
6579 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_plan_id - ' || p_plan_id);
6580 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_share_partition - ' || p_share_partition);
6581 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_optimized_plan - ' || p_optimized_plan);
6582 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_full_refresh - ' || p_full_refresh);
6583
6584 -- ATP4drp changes begin
6585 -- print plan_type
6586
6587 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Plan Type p_plan_type -> ' || p_plan_type);
6588 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6589
6590 -- END ATP4drp
6591
6592
6593 IF p_full_refresh = 1 THEN
6594 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside full summation');
6595
6596 -- first delete existing data. p_share_partition = 'N' data has already been deleted
6597 IF p_share_partition = 'Y' THEN
6598
6599 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside shared part_partition');
6600 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'before deleteing data from the table');
6601
6602 DELETE MSC_ATP_SUMMARY_SD where plan_id = p_plan_id;
6603 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After deleting data from the table');
6604
6605 END IF; --- IF share_partition = 'Y'
6606
6607 -- Now insert new data
6608 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6609 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6610 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6611
6612 load_sd_full_alloc(p_plan_id, p_sys_date);
6613
6614 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6615 ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6616 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unallocated ATP');
6617 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6618
6619 IF nvl(p_optimized_plan, 2) <> 1 THEN
6620 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unconstrained plan');
6621 IF p_time_phased_pf = 1 THEN
6622 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6623 load_sd_full_unalloc_unopt_pf(p_plan_id, p_sys_date);
6624 ELSE
6625 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6626 load_sd_full_unalloc_unopt(p_plan_id, p_sys_date);
6627 END IF;
6628 ELSE
6629 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Constrained plan');
6630 IF p_time_phased_pf = 1 THEN
6631 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6632 load_sd_full_unalloc_opt_pf(p_plan_id, p_sys_date);
6633 ELSE
6634 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6635 -- ATP4drp Call DRP specific summary
6636 IF (p_plan_type = 5) THEN
6637 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call FULL Summary for DRP plan.');
6638 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6639 MSC_ATP_DRP.load_sd_full_drp(p_plan_id, p_sys_date);
6640 ELSE -- Call rest summary
6641 load_sd_full_unalloc_opt(p_plan_id, p_sys_date);
6642 END IF;
6643 -- End ATP4drp
6644 END IF;
6645 END IF;
6646
6647 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6648 END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6649
6650 ELSE --- IF p_full_refresh = 1 THEN
6651 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside incremental summation');
6652
6653 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6654 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6655 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6656
6657 load_sd_net_alloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6658
6659 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6660 ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6661 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside unallocated ATP');
6662 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6663
6664 -- ATP4drp Call DRP specific summary
6665 IF (p_plan_type = 5) THEN
6666 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call NET Summary for DRP plan.');
6667 MSC_ATP_DRP.load_sd_net_drp(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6668 ELSE -- Call rest summary
6669 load_sd_net_unalloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_time_phased_pf, p_sys_date);
6670 END IF;
6671 -- ATP4drp
6672
6673 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6674 END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6675
6676 END IF; --- IF p_full_refresh = 1 THEN
6677
6678 END LOAD_PLAN_SUMMARY_SD;
6679
6680 -- summary enhancement : private procedure for full summation of supply/demand
6681 -- for unconstrained plans for unallocated cases if no time
6682 -- phased PF ATP setup exist for the plan
6683 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id IN NUMBER,
6684 p_sys_date IN DATE)
6685 IS
6686 l_user_id NUMBER;
6687 BEGIN
6688
6689 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT Begin ********');
6690
6691 l_user_id := FND_GLOBAL.USER_ID;
6692
6693 INSERT INTO MSC_ATP_SUMMARY_SD (
6694 plan_id,
6695 sr_instance_id,
6696 organization_id,
6697 inventory_item_id,
6698 demand_class,
6699 sd_date,
6700 sd_qty,
6701 last_update_date,
6702 last_updated_by,
6703 creation_date,
6704 created_by)
6705 (SELECT plan_id,
6706 sr_instance_id,
6707 organization_id,
6708 inventory_item_id,
6709 demand_class,
6710 SD_DATE,
6711 sum(sd_qty),
6712 last_update_date,
6713 last_updated_by,
6714 creation_date,
6715 created_by
6716 --Bug 6046524 added index hint for performance improvement.
6717 from (SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6718 I.plan_id plan_id,
6719 I.sr_instance_id,
6720 I.organization_id,
6721 I.inventory_item_id,
6722 '@@@' demand_class,
6723 -- TRUNC(C.PRIOR_DATE) SD_DATE,
6724 C.CALENDAR_DATE SD_DATE, -- 2859130
6725 -1* DECODE(D.ORIGINATION_TYPE,
6726 4, D.DAILY_DEMAND_RATE,
6727 D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6728 p_sys_date last_update_date,
6729 l_user_id last_updated_by,
6730 p_sys_date creation_date,
6731 l_user_id created_by
6732 FROM MSC_SYSTEM_ITEMS I,
6733 MSC_TRADING_PARTNERS P,
6734 MSC_DEMANDS D,
6735 MSC_CALENDAR_DATES C
6736 WHERE I.ATP_FLAG = 'Y'
6737 AND I.PLAN_ID = p_plan_id
6738 AND D.PLAN_ID = I.PLAN_ID
6739 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6740 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6741 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
6742 -- 1243985
6743 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
6744 -- Bug 1530311, forecast to be excluded
6745 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6746 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6747 AND C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6748 -- since we store repetitive schedule demand in different ways for
6749 -- ods (total quantity on start date) and pds (daily quantity from
6750 -- start date to end date), we need to make sure we only select work day
6751 -- for pds's repetitive schedule demand.
6752 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6753 AND C.CALENDAR_DATE
6754 BETWEEN
6755 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6756 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6757 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6758 AND
6759 TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6760 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6761 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6762 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6763 AND ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6764 (D.ORIGINATION_TYPE <> 4))
6765 AND I.ORGANIZATION_ID = P.SR_TP_ID
6766 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6767 AND P.PARTNER_TYPE = 3
6768 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6769
6770 UNION ALL
6771
6772 --Bug 6046524 added index hint for performance improvement.
6773 SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6774 I.plan_id plan_id,
6775 I.sr_instance_id,
6776 I.organization_id,
6777 I.inventory_item_id,
6778 '@@@' demand_class,
6779 -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6780 C.CALENDAR_DATE SD_DATE,
6781 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
6782 p_sys_date last_update_date,
6783 l_user_id last_updated_by,
6784 p_sys_date creation_date,
6785 l_user_id created_by
6786 FROM MSC_SYSTEM_ITEMS I,
6787 MSC_TRADING_PARTNERS P,
6788 MSC_SUPPLIES S,
6789 MSC_CALENDAR_DATES C
6790 WHERE I.ATP_FLAG = 'Y'
6791 AND I.PLAN_ID = p_plan_id
6792 AND S.PLAN_ID = I.PLAN_ID
6793 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6794 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6795 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
6796 -- Exclude Cancelled Supplies 2460645
6797 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6798 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6799 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6800 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6801 AND C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6802 AND C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6803 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6804 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
6805 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6806 AND I.ORGANIZATION_ID = P.SR_TP_ID
6807 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6808 AND P.PARTNER_TYPE = 3
6809 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6810 )
6811 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6812 last_update_date, last_updated_by, creation_date, created_by );
6813
6814 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6815 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT End ********');
6816
6817 END LOAD_SD_FULL_UNALLOC_UNOPT;
6818
6819
6820 -- summary enhancement : private procedure for full summation of supply/demand
6821 -- for unconstrained plans for unallocated cases if time
6822 -- phased PF ATP setup exists for the plan
6823 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id IN NUMBER,
6824 p_sys_date IN DATE)
6825 IS
6826 l_user_id NUMBER;
6827 BEGIN
6828
6829 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF Begin ********');
6830
6831 l_user_id := FND_GLOBAL.USER_ID;
6832
6833 INSERT INTO MSC_ATP_SUMMARY_SD (
6834 plan_id,
6835 sr_instance_id,
6836 organization_id,
6837 inventory_item_id,
6838 demand_class,
6839 sd_date,
6840 sd_qty,
6841 last_update_date,
6842 last_updated_by,
6843 creation_date,
6844 created_by)
6845 (SELECT plan_id,
6846 sr_instance_id,
6847 organization_id,
6848 inventory_item_id,
6849 demand_class,
6850 SD_DATE,
6851 sum(sd_qty),
6852 last_update_date,
6853 last_updated_by,
6854 creation_date,
6855 created_by
6856 from (SELECT /*+ ORDERED */
6857 I.plan_id plan_id,
6858 I.sr_instance_id,
6859 I.organization_id,
6860 I.inventory_item_id,
6861 '@@@' demand_class,
6862 -- TRUNC(C.PRIOR_DATE) SD_DATE,
6863 C.CALENDAR_DATE SD_DATE, -- 2859130
6864 -1* DECODE(D.ORIGINATION_TYPE,
6865 4, D.DAILY_DEMAND_RATE,
6866 D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6867 p_sys_date last_update_date,
6868 l_user_id last_updated_by,
6869 p_sys_date creation_date,
6870 l_user_id created_by
6871 FROM MSC_SYSTEM_ITEMS I,
6872 MSC_TRADING_PARTNERS P,
6873 MSC_DEMANDS D,
6874 MSC_CALENDAR_DATES C
6875 WHERE I.ATP_FLAG = 'Y'
6876 AND I.PLAN_ID = p_plan_id
6877 AND D.PLAN_ID = I.PLAN_ID
6878 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6879 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6880 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
6881 -- 1243985
6882 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
6883 -- Bug 1530311, forecast to be excluded
6884 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6885 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6886 AND C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6887 -- since we store repetitive schedule demand in different ways for
6888 -- ods (total quantity on start date) and pds (daily quantity from
6889 -- start date to end date), we need to make sure we only select work day
6890 -- for pds's repetitive schedule demand.
6891 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6892 AND C.CALENDAR_DATE
6893 BETWEEN TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6894 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6895 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6896 AND TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6897 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6898 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6899 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6900 AND ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6901 (D.ORIGINATION_TYPE <> 4))
6902 AND I.ORGANIZATION_ID = P.SR_TP_ID
6903 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6904 AND P.PARTNER_TYPE = 3
6905 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6906 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6907
6908 UNION ALL
6909
6910 SELECT /*+ ORDERED */
6911 I.plan_id plan_id,
6912 I.sr_instance_id,
6913 I.organization_id,
6914 I.inventory_item_id,
6915 '@@@' demand_class,
6916 -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6917 C.CALENDAR_DATE SD_DATE,
6918 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
6919 p_sys_date last_update_date,
6920 l_user_id last_updated_by,
6921 p_sys_date creation_date,
6922 l_user_id created_by
6923 FROM MSC_SYSTEM_ITEMS I,
6924 MSC_TRADING_PARTNERS P,
6925 MSC_SUPPLIES S,
6926 MSC_CALENDAR_DATES C
6927 WHERE I.ATP_FLAG = 'Y'
6928 AND I.PLAN_ID = p_plan_id
6929 AND S.PLAN_ID = I.PLAN_ID
6930 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6931 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6932 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
6933 -- Exclude Cancelled Supplies 2460645
6934 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6935 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6936 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6937 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6938 AND C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6939 AND C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6940 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6941 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
6942 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6943 AND I.ORGANIZATION_ID = P.SR_TP_ID
6944 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6945 AND P.PARTNER_TYPE = 3
6946 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6947 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6948
6949 UNION ALL
6950
6951 SELECT /*+ ORDERED */
6952 AD.plan_id,
6953 AD.sr_instance_id,
6954 AD.organization_id,
6955 AD.inventory_item_id,
6956 '@@@' demand_class,
6957 TRUNC(AD.demand_date) SD_DATE,
6958 -1 * AD.allocated_quantity SD_QTY,
6959 p_sys_date last_update_date,
6960 l_user_id last_updated_by,
6961 p_sys_date creation_date,
6962 l_user_id created_by
6963 FROM MSC_ALLOC_DEMANDS AD
6964 WHERE AD.PLAN_ID = p_plan_id
6965 AND AD.allocated_quantity <> 0
6966 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
6967
6968 UNION ALL
6969
6970 SELECT /*+ ORDERED */
6971 SA.plan_id,
6972 SA.sr_instance_id,
6973 SA.organization_id,
6974 SA.inventory_item_id,
6975 '@@@' demand_class,
6976 TRUNC(SA.supply_date) SD_DATE,
6977 SA.allocated_quantity SD_QTY,
6978 p_sys_date last_update_date,
6979 l_user_id last_updated_by,
6980 p_sys_date creation_date,
6981 l_user_id created_by
6982 FROM MSC_ALLOC_SUPPLIES SA
6983 WHERE SA.PLAN_ID = p_plan_id
6984 AND SA.allocated_quantity <> 0
6985 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
6986 )
6987 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6988 last_update_date, last_updated_by, creation_date, created_by );
6989
6990 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6991 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF End ********');
6992
6993 END LOAD_SD_FULL_UNALLOC_UNOPT_PF;
6994
6995
6996 -- summary enhancement : private procedure for full summation of supply/demand
6997 -- for constrained plans for unallocated cases if no time
6998 -- phased PF ATP setup exist for the plan
6999 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id IN NUMBER,
7000 p_sys_date IN DATE)
7001 IS
7002 l_user_id NUMBER;
7003 BEGIN
7004
7005 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT Begin ********');
7006
7007 l_user_id := FND_GLOBAL.USER_ID;
7008
7009 INSERT INTO MSC_ATP_SUMMARY_SD (
7010 plan_id,
7011 sr_instance_id,
7012 organization_id,
7013 inventory_item_id,
7014 demand_class,
7015 sd_date,
7016 sd_qty,
7017 last_update_date,
7018 last_updated_by,
7019 creation_date,
7020 created_by)
7021 (SELECT plan_id,
7022 sr_instance_id,
7023 organization_id,
7024 inventory_item_id,
7025 demand_class,
7026 SD_DATE,
7027 sum(sd_qty),
7028 last_update_date,
7029 last_updated_by,
7030 creation_date,
7031 created_by
7032 from (SELECT /*+ ORDERED */
7033 I.plan_id plan_id,
7034 I.sr_instance_id,
7035 I.organization_id,
7036 I.inventory_item_id,
7037 '@@@' demand_class,
7038 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7039 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7040 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7041 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7042 --plan by request date, promise date or schedule date -- 2859130
7043 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7044 p_sys_date last_update_date,
7045 l_user_id last_updated_by,
7046 p_sys_date creation_date,
7047 l_user_id created_by
7048 FROM MSC_SYSTEM_ITEMS I,
7049 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7050 -- Not required as calendar has been removed
7051 MSC_DEMANDS D
7052 WHERE I.ATP_FLAG = 'Y'
7053 AND I.PLAN_ID = p_plan_id
7054 AND D.PLAN_ID = I.PLAN_ID
7055 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7056 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7057 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7058 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7059 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7060 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7061 --AND P.PARTNER_TYPE = 3 -- has been removed
7062 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7063
7064 UNION ALL
7065
7066 SELECT /*+ ORDERED */
7067 I.plan_id plan_id,
7068 I.sr_instance_id,
7069 I.organization_id,
7070 I.inventory_item_id,
7071 '@@@' demand_class,
7072 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7073 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
7074 p_sys_date last_update_date,
7075 l_user_id last_updated_by,
7076 p_sys_date creation_date,
7077 l_user_id created_by
7078 FROM MSC_SYSTEM_ITEMS I,
7079 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7080 -- Not required as calendar has been removed
7081 MSC_SUPPLIES S
7082 WHERE I.ATP_FLAG = 'Y'
7083 AND I.PLAN_ID = p_plan_id
7084 AND S.PLAN_ID = I.PLAN_ID
7085 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7086 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7087 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7088 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7089 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7090 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7091 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7092 --AND P.PARTNER_TYPE = 3 -- has been removed
7093 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7094 )
7095 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7096 last_update_date, last_updated_by, creation_date, created_by );
7097
7098 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7099 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT End ********');
7100
7101 END LOAD_SD_FULL_UNALLOC_OPT;
7102
7103
7104 -- summary enhancement : private procedure for full summation of supply/demand
7105 -- for constrained plans for unallocated cases if time
7106 -- phased PF ATP setup exists for the plan
7107 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id IN NUMBER,
7108 p_sys_date IN DATE)
7109 IS
7110 l_user_id NUMBER;
7111 BEGIN
7112
7113 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF Begin ********');
7114
7115 l_user_id := FND_GLOBAL.USER_ID;
7116
7117 INSERT INTO MSC_ATP_SUMMARY_SD (
7118 plan_id,
7119 sr_instance_id,
7120 organization_id,
7121 inventory_item_id,
7122 demand_class,
7123 sd_date,
7124 sd_qty,
7125 last_update_date,
7126 last_updated_by,
7127 creation_date,
7128 created_by)
7129 (SELECT plan_id,
7130 sr_instance_id,
7131 organization_id,
7132 inventory_item_id,
7133 demand_class,
7134 SD_DATE,
7135 sum(sd_qty),
7136 last_update_date,
7137 last_updated_by,
7138 creation_date,
7139 created_by
7140 from (SELECT /*+ ORDERED */
7141 I.plan_id plan_id,
7142 I.sr_instance_id,
7143 I.organization_id,
7144 I.inventory_item_id,
7145 '@@@' demand_class,
7146 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7147 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7148 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7149 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7150 --plan by request date, promise date or schedule date -- 2859130
7151 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7152 p_sys_date last_update_date,
7153 l_user_id last_updated_by,
7154 p_sys_date creation_date,
7155 l_user_id created_by
7156 FROM MSC_SYSTEM_ITEMS I,
7157 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7158 -- Not required as calendar has been removed
7159 MSC_DEMANDS D
7160 WHERE I.ATP_FLAG = 'Y'
7161 AND I.PLAN_ID = p_plan_id
7162 AND D.PLAN_ID = I.PLAN_ID
7163 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7164 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7165 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7166 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7167 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7168 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7169 --AND P.PARTNER_TYPE = 3 -- has been removed
7170 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7171 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7172
7173 UNION ALL
7174
7175 SELECT /*+ ORDERED */
7176 I.plan_id plan_id,
7177 I.sr_instance_id,
7178 I.organization_id,
7179 I.inventory_item_id,
7180 '@@@' demand_class,
7181 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7182 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
7183 p_sys_date last_update_date,
7184 l_user_id last_updated_by,
7185 p_sys_date creation_date,
7186 l_user_id created_by
7187 FROM MSC_SYSTEM_ITEMS I,
7188 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7189 -- Not required as calendar has been removed
7190 MSC_SUPPLIES S
7191 WHERE I.ATP_FLAG = 'Y'
7192 AND I.PLAN_ID = p_plan_id
7193 AND S.PLAN_ID = I.PLAN_ID
7194 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7195 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7196 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7197 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7198 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7199 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7200 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7201 --AND P.PARTNER_TYPE = 3 -- has been removed
7202 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7203 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7204
7205 UNION ALL
7206
7207 SELECT /*+ ORDERED */
7208 AD.plan_id,
7209 AD.sr_instance_id,
7210 AD.organization_id,
7211 AD.inventory_item_id,
7212 '@@@' demand_class,
7213 TRUNC(AD.demand_date) SD_DATE,
7214 -1 * AD.allocated_quantity SD_QTY,
7215 p_sys_date last_update_date,
7216 l_user_id last_updated_by,
7217 p_sys_date creation_date,
7218 l_user_id created_by
7219 FROM MSC_ALLOC_DEMANDS AD
7220 WHERE AD.PLAN_ID = p_plan_id
7221 AND AD.allocated_quantity <> 0
7222 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7223
7224 UNION ALL
7225
7226 SELECT /*+ ORDERED */
7227 SA.plan_id,
7228 SA.sr_instance_id,
7229 SA.organization_id,
7230 SA.inventory_item_id,
7231 '@@@' demand_class,
7232 TRUNC(SA.supply_date) SD_DATE,
7233 SA.allocated_quantity SD_QTY,
7234 p_sys_date last_update_date,
7235 l_user_id last_updated_by,
7236 p_sys_date creation_date,
7237 l_user_id created_by
7238 FROM MSC_ALLOC_SUPPLIES SA
7239 WHERE SA.PLAN_ID = p_plan_id
7240 AND SA.allocated_quantity <> 0
7241 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7242 )
7243 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7244 last_update_date, last_updated_by, creation_date, created_by );
7245
7246 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7247 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF End ********');
7248
7249 END LOAD_SD_FULL_UNALLOC_OPT_PF;
7250
7251
7252 -- summary enhancement : private procedure for full summation of supply/demand
7253 -- for allocated cases. separate procedures for PF/non-PF
7254 -- cases are not required because we always select from
7255 -- alloc tables. separate procedures for opt/unopt not required
7256 -- because data in alloc tables is populated using pegging and
7257 -- pegging for repetitive schedules would not have been generated
7258 -- on non-working days.
7259 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id IN NUMBER,
7260 p_sys_date IN DATE)
7261 IS
7262 l_user_id number;
7263 BEGIN
7264
7265 msc_util.msc_log('******** LOAD_SD_FULL_ALLOC Begin ********');
7266
7267 l_user_id := FND_GLOBAL.USER_ID;
7268
7269 INSERT INTO MSC_ATP_SUMMARY_SD (
7270 plan_id,
7271 sr_instance_id,
7272 organization_id,
7273 inventory_item_id,
7274 demand_class,
7275 sd_date,
7276 sd_qty,
7277 last_update_date,
7278 last_updated_by,
7279 creation_date,
7280 created_by)
7281 (SELECT plan_id,
7282 sr_instance_id,
7283 organization_id,
7284 inventory_item_id,
7285 demand_class,
7286 SD_DATE,
7287 sum(sd_qty),
7288 last_update_date,
7289 last_updated_by,
7290 creation_date,
7291 created_by
7292 from (SELECT /*+ ORDERED */
7293 AD.plan_id,
7294 AD.sr_instance_id,
7295 AD.organization_id,
7296 AD.inventory_item_id,
7297 AD.demand_class,
7298 TRUNC(AD.demand_date) SD_DATE,
7299 -1 * AD.allocated_quantity SD_QTY,
7300 p_sys_date last_update_date,
7301 l_user_id last_updated_by,
7302 p_sys_date creation_date,
7303 l_user_id created_by
7304 FROM MSC_ALLOC_DEMANDS AD
7305 WHERE AD.PLAN_ID = p_plan_id
7306 AND AD.allocated_quantity <> 0
7307 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7308
7309 UNION ALL
7310
7311 SELECT /*+ ORDERED */
7312 SA.plan_id,
7313 SA.sr_instance_id,
7314 SA.organization_id,
7315 SA.inventory_item_id,
7316 SA.demand_class,
7317 TRUNC(SA.supply_date) SD_DATE,
7318 SA.allocated_quantity SD_QTY,
7319 p_sys_date last_update_date,
7320 l_user_id last_updated_by,
7321 p_sys_date creation_date,
7322 l_user_id created_by
7323 FROM MSC_ALLOC_SUPPLIES SA
7324 WHERE SA.PLAN_ID = p_plan_id
7325 AND SA.allocated_quantity <> 0
7326 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7327 )
7328 GROUP BY plan_id, inventory_item_id, organization_id, sr_instance_id,demand_class, sd_date,
7329 last_update_date, last_updated_by, creation_date, created_by
7330 HAVING sum(SD_QTY) <> 0);
7331
7332 msc_util.msc_log('LOAD_SD_FULL_ALLOC: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7333 msc_util.msc_log('******** LOAD_SD_FULL_ALLOC End ********');
7334
7335 END LOAD_SD_FULL_ALLOC;
7336
7337
7338 -- summary enhancement : private procedure for net summation of supply/demand
7339 -- for unallocated cases. separate procedures for opt/unopt not required
7340 -- because we bother only about ATP generated records.
7341 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id IN NUMBER,
7342 p_last_refresh_number IN NUMBER,
7343 p_new_refresh_number IN NUMBER,
7344 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
7345 p_sys_date IN DATE)
7346 IS
7347 l_user_id number;
7348 j pls_integer;
7349 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7350 l_organization_id_tab MRP_ATP_PUB.number_arr;
7351 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7352 l_sd_date_tab MRP_ATP_PUB.date_arr;
7353 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7354 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7355 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7356 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7357 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7358 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7359
7360 CURSOR c_net_sd (p_plan_id IN NUMBER,
7361 p_last_refresh_number IN NUMBER,
7362 p_new_refresh_number IN NUMBER)
7363 IS
7364 SELECT sr_instance_id,
7365 organization_id,
7366 inventory_item_id,
7367 SD_DATE,
7368 sum(sd_qty)
7369 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7370 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7371 from (SELECT I.sr_instance_id,
7372 I.organization_id,
7373 I.inventory_item_id,
7374 TRUNC(DECODE(D.RECORD_SOURCE,
7375 2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7376 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7377 2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7378 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7379 --plan by request date, promise date or schedule date
7380 decode(D.USING_REQUIREMENT_QUANTITY, -- Consider unscheduled orders as dummy supplies
7381 0, D.OLD_DEMAND_QUANTITY, -- For summary enhancement
7382 -1 * D.USING_REQUIREMENT_QUANTITY) SD_QTY
7383 FROM MSC_SYSTEM_ITEMS I,
7384 MSC_DEMANDS D
7385 WHERE I.ATP_FLAG = 'Y'
7386 AND I.PLAN_ID = p_plan_id
7387 AND D.PLAN_ID = I.PLAN_ID
7388 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7389 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7390 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7391 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7392 AND D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7393
7394 UNION ALL
7395
7396 SELECT I.sr_instance_id,
7397 I.organization_id,
7398 I.inventory_item_id,
7399 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7400 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY
7401 FROM MSC_SYSTEM_ITEMS I,
7402 MSC_SUPPLIES S
7403 WHERE I.ATP_FLAG = 'Y'
7404 AND I.PLAN_ID = p_plan_id
7405 AND S.PLAN_ID = I.PLAN_ID
7406 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7407 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7408 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7409 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- These two conditions
7410 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- may not be required
7411 AND S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7412 )
7413 GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7414
7415
7416 CURSOR c_net_sd_pf (p_plan_id IN NUMBER,
7417 p_last_refresh_number IN NUMBER,
7418 p_new_refresh_number IN NUMBER)
7419 IS
7420 SELECT sr_instance_id,
7421 organization_id,
7422 inventory_item_id,
7423 SD_DATE,
7424 sum(sd_qty)
7425 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7426 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7427 from (SELECT I.sr_instance_id,
7428 I.organization_id,
7429 I.inventory_item_id,
7430 TRUNC(DECODE(D.RECORD_SOURCE,
7431 2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7432 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7433 2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7434 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7435 --plan by request date, promise date or schedule date
7436 decode(D.USING_REQUIREMENT_QUANTITY, -- Consider unscheduled orders as dummy supplies
7437 0, D.OLD_DEMAND_QUANTITY, -- For summary enhancement
7438 -1 * D.USING_REQUIREMENT_QUANTITY) SD_QTY
7439 FROM MSC_SYSTEM_ITEMS I,
7440 MSC_DEMANDS D
7441 WHERE I.ATP_FLAG = 'Y'
7442 AND I.PLAN_ID = p_plan_id
7443 AND D.PLAN_ID = I.PLAN_ID
7444 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7445 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7446 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7447 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7448 AND D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7449 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7450
7451 UNION ALL
7452
7453 SELECT I.sr_instance_id,
7454 I.organization_id,
7455 I.inventory_item_id,
7456 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7457 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY
7458 FROM MSC_SYSTEM_ITEMS I,
7459 MSC_SUPPLIES S
7460 WHERE I.ATP_FLAG = 'Y'
7461 AND I.PLAN_ID = p_plan_id
7462 AND S.PLAN_ID = I.PLAN_ID
7463 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7464 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7465 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7466 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- These two conditions
7467 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- may not be required
7468 AND S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7469 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7470
7471 UNION ALL
7472
7473 SELECT AD.sr_instance_id,
7474 AD.organization_id,
7475 AD.inventory_item_id,
7476 TRUNC(AD.demand_date) SD_DATE,
7477 decode(AD.allocated_quantity,
7478 0, AD.old_allocated_quantity,
7479 -1 * AD.allocated_quantity) SD_QTY
7480 FROM MSC_ALLOC_DEMANDS AD
7481 WHERE AD.PLAN_ID = p_plan_id
7482 AND AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7483
7484 UNION ALL
7485
7486 SELECT SA.sr_instance_id,
7487 SA.organization_id,
7488 SA.inventory_item_id,
7489 TRUNC(SA.supply_date) SD_DATE,
7490 SA.allocated_quantity SD_QTY
7491 FROM MSC_ALLOC_SUPPLIES SA
7492 WHERE SA.PLAN_ID = p_plan_id
7493 AND SA.allocated_quantity <> 0
7494 AND SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7495 )
7496 GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7497
7498 BEGIN
7499
7500 msc_util.msc_log('******** LOAD_SD_NET_UNALLOC Begin ********');
7501 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_last_refresh_number - ' || p_last_refresh_number);
7502 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_new_refresh_number - ' || p_new_refresh_number);
7503 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_time_phased_pf - ' || p_time_phased_pf);
7504
7505 l_user_id := FND_GLOBAL.USER_ID;
7506
7507 IF p_time_phased_pf = 2 THEN
7508 OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7509 FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7510 l_organization_id_tab,
7511 l_inventory_item_id_tab,
7512 l_sd_date_tab,
7513 l_sd_quantity_tab;
7514 CLOSE c_net_sd;
7515 ELSE
7516 OPEN c_net_sd_pf(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7517 FETCH c_net_sd_pf BULK COLLECT INTO l_sr_instance_id_tab,
7518 l_organization_id_tab,
7519 l_inventory_item_id_tab,
7520 l_sd_date_tab,
7521 l_sd_quantity_tab;
7522 CLOSE c_net_sd_pf;
7523 END IF;
7524
7525 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7526
7527 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7528
7529 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7530 UPDATE MSC_ATP_SUMMARY_SD
7531 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
7532 last_update_date = p_sys_date,
7533 last_updated_by = l_user_id
7534 WHERE plan_id = p_plan_id
7535 AND sr_instance_id = l_sr_instance_id_tab(j)
7536 AND inventory_item_id = l_inventory_item_id_tab(j)
7537 AND organization_id = l_organization_id_tab(j)
7538 AND sd_date = l_sd_date_tab(j);
7539
7540 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL UPDATE');
7541
7542 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7543 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7544 l_ins_sr_instance_id_tab.EXTEND;
7545 l_ins_organization_id_tab.EXTEND;
7546 l_ins_inventory_item_id_tab.EXTEND;
7547 l_ins_sd_date_tab.EXTEND;
7548 l_ins_sd_quantity_tab.EXTEND;
7549
7550 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
7551 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
7552 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
7553 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
7554 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
7555 END IF;
7556 END LOOP;
7557
7558 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7559
7560 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7561
7562 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7563 INSERT INTO MSC_ATP_SUMMARY_SD (
7564 plan_id,
7565 sr_instance_id,
7566 organization_id,
7567 inventory_item_id,
7568 demand_class,
7569 sd_date,
7570 sd_qty,
7571 last_update_date,
7572 last_updated_by,
7573 creation_date,
7574 created_by)
7575 VALUES (p_plan_id,
7576 l_ins_sr_instance_id_tab(j),
7577 l_ins_organization_id_tab(j),
7578 l_ins_inventory_item_id_tab(j),
7579 '@@@',
7580 l_ins_sd_date_tab(j),
7581 l_ins_sd_quantity_tab(j),
7582 p_sys_date,
7583 l_user_id,
7584 p_sys_date,
7585 l_user_id);
7586
7587 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL INSERT');
7588
7589 ELSE
7590 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records to be inserted');
7591 END IF;
7592 ELSE
7593 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records fetched in the net cursor');
7594 END IF;
7595
7596 msc_util.msc_log('******** LOAD_SD_NET_UNALLOC End ********');
7597
7598 END LOAD_SD_NET_UNALLOC;
7599
7600
7601 -- summary enhancement : private procedure for net summation of supply/demand
7602 -- for allocated cases.
7603 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id IN NUMBER,
7604 p_last_refresh_number IN NUMBER,
7605 p_new_refresh_number IN NUMBER,
7606 p_sys_date IN DATE)
7607 IS
7608 l_user_id number;
7609 j pls_integer;
7610 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7611 l_organization_id_tab MRP_ATP_PUB.number_arr;
7612 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7613 l_demand_class_tab MRP_ATP_PUB.char30_arr;
7614 l_sd_date_tab MRP_ATP_PUB.date_arr;
7615 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7616
7617 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7618 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7619 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7620 l_ins_demand_class_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr();
7621 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7622 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7623
7624 CURSOR c_net_sd (p_plan_id IN NUMBER,
7625 p_last_refresh_number IN NUMBER,
7626 p_new_refresh_number IN NUMBER)
7627 IS
7628 SELECT sr_instance_id,
7629 organization_id,
7630 inventory_item_id,
7631 demand_class,
7632 SD_DATE,
7633 sum(sd_qty)
7634 from (SELECT AD.sr_instance_id,
7635 AD.organization_id,
7636 AD.inventory_item_id,
7637 AD.demand_class,
7638 TRUNC(AD.demand_date) SD_DATE,
7639 decode(AD.allocated_quantity,
7640 0, AD.old_allocated_quantity,
7641 -1 * AD.allocated_quantity) SD_QTY
7642 FROM MSC_ALLOC_DEMANDS AD
7643 WHERE AD.PLAN_ID = p_plan_id
7644 AND AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7645
7646 UNION ALL
7647
7648 SELECT SA.sr_instance_id,
7649 SA.organization_id,
7650 SA.inventory_item_id,
7651 SA.demand_class,
7652 TRUNC(SA.supply_date) SD_DATE,
7653 decode(SA.ALLOCATED_QUANTITY, -- Consider deleted stealing records as dummy demands
7654 0, -1 * OLD_ALLOCATED_QUANTITY, -- For summary enhancement
7655 SA.ALLOCATED_QUANTITY) SD_QTY
7656 FROM MSC_ALLOC_SUPPLIES SA
7657 WHERE SA.PLAN_ID = p_plan_id
7658 AND SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7659 )
7660 GROUP BY inventory_item_id, organization_id, sr_instance_id, demand_class, sd_date;
7661
7662 BEGIN
7663
7664 msc_util.msc_log('******** LOAD_SD_NET_ALLOC Begin ********');
7665
7666 l_user_id := FND_GLOBAL.USER_ID;
7667
7668 OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7669 FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7670 l_organization_id_tab,
7671 l_inventory_item_id_tab,
7672 l_demand_class_tab,
7673 l_sd_date_tab,
7674 l_sd_quantity_tab;
7675 CLOSE c_net_sd;
7676
7677 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7678
7679 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7680
7681 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7682 UPDATE MSC_ATP_SUMMARY_SD
7683 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
7684 last_update_date = p_sys_date,
7685 last_updated_by = l_user_id
7686 WHERE plan_id = p_plan_id
7687 AND sr_instance_id = l_sr_instance_id_tab(j)
7688 AND inventory_item_id = l_inventory_item_id_tab(j)
7689 AND organization_id = l_organization_id_tab(j)
7690 AND sd_date = l_sd_date_tab(j)
7691 AND demand_class = l_demand_class_tab(j);
7692
7693 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL UPDATE');
7694
7695 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7696 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7697 l_ins_sr_instance_id_tab.EXTEND;
7698 l_ins_organization_id_tab.EXTEND;
7699 l_ins_inventory_item_id_tab.EXTEND;
7700 l_ins_demand_class_tab.EXTEND;
7701 l_ins_sd_date_tab.EXTEND;
7702 l_ins_sd_quantity_tab.EXTEND;
7703
7704 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
7705 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
7706 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
7707 l_ins_demand_class_tab(l_ins_demand_class_tab.COUNT) := l_demand_class_tab(j);
7708 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
7709 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
7710 END IF;
7711 END LOOP;
7712
7713 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7714
7715 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7716
7717 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7718 INSERT INTO MSC_ATP_SUMMARY_SD (
7719 plan_id,
7720 sr_instance_id,
7721 organization_id,
7722 inventory_item_id,
7723 demand_class,
7724 sd_date,
7725 sd_qty,
7726 last_update_date,
7727 last_updated_by,
7728 creation_date,
7729 created_by)
7730 VALUES (p_plan_id,
7731 l_ins_sr_instance_id_tab(j),
7732 l_ins_organization_id_tab(j),
7733 l_ins_inventory_item_id_tab(j),
7734 l_ins_demand_class_tab(j),
7735 l_ins_sd_date_tab(j),
7736 l_ins_sd_quantity_tab(j),
7737 p_sys_date,
7738 l_user_id,
7739 p_sys_date,
7740 l_user_id);
7741
7742 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL INSERT');
7743
7744 ELSE
7745 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records to be inserted');
7746 END IF;
7747 ELSE
7748 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records fetched in the net cursor');
7749 END IF;
7750
7751 msc_util.msc_log('******** LOAD_SD_NET_ALLOC End ********');
7752
7753 END LOAD_SD_NET_ALLOC;
7754
7755
7756 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id IN NUMBER,
7757 p_sys_date IN DATE)
7758 IS
7759 l_plan_start_date date;
7760 l_instance_id number;
7761 l_cutoff_date date;
7762 l_org_id number;
7763 -- l_default_atp_rule_id number; -- Bug 3912422
7764 l_calendar_code VARCHAR2(14);
7765 l_calendar_exception_set_id NUMBER := -1; -- Bug 3912422 - Initiallize to -1
7766 -- l_default_demand_class VARCHAR2(34); -- Bug 3912422
7767 l_user_id number;
7768 -- l_org_code VARCHAR2(7); -- Bug 3912422
7769 BEGIN
7770
7771 msc_util.msc_log('******** LOAD_SUP_DATA_FULL Begin ********');
7772
7773 SELECT trunc(p.plan_start_date),
7774 p.sr_instance_id,
7775 p.organization_id,
7776 trunc(p.cutoff_date),
7777 tp.calendar_code
7778 INTO l_plan_start_date,
7779 l_instance_id,
7780 l_org_id,
7781 l_cutoff_date,
7782 l_calendar_code
7783 FROM msc_plans p,
7784 msc_trading_partners tp
7785 WHERE p.plan_id = p_plan_id
7786 AND p.organization_id = tp.sr_tp_id
7787 AND p.sr_instance_id = tp.sr_instance_id
7788 AND tp.partner_type = 3;
7789
7790 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_plan_start_date = ' || l_plan_start_date);
7791 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_instance_id = ' || l_instance_id);
7792 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_org_id = ' || l_org_id);
7793 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_calendar_code = ' || l_calendar_code);
7794
7795 l_user_id := FND_GLOBAL.USER_ID;
7796
7797 INSERT INTO MSC_ATP_SUMMARY_SUP(
7798 plan_id,
7799 sr_instance_id,
7800 inventory_item_id,
7801 supplier_id,
7802 supplier_site_id,
7803 sd_date,
7804 sd_qty,
7805 demand_class,
7806 last_update_date,
7807 last_updated_by,
7808 creation_date,
7809 created_by)
7810 (SELECT plan_id, sr_instance_id, inventory_item_id, supplier_id, supplier_site_id, sd_date, sum(sd_qty),
7811 demand_class, last_update_date, last_updated_by, creation_date, created_by
7812 FROM (
7813 SELECT SV.plan_id plan_id,
7814 SV.sr_instance_id,
7815 SV.inventory_item_id inventory_item_id,
7816 SV.supplier_id supplier_id,
7817 SV.supplier_site_id supplier_site_id,
7818 c.calendar_date sd_date, -- 2859130 remove trunc
7819 SV.capacity sd_qty,
7820 null demand_class,
7821 p_sys_date last_update_date,
7822 l_user_id last_updated_by,
7823 p_sys_date creation_date,
7824 l_user_id created_by
7825 FROM msc_calendar_dates c,
7826 (SELECT /*+ LEADING (I) */
7827 I.plan_id plan_id,
7828 I.sr_instance_id,
7829 I.inventory_item_id inventory_item_id,
7830 S.supplier_id supplier_id,
7831 S.supplier_site_id supplier_site_id,
7832 S.capacity,
7833 trunc(S.from_date) from_date,
7834 trunc(S.to_date) to_date,
7835 mis.delivery_calendar_code,
7836 mis.supplier_lead_time_date
7837 FROM msc_system_items I,
7838 msc_supplier_capacities s,
7839 msc_item_suppliers mis -- Bug 3912422 - Move to the inner query
7840 WHERE I.plan_id = p_plan_id
7841 AND I.atp_components_flag in ('Y', 'C')
7842 AND s.inventory_item_id = I.inventory_item_id
7843 AND s.sr_instance_id = I.sr_instance_id
7844 AND s.plan_id = I.plan_id
7845 AND s.organization_id = i.organization_id --\
7846 AND s.inventory_item_id = mis.inventory_item_id --|
7847 AND s.sr_instance_id = mis.sr_instance_id --> Bug 3912422
7848 AND s.plan_id = mis.plan_id --|
7849 AND s.organization_id = mis.organization_id --/
7850 AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7851 --AND (I.inventory_item_id, S.supplier_id, nvl(S.supplier_site_id,-1)) NOT IN
7852 -- Bug 3912422
7853 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
7854 FROM msc_supplier_flex_fences msff
7855 WHERE plan_id = p_plan_id
7856 AND msff.inventory_item_id = s.inventory_item_id --\
7857 AND msff.supplier_id = s.supplier_id -- } Bug 3912422
7858 AND msff.supplier_site_id = s.supplier_site_id --/
7859 AND rownum = 1)
7860 group by I.plan_id,
7861 I.inventory_item_id,
7862 I.sr_instance_id,
7863 s.supplier_id,
7864 s.supplier_site_id,
7865 s.capacity,
7866 trunc(s.from_date),
7867 trunc(s.to_date),
7868 mis.delivery_calendar_code,
7869 mis.supplier_lead_time_date) SV
7870 -- msc_item_suppliers mis -- Bug 3912422 - Move to the inner query
7871 WHERE /* SV.inventory_item_id = mis.inventory_item_id
7872 AND SV.supplier_id = mis.supplier_id
7873 AND nvl(SV.supplier_site_id,-1) = nvl(mis.supplier_site_id, -1)
7874 AND SV.sr_instance_id = mis.sr_instance_id
7875 AND c.calendar_code = nvl(mis.delivery_calendar_code, l_calendar_code)
7876 AND*/ c.calendar_code = nvl(SV.delivery_calendar_code, l_calendar_code)
7877 AND c.calendar_date BETWEEN trunc(SV.from_date)
7878 AND NVL(SV.to_date,l_cutoff_date)
7879 -- AND (c.seq_num IS NOT NULL OR mis.delivery_calendar_code IS NULL) -- Bug 3912422
7880 AND (c.seq_num IS NOT NULL OR SV.delivery_calendar_code IS NULL) -- NULL means FOC
7881 AND c.exception_set_id = l_calendar_exception_set_id
7882 AND c.sr_instance_id = l_instance_id
7883 -- AND c.calendar_date >= mis.supplier_lead_time_date -- Bug 3912422
7884 AND c.calendar_date > SV.supplier_lead_time_date
7885 -- Bug 3912422 - We should start looking from the day after supplier_lead_time_date
7886 -- to accomodate for planning's additional "-1". If SMC is found in ASL then this
7887 -- would mean one day offset as per ASL. If it is FOC then it would mean starting
7888 -- from the next day.
7889
7890 UNION ALL
7891 -- Net out planned orders, purchase orders and purchase requisitions /
7892 -- bug 1303196
7893
7894 SELECT /*+ LEADING (I) */
7895 I.plan_id,
7896 I.sr_instance_id,
7897 I.inventory_item_id,
7898 P.supplier_id,
7899 P.supplier_site_id,
7900 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7901 (NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty,
7902 null demand_class,
7903 p_sys_date last_update_date,
7904 l_user_id last_updated_by,
7905 p_sys_date creation_date,
7906 l_user_id created_by
7907 FROM msc_supplies p,
7908 -- msc_trading_partners tp,
7909 -- msc_calendar_dates c,
7910 -- msc_calendar_dates c1,
7911 msc_trading_partner_sites tps,
7912 msc_system_items I
7913 WHERE I.plan_id = p_plan_id
7914 AND I.atp_components_flag in ( 'Y', 'C')
7915 AND (p.order_type IN (5, 2)
7916 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7917 AND p.order_type = 1 AND p.promised_date IS NULL))
7918 AND p.plan_id = I.plan_id
7919 AND p.sr_instance_id = I.sr_instance_id
7920 AND p.inventory_item_id = I.inventory_item_id
7921 AND p.organization_id = I.organization_id
7922 AND p.sr_instance_id = I.sr_instance_id
7923 AND NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7924 AND p.supplier_id is not null
7925 AND p.supplier_id = tps.partner_id (+)
7926 AND p.supplier_site_id = tps.partner_site_id (+)
7927 AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7928 --AND (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7929 -- Bug 3912422
7930 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
7931 FROM msc_supplier_flex_fences msff
7932 WHERE plan_id = p_plan_id
7933 AND msff.inventory_item_id = p.inventory_item_id --\
7934 AND msff.supplier_id = p.supplier_id -- } Bug 3912422
7935 AND msff.supplier_site_id = p.supplier_site_id --/
7936 AND rownum = 1)
7937 /* AND tp.sr_tp_id = p.organization_id
7938 AND tp.sr_instance_id = p.sr_instance_id
7939 AND tp.partner_type = 3
7940 AND c.calendar_date = trunc(p.new_schedule_date) -- 1529756
7941 AND c.calendar_code = tp.calendar_code
7942 AND c.exception_set_id = tp.calendar_exception_set_id
7943 AND c.sr_instance_id = tp.sr_instance_id
7944 AND c1.seq_num = c.prior_seq_num-
7945 nvl(I.postprocessing_lead_time, 0)
7946 AND c1.calendar_code = c.calendar_code
7947 AND c1.exception_set_id = c.exception_set_id
7948 AND c1.sr_instance_id = c.sr_instance_id*/
7949 AND p.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7950 )
7951 group by plan_id,inventory_item_id, supplier_id, supplier_site_id, sr_instance_id,
7952 sd_date, demand_class, last_update_date, last_updated_by, creation_date, created_by
7953 );
7954
7955 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7956 msc_util.msc_log('******** LOAD_SUP_DATA_FULL End ********');
7957
7958 END LOAD_SUP_DATA_FULL;
7959
7960
7961 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id IN NUMBER,
7962 p_last_refresh_number IN NUMBER,
7963 p_new_refresh_number IN NUMBER,
7964 p_sys_date IN DATE)
7965 IS
7966 l_user_id number;
7967 j pls_integer;
7968 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7969 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7970 l_supplier_id_tab MRP_ATP_PUB.number_arr;
7971 l_supplier_site_id_tab MRP_ATP_PUB.number_arr;
7972 l_sd_date_tab MRP_ATP_PUB.date_arr;
7973 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7974
7975 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7976 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7977 l_ins_supplier_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7978 l_ins_supplier_site_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7979 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7980 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7981
7982 CURSOR c_net_sup (p_plan_id IN NUMBER, -- Cursor does not require msc_supplier_capacities because
7983 p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
7984 p_new_refresh_number IN NUMBER)
7985 IS
7986 SELECT I.sr_instance_id,
7987 I.inventory_item_id,
7988 P.supplier_id,
7989 P.supplier_site_id,
7990 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7991 sum(NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty
7992 FROM msc_supplies p,
7993 -- msc_trading_partners tp,
7994 -- msc_calendar_dates c,
7995 -- msc_calendar_dates c1,
7996 msc_trading_partner_sites tps,
7997 msc_system_items I
7998 WHERE I.plan_id = p_plan_id
7999 AND I.atp_components_flag in ( 'Y', 'C')
8000 AND (p.order_type IN (5, 2)
8001 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
8002 AND p.order_type = 1 AND p.promised_date IS NULL))
8003 AND p.plan_id = I.plan_id
8004 AND p.sr_instance_id = I.sr_instance_id
8005 AND p.inventory_item_id = I.inventory_item_id
8006 AND p.organization_id = I.organization_id
8007 AND p.sr_instance_id = I.sr_instance_id
8008 AND NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
8009 AND p.supplier_id is not null
8010 AND p.supplier_id = tps.partner_id (+)
8011 AND p.supplier_site_id = tps.partner_site_id (+)
8012 AND NOT EXISTS -- Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
8013 --AND (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
8014 -- Bug 3912422
8015 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
8016 FROM msc_supplier_flex_fences msff
8017 WHERE plan_id = p_plan_id
8018 AND msff.inventory_item_id = p.inventory_item_id --\
8019 AND msff.supplier_id = p.supplier_id -- } Bug 3912422
8020 AND msff.supplier_site_id = p.supplier_site_id --/
8021 AND rownum = 1)
8022 /* AND tp.sr_tp_id = p.organization_id
8023 AND tp.sr_instance_id = p.sr_instance_id
8024 AND tp.partner_type = 3
8025 AND c.calendar_date = trunc(p.new_schedule_date)
8026 AND c.calendar_code = tp.calendar_code
8027 AND c.exception_set_id = tp.calendar_exception_set_id
8028 AND c.sr_instance_id = tp.sr_instance_id
8029 AND c1.seq_num = c.prior_seq_num-
8030 nvl(I.postprocessing_lead_time, 0)
8031 AND c1.calendar_code = c.calendar_code
8032 AND c1.exception_set_id = c.exception_set_id
8033 AND c1.sr_instance_id = c.sr_instance_id */
8034 AND p.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8035 GROUP BY I.inventory_item_id, P.supplier_id, P.supplier_site_id, I.sr_instance_id,
8036 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date);
8037
8038
8039 BEGIN
8040
8041 msc_util.msc_log('******** LOAD_SUP_DATA_NET Begin ********');
8042
8043 l_user_id := FND_GLOBAL.USER_ID;
8044
8045 OPEN c_net_sup(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8046 FETCH c_net_sup BULK COLLECT INTO l_sr_instance_id_tab,
8047 l_inventory_item_id_tab,
8048 l_supplier_id_tab,
8049 l_supplier_site_id_tab,
8050 l_sd_date_tab,
8051 l_sd_quantity_tab;
8052 CLOSE c_net_sup;
8053
8054 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
8055
8056 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
8057
8058 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
8059 UPDATE MSC_ATP_SUMMARY_SUP
8060 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
8061 last_update_date = p_sys_date,
8062 last_updated_by = l_user_id
8063 WHERE plan_id = p_plan_id
8064 AND sr_instance_id = l_sr_instance_id_tab(j)
8065 AND inventory_item_id = l_inventory_item_id_tab(j)
8066 AND supplier_id = l_supplier_id_tab(j)
8067 AND supplier_site_id = l_supplier_site_id_tab(j)
8068 AND sd_date = l_sd_date_tab(j);
8069
8070 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL UPDATE');
8071
8072 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
8073 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8074 l_ins_sr_instance_id_tab.EXTEND;
8075 l_ins_inventory_item_id_tab.EXTEND;
8076 l_ins_supplier_id_tab.EXTEND;
8077 l_ins_supplier_site_id_tab.EXTEND;
8078 l_ins_sd_date_tab.EXTEND;
8079 l_ins_sd_quantity_tab.EXTEND;
8080
8081 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
8082 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
8083 l_ins_supplier_id_tab(l_ins_supplier_id_tab.COUNT) := l_supplier_id_tab(j);
8084 l_ins_supplier_site_id_tab(l_ins_supplier_site_id_tab.COUNT) := l_supplier_site_id_tab(j);
8085 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
8086 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
8087 END IF;
8088 END LOOP;
8089
8090 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
8091
8092 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
8093
8094 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
8095 INSERT INTO MSC_ATP_SUMMARY_SUP (
8096 plan_id,
8097 sr_instance_id,
8098 inventory_item_id,
8099 supplier_id,
8100 supplier_site_id,
8101 sd_date,
8102 sd_qty,
8103 demand_class,
8104 last_update_date,
8105 last_updated_by,
8106 creation_date,
8107 created_by)
8108 VALUES (p_plan_id,
8109 l_ins_sr_instance_id_tab(j),
8110 l_ins_inventory_item_id_tab(j),
8111 l_ins_supplier_id_tab(j),
8112 l_ins_supplier_site_id_tab(j),
8113 l_ins_sd_date_tab(j),
8114 l_ins_sd_quantity_tab(j),
8115 NULL,
8116 p_sys_date,
8117 l_user_id,
8118 p_sys_date,
8119 l_user_id);
8120
8121 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL INSERT');
8122
8123 ELSE
8124 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records to be inserted');
8125 END IF;
8126 ELSE
8127 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records fetched in the net cursor');
8128 END IF;
8129
8130 msc_util.msc_log('******** LOAD_SUP_DATA_NET End ********');
8131
8132 END LOAD_SUP_DATA_NET;
8133
8134
8135 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id IN NUMBER,
8136 p_plan_start_date IN DATE,
8137 p_sys_date IN DATE)
8138 IS
8139 l_user_id number;
8140 BEGIN
8141
8142 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH Begin ********');
8143
8144 l_user_id := FND_GLOBAL.USER_ID;
8145
8146 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8147 INSERT INTO MSC_ATP_SUMMARY_RES(
8148 plan_id,
8149 department_id,
8150 resource_id,
8151 organization_id,
8152 sr_instance_id,
8153 sd_date,
8154 sd_qty,
8155 last_update_date,
8156 last_updated_by,
8157 creation_date,
8158 created_by)
8159 (SELECT plan_id,
8160 department_id,
8161 resource_id,
8162 organization_id,
8163 sr_instance_id,
8164 SD_DATE,
8165 SUM(SD_QTY),
8166 last_update_date,
8167 last_updated_by,
8168 creation_date,
8169 created_by
8170 FROM
8171 (SELECT RES_VIEW.plan_id plan_id,
8172 RES_VIEW.department_id department_id,
8173 RES_VIEW.resource_id resource_id,
8174 RES_VIEW.organization_id organization_id,
8175 RES_VIEW.sr_instance_id sr_instance_id,
8176 trunc(RES_VIEW.SD_DATE) SD_DATE,
8177 RES_VIEW.SD_QTY
8178 * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8179 p_sys_date last_update_date,
8180 l_user_id last_updated_by,
8181 p_sys_date creation_date,
8182 l_user_id created_by
8183 FROM MSC_UOM_CONVERSIONS MUC,
8184 (SELECT -- hint for better performance.
8185 /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8186 DR.PLAN_ID plan_id,
8187 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8188 DR.RESOURCE_ID resource_id,
8189 DR.organization_id organization_id,
8190 DR.SR_INSTANCE_ID sr_instance_id,
8191 C.CALENDAR_DATE SD_DATE,
8192 -- Bug 3321897, 2943979 For Line Based Resources,
8193 -- Resource_ID is not NULL but -1
8194 -1 * DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8195 DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8196 REQ.DAILY_RESOURCE_HOURS)) *
8197 DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8198 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8199 NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1) SD_QTY,
8200 NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8201 DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8202 FROM MSC_DEPARTMENT_RESOURCES DR,
8203 MSC_TRADING_PARTNERS P,
8204 MSC_RESOURCE_REQUIREMENTS REQ,
8205 MSC_SYSTEM_ITEMS I,
8206 MSC_SUPPLIES S,
8207 ---- re-ordered tables for performance
8208 MSC_CALENDAR_DATES C
8209 WHERE DR.PLAN_ID = REQ.PLAN_ID
8210 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8211 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8212 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8213 AND DR.organization_id = REQ.ORGANIZATION_ID
8214 AND REQ.PLAN_ID = p_plan_id
8215 AND NVL(REQ.PARENT_ID, 2) = 2
8216 AND I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8217 AND I.PLAN_ID = S.PLAN_ID
8218 AND I.ORGANIZATION_ID = S.ORGANIZATION_ID
8219 AND I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8220 AND I.inventory_item_id = REQ.assembly_item_id ----\
8221 AND ((I.bom_item_type <> 1 --|
8222 and I.bom_item_type <> 2 --|- summary enhancement change for CTO ODR
8223 AND I.atp_flag <> 'N') --|
8224 OR (REQ.record_source = 2)) ----/
8225 AND S.TRANSACTION_ID = REQ.SUPPLY_ID
8226 AND S.PLAN_ID = REQ.PLAN_ID
8227 AND S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8228 AND S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8229 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8230 AND P.SR_TP_ID = DR.ORGANIZATION_ID
8231 AND P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8232 AND P.PARTNER_TYPE = 3
8233 AND C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8234 AND C.CALENDAR_CODE = P.CALENDAR_CODE
8235 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8236 AND C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8237 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8238 AND C.SEQ_NUM IS NOT NULL
8239 AND C.CALENDAR_DATE >= p_plan_start_date -- summary enhancement - made consistent
8240 AND REQ.REFRESH_NUMBER IS NULL)RES_VIEW -- consider only planning records in full summation - summary enhancement
8241 WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8242 AND RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8243 AND MUC.INVENTORY_ITEM_ID (+)= 0
8244
8245 UNION ALL
8246
8247 SELECT MNRA.plan_id plan_id,
8248 MNRA.department_id,
8249 MNRA.resource_id,
8250 MNRA.organization_id,
8251 MNRA.sr_instance_id,
8252 trunc(MNRA.SHIFT_DATE) SD_DATE,
8253 MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8254 MNRA.to_time,to_time + 24*3600,
8255 MNRA.to_time) - MNRA.from_time)/3600)
8256 * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8257 DR.MAX_CAPACITY * NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8258 p_sys_date last_update_date,
8259 l_user_id last_updated_by,
8260 p_sys_date creation_date,
8261 l_user_id created_by
8262 FROM MSC_NET_RESOURCE_AVAIL MNRA,
8263 MSC_DEPARTMENT_RESOURCES DR,
8264 MSC_UOM_CONVERSIONS MUC -- noted in summary enhancement : inconsistent with MSCRATPB
8265 WHERE MNRA.PLAN_ID = p_plan_id
8266 AND NVL(MNRA.PARENT_ID, -2) <> -1
8267 AND DR.PLAN_ID = MNRA.PLAN_ID
8268 AND DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8269 AND DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8270 AND DR.RESOURCE_ID = MNRA.RESOURCE_ID
8271 AND DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8272 AND DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8273 AND DR.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8274 AND MUC.INVENTORY_ITEM_ID (+) = 0
8275 --- un commented the following row. This is done so that less number of rows are selected
8276 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8277 ) group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8278 last_update_date,last_updated_by, creation_date, created_by
8279 );
8280
8281 msc_util.msc_log('LOAD_RES_FULL_UNOPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8282 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH End ********');
8283
8284 END LOAD_RES_FULL_UNOPT_BATCH;
8285
8286
8287 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id IN NUMBER,
8288 p_plan_start_date IN DATE,
8289 p_sys_date IN DATE)
8290 IS
8291 l_user_id number;
8292 BEGIN
8293
8294 msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH Begin ********');
8295
8296 l_user_id := FND_GLOBAL.USER_ID;
8297
8298 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8299 INSERT INTO MSC_ATP_SUMMARY_RES(
8300 plan_id,
8301 department_id,
8302 resource_id,
8303 organization_id,
8304 sr_instance_id,
8305 sd_date,
8306 sd_qty,
8307 last_update_date,
8308 last_updated_by,
8309 creation_date,
8310 created_by)
8311 (SELECT plan_id,
8312 department_id,
8313 resource_id,
8314 organization_id,
8315 sr_instance_id,
8316 SD_DATE,
8317 SUM(SD_QTY),
8318 last_update_date,
8319 last_updated_by,
8320 creation_date,
8321 created_by
8322 FROM
8323 (SELECT RES_VIEW.plan_id plan_id,
8324 RES_VIEW.department_id department_id,
8325 RES_VIEW.resource_id resource_id,
8326 RES_VIEW.organization_id organization_id,
8327 RES_VIEW.sr_instance_id sr_instance_id,
8328 trunc(RES_VIEW.SD_DATE) SD_DATE,
8329 RES_VIEW.SD_QTY
8330 * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8331 p_sys_date last_update_date,
8332 l_user_id last_updated_by,
8333 p_sys_date creation_date,
8334 l_user_id created_by
8335 FROM MSC_UOM_CONVERSIONS MUC,
8336 (SELECT -- hint for better performance.
8337 /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8338 DR.PLAN_ID plan_id,
8339 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8340 DR.RESOURCE_ID resource_id,
8341 DR.organization_id organization_id,
8342 DR.SR_INSTANCE_ID sr_instance_id,
8343 TRUNC(REQ.START_DATE) SD_DATE,
8344 -- Bug 3321897, 2943979 For Line Based Resources,
8345 -- Resource_ID is not NULL but -1
8346 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8347 REQ.RESOURCE_HOURS) * -- 2859130 -- noted in summary enhancement : inconsistent with MSCRATPB
8348 -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8349 -- REQ.DAILY_RESOURCE_HOURS)) *
8350 DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8351 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8352 NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1) SD_QTY,
8353 NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8354 DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8355 FROM MSC_DEPARTMENT_RESOURCES DR,
8356 MSC_RESOURCE_REQUIREMENTS REQ,
8357 MSC_SYSTEM_ITEMS I,
8358 MSC_SUPPLIES S
8359 ---- re-ordered tables for performance
8360 WHERE DR.PLAN_ID = REQ.PLAN_ID
8361 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8362 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8363 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8364 AND DR.organization_id = REQ.ORGANIZATION_ID
8365 AND REQ.PLAN_ID = p_plan_id
8366 AND NVL(REQ.PARENT_ID, 1) = 1
8367 AND I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8368 AND I.PLAN_ID = S.PLAN_ID
8369 AND I.ORGANIZATION_ID = S.ORGANIZATION_ID
8370 AND I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8371 AND S.TRANSACTION_ID = REQ.SUPPLY_ID
8372 AND S.PLAN_ID = REQ.PLAN_ID
8373 AND S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8374 AND S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8375 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8376 AND I.inventory_item_id = REQ.assembly_item_id ----\
8377 AND ((I.bom_item_type <> 1 --|
8378 and I.bom_item_type <> 2 --|- summary enhancement change for CTO ODR
8379 AND I.atp_flag <> 'N') --|
8380 OR (REQ.record_source = 2)) ----/
8381 AND REQ.START_DATE >= p_plan_start_date -- summary enhancement - made consistent
8382 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8383 )RES_VIEW
8384 WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8385 AND RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8386 AND MUC.INVENTORY_ITEM_ID (+)= 0
8387
8388 UNION ALL
8389
8390 SELECT MNRA.plan_id plan_id,
8391 MNRA.department_id,
8392 MNRA.resource_id,
8393 MNRA.organization_id,
8394 MNRA.sr_instance_id,
8395 trunc(MNRA.SHIFT_DATE) SD_DATE,
8396 MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8397 MNRA.to_time,to_time + 24*3600,
8398 MNRA.to_time) - MNRA.from_time)/3600)
8399 * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8400 DR.MAX_CAPACITY * NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8401 p_sys_date last_update_date,
8402 l_user_id last_updated_by,
8403 p_sys_date creation_date,
8404 l_user_id created_by
8405 FROM MSC_NET_RESOURCE_AVAIL MNRA,
8406 MSC_DEPARTMENT_RESOURCES DR,
8407 MSC_UOM_CONVERSIONS MUC -- noted in summary enhancement : inconsistent with MSCRATPB
8408 WHERE MNRA.PLAN_ID = p_plan_id
8409 AND NVL(MNRA.PARENT_ID, -2) <> -1
8410 AND DR.PLAN_ID = MNRA.PLAN_ID
8411 AND DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8412 AND DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8413 AND DR.RESOURCE_ID = MNRA.RESOURCE_ID
8414 AND DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8415 AND DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8416 AND DR.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8417 AND MUC.INVENTORY_ITEM_ID (+) = 0
8418 --- un commented the following row. This is done so that less number of rows are selected
8419 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8420 )
8421 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8422 last_update_date,last_updated_by, creation_date, created_by
8423 );
8424
8425 msc_util.msc_log('LOAD_RES_FULL_OPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8426 msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH End ********');
8427
8428 END LOAD_RES_FULL_OPT_BATCH;
8429
8430
8431 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id IN NUMBER,
8432 p_plan_start_date IN DATE,
8433 p_sys_date IN DATE)
8434 IS
8435 l_user_id number;
8436 BEGIN
8437
8438 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH Begin ********');
8439
8440 l_user_id := FND_GLOBAL.USER_ID;
8441
8442 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8443 INSERT INTO MSC_ATP_SUMMARY_RES(
8444 plan_id,
8445 department_id,
8446 resource_id,
8447 organization_id,
8448 sr_instance_id,
8449 sd_date,
8450 sd_qty,
8451 last_update_date,
8452 last_updated_by,
8453 creation_date,
8454 created_by)
8455 (SELECT plan_id,
8456 department_id,
8457 resource_id,
8458 organization_id,
8459 sr_instance_id,
8460 SD_DATE,
8461 SUM(SD_QTY),
8462 last_update_date,
8463 last_updated_by,
8464 creation_date,
8465 created_by
8466 FROM
8467 (
8468 SELECT /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8469 DR.PLAN_ID plan_id,
8470 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8471 DR.RESOURCE_ID resource_id,
8472 DR.organization_id organization_id,
8473 DR.SR_INSTANCE_ID sr_instance_id,
8474 C.CALENDAR_DATE SD_DATE, -- 2859130 remove trunc
8475 -- Bug 3321897, 2943979 For Line Based Resources,
8476 -- Resource_ID is not NULL but -1
8477 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8478 DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8479 REQ.DAILY_RESOURCE_HOURS)) SD_QTY,
8480 p_sys_date last_update_date,
8481 l_user_id last_updated_by,
8482 p_sys_date creation_date,
8483 l_user_id created_by
8484 FROM MSC_DEPARTMENT_RESOURCES DR,
8485 MSC_TRADING_PARTNERS P,
8486 MSC_RESOURCE_REQUIREMENTS REQ,
8487 MSC_SYSTEM_ITEMS I, -- summary enhancement change for CTO ODR
8488 MSC_CALENDAR_DATES C
8489 ---- re-ordered tables for performance
8490 WHERE DR.PLAN_ID = REQ.PLAN_ID
8491 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID -- summary enhancement - made consistent
8492 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8493 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8494 AND DR.organization_id = REQ.ORGANIZATION_ID
8495 AND REQ.PLAN_ID = p_plan_id
8496 AND NVL(REQ.PARENT_ID, 2) = 2
8497 AND P.SR_TP_ID = DR.ORGANIZATION_ID
8498 AND P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8499 AND P.PARTNER_TYPE = 3
8500 AND C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8501 AND C.CALENDAR_CODE = P.CALENDAR_CODE
8502 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8503 AND C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8504 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8505 AND C.SEQ_NUM IS NOT NULL
8506 AND C.CALENDAR_DATE >= p_plan_start_date
8507 AND I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id ----\
8508 AND I.PLAN_ID = REQ.PLAN_ID --|
8509 AND I.ORGANIZATION_ID = REQ.ORGANIZATION_ID --|
8510 AND I.inventory_item_id = REQ.assembly_item_id --|\ summary enhancement
8511 AND ((I.bom_item_type <> 1 --|/ change for CTO ODR
8512 and I.bom_item_type <> 2 --|
8513 AND I.atp_flag <> 'N') --|
8514 OR (REQ.record_source = 2)) ----/
8515 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8516
8517 UNION ALL
8518
8519 SELECT plan_id plan_id,
8520 department_id,
8521 resource_id,
8522 organization_id,
8523 sr_instance_id,
8524 trunc(SHIFT_DATE) SD_DATE,
8525 CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8526 to_time,to_time + 24*3600,
8527 to_time) - from_time)/3600) SD_QTY,
8528 p_sys_date last_update_date,
8529 l_user_id last_updated_by,
8530 p_sys_date creation_date,
8531 l_user_id created_by
8532 FROM MSC_NET_RESOURCE_AVAIL
8533 WHERE PLAN_ID = p_plan_id
8534 AND NVL(PARENT_ID, -2) <> -1
8535 -- uncommented following line so that less number of rows are selected
8536 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8537 )
8538 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8539 last_update_date,last_updated_by, creation_date, created_by
8540 );
8541
8542 msc_util.msc_log('LOAD_RES_FULL_UNOPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8543 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH End ********');
8544
8545 END LOAD_RES_FULL_UNOPT_NOBATCH;
8546
8547
8548 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id IN NUMBER,
8549 p_plan_start_date IN DATE,
8550 p_sys_date IN DATE)
8551 IS
8552 l_user_id number;
8553 BEGIN
8554
8555 msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH Begin ********');
8556
8557 l_user_id := FND_GLOBAL.USER_ID;
8558
8559 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8560 INSERT INTO MSC_ATP_SUMMARY_RES(
8561 plan_id,
8562 department_id,
8563 resource_id,
8564 organization_id,
8565 sr_instance_id,
8566 sd_date,
8567 sd_qty,
8568 last_update_date,
8569 last_updated_by,
8570 creation_date,
8571 created_by)
8572 (SELECT plan_id,
8573 department_id,
8574 resource_id,
8575 organization_id,
8576 sr_instance_id,
8577 SD_DATE,
8578 SUM(SD_QTY),
8579 last_update_date,
8580 last_updated_by,
8581 creation_date,
8582 created_by
8583 FROM
8584 (
8585 SELECT /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8586 DR.PLAN_ID plan_id,
8587 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8588 DR.RESOURCE_ID resource_id,
8589 DR.organization_id organization_id,
8590 DR.SR_INSTANCE_ID sr_instance_id,
8591 TRUNC(REQ.START_DATE) SD_DATE,
8592 -- Bug 3321897, 2943979 For Line Based Resources,
8593 -- Resource_ID is not NULL but -1
8594 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8595 REQ.RESOURCE_HOURS) SD_QTY, --2859130
8596 -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS, -- noted in summary enhancement : inconsistent with MSCRATPB
8597 -- REQ.DAILY_RESOURCE_HOURS)) SD_QTY,
8598 p_sys_date last_update_date,
8599 l_user_id last_updated_by,
8600 p_sys_date creation_date,
8601 l_user_id created_by
8602 FROM MSC_DEPARTMENT_RESOURCES DR,
8603 MSC_RESOURCE_REQUIREMENTS REQ,
8604 MSC_SYSTEM_ITEMS I -- summary enhancement change for CTO ODR
8605 WHERE DR.PLAN_ID = REQ.PLAN_ID
8606 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID -- summary enhancement: made consistent
8607 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8608 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8609 AND DR.organization_id = REQ.ORGANIZATION_ID
8610 AND REQ.PLAN_ID = p_plan_id
8611 AND NVL(REQ.PARENT_ID, 1) = 1
8612 AND I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id ----\
8613 AND I.PLAN_ID = REQ.PLAN_ID --|
8614 AND I.ORGANIZATION_ID = REQ.ORGANIZATION_ID --|
8615 AND I.inventory_item_id = REQ.assembly_item_id --|\ summary enhancement
8616 AND ((I.bom_item_type <> 1 --|/ change for CTO ODR
8617 and I.bom_item_type <> 2 --|
8618 AND I.atp_flag <> 'N') --|
8619 OR (REQ.record_source = 2)) ----/
8620 AND REQ.START_DATE >= p_plan_start_date -- summary enhancement: made consistent
8621 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8622
8623 UNION ALL
8624
8625 SELECT plan_id plan_id,
8626 department_id,
8627 resource_id,
8628 organization_id,
8629 sr_instance_id,
8630 trunc(SHIFT_DATE) SD_DATE,
8631 CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8632 to_time,to_time + 24*3600,
8633 to_time) - from_time)/3600) SD_QTY,
8634 p_sys_date last_update_date,
8635 l_user_id last_updated_by,
8636 p_sys_date creation_date,
8637 l_user_id created_by
8638 FROM MSC_NET_RESOURCE_AVAIL
8639 WHERE PLAN_ID = p_plan_id
8640 AND NVL(PARENT_ID, -2) <> -1
8641 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement: made consistent
8642 )
8643 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8644 last_update_date,last_updated_by, creation_date, created_by
8645 );
8646
8647 msc_util.msc_log('LOAD_RES_FULL_OPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8648 msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH End ********');
8649
8650 END LOAD_RES_FULL_OPT_NOBATCH;
8651
8652
8653 PROCEDURE LOAD_RES_DATA_NET(p_plan_id IN NUMBER,
8654 p_last_refresh_number IN NUMBER,
8655 p_new_refresh_number IN NUMBER,
8656 p_sys_date IN DATE)
8657 IS
8658 l_user_id number;
8659 j pls_integer;
8660 l_department_id_tab MRP_ATP_PUB.number_arr;
8661 l_resource_id_tab MRP_ATP_PUB.number_arr;
8662 l_organization_id_tab MRP_ATP_PUB.number_arr;
8663 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
8664 l_sd_date_tab MRP_ATP_PUB.date_arr;
8665 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
8666
8667 l_ins_department_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8668 l_ins_resource_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8669 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8670 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8671 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
8672 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8673
8674 CURSOR c_net_res (p_plan_id IN NUMBER, -- Cursor does not require msc_net_resource_avail because
8675 p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
8676 p_new_refresh_number IN NUMBER)
8677 IS
8678 SELECT NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8679 DR.RESOURCE_ID resource_id,
8680 DR.organization_id organization_id,
8681 DR.SR_INSTANCE_ID sr_instance_id,
8682 -- Bug 3348095
8683 -- Only ATP created records, so use end_date
8684 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE)) SD_DATE,
8685 -- TRUNC(REQ.START_DATE) SD_DATE,
8686 -- End Bug 3348095
8687 SUM((-1) * REQ.RESOURCE_HOURS) SD_QTY -- ATP always populates resource_hours
8688 FROM MSC_DEPARTMENT_RESOURCES DR,
8689 MSC_RESOURCE_REQUIREMENTS REQ
8690 WHERE DR.PLAN_ID = p_plan_id
8691 AND REQ.PLAN_ID = DR.PLAN_ID
8692 AND REQ.SR_INSTANCE_ID = DR.sr_instance_id
8693 AND REQ.RESOURCE_ID = DR.resource_id
8694 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) = DR.DEPARTMENT_ID
8695 AND REQ.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8696 GROUP BY DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID, DR.RESOURCE_ID, DR.organization_id, DR.SR_INSTANCE_ID, TRUNC(NVL(REQ.END_DATE, REQ.START_DATE));
8697 -- Bug 3348095 Only ATP created records, so use end_date.
8698
8699 BEGIN
8700
8701 msc_util.msc_log('******** LOAD_RES_DATA_NET Begin ********');
8702
8703 l_user_id := FND_GLOBAL.USER_ID;
8704
8705 OPEN c_net_res(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8706 FETCH c_net_res BULK COLLECT INTO l_department_id_tab,
8707 l_resource_id_tab,
8708 l_organization_id_tab,
8709 l_sr_instance_id_tab,
8710 l_sd_date_tab,
8711 l_sd_quantity_tab;
8712 CLOSE c_net_res;
8713
8714 IF l_resource_id_tab IS NOT NULL AND l_resource_id_tab.COUNT > 0 THEN
8715
8716 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_resource_id_tab.COUNT := ' || l_resource_id_tab.COUNT);
8717
8718 forall j IN l_resource_id_tab.first.. l_resource_id_tab.last
8719 UPDATE MSC_ATP_SUMMARY_RES
8720 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
8721 last_update_date = p_sys_date,
8722 last_updated_by = l_user_id
8723 WHERE plan_id = p_plan_id
8724 AND sr_instance_id = l_sr_instance_id_tab(j)
8725 AND organization_id = l_organization_id_tab(j)
8726 AND resource_id = l_resource_id_tab(j)
8727 AND department_id = l_department_id_tab(j)
8728 AND sd_date = l_sd_date_tab(j);
8729
8730 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL UPDATE');
8731
8732 FOR j IN l_resource_id_tab.first.. l_resource_id_tab.last LOOP
8733 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8734 l_ins_department_id_tab.EXTEND;
8735 l_ins_resource_id_tab.EXTEND;
8736 l_ins_organization_id_tab.EXTEND;
8737 l_ins_sr_instance_id_tab.EXTEND;
8738 l_ins_sd_date_tab.EXTEND;
8739 l_ins_sd_quantity_tab.EXTEND;
8740
8741 l_ins_department_id_tab(l_ins_department_id_tab.COUNT) := l_department_id_tab(j);
8742 l_ins_resource_id_tab(l_ins_resource_id_tab.COUNT) := l_resource_id_tab(j);
8743 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
8744 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
8745 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
8746 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
8747 END IF;
8748 END LOOP;
8749
8750 IF l_ins_resource_id_tab IS NOT NULL AND l_ins_resource_id_tab.COUNT > 0 THEN
8751
8752 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_ins_resource_id_tab.COUNT := ' || l_ins_resource_id_tab.COUNT);
8753
8754 forall j IN l_ins_resource_id_tab.first.. l_ins_resource_id_tab.last
8755 INSERT INTO MSC_ATP_SUMMARY_RES (
8756 plan_id,
8757 department_id,
8758 resource_id,
8759 organization_id,
8760 sr_instance_id,
8761 sd_date,
8762 sd_qty,
8763 last_update_date,
8764 last_updated_by,
8765 creation_date,
8766 created_by)
8767 VALUES (p_plan_id,
8768 l_ins_department_id_tab(j),
8769 l_ins_resource_id_tab(j),
8770 l_ins_organization_id_tab(j),
8771 l_ins_sr_instance_id_tab(j),
8772 l_ins_sd_date_tab(j),
8773 l_ins_sd_quantity_tab(j),
8774 p_sys_date,
8775 l_user_id,
8776 p_sys_date,
8777 l_user_id);
8778
8779 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL INSERT');
8780
8781 ELSE
8782 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records to be inserted');
8783 END IF;
8784 ELSE
8785 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records fetched in the net cursor');
8786 END IF;
8787
8788 msc_util.msc_log('******** LOAD_RES_DATA_NET End ********');
8789
8790 END LOAD_RES_DATA_NET;
8791
8792
8793 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id IN NUMBER,
8794 p_applsys_schema IN Varchar2)
8795 IS
8796 l_partition_name varchar2(30);
8797 l_sql_stmt varchar2(300);
8798 BEGIN
8799 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_plan_id - ' || p_plan_id);
8800 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_applsys_schema - ' || p_applsys_schema);
8801
8802 ------------------------------------------------
8803
8804 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sd');
8805 l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8806 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8807 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD TRUNCATE PARTITION ' ||
8808 l_partition_name || ' DROP STORAGE';
8809
8810 BEGIN
8811 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SD');
8812 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8813 APPLICATION_SHORT_NAME => 'MSC',
8814 STATEMENT_TYPE => ad_ddl.alter_table,
8815 STATEMENT => l_sql_stmt,
8816 OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
8817 END;
8818 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating SD partition');
8819
8820 ------------------------------------------------
8821
8822 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sup');
8823 l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8824 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8825 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SUP TRUNCATE PARTITION ' ||
8826 l_partition_name || ' DROP STORAGE';
8827
8828 BEGIN
8829 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SUP');
8830 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8831 APPLICATION_SHORT_NAME => 'MSC',
8832 STATEMENT_TYPE => ad_ddl.alter_table,
8833 STATEMENT => l_sql_stmt,
8834 OBJECT_NAME => 'MSC_ATP_SUMMARY_SUP');
8835 END;
8836 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating sup partition');
8837
8838 ------------------------------------------------
8839
8840 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for res');
8841 l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8842 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8843 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_RES TRUNCATE PARTITION ' ||
8844 l_partition_name || ' DROP STORAGE';
8845
8846 BEGIN
8847 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_RES');
8848 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8849 APPLICATION_SHORT_NAME => 'MSC',
8850 STATEMENT_TYPE => ad_ddl.alter_table,
8851 STATEMENT => l_sql_stmt,
8852 OBJECT_NAME => 'MSC_ATP_SUMMARY_RES');
8853 END;
8854 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating res partition');
8855
8856 ------------------------------------------------
8857
8858 END Truncate_Summ_Plan_Partition;
8859
8860
8861 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id IN NUMBER,
8862 p_share_partition IN varchar2)
8863 IS
8864 l_partition_name varchar2(30);
8865 l_msc_schema VARCHAR2(30);
8866 BEGIN
8867
8868 ------------------------------------------------
8869 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for S/D Tables');
8870
8871 SELECT a.oracle_username
8872 INTO l_msc_schema
8873 FROM FND_ORACLE_USERID a,
8874 FND_PRODUCT_INSTALLATIONS b
8875 WHERE a.oracle_id = b.oracle_id
8876 AND b.application_id = 724;
8877
8878 IF p_share_partition = 'Y' THEN
8879 l_partition_name := 'ATP_SUMMARY_SD_999999';
8880 ELSE
8881 l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8882 END IF;
8883
8884 fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8885 tabname=>'MSC_ATP_SUMMARY_SD',
8886 partname=>l_partition_name,
8887 granularity=>'PARTITION',
8888 percent =>10);
8889 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for S/D tables');
8890 ------------------------------------------------
8891 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Sup Tables');
8892 IF p_share_partition = 'Y' THEN
8893 l_partition_name := 'ATP_SUMMARY_SUP_999999';
8894 ELSE
8895 l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8896 END IF;
8897
8898 fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8899 tabname=>'MSC_ATP_SUMMARY_SUP',
8900 partname=>l_partition_name,
8901 granularity=>'PARTITION',
8902 percent =>10);
8903 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Sup tables');
8904 ------------------------------------------------
8905 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Res Tables');
8906 IF p_share_partition = 'Y' THEN
8907 l_partition_name := 'ATP_SUMMARY_RES_999999';
8908 ELSE
8909 l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8910 END IF;
8911
8912 fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8913 tabname=>'MSC_ATP_SUMMARY_RES',
8914 partname=>l_partition_name,
8915 granularity=>'PARTITION',
8916 percent =>10);
8917 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Res tables');
8918 ------------------------------------------------
8919
8920
8921 END Gather_Summ_Plan_Stats;
8922
8923 --*************************************************************---
8924 --New Procedure added for collection enhancement --bug3049003
8925 --*************************************************************--
8926 PROCEDURE atp_snapshot_hook(
8927 p_plan_id IN NUMBER
8928 )
8929
8930 IS
8931 --bug3663487 start SQL_ID 9425117
8932 -- IO Perf:3693983: Don't Launch ATP Post snapshot Processes for IO Plans
8933 l_count NUMBER := 0;
8934 --bug3663487 end
8935 Begin
8936
8937 msc_util.msc_log('Begin procedure atp_snapshot_hook');
8938
8939 SELECT count(*)
8940 INTO l_count
8941 FROM msc_plans plans,
8942 msc_designators desig
8943 WHERE plans.plan_id = p_plan_id
8944 AND plans.plan_type <> 4
8945 AND plans.compile_designator = desig.designator
8946 AND plans.sr_instance_id = desig.sr_instance_id
8947 AND plans.organization_id = desig.organization_id
8948 AND (desig.inventory_atp_flag = 1
8949 OR plans.copy_plan_id IS NOT NULL);
8950
8951 msc_util.msc_log('atp_snapshot_hook: l_count: '|| nvl(l_count,0));
8952
8953 IF ( NVL(l_count,0) > 0) THEN
8954 msc_util.msc_log('atp_snapshot_hook: Updating msc_plan_organizations..');
8955 UPDATE msc_plan_organizations mpo
8956 SET so_lrn =(SELECT so_lrn
8957 FROM msc_instance_orgs mio
8958 WHERE mio.sr_instance_id=mpo.sr_instance_id
8959 AND mio.organization_id=mpo.organization_id
8960 )
8961 WHERE plan_id=p_plan_id;
8962 --RETURNING organization_id, sr_instance_id
8963 --BULK COLLECT INTO l_organization_id, l_sr_instance_id;
8964 msc_util.msc_log('atp_snapshot_hook: No. of Rows updated: '|| SQL%ROWCOUNT );
8965 END IF;
8966
8967 --bug3663487 start
8968 /*
8969 UPDATE msc_system_items mst1
8970 SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG
8971 FROM msc_system_items mst2
8972 WHERE mst2.sr_instance_id=mst1.sr_instance_id
8973 AND mst2.organization_id=mst1.organization_id
8974 AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8975 AND mst2.plan_id=-1
8976 )
8977 WHERE plan_id=p_plan_id;
8978 */
8979 -- ATP_RULE_ID and DEMAND_TIME_FENCE_DAYS is also flushed as we are using it in populate_atf_date
8980 -- to make its performance better.
8981 -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD
8982 /*
8983 FORALL j IN l_organization_id.first.. l_organization_id.last
8984 UPDATE msc_system_items mst1
8985 SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS
8986 FROM msc_system_items mst2
8987 WHERE mst2.sr_instance_id=mst1.sr_instance_id
8988 AND mst2.organization_id=mst1.organization_id
8989 AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8990 AND mst2.plan_id=-1
8991 )
8992 WHERE plan_id=p_plan_id
8993 AND mst1.ORGANIZATION_ID = l_organization_id(j)
8994 AND mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
8995 AND mst1.bom_item_type in (1,4,5)
8996 AND mst1.atp_flag <> 'N'
8997 OR mst1.atp_components_flag <> 'N';
8998 */
8999 --bug3663487 end
9000
9001 commit;
9002
9003 EXCEPTION
9004 WHEN others THEN
9005 msc_util.msc_log('Error in atp_snapshot_hook: ' || SQLCODE || '-' || SQLERRM);
9006 END atp_snapshot_hook;
9007
9008 -- NGOEL 1/15/2004, API to delete CTO BOM and OSS data from ATP temp tables for standalone and post 24x7 plan run plan purging
9009 -- This API will be called by "Purge Plan" conc program.
9010
9011 Procedure Delete_CTO_BOM_OSS(
9012 p_plan_id IN NUMBER)
9013 IS
9014 BEGIN
9015 msc_util.msc_log('Begin Delete_CTO_BOM_OSS for plan_id: ' || p_plan_id);
9016 msc_util.msc_log('Before Delete data for CTO BOM');
9017
9018 DELETE msc_cto_bom
9019 WHERE nvl(plan_id, p_plan_id) = p_plan_id;
9020
9021 msc_util.msc_log('After Delete data for CTO BOM: ' || SQL%ROWCOUNT);
9022
9023 msc_util.msc_log('Before Delete data for CTO OSS');
9024
9025 DELETE msc_cto_sources
9026 WHERE nvl(plan_id, p_plan_id) = p_plan_id;
9027
9028 msc_util.msc_log('After Delete data for CTO OSS: ' || SQL%ROWCOUNT);
9029
9030 commit;
9031
9032 msc_util.msc_log('End Delete_CTO_BOM_OSS');
9033 EXCEPTION
9034 WHEN others THEN
9035 msc_util.msc_log('Exception in Delete_CTO_BOM_OSS :' || SQLCODE || '-' || SQLERRM);
9036 END Delete_CTO_BOM_OSS;
9037
9038 END MSC_POST_PRO;