1 PACKAGE BODY INVPUOPI AS
2 /* $Header: INVPUP1B.pls 120.9.12020000.5 2013/01/23 08:31:14 lmai ship $ */
3
4 l_application_id number(10) := 401;
5 l_id_flex_code varchar2(4) := 'MSTK';
6 l_enabled_flag varchar2(1) := 'Y';
7 l_id_flex_num number(15) := 101;
8
9 /*
10 ** Parse the input item number, assign segment values
11 ** into SEGMENT columns in MTL_SYSTEM_ITEMS_INTERFACE
12 */
13 ---Start: Bug Fix 3051653
14 G_SEGMENT_DELIMITER VARCHAR2(10) := NULL;
15 G_SEGMENTS_INUSE NUMBER(10) := NULL;
16 G_SEGMENT_STRING VARCHAR2(500) := NULL;
17 G_DYNAMIC_UPDATE VARCHAR2(1000):= NULL;
18 --Start Bug: 4654433
19 G_NUM_OF_SEGMENTS NUMBER := NULL;
20 TYPE G_SEGMENTS_USED_TYPE IS TABLE OF NUMBER
21 INDEX BY PLS_INTEGER;
22 G_SEGMENTS_USED G_SEGMENTS_USED_TYPE;
23 G_SEGMENT_NUMS_USED G_SEGMENTS_USED_TYPE;
24 G_MIN_SEGMENT FND_ID_FLEX_SEGMENTS.application_column_name%TYPE;
25 G_MIN_SEG_NUM NUMBER;
26 G_CHECK_SEG_NUM NUMBER;
27 --End Bug: 4654433
28
29 FUNCTION mtl_pr_parse_item_segments
30 (p_row_id in rowid
31 ,item_number out NOCOPY VARCHAR2
32 ,item_id out NOCOPY NUMBER
33 ,err_text out NOCOPY varchar2
34 ) RETURN INTEGER IS
35
36 l_segment_name VARCHAR2(500);
37
38 BEGIN
39
40
41 IF G_SEGMENT_STRING IS NULL THEN
42 FOR i in G_SEGMENT_NUMS_USED.FIRST..G_SEGMENT_NUMS_USED.LAST LOOP
43 BEGIN
44 SELECT FS.application_column_name
45 INTO l_segment_name
46 FROM FND_ID_FLEX_SEGMENTS FS
47 WHERE FS.SEGMENT_NUM = G_SEGMENT_NUMS_USED(i)
48 AND FS.ID_FLEX_CODE = l_id_flex_code
49 AND FS.ID_FLEX_NUM = l_id_flex_num
50 AND FS.ENABLED_FLAG = l_enabled_flag
51 AND FS.APPLICATION_ID = l_application_id;
52 EXCEPTION
53 WHEN NO_DATA_FOUND THEN
54 l_segment_name := NULL;
55 WHEN OTHERS THEN
56 raise_application_error(-20001, SQLERRM);
57 END;
58
59 IF l_segment_name IS NOT NULL THEN
60 IF G_SEGMENT_STRING IS NULL THEN
61 G_SEGMENT_STRING := l_segment_name;
62 ELSE
63 G_SEGMENT_STRING := G_SEGMENT_STRING||'||'''||G_SEGMENT_DELIMITER||'''||'||l_segment_name;
64 END IF;
65 END IF;
66 END LOOP;
67 END IF;
68
69
70 IF G_DYNAMIC_UPDATE IS NULL THEN
71
72 G_DYNAMIC_UPDATE := ' UPDATE mtl_system_items_interface'||
73 ' SET item_number = '||G_SEGMENT_STRING||
74 ' WHERE ROWID = :p_row_id '||
75 ' RETURNING inventory_item_id, item_number INTO :item_id, :item_number';
76 END IF;
77
78 EXECUTE IMMEDIATE G_DYNAMIC_UPDATE
79 USING p_row_id, OUT item_id, OUT item_number;
80
81
82 RETURN 0;
83
84 EXCEPTION
85 WHEN OTHERS THEN
86 err_text := substr('INVPUOPI.parse_item:' || SQLERRM ,1, 240);
87 return(SQLCODE);
88 END mtl_pr_parse_item_segments;
89 ---End: Bug Fix 3051653
90
91 --Start :New overloaded procedure mtl_pr_parse_item_number
92 PROCEDURE mtl_pr_parse_item_number(
93 p_item_number IN VARCHAR2
94 ,p_segment1 OUT NOCOPY VARCHAR2
95 ,p_segment2 OUT NOCOPY VARCHAR2
96 ,p_segment3 OUT NOCOPY VARCHAR2
97 ,p_segment4 OUT NOCOPY VARCHAR2
98 ,p_segment5 OUT NOCOPY VARCHAR2
102 ,p_segment9 OUT NOCOPY VARCHAR2
99 ,p_segment6 OUT NOCOPY VARCHAR2
100 ,p_segment7 OUT NOCOPY VARCHAR2
101 ,p_segment8 OUT NOCOPY VARCHAR2
103 ,p_segment10 OUT NOCOPY VARCHAR2
104 ,p_segment11 OUT NOCOPY VARCHAR2
105 ,p_segment12 OUT NOCOPY VARCHAR2
106 ,p_segment13 OUT NOCOPY VARCHAR2
107 ,p_segment14 OUT NOCOPY VARCHAR2
108 ,p_segment15 OUT NOCOPY VARCHAR2
109 ,p_segment16 OUT NOCOPY VARCHAR2
110 ,p_segment17 OUT NOCOPY VARCHAR2
111 ,p_segment18 OUT NOCOPY VARCHAR2
112 ,p_segment19 OUT NOCOPY VARCHAR2
113 ,p_segment20 OUT NOCOPY VARCHAR2
114 ,x_err_text OUT NOCOPY VARCHAR2) IS
115
116 type segvalueType is table of varchar2(40) index by binary_integer;
117 type tmpvalueType is table of varchar2(40) index by binary_integer;
118 seg_value segvalueType;
119 tmp_value tmpvalueType;
120 segment_name varchar2(30);
121 segment_num varchar2(30);
122 return_status number;
123 pos number;
124 ind number;
125 l_count_slash number;
126
127 BEGIN
128
129
130
131 x_err_text := NULL;
132
133 for n in 1..20 loop
134 seg_value(n) := NULL;
135 tmp_value(n) := NULL;
136 end loop;
137
138 return_status := 1;
139 pos := 1;
140 ind := 1;
141 while (return_status > 0 AND ind < G_SEGMENTS_INUSE) loop
142 return_status := INSTR(p_item_number,G_SEGMENT_DELIMITER,pos);
143
144 if (return_status > 0) then
145 tmp_value(ind) := substr(p_item_number,pos,return_status - pos);
146 pos := return_status + length(G_SEGMENT_DELIMITER);
147 ind := ind +1;
148 end if;
149 end loop;
150 tmp_value(ind) := substr(p_item_number,pos);
151
152 --Start :3632767 Code to suport \. in item number
153 --tmp_value contains values from item number seperated at deliminator
154 --Ex: Item Number : A.B then tmp_value(1)=A and tmp_value(2)=B this seperation is done by above code.
155 --We need to check if each string in tmp_value ends with odd number of \'s then
156 --append this with value with next row and move all the remaining rows by one up.
157 --Ex :tmp_value(1) = A\\\ tmp_value(2) = B tmp_value(3) = C
158 --Then tmp_value(1) = A\\\.B tmp_value(2) = C tmp_value(3) = tmp_value(4)..and so on.
159
160 FOR i IN 1..(tmp_value.COUNT-1) LOOP
161 pos := i+1;
162 WHILE tmp_value(i) IS NOT NULL
163 AND tmp_value(pos) IS NOT NULL
164 AND (INSTR(tmp_value(i),'\',-1) = LENGTH(tmp_value(i)))
165 LOOP
166
167 l_count_slash := 0;
168 FOR j IN REVERSE 1..LENGTH(tmp_value(i)) LOOP
169 IF SUBSTR(tmp_value(i),J,1) = '\' THEN
170 l_count_slash := l_count_slash + 1;
171 ELSE
172 EXIT;
173 END IF;
174 END LOOP;
175
176 IF MOD(l_count_slash,2) <>0 THEN
177 IF G_SEGMENTS_INUSE = 1 THEN
178 tmp_value(i) := tmp_value(i) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
179 ELSE
180 tmp_value(i) := SUBSTR(tmp_value(i),1,LENGTH(tmp_value(i))-1) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
181 END IF;
182 FOR j in (i+1)..tmp_value.COUNT-1 LOOP
183 tmp_value(j) := tmp_value(j+1);
184 END LOOP;
185 ELSE
186 EXIT;
187 END IF; --MOD(l_count_slash,2) <>0
188
189 END LOOP;
190 END LOOP;
191
192 --Remove the escape character \
193 FOR i IN 1..tmp_value.COUNT LOOP
194 tmp_value(i) := REPLACE(tmp_value(i),'\\','\');
195 END LOOP;
196 --End :3632767 Code to suport \. in item number
197 --Bug: 4654433
198 pos := 1 ;
199 FOR n in G_SEGMENTS_USED.FIRST..G_SEGMENTS_USED.LAST LOOP
200 seg_value(G_SEGMENTS_USED(n)) := tmp_value(pos);
201 pos := pos + 1 ;
202 END LOOP;
203
204 --Start :3632767 Code to suport \. in item number
205 -- Bug: 5160315 Changing value of ind so that remaining segments are
206 -- stored in last enabled segment
207 ind := G_SEGMENTS_USED(G_SEGMENTS_USED.LAST);
208 FOR i IN pos ..tmp_value.count LOOP
209 IF tmp_value(i) IS NOT NULL THEN
210 seg_value(ind) := seg_value(ind) ||G_SEGMENT_DELIMITER||tmp_value(i);
211 END IF;
212 END LOOP;
213 --End :3632767 Code to suport \. in item number
214
215 p_segment1 := seg_value(1);
216 p_segment2 := seg_value(2);
217 p_segment3 := seg_value(3);
218 p_segment4 := seg_value(4);
219 p_segment5 := seg_value(5);
220 p_segment6 := seg_value(6);
221 p_segment7 := seg_value(7);
222 p_segment8 := seg_value(8);
223 p_segment9 := seg_value(9);
224 p_segment10 := seg_value(10);
225 p_segment11 := seg_value(11);
226 p_segment12 := seg_value(12);
227 p_segment13 := seg_value(13);
228 p_segment14 := seg_value(14);
229 p_segment15 := seg_value(15);
230 p_segment16 := seg_value(16);
231 p_segment17 := seg_value(17);
232 p_segment18 := seg_value(18);
233 p_segment19 := seg_value(19);
234 p_segment20 := seg_value(20);
235 x_err_text := NULL;
236 EXCEPTION
237 WHEN OTHERS THEN
238 x_err_text := substr('INVPUOPI.parse_item:' || SQLERRM ,1, 240);
239 END mtl_pr_parse_item_number;
240 --End :New overloaded procedure mtl_pr_parse_item_number
241
242 FUNCTION mtl_pr_parse_item_number
243 (
247 org_id number,
244 item_number varchar2,
245 item_id number,
246 trans_id number,
248 err_text out NOCOPY varchar2,
249 p_rowid rowid
250 )
251 RETURN INTEGER
252 IS
253 type segvalueType is table of varchar2(40)
254 index by binary_integer;
255 type tmpvalueType is table of varchar2(40)
256 index by binary_integer;
257 seg_value segvalueType;
258 tmp_value tmpvalueType;
259 delimiter varchar2(10);
260 segvalue_tmp varchar2(40);
261 segment_name varchar2(30);
262 segment_num varchar2(30);
263 max_segment number;
264 return_status number;
265 pos number;
266 ind number;
267 l_count_slash number;
268 BEGIN
269 err_text := NULL;
270
271 /*
272 ** initialize table values
273 */
274 for n in 1..20 loop
275 seg_value(n) := NULL;
276 tmp_value(n) := NULL;
277 end loop;
278
279 /*
280 ** get the delimeter and max_segment
281 */
282 --Bug: 4654433
283 delimiter := G_SEGMENT_DELIMITER;
284 max_segment := G_SEGMENTS_INUSE;
285 /*
286 ** seperate input name into segments
287 */
288 return_status := 1;
289 pos := 1;
290 ind := 1;
291 while (return_status > 0 AND ind < max_segment) loop
292 return_status := INSTR(item_number,delimiter,pos);
293 if (return_status > 0) then
294 tmp_value(ind) := substr(item_number,pos,
295 return_status - pos);
296 pos := return_status + length(delimiter);
297 ind := ind +1;
298 end if;
299
300 end loop;
301 tmp_value(ind) := substr(item_number,pos);
302
303 --Start :3632767 Code to suport \. in item number
304 --tmp_value contains values from item number seperated at deliminator
305 --Ex: Item Number : A.B then tmp_value(1)=A and tmp_value(2)=B this seperation is done by above code.
306 --We need to check if each string in tmp_value ends with odd number of \'s then
307 --append this with value with next row and move all the remaining rows by one up.
308 --Ex :tmp_value(1) = A\\\ tmp_value(2) = B tmp_value(3) = C
309 --Then tmp_value(1) = A\\\.B tmp_value(2) = C tmp_value(3) = tmp_value(4)..and so on.
310
311 FOR i IN 1..(tmp_value.COUNT-1) LOOP
312 pos := i+1;
313
314 WHILE tmp_value(i) IS NOT NULL
315 AND tmp_value(pos) IS NOT NULL
316 AND (INSTR(tmp_value(i),'\',-1) = LENGTH(tmp_value(i)))
317 LOOP
318
319 l_count_slash := 0;
320 FOR j IN REVERSE 1..LENGTH(tmp_value(i)) LOOP
321 IF SUBSTR(tmp_value(i),J,1) = '\' THEN
322 l_count_slash := l_count_slash + 1;
323 ELSE
324 EXIT;
325 END IF;
326 END LOOP;
327
328 IF MOD(l_count_slash,2) <>0 THEN
329 IF G_SEGMENTS_INUSE = 1 THEN
330 tmp_value(i) := tmp_value(i) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
331 ELSE
332 tmp_value(i) := SUBSTR(tmp_value(i),1,LENGTH(tmp_value(i))-1) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
333 END IF;
334 FOR j in (i+1)..tmp_value.COUNT-1 LOOP
335 tmp_value(j) := tmp_value(j+1);
336 END LOOP;
337 ELSE
338 EXIT;
339 END IF;
340 END LOOP;
341 END LOOP;
342
343 FOR i IN 1..tmp_value.COUNT LOOP
344 tmp_value(i) := REPLACE(tmp_value(i),'\\','\');
345 END LOOP;
346 --End :3632767 Code to suport \. in item number
347
348 /*
349 ** assign the seperated segments into proper SEGMENT columns
350 ** commented below seg_value(ind) := tmp_value(n);
351 ** If 1st enabled segment is say SEGMENT10 with SEGMENT NUM 15
352 ** and item number like '06231'
353 ** Below logic would fail , as the while loop above will store
354 ** '06231' in tmp_value(1) and above commented st. would look for
355 ** a value in tmp_value(15).
356 */
357 --Bug: 4654433
358 pos := 1 ;
359 for n in G_SEGMENTS_USED.FIRST..G_SEGMENTS_USED.LAST loop
360 seg_value(G_SEGMENTS_USED(n)) := tmp_value(pos);
361 pos := pos + 1 ;
362 end loop;
363
364 --Start :3632767 Code to suport \. in item number
365 -- Bug: 5160315 Changing value of ind so that remaining segments are
366 -- stored in last enabled segment
367 ind := G_SEGMENTS_USED(G_SEGMENTS_USED.LAST);
368 FOR i IN pos ..tmp_value.count LOOP
369 IF tmp_value(i) IS NOT NULL THEN
370 seg_value(ind) := seg_value(ind) ||delimiter||tmp_value(i);
371 END IF;
372 END LOOP;
373 --End :3632767 Code to suport \. in item number
374
375 /*
376 ** update segment values in MTL_SYSTEM_ITEMS_INTERFACE
377 */
378 update MTL_SYSTEM_ITEMS_INTERFACE
379 set segment1 = DECODE(seg_value(1),NULL,segment1,seg_value(1)),
380 segment2 = DECODE(seg_value(2),NULL,segment2,seg_value(2)),
381 segment3 = DECODE(seg_value(3),NULL,segment3,seg_value(3)),
382 segment4 = DECODE(seg_value(4),NULL,segment4,seg_value(4)),
383 segment5 = DECODE(seg_value(5),NULL,segment5,seg_value(5)),
384 segment6 = DECODE(seg_value(6),NULL,segment6,seg_value(6)),
385 segment7 = DECODE(seg_value(7),NULL,segment7,seg_value(7)),
386 segment8 = DECODE(seg_value(8),NULL,segment8,seg_value(8)),
387 segment9 = DECODE(seg_value(9),NULL,segment9,seg_value(9)),
388 segment10 = DECODE(seg_value(10),NULL,segment10,seg_value(10)),
389 segment11 = DECODE(seg_value(11),NULL,segment11,seg_value(11)),
393 segment15 = DECODE(seg_value(15),NULL,segment15,seg_value(15)),
390 segment12 = DECODE(seg_value(12),NULL,segment12,seg_value(12)),
391 segment13 = DECODE(seg_value(13),NULL,segment13,seg_value(13)),
392 segment14 = DECODE(seg_value(14),NULL,segment14,seg_value(14)),
394 segment16 = DECODE(seg_value(16),NULL,segment16,seg_value(16)),
395 segment17 = DECODE(seg_value(17),NULL,segment17,seg_value(17)),
396 segment18 = DECODE(seg_value(18),NULL,segment18,seg_value(18)),
397 segment19 = DECODE(seg_value(19),NULL,segment19,seg_value(19)),
398 segment20 = DECODE(seg_value(20),NULL,segment20,seg_value(20))
399 Where rowid = p_rowid ;
400 /*08/18/97 where transaction_id = trans_id; */
401 /* and organization_id = org_id; */
402
403 /*SETID logic probably not needed here*/
404
405 RETURN (0);
406
407 EXCEPTION
408
409 WHEN OTHERS THEN
410 err_text := substr('INVPUOPI.parse_item:' || SQLERRM ,1, 240);
411 return(SQLCODE);
412
413 END mtl_pr_parse_item_number;
414
415 /*
416 ** Parse flex name with the flex code, return the flex id
417 */
418
419 FUNCTION mtl_pr_parse_flex_name
420 (
421 org_id number,
422 flex_code varchar2,
423 flex_name varchar2,
424 flex_id in out NOCOPY number,
425 set_id number,
426 err_text out NOCOPY varchar2,
427 structure_id number default -1 /*Fix for bug 8288281*/
428 )
429 RETURN INTEGER
430 IS
431 type segvalueType is table of varchar2(40)
432 index by binary_integer;
433 type tmpvalueType is table of varchar2(40)
434 index by binary_integer;
435 seg_value segvalueType;
436 tmp_value tmpvalueType;
437 delimiter varchar2(10);
438 segvalue_tmp varchar2(40);
439 segment_name varchar2(30);
440 segment_num varchar2(30);
441 max_segment number;
442 return_status number;
443 ret_code number;
444 statement_num number;
445 struct_id number;
446 pos number;
447 ind number;
448 l_count_slash number;
449
450 l_inv_debug_level NUMBER := INVPUTLI.get_debug_level; --Bug: 4667452
451 BEGIN
452
453 err_text := NULL;
454 statement_num := 1;
455
456 /* get the structure first */
457 if flex_code = 'MCAT' then
458 select structure_id
459 into struct_id
460 from mtl_category_sets_b
461 where category_set_id = set_id;
462 else
463 struct_id := 101;
464 end if;
465
466 /* Search for the item id at production item table */
467 if flex_code = 'MSTK' then
468 statement_num := 2;
469 ret_code := INVPUOPI.mtl_pr_trans_prod_item (
470 flex_name,
471 org_id,
472 flex_id,
473 err_text);
474 if (ret_code <= 0 ) then
475 --11/05/97 if (ret_code < 0 ) then
476 return(ret_code);
477 end if;
478 end if;
479
480 /* We are going to search the interface table now */
481 /* init table values */
482 for n in 1..20 loop
483 seg_value(n) := NULL;
484 tmp_value(n) := NULL;
485 end loop;
486
487 /* get the delimeter and max_segment */
488 --Bug: 4654433
489 /*Changes done for bug 8288281. Here the delimiter and the num of segments of the flexflield should be retrieved for the
490 flex code being passed and shouldnt be hard coded from System Items flexfield*/
491 IF structure_id = -1 THEN
492 statement_num := 3;
493 delimiter := G_SEGMENT_DELIMITER;
494
495 statement_num := 4;
496 max_segment := G_SEGMENTS_INUSE;
497 ELSE
498
499 statement_num := 3.1;
500
501 SELECT FT.concatenated_segment_delimiter
502 INTO delimiter
503 FROM fnd_id_flex_structures FT
504 WHERE FT.id_flex_code = flex_code
505 AND FT.APPLICATION_ID = l_application_id
506 AND FT.ID_FLEX_NUM = structure_id;
507
508 statement_num := 4.1;
509
510 SELECT max(FS.segment_num)
511 INTO max_segment
512 FROM FND_ID_FLEX_SEGMENTS FS
513 WHERE FS.APPLICATION_ID = l_application_id
514 AND FS.id_flex_code = flex_code
515 AND FS.ENABLED_FLAG = 'Y'
516 AND FS.id_flex_num = structure_id;
517
518 END IF;
519 /*End of changes*/
520
521 /* seperate input name into segments */
522 pos := 1;
523 ind := 1;
524 return_status := 1;
525 statement_num := 5;
526 while (return_status > 0 AND ind < max_segment) loop
527 return_status := INSTR(flex_name,delimiter,pos);
528 if (return_status > 0) then
529 tmp_value(ind) := substr(flex_name,pos,
530 return_status - pos);
531 pos := return_status + length(delimiter);
532 ind := ind +1;
533 end if;
534 end loop;
535 tmp_value(ind) := substr(flex_name,pos);
536
537 --Start :3632767 Code to suport \. in item number
538 --tmp_value contains values from item number seperated at deliminator
539 --Ex: Item Number : A.B then tmp_value(1)=A and tmp_value(2)=B this seperation is done by above code.
540 --We need to check if each string in tmp_value ends with odd number of \'s then
541 --append this with value with next row and move all the remaining rows by one up.
542 --Ex :tmp_value(1) = A\\\ tmp_value(2) = B tmp_value(3) = C
543 --Then tmp_value(1) = A\\\.B tmp_value(2) = C tmp_value(3) = tmp_value(4)..and so on.
544
545 IF flex_code = 'MSTK' THEN
546 FOR i IN 1..(tmp_value.COUNT-1) LOOP
547 pos := i+1;
548
549 WHILE tmp_value(i) IS NOT NULL
553
550 AND tmp_value(pos) IS NOT NULL
551 AND (INSTR(tmp_value(i),'\',-1) = LENGTH(tmp_value(i)))
552 LOOP
554 l_count_slash := 0;
555 FOR j IN REVERSE 1..LENGTH(tmp_value(i)) LOOP
556 IF SUBSTR(tmp_value(i),J,1) = '\' THEN
557 l_count_slash := l_count_slash + 1;
558 ELSE
559 EXIT;
560 END IF;
561 END LOOP;
562
563 IF MOD(l_count_slash,2) <>0 THEN
564 IF G_SEGMENTS_INUSE = 1 THEN
565 tmp_value(i) := tmp_value(i) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
566 ELSE
567 tmp_value(i) := SUBSTR(tmp_value(i),1,LENGTH(tmp_value(i))-1) ||G_SEGMENT_DELIMITER|| tmp_value(pos);
568 END IF;
569 FOR j in (i+1)..tmp_value.COUNT-1 LOOP
570 tmp_value(j) := tmp_value(j+1);
571 END LOOP;
572 ELSE
573 EXIT;
574 END IF;
575 END LOOP;
576 END LOOP;
577
578 FOR i IN 1..tmp_value.COUNT LOOP
579 tmp_value(i) := REPLACE(tmp_value(i),'\\','\');
580 END LOOP;
581 END IF;
582 --End :3632767 Code to suport \. in item number
583
584 /* assign the seperated segments into proper SEGMENT columns */
585 --Bug: 4654433
586 statement_num := 6;
587 /* Bug 8613428 added If condition to reinitialize G_SEGMENTS_USED with category KFF values.
588 Earlier it had system Items KFF values. */
589 IF structure_id = -1 THEN
590 pos := 1 ;
591 for n in G_SEGMENTS_USED.FIRST..G_SEGMENTS_USED.LAST loop
592 seg_value(G_SEGMENTS_USED(n)) := tmp_value(pos);
593 pos := pos + 1;
594 end loop;
595 ELSE
596 SELECT to_number(substr(application_column_name,8)), segment_num BULK COLLECT INTO
597 G_SEGMENTS_USED, G_SEGMENT_NUMS_USED
598 FROM FND_ID_FLEX_SEGMENTS
599 WHERE APPLICATION_ID = l_application_id
600 AND id_flex_code = flex_code
601 AND ENABLED_FLAG = 'Y'
602 AND id_flex_num = structure_id
603 ORDER BY segment_num;
604
605 pos := 1 ;
606 for n in G_SEGMENTS_USED.FIRST..G_SEGMENTS_USED.LAST loop
607 seg_value(G_SEGMENTS_USED(n)) := tmp_value(pos);
608 pos := pos + 1;
609 end loop;
610 END IF;
611
612 --Start :3632767 Code to suport \. in item number
613 IF flex_code = 'MSTK' THEN
614 FOR i IN pos ..tmp_value.count LOOP
615 IF tmp_value(i) IS NOT NULL THEN
616 seg_value(ind) := seg_value(ind) ||delimiter||tmp_value(i);
617 END IF;
618 END LOOP;
619 END IF;
620 --End :3632767 Code to suport \. in item number
621
622 /* search for the matched segment values record */
623
624 /*
625 ** since we do not support dynamic SQL at this moment, so
626 ** we search for different table, based on the flex code
627 */
628
629 statement_num := 7;
630
631 if flex_code = 'MSTK' then
632 IF l_inv_debug_level IN(101, 102) THEN
633 INVPUTLI.info('INVPUP1.mtl_pr_parse_flex_name :verifying in MSII table' ||flex_name);
634 END IF;
635
636 select INVENTORY_ITEM_ID
637 into flex_id
638 from MTL_SYSTEM_ITEMS_INTERFACE
639 where ORGANIZATION_ID = org_id
640 and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
641 and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
642 and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
643 and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
644 and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
645 and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
646 and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
647 and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
648 and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
649 and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
650 and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
651 and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
652 and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
653 and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
654 and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
655 and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
656 and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
657 and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
658 and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
659 and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20))
660 --Bug: 6192567 process_flag = 1
661 and process_flag IN (1,2) and inventory_item_id is NOT NULL
662 and rownum = 1; --Bug:3340808,3531430
663
664 else if flex_code = 'MTLL' then
665 select INVENTORY_LOCATION_ID
666 into flex_id
667 from MTL_ITEM_LOCATIONS
668 where ORGANIZATION_ID = org_id
669 and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
670 and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
671 and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
672 and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
673 and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
674 and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
675 and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
676 and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
677 and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
681 and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
678 and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
679 and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
680 and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
682 and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
683 and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
684 and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
685 and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
686 and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
687 and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
688 and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20));
689
690 else if flex_code = 'MCAT' then
691 select CATEGORY_ID
692 into flex_id
693 from mtl_categories_b
694 where structure_id = struct_id
695 and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
696 and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
697 and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
698 and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
699 and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
700 and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
701 and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
702 and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
703 and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
704 and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
705 and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
706 and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
707 and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
708 and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
709 and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
710 and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
711 and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
712 and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
713 and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
714 and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20));
715
716 end if; /* MCAT */
717 end if; /* MTLL */
718 end if; /* MSTK */
719
720 RETURN (0);
721
722 EXCEPTION
723
724 WHEN others THEN
725 flex_id := NULL;
726 err_text := SUBSTRB('INVPUOPI.flex_name' || statement_num || SQLERRM, 1,240);
727 IF l_inv_debug_level IN(101, 102) THEN
728 INVPUTLI.info( err_text);
729 END IF;
730
731 RETURN (SQLCODE);
732
733 END mtl_pr_parse_flex_name;
734
735 /*
736 ** Search for the matched item number in the MSTK key flexfield view
737 ** and return the item id, if found.
738 */
739
740 FUNCTION mtl_pr_trans_prod_item
741 (
742 item_number_in varchar2,
743 org_id number,
744 item_id_out out NOCOPY number,
745 err_text out NOCOPY varchar2
746 )
747 RETURN INTEGER
748 IS
749 delimiter varchar2(10);
750 min_segment varchar2(32);
751 seg1 varchar2(40);
752 dummy number;
753 num_of_segments number;
754 min_seg_num number;
755 check_seg_num number;
756 BEGIN
757 --Bug: 4654433
758 delimiter := G_SEGMENT_DELIMITER;
759 num_of_segments := G_NUM_OF_SEGMENTS;
760
761 select min(FS.application_column_name),min(FS.segment_num)
762 into min_segment,min_seg_num
763 from FND_ID_FLEX_SEGMENTS FS
764 where FS.APPLICATION_ID = l_application_id
765 and FS.id_flex_code = l_id_flex_code
766 and FS.ENABLED_FLAG = l_enabled_flag
767 and FS.id_flex_num = l_id_flex_num;
768
769 /* Start of Bugfix 4082723 Anmurali */
770 BEGIN
771 select FS.segment_num into check_seg_num
772 from FND_ID_FLEX_SEGMENTS FS
773 where FS.APPLICATION_ID = l_application_id
774 and FS.id_flex_code = l_id_flex_code
775 and FS.ENABLED_FLAG = l_enabled_flag
776 and FS.id_flex_num = l_id_flex_num
777 and FS.application_column_name = 'SEGMENT1';
778 EXCEPTION
779
780 WHEN NO_DATA_FOUND THEN
781 check_seg_num := null;
782 END;
783
784
785
786 if (min_segment = 'SEGMENT1' and check_seg_num = min_seg_num) then
787 /*
788 ** this is being done because we assume most customers will define
789 ** flex combination using atleast segment1. Atleast they will benefit
790 ** from the index on org_id+segment1. Else the statemnt does a range
791 ** scan based on org id (since the index on segment1 is suppressed as
792 ** item_number is a concatenation of columns) and is not selective enough
793 **
794 ** 31-MAY-95: Added new if clause to not look at delimiter if
795 ** num_of_segments = 1; Fix for bug 285002
796 ** This is to avoid tripping over in the case where there is only one
797 ** segment and that segment value contains the delimiter character
798 */
799 if (num_of_segments > 1) then
800 dummy := instr(item_number_in, delimiter);
801 if (dummy = 0) then
802 seg1 := item_number_in;
803 else
804 seg1 := substr(item_number_in, 1, dummy - 1);
805 end if;
806 elsif (num_of_segments = 1) then
807 seg1 := item_number_in;
808 end if;
809 /* If condition added for bug 2935221
813 if (seg1 is null) then
810 For customers who have segment1 as null, the use of segment1 doesn't
811 return the inventroy_item_id. This is taken care of in the if-else condition
812 */
814 select inventory_item_id
815 into item_id_out
816 from mtl_system_items_b_kfv
817 where organization_id = org_id
818 and concatenated_segments = item_number_in;
819 else
820 select inventory_item_id
821 into item_id_out
822 from mtl_system_items_b_kfv
823 where segment1 = seg1
824 and organization_id = org_id
825 and concatenated_segments = item_number_in;
826 end if;
827 else
828
829 select inventory_item_id
830 into item_id_out
831 from mtl_system_items_b_kfv
832 where organization_id = org_id
833 and concatenated_segments = item_number_in;
834
835 end if;
836
837 RETURN (0);
838
839 EXCEPTION
840
841 WHEN OTHERS THEN
842 item_id_out := NULL;
843 err_text := substr('INVPUOPI.trans_item: ' || SQLERRM, 1,240);
844 RETURN (SQLCODE);
845
846 END mtl_pr_trans_prod_item;
847
848
849 FUNCTION mtl_pr_trans_org_id
850 (
851 org_code varchar2,
852 org_id out NOCOPY number,
853 err_text out NOCOPY varchar2
854 )
855 RETURN INTEGER
856 is
857 begin
858
859 --4932347: Using MTL_PARAMETERS instead of org_org
860 select organization_id
861 into org_id
862 from mtl_parameters
863 where organization_code = org_code;
864
865 return(0);
866
867 exception
868
869 WHEN OTHERS THEN
870 org_id := NULL;
871 err_text := substr('INVPUOPI.trans_org: ' || SQLERRM , 1, 240);
872 return(SQLCODE);
873
874 end mtl_pr_trans_org_id;
875
876
877 FUNCTION mtl_pr_trans_template_id
878 (
879 templ_name varchar2,
880 templ_id out NOCOPY number,
881 err_text out NOCOPY varchar2
882 )
883 RETURN INTEGER
884 IS
885 BEGIN
886 select template_id
887 into templ_id
888 from mtl_item_templates
889 where template_name = templ_name;
890
891 return(0);
892
893 exception
894
895 WHEN OTHERS THEN
896 templ_id := NULL;
897 err_text := substr('INVPUOPI.parse_template: ' || SQLERRM, 1, 240);
898 return(SQLCODE);
899
900 END mtl_pr_trans_template_id;
901
902
903 FUNCTION mtl_log_interface_err
904 (
905 org_id number,
906 user_id number,
907 login_id number,
908 prog_appid number,
909 prog_id number,
910 req_id number,
911 trans_id number,
912 error_text varchar2,
913 p_column_name VARCHAR2 := NULL,
914 tbl_name varchar2,
915 msg_name varchar2,
916 err_text OUT NOCOPY VARCHAR2
917 )
918 RETURN INTEGER
919 IS
920 dumm_status number;
921 translated_text fnd_new_messages.message_text%TYPE; --3699144
922 l_sysdate DATE := SYSDATE;
923 l_inv_debug_level NUMBER := INVPUTLI.get_debug_level; --Bug: 4667452
924 BEGIN
925
926 IF (msg_name like 'INV_IOI_ERR_%') OR (msg_name = 'INV_ICOI_ERROR') --changed by 11894684, will pass specific message name start with INV_IOI_ERR_ instead of error name INV_IOI_ERR
927 OR (msg_name like 'BOM%') OR (msg_name like 'CST%')
928 OR (msg_name like 'INV_CAT_SET_NO_DEFAULT_CAT')THEN
929 translated_text := error_text;
930 ELSE
931 dumm_status := INVUPD2B.get_message(msg_name, translated_text);
932 END IF;
933
934 IF l_inv_debug_level IN(101, 102) THEN
935 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: msg_name = '||msg_name);
936 END IF;
937
938 -- Bug 4052362 To display the entire error message - Anmurali
939
940 INSERT INTO mtl_interface_errors
941 (
942 TRANSACTION_ID,
943 UNIQUE_ID,
944 ORGANIZATION_ID,
945 LAST_UPDATE_DATE,
946 LAST_UPDATED_BY,
947 CREATION_DATE,
948 CREATED_BY,
949 LAST_UPDATE_LOGIN,
950 COLUMN_NAME,
951 TABLE_NAME,
952 MESSAGE_NAME,
953 ERROR_MESSAGE,
954 REQUEST_ID,
955 PROGRAM_APPLICATION_ID,
956 PROGRAM_ID,
957 PROGRAM_UPDATE_DATE
958 )
959 VALUES
960 (
961 trans_id,
962 mtl_system_items_interface_s.NEXTVAL,
963 org_id,
964 l_sysdate,
965 user_id,
966 l_sysdate,
967 user_id,
968 login_id,
969 p_column_name,
970 tbl_name,
971 msg_name,
972 SUBSTRB(translated_text, 1,2000),
973 req_id,
974 prog_appid,
975 prog_id,
976 l_sysdate
977 );
978
979 -- Output error information into the log file
980 if (to_number(nvl(fnd_profile.value('CONC_REQUEST_ID'),0)) <> 0) then
981 FND_FILE.PUT_LINE(FND_FILE.LOG,'************************************') ;
982 FND_FILE.PUT_LINE(FND_FILE.LOG,'TRANSACTION ID : ' || trans_id);
983 FND_FILE.PUT_LINE(FND_FILE.LOG,'ORGANIZATION ID : ' || org_id);
984 FND_FILE.PUT_LINE(FND_FILE.LOG,'TABLE NAME : ' || tbl_name);
985 FND_FILE.PUT_LINE(FND_FILE.LOG,'COLUMN NAME : ' || p_column_name);
986 FND_FILE.PUT_LINE(FND_FILE.LOG,'MESSAGE NAME : ' || msg_name);
987 FND_FILE.PUT_LINE(FND_FILE.LOG,'ERROR MESSAGE : ' || substrb(translated_text,1,2000));
988 end if ;
989
990 IF l_inv_debug_level IN(101, 102) THEN
991 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: TRANSACTION ID : ' || trans_id);
995 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: MESSAGE NAME : ' || msg_name);
992 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: ORGANIZATION ID : ' || org_id);
993 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: TABLE NAME : ' || tbl_name);
994 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: COLUMN NAME : ' || p_column_name);
996 INVPUTLI.info('INVPUOPI.mtl_log_interface_err: ERROR MESSAGE : ' || substrb(translated_text,1,2000));
997 END IF;
998
999 RETURN (0);
1000
1001 EXCEPTION
1002
1003 WHEN others THEN
1004 err_text := SUBSTRB('INVPUOPI.mtl_log_interface_err: ' || SQLERRM, 1,240);
1005 RETURN (SQLCODE);
1006
1007 END mtl_log_interface_err;
1008
1009 --------------------------------------------------------------------
1010 -- To convert item_number to Item_id
1011 -----------------------------------------------------------------
1012 FUNCTION mtl_pr_parse_item_name
1013 (
1014 item_number_in varchar2,
1015 item_id_out out NOCOPY number,
1016 err_text out NOCOPY varchar2
1017 )
1018 RETURN INTEGER
1019 IS
1020 delimiter varchar2(10);
1021 min_segment varchar2(32);
1022 seg1 varchar2(40);
1023 dummy number;
1024 num_of_segments number;
1025 min_seg_num number;
1026 check_seg_num number;
1027
1028 l_application_id number(10) := 401;
1029 l_id_flex_code varchar2(4) := 'MSTK';
1030 l_enabled_flag varchar2(1) := 'Y';
1031 l_id_flex_num number(15) := 101 ;
1032 BEGIN
1033
1034 --Bug: 4654433
1035 delimiter := G_SEGMENT_DELIMITER;
1036 num_of_segments := G_NUM_OF_SEGMENTS;
1037 min_segment := G_MIN_SEGMENT;
1038 min_seg_num := G_MIN_SEG_NUM;
1039 check_seg_num := G_CHECK_SEG_NUM;
1040
1041 /* Start of Bugfix 4082723 Anmurali */
1042
1043 if (min_segment = 'SEGMENT1' and check_seg_num = min_seg_num) then
1044
1045 if (num_of_segments > 1) then
1046 dummy := instr(item_number_in, delimiter);
1047 if (dummy = 0) then
1048 seg1 := item_number_in;
1049 else
1050 seg1 := substr(item_number_in, 1, dummy - 1);
1051 end if;
1052 elsif (num_of_segments = 1) then
1053 seg1 := item_number_in;
1054 end if;
1055
1056 if (seg1 is null) then
1057 select inventory_item_id
1058 into item_id_out
1059 from mtl_system_items_b_kfv
1060 where concatenated_segments = item_number_in
1061 group by inventory_item_id; -- Bug: 3447718 - added group by to get distinct inventory_item_id
1062 else
1063 select inventory_item_id
1064 into item_id_out
1065 from mtl_system_items_b_kfv
1066 where segment1 = seg1
1067 and concatenated_segments = item_number_in
1068 group by inventory_item_id; -- Bug: 3447718 - added group by to get distinct inventory_item_id
1069 end if;
1070
1071 else
1072 select inventory_item_id
1073 into item_id_out
1074 from mtl_system_items_b_kfv
1075 where concatenated_segments = item_number_in
1076 group by inventory_item_id; -- Bug: 3447718 - added group by to get distinct inventory_item_id
1077
1078 end if;
1079
1080 RETURN (0);
1081
1082 EXCEPTION
1083
1084 WHEN OTHERS THEN
1085 item_id_out := NULL;
1086 err_text := substr('INVPUOPI.trans_item: ' || SQLERRM, 1,240);
1087 RETURN (SQLCODE);
1088
1089 END mtl_pr_parse_item_name;
1090
1091 /*------------------------------*/
1092 /* Package initialization block */
1093 /*------------------------------*/
1094
1095 BEGIN
1096
1097 SELECT FT.concatenated_segment_delimiter
1098 INTO G_SEGMENT_DELIMITER
1099 FROM fnd_id_flex_structures FT
1100 WHERE FT.id_flex_code = l_id_flex_code
1101 AND FT.APPLICATION_ID = l_application_id
1102 AND FT.ID_FLEX_NUM = l_id_flex_num;
1103
1104 SELECT max(FS.segment_num)
1105 INTO G_SEGMENTS_INUSE
1106 FROM FND_ID_FLEX_SEGMENTS FS
1107 WHERE FS.APPLICATION_ID = l_application_id
1108 AND FS.id_flex_code = l_id_flex_code
1109 AND FS.ENABLED_FLAG = l_enabled_flag
1110 AND FS.id_flex_num = l_id_flex_num;
1111
1112 SELECT to_number(substr(application_column_name,8)), segment_num BULK COLLECT INTO G_SEGMENTS_USED, G_SEGMENT_NUMS_USED
1113 FROM FND_ID_FLEX_SEGMENTS
1114 WHERE APPLICATION_ID = l_application_id
1115 AND id_flex_code = l_id_flex_code
1116 AND ENABLED_FLAG = l_enabled_flag
1117 AND id_flex_num = l_id_flex_num
1118 ORDER BY segment_num;
1119
1120 SELECT COUNT(*) INTO G_NUM_OF_SEGMENTS
1121 FROM FND_ID_FLEX_SEGMENTS FS
1122 WHERE FS.APPLICATION_ID = l_application_id
1123 AND FS.id_flex_code = l_id_flex_code
1124 AND FS.ENABLED_FLAG = l_enabled_flag
1125 AND FS.id_flex_num = l_id_flex_num;
1126
1127 SELECT min(FS.application_column_name),min(FS.segment_num)
1128 INTO G_MIN_SEGMENT,G_MIN_SEG_NUM
1129 FROM FND_ID_FLEX_SEGMENTS FS
1130 WHERE FS.APPLICATION_ID = l_application_id
1131 AND FS.id_flex_code = l_id_flex_code
1132 AND FS.ENABLED_FLAG = l_enabled_flag
1133 AND FS.id_flex_num = l_id_flex_num;
1134
1135 BEGIN
1136 select FS.segment_num into G_CHECK_SEG_NUM
1137 from FND_ID_FLEX_SEGMENTS FS
1138 where FS.APPLICATION_ID = l_application_id
1139 and FS.id_flex_code = l_id_flex_code
1140 and FS.ENABLED_FLAG = l_enabled_flag
1141 and FS.id_flex_num = l_id_flex_num
1142 and FS.application_column_name = 'SEGMENT1';
1143 EXCEPTION
1144 WHEN NO_DATA_FOUND THEN
1145 G_CHECK_SEG_NUM := null;
1146 END;
1147
1148 END INVPUOPI;