[Home] [Help]
PACKAGE BODY: APPS.MSC_POST_PRO
Source
1 PACKAGE BODY MSC_POST_PRO
2 -- $Header: MSCPOSTB.pls 120.8.12010000.5 2008/11/28 10:05:26 sbnaik 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('MSC', '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('MSC', '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; --anurodh, 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 --anurodh, 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 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 --anurodh, 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)
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)) 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)
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=>'MSC',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=>'MSC',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)
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)) 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)
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('MSC', 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id), granularity => 'ALL');
6127 fnd_stats.gather_table_stats('MSC', '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 NVL(DEMAND_CLASS, -1),
6203 TRUNC(SYSDATE),
6204 RESERVED_QUANTITY,
6205 msc_demands_s.nextval,
6206 -100,
6207 ORDER_NUMBER,
6208 SALES_ORDER_LINE_ID,
6209 CREATED_BY,
6210 CREATION_DATE,
6211 LAST_UPDATED_BY,
6212 LAST_UPDATE_DATE,
6213 using_requirement_quantity
6214 from msc_demands
6215 where plan_id = p_plan_id
6216 and origination_type in (30,6)
6217 and RESERVED_QUANTITY <> 0
6218 );
6219 msc_util.msc_log('inserted reservation rows in msc_alloc_demands :' || SQL%ROWCOUNT);
6220
6221 BEGIN
6222 update msc_plans
6223 set summary_flag = 3
6224 where plan_id = p_plan_id;
6225 END;
6226
6227 RETCODE := G_SUCCESS;
6228 commit;
6229
6230 msc_util.msc_log('End procedure post_plan_allocation');
6231
6232 EXCEPTION
6233 WHEN OTHERS THEN
6234 msc_util.msc_log('Inside main exception of post_plan_allocation');
6235 msc_util.msc_log(sqlerrm);
6236 ERRBUF := sqlerrm;
6237
6238 BEGIN
6239 update msc_plans
6240 set summary_flag = 1
6241 where plan_id = p_plan_id;
6242 commit;
6243 END;
6244
6245 RETCODE := G_ERROR;
6246 IF (l_share_partition = 'Y') THEN
6247 ROLLBACK;
6248 ELSE
6249 msc_util.msc_log('Call procedure clean_temp_tables in exception');
6250
6251 -- clean temp tables after exchanging partitions
6252 IF l_plan_id IS NOT NULL THEN
6253 clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6254 END IF;
6255
6256 msc_util.msc_log('After procedure clean_temp_tables in exception');
6257 END IF;
6258 END post_plan_allocation;
6259
6260 -- ngoel 5/7/2002, added new API to be called from planning process to launch concurrent program
6261 -- for post-plan process for summary/ pre-allocation process.
6262
6263 procedure atp_post_plan_proc(
6264 p_plan_id IN NUMBER,
6265 p_alloc_mode IN NUMBER := 0,
6266 p_summary_mode IN NUMBER := 0,
6267 x_retcode OUT NoCopy NUMBER,
6268 x_errbuf OUT NoCopy VARCHAR2
6269 )
6270 IS
6271 l_count NUMBER;
6272 l_inv_ctp NUMBER;
6273 l_alloc_atp VARCHAR2(1);
6274 l_class_hrchy NUMBER;
6275 l_alloc_method NUMBER;
6276 l_enable_summary_mode VARCHAR2(1);
6277 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6278 --l_submit_request VARCHAR2(1) := 'N';
6279 l_request_id NUMBER;
6280
6281 -- 24x7 ATP
6282 l_copy_plan_id NUMBER;
6283
6284 BEGIN
6285 msc_util.msc_log('Begin procedure atp_post_plan_proc');
6286 msc_util.msc_log('plan : ' || p_plan_id);
6287 msc_util.msc_log('Allocation Mode : ' || p_alloc_mode);
6288 msc_util.msc_log('Summary Mode : ' || p_summary_mode);
6289
6290 x_retcode := G_SUCCESS;
6291
6292 l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
6293
6294 msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
6295
6296 /* time_phased_atp changes begin
6297 Always call atp post plan processing conc prog if PDS
6298 IF l_enable_summary_mode = 'Y' AND l_inv_ctp = 4 AND l_alloc_atp = 'N' THEN
6299 l_submit_request := 'Y';
6300 ELSIF l_inv_ctp = 4 AND l_alloc_atp = 'Y' AND l_class_hrchy = 1 AND l_alloc_method = 1 THEN
6301 l_submit_request := 'Y';
6302 END IF;
6303
6304 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6305 IF l_inv_ctp = 4 THEN
6306 l_submit_request := 'Y';
6307 END IF;*/
6308 -- time_phased_atp changes end
6309
6310 ---bug 3274373
6311 IF l_inv_ctp = 4 THEN
6312
6313 -- Bug 3491498, check if plan is ATPable. Moved up to check it prior to refresh MSC_ATP_PLAN_SN
6314 SELECT count(*)
6315 INTO l_count
6316 FROM msc_plans plans,
6317 msc_designators desig
6318 WHERE desig.inventory_atp_flag = 1
6319 AND plans.plan_id = p_plan_id
6320 AND plans.compile_designator = desig.designator
6321 AND plans.sr_instance_id = desig.sr_instance_id
6322 AND plans.organization_id = desig.organization_id
6323 AND plans.plan_completion_date is not null
6324 AND plans.data_completion_date is not null
6325 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6326 AND plans.plan_type <> 4;
6327
6328 msc_util.msc_log('Count for plan : ' || l_count);
6329
6330 IF l_count > 0 THEN
6331 msc_util.msc_log('Before refreshing MSC_ATP_PLAN_SN');
6332 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6333 'MSC',
6334 'MSCREFMV',
6335 NULL, -- description
6336 NULL, -- start time
6337 FALSE, -- sub request
6338 'MSC_ATP_PLAN_SN',
6339 724);
6340 msc_util.msc_log('Request id for refreshing snapshot := ' || l_request_id);
6341 msc_util.msc_log('After refreshing MSC_ATP_PLAN_SN');
6342 END IF; --IF l_count = 0 THEN
6343 END IF;
6344
6345 -- Bug 3491498, moved prior to call to refresh MSC_ATP_PLAN_SN
6346 /*
6347 SELECT count(*)
6348 INTO l_count
6349 FROM msc_plans plans,
6350 msc_designators desig
6351 WHERE desig.inventory_atp_flag = 1
6352 AND plans.plan_id = p_plan_id
6353 AND plans.compile_designator = desig.designator
6354 AND plans.sr_instance_id = desig.sr_instance_id
6355 AND plans.organization_id = desig.organization_id
6356 AND plans.plan_completion_date is not null
6357 AND plans.data_completion_date is not null;
6358
6359 msc_util.msc_log('Count for plan : ' || l_count);
6360 msc_util.msc_log('l_submit_request : ' || l_submit_request);
6361 */
6362
6363 -- 24x7 ATP
6364 BEGIN
6365 select nvl (copy_plan_id, -1)
6366 into l_copy_plan_id
6367 from msc_plans
6368 where plan_id = p_plan_id
6369 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6370 AND plan_type <> 4;
6371 EXCEPTION
6372 when others then
6373 l_copy_plan_id := -1;
6374 END;
6375
6376 if (l_copy_plan_id > 0) then
6377 -- plan copy exists . force the execution of other things.
6378 l_count := 1;
6379 msc_util.msc_log ('Plan determined to be a 24x7 plan');
6380 end if;
6381
6382 IF l_count = 0 THEN
6383 UPDATE msc_plans
6384 SET summary_flag = 1
6385 WHERE plan_id = p_plan_id;
6386
6387 COMMIT;
6388 RETURN;
6389 END IF;
6390
6391 BEGIN
6392 msc_util.msc_log('before launching concurrent program');
6393 -- Bug 3292949
6394 UPDATE msc_plans
6395 SET summary_flag = 1
6396 WHERE plan_id = p_plan_id;
6397 msc_util.msc_log('Reset summary flag back to default:1 before conc prg launch');
6398 -- End Bug 3292949
6399 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6400 'MSC',
6401 'MSC_ATP_PDS_SUMM',
6402 NULL, -- description
6403 NULL, -- start time
6404 FALSE, -- sub request
6405 p_plan_id,
6406 2); -- Bug 3478888 Pass calling module as 2 as
6407 -- ATP Post Plan Processing is called from planning
6408
6409 UPDATE msc_plans /* for 24x7 ATP */
6410 SET request_id = l_request_id
6411 WHERE plan_id = p_plan_id;
6412
6413 COMMIT;
6414
6415 msc_util.msc_log('Request ID :' || l_request_id);
6416
6417 EXCEPTION
6418 WHEN OTHERS THEN
6419 msc_util.msc_log ('Conc. program error : ' || sqlcode || ':' || sqlerrm);
6420 x_retcode := G_ERROR;
6421 x_errbuf := sqlerrm;
6422 END;
6423 END atp_post_plan_proc;
6424
6425 /*
6426 * dsting 7/24/2002
6427 *
6428 * Deletes entries from mrp_atp_schedule_temp and mrp_atp_details_temp
6429 * older than p_hours old
6430 *
6431 */
6432 PROCEDURE ATP_Purge_MRP_Temp(
6433 ERRBUF OUT NoCopy VARCHAR2,
6434 RETCODE OUT NoCopy NUMBER,
6435 p_hours IN NUMBER
6436 )
6437 IS
6438 l_retain_date DATE;
6439 -- rajjain 12/20/2002
6440 l_spid VARCHAR2(12);
6441 l_mrp_schema VARCHAR2(30); --bug3545959
6442 l_msc_schema VARCHAR2(30); --bug3940999
6443 BEGIN
6444
6445 -- Bug 3304390 Disable Trace
6446 -- Deleted Related Code.
6447
6448 RETCODE := G_SUCCESS;
6449
6450 msc_util.msc_log('********** MRP_ATP_Purge_Temp **********');
6451 msc_util.msc_log('p_hours: ' || p_hours );
6452
6453 IF NVL(p_hours,0) > 0 THEN
6454
6455 l_retain_date := sysdate - p_hours/24;
6456
6457 msc_util.msc_log('Delete records older than l_retain_date ' ||
6458 to_char(l_retain_date, 'DD:MM:YYYY hh24:mi:ss'));
6459 msc_util.msc_log('Now sysdate: ' ||
6460 to_char(sysdate, 'DD:MM:YYYY hh24:mi:ss'));
6461
6462
6463 DELETE FROM mrp_atp_schedule_temp
6464 WHERE last_update_date < l_retain_date;
6465
6466 msc_util.msc_log('Records Deleted from mrp_atp_schedule_temp : ' ||
6467 SQL%ROWCOUNT);
6468
6469 --3670695: issue commit so that rollback segment is freed
6470 commit;
6471
6472 DELETE FROM mrp_atp_details_temp
6473 WHERE last_update_date < l_retain_date;
6474
6475 msc_util.msc_log('Records Deleted from mrp_atp_details_temp : ' ||
6476 SQL%ROWCOUNT);
6477 --bug3940999
6478 DELETE FROM msc_atp_src_profile_temp
6479 WHERE last_update_date < l_retain_date;
6480
6481 msc_util.msc_log('Records Deleted from msc_atp_src_profile_temp : ' ||
6482 SQL%ROWCOUNT);
6483
6484 ELSE
6485 msc_util.msc_log('completely purging temp tables');
6486 --bug3545959 start
6487 SELECT a.oracle_username
6488 INTO l_mrp_schema
6489 FROM FND_ORACLE_USERID a,
6490 FND_PRODUCT_INSTALLATIONS b
6491 WHERE a.oracle_id = b.oracle_id
6492 AND b.application_id = 704;
6493
6494 msc_util.msc_log('l_mrp_schema: ' || l_mrp_schema );
6495 --bug3545959 end
6496 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_schedule_temp';
6497 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_details_temp';
6498
6499 --bug3940999
6500 SELECT a.oracle_username
6501 INTO l_msc_schema
6502 FROM FND_ORACLE_USERID a,
6503 FND_PRODUCT_INSTALLATIONS b
6504 WHERE a.oracle_id = b.oracle_id
6505 AND b.application_id = 724;
6506
6507 msc_util.msc_log('l_msc_schema: ' || l_msc_schema );
6508
6509 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_msc_schema ||'.msc_atp_src_profile_temp';
6510
6511 END IF;
6512
6513 commit;
6514 EXCEPTION
6515 WHEN others THEN
6516 msc_util.msc_log('Error while purging temp tables : ' ||
6517 sqlcode || ' : ' || sqlerrm);
6518 rollback;
6519 END ATP_Purge_MRP_Temp;
6520
6521
6522 -- New procedure for summary enhancement
6523 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id IN NUMBER,
6524 p_share_partition IN varchar2,
6525 p_optimized_plan IN NUMBER, -- 1:Yes, 2:No
6526 p_full_refresh IN NUMBER, -- 1:Yes, 2:No
6527 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
6528 p_plan_type IN NUMBER, -- ATP4drp
6529 p_last_refresh_number IN NUMBER,
6530 p_new_refresh_number IN NUMBER,
6531 p_sys_date IN DATE)
6532 IS
6533 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
6534 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
6535 l_supplier_id_tab MRP_ATP_PUB.number_arr;
6536 l_supplier_site_id_tab MRP_ATP_PUB.number_arr;
6537 l_sd_date_tab MRP_ATP_PUB.date_arr;
6538 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
6539 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6540 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6541 l_ins_supplier_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6542 l_ins_supplier_site_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6543 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
6544 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6545
6546 -- ATPR4drp
6547 l_plan_type NUMBER;
6548 BEGIN
6549 msc_util.msc_log('************ LOAD_PLAN_SUMMARY_SD begin *************');
6550 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_plan_id - ' || p_plan_id);
6551 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_share_partition - ' || p_share_partition);
6552 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_optimized_plan - ' || p_optimized_plan);
6553 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_full_refresh - ' || p_full_refresh);
6554
6555 -- ATP4drp changes begin
6556 -- print plan_type
6557
6558 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Plan Type p_plan_type -> ' || p_plan_type);
6559 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6560
6561 -- END ATP4drp
6562
6563
6564 IF p_full_refresh = 1 THEN
6565 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside full summation');
6566
6567 -- first delete existing data. p_share_partition = 'N' data has already been deleted
6568 IF p_share_partition = 'Y' THEN
6569
6570 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside shared part_partition');
6571 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'before deleteing data from the table');
6572
6573 DELETE MSC_ATP_SUMMARY_SD where plan_id = p_plan_id;
6574 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After deleting data from the table');
6575
6576 END IF; --- IF share_partition = 'Y'
6577
6578 -- Now insert new data
6579 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6580 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6581 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6582
6583 load_sd_full_alloc(p_plan_id, p_sys_date);
6584
6585 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6586 ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6587 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unallocated ATP');
6588 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6589
6590 IF nvl(p_optimized_plan, 2) <> 1 THEN
6591 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unconstrained plan');
6592 IF p_time_phased_pf = 1 THEN
6593 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6594 load_sd_full_unalloc_unopt_pf(p_plan_id, p_sys_date);
6595 ELSE
6596 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6597 load_sd_full_unalloc_unopt(p_plan_id, p_sys_date);
6598 END IF;
6599 ELSE
6600 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Constrained plan');
6601 IF p_time_phased_pf = 1 THEN
6602 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6603 load_sd_full_unalloc_opt_pf(p_plan_id, p_sys_date);
6604 ELSE
6605 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6606 -- ATP4drp Call DRP specific summary
6607 IF (p_plan_type = 5) THEN
6608 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call FULL Summary for DRP plan.');
6609 msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6610 MSC_ATP_DRP.load_sd_full_drp(p_plan_id, p_sys_date);
6611 ELSE -- Call rest summary
6612 load_sd_full_unalloc_opt(p_plan_id, p_sys_date);
6613 END IF;
6614 -- End ATP4drp
6615 END IF;
6616 END IF;
6617
6618 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6619 END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6620
6621 ELSE --- IF p_full_refresh = 1 THEN
6622 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside incremental summation');
6623
6624 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6625 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6626 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6627
6628 load_sd_net_alloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6629
6630 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6631 ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6632 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside unallocated ATP');
6633 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6634
6635 -- ATP4drp Call DRP specific summary
6636 IF (p_plan_type = 5) THEN
6637 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call NET Summary for DRP plan.');
6638 MSC_ATP_DRP.load_sd_net_drp(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6639 ELSE -- Call rest summary
6640 load_sd_net_unalloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_time_phased_pf, p_sys_date);
6641 END IF;
6642 -- ATP4drp
6643
6644 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6645 END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6646
6647 END IF; --- IF p_full_refresh = 1 THEN
6648
6649 END LOAD_PLAN_SUMMARY_SD;
6650
6651 -- summary enhancement : private procedure for full summation of supply/demand
6652 -- for unconstrained plans for unallocated cases if no time
6653 -- phased PF ATP setup exist for the plan
6654 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id IN NUMBER,
6655 p_sys_date IN DATE)
6656 IS
6657 l_user_id NUMBER;
6658 BEGIN
6659
6660 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT Begin ********');
6661
6662 l_user_id := FND_GLOBAL.USER_ID;
6663
6664 INSERT INTO MSC_ATP_SUMMARY_SD (
6665 plan_id,
6666 sr_instance_id,
6667 organization_id,
6668 inventory_item_id,
6669 demand_class,
6670 sd_date,
6671 sd_qty,
6672 last_update_date,
6673 last_updated_by,
6674 creation_date,
6675 created_by)
6676 (SELECT plan_id,
6677 sr_instance_id,
6678 organization_id,
6679 inventory_item_id,
6680 demand_class,
6681 SD_DATE,
6682 sum(sd_qty),
6683 last_update_date,
6684 last_updated_by,
6685 creation_date,
6686 created_by
6687 --Bug 6046524 added index hint for performance improvement.
6688 from (SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6689 I.plan_id plan_id,
6690 I.sr_instance_id,
6691 I.organization_id,
6692 I.inventory_item_id,
6693 '@@@' demand_class,
6694 -- TRUNC(C.PRIOR_DATE) SD_DATE,
6695 C.CALENDAR_DATE SD_DATE, -- 2859130
6696 -1* DECODE(D.ORIGINATION_TYPE,
6697 4, D.DAILY_DEMAND_RATE,
6698 D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6699 p_sys_date last_update_date,
6700 l_user_id last_updated_by,
6701 p_sys_date creation_date,
6702 l_user_id created_by
6703 FROM MSC_SYSTEM_ITEMS I,
6704 MSC_TRADING_PARTNERS P,
6705 MSC_DEMANDS D,
6706 MSC_CALENDAR_DATES C
6707 WHERE I.ATP_FLAG = 'Y'
6708 AND I.PLAN_ID = p_plan_id
6709 AND D.PLAN_ID = I.PLAN_ID
6710 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6711 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6712 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
6713 -- 1243985
6714 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
6715 -- Bug 1530311, forecast to be excluded
6716 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6717 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6718 AND C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6719 -- since we store repetitive schedule demand in different ways for
6720 -- ods (total quantity on start date) and pds (daily quantity from
6721 -- start date to end date), we need to make sure we only select work day
6722 -- for pds's repetitive schedule demand.
6723 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6724 AND C.CALENDAR_DATE
6725 BETWEEN
6726 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6727 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6728 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6729 AND
6730 TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6731 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6732 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6733 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6734 AND ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6735 (D.ORIGINATION_TYPE <> 4))
6736 AND I.ORGANIZATION_ID = P.SR_TP_ID
6737 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6738 AND P.PARTNER_TYPE = 3
6739 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6740
6741 UNION ALL
6742
6743 --Bug 6046524 added index hint for performance improvement.
6744 SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6745 I.plan_id plan_id,
6746 I.sr_instance_id,
6747 I.organization_id,
6748 I.inventory_item_id,
6749 '@@@' demand_class,
6750 -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6751 C.CALENDAR_DATE SD_DATE,
6752 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
6753 p_sys_date last_update_date,
6754 l_user_id last_updated_by,
6755 p_sys_date creation_date,
6756 l_user_id created_by
6757 FROM MSC_SYSTEM_ITEMS I,
6758 MSC_TRADING_PARTNERS P,
6759 MSC_SUPPLIES S,
6760 MSC_CALENDAR_DATES C
6761 WHERE I.ATP_FLAG = 'Y'
6762 AND I.PLAN_ID = p_plan_id
6763 AND S.PLAN_ID = I.PLAN_ID
6764 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6765 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6766 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
6767 -- Exclude Cancelled Supplies 2460645
6768 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6769 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6770 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6771 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6772 AND C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6773 AND C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6774 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6775 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
6776 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6777 AND I.ORGANIZATION_ID = P.SR_TP_ID
6778 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6779 AND P.PARTNER_TYPE = 3
6780 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6781 )
6782 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6783 last_update_date, last_updated_by, creation_date, created_by );
6784
6785 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6786 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT End ********');
6787
6788 END LOAD_SD_FULL_UNALLOC_UNOPT;
6789
6790
6791 -- summary enhancement : private procedure for full summation of supply/demand
6792 -- for unconstrained plans for unallocated cases if time
6793 -- phased PF ATP setup exists for the plan
6794 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id IN NUMBER,
6795 p_sys_date IN DATE)
6796 IS
6797 l_user_id NUMBER;
6798 BEGIN
6799
6800 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF Begin ********');
6801
6802 l_user_id := FND_GLOBAL.USER_ID;
6803
6804 INSERT INTO MSC_ATP_SUMMARY_SD (
6805 plan_id,
6806 sr_instance_id,
6807 organization_id,
6808 inventory_item_id,
6809 demand_class,
6810 sd_date,
6811 sd_qty,
6812 last_update_date,
6813 last_updated_by,
6814 creation_date,
6815 created_by)
6816 (SELECT plan_id,
6817 sr_instance_id,
6818 organization_id,
6819 inventory_item_id,
6820 demand_class,
6821 SD_DATE,
6822 sum(sd_qty),
6823 last_update_date,
6824 last_updated_by,
6825 creation_date,
6826 created_by
6827 from (SELECT /*+ ORDERED */
6828 I.plan_id plan_id,
6829 I.sr_instance_id,
6830 I.organization_id,
6831 I.inventory_item_id,
6832 '@@@' demand_class,
6833 -- TRUNC(C.PRIOR_DATE) SD_DATE,
6834 C.CALENDAR_DATE SD_DATE, -- 2859130
6835 -1* DECODE(D.ORIGINATION_TYPE,
6836 4, D.DAILY_DEMAND_RATE,
6837 D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6838 p_sys_date last_update_date,
6839 l_user_id last_updated_by,
6840 p_sys_date creation_date,
6841 l_user_id created_by
6842 FROM MSC_SYSTEM_ITEMS I,
6843 MSC_TRADING_PARTNERS P,
6844 MSC_DEMANDS D,
6845 MSC_CALENDAR_DATES C
6846 WHERE I.ATP_FLAG = 'Y'
6847 AND I.PLAN_ID = p_plan_id
6848 AND D.PLAN_ID = I.PLAN_ID
6849 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6850 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6851 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
6852 -- 1243985
6853 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
6854 -- Bug 1530311, forecast to be excluded
6855 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6856 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6857 AND C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6858 -- since we store repetitive schedule demand in different ways for
6859 -- ods (total quantity on start date) and pds (daily quantity from
6860 -- start date to end date), we need to make sure we only select work day
6861 -- for pds's repetitive schedule demand.
6862 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6863 AND C.CALENDAR_DATE
6864 BETWEEN TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6865 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6866 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6867 AND TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6868 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6869 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6870 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6871 AND ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6872 (D.ORIGINATION_TYPE <> 4))
6873 AND I.ORGANIZATION_ID = P.SR_TP_ID
6874 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6875 AND P.PARTNER_TYPE = 3
6876 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6877 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6878
6879 UNION ALL
6880
6881 SELECT /*+ ORDERED */
6882 I.plan_id plan_id,
6883 I.sr_instance_id,
6884 I.organization_id,
6885 I.inventory_item_id,
6886 '@@@' demand_class,
6887 -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6888 C.CALENDAR_DATE SD_DATE,
6889 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
6890 p_sys_date last_update_date,
6891 l_user_id last_updated_by,
6892 p_sys_date creation_date,
6893 l_user_id created_by
6894 FROM MSC_SYSTEM_ITEMS I,
6895 MSC_TRADING_PARTNERS P,
6896 MSC_SUPPLIES S,
6897 MSC_CALENDAR_DATES C
6898 WHERE I.ATP_FLAG = 'Y'
6899 AND I.PLAN_ID = p_plan_id
6900 AND S.PLAN_ID = I.PLAN_ID
6901 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6902 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6903 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
6904 -- Exclude Cancelled Supplies 2460645
6905 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6906 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6907 AND C.CALENDAR_CODE = P.CALENDAR_CODE
6908 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6909 AND C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6910 AND C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6911 AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6912 AND DECODE(S.LAST_UNIT_COMPLETION_DATE,
6913 NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6914 AND I.ORGANIZATION_ID = P.SR_TP_ID
6915 AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID
6916 AND P.PARTNER_TYPE = 3
6917 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
6918 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6919
6920 UNION ALL
6921
6922 SELECT /*+ ORDERED */
6923 AD.plan_id,
6924 AD.sr_instance_id,
6925 AD.organization_id,
6926 AD.inventory_item_id,
6927 '@@@' demand_class,
6928 TRUNC(AD.demand_date) SD_DATE,
6929 -1 * AD.allocated_quantity SD_QTY,
6930 p_sys_date last_update_date,
6931 l_user_id last_updated_by,
6932 p_sys_date creation_date,
6933 l_user_id created_by
6934 FROM MSC_ALLOC_DEMANDS AD
6935 WHERE AD.PLAN_ID = p_plan_id
6936 AND AD.allocated_quantity <> 0
6937 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
6938
6939 UNION ALL
6940
6941 SELECT /*+ ORDERED */
6942 SA.plan_id,
6943 SA.sr_instance_id,
6944 SA.organization_id,
6945 SA.inventory_item_id,
6946 '@@@' demand_class,
6947 TRUNC(SA.supply_date) SD_DATE,
6948 SA.allocated_quantity SD_QTY,
6949 p_sys_date last_update_date,
6950 l_user_id last_updated_by,
6951 p_sys_date creation_date,
6952 l_user_id created_by
6953 FROM MSC_ALLOC_SUPPLIES SA
6954 WHERE SA.PLAN_ID = p_plan_id
6955 AND SA.allocated_quantity <> 0
6956 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
6957 )
6958 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6959 last_update_date, last_updated_by, creation_date, created_by );
6960
6961 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6962 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF End ********');
6963
6964 END LOAD_SD_FULL_UNALLOC_UNOPT_PF;
6965
6966
6967 -- summary enhancement : private procedure for full summation of supply/demand
6968 -- for constrained plans for unallocated cases if no time
6969 -- phased PF ATP setup exist for the plan
6970 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id IN NUMBER,
6971 p_sys_date IN DATE)
6972 IS
6973 l_user_id NUMBER;
6974 BEGIN
6975
6976 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT Begin ********');
6977
6978 l_user_id := FND_GLOBAL.USER_ID;
6979
6980 INSERT INTO MSC_ATP_SUMMARY_SD (
6981 plan_id,
6982 sr_instance_id,
6983 organization_id,
6984 inventory_item_id,
6985 demand_class,
6986 sd_date,
6987 sd_qty,
6988 last_update_date,
6989 last_updated_by,
6990 creation_date,
6991 created_by)
6992 (SELECT plan_id,
6993 sr_instance_id,
6994 organization_id,
6995 inventory_item_id,
6996 demand_class,
6997 SD_DATE,
6998 sum(sd_qty),
6999 last_update_date,
7000 last_updated_by,
7001 creation_date,
7002 created_by
7003 from (SELECT /*+ ORDERED */
7004 I.plan_id plan_id,
7005 I.sr_instance_id,
7006 I.organization_id,
7007 I.inventory_item_id,
7008 '@@@' demand_class,
7009 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7010 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7011 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7012 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7013 --plan by request date, promise date or schedule date -- 2859130
7014 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7015 p_sys_date last_update_date,
7016 l_user_id last_updated_by,
7017 p_sys_date creation_date,
7018 l_user_id created_by
7019 FROM MSC_SYSTEM_ITEMS I,
7020 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7021 -- Not required as calendar has been removed
7022 MSC_DEMANDS D
7023 WHERE I.ATP_FLAG = 'Y'
7024 AND I.PLAN_ID = p_plan_id
7025 AND D.PLAN_ID = I.PLAN_ID
7026 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7027 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7028 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7029 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7030 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7031 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7032 --AND P.PARTNER_TYPE = 3 -- has been removed
7033 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7034
7035 UNION ALL
7036
7037 SELECT /*+ ORDERED */
7038 I.plan_id plan_id,
7039 I.sr_instance_id,
7040 I.organization_id,
7041 I.inventory_item_id,
7042 '@@@' demand_class,
7043 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7044 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
7045 p_sys_date last_update_date,
7046 l_user_id last_updated_by,
7047 p_sys_date creation_date,
7048 l_user_id created_by
7049 FROM MSC_SYSTEM_ITEMS I,
7050 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7051 -- Not required as calendar has been removed
7052 MSC_SUPPLIES S
7053 WHERE I.ATP_FLAG = 'Y'
7054 AND I.PLAN_ID = p_plan_id
7055 AND S.PLAN_ID = I.PLAN_ID
7056 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7057 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7058 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7059 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7060 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7061 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7062 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7063 --AND P.PARTNER_TYPE = 3 -- has been removed
7064 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7065 )
7066 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7067 last_update_date, last_updated_by, creation_date, created_by );
7068
7069 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7070 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT End ********');
7071
7072 END LOAD_SD_FULL_UNALLOC_OPT;
7073
7074
7075 -- summary enhancement : private procedure for full summation of supply/demand
7076 -- for constrained plans for unallocated cases if time
7077 -- phased PF ATP setup exists for the plan
7078 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id IN NUMBER,
7079 p_sys_date IN DATE)
7080 IS
7081 l_user_id NUMBER;
7082 BEGIN
7083
7084 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF Begin ********');
7085
7086 l_user_id := FND_GLOBAL.USER_ID;
7087
7088 INSERT INTO MSC_ATP_SUMMARY_SD (
7089 plan_id,
7090 sr_instance_id,
7091 organization_id,
7092 inventory_item_id,
7093 demand_class,
7094 sd_date,
7095 sd_qty,
7096 last_update_date,
7097 last_updated_by,
7098 creation_date,
7099 created_by)
7100 (SELECT plan_id,
7101 sr_instance_id,
7102 organization_id,
7103 inventory_item_id,
7104 demand_class,
7105 SD_DATE,
7106 sum(sd_qty),
7107 last_update_date,
7108 last_updated_by,
7109 creation_date,
7110 created_by
7111 from (SELECT /*+ ORDERED */
7112 I.plan_id plan_id,
7113 I.sr_instance_id,
7114 I.organization_id,
7115 I.inventory_item_id,
7116 '@@@' demand_class,
7117 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7118 TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7119 2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7120 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7121 --plan by request date, promise date or schedule date -- 2859130
7122 -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7123 p_sys_date last_update_date,
7124 l_user_id last_updated_by,
7125 p_sys_date creation_date,
7126 l_user_id created_by
7127 FROM MSC_SYSTEM_ITEMS I,
7128 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7129 -- Not required as calendar has been removed
7130 MSC_DEMANDS D
7131 WHERE I.ATP_FLAG = 'Y'
7132 AND I.PLAN_ID = p_plan_id
7133 AND D.PLAN_ID = I.PLAN_ID
7134 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7135 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7136 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7137 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7138 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7139 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7140 --AND P.PARTNER_TYPE = 3 -- has been removed
7141 AND D.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7142 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7143
7144 UNION ALL
7145
7146 SELECT /*+ ORDERED */
7147 I.plan_id plan_id,
7148 I.sr_instance_id,
7149 I.organization_id,
7150 I.inventory_item_id,
7151 '@@@' demand_class,
7152 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7153 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY,
7154 p_sys_date last_update_date,
7155 l_user_id last_updated_by,
7156 p_sys_date creation_date,
7157 l_user_id created_by
7158 FROM MSC_SYSTEM_ITEMS I,
7159 -- MSC_TRADING_PARTNERS P, -- Removed with summary enhancement changes
7160 -- Not required as calendar has been removed
7161 MSC_SUPPLIES S
7162 WHERE I.ATP_FLAG = 'Y'
7163 AND I.PLAN_ID = p_plan_id
7164 AND S.PLAN_ID = I.PLAN_ID
7165 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7166 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7167 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7168 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7169 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7170 --AND I.ORGANIZATION_ID = P.SR_TP_ID -- Removed with summary enhancement
7171 --AND I.SR_INSTANCE_ID = P.SR_INSTANCE_ID -- changes. Not required as calendar
7172 --AND P.PARTNER_TYPE = 3 -- has been removed
7173 AND S.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7174 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7175
7176 UNION ALL
7177
7178 SELECT /*+ ORDERED */
7179 AD.plan_id,
7180 AD.sr_instance_id,
7181 AD.organization_id,
7182 AD.inventory_item_id,
7183 '@@@' demand_class,
7184 TRUNC(AD.demand_date) SD_DATE,
7185 -1 * AD.allocated_quantity SD_QTY,
7186 p_sys_date last_update_date,
7187 l_user_id last_updated_by,
7188 p_sys_date creation_date,
7189 l_user_id created_by
7190 FROM MSC_ALLOC_DEMANDS AD
7191 WHERE AD.PLAN_ID = p_plan_id
7192 AND AD.allocated_quantity <> 0
7193 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7194
7195 UNION ALL
7196
7197 SELECT /*+ ORDERED */
7198 SA.plan_id,
7199 SA.sr_instance_id,
7200 SA.organization_id,
7201 SA.inventory_item_id,
7202 '@@@' demand_class,
7203 TRUNC(SA.supply_date) SD_DATE,
7204 SA.allocated_quantity SD_QTY,
7205 p_sys_date last_update_date,
7206 l_user_id last_updated_by,
7207 p_sys_date creation_date,
7208 l_user_id created_by
7209 FROM MSC_ALLOC_SUPPLIES SA
7210 WHERE SA.PLAN_ID = p_plan_id
7211 AND SA.allocated_quantity <> 0
7212 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7213 )
7214 GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7215 last_update_date, last_updated_by, creation_date, created_by );
7216
7217 msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7218 msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF End ********');
7219
7220 END LOAD_SD_FULL_UNALLOC_OPT_PF;
7221
7222
7223 -- summary enhancement : private procedure for full summation of supply/demand
7224 -- for allocated cases. separate procedures for PF/non-PF
7225 -- cases are not required because we always select from
7226 -- alloc tables. separate procedures for opt/unopt not required
7227 -- because data in alloc tables is populated using pegging and
7228 -- pegging for repetitive schedules would not have been generated
7229 -- on non-working days.
7230 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id IN NUMBER,
7231 p_sys_date IN DATE)
7232 IS
7233 l_user_id number;
7234 BEGIN
7235
7236 msc_util.msc_log('******** LOAD_SD_FULL_ALLOC Begin ********');
7237
7238 l_user_id := FND_GLOBAL.USER_ID;
7239
7240 INSERT INTO MSC_ATP_SUMMARY_SD (
7241 plan_id,
7242 sr_instance_id,
7243 organization_id,
7244 inventory_item_id,
7245 demand_class,
7246 sd_date,
7247 sd_qty,
7248 last_update_date,
7249 last_updated_by,
7250 creation_date,
7251 created_by)
7252 (SELECT plan_id,
7253 sr_instance_id,
7254 organization_id,
7255 inventory_item_id,
7256 demand_class,
7257 SD_DATE,
7258 sum(sd_qty),
7259 last_update_date,
7260 last_updated_by,
7261 creation_date,
7262 created_by
7263 from (SELECT /*+ ORDERED */
7264 AD.plan_id,
7265 AD.sr_instance_id,
7266 AD.organization_id,
7267 AD.inventory_item_id,
7268 AD.demand_class,
7269 TRUNC(AD.demand_date) SD_DATE,
7270 -1 * AD.allocated_quantity SD_QTY,
7271 p_sys_date last_update_date,
7272 l_user_id last_updated_by,
7273 p_sys_date creation_date,
7274 l_user_id created_by
7275 FROM MSC_ALLOC_DEMANDS AD
7276 WHERE AD.PLAN_ID = p_plan_id
7277 AND AD.allocated_quantity <> 0
7278 AND AD.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7279
7280 UNION ALL
7281
7282 SELECT /*+ ORDERED */
7283 SA.plan_id,
7284 SA.sr_instance_id,
7285 SA.organization_id,
7286 SA.inventory_item_id,
7287 SA.demand_class,
7288 TRUNC(SA.supply_date) SD_DATE,
7289 SA.allocated_quantity SD_QTY,
7290 p_sys_date last_update_date,
7291 l_user_id last_updated_by,
7292 p_sys_date creation_date,
7293 l_user_id created_by
7294 FROM MSC_ALLOC_SUPPLIES SA
7295 WHERE SA.PLAN_ID = p_plan_id
7296 AND SA.allocated_quantity <> 0
7297 AND SA.refresh_number IS NULL -- consider only planning records in full summation - summary enhancement
7298 )
7299 GROUP BY plan_id, inventory_item_id, organization_id, sr_instance_id,demand_class, sd_date,
7300 last_update_date, last_updated_by, creation_date, created_by
7301 HAVING sum(SD_QTY) <> 0);
7302
7303 msc_util.msc_log('LOAD_SD_FULL_ALLOC: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7304 msc_util.msc_log('******** LOAD_SD_FULL_ALLOC End ********');
7305
7306 END LOAD_SD_FULL_ALLOC;
7307
7308
7309 -- summary enhancement : private procedure for net summation of supply/demand
7310 -- for unallocated cases. separate procedures for opt/unopt not required
7311 -- because we bother only about ATP generated records.
7312 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id IN NUMBER,
7313 p_last_refresh_number IN NUMBER,
7314 p_new_refresh_number IN NUMBER,
7315 p_time_phased_pf IN NUMBER, -- 1:Yes, 2:No
7316 p_sys_date IN DATE)
7317 IS
7318 l_user_id number;
7319 j pls_integer;
7320 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7321 l_organization_id_tab MRP_ATP_PUB.number_arr;
7322 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7323 l_sd_date_tab MRP_ATP_PUB.date_arr;
7324 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7325 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7326 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7327 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7328 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7329 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7330
7331 CURSOR c_net_sd (p_plan_id IN NUMBER,
7332 p_last_refresh_number IN NUMBER,
7333 p_new_refresh_number IN NUMBER)
7334 IS
7335 SELECT sr_instance_id,
7336 organization_id,
7337 inventory_item_id,
7338 SD_DATE,
7339 sum(sd_qty)
7340 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7341 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7342 from (SELECT I.sr_instance_id,
7343 I.organization_id,
7344 I.inventory_item_id,
7345 TRUNC(DECODE(D.RECORD_SOURCE,
7346 2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7347 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7348 2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7349 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7350 --plan by request date, promise date or schedule date
7351 decode(D.USING_REQUIREMENT_QUANTITY, -- Consider unscheduled orders as dummy supplies
7352 0, D.OLD_DEMAND_QUANTITY, -- For summary enhancement
7353 -1 * D.USING_REQUIREMENT_QUANTITY) SD_QTY
7354 FROM MSC_SYSTEM_ITEMS I,
7355 MSC_DEMANDS D
7356 WHERE I.ATP_FLAG = 'Y'
7357 AND I.PLAN_ID = p_plan_id
7358 AND D.PLAN_ID = I.PLAN_ID
7359 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7360 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7361 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7362 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7363 AND D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7364
7365 UNION ALL
7366
7367 SELECT I.sr_instance_id,
7368 I.organization_id,
7369 I.inventory_item_id,
7370 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7371 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY
7372 FROM MSC_SYSTEM_ITEMS I,
7373 MSC_SUPPLIES S
7374 WHERE I.ATP_FLAG = 'Y'
7375 AND I.PLAN_ID = p_plan_id
7376 AND S.PLAN_ID = I.PLAN_ID
7377 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7378 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7379 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7380 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- These two conditions
7381 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- may not be required
7382 AND S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7383 )
7384 GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7385
7386
7387 CURSOR c_net_sd_pf (p_plan_id IN NUMBER,
7388 p_last_refresh_number IN NUMBER,
7389 p_new_refresh_number IN NUMBER)
7390 IS
7391 SELECT sr_instance_id,
7392 organization_id,
7393 inventory_item_id,
7394 SD_DATE,
7395 sum(sd_qty)
7396 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7397 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7398 from (SELECT I.sr_instance_id,
7399 I.organization_id,
7400 I.inventory_item_id,
7401 TRUNC(DECODE(D.RECORD_SOURCE,
7402 2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7403 DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7404 2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7405 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7406 --plan by request date, promise date or schedule date
7407 decode(D.USING_REQUIREMENT_QUANTITY, -- Consider unscheduled orders as dummy supplies
7408 0, D.OLD_DEMAND_QUANTITY, -- For summary enhancement
7409 -1 * D.USING_REQUIREMENT_QUANTITY) SD_QTY
7410 FROM MSC_SYSTEM_ITEMS I,
7411 MSC_DEMANDS D
7412 WHERE I.ATP_FLAG = 'Y'
7413 AND I.PLAN_ID = p_plan_id
7414 AND D.PLAN_ID = I.PLAN_ID
7415 AND D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7416 AND D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7417 AND D.ORGANIZATION_ID = I.ORGANIZATION_ID
7418 AND D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7419 AND D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7420 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7421
7422 UNION ALL
7423
7424 SELECT I.sr_instance_id,
7425 I.organization_id,
7426 I.inventory_item_id,
7427 TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7428 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) SD_QTY
7429 FROM MSC_SYSTEM_ITEMS I,
7430 MSC_SUPPLIES S
7431 WHERE I.ATP_FLAG = 'Y'
7432 AND I.PLAN_ID = p_plan_id
7433 AND S.PLAN_ID = I.PLAN_ID
7434 AND S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
7435 AND S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7436 AND S.ORGANIZATION_ID = I.ORGANIZATION_ID
7437 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- These two conditions
7438 AND NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- may not be required
7439 AND S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7440 AND I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7441
7442 UNION ALL
7443
7444 SELECT AD.sr_instance_id,
7445 AD.organization_id,
7446 AD.inventory_item_id,
7447 TRUNC(AD.demand_date) SD_DATE,
7448 decode(AD.allocated_quantity,
7449 0, AD.old_allocated_quantity,
7450 -1 * AD.allocated_quantity) SD_QTY
7451 FROM MSC_ALLOC_DEMANDS AD
7452 WHERE AD.PLAN_ID = p_plan_id
7453 AND AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7454
7455 UNION ALL
7456
7457 SELECT SA.sr_instance_id,
7458 SA.organization_id,
7459 SA.inventory_item_id,
7460 TRUNC(SA.supply_date) SD_DATE,
7461 SA.allocated_quantity SD_QTY
7462 FROM MSC_ALLOC_SUPPLIES SA
7463 WHERE SA.PLAN_ID = p_plan_id
7464 AND SA.allocated_quantity <> 0
7465 AND SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7466 )
7467 GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7468
7469 BEGIN
7470
7471 msc_util.msc_log('******** LOAD_SD_NET_UNALLOC Begin ********');
7472 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_last_refresh_number - ' || p_last_refresh_number);
7473 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_new_refresh_number - ' || p_new_refresh_number);
7474 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_time_phased_pf - ' || p_time_phased_pf);
7475
7476 l_user_id := FND_GLOBAL.USER_ID;
7477
7478 IF p_time_phased_pf = 2 THEN
7479 OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7480 FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7481 l_organization_id_tab,
7482 l_inventory_item_id_tab,
7483 l_sd_date_tab,
7484 l_sd_quantity_tab;
7485 CLOSE c_net_sd;
7486 ELSE
7487 OPEN c_net_sd_pf(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7488 FETCH c_net_sd_pf BULK COLLECT INTO l_sr_instance_id_tab,
7489 l_organization_id_tab,
7490 l_inventory_item_id_tab,
7491 l_sd_date_tab,
7492 l_sd_quantity_tab;
7493 CLOSE c_net_sd_pf;
7494 END IF;
7495
7496 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7497
7498 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7499
7500 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7501 UPDATE MSC_ATP_SUMMARY_SD
7502 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
7503 last_update_date = p_sys_date,
7504 last_updated_by = l_user_id
7505 WHERE plan_id = p_plan_id
7506 AND sr_instance_id = l_sr_instance_id_tab(j)
7507 AND inventory_item_id = l_inventory_item_id_tab(j)
7508 AND organization_id = l_organization_id_tab(j)
7509 AND sd_date = l_sd_date_tab(j);
7510
7511 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL UPDATE');
7512
7513 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7514 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7515 l_ins_sr_instance_id_tab.EXTEND;
7516 l_ins_organization_id_tab.EXTEND;
7517 l_ins_inventory_item_id_tab.EXTEND;
7518 l_ins_sd_date_tab.EXTEND;
7519 l_ins_sd_quantity_tab.EXTEND;
7520
7521 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
7522 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
7523 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
7524 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
7525 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
7526 END IF;
7527 END LOOP;
7528
7529 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7530
7531 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7532
7533 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7534 INSERT INTO MSC_ATP_SUMMARY_SD (
7535 plan_id,
7536 sr_instance_id,
7537 organization_id,
7538 inventory_item_id,
7539 demand_class,
7540 sd_date,
7541 sd_qty,
7542 last_update_date,
7543 last_updated_by,
7544 creation_date,
7545 created_by)
7546 VALUES (p_plan_id,
7547 l_ins_sr_instance_id_tab(j),
7548 l_ins_organization_id_tab(j),
7549 l_ins_inventory_item_id_tab(j),
7550 '@@@',
7551 l_ins_sd_date_tab(j),
7552 l_ins_sd_quantity_tab(j),
7553 p_sys_date,
7554 l_user_id,
7555 p_sys_date,
7556 l_user_id);
7557
7558 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL INSERT');
7559
7560 ELSE
7561 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records to be inserted');
7562 END IF;
7563 ELSE
7564 msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records fetched in the net cursor');
7565 END IF;
7566
7567 msc_util.msc_log('******** LOAD_SD_NET_UNALLOC End ********');
7568
7569 END LOAD_SD_NET_UNALLOC;
7570
7571
7572 -- summary enhancement : private procedure for net summation of supply/demand
7573 -- for allocated cases.
7574 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id IN NUMBER,
7575 p_last_refresh_number IN NUMBER,
7576 p_new_refresh_number IN NUMBER,
7577 p_sys_date IN DATE)
7578 IS
7579 l_user_id number;
7580 j pls_integer;
7581 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7582 l_organization_id_tab MRP_ATP_PUB.number_arr;
7583 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7584 l_demand_class_tab MRP_ATP_PUB.char30_arr;
7585 l_sd_date_tab MRP_ATP_PUB.date_arr;
7586 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7587
7588 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7589 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7590 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7591 l_ins_demand_class_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr();
7592 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7593 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7594
7595 CURSOR c_net_sd (p_plan_id IN NUMBER,
7596 p_last_refresh_number IN NUMBER,
7597 p_new_refresh_number IN NUMBER)
7598 IS
7599 SELECT sr_instance_id,
7600 organization_id,
7601 inventory_item_id,
7602 demand_class,
7603 SD_DATE,
7604 sum(sd_qty)
7605 from (SELECT AD.sr_instance_id,
7606 AD.organization_id,
7607 AD.inventory_item_id,
7608 AD.demand_class,
7609 TRUNC(AD.demand_date) SD_DATE,
7610 decode(AD.allocated_quantity,
7611 0, AD.old_allocated_quantity,
7612 -1 * AD.allocated_quantity) SD_QTY
7613 FROM MSC_ALLOC_DEMANDS AD
7614 WHERE AD.PLAN_ID = p_plan_id
7615 AND AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7616
7617 UNION ALL
7618
7619 SELECT SA.sr_instance_id,
7620 SA.organization_id,
7621 SA.inventory_item_id,
7622 SA.demand_class,
7623 TRUNC(SA.supply_date) SD_DATE,
7624 decode(SA.ALLOCATED_QUANTITY, -- Consider deleted stealing records as dummy demands
7625 0, -1 * OLD_ALLOCATED_QUANTITY, -- For summary enhancement
7626 SA.ALLOCATED_QUANTITY) SD_QTY
7627 FROM MSC_ALLOC_SUPPLIES SA
7628 WHERE SA.PLAN_ID = p_plan_id
7629 AND SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7630 )
7631 GROUP BY inventory_item_id, organization_id, sr_instance_id, demand_class, sd_date;
7632
7633 BEGIN
7634
7635 msc_util.msc_log('******** LOAD_SD_NET_ALLOC Begin ********');
7636
7637 l_user_id := FND_GLOBAL.USER_ID;
7638
7639 OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7640 FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7641 l_organization_id_tab,
7642 l_inventory_item_id_tab,
7643 l_demand_class_tab,
7644 l_sd_date_tab,
7645 l_sd_quantity_tab;
7646 CLOSE c_net_sd;
7647
7648 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7649
7650 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7651
7652 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7653 UPDATE MSC_ATP_SUMMARY_SD
7654 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
7655 last_update_date = p_sys_date,
7656 last_updated_by = l_user_id
7657 WHERE plan_id = p_plan_id
7658 AND sr_instance_id = l_sr_instance_id_tab(j)
7659 AND inventory_item_id = l_inventory_item_id_tab(j)
7660 AND organization_id = l_organization_id_tab(j)
7661 AND sd_date = l_sd_date_tab(j)
7662 AND demand_class = l_demand_class_tab(j);
7663
7664 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL UPDATE');
7665
7666 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7667 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7668 l_ins_sr_instance_id_tab.EXTEND;
7669 l_ins_organization_id_tab.EXTEND;
7670 l_ins_inventory_item_id_tab.EXTEND;
7671 l_ins_demand_class_tab.EXTEND;
7672 l_ins_sd_date_tab.EXTEND;
7673 l_ins_sd_quantity_tab.EXTEND;
7674
7675 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
7676 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
7677 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
7678 l_ins_demand_class_tab(l_ins_demand_class_tab.COUNT) := l_demand_class_tab(j);
7679 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
7680 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
7681 END IF;
7682 END LOOP;
7683
7684 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7685
7686 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7687
7688 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7689 INSERT INTO MSC_ATP_SUMMARY_SD (
7690 plan_id,
7691 sr_instance_id,
7692 organization_id,
7693 inventory_item_id,
7694 demand_class,
7695 sd_date,
7696 sd_qty,
7697 last_update_date,
7698 last_updated_by,
7699 creation_date,
7700 created_by)
7701 VALUES (p_plan_id,
7702 l_ins_sr_instance_id_tab(j),
7703 l_ins_organization_id_tab(j),
7704 l_ins_inventory_item_id_tab(j),
7705 l_ins_demand_class_tab(j),
7706 l_ins_sd_date_tab(j),
7707 l_ins_sd_quantity_tab(j),
7708 p_sys_date,
7709 l_user_id,
7710 p_sys_date,
7711 l_user_id);
7712
7713 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL INSERT');
7714
7715 ELSE
7716 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records to be inserted');
7717 END IF;
7718 ELSE
7719 msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records fetched in the net cursor');
7720 END IF;
7721
7722 msc_util.msc_log('******** LOAD_SD_NET_ALLOC End ********');
7723
7724 END LOAD_SD_NET_ALLOC;
7725
7726
7727 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id IN NUMBER,
7728 p_sys_date IN DATE)
7729 IS
7730 l_plan_start_date date;
7731 l_instance_id number;
7732 l_cutoff_date date;
7733 l_org_id number;
7734 -- l_default_atp_rule_id number; -- Bug 3912422
7735 l_calendar_code VARCHAR2(14);
7736 l_calendar_exception_set_id NUMBER := -1; -- Bug 3912422 - Initiallize to -1
7737 -- l_default_demand_class VARCHAR2(34); -- Bug 3912422
7738 l_user_id number;
7739 -- l_org_code VARCHAR2(7); -- Bug 3912422
7740 BEGIN
7741
7742 msc_util.msc_log('******** LOAD_SUP_DATA_FULL Begin ********');
7743
7744 SELECT trunc(p.plan_start_date),
7745 p.sr_instance_id,
7746 p.organization_id,
7747 trunc(p.cutoff_date),
7748 tp.calendar_code
7749 INTO l_plan_start_date,
7750 l_instance_id,
7751 l_org_id,
7752 l_cutoff_date,
7753 l_calendar_code
7754 FROM msc_plans p,
7755 msc_trading_partners tp
7756 WHERE p.plan_id = p_plan_id
7757 AND p.organization_id = tp.sr_tp_id
7758 AND p.sr_instance_id = tp.sr_instance_id
7759 AND tp.partner_type = 3;
7760
7761 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_plan_start_date = ' || l_plan_start_date);
7762 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_instance_id = ' || l_instance_id);
7763 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_org_id = ' || l_org_id);
7764 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_calendar_code = ' || l_calendar_code);
7765
7766 l_user_id := FND_GLOBAL.USER_ID;
7767
7768 INSERT INTO MSC_ATP_SUMMARY_SUP(
7769 plan_id,
7770 sr_instance_id,
7771 inventory_item_id,
7772 supplier_id,
7773 supplier_site_id,
7774 sd_date,
7775 sd_qty,
7776 demand_class,
7777 last_update_date,
7778 last_updated_by,
7779 creation_date,
7780 created_by)
7781 (SELECT plan_id, sr_instance_id, inventory_item_id, supplier_id, supplier_site_id, sd_date, sum(sd_qty),
7782 demand_class, last_update_date, last_updated_by, creation_date, created_by
7783 FROM (
7784 SELECT SV.plan_id plan_id,
7785 SV.sr_instance_id,
7786 SV.inventory_item_id inventory_item_id,
7787 SV.supplier_id supplier_id,
7788 SV.supplier_site_id supplier_site_id,
7789 c.calendar_date sd_date, -- 2859130 remove trunc
7790 SV.capacity sd_qty,
7791 null demand_class,
7792 p_sys_date last_update_date,
7793 l_user_id last_updated_by,
7794 p_sys_date creation_date,
7795 l_user_id created_by
7796 FROM msc_calendar_dates c,
7797 (SELECT /*+ LEADING (I) */
7798 I.plan_id plan_id,
7799 I.sr_instance_id,
7800 I.inventory_item_id inventory_item_id,
7801 S.supplier_id supplier_id,
7802 S.supplier_site_id supplier_site_id,
7803 S.capacity,
7804 trunc(S.from_date) from_date,
7805 trunc(S.to_date) to_date,
7806 mis.delivery_calendar_code,
7807 mis.supplier_lead_time_date
7808 FROM msc_system_items I,
7809 msc_supplier_capacities s,
7810 msc_item_suppliers mis -- Bug 3912422 - Move to the inner query
7811 WHERE I.plan_id = p_plan_id
7812 AND I.atp_components_flag in ('Y', 'C')
7813 AND s.inventory_item_id = I.inventory_item_id
7814 AND s.sr_instance_id = I.sr_instance_id
7815 AND s.plan_id = I.plan_id
7816 AND s.organization_id = i.organization_id --\
7817 AND s.inventory_item_id = mis.inventory_item_id --|
7818 AND s.sr_instance_id = mis.sr_instance_id --> Bug 3912422
7819 AND s.plan_id = mis.plan_id --|
7820 AND s.organization_id = mis.organization_id --/
7821 AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7822 --AND (I.inventory_item_id, S.supplier_id, nvl(S.supplier_site_id,-1)) NOT IN
7823 -- Bug 3912422
7824 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
7825 FROM msc_supplier_flex_fences msff
7826 WHERE plan_id = p_plan_id
7827 AND msff.inventory_item_id = s.inventory_item_id --\
7828 AND msff.supplier_id = s.supplier_id -- } Bug 3912422
7829 AND msff.supplier_site_id = s.supplier_site_id --/
7830 AND rownum = 1)
7831 group by I.plan_id,
7832 I.inventory_item_id,
7833 I.sr_instance_id,
7834 s.supplier_id,
7835 s.supplier_site_id,
7836 s.capacity,
7837 trunc(s.from_date),
7838 trunc(s.to_date),
7839 mis.delivery_calendar_code,
7840 mis.supplier_lead_time_date) SV
7841 -- msc_item_suppliers mis -- Bug 3912422 - Move to the inner query
7842 WHERE /* SV.inventory_item_id = mis.inventory_item_id
7843 AND SV.supplier_id = mis.supplier_id
7844 AND nvl(SV.supplier_site_id,-1) = nvl(mis.supplier_site_id, -1)
7845 AND SV.sr_instance_id = mis.sr_instance_id
7846 AND c.calendar_code = nvl(mis.delivery_calendar_code, l_calendar_code)
7847 AND*/ c.calendar_code = nvl(SV.delivery_calendar_code, l_calendar_code)
7848 AND c.calendar_date BETWEEN trunc(SV.from_date)
7849 AND NVL(SV.to_date,l_cutoff_date)
7850 -- AND (c.seq_num IS NOT NULL OR mis.delivery_calendar_code IS NULL) -- Bug 3912422
7851 AND (c.seq_num IS NOT NULL OR SV.delivery_calendar_code IS NULL) -- NULL means FOC
7852 AND c.exception_set_id = l_calendar_exception_set_id
7853 AND c.sr_instance_id = l_instance_id
7854 -- AND c.calendar_date >= mis.supplier_lead_time_date -- Bug 3912422
7855 AND c.calendar_date > SV.supplier_lead_time_date
7856 -- Bug 3912422 - We should start looking from the day after supplier_lead_time_date
7857 -- to accomodate for planning's additional "-1". If SMC is found in ASL then this
7858 -- would mean one day offset as per ASL. If it is FOC then it would mean starting
7859 -- from the next day.
7860
7861 UNION ALL
7862 -- Net out planned orders, purchase orders and purchase requisitions /
7863 -- bug 1303196
7864
7865 SELECT /*+ LEADING (I) */
7866 I.plan_id,
7867 I.sr_instance_id,
7868 I.inventory_item_id,
7869 P.supplier_id,
7870 P.supplier_site_id,
7871 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7872 (NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty,
7873 null demand_class,
7874 p_sys_date last_update_date,
7875 l_user_id last_updated_by,
7876 p_sys_date creation_date,
7877 l_user_id created_by
7878 FROM msc_supplies p,
7879 -- msc_trading_partners tp,
7880 -- msc_calendar_dates c,
7881 -- msc_calendar_dates c1,
7882 msc_trading_partner_sites tps,
7883 msc_system_items I
7884 WHERE I.plan_id = p_plan_id
7885 AND I.atp_components_flag in ( 'Y', 'C')
7886 AND (p.order_type IN (5, 2)
7887 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7888 AND p.order_type = 1 AND p.promised_date IS NULL))
7889 AND p.plan_id = I.plan_id
7890 AND p.sr_instance_id = I.sr_instance_id
7891 AND p.inventory_item_id = I.inventory_item_id
7892 AND p.organization_id = I.organization_id
7893 AND p.sr_instance_id = I.sr_instance_id
7894 AND NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7895 AND p.supplier_id is not null
7896 AND p.supplier_id = tps.partner_id (+)
7897 AND p.supplier_site_id = tps.partner_site_id (+)
7898 AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7899 --AND (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7900 -- Bug 3912422
7901 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
7902 FROM msc_supplier_flex_fences msff
7903 WHERE plan_id = p_plan_id
7904 AND msff.inventory_item_id = p.inventory_item_id --\
7905 AND msff.supplier_id = p.supplier_id -- } Bug 3912422
7906 AND msff.supplier_site_id = p.supplier_site_id --/
7907 AND rownum = 1)
7908 /* AND tp.sr_tp_id = p.organization_id
7909 AND tp.sr_instance_id = p.sr_instance_id
7910 AND tp.partner_type = 3
7911 AND c.calendar_date = trunc(p.new_schedule_date) -- 1529756
7912 AND c.calendar_code = tp.calendar_code
7913 AND c.exception_set_id = tp.calendar_exception_set_id
7914 AND c.sr_instance_id = tp.sr_instance_id
7915 AND c1.seq_num = c.prior_seq_num-
7916 nvl(I.postprocessing_lead_time, 0)
7917 AND c1.calendar_code = c.calendar_code
7918 AND c1.exception_set_id = c.exception_set_id
7919 AND c1.sr_instance_id = c.sr_instance_id*/
7920 AND p.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
7921 )
7922 group by plan_id,inventory_item_id, supplier_id, supplier_site_id, sr_instance_id,
7923 sd_date, demand_class, last_update_date, last_updated_by, creation_date, created_by
7924 );
7925
7926 msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7927 msc_util.msc_log('******** LOAD_SUP_DATA_FULL End ********');
7928
7929 END LOAD_SUP_DATA_FULL;
7930
7931
7932 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id IN NUMBER,
7933 p_last_refresh_number IN NUMBER,
7934 p_new_refresh_number IN NUMBER,
7935 p_sys_date IN DATE)
7936 IS
7937 l_user_id number;
7938 j pls_integer;
7939 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
7940 l_inventory_item_id_tab MRP_ATP_PUB.number_arr;
7941 l_supplier_id_tab MRP_ATP_PUB.number_arr;
7942 l_supplier_site_id_tab MRP_ATP_PUB.number_arr;
7943 l_sd_date_tab MRP_ATP_PUB.date_arr;
7944 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
7945
7946 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7947 l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7948 l_ins_supplier_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7949 l_ins_supplier_site_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7950 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
7951 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7952
7953 CURSOR c_net_sup (p_plan_id IN NUMBER, -- Cursor does not require msc_supplier_capacities because
7954 p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
7955 p_new_refresh_number IN NUMBER)
7956 IS
7957 SELECT I.sr_instance_id,
7958 I.inventory_item_id,
7959 P.supplier_id,
7960 P.supplier_site_id,
7961 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7962 sum(NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty
7963 FROM msc_supplies p,
7964 -- msc_trading_partners tp,
7965 -- msc_calendar_dates c,
7966 -- msc_calendar_dates c1,
7967 msc_trading_partner_sites tps,
7968 msc_system_items I
7969 WHERE I.plan_id = p_plan_id
7970 AND I.atp_components_flag in ( 'Y', 'C')
7971 AND (p.order_type IN (5, 2)
7972 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7973 AND p.order_type = 1 AND p.promised_date IS NULL))
7974 AND p.plan_id = I.plan_id
7975 AND p.sr_instance_id = I.sr_instance_id
7976 AND p.inventory_item_id = I.inventory_item_id
7977 AND p.organization_id = I.organization_id
7978 AND p.sr_instance_id = I.sr_instance_id
7979 AND NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7980 AND p.supplier_id is not null
7981 AND p.supplier_id = tps.partner_id (+)
7982 AND p.supplier_site_id = tps.partner_site_id (+)
7983 AND NOT EXISTS -- Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7984 --AND (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7985 -- Bug 3912422
7986 (SELECT 'x' -- summary is not supported with flex flences : summary enhancement
7987 FROM msc_supplier_flex_fences msff
7988 WHERE plan_id = p_plan_id
7989 AND msff.inventory_item_id = p.inventory_item_id --\
7990 AND msff.supplier_id = p.supplier_id -- } Bug 3912422
7991 AND msff.supplier_site_id = p.supplier_site_id --/
7992 AND rownum = 1)
7993 /* AND tp.sr_tp_id = p.organization_id
7994 AND tp.sr_instance_id = p.sr_instance_id
7995 AND tp.partner_type = 3
7996 AND c.calendar_date = trunc(p.new_schedule_date)
7997 AND c.calendar_code = tp.calendar_code
7998 AND c.exception_set_id = tp.calendar_exception_set_id
7999 AND c.sr_instance_id = tp.sr_instance_id
8000 AND c1.seq_num = c.prior_seq_num-
8001 nvl(I.postprocessing_lead_time, 0)
8002 AND c1.calendar_code = c.calendar_code
8003 AND c1.exception_set_id = c.exception_set_id
8004 AND c1.sr_instance_id = c.sr_instance_id */
8005 AND p.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8006 GROUP BY I.inventory_item_id, P.supplier_id, P.supplier_site_id, I.sr_instance_id,
8007 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date);
8008
8009
8010 BEGIN
8011
8012 msc_util.msc_log('******** LOAD_SUP_DATA_NET Begin ********');
8013
8014 l_user_id := FND_GLOBAL.USER_ID;
8015
8016 OPEN c_net_sup(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8017 FETCH c_net_sup BULK COLLECT INTO l_sr_instance_id_tab,
8018 l_inventory_item_id_tab,
8019 l_supplier_id_tab,
8020 l_supplier_site_id_tab,
8021 l_sd_date_tab,
8022 l_sd_quantity_tab;
8023 CLOSE c_net_sup;
8024
8025 IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
8026
8027 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
8028
8029 forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
8030 UPDATE MSC_ATP_SUMMARY_SUP
8031 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
8032 last_update_date = p_sys_date,
8033 last_updated_by = l_user_id
8034 WHERE plan_id = p_plan_id
8035 AND sr_instance_id = l_sr_instance_id_tab(j)
8036 AND inventory_item_id = l_inventory_item_id_tab(j)
8037 AND supplier_id = l_supplier_id_tab(j)
8038 AND supplier_site_id = l_supplier_site_id_tab(j)
8039 AND sd_date = l_sd_date_tab(j);
8040
8041 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL UPDATE');
8042
8043 FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
8044 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8045 l_ins_sr_instance_id_tab.EXTEND;
8046 l_ins_inventory_item_id_tab.EXTEND;
8047 l_ins_supplier_id_tab.EXTEND;
8048 l_ins_supplier_site_id_tab.EXTEND;
8049 l_ins_sd_date_tab.EXTEND;
8050 l_ins_sd_quantity_tab.EXTEND;
8051
8052 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
8053 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT) := l_inventory_item_id_tab(j);
8054 l_ins_supplier_id_tab(l_ins_supplier_id_tab.COUNT) := l_supplier_id_tab(j);
8055 l_ins_supplier_site_id_tab(l_ins_supplier_site_id_tab.COUNT) := l_supplier_site_id_tab(j);
8056 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
8057 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
8058 END IF;
8059 END LOOP;
8060
8061 IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
8062
8063 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
8064
8065 forall j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
8066 INSERT INTO MSC_ATP_SUMMARY_SUP (
8067 plan_id,
8068 sr_instance_id,
8069 inventory_item_id,
8070 supplier_id,
8071 supplier_site_id,
8072 sd_date,
8073 sd_qty,
8074 demand_class,
8075 last_update_date,
8076 last_updated_by,
8077 creation_date,
8078 created_by)
8079 VALUES (p_plan_id,
8080 l_ins_sr_instance_id_tab(j),
8081 l_ins_inventory_item_id_tab(j),
8082 l_ins_supplier_id_tab(j),
8083 l_ins_supplier_site_id_tab(j),
8084 l_ins_sd_date_tab(j),
8085 l_ins_sd_quantity_tab(j),
8086 NULL,
8087 p_sys_date,
8088 l_user_id,
8089 p_sys_date,
8090 l_user_id);
8091
8092 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL INSERT');
8093
8094 ELSE
8095 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records to be inserted');
8096 END IF;
8097 ELSE
8098 msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records fetched in the net cursor');
8099 END IF;
8100
8101 msc_util.msc_log('******** LOAD_SUP_DATA_NET End ********');
8102
8103 END LOAD_SUP_DATA_NET;
8104
8105
8106 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id IN NUMBER,
8107 p_plan_start_date IN DATE,
8108 p_sys_date IN DATE)
8109 IS
8110 l_user_id number;
8111 BEGIN
8112
8113 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH Begin ********');
8114
8115 l_user_id := FND_GLOBAL.USER_ID;
8116
8117 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8118 INSERT INTO MSC_ATP_SUMMARY_RES(
8119 plan_id,
8120 department_id,
8121 resource_id,
8122 organization_id,
8123 sr_instance_id,
8124 sd_date,
8125 sd_qty,
8126 last_update_date,
8127 last_updated_by,
8128 creation_date,
8129 created_by)
8130 (SELECT plan_id,
8131 department_id,
8132 resource_id,
8133 organization_id,
8134 sr_instance_id,
8135 SD_DATE,
8136 SUM(SD_QTY),
8137 last_update_date,
8138 last_updated_by,
8139 creation_date,
8140 created_by
8141 FROM
8142 (SELECT RES_VIEW.plan_id plan_id,
8143 RES_VIEW.department_id department_id,
8144 RES_VIEW.resource_id resource_id,
8145 RES_VIEW.organization_id organization_id,
8146 RES_VIEW.sr_instance_id sr_instance_id,
8147 trunc(RES_VIEW.SD_DATE) SD_DATE,
8148 RES_VIEW.SD_QTY
8149 * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8150 p_sys_date last_update_date,
8151 l_user_id last_updated_by,
8152 p_sys_date creation_date,
8153 l_user_id created_by
8154 FROM MSC_UOM_CONVERSIONS MUC,
8155 (SELECT -- hint for better performance.
8156 /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8157 DR.PLAN_ID plan_id,
8158 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8159 DR.RESOURCE_ID resource_id,
8160 DR.organization_id organization_id,
8161 DR.SR_INSTANCE_ID sr_instance_id,
8162 C.CALENDAR_DATE SD_DATE,
8163 -- Bug 3321897, 2943979 For Line Based Resources,
8164 -- Resource_ID is not NULL but -1
8165 -1 * DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8166 DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8167 REQ.DAILY_RESOURCE_HOURS)) *
8168 DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8169 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8170 NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1) SD_QTY,
8171 NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8172 DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8173 FROM MSC_DEPARTMENT_RESOURCES DR,
8174 MSC_TRADING_PARTNERS P,
8175 MSC_RESOURCE_REQUIREMENTS REQ,
8176 MSC_SYSTEM_ITEMS I,
8177 MSC_SUPPLIES S,
8178 ---- re-ordered tables for performance
8179 MSC_CALENDAR_DATES C
8180 WHERE DR.PLAN_ID = REQ.PLAN_ID
8181 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8182 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8183 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8184 AND DR.organization_id = REQ.ORGANIZATION_ID
8185 AND REQ.PLAN_ID = p_plan_id
8186 AND NVL(REQ.PARENT_ID, 2) = 2
8187 AND I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8188 AND I.PLAN_ID = S.PLAN_ID
8189 AND I.ORGANIZATION_ID = S.ORGANIZATION_ID
8190 AND I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8191 AND I.inventory_item_id = REQ.assembly_item_id ----\
8192 AND ((I.bom_item_type <> 1 --|
8193 and I.bom_item_type <> 2 --|- summary enhancement change for CTO ODR
8194 AND I.atp_flag <> 'N') --|
8195 OR (REQ.record_source = 2)) ----/
8196 AND S.TRANSACTION_ID = REQ.SUPPLY_ID
8197 AND S.PLAN_ID = REQ.PLAN_ID
8198 AND S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8199 AND S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8200 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8201 AND P.SR_TP_ID = DR.ORGANIZATION_ID
8202 AND P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8203 AND P.PARTNER_TYPE = 3
8204 AND C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8205 AND C.CALENDAR_CODE = P.CALENDAR_CODE
8206 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8207 AND C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8208 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8209 AND C.SEQ_NUM IS NOT NULL
8210 AND C.CALENDAR_DATE >= p_plan_start_date -- summary enhancement - made consistent
8211 AND REQ.REFRESH_NUMBER IS NULL)RES_VIEW -- consider only planning records in full summation - summary enhancement
8212 WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8213 AND RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8214 AND MUC.INVENTORY_ITEM_ID (+)= 0
8215
8216 UNION ALL
8217
8218 SELECT MNRA.plan_id plan_id,
8219 MNRA.department_id,
8220 MNRA.resource_id,
8221 MNRA.organization_id,
8222 MNRA.sr_instance_id,
8223 trunc(MNRA.SHIFT_DATE) SD_DATE,
8224 MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8225 MNRA.to_time,to_time + 24*3600,
8226 MNRA.to_time) - MNRA.from_time)/3600)
8227 * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8228 DR.MAX_CAPACITY * NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8229 p_sys_date last_update_date,
8230 l_user_id last_updated_by,
8231 p_sys_date creation_date,
8232 l_user_id created_by
8233 FROM MSC_NET_RESOURCE_AVAIL MNRA,
8234 MSC_DEPARTMENT_RESOURCES DR,
8235 MSC_UOM_CONVERSIONS MUC -- noted in summary enhancement : inconsistent with MSCRATPB
8236 WHERE MNRA.PLAN_ID = p_plan_id
8237 AND NVL(MNRA.PARENT_ID, -2) <> -1
8238 AND DR.PLAN_ID = MNRA.PLAN_ID
8239 AND DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8240 AND DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8241 AND DR.RESOURCE_ID = MNRA.RESOURCE_ID
8242 AND DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8243 AND DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8244 AND DR.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8245 AND MUC.INVENTORY_ITEM_ID (+) = 0
8246 --- un commented the following row. This is done so that less number of rows are selected
8247 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8248 ) group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8249 last_update_date,last_updated_by, creation_date, created_by
8250 );
8251
8252 msc_util.msc_log('LOAD_RES_FULL_UNOPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8253 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH End ********');
8254
8255 END LOAD_RES_FULL_UNOPT_BATCH;
8256
8257
8258 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id IN NUMBER,
8259 p_plan_start_date IN DATE,
8260 p_sys_date IN DATE)
8261 IS
8262 l_user_id number;
8263 BEGIN
8264
8265 msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH Begin ********');
8266
8267 l_user_id := FND_GLOBAL.USER_ID;
8268
8269 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8270 INSERT INTO MSC_ATP_SUMMARY_RES(
8271 plan_id,
8272 department_id,
8273 resource_id,
8274 organization_id,
8275 sr_instance_id,
8276 sd_date,
8277 sd_qty,
8278 last_update_date,
8279 last_updated_by,
8280 creation_date,
8281 created_by)
8282 (SELECT plan_id,
8283 department_id,
8284 resource_id,
8285 organization_id,
8286 sr_instance_id,
8287 SD_DATE,
8288 SUM(SD_QTY),
8289 last_update_date,
8290 last_updated_by,
8291 creation_date,
8292 created_by
8293 FROM
8294 (SELECT RES_VIEW.plan_id plan_id,
8295 RES_VIEW.department_id department_id,
8296 RES_VIEW.resource_id resource_id,
8297 RES_VIEW.organization_id organization_id,
8298 RES_VIEW.sr_instance_id sr_instance_id,
8299 trunc(RES_VIEW.SD_DATE) SD_DATE,
8300 RES_VIEW.SD_QTY
8301 * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8302 p_sys_date last_update_date,
8303 l_user_id last_updated_by,
8304 p_sys_date creation_date,
8305 l_user_id created_by
8306 FROM MSC_UOM_CONVERSIONS MUC,
8307 (SELECT -- hint for better performance.
8308 /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8309 DR.PLAN_ID plan_id,
8310 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8311 DR.RESOURCE_ID resource_id,
8312 DR.organization_id organization_id,
8313 DR.SR_INSTANCE_ID sr_instance_id,
8314 TRUNC(REQ.START_DATE) SD_DATE,
8315 -- Bug 3321897, 2943979 For Line Based Resources,
8316 -- Resource_ID is not NULL but -1
8317 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8318 REQ.RESOURCE_HOURS) * -- 2859130 -- noted in summary enhancement : inconsistent with MSCRATPB
8319 -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8320 -- REQ.DAILY_RESOURCE_HOURS)) *
8321 DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8322 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8323 NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1) SD_QTY,
8324 NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8325 DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8326 FROM MSC_DEPARTMENT_RESOURCES DR,
8327 MSC_RESOURCE_REQUIREMENTS REQ,
8328 MSC_SYSTEM_ITEMS I,
8329 MSC_SUPPLIES S
8330 ---- re-ordered tables for performance
8331 WHERE DR.PLAN_ID = REQ.PLAN_ID
8332 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8333 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8334 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8335 AND DR.organization_id = REQ.ORGANIZATION_ID
8336 AND REQ.PLAN_ID = p_plan_id
8337 AND NVL(REQ.PARENT_ID, 1) = 1
8338 AND I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8339 AND I.PLAN_ID = S.PLAN_ID
8340 AND I.ORGANIZATION_ID = S.ORGANIZATION_ID
8341 AND I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8342 AND S.TRANSACTION_ID = REQ.SUPPLY_ID
8343 AND S.PLAN_ID = REQ.PLAN_ID
8344 AND S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8345 AND S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8346 AND NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8347 AND I.inventory_item_id = REQ.assembly_item_id ----\
8348 AND ((I.bom_item_type <> 1 --|
8349 and I.bom_item_type <> 2 --|- summary enhancement change for CTO ODR
8350 AND I.atp_flag <> 'N') --|
8351 OR (REQ.record_source = 2)) ----/
8352 AND REQ.START_DATE >= p_plan_start_date -- summary enhancement - made consistent
8353 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8354 )RES_VIEW
8355 WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8356 AND RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8357 AND MUC.INVENTORY_ITEM_ID (+)= 0
8358
8359 UNION ALL
8360
8361 SELECT MNRA.plan_id plan_id,
8362 MNRA.department_id,
8363 MNRA.resource_id,
8364 MNRA.organization_id,
8365 MNRA.sr_instance_id,
8366 trunc(MNRA.SHIFT_DATE) SD_DATE,
8367 MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8368 MNRA.to_time,to_time + 24*3600,
8369 MNRA.to_time) - MNRA.from_time)/3600)
8370 * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8371 DR.MAX_CAPACITY * NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8372 p_sys_date last_update_date,
8373 l_user_id last_updated_by,
8374 p_sys_date creation_date,
8375 l_user_id created_by
8376 FROM MSC_NET_RESOURCE_AVAIL MNRA,
8377 MSC_DEPARTMENT_RESOURCES DR,
8378 MSC_UOM_CONVERSIONS MUC -- noted in summary enhancement : inconsistent with MSCRATPB
8379 WHERE MNRA.PLAN_ID = p_plan_id
8380 AND NVL(MNRA.PARENT_ID, -2) <> -1
8381 AND DR.PLAN_ID = MNRA.PLAN_ID
8382 AND DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8383 AND DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8384 AND DR.RESOURCE_ID = MNRA.RESOURCE_ID
8385 AND DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8386 AND DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8387 AND DR.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8388 AND MUC.INVENTORY_ITEM_ID (+) = 0
8389 --- un commented the following row. This is done so that less number of rows are selected
8390 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8391 )
8392 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8393 last_update_date,last_updated_by, creation_date, created_by
8394 );
8395
8396 msc_util.msc_log('LOAD_RES_FULL_OPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8397 msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH End ********');
8398
8399 END LOAD_RES_FULL_OPT_BATCH;
8400
8401
8402 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id IN NUMBER,
8403 p_plan_start_date IN DATE,
8404 p_sys_date IN DATE)
8405 IS
8406 l_user_id number;
8407 BEGIN
8408
8409 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH Begin ********');
8410
8411 l_user_id := FND_GLOBAL.USER_ID;
8412
8413 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8414 INSERT INTO MSC_ATP_SUMMARY_RES(
8415 plan_id,
8416 department_id,
8417 resource_id,
8418 organization_id,
8419 sr_instance_id,
8420 sd_date,
8421 sd_qty,
8422 last_update_date,
8423 last_updated_by,
8424 creation_date,
8425 created_by)
8426 (SELECT plan_id,
8427 department_id,
8428 resource_id,
8429 organization_id,
8430 sr_instance_id,
8431 SD_DATE,
8432 SUM(SD_QTY),
8433 last_update_date,
8434 last_updated_by,
8435 creation_date,
8436 created_by
8437 FROM
8438 (
8439 SELECT /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8440 DR.PLAN_ID plan_id,
8441 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8442 DR.RESOURCE_ID resource_id,
8443 DR.organization_id organization_id,
8444 DR.SR_INSTANCE_ID sr_instance_id,
8445 C.CALENDAR_DATE SD_DATE, -- 2859130 remove trunc
8446 -- Bug 3321897, 2943979 For Line Based Resources,
8447 -- Resource_ID is not NULL but -1
8448 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8449 DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8450 REQ.DAILY_RESOURCE_HOURS)) SD_QTY,
8451 p_sys_date last_update_date,
8452 l_user_id last_updated_by,
8453 p_sys_date creation_date,
8454 l_user_id created_by
8455 FROM MSC_DEPARTMENT_RESOURCES DR,
8456 MSC_TRADING_PARTNERS P,
8457 MSC_RESOURCE_REQUIREMENTS REQ,
8458 MSC_SYSTEM_ITEMS I, -- summary enhancement change for CTO ODR
8459 MSC_CALENDAR_DATES C
8460 ---- re-ordered tables for performance
8461 WHERE DR.PLAN_ID = REQ.PLAN_ID
8462 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID -- summary enhancement - made consistent
8463 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8464 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8465 AND DR.organization_id = REQ.ORGANIZATION_ID
8466 AND REQ.PLAN_ID = p_plan_id
8467 AND NVL(REQ.PARENT_ID, 2) = 2
8468 AND P.SR_TP_ID = DR.ORGANIZATION_ID
8469 AND P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8470 AND P.PARTNER_TYPE = 3
8471 AND C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8472 AND C.CALENDAR_CODE = P.CALENDAR_CODE
8473 AND C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8474 AND C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8475 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8476 AND C.SEQ_NUM IS NOT NULL
8477 AND C.CALENDAR_DATE >= p_plan_start_date
8478 AND I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id ----\
8479 AND I.PLAN_ID = REQ.PLAN_ID --|
8480 AND I.ORGANIZATION_ID = REQ.ORGANIZATION_ID --|
8481 AND I.inventory_item_id = REQ.assembly_item_id --|\ summary enhancement
8482 AND ((I.bom_item_type <> 1 --|/ change for CTO ODR
8483 and I.bom_item_type <> 2 --|
8484 AND I.atp_flag <> 'N') --|
8485 OR (REQ.record_source = 2)) ----/
8486 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8487
8488 UNION ALL
8489
8490 SELECT plan_id plan_id,
8491 department_id,
8492 resource_id,
8493 organization_id,
8494 sr_instance_id,
8495 trunc(SHIFT_DATE) SD_DATE,
8496 CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8497 to_time,to_time + 24*3600,
8498 to_time) - from_time)/3600) SD_QTY,
8499 p_sys_date last_update_date,
8500 l_user_id last_updated_by,
8501 p_sys_date creation_date,
8502 l_user_id created_by
8503 FROM MSC_NET_RESOURCE_AVAIL
8504 WHERE PLAN_ID = p_plan_id
8505 AND NVL(PARENT_ID, -2) <> -1
8506 -- uncommented following line so that less number of rows are selected
8507 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8508 )
8509 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8510 last_update_date,last_updated_by, creation_date, created_by
8511 );
8512
8513 msc_util.msc_log('LOAD_RES_FULL_UNOPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8514 msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH End ********');
8515
8516 END LOAD_RES_FULL_UNOPT_NOBATCH;
8517
8518
8519 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id IN NUMBER,
8520 p_plan_start_date IN DATE,
8521 p_sys_date IN DATE)
8522 IS
8523 l_user_id number;
8524 BEGIN
8525
8526 msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH Begin ********');
8527
8528 l_user_id := FND_GLOBAL.USER_ID;
8529
8530 -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8531 INSERT INTO MSC_ATP_SUMMARY_RES(
8532 plan_id,
8533 department_id,
8534 resource_id,
8535 organization_id,
8536 sr_instance_id,
8537 sd_date,
8538 sd_qty,
8539 last_update_date,
8540 last_updated_by,
8541 creation_date,
8542 created_by)
8543 (SELECT plan_id,
8544 department_id,
8545 resource_id,
8546 organization_id,
8547 sr_instance_id,
8548 SD_DATE,
8549 SUM(SD_QTY),
8550 last_update_date,
8551 last_updated_by,
8552 creation_date,
8553 created_by
8554 FROM
8555 (
8556 SELECT /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8557 DR.PLAN_ID plan_id,
8558 NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8559 DR.RESOURCE_ID resource_id,
8560 DR.organization_id organization_id,
8561 DR.SR_INSTANCE_ID sr_instance_id,
8562 TRUNC(REQ.START_DATE) SD_DATE,
8563 -- Bug 3321897, 2943979 For Line Based Resources,
8564 -- Resource_ID is not NULL but -1
8565 -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8566 REQ.RESOURCE_HOURS) SD_QTY, --2859130
8567 -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS, -- noted in summary enhancement : inconsistent with MSCRATPB
8568 -- REQ.DAILY_RESOURCE_HOURS)) SD_QTY,
8569 p_sys_date last_update_date,
8570 l_user_id last_updated_by,
8571 p_sys_date creation_date,
8572 l_user_id created_by
8573 FROM MSC_DEPARTMENT_RESOURCES DR,
8574 MSC_RESOURCE_REQUIREMENTS REQ,
8575 MSC_SYSTEM_ITEMS I -- summary enhancement change for CTO ODR
8576 WHERE DR.PLAN_ID = REQ.PLAN_ID
8577 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID -- summary enhancement: made consistent
8578 AND DR.RESOURCE_ID = REQ.RESOURCE_ID
8579 AND DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8580 AND DR.organization_id = REQ.ORGANIZATION_ID
8581 AND REQ.PLAN_ID = p_plan_id
8582 AND NVL(REQ.PARENT_ID, 1) = 1
8583 AND I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id ----\
8584 AND I.PLAN_ID = REQ.PLAN_ID --|
8585 AND I.ORGANIZATION_ID = REQ.ORGANIZATION_ID --|
8586 AND I.inventory_item_id = REQ.assembly_item_id --|\ summary enhancement
8587 AND ((I.bom_item_type <> 1 --|/ change for CTO ODR
8588 and I.bom_item_type <> 2 --|
8589 AND I.atp_flag <> 'N') --|
8590 OR (REQ.record_source = 2)) ----/
8591 AND REQ.START_DATE >= p_plan_start_date -- summary enhancement: made consistent
8592 AND REQ.REFRESH_NUMBER IS NULL -- consider only planning records in full summation - summary enhancement
8593
8594 UNION ALL
8595
8596 SELECT plan_id plan_id,
8597 department_id,
8598 resource_id,
8599 organization_id,
8600 sr_instance_id,
8601 trunc(SHIFT_DATE) SD_DATE,
8602 CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8603 to_time,to_time + 24*3600,
8604 to_time) - from_time)/3600) SD_QTY,
8605 p_sys_date last_update_date,
8606 l_user_id last_updated_by,
8607 p_sys_date creation_date,
8608 l_user_id created_by
8609 FROM MSC_NET_RESOURCE_AVAIL
8610 WHERE PLAN_ID = p_plan_id
8611 AND NVL(PARENT_ID, -2) <> -1
8612 AND SHIFT_DATE >= p_plan_start_date -- summary enhancement: made consistent
8613 )
8614 group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8615 last_update_date,last_updated_by, creation_date, created_by
8616 );
8617
8618 msc_util.msc_log('LOAD_RES_FULL_OPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8619 msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH End ********');
8620
8621 END LOAD_RES_FULL_OPT_NOBATCH;
8622
8623
8624 PROCEDURE LOAD_RES_DATA_NET(p_plan_id IN NUMBER,
8625 p_last_refresh_number IN NUMBER,
8626 p_new_refresh_number IN NUMBER,
8627 p_sys_date IN DATE)
8628 IS
8629 l_user_id number;
8630 j pls_integer;
8631 l_department_id_tab MRP_ATP_PUB.number_arr;
8632 l_resource_id_tab MRP_ATP_PUB.number_arr;
8633 l_organization_id_tab MRP_ATP_PUB.number_arr;
8634 l_sr_instance_id_tab MRP_ATP_PUB.number_arr;
8635 l_sd_date_tab MRP_ATP_PUB.date_arr;
8636 l_sd_quantity_tab MRP_ATP_PUB.number_arr;
8637
8638 l_ins_department_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8639 l_ins_resource_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8640 l_ins_organization_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8641 l_ins_sr_instance_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8642 l_ins_sd_date_tab MRP_ATP_PUB.date_arr := MRP_ATP_PUB.date_arr();
8643 l_ins_sd_quantity_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8644
8645 CURSOR c_net_res (p_plan_id IN NUMBER, -- Cursor does not require msc_net_resource_avail because
8646 p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
8647 p_new_refresh_number IN NUMBER)
8648 IS
8649 SELECT NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8650 DR.RESOURCE_ID resource_id,
8651 DR.organization_id organization_id,
8652 DR.SR_INSTANCE_ID sr_instance_id,
8653 -- Bug 3348095
8654 -- Only ATP created records, so use end_date
8655 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE)) SD_DATE,
8656 -- TRUNC(REQ.START_DATE) SD_DATE,
8657 -- End Bug 3348095
8658 SUM((-1) * REQ.RESOURCE_HOURS) SD_QTY -- ATP always populates resource_hours
8659 FROM MSC_DEPARTMENT_RESOURCES DR,
8660 MSC_RESOURCE_REQUIREMENTS REQ
8661 WHERE DR.PLAN_ID = p_plan_id
8662 AND REQ.PLAN_ID = DR.PLAN_ID
8663 AND REQ.SR_INSTANCE_ID = DR.sr_instance_id
8664 AND REQ.RESOURCE_ID = DR.resource_id
8665 AND NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) = DR.DEPARTMENT_ID
8666 AND REQ.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8667 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));
8668 -- Bug 3348095 Only ATP created records, so use end_date.
8669
8670 BEGIN
8671
8672 msc_util.msc_log('******** LOAD_RES_DATA_NET Begin ********');
8673
8674 l_user_id := FND_GLOBAL.USER_ID;
8675
8676 OPEN c_net_res(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8677 FETCH c_net_res BULK COLLECT INTO l_department_id_tab,
8678 l_resource_id_tab,
8679 l_organization_id_tab,
8680 l_sr_instance_id_tab,
8681 l_sd_date_tab,
8682 l_sd_quantity_tab;
8683 CLOSE c_net_res;
8684
8685 IF l_resource_id_tab IS NOT NULL AND l_resource_id_tab.COUNT > 0 THEN
8686
8687 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_resource_id_tab.COUNT := ' || l_resource_id_tab.COUNT);
8688
8689 forall j IN l_resource_id_tab.first.. l_resource_id_tab.last
8690 UPDATE MSC_ATP_SUMMARY_RES
8691 SET sd_qty = sd_qty + l_sd_quantity_tab(j),
8692 last_update_date = p_sys_date,
8693 last_updated_by = l_user_id
8694 WHERE plan_id = p_plan_id
8695 AND sr_instance_id = l_sr_instance_id_tab(j)
8696 AND organization_id = l_organization_id_tab(j)
8697 AND resource_id = l_resource_id_tab(j)
8698 AND department_id = l_department_id_tab(j)
8699 AND sd_date = l_sd_date_tab(j);
8700
8701 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL UPDATE');
8702
8703 FOR j IN l_resource_id_tab.first.. l_resource_id_tab.last LOOP
8704 IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8705 l_ins_department_id_tab.EXTEND;
8706 l_ins_resource_id_tab.EXTEND;
8707 l_ins_organization_id_tab.EXTEND;
8708 l_ins_sr_instance_id_tab.EXTEND;
8709 l_ins_sd_date_tab.EXTEND;
8710 l_ins_sd_quantity_tab.EXTEND;
8711
8712 l_ins_department_id_tab(l_ins_department_id_tab.COUNT) := l_department_id_tab(j);
8713 l_ins_resource_id_tab(l_ins_resource_id_tab.COUNT) := l_resource_id_tab(j);
8714 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT) := l_organization_id_tab(j);
8715 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT) := l_sr_instance_id_tab(j);
8716 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT) := l_sd_date_tab(j);
8717 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT) := l_sd_quantity_tab(j);
8718 END IF;
8719 END LOOP;
8720
8721 IF l_ins_resource_id_tab IS NOT NULL AND l_ins_resource_id_tab.COUNT > 0 THEN
8722
8723 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_ins_resource_id_tab.COUNT := ' || l_ins_resource_id_tab.COUNT);
8724
8725 forall j IN l_ins_resource_id_tab.first.. l_ins_resource_id_tab.last
8726 INSERT INTO MSC_ATP_SUMMARY_RES (
8727 plan_id,
8728 department_id,
8729 resource_id,
8730 organization_id,
8731 sr_instance_id,
8732 sd_date,
8733 sd_qty,
8734 last_update_date,
8735 last_updated_by,
8736 creation_date,
8737 created_by)
8738 VALUES (p_plan_id,
8739 l_ins_department_id_tab(j),
8740 l_ins_resource_id_tab(j),
8741 l_ins_organization_id_tab(j),
8742 l_ins_sr_instance_id_tab(j),
8743 l_ins_sd_date_tab(j),
8744 l_ins_sd_quantity_tab(j),
8745 p_sys_date,
8746 l_user_id,
8747 p_sys_date,
8748 l_user_id);
8749
8750 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL INSERT');
8751
8752 ELSE
8753 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records to be inserted');
8754 END IF;
8755 ELSE
8756 msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records fetched in the net cursor');
8757 END IF;
8758
8759 msc_util.msc_log('******** LOAD_RES_DATA_NET End ********');
8760
8761 END LOAD_RES_DATA_NET;
8762
8763
8764 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id IN NUMBER,
8765 p_applsys_schema IN Varchar2)
8766 IS
8767 l_partition_name varchar2(30);
8768 l_sql_stmt varchar2(300);
8769 BEGIN
8770 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_plan_id - ' || p_plan_id);
8771 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_applsys_schema - ' || p_applsys_schema);
8772
8773 ------------------------------------------------
8774
8775 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sd');
8776 l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8777 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8778 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD TRUNCATE PARTITION ' ||
8779 l_partition_name || ' DROP STORAGE';
8780
8781 BEGIN
8782 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SD');
8783 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8784 APPLICATION_SHORT_NAME => 'MSC',
8785 STATEMENT_TYPE => ad_ddl.alter_table,
8786 STATEMENT => l_sql_stmt,
8787 OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
8788 END;
8789 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating SD partition');
8790
8791 ------------------------------------------------
8792
8793 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sup');
8794 l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8795 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8796 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SUP TRUNCATE PARTITION ' ||
8797 l_partition_name || ' DROP STORAGE';
8798
8799 BEGIN
8800 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SUP');
8801 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8802 APPLICATION_SHORT_NAME => 'MSC',
8803 STATEMENT_TYPE => ad_ddl.alter_table,
8804 STATEMENT => l_sql_stmt,
8805 OBJECT_NAME => 'MSC_ATP_SUMMARY_SUP');
8806 END;
8807 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating sup partition');
8808
8809 ------------------------------------------------
8810
8811 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for res');
8812 l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8813 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8814 l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_RES TRUNCATE PARTITION ' ||
8815 l_partition_name || ' DROP STORAGE';
8816
8817 BEGIN
8818 msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_RES');
8819 ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8820 APPLICATION_SHORT_NAME => 'MSC',
8821 STATEMENT_TYPE => ad_ddl.alter_table,
8822 STATEMENT => l_sql_stmt,
8823 OBJECT_NAME => 'MSC_ATP_SUMMARY_RES');
8824 END;
8825 msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating res partition');
8826
8827 ------------------------------------------------
8828
8829 END Truncate_Summ_Plan_Partition;
8830
8831
8832 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id IN NUMBER,
8833 p_share_partition IN varchar2)
8834 IS
8835 l_partition_name varchar2(30);
8836 BEGIN
8837
8838 ------------------------------------------------
8839 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for S/D Tables');
8840 IF p_share_partition = 'Y' THEN
8841 l_partition_name := 'ATP_SUMMARY_SD_999999';
8842 ELSE
8843 l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8844 END IF;
8845
8846 fnd_stats.gather_table_stats(ownname=>'MSC',
8847 tabname=>'MSC_ATP_SUMMARY_SD',
8848 partname=>l_partition_name,
8849 granularity=>'PARTITION',
8850 percent =>10);
8851 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for S/D tables');
8852 ------------------------------------------------
8853 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Sup Tables');
8854 IF p_share_partition = 'Y' THEN
8855 l_partition_name := 'ATP_SUMMARY_SUP_999999';
8856 ELSE
8857 l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8858 END IF;
8859
8860 fnd_stats.gather_table_stats(ownname=>'MSC',
8861 tabname=>'MSC_ATP_SUMMARY_SUP',
8862 partname=>l_partition_name,
8863 granularity=>'PARTITION',
8864 percent =>10);
8865 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Sup tables');
8866 ------------------------------------------------
8867 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Res Tables');
8868 IF p_share_partition = 'Y' THEN
8869 l_partition_name := 'ATP_SUMMARY_RES_999999';
8870 ELSE
8871 l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8872 END IF;
8873
8874 fnd_stats.gather_table_stats(ownname=>'MSC',
8875 tabname=>'MSC_ATP_SUMMARY_RES',
8876 partname=>l_partition_name,
8877 granularity=>'PARTITION',
8878 percent =>10);
8879 msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Res tables');
8880 ------------------------------------------------
8881
8882
8883 END Gather_Summ_Plan_Stats;
8884
8885 --*************************************************************---
8886 --New Procedure added for collection enhancement --bug3049003
8887 --*************************************************************--
8888 PROCEDURE atp_snapshot_hook(
8889 p_plan_id IN NUMBER
8890 )
8891
8892 IS
8893 --bug3663487 start SQL_ID 9425117
8894 -- IO Perf:3693983: Don't Launch ATP Post snapshot Processes for IO Plans
8895 l_count NUMBER := 0;
8896 --bug3663487 end
8897 Begin
8898
8899 msc_util.msc_log('Begin procedure atp_snapshot_hook');
8900
8901 SELECT count(*)
8902 INTO l_count
8903 FROM msc_plans plans,
8904 msc_designators desig
8905 WHERE plans.plan_id = p_plan_id
8906 AND plans.plan_type <> 4
8907 AND plans.compile_designator = desig.designator
8908 AND plans.sr_instance_id = desig.sr_instance_id
8909 AND plans.organization_id = desig.organization_id
8910 AND (desig.inventory_atp_flag = 1
8911 OR plans.copy_plan_id IS NOT NULL);
8912
8913 msc_util.msc_log('atp_snapshot_hook: l_count: '|| nvl(l_count,0));
8914
8915 IF ( NVL(l_count,0) > 0) THEN
8916 msc_util.msc_log('atp_snapshot_hook: Updating msc_plan_organizations..');
8917 UPDATE msc_plan_organizations mpo
8918 SET so_lrn =(SELECT so_lrn
8919 FROM msc_instance_orgs mio
8920 WHERE mio.sr_instance_id=mpo.sr_instance_id
8921 AND mio.organization_id=mpo.organization_id
8922 )
8923 WHERE plan_id=p_plan_id;
8924 --RETURNING organization_id, sr_instance_id
8925 --BULK COLLECT INTO l_organization_id, l_sr_instance_id;
8926 msc_util.msc_log('atp_snapshot_hook: No. of Rows updated: '|| SQL%ROWCOUNT );
8927 END IF;
8928
8929 --bug3663487 start
8930 /*
8931 UPDATE msc_system_items mst1
8932 SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG
8933 FROM msc_system_items mst2
8934 WHERE mst2.sr_instance_id=mst1.sr_instance_id
8935 AND mst2.organization_id=mst1.organization_id
8936 AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8937 AND mst2.plan_id=-1
8938 )
8939 WHERE plan_id=p_plan_id;
8940 */
8941 -- ATP_RULE_ID and DEMAND_TIME_FENCE_DAYS is also flushed as we are using it in populate_atf_date
8942 -- to make its performance better.
8943 -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD
8944 /*
8945 FORALL j IN l_organization_id.first.. l_organization_id.last
8946 UPDATE msc_system_items mst1
8947 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
8948 FROM msc_system_items mst2
8949 WHERE mst2.sr_instance_id=mst1.sr_instance_id
8950 AND mst2.organization_id=mst1.organization_id
8951 AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8952 AND mst2.plan_id=-1
8953 )
8954 WHERE plan_id=p_plan_id
8955 AND mst1.ORGANIZATION_ID = l_organization_id(j)
8956 AND mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
8957 AND mst1.bom_item_type in (1,4,5)
8958 AND mst1.atp_flag <> 'N'
8959 OR mst1.atp_components_flag <> 'N';
8960 */
8961 --bug3663487 end
8962
8963 commit;
8964
8965 EXCEPTION
8966 WHEN others THEN
8967 msc_util.msc_log('Error in atp_snapshot_hook: ' || SQLCODE || '-' || SQLERRM);
8968 END atp_snapshot_hook;
8969
8970 -- 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
8971 -- This API will be called by "Purge Plan" conc program.
8972
8973 Procedure Delete_CTO_BOM_OSS(
8974 p_plan_id IN NUMBER)
8975 IS
8976 BEGIN
8977 msc_util.msc_log('Begin Delete_CTO_BOM_OSS for plan_id: ' || p_plan_id);
8978 msc_util.msc_log('Before Delete data for CTO BOM');
8979
8980 DELETE msc_cto_bom
8981 WHERE nvl(plan_id, p_plan_id) = p_plan_id;
8982
8983 msc_util.msc_log('After Delete data for CTO BOM: ' || SQL%ROWCOUNT);
8984
8985 msc_util.msc_log('Before Delete data for CTO OSS');
8986
8987 DELETE msc_cto_sources
8988 WHERE nvl(plan_id, p_plan_id) = p_plan_id;
8989
8990 msc_util.msc_log('After Delete data for CTO OSS: ' || SQL%ROWCOUNT);
8991
8992 commit;
8993
8994 msc_util.msc_log('End Delete_CTO_BOM_OSS');
8995 EXCEPTION
8996 WHEN others THEN
8997 msc_util.msc_log('Exception in Delete_CTO_BOM_OSS :' || SQLCODE || '-' || SQLERRM);
8998 END Delete_CTO_BOM_OSS;
8999
9000 END MSC_POST_PRO;