[Home] [Help]
PACKAGE BODY: APPS.INV_ITEM_MSG
Source
1 PACKAGE BODY INV_ITEM_MSG AS
2 /* $Header: INVVIMSB.pls 120.3 2006/05/29 05:40:32 lparihar noship $ */
3
4
5 ---------------------- Package variables and constants -----------------------
6
7 G_PKG_NAME CONSTANT VARCHAR2(30) := 'INV_ITEM_MSG';
8
9 -- Datatype of the message record and table
10
11 TYPE Msg_Rec_type IS RECORD
12 (
13 Msg_Data VARCHAR2(2000)
14 , Msg_Name VARCHAR2(30)
15 , Transaction_Id NUMBER
16 , Column_Name VARCHAR2(30)
17 );
18
19 TYPE Msg_Tbl_type IS TABLE OF Msg_Rec_type
20 INDEX BY BINARY_INTEGER;
21
22 -- Global message table variable
23
24 g_Msg_Tbl Msg_Tbl_type;
25
26 -- Global variable holding the message count
27
28 g_Msg_Count NUMBER := 0;
29
30 -- Index used by the Get function to keep track of the last fetched message
31
32 g_Msg_Index NUMBER := 0;
33
34 -- Set message level to Error by default
35 --
36 g_Message_Level NUMBER := g_Level_Error;
37
38 -- Message mode (output control).
39 -- Valid values:
40 -- 'FILE'
41 -- 'CP_LOG'
42 -- 'CONSOLE'
43 --
44 g_Message_Mode VARCHAR2(30) := 'FILE';
45
46 /*
47 log file
48 IF (l_debug = 1) THEN
49 debug level
50 END IF;
51 IF (l_debug = 1) THEN
52 trace on/off
53 END IF;
54
55 INV_ITEM_OI_DEBUG_TRACE (yes/no)
56 INV_ITEM_OI_DEBUG_LEVEL (fatal, error, warning, debug, trace)
57 */
58 ------------------------------------------------------------------------------
59
60
61 --------------------------------- Initialize ---------------------------------
62
63 -- Usage Used by INV_ITEM_MSG API callers to intialize the
64 -- global message table.
65 -- Desc Clears the g_Msg_Tbl and resets all its global variables.
66 -- Except for the message level threshold.
67
68 PROCEDURE Initialize
69 IS
70 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
71 BEGIN
72
73 g_Msg_Tbl.DELETE;
74 g_Msg_Count := 0;
75 g_Msg_Index := 0;
76
77 END Initialize;
78
79 PROCEDURE Initialize_Error_Handler
80 IS
81 BEGIN
82 Error_Handler.Initialize;
83 Error_Handler.Set_BO_Identifier ('INV_ITEM');
84 END Initialize_Error_Handler;
85 ------------------------------------------------------------------------------
86
87
88 ----------------------------- set_Message_Level ------------------------------
89
90 PROCEDURE set_Message_Level (p_Msg_Level IN NUMBER)
91 IS
92 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
93 BEGIN
94
95 g_Message_Level := p_Msg_Level;
96
97 END set_Message_Level;
98 ------------------------------------------------------------------------------
99
100
101 ------------------------------ set_Message_Mode ------------------------------
102
103 FUNCTION set_Message_Mode (p_Mode IN VARCHAR2)
104 RETURN VARCHAR2
105 IS
106 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
107 BEGIN
108
109 g_Message_Mode := p_Mode;
110 RETURN (NULL);
111
112 /*
113 IF (p_Mode = 'FILE') THEN
114 g_Message_Mode := 'FILE';
115 RETURN (NULL);
116
117 IF (G_DIR IS NULL) THEN
118 select value
119 INTO G_DIR
120 from v$PARAMETER
121 where name = 'utl_file_dir';
122
123 if instr(G_DIR,',') > 0 then
124 G_DIR := substr(G_DIR,1,instr(G_DIR,',')-1);
125 end if;
126 END IF;
127
128 IF (G_FILE IS NULL) THEN
129 select substr('l'|| substr(to_char(sysdate,'MI'),1,1)
130 || lpad(BIS_debug_s.nextval,6,'0'),1,8) || '.BIS'
131 into G_FILE
132 from dual;
133
134 G_FILE_PTR := UTL_FILE.fopen(G_DIR, G_FILE, 'w');
135 END IF;
136
137 RETURN (G_DIR || '/' || g_file);
138
139 ELSIF (p_Mode = 'CONSOLE') THEN
140 g_Message_Mode := 'CONSOLE';
141 RETURN (NULL);
142 ELSE
143 g_Message_Mode := 'TABLE';
144 RETURN (NULL);
145 END IF;
146
147 EXCEPTION
148
149 WHEN others THEN
150 g_Message_Mode := 'TABLE';
151 RETURN (NULL);
152 */
153
154 END set_Message_Mode;
155
156
157 PROCEDURE set_Message_Mode (p_Mode IN VARCHAR2)
158 IS
159 l_file_ptr VARCHAR2(2000);
160 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
161 BEGIN
162
163 l_file_ptr := set_Message_Mode (p_Mode => p_Mode);
164
165 END set_Message_Mode;
166
167
168 --------------------------- Insert_Interface_Error ---------------------------
169
170 -- Private package procedure
171
172 PROCEDURE Insert_Interface_Error
173 (
174 p_Msg_Name IN VARCHAR2
175 , p_Msg_Text IN VARCHAR2
176 , p_transaction_id IN NUMBER
177 , p_column_name IN VARCHAR2
178 );
179 ------------------------------------------------------------------------------
180
181
182 -------------------------------- Add_Message ---------------------------------
183
184 -- Usage Used to add messages to the message table.
185 --
186 -- Desc Puts a message and tokens on the message dictionary stack,
187 -- reads the message off the message dictionary stack, and
188 -- writes it in an encoded format to the message table.
189 -- The message is appended at the bottom of the message table.
190
191 PROCEDURE Add_Message
192 ( p_Msg_Name IN VARCHAR2
193 , p_token1 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
194 , p_value1 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
195 , p_token2 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
196 , p_value2 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
197 , p_token3 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
198 , p_value3 IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
199 , p_translate IN VARCHAR2 DEFAULT fnd_api.g_FALSE
200 , p_transaction_id IN NUMBER DEFAULT fnd_api.g_MISS_NUM
201 , p_column_name IN VARCHAR2 DEFAULT NULL
202 )
203 IS
204 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
205
206 BEGIN
207
208 INVPUTLI.info('Add_Message: p_Msg_Name=' || p_Msg_Name);
209
210 --bis_debug_pub.debug_on;
211 --BIS_VG_UTIL.Add_Error_Message (...);
212 --inv_debug.message(p_Msg_Text);
213
214 FND_MESSAGE.Set_Name('INV', p_Msg_Name);
215 IF ( p_token1 <> fnd_api.g_MISS_CHAR ) THEN
216 FND_MESSAGE.Set_Token(p_token1, p_value1, FND_API.To_Boolean(p_translate));
217 END IF;
218 IF ( p_token2 <> fnd_api.g_MISS_CHAR ) THEN
219 FND_MESSAGE.Set_Token(p_token2, p_value2, FND_API.To_Boolean(p_translate));
220 END IF;
221 IF ( p_token3 <> fnd_api.g_MISS_CHAR ) THEN
222 FND_MESSAGE.Set_Token(p_token3, p_value3, FND_API.To_Boolean(p_translate));
223 END IF;
224
225 -- Increment message count
226
227 g_Msg_Count := g_Msg_Count + 1;
228
229 -- Add message in encoded format to the message table
230
231 g_Msg_Tbl( g_Msg_Count ).Msg_Data := FND_MESSAGE.Get_Encoded ;
232 g_Msg_Tbl( g_Msg_Count ).Msg_Name := p_Msg_Name ;
233 g_Msg_Tbl( g_Msg_Count ).Transaction_Id := p_transaction_id ;
234 g_Msg_Tbl( g_Msg_Count ).Column_Name := p_column_name ;
235
236 END Add_Message;
237 ------------------------------------------------------------------------------
238
239
240 ---------------------------------- Add_Error ---------------------------------
241
242 PROCEDURE Add_Error
243 ( p_Msg_Name IN VARCHAR2
244 , p_token IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
245 , p_value IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
246 , p_translate IN VARCHAR2 DEFAULT fnd_api.g_FALSE
247 )
248 IS
249 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
250 BEGIN
251
252 IF (g_Level_Error >= g_Message_Level) THEN
253 Add_Message
254 ( p_Msg_Name => p_Msg_Name
255 , p_token1 => p_token
256 , p_value1 => p_value
257 , p_translate => p_translate
258 );
259 END IF;
260
261 END Add_Error;
262 ------------------------------------------------------------------------------
263
264
265 --------------------------------- Add_Warning --------------------------------
266
267 PROCEDURE Add_Warning
268 ( p_Msg_Name IN VARCHAR2
269 , p_token IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
270 , p_value IN VARCHAR2 DEFAULT fnd_api.g_MISS_CHAR
271 , p_translate IN VARCHAR2 DEFAULT fnd_api.g_FALSE
272 )
273 IS
274 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
275 BEGIN
276
277 IF (g_Level_Warning >= g_Message_Level) THEN
278 Add_Message
279 ( p_Msg_Name => p_Msg_Name
280 , p_token1 => p_token
281 , p_value1 => p_value
282 , p_translate => p_translate
283 );
284 END IF;
285
286 END Add_Warning;
287 ------------------------------------------------------------------------------
288
289
290 ---------------------------- Add_Unexpected_Error ----------------------------
291
292 PROCEDURE Add_Unexpected_Error
293 ( p_Msg_Ctx IN INV_ITEM_MSG.Msg_Ctx_type
294 , p_Error_Text IN VARCHAR2
295 )
296 IS
297 -- l_Error_Text VARCHAR2(2000);
298 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
299 BEGIN
300
301 /*
302 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.g_MSG_LVL_UNEXP_ERROR) THEN
303
304 FND_MSG_PUB.Add_Exc_Msg
305 ( p_pkg_name => G_PKG_NAME
306 , p_procedure_name => g_api_name
307 , p_error_text => p_Error_Text
308 );
309 */
310 /*
311 IF ( Log_Mode = 'CP_LOG' ) THEN
312 l_Error_Text := SUBSTRB (p_Error_Text, 1,240);
313 ELSE
314 l_Error_Text := p_Error_Text;
315 END IF;
316 */
317
318 IF (g_Level_Unexpected >= g_Message_Level) THEN
319 Add_Message
320 ( p_Msg_Name => 'INV_ITEM_UNEXPECTED_ERROR'
321 , p_token1 => 'PKG_NAME'
322 , p_value1 => p_Msg_Ctx.Package_Name
323 , p_token2 => 'PROCEDURE_NAME'
324 , p_value2 => p_Msg_Ctx.Procedure_Name
325 , p_token3 => 'ERROR_TEXT'
326 , p_value3 => p_Error_Text
327 );
328 END IF;
329
330 END Add_Unexpected_Error;
331 ------------------------------------------------------------------------------
332
333
334 ----------------------------------- Debug ------------------------------------
335
336 PROCEDURE Debug
337 ( p_Msg_Ctx IN INV_ITEM_MSG.Msg_Ctx_type
338 , p_Msg_Text IN VARCHAR2
339 )
340 IS
341 -- l_msg_text VARCHAR2(2000);
342 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
343 BEGIN
344
345 -- l_msg_text := g_Package_Name || '.' || g_Procedure_Name ': ' p_Msg_Text;
346
347 -- Use Add_Message for debugging as well in order to have a consistent way
348 -- of getting all messages in encoded format irrespective of the message level.
349
350 IF (g_Level_Statement >= g_Message_Level) THEN
351 Add_Message
352 ( p_Msg_Name => 'INV_API_DEBUG_TEXT'
353 , p_token1 => 'PACKAGE_NAME'
354 , p_value1 => p_Msg_Ctx.Package_Name
355 , p_token2 => 'PROCEDURE_NAME'
356 , p_value2 => p_Msg_Ctx.Procedure_Name
357 , p_token3 => 'TEXT'
358 , p_value3 => p_Msg_Text
359 );
360 END IF;
361
362 END Debug;
363 ------------------------------------------------------------------------------
364
365
369 -- of messages in the message list.
366 ---------------------------------- Count_Msg ---------------------------------
367
368 -- Usage Used by API callers and developers to find the count
370 --
371 -- Desc Returns the value of g_Msg_Count.
372
373 FUNCTION Count_Msg
374 RETURN NUMBER
375 IS
376 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
377 BEGIN
378
379 RETURN g_Msg_Count;
380
381 END Count_Msg;
382
383
384 -------------------------------- Count_And_Get -------------------------------
385
386 -- Usage Used by API developers to find the count of messages
387 -- in the message table. If there is only one message in
388 -- the table it retrieves this message.
389
390 PROCEDURE Count_And_Get
391 ( p_encoded IN VARCHAR2 := FND_API.g_TRUE
392 , p_count OUT NOCOPY NUMBER
393 , p_data OUT NOCOPY VARCHAR2
394 )
395 IS
396 l_Msg_Index NUMBER := g_Msg_Index;
397 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
398 BEGIN
399
400 IF ( g_Msg_Count = 1 ) THEN
401
402 g_Msg_Index := 1; -- G_FIRST
403
404 IF ( FND_API.To_Boolean( p_encoded ) ) THEN
405 p_data := g_Msg_Tbl( g_Msg_Index ).Msg_Data;
406 ELSE
407 FND_MESSAGE.Set_Encoded ( g_Msg_Tbl( g_Msg_Index ).Msg_Data );
408 p_data := FND_MESSAGE.Get;
409 END IF;
410 ELSE
411 p_data := NULL;
412 END IF; -- (g_Msg_Count = 1)
413
414 p_count := g_Msg_Count ;
415
416 EXCEPTION
417
418 WHEN no_data_found THEN
419
420 -- Revert g_Msg_Index and return
421 g_Msg_Index := l_Msg_Index;
422
423 p_data := NULL;
424
425 END Count_And_Get;
426
427
428 -------------------------------- Write_Message -------------------------------
429
430 -- Usage Used to unload a message from the message table.
431 --
432
433 PROCEDURE Write_Message
434 ( p_msg_index IN NUMBER
435 )
436 IS
437 l_Msg_Index NUMBER := g_Msg_Index;
438 l_Msg_Name VARCHAR2(30);
439 l_msg_text VARCHAR2(2000);
440 l_transaction_id NUMBER;
441 l_column_name VARCHAR2(30);
442 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
443 BEGIN
444
445 -- Get message without token substitution
446 --l_msg_text := FND_MESSAGE.Get_String('INV', 'INV_CAT_SET_CAT_COMB');
447
448 IF ( p_msg_index = G_NEXT ) THEN
449 g_Msg_Index := g_Msg_Index + 1;
450 ELSIF ( p_msg_index = G_PREVIOUS ) THEN
451 g_Msg_Index := g_Msg_Index - 1;
452 ELSIF ( p_msg_index = G_FIRST ) THEN
453 g_Msg_Index := 1;
454 ELSIF ( p_msg_index = G_LAST ) THEN
455 g_Msg_Index := g_Msg_Count;
456 ELSE
457 g_Msg_Index := p_msg_index;
458 END IF;
459
460 -- Get translated message text
461 BEGIN
462
463 FND_MESSAGE.Set_Encoded( g_Msg_Tbl( g_Msg_Index ).Msg_Data );
467 WHEN no_data_found THEN
464 l_msg_text := FND_MESSAGE.Get;
465
466 EXCEPTION
468 -- No more messages, revert g_Msg_Index and return
469 g_Msg_Index := l_Msg_Index;
470
471 --l_msg_text := NULL;
472 RETURN;
473 END;
474
475 IF (g_Message_Mode = 'CP_LOG') THEN
476
477 -- Write the message into concurrent request log file,
478 -- and insert into the interface error table
479
480 FND_FILE.Put_Line (FND_FILE.Log, SUBSTRB(l_msg_text, 1,240));
481
482 l_Msg_Name := g_Msg_Tbl( g_Msg_Index ).Msg_Name ;
483 l_transaction_id := g_Msg_Tbl( g_Msg_Index ).Transaction_Id ;
484
485 IF ( l_transaction_id = fnd_api.g_MISS_NUM ) THEN
486 l_transaction_id := NULL;
487 END IF;
488
489 l_column_name := g_Msg_Tbl( g_Msg_Index ).Column_Name ;
490
491 Insert_Interface_Error
492 (
493 p_Msg_Name => l_Msg_Name
494 , p_Msg_Text => l_msg_text
495 , p_transaction_id => l_transaction_id
496 , p_column_name => l_column_name
497 );
498
499 ELSIF (g_Message_Mode = 'FILE') THEN
500 -- Write the message into concurrent request log file,
501 FND_FILE.Put_Line (FND_FILE.Log, SUBSTRB(l_msg_text, 1,240));
502 ELSIF (g_Message_Mode = 'PLM_LOG') THEN
503
504 -- Write into Error handler.
505 Error_Handler.Add_Error_Message
506 (p_message_text => l_msg_text
507 ,p_message_type => 'E');
508
509 ELSIF (g_Message_Mode = 'CONSOLE') THEN
510 null;
511 --DBMS_OUTPUT.put_line ( SUBSTRB( REPLACE(l_msg_text, chr(0), ' '), 1,250) );
512
513 --Bug: 2451359 Added the PLSQL message_mode.
514 ELSIF (g_Message_Mode = 'PLSQL') THEN
515 FND_MESSAGE.Set_Encoded( g_Msg_Tbl( g_Msg_Index ).Msg_Data );
516 FND_MSG_PUB.Add;
517
518 END IF; -- g_Message_Mode
519
520 /* to get message text
521 l_msg_text := FND_MSG_PUB.Get ( p_msg_index => FND_MSG_PUB.g_LAST
522 , p_encoded => FND_API.g_FALSE
523 );
524
525 -- Reset current message index value back to 0
526 FND_MSG_PUB.Reset (FND_MSG_PUB.g_FIRST);
527 */
528
529 END Write_Message;
530
531
532 --------------------------------- Write_List ---------------------------------
533
534 -- Usage Used to write all messages from the message table.
535 --
536
537 PROCEDURE Write_List
538 ( p_delete IN BOOLEAN DEFAULT TRUE
539 )
540 IS
541 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
542 BEGIN
543 FOR i IN 1 .. g_Msg_Count LOOP -- g_Msg_Tbl.COUNT
544 Write_Message (i);
545 END LOOP;
546
547 -- Clear the message table and reset its global variables
548
549 IF ( p_delete ) THEN
550 Initialize;
551 END IF;
552
553 END Write_List;
554
555
559 (
556 --------------------------- Insert_Interface_Error ---------------------------
557
558 PROCEDURE Insert_Interface_Error
560 p_Msg_Name IN VARCHAR2
561 , p_Msg_Text IN VARCHAR2
562 , p_transaction_id IN NUMBER
563 , p_column_name IN VARCHAR2
564 )
565 IS
566 l_Msg_Name VARCHAR2(30) := SUBSTRB(p_Msg_Name, 1,30);
567 l_Msg_Text VARCHAR2(240) := SUBSTRB(p_Msg_Text, 1,240);
568 l_Sysdate DATE := SYSDATE;
569 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
570 BEGIN
571
572 INSERT INTO mtl_interface_errors
573 (
574 TRANSACTION_ID
575 , UNIQUE_ID
576 , ORGANIZATION_ID
577 , TABLE_NAME
578 , COLUMN_NAME
579 , MESSAGE_NAME
580 , ERROR_MESSAGE
581 , CREATION_DATE
582 , CREATED_BY
583 , LAST_UPDATE_DATE
584 , LAST_UPDATED_BY
585 , LAST_UPDATE_LOGIN
586 , PROGRAM_APPLICATION_ID
587 , PROGRAM_ID
588 , REQUEST_ID
589 , PROGRAM_UPDATE_DATE
590 )
591 VALUES
592 (
593 p_transaction_id
594 , mtl_system_items_interface_s.NEXTVAL
595 , g_Organization_Id
596 , g_Table_Name
597 , p_column_name
598 , l_Msg_Name
599 , l_Msg_Text
600 , l_Sysdate
601 , g_User_id
602 , l_Sysdate
603 , g_User_id
604 , g_Login_id
605 , g_Prog_appid
606 , g_Prog_id
607 , g_Request_id
608 , l_Sysdate
609 );
610
611 EXCEPTION
612
613 WHEN others THEN
614 FND_FILE.Put_Line( FND_FILE.Log, SUBSTRB('Unexpected error in INV_ITEM_MSG.Insert_Interface_Error: ' || SQLERRM, 1,240) );
615
616 END Insert_Interface_Error;
617 ------------------------------------------------------------------------------
618
619 -- PROCEDURE Get
620 --
621
622 PROCEDURE Get
623 ( p_msg_index IN NUMBER := G_NEXT ,
624 p_encoded IN VARCHAR2 := 'T' ,
625 p_data OUT NOCOPY VARCHAR2 ,
626 p_msg_index_out OUT NOCOPY NUMBER
627 )
628 IS
629 l_msg_index NUMBER := G_msg_index;
630 BEGIN
631
632 IF p_msg_index = G_NEXT THEN
633 G_msg_index := G_msg_index + 1;
634 ELSIF p_msg_index = G_FIRST THEN
635 G_msg_index := 1;
636 ELSIF p_msg_index = G_PREVIOUS THEN
637 G_msg_index := G_msg_index - 1;
638 ELSIF p_msg_index = G_LAST THEN
639 G_msg_index := G_msg_count ;
640 ELSE
641 G_msg_index := p_msg_index ;
642 END IF;
643
644
645 IF FND_API.To_Boolean( p_encoded ) THEN
646 FND_MESSAGE.Set_Encoded( g_Msg_Tbl( g_Msg_Index ).Msg_Data );
647 p_data := FND_MESSAGE.Get;
648 END IF;
649
650 p_msg_index_out := G_msg_index;
651
652 EXCEPTION
653
654 WHEN NO_DATA_FOUND THEN
655
656 -- No more messages, revert G_msg_index and return NULL;
657
658 G_msg_index := l_msg_index;
659
660 p_data := NULL;
661 p_msg_index_out := NULL;
662
663 END Get;
664
665 ------------------------------------------------------------------------------
666 -- FUNCTION Get
667 --
668
669 FUNCTION Get
670 ( p_msg_index IN NUMBER := G_NEXT ,
671 p_encoded IN VARCHAR2 := 'T'
672 )
673 RETURN VARCHAR2
674 IS
675 l_data VARCHAR2(2000) ;
676 l_msg_index_out NUMBER ;
677 BEGIN
678
679 Get
680 ( p_msg_index ,
681 p_encoded ,
682 l_data ,
683 l_msg_index_out
684 );
685
686 RETURN l_data ;
687
688 END Get;
689 ------------------------------------------------------------------------------
690
691 END INV_ITEM_MSG;