[Home] [Help]
PACKAGE BODY: APPS.WSH_UPGRADE_PICK_SLIP_DATA_NEW
Source
1 PACKAGE BODY WSH_UPGRADE_PICK_SLIP_DATA_NEW AS
2 /* $Header: wshpupdb.pls 120.2 2005/07/28 11:34:20 parkhj noship $ */
3
4 --
5 -- Package
6 -- WSH_UPGRADE_PICK_SLIP_DATA_NEW
7 --
8 -- Purpose
9 --
10
11 --
12 -- PACKAGE CONSTANTS
13 --
14
15 SUCCESS CONSTANT BINARY_INTEGER := 0;
16 FAILURE CONSTANT BINARY_INTEGER := -1;
17
18 --
19 -- PACKAGE VARIABLES
20 --
21 error_flag BOOLEAN := FALSE;
22 error_mesg VARCHAR2(2001);
23 long_waybill_count NUMBER := 0;
24
25 PROCEDURE Init_Mesg( x_mesg IN VARCHAR2) IS
26 BEGIN
27 error_mesg := substr(x_mesg,1,2000);
28 END;
29
30 PROCEDURE Add_Mesg( x_mesg IN VARCHAR2) IS
31 BEGIN
32 error_mesg := substr(error_mesg || ' '||x_mesg,1,2000);
33 END;
34
35 PROCEDURE Insert_Mesg IS
36 BEGIN
37 insert into wsh_upgrade_log
38 ( error_mesg )
39 values
40 ( error_mesg
41 );
42 END;
43
44 PROCEDURE Insert_Mesg( x_mesg IN VARCHAR2) IS
45 BEGIN
46 error_mesg := substr(x_mesg,1,2000);
47 insert into wsh_upgrade_log
48 ( error_mesg )
49 values
50 ( error_mesg
51 );
52 END;
53
54 PROCEDURE Get_Delivery(X_Delivery_ID IN OUT NOCOPY NUMBER,
55 X_name IN OUT NOCOPY VARCHAR2
56 ) IS
57 CURSOR C2 IS SELECT wsh_new_deliveries_s.nextval FROM sys.dual;
58
59 CURSOR C3 (l_delivery_id NUMBER) IS
60 SELECT 1
61 FROM wsh_deliveries
62 WHERE delivery_id = l_delivery_id;
63
64 temp NUMBER;
65 temp_id NUMBER;
66
67 BEGIN
68
69 LOOP
70 OPEN C2;
71 FETCH C2 INTO temp_id;
72 OPEN C3(temp_id);
73 FETCH C3 INTO temp;
74 IF (C3%NOTFOUND) THEN
75 CLOSE C3;
76 CLOSE C2;
77 EXIT;
78 END IF;
79 CLOSE C3;
80 CLOSE C2;
81 END LOOP;
82
83 X_Delivery_Id := temp_id;
84 X_Name := TO_CHAR(X_Delivery_Id);
85
86 EXCEPTION
87 WHEN others THEN
88 rollback;
89 Init_mesg('Error in procedure Get_Delivery ');
90 Insert_mesg;
91 commit;
92 raise;
93 END Get_Delivery;
94
95 PROCEDURE Get_Departure(X_Departure_Id IN OUT NOCOPY NUMBER,
96 X_name IN OUT NOCOPY VARCHAR2
97 ) IS
98 CURSOR C2 IS SELECT wsh_trips_s.nextval FROM sys.dual;
99
100 CURSOR C3 (l_departure_id NUMBER) IS
101 SELECT 1
102 FROM wsh_departures
103 WHERE departure_id = l_departure_id;
104
105 temp NUMBER;
106 temp_id NUMBER;
107 BEGIN
108
109 LOOP
110 OPEN C2;
111 FETCH C2 INTO temp_id;
112 OPEN C3(temp_id);
113 FETCH C3 INTO temp;
114 IF (C3%NOTFOUND) THEN
115 CLOSE C3;
116 CLOSE C2;
117 EXIT;
118 END IF;
119 CLOSE C3;
120 CLOSE C2;
121 END LOOP;
122
123 X_Departure_Id := temp_id;
124 X_Name := TO_CHAR(X_Departure_Id);
125
126
127 EXCEPTION
128 WHEN others THEN
129 rollback;
130 Init_mesg('Error in procedure Get_Departure');
131 Insert_mesg;
132 commit;
133 Raise;
134 END Get_Departure;
135
136 --
137 -- Name
138 -- FUNCTION Insert_Row
139 --
140 -- Purpose
141 -- Gets the delivery_id to be used in creating deliveries when
142 -- inserting picking line details
143 --
144 -- Arguments
145 -- p_header_id => order header id
146 -- p_ship_to_site_use_id => ship to site use id (ultimate ship to)
147 -- p_ship_method_code => ship method (freight carrier)
148 --
149 -- Return Values
150 -- -1 => Failure
151 -- others => delivery_id
152 --
153
154
155 FUNCTION Insert_Row(
156 p_header_id IN BINARY_INTEGER,
157 p_departure_id IN OUT NOCOPY BINARY_INTEGER
158 )
159 RETURN BINARY_INTEGER IS
160
161 CURSOR get_picking_info(x_header_id IN BINARY_INTEGER) IS
162 SELECT order_header_id,
163 ship_to_site_use_id,
164 ship_method_code,
165 warehouse_id,
166 date_shipped,
167 date_confirmed,
168 waybill_num,
169 weight,
170 weight_unit_code,
171 picked_by_id,
172 packed_by_id,
173 context,
174 attribute1,
175 attribute2,
176 attribute3,
177 attribute4,
178 attribute5,
179 attribute6,
180 attribute7,
181 attribute8,
182 attribute9,
183 attribute10,
184 attribute11,
185 attribute12,
186 attribute13,
187 attribute14,
188 attribute15,
189 creation_date,
190 created_by,
191 last_updated_by,
192 last_update_login,
193 last_update_date,
194 expected_arrival_date -- added: for bug 1413000
195 FROM SO_PICKING_HEADERS_ALL
196 WHERE picking_header_id = x_header_id;
197
198 CURSOR get_order_info(x_header_id IN BINARY_INTEGER) IS
199 SELECT NVL(CUSTOMER_ID,-1),
200 NVL(FOB_CODE, 'XX'),
201 NVL(FREIGHT_TERMS_CODE, 'XX'),
202 CURRENCY_CODE
203 FROM SO_HEADERS_ALL
204 WHERE HEADER_ID = x_header_id;
205
206 CURSOR count_shipped_pls (x_header_id IN BINARY_INTEGER) IS
207 SELECT count(*)
208 FROM SO_PICKING_LINES_ALL
209 WHERE picking_header_id = x_header_id
210 AND nvl(shipped_quantity,0) > 0;
211
212 p_order_header_id BINARY_INTEGER;
213 p_ship_to_site_use_id BINARY_INTEGER;
214 p_ship_method_code VARCHAR2(30);
215 p_organization_id BINARY_INTEGER;
216 p_date_shipped DATE;
217 p_date_confirmed DATE;
218 p_waybill_num VARCHAR2(50);
219 p_weight NUMBER;
220 p_weight_unit_code VARCHAR2(3);
221 p_picked_by_id BINARY_INTEGER;
222 p_packed_by_id BINARY_INTEGER;
223 p_creation_date DATE;
224 p_created_by BINARY_INTEGER;
225 p_last_updated_by BINARY_INTEGER;
226 p_last_update_login BINARY_INTEGER;
227 p_last_update_date DATE;
228 p_expected_arrival_date DATE; -- added: for bug 1413000
229 v_customer_id BINARY_INTEGER;
230 v_fob_code VARCHAR2(30);
231 v_freight_terms_code VARCHAR2(30);
232 v_currency_code VARCHAR2(15);
233 v_delivery_name VARCHAR2(15);
234 v_delivery_id BINARY_INTEGER := -1;
235 v_departure_name VARCHAR2(15);
236 p_pick_line_count BINARY_INTEGER;
237 p_context VARCHAR2(150);
238 p_attribute1 VARCHAR2(150);
239 p_attribute2 VARCHAR2(150);
240 p_attribute3 VARCHAR2(150);
241 p_attribute4 VARCHAR2(150);
242 p_attribute5 VARCHAR2(150);
243 p_attribute6 VARCHAR2(150);
244 p_attribute7 VARCHAR2(150);
245 p_attribute8 VARCHAR2(150);
246 p_attribute9 VARCHAR2(150);
247 p_attribute10 VARCHAR2(150);
248 p_attribute11 VARCHAR2(150);
249 p_attribute12 VARCHAR2(150);
250 p_attribute13 VARCHAR2(150);
251 p_attribute14 VARCHAR2(150);
252 p_attribute15 VARCHAR2(150);
253
254
255 BEGIN
256
257 -- Fetch all picking header parameters
258 OPEN get_picking_info(p_header_id);
259 FETCH get_picking_info
260 INTO p_order_header_id,
261 p_ship_to_site_use_id,
262 p_ship_method_code,
263 p_organization_id,
264 p_date_shipped,
265 p_date_confirmed,
266 p_waybill_num,
267 p_weight,
268 p_weight_unit_code,
269 p_picked_by_id,
270 p_packed_by_id,
271 p_context,
272 p_attribute1,
273 p_attribute2,
274 p_attribute3,
275 p_attribute4,
276 p_attribute5,
277 p_attribute6,
278 p_attribute7,
279 p_attribute8,
280 p_attribute9,
281 p_attribute10,
282 p_attribute11,
283 p_attribute12,
284 p_attribute13,
285 p_attribute14,
286 p_attribute15,
287 p_creation_date,
288 p_created_by,
289 p_last_updated_by,
290 p_last_update_login,
291 p_last_update_date,
292 p_expected_arrival_date;
293 CLOSE get_picking_info;
294
295 -- Fetch all delivery parameters
296 OPEN get_order_info(p_order_header_id);
297 FETCH get_order_info
298 INTO v_customer_id,
299 v_fob_code,
300 v_freight_terms_code,
301 v_currency_code;
302
303 IF get_order_info%NOTFOUND THEN
304 Init_Mesg('Error: Cannot find order header, header_id '|| p_order_header_id);
305 RETURN FAILURE;
306 END IF;
307
308 CLOSE get_order_info;
309
310 IF (p_ship_to_site_use_id is NULL) THEN
311 Init_Mesg('ERROR: Ship_To_Site_Use_Id column for picking_header_id '||p_header_id||' in so_picking_headers_all is NULL');
312 RETURN FAILURE;
313 END IF;
314
315 IF (v_customer_id is NULL) THEN
316 Init_Mesg('ERROR: Customer_Id column for header_id '|| p_order_header_id ||' in so_headers_all is NULL');
317 RETURN FAILURE;
318 END IF;
319
320 IF (p_date_shipped is NULL) THEN
321 OPEN count_shipped_pls(p_header_id);
322 FETCH count_shipped_pls INTO p_pick_line_count;
323 CLOSE count_shipped_pls;
324
325 IF p_pick_line_count > 0 THEN
326 Init_Mesg('ERROR: Date_Shipped column for picking_header_id '||p_header_id||' in so_picking_headers_all is NULL');
327 RETURN FAILURE;
328 ELSE
329 p_date_shipped := p_last_update_date;
330 END IF;
331 END IF;
332
333
334 Get_Departure( p_departure_id, v_departure_name);
335
336 INSERT INTO wsh_departures(
337 organization_id,
338 departure_id,
339 name,
340 source_code,
341 arrive_after_departure_id,
342 status_code,
343 report_set_id,
344 date_closed,
345 vehicle_item_id,
346 vehicle_number,
347 freight_carrier_code,
348 planned_departure_date,
349 actual_departure_date,
350 bill_of_lading,
351 gross_weight,
352 net_weight,
353 weight_uom_code,
354 volume,
355 volume_uom_code,
356 fill_percent,
357 seal_code,
358 routing_instructions,
359 creation_date,
360 created_by,
361 last_update_date,
362 last_updated_by,
363 last_update_login,
364 program_application_id
365 ) VALUES (
366 p_organization_id,
367 p_departure_id,
368 v_departure_name,
369 'S',
370 NULL,
371 'CL',
372 NULL,
373 p_date_confirmed,
374 NULL,
375 '',
376 p_ship_method_code,
377 p_date_shipped,
378 p_date_shipped,
379 NULL,
380 p_weight,
381 p_weight,
382 p_weight_unit_code,
383 NULL,
384 NULL,
385 NULL,
386 NULL,
387 NULL,
388 p_creation_date,
389 p_created_by,
390 SYSDATE,
391 p_last_updated_by,
392 p_last_update_login,
393 -999
394 );
395
396 Get_Delivery(v_delivery_id, v_delivery_name);
397
398 IF ( length(p_waybill_num) > 30 ) THEN
399 p_waybill_num := substrb(p_waybill_num,1,30);
400 long_waybill_count := long_waybill_count + 1;
401 END IF;
402
403
404 INSERT INTO wsh_deliveries(
405 organization_id,
406 delivery_id,
407 name,
408 source_code,
409 planned_departure_id,
410 actual_departure_id,
411 status_code,
412 loading_order_flag,
413 date_closed,
414 report_set_id,
415 sequence_number,
416 customer_id,
417 ultimate_ship_to_id,
418 intermediate_ship_to_id,
419 pooled_ship_to_id,
420 waybill,
421 gross_weight,
422 weight_uom_code,
423 volume,
424 volume_uom_code,
425 picked_by_id,
426 packed_by_id,
427 expected_arrival_date,
428 asn_date_sent,
429 asn_seq_number,
430 attribute_category,
431 attribute1,
432 attribute2,
433 attribute3,
434 attribute4,
435 attribute5,
436 attribute6,
437 attribute7,
438 attribute8,
439 attribute9,
440 attribute10,
441 attribute11,
442 attribute12,
443 attribute13,
444 attribute14,
445 attribute15,
446 freight_carrier_code,
447 freight_terms_code,
448 currency_code,
449 fob_code,
450 creation_date,
451 created_by,
452 last_update_date,
453 last_updated_by,
454 last_update_login,
455 program_application_id
456 ) VALUES (
457 p_organization_id,
458 v_delivery_id,
459 v_delivery_name,
460 'S',
461 p_departure_id,
462 p_departure_id,
463 'CL',
464 NULL,
465 p_date_confirmed,
466 NULL,
467 NULL,
468 v_customer_id,
469 p_ship_to_site_use_id,
470 NULL,
471 NULL,
472 p_waybill_num,
473 p_weight,
474 p_weight_unit_code,
475 NULL,
476 NULL,
477 p_picked_by_id,
478 p_packed_by_id,
479 p_expected_arrival_date, -- added: for bug 1413000
480 NULL,
481 NULL,
482 p_context, -- attribute_category
483 p_attribute1,
484 p_attribute2,
485 p_attribute3,
486 p_attribute4,
487 p_attribute5,
488 p_attribute6,
489 p_attribute7,
490 p_attribute8,
491 p_attribute9,
492 p_attribute10,
493 p_attribute11,
494 p_attribute12,
495 p_attribute13,
496 p_attribute14,
497 p_attribute15,
498 p_ship_method_code,
499 v_freight_terms_code,
500 v_currency_code,
501 v_fob_code,
502 p_creation_date,
503 p_created_by,
504 SYSDATE,
505 p_last_updated_by,
506 p_last_update_login,
507 -999
508 );
509
510 RETURN v_delivery_id;
511
512 EXCEPTION
513 WHEN OTHERS THEN
514 IF (get_picking_info%ISOPEN) THEN
515 CLOSE get_picking_info;
516 END IF;
517 IF (get_order_info%ISOPEN) THEN
518 CLOSE get_order_info;
519 END IF;
520 IF (count_shipped_pls%ISOPEN) THEN
521 CLOSE count_shipped_pls;
522 END IF;
526 commit;
523 Rollback; -- to savepoint before_insert; <bug 1475847>
524 Init_mesg('Error in creating delivery/departure for picking_header_id '||p_header_id);
525 Insert_mesg;
527 raise;
528 END Insert_Row;
529
530 PROCEDURE Upgrade_Rows ( num_rows IN BINARY_INTEGER,
531 total_workers IN BINARY_INTEGER,
532 worker IN BINARY_INTEGER,
533 batch_number IN BINARY_INTEGER
534 ) IS
535
536 /* for parallel execution */
537
538 l_job_min BINARY_INTEGER := 0;
539 l_job_max BINARY_INTEGER := 0;
540 l_lower_limit BINARY_INTEGER := 0;
541 l_upper_limit BINARY_INTEGER := 0;
542 l_worker_job_min BINARY_INTEGER := 0;
543 l_worker_job_max BINARY_INTEGER := 0;
544 l_commit_count BINARY_INTEGER := 0;
545 l_test NUMBER := 0;
546 u_picking_header_id BINARY_INTEGER;
547 u_delivery_id BINARY_INTEGER;
548 u_departure_id BINARY_INTEGER;
549 i BINARY_INTEGER;
550 j BINARY_INTEGER;
551 NULL_ERROR EXCEPTION;
552
553 CURSOR get_header_id(l_min BINARY_INTEGER, l_max BINARY_INTEGER) IS
554 SELECT picking_header_id
555 FROM SO_PICKING_HEADERS_ALL
556 WHERE
557 delivery_id is NULL
558 AND status_code = 'CLOSED'
559 AND picking_header_id BETWEEN l_min and l_max;
560
561 CURSOR get_any_row IS
562 SELECT 1
563 FROM so_picking_headers_all WHERE
564 delivery_id is NULL and
565 picking_header_id > 0 and
566 status_code = 'CLOSED';
567
568
569 BEGIN
570
571 long_waybill_count := 0;
572
573 IF num_rows IS NULL or num_rows = 0 THEN
574 RAISE NULL_ERROR;
575 END IF;
576
577 open get_any_row;
578 fetch get_any_row into l_test;
579 if get_any_row%FOUND then
580
581 /*=======================================================
582 This fix trifurcates the Picking Header ID Processing
583 as per the logic given below:
584
585 1. If wshrpupd.sql invokes this, batch_number = 0 and
586 only picking_header_ids from 1 to 9999 will be processed.
587
588 2. If wshrpupd01.sql invokes this, batch_number = 1 and
589 only picking_header_ids from 10000 to 99999999 will be
590 processed.
591
592 3. If wshrpupd02.sql invokes this, batch_number = 2 and
593 only picking_header_ids >= 100000000 will be processed.
594 ========================================================*/
595
596 IF batch_number = 0 THEN
597
598 SELECT NVL(MIN(picking_header_id),0), NVL(MAX(picking_header_id),0)
599 INTO l_job_min, l_job_max
600 FROM SO_PICKING_HEADERS_ALL
601 WHERE picking_header_id between 1 and 9999
602 AND delivery_id IS NULL
603 AND status_code = 'CLOSED';
604
605 ELSIF batch_number = 1 THEN
606
607 SELECT NVL(MIN(picking_header_id),0), NVL(MAX(picking_header_id),0)
608 INTO l_job_min, l_job_max
609 FROM SO_PICKING_HEADERS_ALL
610 WHERE picking_header_id between 10000 and 99999999
611 AND delivery_id IS NULL
612 AND status_code = 'CLOSED';
613
614 ELSIF batch_number = 2 THEN
615
616 SELECT NVL(MIN(picking_header_id),0), NVL(MAX(picking_header_id),0)
617 INTO l_job_min, l_job_max
618 FROM SO_PICKING_HEADERS_ALL
619 WHERE picking_header_id >= 100000000
620 AND delivery_id IS NULL
621 AND status_code = 'CLOSED';
622
623 END IF;
624
625
626 l_worker_job_min := l_job_min + TRUNC(((worker -1)*(l_job_max - l_job_min)) / total_workers);
627 l_worker_job_max := l_job_min + TRUNC((worker * (l_job_max - l_job_min)) / total_workers);
628
629 if worker <> total_workers then
630 l_worker_job_max := l_worker_job_max - 1;
631 end if;
632
633 Insert_Mesg('Worker: ' || to_char(worker) || ' processing picking_header_id ' ||
634 to_char(l_worker_job_min) || '..' || to_char(l_worker_job_max));
635 commit;
636
637 l_lower_limit := l_worker_job_min;
638 l_upper_limit := l_worker_job_min - 1;
639
640 -- Bug 1475858 : We need to close the cursor after the commit and re-open it to avoid Snapshot Too Old error.
641
642 LOOP
643 -- exit when upper limit already reach the max in previous round
644 EXIT WHEN l_upper_limit = l_worker_job_max;
645
646 -- set the upper limit for this round
647 if (l_worker_job_max - l_upper_limit) > num_rows then
648 l_upper_limit := l_upper_limit + num_rows;
649 else
650 l_upper_limit := l_worker_job_max;
651 end if;
652
653 Insert_Mesg('Upgrading picking header id:' || l_lower_limit ||' to '|| l_upper_limit);
654
655 OPEN get_header_id(l_lower_limit, l_upper_limit);
656 LOOP
657
658 FETCH get_header_id INTO u_picking_header_id;
659
660 EXIT WHEN get_header_id%NOTFOUND;
661
662 u_departure_id := NULL;
663 u_delivery_id := Insert_Row( u_picking_header_id, u_departure_id);
664
668 ELSE
665 IF (u_delivery_id = FAILURE ) OR (u_departure_id is NULL) THEN
666 Add_Mesg('Error: Failed to create departure or delivery for picking_header_id: ' ||u_picking_header_id||' , ignoring ...');
667 Insert_Mesg;
669 UPDATE SO_FREIGHT_CHARGES
670 SET delivery_id = u_delivery_id
671 WHERE picking_header_id = u_picking_header_id;
672
673 UPDATE SO_PICKING_HEADERS_ALL PH
674 SET PH.delivery_id = u_delivery_id
675 WHERE PH.picking_header_id = u_picking_header_id;
676
677 UPDATE SO_PICKING_LINE_DETAILS
678 SET delivery_id = u_delivery_id,
679 departure_id = u_departure_id,
680 dpw_assigned_flag = NULL
681 WHERE picking_line_detail_id IN
682 ( SELECT pld.picking_line_detail_id
683 FROM
684 so_picking_line_details pld,
685 so_picking_lines_all pl
686 WHERE pl.picking_header_id = u_picking_header_id
687 AND pld.picking_line_id = pl.picking_line_id );
688 END IF;
689
690
691 END LOOP;
692
693 CLOSE get_header_id;
694 commit;
695
696 l_lower_limit := l_lower_limit + num_rows;
697
698 END LOOP;
699 Insert_Mesg('Long waybill count : ' || to_char(long_waybill_count));
700 ELSE
701 Insert_Mesg('No closed row in table SO_PICKING_HEADERS_ALL, skipping Upgrade_Row');
702 END IF;
703 close get_any_row;
704 Commit;
705 EXCEPTION
706 WHEN NULL_ERROR THEN
707 rollback;
708 Init_Mesg('Number of rows to commit at a time cannot be NULL or zero');
709 Insert_Mesg;
710 commit;
711 WHEN OTHERS THEN
712 IF (get_header_id%ISOPEN) THEN
713 CLOSE get_header_id;
714 END IF;
715 ROLLBACK;
716 Init_Mesg( sqlerrm || ' ' || to_char(sqlcode));
717 Insert_Mesg;
718 commit;
719 raise;
720
721 END Upgrade_Rows;
722
723 END WSH_UPGRADE_PICK_SLIP_DATA_NEW;