DBA Data[Home] [Help]

PACKAGE BODY: APPS.INVPUOPI

Source


1 PACKAGE BODY INVPUOPI   AS
2 /* $Header: INVPUP1B.pls 120.7.12010000.2 2009/03/02 21:35:56 sanmani 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
99   ,p_segment6       OUT NOCOPY   VARCHAR2
100   ,p_segment7       OUT NOCOPY   VARCHAR2
101   ,p_segment8       OUT NOCOPY   VARCHAR2
102   ,p_segment9       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 (
244 item_number varchar2,
245 item_id     number,
246 trans_id number,
247 org_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)),
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)),
393    segment15 = DECODE(seg_value(15),NULL,segment15,seg_value(15)),
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);
414 
411        return(SQLCODE);
412 
413 END mtl_pr_parse_item_number;
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
550          AND tmp_value(pos) IS NOT  NULL
551          AND (INSTR(tmp_value(i),'\',-1) =   LENGTH(tmp_value(i)))
552          LOOP
553 
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
568           END  IF;
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);
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    pos := 1  ;
588    for n in G_SEGMENTS_USED.FIRST..G_SEGMENTS_USED.LAST loop
589         seg_value(G_SEGMENTS_USED(n)) := tmp_value(pos);
590         pos := pos   + 1;
591    end loop;
592 
593    --Start  :3632767 Code to suport \. in item number
594    IF flex_code = 'MSTK' THEN
595       FOR i IN pos   ..tmp_value.count LOOP
596          IF tmp_value(i) IS NOT NULL THEN
597        seg_value(ind)   := seg_value(ind) ||delimiter||tmp_value(i);
598          END IF;
599       END LOOP;
600    END IF;
601    --End :3632767 Code to suport \. in item number
602 
603    /* search for the matched segment values record */
604 
605    /*
606    ** since we do not support dynamic SQL at this moment, so
607    ** we search for different table, based   on the flex code
608    */
609 
610    statement_num := 7;
611 
612    if flex_code = 'MSTK' then
613       IF l_inv_debug_level IN(101, 102) THEN
614          INVPUTLI.info('INVPUP1.mtl_pr_parse_flex_name :verifying in MSII table' ||flex_name);
615       END IF;
616 
617       select INVENTORY_ITEM_ID
618       into flex_id
619       from MTL_SYSTEM_ITEMS_INTERFACE
620       where ORGANIZATION_ID = org_id
621       and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
622       and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
623       and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
624       and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
625       and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
626       and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
627       and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
628       and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
629       and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
630       and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
631       and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
632       and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
633       and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
634       and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
635       and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
636       and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
637       and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
638       and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
639       and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
640       and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20))
641       --Bug: 6192567 process_flag = 1
642       and process_flag IN (1,2) and inventory_item_id is NOT NULL
643       and rownum = 1;   --Bug:3340808,3531430
644 
645    else if  flex_code = 'MTLL' then
646       select INVENTORY_LOCATION_ID
647       into flex_id
648       from MTL_ITEM_LOCATIONS
649       where ORGANIZATION_ID = org_id
650       and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
651       and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
652       and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
653       and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
654       and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
655       and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
656       and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
657       and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
658       and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
659       and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
660       and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
661       and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
662       and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
663       and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
664       and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
665       and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
666       and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
667       and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
668       and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
669       and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20));
670 
671    else if  flex_code = 'MCAT' then
672       select CATEGORY_ID
676       and NVL(segment1,' ') = DECODE(seg_value(1),NULL,' ',seg_value(1))
673       into flex_id
674       from mtl_categories_b
675       where structure_id = struct_id
677       and NVL(segment2,' ') = DECODE(seg_value(2),NULL,' ',seg_value(2))
678       and NVL(segment3,' ') = DECODE(seg_value(3),NULL,' ',seg_value(3))
679       and NVL(segment4,' ') = DECODE(seg_value(4),NULL,' ',seg_value(4))
680       and NVL(segment5,' ') = DECODE(seg_value(5),NULL,' ',seg_value(5))
681       and NVL(segment6,' ') = DECODE(seg_value(6),NULL,' ',seg_value(6))
682       and NVL(segment7,' ') = DECODE(seg_value(7),NULL,' ',seg_value(7))
683       and NVL(segment8,' ') = DECODE(seg_value(8),NULL,' ',seg_value(8))
684       and NVL(segment9,' ') = DECODE(seg_value(9),NULL,' ',seg_value(9))
685       and NVL(segment10,' ') = DECODE(seg_value(10),NULL,' ',seg_value(10))
686       and NVL(segment11,' ') = DECODE(seg_value(11),NULL,' ',seg_value(11))
687       and NVL(segment12,' ') = DECODE(seg_value(12),NULL,' ',seg_value(12))
688       and NVL(segment13,' ') = DECODE(seg_value(13),NULL,' ',seg_value(13))
689       and NVL(segment14,' ') = DECODE(seg_value(14),NULL,' ',seg_value(14))
690       and NVL(segment15,' ') = DECODE(seg_value(15),NULL,' ',seg_value(15))
691       and NVL(segment16,' ') = DECODE(seg_value(16),NULL,' ',seg_value(16))
692       and NVL(segment17,' ') = DECODE(seg_value(17),NULL,' ',seg_value(17))
693       and NVL(segment18,' ') = DECODE(seg_value(18),NULL,' ',seg_value(18))
694       and NVL(segment19,' ') = DECODE(seg_value(19),NULL,' ',seg_value(19))
695       and NVL(segment20,' ') = DECODE(seg_value(20),NULL,' ',seg_value(20));
696 
697    end if;  /* MCAT  */
698    end if;  /* MTLL  */
699    end if;  /* MSTK  */
700 
701     RETURN (0);
702 
703 EXCEPTION
704 
705    WHEN  others THEN
706       flex_id := NULL;
707       err_text := SUBSTRB('INVPUOPI.flex_name' || statement_num   || SQLERRM, 1,240);
708       IF l_inv_debug_level IN(101, 102)   THEN
709     INVPUTLI.info(   err_text);
710       END IF;
711 
712       RETURN (SQLCODE);
713 
714 END mtl_pr_parse_flex_name;
715 
716 /*
717 ** Search for the matched item number in the MSTK key flexfield   view
718 ** and return the item id, if found.
719 */
720 
721 FUNCTION mtl_pr_trans_prod_item
722 (
723 item_number_in    varchar2,
724 org_id         number,
725 item_id_out  out  NOCOPY number,
726 err_text     out  NOCOPY varchar2
727 )
728 RETURN INTEGER
729 IS
730    delimiter   varchar2(10);
731    min_segment varchar2(32);
732    seg1     varchar2(40);
733    dummy    number;
734    num_of_segments    number;
735    min_seg_num  number;
736    check_seg_num   number;
737 BEGIN
738    --Bug: 4654433
739    delimiter := G_SEGMENT_DELIMITER;
740    num_of_segments   := G_NUM_OF_SEGMENTS;
741 
742    select min(FS.application_column_name),min(FS.segment_num)
743      into min_segment,min_seg_num
744    from FND_ID_FLEX_SEGMENTS FS
745    where FS.APPLICATION_ID = l_application_id
746      and FS.id_flex_code = l_id_flex_code
747      and FS.ENABLED_FLAG = l_enabled_flag
748      and FS.id_flex_num = l_id_flex_num;
749 
750       /* Start of Bugfix 4082723  Anmurali */
751    BEGIN
752       select FS.segment_num into check_seg_num
753       from FND_ID_FLEX_SEGMENTS FS
754       where FS.APPLICATION_ID = l_application_id
755         and FS.id_flex_code = l_id_flex_code
756         and FS.ENABLED_FLAG = l_enabled_flag
757         and FS.id_flex_num =  l_id_flex_num
758         and FS.application_column_name = 'SEGMENT1';
759    EXCEPTION
760 
761       WHEN NO_DATA_FOUND THEN
762             check_seg_num := null;
763    END;
764 
765 
766 
767     if (min_segment = 'SEGMENT1' and check_seg_num = min_seg_num) then
768 /*
769 ** this  is being done because we assume  most customers will define
770 ** flex  combination using atleast segment1.  Atleast they will benefit
771 ** from  the index on org_id+segment1.  Else the   statemnt does a   range
772 ** scan  based on org id   (since the index on segment1 is  suppressed as
773 ** item_number is a concatenation of columns) and is not selective enough
774 **
775 ** 31-MAY-95: Added new if clause to not look at delimiter if
776 ** num_of_segments = 1; Fix for  bug 285002
777 ** This  is to avoid tripping over in the case where there is only one
778 ** segment and that segment value contains the delimiter character
779 */
780        if (num_of_segments > 1) then
781           dummy :=   instr(item_number_in, delimiter);
782           if (dummy = 0) then
783         seg1 := item_number_in;
784           else
785         seg1 := substr(item_number_in, 1, dummy - 1);
786           end if;
787        elsif (num_of_segments = 1)  then
788           seg1 := item_number_in;
789        end  if;
790 /* If condition   added for bug 2935221
791    For customers who have segment1 as null, the use of segment1   doesn't
792    return the inventroy_item_id. This is taken care of in the if-else condition
793 */
794        if (seg1 is   null) then
795           select inventory_item_id
796       into item_id_out
797           from mtl_system_items_b_kfv
798           where organization_id = org_id
802       into item_id_out
799           and concatenated_segments = item_number_in;
800        else
801       select inventory_item_id
803       from mtl_system_items_b_kfv
804       where segment1 = seg1
805         and organization_id = org_id
806         and concatenated_segments = item_number_in;
807        end  if;
808    else
809 
810        select inventory_item_id
811          into item_id_out
812        from mtl_system_items_b_kfv
813        where organization_id = org_id
814          and concatenated_segments  = item_number_in;
815 
816    end if;
817 
818    RETURN (0);
819 
820 EXCEPTION
821 
822    WHEN  OTHERS THEN
823       item_id_out := NULL;
824       err_text := substr('INVPUOPI.trans_item: ' || SQLERRM, 1,240);
825       RETURN (SQLCODE);
826 
827 END mtl_pr_trans_prod_item;
828 
829 
830 FUNCTION mtl_pr_trans_org_id
831 (
832 org_code varchar2,
833 org_id out  NOCOPY number,
834 err_text out   NOCOPY varchar2
835 )
836 RETURN INTEGER
837 is
838 begin
839 
840    --4932347: Using MTL_PARAMETERS instead of org_org
841    select organization_id
842    into org_id
843    from mtl_parameters
844    where organization_code = org_code;
845 
846     return(0);
847 
848 exception
849 
850    WHEN OTHERS THEN
851        org_id := NULL;
852        err_text :=   substr('INVPUOPI.trans_org: ' || SQLERRM , 1, 240);
853        return(SQLCODE);
854 
855 end mtl_pr_trans_org_id;
856 
857 
858 FUNCTION mtl_pr_trans_template_id
859 (
860 templ_name   varchar2,
861 templ_id out NOCOPY number,
862 err_text out NOCOPY varchar2
863 )
864 RETURN INTEGER
865 IS
866 BEGIN
867    select template_id
868    into templ_id
869    from mtl_item_templates
870    where template_name = templ_name;
871 
872     return(0);
873 
874 exception
875 
876    WHEN OTHERS THEN
877        templ_id :=   NULL;
878        err_text :=   substr('INVPUOPI.parse_template: ' || SQLERRM, 1, 240);
879        return(SQLCODE);
880 
881 END mtl_pr_trans_template_id;
882 
883 
884 FUNCTION mtl_log_interface_err
885 (
886 org_id      number,
887 user_id     number,
888 login_id number,
889 prog_appid  number,
890 prog_id     number,
891 req_id      number,
892 trans_id number,
893 error_text  varchar2,
894   p_column_name      VARCHAR2 := NULL,
895 tbl_name varchar2,
896 msg_name varchar2,
897 err_text       OUT  NOCOPY VARCHAR2
898 )
899 RETURN INTEGER
900 IS
901    dumm_status     number;
902    translated_text  fnd_new_messages.message_text%TYPE;  --3699144
903    l_sysdate       DATE  :=  SYSDATE;
904    l_inv_debug_level NUMBER := INVPUTLI.get_debug_level;  --Bug: 4667452
905 BEGIN
906 
907    IF (msg_name   = 'INV_IOI_ERR') OR (msg_name =  'INV_ICOI_ERROR')
908        OR (msg_name like 'BOM%') OR (msg_name like 'CST%')
909        OR (msg_name like 'INV_CAT_SET_NO_DEFAULT_CAT')THEN
910       translated_text := error_text;
911    ELSE
912       dumm_status := INVUPD2B.get_message(msg_name, translated_text);
913    END IF;
914 
915    IF l_inv_debug_level IN(101,  102) THEN
916       INVPUTLI.info('INVPUOPI.mtl_log_interface_err: msg_name =   '||msg_name);
917    END IF;
918 
919  -- Bug  4052362  To display the entire error message - Anmurali
920 
921    INSERT INTO mtl_interface_errors
922    (
923    TRANSACTION_ID,
924    UNIQUE_ID,
925    ORGANIZATION_ID,
926    LAST_UPDATE_DATE,
927    LAST_UPDATED_BY,
928    CREATION_DATE,
929    CREATED_BY,
930    LAST_UPDATE_LOGIN,
931    COLUMN_NAME,
932    TABLE_NAME,
933    MESSAGE_NAME,
934    ERROR_MESSAGE,
935    REQUEST_ID,
936    PROGRAM_APPLICATION_ID,
937    PROGRAM_ID,
938    PROGRAM_UPDATE_DATE
939    )
940    VALUES
941    (
942    trans_id,
943    mtl_system_items_interface_s.NEXTVAL,
944    org_id,
945    l_sysdate,
946    user_id,
947    l_sysdate,
948    user_id,
949    login_id,
950    p_column_name,
951    tbl_name,
952    msg_name,
953    SUBSTRB(translated_text, 1,2000),
954    req_id,
955    prog_appid,
956    prog_id,
957    l_sysdate
958    );
959 
960    -- Output error information into the   log file
961   if (to_number(nvl(fnd_profile.value('CONC_REQUEST_ID'),0)) <>   0) then
962    FND_FILE.PUT_LINE(FND_FILE.LOG,'************************************') ;
963    FND_FILE.PUT_LINE(FND_FILE.LOG,'TRANSACTION ID : '  || trans_id);
964    FND_FILE.PUT_LINE(FND_FILE.LOG,'ORGANIZATION ID : ' || org_id);
965    FND_FILE.PUT_LINE(FND_FILE.LOG,'TABLE NAME : '  || tbl_name);
966    FND_FILE.PUT_LINE(FND_FILE.LOG,'COLUMN NAME : ' || p_column_name);
967    FND_FILE.PUT_LINE(FND_FILE.LOG,'MESSAGE NAME : '  ||  msg_name);
968    FND_FILE.PUT_LINE(FND_FILE.LOG,'ERROR MESSAGE : ' ||  substrb(translated_text,1,2000));
969  end if  ;
970 
971   IF l_inv_debug_level IN(101, 102) THEN
972      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: TRANSACTION   ID : '   || trans_id);
976      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: MESSAGE NAME : '  || msg_name);
973      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: ORGANIZATION ID : ' || org_id);
974      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: TABLE NAME : '  || tbl_name);
975      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: COLUMN NAME   : ' || p_column_name);
977      INVPUTLI.info('INVPUOPI.mtl_log_interface_err: ERROR MESSAGE : ' || substrb(translated_text,1,2000));
978   END IF;
979 
980    RETURN (0);
981 
982 EXCEPTION
983 
984    WHEN  others THEN
985       err_text := SUBSTRB('INVPUOPI.mtl_log_interface_err: ' ||   SQLERRM, 1,240);
986       RETURN (SQLCODE);
987 
988 END mtl_log_interface_err;
989 
990 --------------------------------------------------------------------
991 -- To convert item_number to Item_id
992 -----------------------------------------------------------------
993 FUNCTION mtl_pr_parse_item_name
994 (
995 item_number_in    varchar2,
996 item_id_out  out  NOCOPY number,
997 err_text     out  NOCOPY varchar2
998 )
999 RETURN INTEGER
1000 IS
1001    delimiter   varchar2(10);
1002    min_segment varchar2(32);
1003    seg1     varchar2(40);
1004    dummy    number;
1005    num_of_segments   number;
1006    min_seg_num number;
1007    check_seg_num  number;
1008 
1009 l_application_id number(10) :=   401;
1010 l_id_flex_code varchar2(4) := 'MSTK';
1011 l_enabled_flag varchar2(1) := 'Y';
1012 l_id_flex_num  number(15)  := 101 ;
1013 BEGIN
1014 
1015         --Bug: 4654433
1016    delimiter       := G_SEGMENT_DELIMITER;
1017    num_of_segments   := G_NUM_OF_SEGMENTS;
1018         min_segment     := G_MIN_SEGMENT;
1019    min_seg_num     := G_MIN_SEG_NUM;
1020    check_seg_num   := G_CHECK_SEG_NUM;
1021 
1022        /* Start   of Bugfix 4082723  Anmurali */
1023 
1024    if (min_segment   = 'SEGMENT1' and check_seg_num = min_seg_num) then
1025 
1026       if (num_of_segments > 1) then
1027           dummy :=   instr(item_number_in, delimiter);
1028           if (dummy = 0) then
1029         seg1 := item_number_in;
1030           else
1031         seg1 := substr(item_number_in, 1, dummy - 1);
1032           end if;
1033        elsif (num_of_segments = 1)  then
1034           seg1 := item_number_in;
1035        end  if;
1036 
1037       if (seg1 is null) then
1038           select inventory_item_id
1039        into item_id_out
1040        from mtl_system_items_b_kfv
1041       where concatenated_segments = item_number_in
1042       group by inventory_item_id; -- Bug: 3447718 - added group by to   get distinct inventory_item_id
1043       else
1044           select inventory_item_id
1045        into item_id_out
1046        from mtl_system_items_b_kfv
1047       where segment1 = seg1
1048         and concatenated_segments = item_number_in
1049       group by inventory_item_id; -- Bug: 3447718 - added group by to   get distinct inventory_item_id
1050       end if;
1051 
1052    else
1053        select inventory_item_id
1054          into item_id_out
1055        from mtl_system_items_b_kfv
1056        where concatenated_segments  = item_number_in
1057        group by inventory_item_id;  -- Bug:  3447718  - added  group by to get   distinct inventory_item_id
1058 
1059    end if;
1060 
1061    RETURN (0);
1062 
1063 EXCEPTION
1064 
1065    WHEN  OTHERS THEN
1066       item_id_out := NULL;
1067       err_text := substr('INVPUOPI.trans_item: ' || SQLERRM, 1,240);
1068       RETURN (SQLCODE);
1069 
1070 END mtl_pr_parse_item_name;
1071 
1072 /*------------------------------*/
1073 /* Package initialization block  */
1074 /*------------------------------*/
1075 
1076 BEGIN
1077 
1078    SELECT FT.concatenated_segment_delimiter
1079    INTO  G_SEGMENT_DELIMITER
1080    FROM  fnd_id_flex_structures FT
1081    WHERE FT.id_flex_code = l_id_flex_code
1082      AND FT.APPLICATION_ID = l_application_id
1083      AND FT.ID_FLEX_NUM = l_id_flex_num;
1084 
1085    SELECT max(FS.segment_num)
1086    INTO  G_SEGMENTS_INUSE
1087    FROM  FND_ID_FLEX_SEGMENTS FS
1088    WHERE FS.APPLICATION_ID = l_application_id
1089      AND FS.id_flex_code = l_id_flex_code
1090      AND FS.ENABLED_FLAG = l_enabled_flag
1091      AND FS.id_flex_num = l_id_flex_num;
1092 
1093    SELECT to_number(substr(application_column_name,8)), segment_num BULK COLLECT INTO G_SEGMENTS_USED, G_SEGMENT_NUMS_USED
1094    FROM  FND_ID_FLEX_SEGMENTS
1095    WHERE APPLICATION_ID = l_application_id
1096       AND id_flex_code = l_id_flex_code
1097       AND ENABLED_FLAG = l_enabled_flag
1098       AND id_flex_num = l_id_flex_num
1099    ORDER BY segment_num;
1100 
1101    SELECT COUNT(*) INTO G_NUM_OF_SEGMENTS
1102    FROM  FND_ID_FLEX_SEGMENTS FS
1103    WHERE FS.APPLICATION_ID = l_application_id
1104      AND FS.id_flex_code = l_id_flex_code
1105      AND FS.ENABLED_FLAG = l_enabled_flag
1106      AND FS.id_flex_num =  l_id_flex_num;
1107 
1108    SELECT min(FS.application_column_name),min(FS.segment_num)
1109    INTO G_MIN_SEGMENT,G_MIN_SEG_NUM
1110    FROM FND_ID_FLEX_SEGMENTS FS
1111    WHERE FS.APPLICATION_ID = l_application_id
1112      AND FS.id_flex_code = l_id_flex_code
1113      AND FS.ENABLED_FLAG = l_enabled_flag
1114      AND FS.id_flex_num = l_id_flex_num;
1115 
1116    BEGIN
1117       select FS.segment_num into G_CHECK_SEG_NUM
1118       from FND_ID_FLEX_SEGMENTS FS
1122    and FS.id_flex_num = l_id_flex_num
1119       where FS.APPLICATION_ID = l_application_id
1120         and FS.id_flex_code = l_id_flex_code
1121    and FS.ENABLED_FLAG = l_enabled_flag
1123    and FS.application_column_name = 'SEGMENT1';
1124    EXCEPTION
1125       WHEN NO_DATA_FOUND THEN
1126          G_CHECK_SEG_NUM := null;
1127    END;
1128 
1129 END INVPUOPI;