[Home] [Help]
PACKAGE BODY: APPS.EAM_METER_READINGS_JSP
Source
1 package body EAM_METER_READINGS_JSP AS
2 /* $Header: EAMMRRJB.pls 115.8 2002/11/19 23:53:49 aan ship $ */
3 G_PKG_NAME CONSTANT VARCHAR2(30) := 'EAM_METER_READINGS_JSP';
4
5 -------------------------------------------------------------------------------
6 -- check if work order has mandatory meter reading
7 FUNCTION has_mandatory_meter_reading( p_wip_entity_id in number) RETURN VARCHAR2
8 IS
9 -- return if job has mandatory meter reading, wrapper function
10 ret BOOLEAN;
11 BEGIN
12 ret := eam_meters_util.has_mandatory_meter_reading(p_wip_entity_id);
13 IF ret THEN
14 return 'Y';
15 ELSE
16 return 'N';
17 END IF;
18 END has_mandatory_meter_reading;
19
20 -------------------------------------------------------------------------------
21 -- check if meter is mandatory
22 FUNCTION is_meter_reading_mandatory( p_wip_entity_id in number, p_meter_id in number) RETURN VARCHAR2
23 IS
24 -- return if job has mandatory meter reading, wrapper function
25 ret BOOLEAN;
26 BEGIN
27 ret := eam_meters_util.is_meter_reading_mandatory(p_wip_entity_id, p_meter_id);
28 IF ret THEN
29 return 'Y';
30 ELSE
31 return 'N';
32 END IF;
33 END is_meter_reading_mandatory;
34
35 -------------------------------------------------------------------------------
36 -- get the last reading's meter reading id of a meter
37 FUNCTION get_latest_meter_reading_id( p_meter_id in number) RETURN NUMBER
38 IS
39 -- return if job has mandatory meter reading, wrapper function
40 l_meter_reading_id NUMBER;
41 l_last_reading_date date;
42 BEGIN
43
44 l_meter_reading_id := null;
45
46 -- fix for bug 2112310. Adding following two select statements for better performance
47 select max(mr4.current_reading_date) into l_last_reading_date
48 from eam_meter_readings mr4
49 where mr4.meter_id = p_meter_id;
50
51 select max(meter_reading_id) as meter_reading_id into l_meter_reading_id
52 from eam_meter_readings
53 where meter_id = p_meter_id and
54 current_reading_date = l_last_reading_date;
55
56 /* COMMENTING DUE TO BUG 2112310
57 -- first get the greatest reading date
58 SELECT max(mr5.meter_reading_id) as meter_reading_id
59 into l_meter_reading_id
60 FROM
61 eam_meter_readings mr5,
62 (select max(mr4.current_reading_date) as last_reading_date
63 from eam_meter_readings mr4
64 where mr4.meter_id = p_meter_id
65 group by mr4.meter_id
66 ) mr3
67 WHERE mr5.meter_id = p_meter_id
68 and mr5.current_reading_date = mr3.last_reading_date
69 GROUP BY mr5.meter_id;
70 END COMMENTING DUE TO BUG 2112310
71 */
72
73 return l_meter_reading_id;
74 END get_latest_meter_reading_id;
75
76
77 -------------------------------------------------------------------------
78 --- insert a meter reading row into eam_meter_readings table
79 -------------------------------------------------------------------------
80 procedure insert_row
81 (
82 p_meter_id IN NUMBER
83 ,p_current_reading IN NUMBER
84 ,p_current_reading_date IN DATE
85 ,p_reset_flag IN VARCHAR2
86 ,p_life_to_date_reading IN NUMBER
87 ,p_wip_entity_id IN NUMBER
88 ,p_description IN VARCHAR2
89 ) IS
90
91 l_reading_id NUMBER;
92
93 BEGIN
94
95 select eam_meter_readings_s.nextval
96 into l_reading_id
97 from dual;
98
99 insert into eam_meter_readings
100 (
101 meter_reading_id,
102 meter_id,
103 current_reading,
104 current_reading_date,
105 reset_flag,
106 life_to_date_reading,
107 wip_entity_id,
108 description,
109 creation_date,
110 created_by,
111 last_update_date,
112 last_updated_by
113 ) values
114 (
115 l_reading_id,
116 p_meter_id,
117 p_current_reading,
118 p_current_reading_date,
119 p_reset_flag,
120 p_life_to_date_reading,
121 p_wip_entity_id,
122 p_description,
123 sysdate,
124 g_created_by,
125 sysdate,
126 g_last_updated_by
127 );
128 -- EXCEPTION WHEN OTHERS THEN
129
130 END insert_row;
131
132 -------------------------------------------------------------------------
133 -- caculate current reading and current life to date reading
134 -------------------------------------------------------------------------
135 procedure get_current_reading_data
136 (
137 p_reading IN NUMBER
138 ,p_reading_change IN NUMBER
139 ,p_reset_flag IN VARCHAR2
140 ,p_meter_direction IN NUMBER
141 ,p_before_reading IN NUMBER
142 ,p_before_ltd_reading IN NUMBER
143 ,p_after_reading IN NUMBER
144 ,p_after_ltd_reading IN NUMBER
145 ,p_reading_date IN DATE
146 ,p_meter_name IN VARCHAR2
147 ,x_current_reading OUT NOCOPY NUMBER
148 ,x_current_ltd_reading OUT NOCOPY NUMBER
149 ,p_mtr_warning_shown IN OUT NOCOPY VARCHAR2
150 -- ,x_return_status OUT VARCHAR2
151 -- ,x_msg_count OUT NUMBER
152 -- ,x_msg_data OUT VARCHAR2
153 ) IS
154
155 l_current_reading NUMBER;
156 l_current_ltd_reading NUMBER;
157 l_change NUMBER;
158 l_ltd_change_before NUMBER; -- the amount to the next reading
159 l_ltd_change_after NUMBER; -- the amount to the next reading
160 l_return_status VARCHAR2(250);
161 l_range_from VARCHAR2(250);
162 l_range_to VARCHAR2(250);
163 l_range_tmp VARCHAR2(250);
164
165 BEGIN
166 l_current_reading := null;
167 l_current_ltd_reading := null;
168
169 l_return_status := FND_API.G_RET_STS_SUCCESS;
170
171 -- get current reading and life to date reading
172 if(nvl(p_reset_flag, 'N') = 'Y') then
173 -- reset
174 if( p_reading is null or p_reading_change is not null) then
175 -- reset only need reading field
176 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_RESET_FIELDS'
177 ,p_token1 => 'METER_NAME', p_value1 => p_meter_name);
178 l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
179 -- can reset to anything
180 /* elsif( (nvl(p_meter_direction, 0) < 1 or nvl(p_meter_direction, 0) > 2) ) then
181 -- or
182 -- (nvl(p_meter_direction, 0) = 1 and p_reading > nvl(p_before_reading, 0)) or
183 -- (nvl(p_meter_direction, 0) = 2 and p_reading < nvl(p_before_reading, 0)) ) then
184 -- why bother?
185 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WRR_RESET_WHY');
186 l_return_status := FND_API.G_RET_STS_UNEXP_ERROR; */
187 else
188 -- done!
189 l_current_reading := p_reading;
190 l_current_ltd_reading := p_before_ltd_reading; -- don't reset ltd
191 end if;
192 else
193 -- not reset
194 if (p_reading is not null) then
195 l_current_reading := p_reading;
196 l_current_ltd_reading := p_reading - nvl(p_before_reading, 0) + nvl(p_before_ltd_reading, 0);
197 else
198 l_current_reading := nvl(p_before_reading, 0) + p_reading_change;
199 l_current_ltd_reading := nvl(p_before_ltd_reading, 0) + p_reading_change;
200 end if;
201 -- if both not null , and not reset , check for confliction
202 if(p_reading is not null and p_reading_change is not null and
203 p_reading - nvl(p_before_reading, 0) <> p_reading_change) then
204 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATA_CONFLICT'
205 ,p_token1 => 'METER_NAME', p_value1 => p_meter_name);
206 l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
207 end if;
208
209 -- no problem?
210 if( l_return_status = FND_API.G_RET_STS_SUCCESS) then
211 -- check ltd changes?
212 l_change := l_current_ltd_reading - nvl(p_before_ltd_reading, 0);
213 l_ltd_change_before := 0;
214 if( p_before_ltd_reading is not null) then
215 l_ltd_change_before := l_current_ltd_reading - p_before_ltd_reading;
216 end if;
217 l_ltd_change_after := 0;
218 if(p_after_ltd_reading is not null) then
219 l_ltd_change_after := p_after_ltd_reading - l_current_ltd_reading;
220 end if;
221
222 if( (nvl(p_meter_direction, 0)=1 and (l_ltd_change_before<0 or l_ltd_change_after<0))
223 or (nvl(p_meter_direction, 0)=2 and (nvl(l_ltd_change_before, -1)>0 or l_ltd_change_after>0)) ) then
224 -- not correct
225 if( p_reading is not null) then -- inform reading range
226 l_range_from := '';
227 l_range_to := '';
228 if( p_before_ltd_reading is not null) then
229 l_range_from := l_current_reading - l_ltd_change_before;
230 end if;
231 if( p_after_ltd_reading is not null) then
232 l_range_to := l_current_reading + l_ltd_change_after;
233 end if;
234 -- swap if is descending direction
235 if( nvl(p_meter_direction, 0) = 2 ) then
236 l_range_tmp := l_range_from;
237 l_range_from := l_range_to;
238 l_range_to := l_range_tmp;
239 end if;
240 --baroy
241 --If the warning has already been shown, then don't show again
242 if(p_mtr_warning_shown <> 'Y') then
243 eam_execution_jsp.add_message(
244 p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_READING_RANGE'
245 ,p_token1 => 'FROM', p_value1 => l_range_from
246 ,p_token2 => 'TO', p_value2 => l_range_to
247 ,p_token3 => 'METER_NAME', p_value3 => p_meter_name
248 );
249 p_mtr_warning_shown := 'Y';
250 end if;
251 --baroy
252 else -- inform the change range
253 l_range_from := '0';
254 l_range_to := '';
255 if( p_after_ltd_reading is not null) then
256 --l_range_to := l_ltd_change_before + l_ltd_change_after;
257 l_range_to := p_after_ltd_reading - p_before_ltd_reading;
258 end if;
259 -- swap if is descending direction
260 if( nvl(p_meter_direction, 0) = 2 ) then
261 l_range_tmp := l_range_from;
262 l_range_from := l_range_to;
263 l_range_to := l_range_tmp;
264 end if;
265 eam_execution_jsp.add_message(
266 p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_CHANGE_RANGE'
267 ,p_token1 => 'FROM', p_value1 => l_range_from
268 ,p_token2 => 'TO', p_value2 => l_range_to
269 ,p_token3 => 'METER_NAME', p_value3 => p_meter_name
270 );
271 end if;
272 l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
273 end if;
274
275 end if;
276 end if;
277
278 x_current_reading := l_current_reading;
279 x_current_ltd_reading := l_current_ltd_reading;
280 END get_current_reading_data;
281
282 -------------------------------------------------------------------------
283 -- check asset and meter associating
284 -------------------------------------------------------------------------
285 procedure check_asset_meter_association
286 (
287 p_meter_id IN NUMBER
288 ,p_wip_entity_id IN NUMBER
289 ,p_org_id IN NUMBER := NULL
290 ,p_asset_number IN VARCHAR2 := NULL
291 ,p_asset_group_id IN NUMBER := NULL
292 ,x_return_status OUT NOCOPY VARCHAR2
293 ,x_msg_count OUT NOCOPY NUMBER
294 ,x_msg_data OUT NOCOPY VARCHAR2
295 ) IS
296
297 l_org_id NUMBER;
298 l_asset_number VARCHAR2(250);
299 l_asset_group_id NUMBER;
300
301 BEGIN
302 eam_debug.init_err_stack('eam_execution_jsp.add_meter_reading');
303
304 -- not standalone? (can standalone have a wip_entity_id??)
305 if (p_wip_entity_id is not null) then
306 -- get the info for validation, probablly not useful
307 select organization_id, asset_number, asset_group_id
308 into l_org_id, l_asset_number, l_asset_group_id
309 from wip_discrete_jobs
310 where wip_entity_id = p_wip_entity_id;
311
312 if( SQL%NOTFOUND) then -- wip_entity_id not found, should not happen.
313 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_NOT_FOUND');
314 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
315 elsif (l_org_id is null or l_asset_number is null or l_asset_group_id is null) then
316 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_DATA_NULL');
317 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
318 elsif ( nvl(p_org_id, l_org_id) <> l_org_id or
319 nvl(p_asset_number, l_asset_number)<> l_asset_number or
320 nvl(p_asset_group_id, l_asset_group_id) <> l_asset_group_id ) then
321 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_DATA_NULL');
322 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
323 end if;
324 null;
325 elsif (p_org_id is null or p_asset_number is null or p_asset_group_id is null) then
326 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_MRR_DATA_MISS');
327 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
328 end if;
329
330 EXCEPTION WHEN OTHERS THEN
331 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.CHECK_ASSET_METER_ASSOCIATION',
332 p_procedure_name => EAM_DEBUG.G_err_stack);
333 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
334 END check_asset_meter_association;
335
336 --------------------------------------------------------------------------------------
337 -- get the reading that is just before/after the current reading date
338 -- we need to know the previous reading data and next reading data to do validation
339 --------------------------------------------------------------------------------------
340 procedure get_adjacent_reading
341 (
342 p_before IN VARCHAR2 := FND_API.G_TRUE
343 ,p_meter_id IN NUMBER
344 ,p_reading_date IN DATE
345 ,x_reading_id OUT NOCOPY NUMBER
346 ,x_reading_date OUT NOCOPY DATE
347 ,x_reading OUT NOCOPY NUMBER
348 ,x_ltd_reading OUT NOCOPY NUMBER
349 ) IS
350
351 l_reading_date DATE;
352 l_reading NUMBER;
353 l_ltd_reading NUMBER;
354 l_reading_id NUMBER;
355
356 BEGIN
357
358 l_reading_date := null; -- probablly not necessory
359 l_reading_id := null;
360 l_reading := null;
361 l_ltd_reading := null;
362
363 if( FND_API.TO_BOOLEAN(p_before)) then
364 select max(current_reading_date)
365 into l_reading_date
366 from eam_meter_readings
367 where meter_id = p_meter_id and
368 current_reading_date <= p_reading_date -- use <= here
369 group by meter_id;
370 else
371 select min(current_reading_date)
372 into l_reading_date
373 from eam_meter_readings
374 where meter_id = p_meter_id and
375 current_reading_date > p_reading_date -- interesting, use >
376 group by meter_id;
377 end if;
381 select max(meter_reading_id)
378
379 if(l_reading_date is not null) then
380 -- should always success, just in case that two reading have the same date
382 into l_reading_id
383 from eam_meter_readings
384 where meter_id = p_meter_id and current_reading_date = l_reading_date
385 group by meter_id;
386
387 select life_to_date_reading, current_reading
388 into l_ltd_reading, l_reading
389 from eam_meter_readings
390 where meter_reading_id = l_reading_id;
391 end if;
392
393 x_reading_id := l_reading_id;
394 x_reading_date := l_reading_date;
395 x_reading := l_reading;
396 x_ltd_reading := l_ltd_reading;
397
398 EXCEPTION WHEN OTHERS THEN
399 x_reading_id := l_reading_id;
400 x_reading_date := l_reading_date;
401 x_reading := l_reading;
402 x_ltd_reading := l_ltd_reading;
403
404 END get_adjacent_reading;
405
406 ------------------------------------------------------------------------------------
407 -- record a meter reading data
408 ------------------------------------------------------------------------------------
409 procedure add_meter_reading
410 ( p_api_version IN NUMBER := 1.0
411 ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
412 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
413 ,p_validate_only IN VARCHAR2 := FND_API.G_TRUE
414 ,p_record_version_number IN NUMBER := NULL
415 ,x_return_status OUT NOCOPY VARCHAR2
416 ,x_msg_count OUT NOCOPY NUMBER
417 ,x_msg_data OUT NOCOPY VARCHAR2
418 ,p_wip_entity_id IN NUMBER -- data
419 ,p_meter_id IN NUMBER
420 ,p_reading_date IN DATE
421 ,p_reading IN NUMBER
422 ,p_reading_change IN NUMBER
423 ,p_reset_flag IN VARCHAR2
424 ,p_mtr_warning_shown IN OUT NOCOPY VARCHAR2
425 ) IS
426
427 l_api_name CONSTANT VARCHAR(30) := 'Complete_Workorder';
428 l_api_version CONSTANT NUMBER := 1.0;
429 l_return_status VARCHAR2(250);
430 l_error_msg_code VARCHAR2(250);
431 l_msg_count NUMBER;
432 l_msg_data VARCHAR2(250);
433 l_err_code VARCHAR2(250);
434 l_err_stage VARCHAR2(250);
435 l_err_stack VARCHAR2(250);
436 l_data VARCHAR2(250);
437 l_msg_index_out NUMBER;
438
439 l_meter_name VARCHAR2(250);
440 l_meter_direction NUMBER;
441 l_effective_date_from DATE;
442 l_effective_date_to DATE;
443 l_reading_date DATE; -- the most recent reading date till now
444 l_reading NUMBER;
445 l_ltd_reading NUMBER;
446
447 -- backdate reading validation
448 l_before_reading_id NUMBER; -- meter reading id
449 l_before_reading_date DATE; -- the last reading just before (<=) the p_reading_date
450 l_before_reading NUMBER;
451 l_before_ltd_reading NUMBER;
452 l_after_reading_id NUMBER; -- the next reading just after (>) the p_reading_date
453 l_after_reading_date DATE;
454 l_after_reading NUMBER;
455 l_after_ltd_reading NUMBER;
456
457 BEGIN
458
459 IF p_commit = FND_API.G_TRUE THEN
460 SAVEPOINT add_meter_reaing;
461 END IF;
462
463 eam_debug.init_err_stack('eam_execution_jsp.add_meter_reading');
464
465 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
466 p_api_version,
467 l_api_name,
468 g_pkg_name)
469 THEN
470 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
471 END IF;
472
473 IF FND_API.TO_BOOLEAN(p_init_msg_list)
474 THEN
475 FND_MSG_PUB.initialize;
476 END IF;
477
478 x_return_status := FND_API.G_RET_STS_SUCCESS;
479
480 -- validation logic goes here (mostly)
481
482 BEGIN
483 -- get the meter info ...
484 select meter_name, value_change_dir, from_effective_date, to_effective_date
485 into l_meter_name, l_meter_direction, l_effective_date_from, l_effective_date_to
486 from eam_meters
487 where meter_id = p_meter_id;
488
489 EXCEPTION WHEN OTHERS THEN
490 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_NOT_FOUND'
491 ,p_token1 => 'METER_ID', p_value1 => l_meter_name);
492 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
493 END;
494
495 -- value check
496 if(p_reading is null and p_reading_change is null) then
497 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_FIELD_REQUIRED'
498 ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
499 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
500 end if;
501
502 IF(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
503
504 if (p_reading_date is null) then
505 -- no reading date
506 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_NULL'
507 ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
511 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_BEYOND'
508 x_return_status := FND_API.G_RET_STS_ERROR;
509 elsif (p_reading_date > sysdate) then
510 -- futhure reading
512 ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
513 x_return_status := FND_API.G_RET_STS_ERROR;
514 elsif ( p_reading_date < nvl(l_effective_date_from, p_reading_date -1)
515 or p_reading_date > nvl(l_effective_date_to, sysdate) ) then
516 -- not in the meter's effective date range
517 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_EXPIRED'
518 ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
519 x_return_status := FND_API.G_RET_STS_ERROR;
520 else -- check reading
521
522 get_adjacent_reading(
523 p_before => FND_API.G_TRUE,
524 p_meter_id => p_meter_id,
525 p_reading_date => p_reading_date,
526 x_reading_id => l_before_reading_id,
527 x_reading_date => l_before_reading_date,
528 x_reading => l_before_reading,
529 x_ltd_reading => l_before_ltd_reading);
530
531 get_adjacent_reading(
532 p_before => FND_API.G_FALSE,
533 p_meter_id => p_meter_id,
534 p_reading_date => p_reading_date,
535 x_reading_id => l_after_reading_id,
536 x_reading_date => l_after_reading_date,
537 x_reading => l_after_reading,
538 x_ltd_reading => l_after_ltd_reading);
539
540 if( l_before_reading_date = p_reading_date ) then
541 -- reading at this time already exists
542 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_EXIST'
543 ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
544 x_return_status := FND_API.G_RET_STS_ERROR;
545 else
546 eam_meter_readings_jsp.get_current_reading_data(
547 p_reading => p_reading,
548 p_reading_change => p_reading_change,
549 p_reset_flag => p_reset_flag,
550 p_meter_direction => l_meter_direction,
551 p_before_reading => l_before_reading,
552 p_before_ltd_reading => l_before_ltd_reading,
553 p_after_reading => l_after_reading,
554 p_after_ltd_reading => l_after_ltd_reading,
555 p_reading_date => p_reading_date,
556 p_meter_name => l_meter_name,
557 x_current_reading => l_reading,
558 x_current_ltd_reading => l_ltd_reading,
559 p_mtr_warning_shown => p_mtr_warning_shown);
560 end if;
561 end if;
562 END IF; -- if(x_return_status = fnd_api.g_ret_success)
563
564 -- if validate not passed then raise error
565 l_msg_count := FND_MSG_PUB.count_msg;
566 IF l_msg_count = 1 THEN
567 eam_execution_jsp.Get_Messages
568 (p_encoded => FND_API.G_FALSE,
569 p_msg_index => 1,
570 p_msg_count => l_msg_count,
571 p_msg_data => nvl(l_msg_data,FND_API.g_MISS_CHAR),
572 p_data => l_data,
573 p_msg_index_out => l_msg_index_out);
574 x_msg_count := l_msg_count;
575 x_msg_data := l_msg_data;
576 ELSE
577 x_msg_count := l_msg_count;
578 END IF;
579
580 IF l_msg_count > 0 THEN
581 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
582 RAISE FND_API.G_EXC_ERROR;
583 END IF;
584
585 -- otherwise, ready to make the changes
586 -- Fields: p_meter_id, l_reading, l_ltd_reading, p_reset_flag, l_reading_date,
587 -- p_wip_entity_id
588
589 insert_row(
590 p_meter_id => p_meter_id
591 ,p_current_reading => l_reading
592 ,p_current_reading_date => p_reading_date
593 ,p_reset_flag => p_reset_flag
594 ,p_life_to_date_reading => l_ltd_reading
595 ,p_wip_entity_id => p_wip_entity_id
596 ,p_description => null
597 );
598
599 IF FND_API.TO_BOOLEAN(P_COMMIT) THEN
600 COMMIT WORK;
601 END IF;
602
603 EXCEPTION WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
604 IF p_commit = FND_API.G_TRUE THEN
605 ROLLBACK TO add_meter_reading;
606 END IF;
607
608 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
609 p_procedure_name => EAM_DEBUG.G_err_stack);
610 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
611 WHEN FND_API.G_EXC_ERROR THEN
612 IF p_commit = FND_API.G_TRUE THEN
613 ROLLBACK TO add_meter_reading;
614 END IF;
615
616 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
617 p_procedure_name => EAM_DEBUG.G_err_stack);
618 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
619 WHEN OTHERS THEN
620 IF p_commit = FND_API.G_TRUE THEN
621 ROLLBACK TO add_meter_reading;
622 END IF;
623
624 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
625 p_procedure_name => EAM_DEBUG.G_err_stack);
626
627 eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_EXCEPTION'
628 ,p_token1 => 'MESSAGE', p_value1 => SQLERRM);
629 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
630
631 END add_meter_reading;
632
633 end EAM_METER_READINGS_JSP;