[Home] [Help]
PACKAGE BODY: APPS.PSB_MESSAGE_S
Source
1 PACKAGE BODY PSB_MESSAGE_S AS
2 /* $Header: PSBSTMSB.pls 120.3 2004/12/06 17:35:45 viraghun ship $ */
3
4 l_new_line_char VARCHAR2(2000) := FND_GLOBAL.Newline;
5
6 FUNCTION Get ( p_msg_index IN NUMBER ,
7 p_encoded IN VARCHAR2 := FND_API.G_TRUE )
8 RETURN VARCHAR2 IS
9
10 l_msg_buf VARCHAR2(2000) ;
11
12 BEGIN
13
14 l_msg_buf := FND_MSG_PUB.Get(p_msg_index,
15 p_encoded);
16
17 return l_msg_buf ;
18
19 END Get ;
20
21 FUNCTION SUBSTRB_GET RETURN VARCHAR2 IS
22
23 l_msg_buf VARCHAR2(2000) ;
24
25 BEGIN
26
27 l_msg_buf := SUBSTRB(FND_MESSAGE.Get, 1, 255);
28
29 return l_msg_buf ;
30
31 END ;
32
33 FUNCTION SUBSTRB_GET (p_msg_index IN NUMBER,
34 p_encoded IN VARCHAR2)
35 RETURN VARCHAR2 IS
36
37 l_msg_buf VARCHAR2(2000);
38
39 BEGIN
40
41 l_msg_buf := substrb(FND_MSG_PUB.Get (p_msg_index => p_msg_index,
42 p_encoded => p_encoded), 1, 255);
43
44 return l_msg_buf ;
45
46 END ;
47
48
49
50 PROCEDURE Print_Error ( p_mode IN VARCHAR2,
51 p_print_header IN VARCHAR2 := FND_API.G_TRUE )
52 IS
53
54 l_msg_count NUMBER ;
55 l_msg_data VARCHAR2(2000) ;
56 l_msg_buf VARCHAR2(2000) ;
57
58 BEGIN
59
60 -- Validate the p_mode parameter.
61 IF p_mode NOT IN (FND_FILE.LOG, FND_FILE.OUTPUT) THEN
62 --
63 Fnd_Message.Set_Name ('PSB', 'PSB_INVALID_ARGUMENT') ;
64 Fnd_Message.Set_Token('ROUTINE', 'Print_Error' ) ;
65 l_msg_buf := Fnd_Message.Get ;
66 FND_FILE.Put_Line( FND_FILE.LOG, l_msg_buf ) ;
67 RETURN ;
68 --
69 END IF ;
70
71 -- Get number of messages to print.
72 FND_MSG_PUB.Count_And_Get ( p_count => l_msg_count ,
73 p_data => l_msg_data ) ;
74
75 -- If no messages to print, simply return (bug#3190892).
76 IF l_msg_count = 0 THEN
77 RETURN ;
78 ELSE
79 -- Print standard header is asked for.
80 IF FND_API.to_Boolean( p_print_header ) THEN
81 FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_FAILURE_HEADER');
82 l_msg_buf := substrb_get ;
83 FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
84 END IF ;
85 --
86
87 /* No longer applicable.
88 if l_msg_count = 0 then
89 FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
90 l_msg_buf := substrb_get ;
91 FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
92 */
93
94 IF l_msg_count = 1 then
95
96 FND_MESSAGE.Set_Encoded(l_msg_data);
97 l_msg_buf := substrb_get ;
98 FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
99
100 ELSIF l_msg_count > 1 then
101
102 -- Get all messages from the message stack.
103 FOR i IN 1..l_msg_count
104 LOOP
105 --
106 IF i = 1 THEN
107 l_msg_buf := substrb_get
108 ( p_msg_index => FND_MSG_PUB.G_FIRST,
109 p_encoded => FND_API.G_FALSE ) ;
110 ELSE
111 l_msg_buf := substrb_get
112 ( p_msg_index => FND_MSG_PUB.G_NEXT,
113 p_encoded => FND_API.G_FALSE ) ;
114 END IF;
115 --
116 FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
117 --
118 END LOOP ;
119 -- End getting all messages from the message stack.
120
121 END IF;
122
123 END IF ;
124
125 END Print_Error ;
126
127
128 PROCEDURE Insert_Error( p_source_process IN VARCHAR2,
129 p_process_id IN NUMBER,
130 p_msg_count IN NUMBER,
131 p_msg_data IN VARCHAR2,
132 p_desc_sequence IN VARCHAR2 := FND_API.G_FALSE
133 )
134 IS
135
136
137 l_msg_count NUMBER := p_msg_count ;
138 l_msg_data VARCHAR2(2000) := p_msg_data ;
139 l_msg_buf VARCHAR2(2000) ;
140 l_conc_req_id NUMBER := NVL(FND_GLOBAL.CONC_REQUEST_ID, FND_API.G_MISS_NUM);
141 l_user_id NUMBER := FND_GLOBAL.USER_ID ;
142 l_seq_number NUMBER := 0 ;
143
144 BEGIN
145
146 if FND_API.to_Boolean( p_desc_sequence ) then
147 l_seq_number := l_msg_count + 1 ;
148 end if;
149
150 if l_msg_count = 1 then
151 FND_MESSAGE.Set_Encoded(l_msg_data);
152 l_msg_buf := FND_MESSAGE.Get;
153 elsif l_msg_count = 0 then
154 FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
155 l_msg_buf := FND_MESSAGE.Get ;
156 elsif l_msg_count > 1 then
157 for i in 1..l_msg_count loop
158
159 if i =1 then
160 l_msg_buf := FND_MSG_PUB.Get
161 (p_msg_index => FND_MSG_PUB.G_FIRST,
162 p_encoded => FND_API.G_FALSE);
163 else
164 l_msg_buf := FND_MSG_PUB.Get
165 (p_msg_index => FND_MSG_PUB.G_NEXT,
166 p_encoded => FND_API.G_FALSE);
167 end if;
168
169 if FND_API.to_Boolean( p_desc_sequence ) then
170 l_seq_number := l_seq_number - 1 ;
171 else
172 l_seq_number := i ;
173 end if ;
174
175 insert into PSB_ERROR_MESSAGES
176 (concurrent_request_id,
177 process_id,
178 source_process,
179 sequence_number,
180 description,
181 creation_date,
182 created_by)
183 values (l_conc_req_id,
184 p_process_id,
185 p_source_process,
186 l_seq_number,
187 l_msg_buf,
188 sysdate,
189 l_user_id);
190 end loop ;
191 end if;
192
193 if l_msg_count = 0 or l_msg_count = 1 then
194 insert into PSB_ERROR_MESSAGES
195 (concurrent_request_id,
196 process_id,
197 source_process,
198 sequence_number,
199 description,
200 creation_date,
201 created_by)
202 values (l_conc_req_id,
203 p_process_id,
204 p_source_process,
205 1,
206 l_msg_buf,
207 sysdate,
208 l_user_id);
209 end if;
210
211 END Insert_Error ;
212
213
214
215 PROCEDURE Print_Success IS
216
217 l_msg_buf VARCHAR2(2000) ;
218
219 BEGIN
220
221 FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_SUCCESS');
222 l_msg_buf := substrb_get;
223 FND_FILE.Put_Line( FND_FILE.OUTPUT, l_msg_buf );
224
225 END Print_Success ;
226
227
228 PROCEDURE Get_Error_Message( p_print_header IN VARCHAR2 := FND_API.G_TRUE,
229 p_msg_string OUT NOCOPY VARCHAR2)
230 IS
231 --
232 l_msg_count NUMBER ;
233 l_msg_data VARCHAR2(2000) ;
234 l_msg_buf VARCHAR2(2000) ;
235 --
236 BEGIN
237
238 if FND_API.to_Boolean( p_print_header ) then
239 -- Standard program failure message.
240 FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_FAILURE_HEADER');
241 l_msg_buf := substrb_get;
242 end if;
243
244 -- Count total number of messages.
245 FND_MSG_PUB.Count_And_Get( p_count => l_msg_count,
246 p_data => l_msg_data );
247
248 if l_msg_count = 1 then
249 --
250 FND_MESSAGE.Set_Encoded(l_msg_data);
251 l_msg_buf := l_msg_buf || l_new_line_char || substrb_get ;
252 --
253 elsif l_msg_count > 1 then
254 --
255 for i in 1..l_msg_count loop
256
257 if i = 1 then
258 l_msg_buf := l_msg_buf || l_new_line_char ||
259 substrb_get
260 ( p_msg_index => FND_MSG_PUB.G_FIRST,
261 p_encoded => FND_API.G_FALSE
262 );
263 else
264 l_msg_buf := l_msg_buf || l_new_line_char ||
265 substrb_get
266 ( p_msg_index => FND_MSG_PUB.G_NEXT,
267 p_encoded => FND_API.G_FALSE
268 );
269 end if;
270 end loop ;
271 elsif l_msg_count = 0 then
272 --
273 FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
274 l_msg_buf := l_msg_buf || l_new_line_char || substrb_get ;
275 --
276 end if;
277
278 p_msg_string := l_msg_buf ;
279
280 END Get_Error_Message ;
281
282
283 PROCEDURE Get_Success_Message( p_msg_string OUT NOCOPY VARCHAR2 )
284 IS
285 BEGIN
286 --
287 FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_SUCCESS');
288 p_msg_string := substrb_get ;
289 --
290 END ;
291
292
293 FUNCTION Get_Error_Stack ( p_msg_count NUMBER )
294 RETURN VARCHAR2
295 IS
296
297 l_msg_count NUMBER ;
298 l_msg_data VARCHAR2(2000) ;
299
300 -- The error stack in workflow supports VARCHAR2(4000).
301 -- Setting it to 3900 to leave space for function and procedure names.
302 l_error_message VARCHAR2(3900) := null ;
303
304 BEGIN
305
306 -- Check if messages exist or not.
307 IF p_msg_count IS NULL THEN
308 RETURN NULL ;
309 END IF;
310
311 -- Retrieve messages from the message stack.
312 FOR i IN 1..p_msg_count
313 LOOP
314 FND_MSG_PUB.Get( p_msg_index => i ,
315 p_encoded => FND_API.G_FALSE ,
316 p_data => l_msg_data ,
317 p_msg_index_out => l_msg_count
318 );
319
320 l_error_message := l_error_message || ' ' || l_msg_data ;
321
322 END LOOP;
323
324 RETURN l_error_message ;
325
326 EXCEPTION
327 WHEN value_error THEN
328
329 -- The probability of crossing limit of 3900 char is very low. Checking
330 -- for length for each message is inefficient. This code path should give
331 -- faster performance.
332 RETURN l_error_message ;
333
334 WHEN others THEN
335 RAISE ;
336 END Get_Error_Stack ;
337
338 /* Start bug no 4030864 */
339
340 PROCEDURE BATCH_INSERT_ERROR (p_source_process IN VARCHAR2,
341 p_process_id IN NUMBER)
342 IS
343 l_msg_count NUMBER;
344 l_msg_data VARCHAR2(3000);
345 l_msg_buf VARCHAR2(3000);
346 l_max_seq_no NUMBER;
347 l_seq_no NUMBER;
348 l_loop_process BOOLEAN;
349 l_conc_req_id NUMBER := NVL(FND_GLOBAL.CONC_REQUEST_ID, FND_API.G_MISS_NUM);
350 l_user_id NUMBER := FND_GLOBAL.USER_ID ;
351
352 -- cursor to fetch the maximum of sequence
353 CURSOR l_seq_csr
354 IS
355 SELECT max(sequence_number) seq_no
356 FROM psb_error_messages
357 WHERE process_id = p_process_id
358 AND source_process = p_source_process;
359
360 BEGIN
361 -- get the maximum sequence number
362 FOR l_seq_rec IN l_seq_csr
363 LOOP
364 l_max_seq_no := NVL(l_seq_rec.seq_no,0);
365 END LOOP;
366
367 fnd_msg_pub.count_and_get(
368 p_count => l_msg_count,
369 p_data => l_msg_data);
370
371 l_loop_process := FALSE;
372
373 FOR l_count IN 1..l_msg_count
374 LOOP
375 l_loop_process := TRUE;
376 l_seq_no := l_max_seq_no + l_count;
377
378 if l_count =1 then
379 if l_count = l_msg_count then
380 fnd_message.Set_Encoded(l_msg_data);
381 l_msg_buf := FND_MESSAGE.Get;
382 else
383 l_msg_buf := FND_MSG_PUB.Get
384 (p_msg_index => FND_MSG_PUB.G_FIRST,
385 p_encoded => FND_API.G_FALSE);
386 end if;
387 else
388 l_msg_buf := FND_MSG_PUB.Get
389 (p_msg_index => FND_MSG_PUB.G_NEXT,
390 p_encoded => FND_API.G_FALSE);
391 end if;
392
393 insert into PSB_ERROR_MESSAGES
394 (concurrent_request_id,
395 process_id,
396 source_process,
397 sequence_number,
398 description,
399 creation_date,
400 created_by
401 )
402 values
403 (
404 l_conc_req_id,
405 p_process_id,
406 p_source_process,
407 l_seq_no,
408 l_msg_buf,
409 sysdate,
410 l_user_id
411 );
412
413 END LOOP;
414
415 IF l_loop_process = FALSE then
416 FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
417 l_msg_buf := FND_MESSAGE.Get ;
418
419 insert into PSB_ERROR_MESSAGES
420 (concurrent_request_id,
421 process_id,
422 source_process,
423 sequence_number,
424 description,
425 creation_date,
426 created_by)
427 values
428 (l_conc_req_id,
429 p_process_id,
430 p_source_process,
431 1,
432 l_msg_buf,
433 sysdate,
434 l_user_id);
435
436 end if;
437
438 END;
439 /* End bug no 4030864 */
440
441
442 END PSB_MESSAGE_S;