1 PACKAGE BODY IGI_EFC_UPGRADE AS
2 -- $Header: igiefupb.pls 120.0.12010000.2 2009/04/24 08:17:28 gaprasad ship $
3
4 -- Stores the budget id
5 TYPE budget_type IS TABLE OF gl_budget_assignment_ranges.funding_budget_version_id%TYPE;
6
7 -- Stores the value SEGMENT_LOW and SEGMENT_HIGH of a particular segment
8 TYPE segment_range_rec IS RECORD (segment_low VARCHAR2(25),
9 segment_high VARCHAR2(25),
10 segment_number NUMBER,
11 data_type NUMBER,
12 budget_tab BUDGET_TYPE);
13
14 -- Array of segment ranges. Array index indicates the Segment number.
15 TYPE segment_range_type IS VARRAY(30) OF segment_range_rec;
16
17 -- Record corresponding to table gl_budget_assignment_ranges
18 TYPE budget_range_rec IS RECORD (range_id gl_budget_assignment_ranges.range_id%TYPE,
19 ledger_id gl_budget_assignment_ranges.ledger_id%TYPE,
20 segment_range_tab SEGMENT_RANGE_TYPE,
21 budget_tab BUDGET_TYPE);
22
23
24
25 -- Table of Budget Assignment Ranges. Corresponds to table
26 -- gl_budget_assignment_ranges
27 TYPE budget_range_type IS TABLE OF budget_range_rec;
28
29 -- Stores information for a particular segment. Used by Splitting and Merging
30 -- logic
31 TYPE segment_rec IS RECORD (index_number NUMBER,
32 segment_number NUMBER,
33 segment_high VARCHAR2(25),
34 segment_low VARCHAR2(25),
35 budget_tab BUDGET_TYPE,
36 data_type NUMBER);
37
38 -- Array of Segment Records. Used by Splitting and Merging logic.
39 TYPE segment_type IS TABLE OF segment_rec;
40
41 -- Array of Segment Records
42 TYPE segment_rec_index_type IS TABLE OF NUMBER;
43
44 -- PLSQL Table corresponding to IGI_UPG_GL_BUDORG_BC_OPTIONS
45 TYPE BC_OPTIONS_TAB IS TABLE OF IGI_UPG_GL_BUDORG_BC_OPTIONS%ROWTYPE;
46
47 -- Stores table of segment records
48 segment_tab SEGMENT_TYPE;
49
50 -- Stores table of budget records
51 budget_range_tab BUDGET_RANGE_TYPE;
52
53 -- g_debug_enable stores 0 or 1 and is used for logging purpose
54 g_debug_enabled NUMBER;
55
56 -- PLSQL record to store the Budget Organization that is processed
57 TYPE budget_entity_rec IS RECORD (budget_entity_id gl_budget_assignment_ranges.budget_entity_id%TYPE, ledger_id gl_budget_assignment_ranges.ledger_id%TYPE);
58
59 -- PLSQL record to store the list of Budget Organizations that are processed
60 TYPE budget_entity_type IS TABLE OF budget_entity_rec;
61
62 -- Stores the list of ledgers and entities upgraded by this script
63 -- This is used by the START_EFC_UPGRADE when the GL concurrent program
64 -- "Assign Assignment Ranges" is fired
65 budget_entity_tab budget_entity_type;
66
67
68 -- Procedure INSERT_ENTITY stores the list of ledgers and entities processed by
69 -- LOOP_AND_PROCESS. This is stored in the table budget_entity_tab.
70 -- This procedure ensures that duplicate entries are not inserted into the
71 -- table.
72 PROCEDURE INSERT_ENTITY(p_ledger_id gl_budget_assignment_ranges.budget_entity_id%TYPE,
73 p_entity_id gl_budget_assignment_ranges.ledger_id%TYPE,
74 errbuf OUT NOCOPY VARCHAR2,
75 retcode OUT NOCOPY NUMBER)
76
77 IS
78 l_exists BOOLEAN;
79 BEGIN
80
81 l_exists := FALSE;
82
83 IF budget_entity_tab.COUNT = 0 THEN
84 budget_entity_tab.extend(1);
85 budget_entity_tab(1).ledger_id := p_ledger_id;
86 budget_entity_tab(1).budget_entity_id := p_entity_id;
87 ELSE
88
89 FOR i IN 1..budget_entity_tab.COUNT LOOP
90 IF budget_entity_tab(i).ledger_id = p_ledger_id AND
91 budget_entity_tab(i).budget_entity_id = p_entity_id THEN
92 l_exists := TRUE;
93 EXIT;
94 END IF;
95 END LOOP;
96 IF NOT l_exists THEN
97 budget_entity_tab.extend(1);
98 budget_entity_tab(budget_entity_tab.COUNT).ledger_id := p_ledger_id;
99 budget_entity_tab(budget_entity_tab.COUNT).budget_entity_id := p_entity_id;
100 END IF;
101 END IF;
102
103 EXCEPTION
104 WHEN OTHERS THEN
105 fnd_file.put_line(fnd_file.log, 'Module: INSERT_ENTITY '||'Insertion failed '||SQLERRM);
106 errbuf := 'Module: INSERT_ENTITY '||'Insertion failed '||SQLERRM;
107 retcode := -1;
108 RETURN;
109 END INSERT_ENTITY;
110
111
112 -- Procedure PRINT_BUDGET_INFO produces the output for this program
113 -- This procedure accepts range_id as a parameter and
114 -- outputs the account range and the budgets associated to this account range
115 PROCEDURE PRINT_BUDGET_INFO (p_range_id NUMBER,
116 errbuf OUT NOCOPY VARCHAR2,
117 retcode OUT NOCOPY NUMBER)
118
119 IS
120 -- This cursor fetches the account range information
121 CURSOR C_UPG_GL_BUDGET_ASSIGNMENT (pp_range_id NUMBER)
122 IS
123 SELECT IGIGL.*,ent.NAME BUDGET_NAME,led.NAME LEDGER_NAME
124 FROM IGI_UPG_GL_BUDGET_ASSIGNMENT IGIGL,
125 gl_budget_entities ent,
126 GL_LEDGERS led
127 WHERE IGIGL.RANGE_ID = pp_range_id
128 AND IGIGL.budget_entity_id = ent.budget_entity_id
129 AND IGIGL.ledger_id = led.ledger_id
130 ;
131
132 -- This cursor fetches budgets associated to the give account range
133 CURSOR C_BC_OPTIONS (pp_range_id NUMBER)
134 IS
135 SELECT IGIBC.*,BV.BUDGET_NAME BUDGET_NAME
136 FROM IGI_UPG_GL_BUDORG_BC_OPTIONS IGIBC,
137 GL_BUDGET_VERSIONS BV
138 WHERE IGIBC.RANGE_ID = pp_range_id AND
139 IGIBC.FUNDING_BUDGET_VERSION_ID = BV.BUDGET_VERSION_ID
140 ;
141
142 -- Stores table of type C_BC_OPTIONS
143 TYPE IGI_BC_OPTIONS_TAB IS TABLE OF C_BC_OPTIONS%ROWTYPE;
144
145 -- Stores a record of type C_UPG_GL_BUDGET_ASSIGNMENT
146 lc_upg_gl_bud C_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
147
148 lc_bc_options IGI_BC_OPTIONS_TAB;
149
150 BEGIN
151 IF p_range_id IS NULL THEN
152 errbuf := 'Module: PRINT_BUDGET_INFO => '||'p_range_id is NULL';
153 retcode := -1;
154 RETURN;
155 END IF;
156 BEGIN
157
158 --The following logic opens the cursors and displays the necessary information
159
160 OPEN C_UPG_GL_BUDGET_ASSIGNMENT(p_range_id);
161 FETCH C_UPG_GL_BUDGET_ASSIGNMENT INTO lc_upg_gl_bud;
162 CLOSE C_UPG_GL_BUDGET_ASSIGNMENT;
163
164 fnd_file.put(fnd_file.output,lc_upg_gl_bud.LEDGER_NAME||' ');
165 fnd_file.put(fnd_file.output,lc_upg_gl_bud.BUDGET_NAME||' ');
166
167 fnd_file.put(fnd_file.output,lc_upg_gl_bud.CURRENCY_CODE||' ');
168
169 IF lc_upg_gl_bud.SEGMENT1_LOW IS NOT NULL THEN
170 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT1_LOW||'-');
171 END IF;
172
173 IF lc_upg_gl_bud.SEGMENT2_LOW IS NOT NULL THEN
174 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT2_LOW||'-');
175 END IF;
176
177 IF lc_upg_gl_bud.SEGMENT3_LOW IS NOT NULL THEN
178 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT3_LOW||'-');
179 END IF;
180
181 IF lc_upg_gl_bud.SEGMENT4_LOW IS NOT NULL THEN
182 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT4_LOW||'-');
183 END IF;
184
185 IF lc_upg_gl_bud.SEGMENT5_LOW IS NOT NULL THEN
186 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT5_LOW||'-');
187 END IF;
188
189 IF lc_upg_gl_bud.SEGMENT6_LOW IS NOT NULL THEN
190 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT6_LOW||'-');
191 END IF;
192
193 IF lc_upg_gl_bud.SEGMENT7_LOW IS NOT NULL THEN
194 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT7_LOW||'-');
195 END IF;
196
197 IF lc_upg_gl_bud.SEGMENT8_LOW IS NOT NULL THEN
198 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT8_LOW||'-');
199 END IF;
200
201 IF lc_upg_gl_bud.SEGMENT9_LOW IS NOT NULL THEN
202 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT9_LOW||'-');
203 END IF;
204
205 IF lc_upg_gl_bud.SEGMENT10_LOW IS NOT NULL THEN
206 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT10_LOW||'-');
207 END IF;
208
209 IF lc_upg_gl_bud.SEGMENT11_LOW IS NOT NULL THEN
210 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT11_LOW||'-');
211 END IF;
212
213 IF lc_upg_gl_bud.SEGMENT12_LOW IS NOT NULL THEN
214 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT12_LOW||'-');
215 END IF;
216
217 IF lc_upg_gl_bud.SEGMENT13_LOW IS NOT NULL THEN
218 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT13_LOW||'-');
219 END IF;
220
221 IF lc_upg_gl_bud.SEGMENT14_LOW IS NOT NULL THEN
222 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT14_LOW||'-');
223 END IF;
224
225 IF lc_upg_gl_bud.SEGMENT15_LOW IS NOT NULL THEN
226 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT15_LOW||'-');
227 END IF;
228
229 IF lc_upg_gl_bud.SEGMENT16_LOW IS NOT NULL THEN
230 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT16_LOW||'-');
231 END IF;
232
233 IF lc_upg_gl_bud.SEGMENT17_LOW IS NOT NULL THEN
234 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT17_LOW||'-');
235 END IF;
236
237 IF lc_upg_gl_bud.SEGMENT18_LOW IS NOT NULL THEN
238 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT18_LOW||'-');
239 END IF;
240 IF lc_upg_gl_bud.SEGMENT19_LOW IS NOT NULL THEN
241 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT19_LOW||'-');
242 END IF;
243
244 IF lc_upg_gl_bud.SEGMENT20_LOW IS NOT NULL THEN
245 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT20_LOW||'-');
246 END IF;
247
248 IF lc_upg_gl_bud.SEGMENT21_LOW IS NOT NULL THEN
249 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT21_LOW||'-');
250 END IF;
251
252 IF lc_upg_gl_bud.SEGMENT22_LOW IS NOT NULL THEN
253 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT22_LOW||'-');
254 END IF;
255
256 IF lc_upg_gl_bud.SEGMENT23_LOW IS NOT NULL THEN
257 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT23_LOW||'-');
258 END IF;
259
260 IF lc_upg_gl_bud.SEGMENT24_LOW IS NOT NULL THEN
261 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT24_LOW||'-');
262 END IF;
263
264 IF lc_upg_gl_bud.SEGMENT25_LOW IS NOT NULL THEN
265 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT25_LOW||'-');
266 END IF;
267
268 IF lc_upg_gl_bud.SEGMENT26_LOW IS NOT NULL THEN
269 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT26_LOW||'-');
270 END IF;
271
272 IF lc_upg_gl_bud.SEGMENT27_LOW IS NOT NULL THEN
273 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT27_LOW||'-');
274 END IF;
275
276 IF lc_upg_gl_bud.SEGMENT28_LOW IS NOT NULL THEN
277 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT28_LOW||'-');
278 END IF;
279
280 IF lc_upg_gl_bud.SEGMENT29_LOW IS NOT NULL THEN
281 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT29_LOW||'-');
282 END IF;
283
284 IF lc_upg_gl_bud.SEGMENT30_LOW IS NOT NULL THEN
285 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT30_LOW||'-');
286 END IF;
287
288 fnd_file.put(fnd_file.output,' to ');
289
290 IF lc_upg_gl_bud.SEGMENT1_HIGH IS NOT NULL THEN
291 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT1_HIGH||'-');
292 END IF;
293
294 IF lc_upg_gl_bud.SEGMENT2_HIGH IS NOT NULL THEN
295 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT2_HIGH||'-');
296 END IF;
297
298 IF lc_upg_gl_bud.SEGMENT3_HIGH IS NOT NULL THEN
299 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT3_HIGH||'-');
300 END IF;
301
302 IF lc_upg_gl_bud.SEGMENT4_HIGH IS NOT NULL THEN
303 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT4_HIGH||'-');
304 END IF;
305
306 IF lc_upg_gl_bud.SEGMENT5_HIGH IS NOT NULL THEN
307 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT5_HIGH||'-');
308 END IF;
309
310 IF lc_upg_gl_bud.SEGMENT6_HIGH IS NOT NULL THEN
311 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT6_HIGH||'-');
312 END IF;
313
314 IF lc_upg_gl_bud.SEGMENT7_HIGH IS NOT NULL THEN
315 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT7_HIGH||'-');
316 END IF;
317
318 IF lc_upg_gl_bud.SEGMENT8_HIGH IS NOT NULL THEN
319 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT8_HIGH||'-');
320 END IF;
321
322 IF lc_upg_gl_bud.SEGMENT9_HIGH IS NOT NULL THEN
323 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT9_HIGH||'-');
324 END IF;
325
326 IF lc_upg_gl_bud.SEGMENT10_HIGH IS NOT NULL THEN
327 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT10_HIGH||'-');
328 END IF;
329
330 IF lc_upg_gl_bud.SEGMENT11_HIGH IS NOT NULL THEN
331 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT11_HIGH||'-');
332 END IF;
333
334 IF lc_upg_gl_bud.SEGMENT12_HIGH IS NOT NULL THEN
335 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT12_HIGH||'-');
336 END IF;
337
338 IF lc_upg_gl_bud.SEGMENT13_HIGH IS NOT NULL THEN
339 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT13_HIGH||'-');
340 END IF;
341
342 IF lc_upg_gl_bud.SEGMENT14_HIGH IS NOT NULL THEN
343 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT14_HIGH||'-');
344 END IF;
345
346 IF lc_upg_gl_bud.SEGMENT15_HIGH IS NOT NULL THEN
347 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT15_HIGH||'-');
348 END IF;
349
350 IF lc_upg_gl_bud.SEGMENT16_HIGH IS NOT NULL THEN
351 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT16_HIGH||'-');
352 END IF;
353
354 IF lc_upg_gl_bud.SEGMENT17_HIGH IS NOT NULL THEN
355 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT17_HIGH||'-');
356 END IF;
357
358 IF lc_upg_gl_bud.SEGMENT18_HIGH IS NOT NULL THEN
359 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT18_HIGH||'-');
360 END IF;
361 IF lc_upg_gl_bud.SEGMENT19_HIGH IS NOT NULL THEN
362 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT19_HIGH||'-');
363 END IF;
364
365 IF lc_upg_gl_bud.SEGMENT20_HIGH IS NOT NULL THEN
366 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT20_HIGH||'-');
367 END IF;
368
369 IF lc_upg_gl_bud.SEGMENT21_HIGH IS NOT NULL THEN
370 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT21_HIGH||'-');
371 END IF;
372
373 IF lc_upg_gl_bud.SEGMENT22_HIGH IS NOT NULL THEN
374 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT22_HIGH||'-');
375 END IF;
376
377 IF lc_upg_gl_bud.SEGMENT23_HIGH IS NOT NULL THEN
378 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT23_HIGH||'-');
379 END IF;
380
381 IF lc_upg_gl_bud.SEGMENT24_HIGH IS NOT NULL THEN
382 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT24_HIGH||'-');
383 END IF;
384
385 IF lc_upg_gl_bud.SEGMENT25_HIGH IS NOT NULL THEN
386 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT25_HIGH||'-');
387 END IF;
388
389 IF lc_upg_gl_bud.SEGMENT26_HIGH IS NOT NULL THEN
390 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT26_HIGH||'-');
391 END IF;
392
393 IF lc_upg_gl_bud.SEGMENT27_HIGH IS NOT NULL THEN
394 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT27_HIGH||'-');
395 END IF;
396
397 IF lc_upg_gl_bud.SEGMENT28_HIGH IS NOT NULL THEN
398 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT28_HIGH||'-');
399 END IF;
400
401 IF lc_upg_gl_bud.SEGMENT29_HIGH IS NOT NULL THEN
402 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT29_HIGH||'-');
403 END IF;
404
405 IF lc_upg_gl_bud.SEGMENT30_HIGH IS NOT NULL THEN
406 fnd_file.put(fnd_file.output,lc_upg_gl_bud.SEGMENT30_HIGH||'-');
407 END IF;
408
409 fnd_file.put_line(fnd_file.output,' ');
410
411 fnd_file.put(fnd_file.output,'Associated Budgets are ');
412
413 OPEN C_BC_OPTIONS(p_range_id);
414 FETCH C_BC_OPTIONS BULK COLLECT INTO lc_bc_options;
415 CLOSE C_BC_OPTIONS;
416
417 FOR i IN 1..lc_bc_options.COUNT LOOP
418 fnd_file.put(fnd_file.output,lc_bc_options(i).budget_name||', ');
419 END LOOP;
420
421 fnd_file.put_line(fnd_file.output,' ');
422
423 EXCEPTION
424 WHEN OTHERS THEN
425 fnd_file.put_line(fnd_file.output, 'Module: PRINT_BUDGET_INFO => '||SQLERRM);
426 errbuf := 'Module: PRINT_BUDGET_INFO => '||SQLERRM;
427 retcode := -1;
428 RETURN;
429 END;
430 END;
431
432 -- Function COMPARE_BUDGETS is an overloaded function that compares two budgets.
433 -- This function accepts two tables which have budget information and returns
434 -- true if they are the same, false otherwise.
435 FUNCTION COMPARE_BUDGETS (p_budget_tab1 budget_type, p_budget_tab2 BC_OPTIONS_TAB) RETURN BOOLEAN
436 IS
437 l_exists boolean;
438 BEGIN
439 FOR i IN 1..p_budget_tab2.COUNT LOOP
440 l_exists := FALSE;
441 FOR j IN 1..p_budget_tab1.COUNT LOOP
442 IF p_budget_tab1(j) = p_budget_tab2(i).FUNDING_BUDGET_VERSION_ID THEN
443 l_exists := TRUE;
444 EXIT;
445 END IF;
446 END LOOP;
447 IF NOT l_exists THEN
448 RETURN FALSE;
449 END IF;
450 END LOOP;
451
452 FOR i IN 1..p_budget_tab1.COUNT LOOP
453 l_exists := FALSE;
454 FOR j IN 1..p_budget_tab2.COUNT LOOP
455 IF p_budget_tab2(j).FUNDING_BUDGET_VERSION_ID = p_budget_tab1(i) THEN
456 l_exists := TRUE;
457 EXIT;
458 END IF;
459 END LOOP;
460 IF NOT l_exists THEN
461 RETURN FALSE;
462 END IF;
463 END LOOP;
464
465 RETURN TRUE;
466 END;
467
468 -- Function COMPARE_BUDGETS is an overloaded function that compares two budgets.
469 -- This function accepts two tables which have budget information and returns
470 -- true if they are the same, false otherwise.
471 FUNCTION COMPARE_BUDGETS (p_budget_tab1 budget_type, p_budget_tab2 budget_type) RETURN BOOLEAN
472 IS
473 l_exists boolean;
474 BEGIN
475 FOR i IN 1..p_budget_tab2.COUNT LOOP
476 l_exists := FALSE;
477 FOR j IN 1..p_budget_tab1.COUNT LOOP
478 IF p_budget_tab1(j) = p_budget_tab2(i) THEN
479 l_exists := TRUE;
480 EXIT;
481 END IF;
482 END LOOP;
483 IF NOT l_exists THEN
484 RETURN FALSE;
485 END IF;
486 END LOOP;
487
488 FOR i IN 1..p_budget_tab1.COUNT LOOP
489 l_exists := FALSE;
490 FOR j IN 1..p_budget_tab2.COUNT LOOP
491 IF p_budget_tab2(j) = p_budget_tab1(i) THEN
492 l_exists := TRUE;
493 EXIT;
494 END IF;
495 END LOOP;
496 IF NOT l_exists THEN
497 RETURN FALSE;
498 END IF;
499 END LOOP;
500
501 RETURN TRUE;
502 END;
503
504 -- Function MERGE_BUDGETS accepts two table and creates a third table which
505 -- has the concatenated values of both the tables.
506 -- Repeated values are outputted only once
507 FUNCTION MERGE_BUDGETS (p_budget_tab1 budget_type, p_budget_tab2 budget_type) RETURN budget_type
508 IS
509 l_ret_budget_tab budget_type;
510 l_exists boolean;
511 BEGIN
512 l_ret_budget_tab := budget_type();
513 l_ret_budget_tab := p_budget_tab1;
514 FOR i IN 1..p_budget_tab2.COUNT LOOP
515 l_exists := FALSE;
516 FOR j IN 1..p_budget_tab1.COUNT LOOP
517 -- This check is done to ensure that repeated values are not
518 -- placed twice
519 IF p_budget_tab1(j) = p_budget_tab2(i) THEN
520 l_exists := TRUE;
521 END IF;
522 END LOOP;
523 IF NOT l_exists THEN
524 l_ret_budget_tab.extend(1);
525 l_ret_budget_tab(l_ret_budget_tab.COUNT) := p_budget_tab2(i);
526 END IF;
527 END LOOP;
528 RETURN l_ret_budget_tab;
529
530 END MERGE_BUDGETS;
531
532 -- Function PREVIOUS_VALUE accepts a segment value and returns the value
533 -- that is previous to this value. Currently this supports only numeric datatype
534 -- Note - PLSQL implicit conversion converts from number to varchar2 and
535 -- viceversa
536 FUNCTION PREVIOUS_VALUE (p_segment_value VARCHAR2, p_data_type NUMBER) RETURN VARCHAR2
537 IS
538
539 l_prev_value varchar2(30);
540 BEGIN
541 --Data type 0 indicates the data is numeric
542 IF p_data_type = 0 THEN
543 l_prev_value := p_segment_value - 1;
544 IF length(l_prev_value)<length(p_segment_value) THEN
545 FOR i IN 1..length(p_segment_value)-length(l_prev_value) LOOP
546 l_prev_value := '0'||l_prev_value;
547 END LOOP;
548 END IF;
549 RETURN l_prev_value;
550 END IF;
551 RETURN NULL;
552 END PREVIOUS_VALUE;
553
554 -- Function NEXT_VALUE accepts a segment value and returns the value
555 -- that is next to this value. Currently this supports only numeric datatype
556 -- Note - PLSQL implicit conversion converts from number to varchar2 and
557 -- viceversa
558 FUNCTION NEXT_VALUE (p_segment_value VARCHAR2,p_data_type NUMBER) RETURN VARCHAR2
559 IS
560 l_next_value varchar2(30);
561 BEGIN
562 --Data type 0 indicates the data is numeric
563 IF p_data_type = 0 THEN
564 l_next_value := p_segment_value + 1;
565 IF length(l_next_value)<length(p_segment_value) THEN
566 FOR i IN 1..length(p_segment_value)-length(l_next_value) LOOP
567 l_next_value := '0'||l_next_value;
568 END LOOP;
569 END IF;
570 RETURN l_next_value;
571 END IF;
572 RETURN NULL;
573 END NEXT_VALUE;
574
575 -- Procedure SPLIT_RANGES accepts two ranges which overlap in a merging fashion
576 -- and then splits them. The splitted ranges are then returned. Splitting works
577 -- as follows:
578 -- Assuming the following ranges are passed:
579 --
580 -- p_segment1 = 90 to 100 B1
581 -- p_segment1 = 70 to 150 B2
582 --
583 -- The overlaps is split as explained below:
584 --
585 -- 70 to 89 B2
586 -- 90 to 100 B1 B2
587 -- 101 to 150 B2
588 --
589 -- The function then returns the concatenated list of the above values through
590 -- p_segment_tab
591 --
592 -- Assumptions:
593 -- 1. This function works only when two ranges overlapping in a merge fashion
594 -- is provided to it. Ranges that overlap exactly and non overlapping ranges
595 -- should not be passed to this function.
596 -- 2. There is no null check in this function, valid values must be provided to it
597 PROCEDURE SPLIT_RANGES (p_segment1 IN segment_range_rec,
598 p_segment2 IN segment_range_rec,
599 p_segment_tab IN OUT NOCOPY segment_type,
600 p_index_number IN NUMBER,
601 errbuf OUT NOCOPY VARCHAR2,
602 retcode OUT NOCOPY VARCHAR2)
603 IS
604
605 l_exists BOOLEAN;
606 l_segment1 segment_range_rec;
607 l_segment2 segment_range_rec;
608
609 BEGIN
610
611 -- Mark the segment with lower value as l_segment1 and the other as
612 -- l_segment2. This is done to avoid unnecessary repetition of code.
613 IF p_segment1.segment_low >= p_segment2.segment_low THEN
614 l_segment1 := p_segment1;
615 l_segment2 := p_segment2;
616 ELSE
617 l_segment1 := p_segment2;
618 l_segment2 := p_segment1;
619 END IF;
620
621 IF g_debug_enabled = 1 THEN
622 fnd_file.put_line(fnd_file.log, 'l_segment1.segment_low = '||l_segment1.segment_low);
623 fnd_file.put_line(fnd_file.log, 'l_segment1.segment_high = '||l_segment1.segment_high);
624 fnd_file.put_line(fnd_file.log, 'l_segment2.segment_low = '||l_segment2.segment_low);
625 fnd_file.put_line(fnd_file.log, 'l_segment2.segment_high = '||l_segment2.segment_high);
626 END IF;
627
628 -- Corresponding segments should be compared. If wrong segment numbers are
629 -- exit with error
630 IF l_segment1.segment_number <> l_segment2.segment_number THEN
631
632 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Splitting failed as segment_numbers do not match');
633 errbuf := 'Module: SPLIT_RANGES '||'Splitting failed as segment_numbers do not match';
634 retcode := -1;
635 RETURN;
636 END IF;
637
638 -- Main splitting logic starts here
639 BEGIN
640
641 IF l_segment1.segment_low >= l_segment2.segment_low THEN
642 IF l_segment1.segment_low > l_segment2.segment_low THEN
643 p_segment_tab.extend(1);
644 p_segment_tab(p_segment_tab.COUNT).index_number := p_index_number;
645 p_segment_tab(p_segment_tab.COUNT).segment_number := l_segment1.segment_number;
646 p_segment_tab(p_segment_tab.COUNT).segment_low := l_segment2.segment_low;
647 p_segment_tab(p_segment_tab.COUNT).segment_high := PREVIOUS_VALUE(l_segment1.segment_low,l_segment1.data_type);
648
649 IF p_segment_tab(p_segment_tab.COUNT).segment_high IS NULL THEN
650 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Null value retured ');
651 errbuf := 'Module: SPLIT_RANGES '||'Null value retured for PREVIOUS_VALUE(l_segment1.segment_low,l_segment1.data_type);';
652 retcode := -1;
653 RETURN;
654 END IF;
655
656 p_segment_tab(p_segment_tab.COUNT).budget_tab := BUDGET_TYPE();
657 p_segment_tab(p_segment_tab.COUNT).budget_tab := l_segment2.budget_tab;
658 END IF;
659
660
661
662 IF l_segment1.segment_high >= l_segment2.segment_high THEN
663 p_segment_tab.extend(1);
664 p_segment_tab(p_segment_tab.COUNT).index_number := p_index_number;
665 p_segment_tab(p_segment_tab.COUNT).segment_number := l_segment1.segment_number;
666 p_segment_tab(p_segment_tab.COUNT).segment_low := l_segment1.segment_low;
667 p_segment_tab(p_segment_tab.COUNT).segment_high := l_segment2.segment_high;
668 p_segment_tab(p_segment_tab.COUNT).budget_tab := BUDGET_TYPE();
669 p_segment_tab(p_segment_tab.COUNT).budget_tab := MERGE_BUDGETS(l_segment1.budget_tab,l_segment2.budget_tab);
670
671 IF p_segment_tab(p_segment_tab.COUNT).budget_tab IS NULL THEN
672 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Null value retured ');
673 errbuf := 'Module: SPLIT_RANGES '||'Null value retured for p_segment_tab(p_segment_tab.COUNT).budget_tab';
674 retcode := -1;
675 RETURN;
676 END IF;
677
678 IF l_segment1.segment_high > l_segment2.segment_high THEN
679 p_segment_tab.extend(1);
680 p_segment_tab(p_segment_tab.COUNT).index_number := p_index_number;
681 p_segment_tab(p_segment_tab.COUNT).segment_number := l_segment1.segment_number;
682 p_segment_tab(p_segment_tab.COUNT).segment_low := NEXT_VALUE(l_segment2.segment_high,l_segment2.data_type);
683
684 IF p_segment_tab(p_segment_tab.COUNT).segment_low IS NULL THEN
685 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Null value retured ');
686 errbuf := 'Module: SPLIT_RANGES '||'Null value retured for NEXT_VALUE(l_segment2.segment_high,l_segment2.data_type);';
687 retcode := -1;
688 RETURN;
689 END IF;
690
691 p_segment_tab(p_segment_tab.COUNT).segment_high := l_segment1.segment_high;
692 p_segment_tab(p_segment_tab.COUNT).budget_tab := BUDGET_TYPE();
693 p_segment_tab(p_segment_tab.COUNT).budget_tab := l_segment1.budget_tab;
694 END IF;
695
696 ELSE
697
698 p_segment_tab.extend(1);
699 p_segment_tab(p_segment_tab.COUNT).index_number := p_index_number;
700 p_segment_tab(p_segment_tab.COUNT).segment_number := l_segment1.segment_number;
701 p_segment_tab(p_segment_tab.COUNT).segment_low := l_segment1.segment_low;
702 p_segment_tab(p_segment_tab.COUNT).segment_high := l_segment1.segment_high;
703 p_segment_tab(p_segment_tab.COUNT).budget_tab := BUDGET_TYPE();
704 p_segment_tab(p_segment_tab.COUNT).budget_tab := MERGE_BUDGETS(l_segment1.budget_tab,l_segment2.budget_tab);
705
706 IF p_segment_tab(p_segment_tab.COUNT).budget_tab IS NULL THEN
707 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Null value retured ');
708 errbuf := 'Module: SPLIT_RANGES '||'Null value retured for p_segment_tab(p_segment_tab.COUNT).budget_tab';
709 retcode := -1;
710 RETURN;
711 END IF;
712
713 p_segment_tab.extend(1);
714 p_segment_tab(p_segment_tab.COUNT).index_number := p_index_number;
715 p_segment_tab(p_segment_tab.COUNT).segment_number := l_segment1.segment_number;
716 p_segment_tab(p_segment_tab.COUNT).segment_low := NEXT_VALUE(l_segment1.segment_high,l_segment1.data_type);
717
718 IF p_segment_tab(p_segment_tab.COUNT).segment_low IS NULL THEN
719 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Null value retured ');
720 errbuf := 'Module: SPLIT_RANGES '||'Null value retured for NEXT_VALUE(l_segment2.segment_high,l_segment2.data_type);';
721 retcode := -1;
722 RETURN;
723 END IF;
724
725 p_segment_tab(p_segment_tab.COUNT).segment_high := l_segment2.segment_high;
726 p_segment_tab(p_segment_tab.COUNT).budget_tab := BUDGET_TYPE();
727 p_segment_tab(p_segment_tab.COUNT).budget_tab := l_segment2.budget_tab;
728
729
730 END IF;
731
732
733 END IF;
734
735 EXCEPTION
736 WHEN OTHERS THEN
737 fnd_file.put_line(fnd_file.log, 'Module: SPLIT_RANGES '||'Splitting failed '||SQLERRM);
738 errbuf := 'Module: SPLIT_RANGES '||'Splitting failed '||SQLERRM;
739 retcode := -1;
740 RETURN;
741 END;
742
743 END SPLIT_RANGES;
744
745
746 -- Function RECURSIVE_MERGE recursively merges the list of segments
747 -- returned by SPLIT_RANGES
748 -- RECURSIVE_MERGE works recursively. The following example describes its working:
749 --
750 --Let the following be the input:
751 -- Split 1 (of Segment2)
752 -- 70 to 89 B2
753 -- 90 to 100 B1 B2
754 -- 101 to 150 B2
755 --
756 -- Segment3 is split as follows:
757 -- Split 2 (of Segment3)
758 -- 100 to 149 B1
759 -- 150 to 200 B1 B2
760 -- 201 to 250 B2
761 --
762 -- Merging of the ranges Split 1 and Split 2. Merging works as follows.
763 -- Each row of Split 1 is compared with every row of Split 2. If they have
764 -- a common budget assigned to them, then a new Range is created with the
765 -- common budget. For the above Split 1 and Split 2, the following results:
766 --
767 --
768 -- Line 1: Null (Result of merging first line of Split 1 with first line of Split2)
769 -- Line 2: 70-150 to 89-200 B2 (Result of merging first line of Split 1 with second line of Split2)
770 -- Line 3: 70-201 to 89-250 B2 (Result of merging first line of Split 1 with third line of Split2)
771 -- Line 4: 90- 100 to 100-149 B1 (Result of merging second line of Split 1 with first line of Split2)
772 -- Line 5: 90-150 to 100-200 B1 B2 (Result of merging second line of Split 1 with second line of Split2)
773 -- Line 6: 90-201 to 100-250 B2 (Result of merging second line of Split 1 with third line of Split2)
774 -- Line 7: Null (Result of merging third line of Split 1 with first line of Split2)
775 -- Line 8: 101-150 to 150-200 B2 (Result of merging third line of Split 1 with second line of Split2)
776 -- Line 9: 101-201 to 150-250 B2 (Result of merging third line of Split 1 with third line of Split2)
777 --
778 -- Any redundant ranges. Redundant ranges are those whose budget list are the same and
779 -- have same value for all lows-highs pairs or have pairs that are continuous in nature.
780 --
781 -- For example, the following ranges are redundant:
782 -- 70- 150 to 89-200 B2
783 -- 70-201 to 89-250 B2
784 --
785 -- The above can be reduced to:
786 -- 1-70- 150 to 1-89-250 B2
787 --
788 -- Doing this, finally results in:
789 --
790 -- 70-150 to 89-250 B2 (Redundant merging of Line 1 and Line 2)
791 -- 90- 100 to 100-149 B1
792 -- 90-150 to 100-200 B1 B2
793 -- 90-201 to 150-250 B2 (Redundant merging of Line 6 and Line 9)
794 -- 101-150 to 150-200 B2
795 --
796 --
797 -- Finally all other segments are added to the result:
798 --
799 -- 1-70-150 to 1-89-250 B2
800 -- 1-90- 100 to 1-100-149 B1
801 -- 1-90-150 to 1-100-200 B1 B2
802 -- 1-90-201 to 1-150-250 B2
803 -- 1-101-150 to 1-150-200 B2
804 --
805 --
806 PROCEDURE RECURSIVE_MERGE (p_budget_range1 IN BUDGET_RANGE_REC,
807 p_segment_tab IN SEGMENT_TYPE,
808 p_final_budget_ranges IN OUT NOCOPY BUDGET_RANGE_TYPE,
809 p_no_of_segments IN number,
810 p_current_segment_index IN number,
811 p_segment_rec_index_tab IN SEGMENT_REC_INDEX_TYPE,
812 errbuf OUT NOCOPY VARCHAR2,
813 retcode OUT NOCOPY NUMBER)
814 IS
815 l_segment_rec_index_tab SEGMENT_REC_INDEX_TYPE;
816 l_boolean BOOLEAN;
817 l_budget_tab budget_type;
818 l_index NUMBER;
819 l_record_exists BOOLEAN;
820 l_record_index NUMBER;
821 l_exact_match_count NUMBER;
822 l_overlap_count NUMBER;
823 l_overlap_index NUMBER;
824 l_errbuf VARCHAR2(2000);
825 l_retcode NUMBER;
826 BEGIN
827 IF p_no_of_segments < p_current_segment_index THEN
828 fnd_file.put_line(fnd_file.log, 'Module: RECURSIVE_MERGE '||'p_no_of_segments < p_current_segment_index');
829 errbuf := 'Module: RECURSIVE_MERGE '||'p_no_of_segments < p_current_segment_index';
830 retcode := -1;
831 RETURN;
832 END IF;
833
834 -- Initialize l_segment_rec_index_tab for first call
835 IF p_current_segment_index = 1 THEN
836 l_segment_rec_index_tab := SEGMENT_REC_INDEX_TYPE();
837 ELSE
838 l_segment_rec_index_tab := p_segment_rec_index_tab;
839 END IF;
840
841 -- The recursive logic works as follows. Total number of recursion is
842 -- equal to the number of segments that have to be merged.
843 -- If p_no_of_segments = p_current_segment_index then recursion has reached
844 -- the last segment. The list of segments selected by a given recursion
845 -- is available in l_segment_rec_index_tab
846 -- l_segment_rec_index_tab must be analyzed and merged
847 IF p_no_of_segments = p_current_segment_index THEN
848
849 l_budget_tab := budget_type();
850
851 -- Loop for all segments present in p_segment_tab
852 FOR cnt IN 1..p_segment_tab.COUNT LOOP
853
854 -- If p_segment_tab is the p_current_segment_index then do the
855 -- processing. This ensures that only the segments that belong
856 -- to the current recursion are processed
857 IF p_segment_tab(cnt).index_number = p_current_segment_index THEN
858
859 l_segment_rec_index_tab.extend(1);
860 l_segment_rec_index_tab(l_segment_rec_index_tab.COUNT) := cnt;
861
862 -- The following for loop finds the number of common budgets
863 -- for the given set of segments l_segment_rec_index_tab
864 -- The common budgets are then inserted into l_budget_tab
865 FOR i IN 1..p_segment_tab(l_segment_rec_index_tab(1)).budget_tab.COUNT LOOP
866 l_boolean := TRUE;
867
868 FOR j IN 2..l_segment_rec_index_tab.COUNT LOOP
869
870 EXIT WHEN NOT l_boolean;
871
872 l_boolean := FALSE;
873
874 FOR k IN 1..p_segment_tab(l_segment_rec_index_tab(j)).budget_tab.COUNT LOOP
875 IF p_segment_tab(l_segment_rec_index_tab(1)).budget_tab(i)
876 = p_segment_tab(l_segment_rec_index_tab(j)).budget_tab(k) THEN
877 l_boolean := TRUE;
878 EXIT;
879 END IF;
880 END LOOP;
881
882 END LOOP;
883
884 IF l_boolean = TRUE THEN
885 l_budget_tab.extend(1);
886 l_budget_tab(l_budget_tab.COUNT) := p_segment_tab(l_segment_rec_index_tab(1)).budget_tab(i);
887 END IF;
888
889 END LOOP; -- End p_segment_tab For
890
891 -- The following logic builds a range with segments
892 -- in l_segment_rec_index_tab and associates to the budgets
893 -- given by l_budget_tab. This range is stored
894 -- in p_final_budget_ranges
895 IF l_budget_tab.COUNT > 0 THEN
896
897 -- This for loop determines if range similiar to the
898 -- current range already exists. If Yes, then that range
899 -- is updated instead of inserted one. This is to avoid
900 -- multiple records due to split
901 FOR n IN 1..p_final_budget_ranges.COUNT LOOP
902
903 l_exact_match_count := 0;
904 l_overlap_count := 0;
905 l_record_exists := FALSE;
906 l_overlap_index := -1;
907 IF
908 COMPARE_BUDGETS(p_final_budget_ranges(n).budget_tab,l_budget_tab)
909 THEN
910 FOR m IN 1..l_segment_rec_index_tab.COUNT LOOP
911 l_index := l_segment_rec_index_tab(m);
912 IF
913 p_final_budget_ranges(n).segment_range_tab(p_segment_tab(l_index).segment_number).segment_low
914 = p_segment_tab(l_index).segment_low
915 AND
916 p_final_budget_ranges(n).segment_range_tab(p_segment_tab(l_index).segment_number).segment_high
917 = p_segment_tab(l_index).segment_high
918 THEN
919 l_exact_match_count := l_exact_match_count +1;
920 ELSE
921 IF NEXT_VALUE(p_final_budget_ranges(n).segment_range_tab(p_segment_tab(l_index)
922 .segment_number).segment_high
923 ,p_final_budget_ranges(n).segment_range_tab(p_segment_tab(l_index).segment_number).data_type)
924 = p_segment_tab(l_index).segment_low THEN
925 l_overlap_count := l_overlap_count + 1;
926 l_overlap_index := l_index;
927 END IF;
928 END IF;
929 END LOOP;
930 END IF;
931 IF l_overlap_count = 1 AND l_exact_match_count = l_segment_rec_index_tab.COUNT - 1 THEN
932 l_record_index := n;
933 l_record_exists := TRUE;
934 EXIT;
935 END IF;
936
937 END LOOP;
938
939 -- l_record_exists is true if an existing range is found
940 -- If Yes, then the record is updated inserted of insertion
941 IF l_record_exists THEN
942
943 p_final_budget_ranges(l_record_index).segment_range_tab(p_segment_tab(l_overlap_index)
944 .segment_number).segment_high := p_segment_tab(l_overlap_index).segment_high;
945
946 ELSE -- Range does not exist
947
948 p_final_budget_ranges.extend(1);
949 p_final_budget_ranges(p_final_budget_ranges.COUNT).budget_tab := budget_type();
950 p_final_budget_ranges(p_final_budget_ranges.COUNT).budget_tab := l_budget_tab;
951 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab := segment_range_type();
952
953
954 FOR m IN 1..30 LOOP
955 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab.extend(1);
956 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab(m).data_type
957 := p_budget_range1.segment_range_tab(m).data_type;
958 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab(m).segment_low
959 := p_budget_range1.segment_range_tab(m).segment_low;
960 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab(m).segment_high
961 := p_budget_range1.segment_range_tab(m).segment_high;
962 END LOOP;
963
964 FOR m IN 1..l_segment_rec_index_tab.COUNT LOOP
965 l_index := l_segment_rec_index_tab(m);
966 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab(p_segment_tab(l_index)
967 .segment_number).segment_low := p_segment_tab(l_index).segment_low;
968 p_final_budget_ranges(p_final_budget_ranges.COUNT).segment_range_tab(p_segment_tab(l_index)
969 .segment_number).segment_high := p_segment_tab(l_index).segment_high;
970 END LOOP;
971
972 END IF;
973 END IF; -- End l_budget_tab.COUNT > 0
974 l_budget_tab.trim(l_budget_tab.COUNT);
975 l_segment_rec_index_tab.trim;
976 END IF;
977 END LOOP;
978 ELSE -- Else of IF p_no_of_segments = p_current_segment_index
979
980 FOR cnt IN 1..p_segment_tab.COUNT LOOP
981
982 -- If p_segment_tab is the p_current_segment_index then do the
983 -- processing. This ensures that only the segments that belong
984 -- to the current recusion are processed
985 IF p_segment_tab(cnt).index_number = p_current_segment_index THEN
986
987 -- Insert the segment selected into l_segment_rec_index_tab
988 -- and then call RECURSIVE_MERGE
989 l_segment_rec_index_tab.extend(1);
990 l_segment_rec_index_tab(l_segment_rec_index_tab.COUNT) := cnt;
991
992 RECURSIVE_MERGE (p_budget_range1,
993 p_segment_tab,
994 p_final_budget_ranges,
995 p_no_of_segments,
996 p_current_segment_index + 1,
997 l_segment_rec_index_tab,
998 l_errbuf,
999 l_retcode);
1000 IF l_retcode IS NOT NULL AND l_retcode = -1 THEN
1001 retcode := l_retcode;
1002 errbuf := l_errbuf;
1003 RETURN;
1004 END IF;
1005
1006 -- The segment must be deleted once the recursive process
1007 -- has completed to allow the next segment to be inserted
1008 l_segment_rec_index_tab.trim;
1009 END IF;
1010 END LOOP;
1011 END IF; -- End If of IF p_no_of_segments = p_current_segment_index
1012
1013
1014 END RECURSIVE_MERGE;
1015
1016
1017 -- Procedure MERGE_SEGMENTS does the necessary validation and invokes
1018 -- Recursive merge
1019 PROCEDURE MERGE_SEGMENTS (p_budget_range1 IN BUDGET_RANGE_REC,
1020 p_segment_tab IN SEGMENT_TYPE,
1021 p_final_budget_ranges IN OUT NOCOPY BUDGET_RANGE_TYPE,
1022 p_no_of_segments number,
1023 errbuf OUT NOCOPY VARCHAR2,
1024 retcode OUT NOCOPY NUMBER)
1025
1026
1027
1028
1029 IS
1030
1031 l_errbuf VARCHAR2(2000);
1032 l_retcode VARCHAR2(2000);
1033 BEGIN
1034 IF p_budget_range1.range_id IS NULL THEN
1035 fnd_file.put_line(fnd_file.log, 'p_budget_range1.range_id is NULL');
1036 errbuf := 'p_budget_range1.range_id is NULL';
1037 retcode := -1;
1038 RETURN;
1039 END IF;
1040 RECURSIVE_MERGE(p_budget_range1,
1041 p_segment_tab,
1042 p_final_budget_ranges,
1043 p_no_of_segments,
1044 1,
1045 NULL,
1046 l_errbuf,
1047 l_retcode);
1048 errbuf := l_errbuf;
1049 retcode := l_retcode;
1050
1051 END MERGE_SEGMENTS;
1052
1053
1054 -- Function PRINT_MERGE_INFO Used to print the output returned by function
1055 -- MERGE_SEGMENTS. This is used for Logging purposes only.
1056 PROCEDURE PRINT_MERGE_INFO(p_final_budget_ranges IN BUDGET_RANGE_TYPE)
1057 IS
1058 BEGIN
1059 FOR i IN 1..p_final_budget_ranges.COUNT LOOP
1060
1061 FOR k IN 1..p_final_budget_ranges(i).segment_range_tab.COUNT LOOP
1062 IF p_final_budget_ranges(i).segment_range_tab(k).segment_low IS NOT NULL THEN
1063 fnd_file.put(fnd_file.log, '-'||p_final_budget_ranges(i).segment_range_tab(k).segment_low);
1064 END IF;
1065 END LOOP;
1066 fnd_file.put(fnd_file.log, ' to ');
1067
1068 FOR k IN 1..p_final_budget_ranges(i).segment_range_tab.COUNT LOOP
1069 IF p_final_budget_ranges(i).segment_range_tab(k).segment_high IS NOT NULL THEN
1070 fnd_file.put(fnd_file.log, '-'||p_final_budget_ranges(i).segment_range_tab(k).segment_high);
1071 END IF;
1072 END LOOP;
1073
1074 FOR j IN 1..p_final_budget_ranges(i).budget_tab.COUNT LOOP
1075 fnd_file.put(fnd_file.log, ' '||p_final_budget_ranges(i).budget_tab(j));
1076 END LOOP;
1077 fnd_file.put_line(fnd_file.log, '');
1078 END LOOP;
1079 END PRINT_MERGE_INFO;
1080
1081
1082 -- Function PRINT_SPLIT_INFO Used to print the output returned by function
1083 -- SPLIT_RANGES. This is used for Logging purposes only.
1084 PROCEDURE PRINT_SPLIT_INFO (p_segment_tab segment_type)
1085 IS
1086 BEGIN
1087 FOR i IN 1..p_segment_tab.COUNT LOOP
1088 fnd_file.put(fnd_file.log, p_segment_tab(i).segment_low||' to '||p_segment_tab(i).segment_high||' ');
1089 FOR j IN 1..p_segment_tab(i).budget_tab.COUNT LOOP
1090 fnd_file.put(fnd_file.log,p_segment_tab(i).budget_tab(j));
1091 fnd_file.put(fnd_file.log,'');
1092 END LOOP;
1093 fnd_file.put_line(fnd_file.log,'');
1094 END LOOP;
1095
1096 END PRINT_SPLIT_INFO;
1097
1098
1099 PROCEDURE DEBUG_LOG (p_log_message VARCHAR2, p_module VARCHAR2)
1100 IS
1101 BEGIN
1102 fnd_file.put_line(fnd_file.log,'Module:'||p_module||' => '||p_log_message);
1103 END;
1104
1105
1106 PROCEDURE PRINT_OUTPUT (p_output_message VARCHAR2)
1107 IS
1108 BEGIN
1109 fnd_file.put_line(fnd_file.log,p_output_message);
1110 END;
1111
1112
1113 -- PROCEDURE LOOP_AND_PROCESS does the main processing logic
1114 -- This proceedure works as follows:
1115 --
1116 -- Step 1A: Table IGI_UPG_GL_BUDGET_ASSIGNMENT is scanned for occurences of
1117 -- non merging ranges. If Non Merging ranges are found, then they are
1118 -- migrated to the GL if the mode is "final". Otherwise they are
1119 -- added to the report output.
1120 --
1121 -- Step 1B: If No records exist in table IGI_UPG_GL_BUDGET_ASSIGNMENT
1122 -- then execute stops and control is returned to the calling procedure
1123 --
1124 -- Step 2: Table IGI_UPG_GL_BUDGET_ASSIGNMENT is scanned for occurences of any
1125 -- range which exactly merges with other ranges. If such a range is found
1126 -- then the duplicate range is deleted and the proceed continues to Step 1A.
1127 --
1128 -- Step 3: In this step, the remaning ranges are analyzed. The table
1129 -- IGI_UPG_GL_BUDGET_ASSIGNMENT is scanned for two ranges which merge with
1130 -- each other. Then the two ranges are split by calling the function SPLIT_RANGES
1131 -- followed by RECURSIVE_MERGE. After the ranges are split they are inserted
1132 -- back into IGI_UPG_GL_BUDGET_ASSIGNMENT. The original ranges are deleted
1133 -- and the proceed continues to Step 1A.
1134 --
1135 --
1136 PROCEDURE LOOP_AND_PROCESS (p_data_type NUMBER,
1137 p_mode NUMBER,
1138 errbuf OUT NOCOPY VARCHAR2,
1139 retcode OUT NOCOPY NUMBER
1140 )
1141 IS
1142
1143 TYPE BUD_ASSIGN_TAB IS TABLE OF IGI_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
1144
1145 -- This cursor fetches all the ranges that overlap in merge manner
1146 CURSOR C_NON_OVERLAPPING_RANGES IS
1147 SELECT * FROM IGI_UPG_GL_BUDGET_ASSIGNMENT BA1
1148 WHERE NOT EXISTS
1149 (SELECT 1 FROM
1150 IGI_UPG_GL_BUDGET_ASSIGNMENT BA2
1151 WHERE BA1.RANGE_ID <> BA2.RANGE_ID
1152 AND BA2.ledger_id = BA1.ledger_id
1153 AND BA2.currency_code = BA1.currency_code
1154 AND NVL(BA1.SEGMENT1_LOW,'X') <= NVL(BA2.SEGMENT1_HIGH,'X')
1155 AND NVL(BA1.SEGMENT1_HIGH,'X') >= NVL(BA2.SEGMENT1_LOW,'X')
1156 AND NVL(BA1.SEGMENT2_LOW,'X') <= NVL(BA2.SEGMENT2_HIGH,'X')
1157 AND NVL(BA1.SEGMENT2_HIGH,'X') >= NVL(BA2.SEGMENT2_LOW,'X')
1158 AND NVL(BA1.SEGMENT3_LOW,'X') <= NVL(BA2.SEGMENT3_HIGH,'X')
1159 AND NVL(BA1.SEGMENT3_HIGH,'X') >= NVL(BA2.SEGMENT3_LOW,'X')
1160 AND NVL(BA1.SEGMENT4_LOW,'X') <= NVL(BA2.SEGMENT4_HIGH,'X')
1161 AND NVL(BA1.SEGMENT4_HIGH,'X') >= NVL(BA2.SEGMENT4_LOW,'X')
1162 AND NVL(BA1.SEGMENT5_LOW,'X') <= NVL(BA2.SEGMENT5_HIGH,'X')
1163 AND NVL(BA1.SEGMENT5_HIGH,'X') >= NVL(BA2.SEGMENT5_LOW,'X')
1164 AND NVL(BA1.SEGMENT6_LOW,'X') <= NVL(BA2.SEGMENT6_HIGH,'X')
1165 AND NVL(BA1.SEGMENT6_HIGH,'X') >= NVL(BA2.SEGMENT6_LOW,'X')
1166 AND NVL(BA1.SEGMENT7_LOW,'X') <= NVL(BA2.SEGMENT7_HIGH,'X')
1167 AND NVL(BA1.SEGMENT7_HIGH,'X') >= NVL(BA2.SEGMENT7_LOW,'X')
1168 AND NVL(BA1.SEGMENT8_LOW,'X') <= NVL(BA2.SEGMENT8_HIGH,'X')
1169 AND NVL(BA1.SEGMENT8_HIGH,'X') >= NVL(BA2.SEGMENT8_LOW,'X')
1170 AND NVL(BA1.SEGMENT9_LOW,'X') <= NVL(BA2.SEGMENT9_HIGH,'X')
1171 AND NVL(BA1.SEGMENT9_HIGH,'X') >= NVL(BA2.SEGMENT9_LOW,'X')
1172 AND NVL(BA1.SEGMENT10_LOW,'X') <= NVL(BA2.SEGMENT10_HIGH,'X')
1173 AND NVL(BA1.SEGMENT10_HIGH,'X') >= NVL(BA2.SEGMENT10_LOW,'X')
1174 AND NVL(BA1.SEGMENT11_LOW,'X') <= NVL(BA2.SEGMENT11_HIGH,'X')
1175 AND NVL(BA1.SEGMENT11_HIGH,'X') >= NVL(BA2.SEGMENT11_LOW,'X')
1176 AND NVL(BA1.SEGMENT12_LOW,'X') <= NVL(BA2.SEGMENT12_HIGH,'X')
1177 AND NVL(BA1.SEGMENT12_HIGH,'X') >= NVL(BA2.SEGMENT12_LOW,'X')
1178 AND NVL(BA1.SEGMENT13_LOW,'X') <= NVL(BA2.SEGMENT13_HIGH,'X')
1179 AND NVL(BA1.SEGMENT13_HIGH,'X') >= NVL(BA2.SEGMENT13_LOW,'X')
1180 AND NVL(BA1.SEGMENT14_LOW,'X') <= NVL(BA2.SEGMENT14_HIGH,'X')
1181 AND NVL(BA1.SEGMENT14_HIGH,'X') >= NVL(BA2.SEGMENT14_LOW,'X')
1182 AND NVL(BA1.SEGMENT15_LOW,'X') <= NVL(BA2.SEGMENT15_HIGH,'X')
1183 AND NVL(BA1.SEGMENT15_HIGH,'X') >= NVL(BA2.SEGMENT15_LOW,'X')
1184 AND NVL(BA1.SEGMENT16_LOW,'X') <= NVL(BA2.SEGMENT16_HIGH,'X')
1185 AND NVL(BA1.SEGMENT16_HIGH,'X') >= NVL(BA2.SEGMENT16_LOW,'X')
1186 AND NVL(BA1.SEGMENT17_LOW,'X') <= NVL(BA2.SEGMENT17_HIGH,'X')
1187 AND NVL(BA1.SEGMENT17_HIGH,'X') >= NVL(BA2.SEGMENT17_LOW,'X')
1188 AND NVL(BA1.SEGMENT18_LOW,'X') <= NVL(BA2.SEGMENT18_HIGH,'X')
1189 AND NVL(BA1.SEGMENT18_HIGH,'X') >= NVL(BA2.SEGMENT18_LOW,'X')
1190 AND NVL(BA1.SEGMENT19_LOW,'X') <= NVL(BA2.SEGMENT19_HIGH,'X')
1191 AND NVL(BA1.SEGMENT19_HIGH,'X') >= NVL(BA2.SEGMENT19_LOW,'X')
1192 AND NVL(BA1.SEGMENT20_LOW,'X') <= NVL(BA2.SEGMENT20_HIGH,'X')
1193 AND NVL(BA1.SEGMENT20_HIGH,'X') >= NVL(BA2.SEGMENT20_LOW,'X')
1194 AND NVL(BA1.SEGMENT21_LOW,'X') <= NVL(BA2.SEGMENT21_HIGH,'X')
1195 AND NVL(BA1.SEGMENT21_HIGH,'X') >= NVL(BA2.SEGMENT21_LOW,'X')
1196 AND NVL(BA1.SEGMENT22_LOW,'X') <= NVL(BA2.SEGMENT22_HIGH,'X')
1197 AND NVL(BA1.SEGMENT22_HIGH,'X') >= NVL(BA2.SEGMENT22_LOW,'X')
1198 AND NVL(BA1.SEGMENT23_LOW,'X') <= NVL(BA2.SEGMENT23_HIGH,'X')
1199 AND NVL(BA1.SEGMENT23_HIGH,'X') >= NVL(BA2.SEGMENT23_LOW,'X')
1200 AND NVL(BA1.SEGMENT24_LOW,'X') <= NVL(BA2.SEGMENT24_HIGH,'X')
1201 AND NVL(BA1.SEGMENT24_HIGH,'X') >= NVL(BA2.SEGMENT24_LOW,'X')
1202 AND NVL(BA1.SEGMENT25_LOW,'X') <= NVL(BA2.SEGMENT25_HIGH,'X')
1203 AND NVL(BA1.SEGMENT25_HIGH,'X') >= NVL(BA2.SEGMENT25_LOW,'X')
1204 AND NVL(BA1.SEGMENT26_LOW,'X') <= NVL(BA2.SEGMENT26_HIGH,'X')
1205 AND NVL(BA1.SEGMENT26_HIGH,'X') >= NVL(BA2.SEGMENT26_LOW,'X')
1206 AND NVL(BA1.SEGMENT27_LOW,'X') <= NVL(BA2.SEGMENT27_HIGH,'X')
1207 AND NVL(BA1.SEGMENT27_HIGH,'X') >= NVL(BA2.SEGMENT27_LOW,'X')
1208 AND NVL(BA1.SEGMENT28_LOW,'X') <= NVL(BA2.SEGMENT28_HIGH,'X')
1209 AND NVL(BA1.SEGMENT28_HIGH,'X') >= NVL(BA2.SEGMENT28_LOW,'X')
1210 AND NVL(BA1.SEGMENT29_LOW,'X') <= NVL(BA2.SEGMENT29_HIGH,'X')
1211 AND NVL(BA1.SEGMENT29_HIGH,'X') >= NVL(BA2.SEGMENT29_LOW,'X')
1212 AND NVL(BA1.SEGMENT30_LOW,'X') <= NVL(BA2.SEGMENT30_HIGH,'X')
1213 AND NVL(BA1.SEGMENT30_HIGH,'X') >= NVL(BA2.SEGMENT30_LOW,'X')
1214
1215 );
1216
1217 -- This cursor fetches all the ranges that overlap with p_range_id
1218 -- exactly
1219 CURSOR C_EXACT_OVERLAPPING_RANGE(p_range_id NUMBER) IS
1220 SELECT * FROM IGI_UPG_GL_BUDGET_ASSIGNMENT BA1
1221 WHERE EXISTS
1222 (SELECT 1 FROM
1223 IGI_UPG_GL_BUDGET_ASSIGNMENT BA2
1224 WHERE
1225 BA2.range_id = p_range_id
1226 AND BA2.ledger_id = BA1.ledger_id
1227 AND BA2.currency_code = BA1.currency_code
1228 AND BA1.RANGE_ID <> BA2.RANGE_ID
1229 AND NVL(BA1.SEGMENT1_LOW,'X') = NVL(BA2.SEGMENT1_LOW,'X')
1230 AND NVL(BA1.SEGMENT1_HIGH,'X') = NVL(BA2.SEGMENT1_HIGH,'X')
1231 AND NVL(BA1.SEGMENT2_LOW,'X') = NVL(BA2.SEGMENT2_LOW,'X')
1232 AND NVL(BA1.SEGMENT2_HIGH,'X') = NVL(BA2.SEGMENT2_HIGH,'X')
1233 AND NVL(BA1.SEGMENT3_LOW,'X') = NVL(BA2.SEGMENT3_LOW,'X')
1234 AND NVL(BA1.SEGMENT3_HIGH,'X') = NVL(BA2.SEGMENT3_HIGH,'X')
1235 AND NVL(BA1.SEGMENT4_LOW,'X') = NVL(BA2.SEGMENT4_LOW,'X')
1236 AND NVL(BA1.SEGMENT4_HIGH,'X') = NVL(BA2.SEGMENT4_HIGH,'X')
1237 AND NVL(BA1.SEGMENT5_LOW,'X') = NVL(BA2.SEGMENT5_LOW,'X')
1238 AND NVL(BA1.SEGMENT5_HIGH,'X') = NVL(BA2.SEGMENT5_HIGH,'X')
1239 AND NVL(BA1.SEGMENT6_LOW,'X') = NVL(BA2.SEGMENT6_LOW,'X')
1240 AND NVL(BA1.SEGMENT6_HIGH,'X') = NVL(BA2.SEGMENT6_HIGH,'X')
1241 AND NVL(BA1.SEGMENT7_LOW,'X') = NVL(BA2.SEGMENT7_LOW,'X')
1242 AND NVL(BA1.SEGMENT7_HIGH,'X') = NVL(BA2.SEGMENT7_HIGH,'X')
1243 AND NVL(BA1.SEGMENT8_LOW,'X') = NVL(BA2.SEGMENT8_LOW,'X')
1244 AND NVL(BA1.SEGMENT8_HIGH,'X') = NVL(BA2.SEGMENT8_HIGH,'X')
1245 AND NVL(BA1.SEGMENT9_LOW,'X') = NVL(BA2.SEGMENT9_LOW,'X')
1246 AND NVL(BA1.SEGMENT9_HIGH,'X') = NVL(BA2.SEGMENT9_HIGH,'X')
1247 AND NVL(BA1.SEGMENT10_LOW,'X') = NVL(BA2.SEGMENT10_LOW,'X')
1248 AND NVL(BA1.SEGMENT10_HIGH,'X') = NVL(BA2.SEGMENT10_HIGH,'X')
1249 AND NVL(BA1.SEGMENT11_LOW,'X') = NVL(BA2.SEGMENT11_LOW,'X')
1250 AND NVL(BA1.SEGMENT11_HIGH,'X') = NVL(BA2.SEGMENT11_HIGH,'X')
1251 AND NVL(BA1.SEGMENT12_LOW,'X') = NVL(BA2.SEGMENT12_LOW,'X')
1252 AND NVL(BA1.SEGMENT12_HIGH,'X') = NVL(BA2.SEGMENT12_HIGH,'X')
1253 AND NVL(BA1.SEGMENT13_LOW,'X') = NVL(BA2.SEGMENT13_LOW,'X')
1254 AND NVL(BA1.SEGMENT13_HIGH,'X') = NVL(BA2.SEGMENT13_HIGH,'X')
1255 AND NVL(BA1.SEGMENT14_LOW,'X') = NVL(BA2.SEGMENT14_LOW,'X')
1256 AND NVL(BA1.SEGMENT14_HIGH,'X') = NVL(BA2.SEGMENT14_HIGH,'X')
1257 AND NVL(BA1.SEGMENT15_LOW,'X') = NVL(BA2.SEGMENT15_LOW,'X')
1258 AND NVL(BA1.SEGMENT15_HIGH,'X') = NVL(BA2.SEGMENT15_HIGH,'X')
1259 AND NVL(BA1.SEGMENT16_LOW,'X') = NVL(BA2.SEGMENT16_LOW,'X')
1260 AND NVL(BA1.SEGMENT16_HIGH,'X') = NVL(BA2.SEGMENT16_HIGH,'X')
1261 AND NVL(BA1.SEGMENT17_LOW,'X') = NVL(BA2.SEGMENT17_LOW,'X')
1262 AND NVL(BA1.SEGMENT17_HIGH,'X') = NVL(BA2.SEGMENT17_HIGH,'X')
1263 AND NVL(BA1.SEGMENT18_LOW,'X') = NVL(BA2.SEGMENT18_LOW,'X')
1264 AND NVL(BA1.SEGMENT18_HIGH,'X') = NVL(BA2.SEGMENT18_HIGH,'X')
1265 AND NVL(BA1.SEGMENT19_LOW,'X') = NVL(BA2.SEGMENT19_LOW,'X')
1266 AND NVL(BA1.SEGMENT19_HIGH,'X') = NVL(BA2.SEGMENT19_HIGH,'X')
1267 AND NVL(BA1.SEGMENT20_LOW,'X') = NVL(BA2.SEGMENT20_LOW,'X')
1268 AND NVL(BA1.SEGMENT20_HIGH,'X') = NVL(BA2.SEGMENT20_HIGH,'X')
1269 AND NVL(BA1.SEGMENT21_LOW,'X') = NVL(BA2.SEGMENT21_LOW,'X')
1270 AND NVL(BA1.SEGMENT21_HIGH,'X') = NVL(BA2.SEGMENT21_HIGH,'X')
1271 AND NVL(BA1.SEGMENT22_LOW,'X') = NVL(BA2.SEGMENT22_LOW,'X')
1272 AND NVL(BA1.SEGMENT22_HIGH,'X') = NVL(BA2.SEGMENT22_HIGH,'X')
1273 AND NVL(BA1.SEGMENT23_LOW,'X') = NVL(BA2.SEGMENT23_LOW,'X')
1274 AND NVL(BA1.SEGMENT23_HIGH,'X') = NVL(BA2.SEGMENT23_HIGH,'X')
1275 AND NVL(BA1.SEGMENT24_LOW,'X') = NVL(BA2.SEGMENT24_LOW,'X')
1276 AND NVL(BA1.SEGMENT24_HIGH,'X') = NVL(BA2.SEGMENT24_HIGH,'X')
1277 AND NVL(BA1.SEGMENT25_LOW,'X') = NVL(BA2.SEGMENT25_LOW,'X')
1278 AND NVL(BA1.SEGMENT25_HIGH,'X') = NVL(BA2.SEGMENT25_HIGH,'X')
1279 AND NVL(BA1.SEGMENT26_LOW,'X') = NVL(BA2.SEGMENT26_LOW,'X')
1280 AND NVL(BA1.SEGMENT26_HIGH,'X') = NVL(BA2.SEGMENT26_HIGH,'X')
1281 AND NVL(BA1.SEGMENT27_LOW,'X') = NVL(BA2.SEGMENT27_LOW,'X')
1282 AND NVL(BA1.SEGMENT27_HIGH,'X') = NVL(BA2.SEGMENT27_HIGH,'X')
1283 AND NVL(BA1.SEGMENT28_LOW,'X') = NVL(BA2.SEGMENT28_LOW,'X')
1284 AND NVL(BA1.SEGMENT28_HIGH,'X') = NVL(BA2.SEGMENT28_HIGH,'X')
1285 AND NVL(BA1.SEGMENT29_LOW,'X') = NVL(BA2.SEGMENT29_LOW,'X')
1286 AND NVL(BA1.SEGMENT29_HIGH,'X') = NVL(BA2.SEGMENT29_HIGH,'X')
1287 AND NVL(BA1.SEGMENT30_LOW,'X') = NVL(BA2.SEGMENT30_LOW,'X')
1288 AND NVL(BA1.SEGMENT30_HIGH,'X') = NVL(BA2.SEGMENT30_HIGH,'X')
1289 );
1290
1291 -- This cursor fetches all the ranges that overlap with p_range_id
1292 -- in a merge fashion
1293 CURSOR C_OVERLAPPING_RANGE(p_range_id NUMBER) IS
1294 SELECT * FROM IGI_UPG_GL_BUDGET_ASSIGNMENT BA1
1295 WHERE EXISTS
1296 (SELECT 1 FROM
1297 IGI_UPG_GL_BUDGET_ASSIGNMENT BA2
1298 WHERE
1299 BA2.range_id = p_range_id
1300 AND BA2.ledger_id = BA1.ledger_id
1301 AND BA2.currency_code = BA1.currency_code
1302 AND BA1.RANGE_ID <> BA2.RANGE_ID
1303 AND NVL(BA1.SEGMENT1_LOW,'X') <= NVL(BA2.SEGMENT1_HIGH,'X')
1304 AND NVL(BA1.SEGMENT1_HIGH,'X') >= NVL(BA2.SEGMENT1_LOW,'X')
1305 AND NVL(BA1.SEGMENT2_LOW,'X') <= NVL(BA2.SEGMENT2_HIGH,'X')
1306 AND NVL(BA1.SEGMENT2_HIGH,'X') >= NVL(BA2.SEGMENT2_LOW,'X')
1307 AND NVL(BA1.SEGMENT3_LOW,'X') <= NVL(BA2.SEGMENT3_HIGH,'X')
1308 AND NVL(BA1.SEGMENT3_HIGH,'X') >= NVL(BA2.SEGMENT3_LOW,'X')
1309 AND NVL(BA1.SEGMENT4_LOW,'X') <= NVL(BA2.SEGMENT4_HIGH,'X')
1310 AND NVL(BA1.SEGMENT4_HIGH,'X') >= NVL(BA2.SEGMENT4_LOW,'X')
1311 AND NVL(BA1.SEGMENT5_LOW,'X') <= NVL(BA2.SEGMENT5_HIGH,'X')
1312 AND NVL(BA1.SEGMENT5_HIGH,'X') >= NVL(BA2.SEGMENT5_LOW,'X')
1313 AND NVL(BA1.SEGMENT6_LOW,'X') <= NVL(BA2.SEGMENT6_HIGH,'X')
1314 AND NVL(BA1.SEGMENT6_HIGH,'X') >= NVL(BA2.SEGMENT6_LOW,'X')
1315 AND NVL(BA1.SEGMENT7_LOW,'X') <= NVL(BA2.SEGMENT7_HIGH,'X')
1316 AND NVL(BA1.SEGMENT7_HIGH,'X') >= NVL(BA2.SEGMENT7_LOW,'X')
1317 AND NVL(BA1.SEGMENT8_LOW,'X') <= NVL(BA2.SEGMENT8_HIGH,'X')
1318 AND NVL(BA1.SEGMENT8_HIGH,'X') >= NVL(BA2.SEGMENT8_LOW,'X')
1319 AND NVL(BA1.SEGMENT9_LOW,'X') <= NVL(BA2.SEGMENT9_HIGH,'X')
1320 AND NVL(BA1.SEGMENT9_HIGH,'X') >= NVL(BA2.SEGMENT9_LOW,'X')
1321 AND NVL(BA1.SEGMENT10_LOW,'X') <= NVL(BA2.SEGMENT10_HIGH,'X')
1322 AND NVL(BA1.SEGMENT10_HIGH,'X') >= NVL(BA2.SEGMENT10_LOW,'X')
1323 AND NVL(BA1.SEGMENT11_LOW,'X') <= NVL(BA2.SEGMENT11_HIGH,'X')
1324 AND NVL(BA1.SEGMENT11_HIGH,'X') >= NVL(BA2.SEGMENT11_LOW,'X')
1325 AND NVL(BA1.SEGMENT12_LOW,'X') <= NVL(BA2.SEGMENT12_HIGH,'X')
1326 AND NVL(BA1.SEGMENT12_HIGH,'X') >= NVL(BA2.SEGMENT12_LOW,'X')
1327 AND NVL(BA1.SEGMENT13_LOW,'X') <= NVL(BA2.SEGMENT13_HIGH,'X')
1328 AND NVL(BA1.SEGMENT13_HIGH,'X') >= NVL(BA2.SEGMENT13_LOW,'X')
1329 AND NVL(BA1.SEGMENT14_LOW,'X') <= NVL(BA2.SEGMENT14_HIGH,'X')
1330 AND NVL(BA1.SEGMENT14_HIGH,'X') >= NVL(BA2.SEGMENT14_LOW,'X')
1331 AND NVL(BA1.SEGMENT15_LOW,'X') <= NVL(BA2.SEGMENT15_HIGH,'X')
1332 AND NVL(BA1.SEGMENT15_HIGH,'X') >= NVL(BA2.SEGMENT15_LOW,'X')
1333 AND NVL(BA1.SEGMENT16_LOW,'X') <= NVL(BA2.SEGMENT16_HIGH,'X')
1334 AND NVL(BA1.SEGMENT16_HIGH,'X') >= NVL(BA2.SEGMENT16_LOW,'X')
1335 AND NVL(BA1.SEGMENT17_LOW,'X') <= NVL(BA2.SEGMENT17_HIGH,'X')
1336 AND NVL(BA1.SEGMENT17_HIGH,'X') >= NVL(BA2.SEGMENT17_LOW,'X')
1337 AND NVL(BA1.SEGMENT18_LOW,'X') <= NVL(BA2.SEGMENT18_HIGH,'X')
1338 AND NVL(BA1.SEGMENT18_HIGH,'X') >= NVL(BA2.SEGMENT18_LOW,'X')
1339 AND NVL(BA1.SEGMENT19_LOW,'X') <= NVL(BA2.SEGMENT19_HIGH,'X')
1340 AND NVL(BA1.SEGMENT19_HIGH,'X') >= NVL(BA2.SEGMENT19_LOW,'X')
1341 AND NVL(BA1.SEGMENT20_LOW,'X') <= NVL(BA2.SEGMENT20_HIGH,'X')
1342 AND NVL(BA1.SEGMENT20_HIGH,'X') >= NVL(BA2.SEGMENT20_LOW,'X')
1343 AND NVL(BA1.SEGMENT21_LOW,'X') <= NVL(BA2.SEGMENT21_HIGH,'X')
1344 AND NVL(BA1.SEGMENT21_HIGH,'X') >= NVL(BA2.SEGMENT21_LOW,'X')
1345 AND NVL(BA1.SEGMENT22_LOW,'X') <= NVL(BA2.SEGMENT22_HIGH,'X')
1346 AND NVL(BA1.SEGMENT22_HIGH,'X') >= NVL(BA2.SEGMENT22_LOW,'X')
1347 AND NVL(BA1.SEGMENT23_LOW,'X') <= NVL(BA2.SEGMENT23_HIGH,'X')
1348 AND NVL(BA1.SEGMENT23_HIGH,'X') >= NVL(BA2.SEGMENT23_LOW,'X')
1349 AND NVL(BA1.SEGMENT24_LOW,'X') <= NVL(BA2.SEGMENT24_HIGH,'X')
1350 AND NVL(BA1.SEGMENT24_HIGH,'X') >= NVL(BA2.SEGMENT24_LOW,'X')
1351 AND NVL(BA1.SEGMENT25_LOW,'X') <= NVL(BA2.SEGMENT25_HIGH,'X')
1352 AND NVL(BA1.SEGMENT25_HIGH,'X') >= NVL(BA2.SEGMENT25_LOW,'X')
1353 AND NVL(BA1.SEGMENT26_LOW,'X') <= NVL(BA2.SEGMENT26_HIGH,'X')
1354 AND NVL(BA1.SEGMENT26_HIGH,'X') >= NVL(BA2.SEGMENT26_LOW,'X')
1355 AND NVL(BA1.SEGMENT27_LOW,'X') <= NVL(BA2.SEGMENT27_HIGH,'X')
1356 AND NVL(BA1.SEGMENT27_HIGH,'X') >= NVL(BA2.SEGMENT27_LOW,'X')
1357 AND NVL(BA1.SEGMENT28_LOW,'X') <= NVL(BA2.SEGMENT28_HIGH,'X')
1358 AND NVL(BA1.SEGMENT28_HIGH,'X') >= NVL(BA2.SEGMENT28_LOW,'X')
1359 AND NVL(BA1.SEGMENT29_LOW,'X') <= NVL(BA2.SEGMENT29_HIGH,'X')
1360 AND NVL(BA1.SEGMENT29_HIGH,'X') >= NVL(BA2.SEGMENT29_LOW,'X')
1361 AND NVL(BA1.SEGMENT30_LOW,'X') <= NVL(BA2.SEGMENT30_HIGH,'X')
1362 AND NVL(BA1.SEGMENT30_HIGH,'X') >= NVL(BA2.SEGMENT30_LOW,'X')
1363 );
1364
1365 -- This cursor fetches all the ranges
1366 CURSOR C_ALL_RANGES IS
1367 SELECT * FROM IGI_UPG_GL_BUDGET_ASSIGNMENT BA1;
1368
1369 -- This cursor fetches all the budgets associated to p_range_id
1370 CURSOR C_BC_OPTIONS (p_range_id NUMBER)
1371 IS
1372 SELECT * FROM IGI_UPG_GL_BUDORG_BC_OPTIONS
1373 WHERE RANGE_ID = p_range_id;
1374
1375 TYPE non_overlapping_ranges_tab IS TABLE OF C_NON_OVERLAPPING_RANGES%ROWTYPE;
1376
1377 lc_non_overlapping_ranges non_overlapping_ranges_tab;
1378
1379 lc_exact_merge_range1 IGI_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
1380 lc_exact_merge_range1_bc BC_OPTIONS_TAB;
1381
1382 lc_exact_merge_range2 IGI_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
1383 lc_exact_merge_range2_bc BC_OPTIONS_TAB;
1384
1385
1386
1387 lc_merge_range1 IGI_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
1388 lc_merge_range1_bc BC_OPTIONS_TAB;
1389
1390 lc_merge_range2 IGI_UPG_GL_BUDGET_ASSIGNMENT%ROWTYPE;
1391 lc_merge_range2_bc BC_OPTIONS_TAB;
1392
1393 p_segment1 segment_range_rec;
1394 p_segment2 segment_range_rec;
1395
1396 -- Variable to store the number of segments that overlap within a given
1397 -- range
1398 l_index_number NUMBER;
1399
1400 -- Local variable to store the data type
1401 l_data_type NUMBER;
1402
1403 -- Boolean variable used to Step 1B to store overlap details
1404 l_exact_overlap_exists BOOLEAN;
1405
1406 -- Stores the output of PROCEDURE SPLIT_SEGMENTS
1407 p_segment_tab segment_type;
1408
1409 -- Parameters fed to PROCEDURE MERGE_SEGMENTS
1410 p_budget_range1 BUDGET_RANGE_REC;
1411 p_budget_range2 BUDGET_RANGE_REC;
1412
1413 -- Stores the final budget ranges returned after the split
1414 l_final_budget_ranges BUDGET_RANGE_TYPE;
1415
1416 -- This is a local variable used to emulate the behavior of a sequence
1417 -- A local sequence emulation is used to avoid unnecessary increment
1418 -- of the GL sequence gl_budget_assignment_ranges_s
1419 l_range_id_seq NUMBER(38);
1420
1421 -- Local variable to store the sequence number of the budget ranges
1422 -- This is used in Step 3
1423 l_seq_number NUMBER;
1424
1425 -- Variable used in Step 1 to store the range_id
1426 l_actual_range_id NUMBER(38);
1427
1428 -- Local variable to store error buffer and error code
1429 l_errbuf VARCHAR2(2000);
1430 l_retcode NUMBER;
1431
1432 -- Boolean variable used in Step 3 to determine if a row was inserted or not
1433 -- Error handling is based on value this variable has
1434 l_inserted BOOLEAN;
1435
1436 BEGIN
1437
1438 l_data_type := p_data_type;
1439 fnd_file.put_line(fnd_file.output,'Ledger - Budget Organization - Currency - Range From - Range To ');
1440 BEGIN
1441 SELECT gl_budget_assignment_ranges_s.NEXTVAL
1442 INTO l_range_id_seq
1443 FROM dual;
1444 l_range_id_seq := l_range_id_seq + 1;
1445 EXCEPTION
1446 WHEN OTHERS THEN
1447 fnd_file.put_line(fnd_file.output, 'Error fetching sequence value from gl_budget_assignment_ranges_s');
1448 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Error fetching sequence value
1449 from gl_budget_assignment_ranges_s');
1450 errbuf := 'Module: LOOP_AND_PROCESS => Error fetching sequence value from gl_budget_assignment_ranges_s';
1451 retcode := -1;
1452 RETURN;
1453 END;
1454
1455 IF l_range_id_seq IS NULL OR l_range_id_seq = 0 THEN
1456 l_range_id_seq := 0;
1457 END IF;
1458
1459 LOOP
1460
1461 -- Start of Step 1A
1462
1463 l_exact_overlap_exists := FALSE;
1464 --First open NON)OVERLAPPING_RANGES and put them into GL table
1465 OPEN C_NON_OVERLAPPING_RANGES;
1466 FETCH C_NON_OVERLAPPING_RANGES BULK COLLECT INTO lc_non_overlapping_ranges;
1467 CLOSE C_NON_OVERLAPPING_RANGES;
1468
1469
1470
1471 FOR i IN 1..lc_non_overlapping_ranges.COUNT LOOP
1472 IF p_mode = 1 THEN
1473 BEGIN
1474 SELECT gl_budget_assignment_ranges_s.NEXTVAL
1475 INTO l_actual_range_id
1476 FROM dual;
1477 EXCEPTION
1478 WHEN OTHERS THEN
1479 fnd_file.put_line(fnd_file.output, 'Error fetching sequence value from gl_budget_assignment_ranges_s');
1480 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS (overlap) =>'
1481 ||'Error fetching sequence value from gl_budget_assignment_ranges_s');
1482 errbuf := 'Module: LOOP_AND_PROCESS (overlap) => Error fetching sequence value from gl_budget_assignment_ranges_s';
1483 retcode := -1;
1484 RETURN;
1485 END;
1486
1487 PRINT_BUDGET_INFO(lc_non_overlapping_ranges(i).range_id,
1488 l_errbuf,
1489 l_retcode);
1490
1491 IF l_retcode IS NOT NULL and l_retcode = -1 THEN
1492 errbuf := l_errbuf;
1493 retcode := l_retcode;
1494 RETURN;
1495 END IF;
1496
1497 BEGIN
1498
1499 INSERT INTO IGI_EFC_UPG_BACKUP_INFO (range_id) VALUES (l_actual_range_id);
1500
1501 INSERT INTO GL_BUDGET_ASSIGNMENT_RANGES
1502 (
1503 BUDGET_ENTITY_ID,
1504 LEDGER_ID,
1505 CURRENCY_CODE,
1506 ENTRY_CODE,
1507 RANGE_ID,
1508 STATUS,
1509 LAST_UPDATE_DATE,
1510 AUTOMATIC_ENCUMBRANCE_FLAG,
1511 CREATED_BY,
1512 CREATION_DATE,
1513 FUNDS_CHECK_LEVEL_CODE,
1514 LAST_UPDATED_BY,
1515 LAST_UPDATE_LOGIN,
1516 SEQUENCE_NUMBER,
1517 SEGMENT1_LOW,
1518 SEGMENT1_HIGH,
1519 SEGMENT2_LOW,
1520 SEGMENT2_HIGH,
1521 SEGMENT3_LOW,
1522 SEGMENT3_HIGH,
1523 SEGMENT4_LOW,
1524 SEGMENT4_HIGH,
1525 SEGMENT5_LOW,
1526 SEGMENT5_HIGH,
1527 SEGMENT6_LOW,
1528 SEGMENT6_HIGH,
1529 SEGMENT7_LOW,
1530 SEGMENT7_HIGH,
1531 SEGMENT8_LOW,
1532 SEGMENT8_HIGH,
1533 SEGMENT9_LOW,
1534 SEGMENT9_HIGH,
1535 SEGMENT10_LOW,
1536 SEGMENT10_HIGH,
1537 SEGMENT11_LOW,
1538 SEGMENT11_HIGH,
1539 SEGMENT12_LOW,
1540 SEGMENT12_HIGH,
1541 SEGMENT13_LOW,
1542 SEGMENT13_HIGH,
1543 SEGMENT14_LOW,
1544 SEGMENT14_HIGH,
1545 SEGMENT15_LOW,
1546 SEGMENT15_HIGH,
1547 SEGMENT16_LOW,
1548 SEGMENT16_HIGH,
1549 SEGMENT17_LOW,
1550 SEGMENT17_HIGH,
1551 SEGMENT18_LOW,
1552 SEGMENT18_HIGH,
1553 SEGMENT19_LOW,
1554 SEGMENT19_HIGH,
1555 SEGMENT20_LOW,
1556 SEGMENT20_HIGH,
1557 SEGMENT21_LOW,
1558 SEGMENT21_HIGH,
1559 SEGMENT22_LOW,
1560 SEGMENT22_HIGH,
1561 SEGMENT23_LOW,
1562 SEGMENT23_HIGH,
1563 SEGMENT24_LOW,
1564 SEGMENT24_HIGH,
1565 SEGMENT25_LOW,
1566 SEGMENT25_HIGH,
1567 SEGMENT26_LOW,
1568 SEGMENT26_HIGH,
1569 SEGMENT27_LOW,
1570 SEGMENT27_HIGH,
1571 SEGMENT28_LOW,
1572 SEGMENT28_HIGH,
1573 SEGMENT29_LOW,
1574 SEGMENT29_HIGH,
1575 SEGMENT30_LOW,
1576 SEGMENT30_HIGH,
1577 AMOUNT_TYPE,
1578 BOUNDARY_CODE,
1579 CONTEXT,
1580 FUNDING_BUDGET_VERSION_ID,
1581 PROGRAM_APPLICATION_ID,
1582 PROGRAM_ID,
1583 PROGRAM_UPDATE_DATE,
1584 REQUEST_ID,
1585 ATTRIBUTE1,
1586 ATTRIBUTE2,
1587 ATTRIBUTE3,
1588 ATTRIBUTE4,
1589 ATTRIBUTE5,
1590 ATTRIBUTE6,
1591 ATTRIBUTE7,
1592 ATTRIBUTE8,
1593 ATTRIBUTE9,
1594 ATTRIBUTE10,
1595 ATTRIBUTE11,
1596 ATTRIBUTE12,
1597 ATTRIBUTE13,
1598 ATTRIBUTE14,
1599 ATTRIBUTE15
1600 )
1601
1602 VALUES (
1603 lc_non_overlapping_ranges(i).budget_entity_id,
1604 lc_non_overlapping_ranges(i).ledger_id,
1605 lc_non_overlapping_ranges(i).currency_code,
1606 lc_non_overlapping_ranges(i).entry_code,
1607 l_actual_range_id,
1608 'A',
1609 sysdate,
1610 lc_non_overlapping_ranges(i).automatic_encumbrance_flag,
1611 lc_non_overlapping_ranges(i).created_by,
1612 lc_non_overlapping_ranges(i).creation_date,
1613 lc_non_overlapping_ranges(i).funds_check_level_code,
1614 lc_non_overlapping_ranges(i).last_updated_by,
1615 lc_non_overlapping_ranges(i).last_update_login,
1616 lc_non_overlapping_ranges(i).sequence_number,
1617 lc_non_overlapping_ranges(i).SEGMENT1_LOW,
1618 lc_non_overlapping_ranges(i).SEGMENT1_HIGH,
1619 lc_non_overlapping_ranges(i).SEGMENT2_LOW,
1620 lc_non_overlapping_ranges(i).SEGMENT2_HIGH,
1621 lc_non_overlapping_ranges(i).SEGMENT3_LOW,
1622 lc_non_overlapping_ranges(i).SEGMENT3_HIGH,
1623 lc_non_overlapping_ranges(i).SEGMENT4_LOW,
1624 lc_non_overlapping_ranges(i).SEGMENT4_HIGH,
1625 lc_non_overlapping_ranges(i).SEGMENT5_LOW,
1626 lc_non_overlapping_ranges(i).SEGMENT5_HIGH,
1627 lc_non_overlapping_ranges(i).SEGMENT6_LOW,
1628 lc_non_overlapping_ranges(i).SEGMENT6_HIGH,
1629 lc_non_overlapping_ranges(i).SEGMENT7_LOW,
1630 lc_non_overlapping_ranges(i).SEGMENT7_HIGH,
1631 lc_non_overlapping_ranges(i).SEGMENT8_LOW,
1632 lc_non_overlapping_ranges(i).SEGMENT8_HIGH,
1633 lc_non_overlapping_ranges(i).SEGMENT9_LOW,
1634 lc_non_overlapping_ranges(i).SEGMENT9_HIGH,
1635 lc_non_overlapping_ranges(i).SEGMENT10_LOW,
1636 lc_non_overlapping_ranges(i).SEGMENT10_HIGH,
1637 lc_non_overlapping_ranges(i).SEGMENT11_LOW,
1638 lc_non_overlapping_ranges(i).SEGMENT11_HIGH,
1639 lc_non_overlapping_ranges(i).SEGMENT12_LOW,
1640 lc_non_overlapping_ranges(i).SEGMENT12_HIGH,
1641 lc_non_overlapping_ranges(i).SEGMENT13_LOW,
1642 lc_non_overlapping_ranges(i).SEGMENT13_HIGH,
1643 lc_non_overlapping_ranges(i).SEGMENT14_LOW,
1644 lc_non_overlapping_ranges(i).SEGMENT14_HIGH,
1645 lc_non_overlapping_ranges(i).SEGMENT15_LOW,
1646 lc_non_overlapping_ranges(i).SEGMENT15_HIGH,
1647 lc_non_overlapping_ranges(i).SEGMENT16_LOW,
1648 lc_non_overlapping_ranges(i).SEGMENT16_HIGH,
1649 lc_non_overlapping_ranges(i).SEGMENT17_LOW,
1650 lc_non_overlapping_ranges(i).SEGMENT17_HIGH,
1651 lc_non_overlapping_ranges(i).SEGMENT18_LOW,
1652 lc_non_overlapping_ranges(i).SEGMENT18_HIGH,
1653 lc_non_overlapping_ranges(i).SEGMENT19_LOW,
1654 lc_non_overlapping_ranges(i).SEGMENT19_HIGH,
1655 lc_non_overlapping_ranges(i).SEGMENT20_LOW,
1656 lc_non_overlapping_ranges(i).SEGMENT20_HIGH,
1657 lc_non_overlapping_ranges(i).SEGMENT21_LOW,
1658 lc_non_overlapping_ranges(i).SEGMENT21_HIGH,
1659 lc_non_overlapping_ranges(i).SEGMENT22_LOW,
1660 lc_non_overlapping_ranges(i).SEGMENT22_HIGH,
1661 lc_non_overlapping_ranges(i).SEGMENT23_LOW,
1662 lc_non_overlapping_ranges(i).SEGMENT23_HIGH,
1663 lc_non_overlapping_ranges(i).SEGMENT24_LOW,
1664 lc_non_overlapping_ranges(i).SEGMENT24_HIGH,
1665 lc_non_overlapping_ranges(i).SEGMENT25_LOW,
1666 lc_non_overlapping_ranges(i).SEGMENT25_HIGH,
1667 lc_non_overlapping_ranges(i).SEGMENT26_LOW,
1668 lc_non_overlapping_ranges(i).SEGMENT26_HIGH,
1669 lc_non_overlapping_ranges(i).SEGMENT27_LOW,
1670 lc_non_overlapping_ranges(i).SEGMENT27_HIGH,
1671 lc_non_overlapping_ranges(i).SEGMENT28_LOW,
1672 lc_non_overlapping_ranges(i).SEGMENT28_HIGH,
1673 lc_non_overlapping_ranges(i).SEGMENT29_LOW,
1674 lc_non_overlapping_ranges(i).SEGMENT29_HIGH,
1675 lc_non_overlapping_ranges(i).SEGMENT30_LOW,
1676 lc_non_overlapping_ranges(i).SEGMENT30_HIGH,
1677 lc_non_overlapping_ranges(i).amount_type,
1678 lc_non_overlapping_ranges(i).boundary_code,
1679 lc_non_overlapping_ranges(i).context,
1680 lc_non_overlapping_ranges(i).funding_budget_version_id,
1681 lc_non_overlapping_ranges(i).program_application_id,
1682 lc_non_overlapping_ranges(i).program_id,
1683 lc_non_overlapping_ranges(i).program_update_date,
1684 lc_non_overlapping_ranges(i).request_id,
1685 lc_non_overlapping_ranges(i).attribute1,
1686 lc_non_overlapping_ranges(i).attribute2,
1687 lc_non_overlapping_ranges(i).attribute3,
1688 lc_non_overlapping_ranges(i).attribute4,
1689 lc_non_overlapping_ranges(i).attribute5,
1690 lc_non_overlapping_ranges(i).attribute6,
1691 lc_non_overlapping_ranges(i).attribute7,
1692 lc_non_overlapping_ranges(i).attribute8,
1693 lc_non_overlapping_ranges(i).attribute9,
1694 lc_non_overlapping_ranges(i).attribute10,
1695 lc_non_overlapping_ranges(i).attribute11,
1696 lc_non_overlapping_ranges(i).attribute12,
1697 lc_non_overlapping_ranges(i).attribute13,
1698 lc_non_overlapping_ranges(i).attribute14,
1699 lc_non_overlapping_ranges(i).attribute15
1700 );
1701
1702 INSERT INTO GL_BUDORG_BC_OPTIONS
1703 (
1704 RANGE_ID,
1705 FUNDING_BUDGET_VERSION_ID,
1706 FUNDS_CHECK_LEVEL_CODE,
1707 AMOUNT_TYPE,
1708 BOUNDARY_CODE,
1709 CREATED_BY,
1710 CREATION_DATE,
1711 LAST_UPDATED_BY,
1712 LAST_UPDATE_LOGIN,
1713 LAST_UPDATE_DATE
1714 )
1715 SELECT
1716 l_actual_range_id,
1717 FUNDING_BUDGET_VERSION_ID,
1718 FUNDS_CHECK_LEVEL_CODE,
1719 AMOUNT_TYPE,
1720 BOUNDARY_CODE,
1721 CREATED_BY,
1722 CREATION_DATE,
1723 LAST_UPDATED_BY,
1724 LAST_UPDATE_LOGIN,
1725 LAST_UPDATE_DATE
1726 FROM IGI_UPG_GL_BUDORG_BC_OPTIONS
1727 WHERE RANGE_ID = lc_non_overlapping_ranges(i).range_id;
1728
1729
1730 INSERT_ENTITY(lc_non_overlapping_ranges(i).ledger_id,
1731 lc_non_overlapping_ranges(i).budget_entity_id,
1732 l_errbuf,
1733 l_retcode);
1734
1735 IF l_retcode IS NOT NULL and l_retcode = -1 THEN
1736 errbuf := l_errbuf;
1737 retcode := l_retcode;
1738 RETURN;
1739 END IF;
1740
1741 DELETE FROM IGI_UPG_GL_BUDORG_BC_OPTIONS WHERE RANGE_ID = lc_non_overlapping_ranges(i).range_id;
1742
1743 DELETE FROM IGI_UPG_GL_BUDGET_ASSIGNMENT WHERE RANGE_ID = lc_non_overlapping_ranges(i).range_id;
1744
1745
1746
1747 EXCEPTION
1748 WHEN OTHERS THEN
1749 fnd_file.put_line(fnd_file.output, 'Error processing demerged data');
1750 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Error processing demerged data =>'||SQLERRM);
1751 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error processing demerged data =>'||SQLERRM;
1752 retcode := -1;
1753 RETURN;
1754 END;
1755 ELSE
1756 BEGIN
1757
1758 PRINT_BUDGET_INFO(lc_non_overlapping_ranges(i).range_id,
1759 l_errbuf,
1760 l_retcode);
1761 IF l_retcode IS NOT NULL and l_retcode = -1 THEN
1762 errbuf := l_errbuf;
1763 retcode := l_retcode;
1764 RETURN;
1765 END IF;
1766
1767
1768 DELETE FROM IGI_UPG_GL_BUDORG_BC_OPTIONS WHERE RANGE_ID = lc_non_overlapping_ranges(i).range_id;
1769
1770 DELETE FROM IGI_UPG_GL_BUDGET_ASSIGNMENT WHERE RANGE_ID = lc_non_overlapping_ranges(i).range_id;
1771 EXCEPTION
1772 WHEN OTHERS THEN
1773 fnd_file.put_line(fnd_file.output, 'Error processing demerged data - prelim mode');
1774 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'
1775 ||'Error processing demerged data - prelim mode =>'||SQLERRM);
1776 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error processing demerged data - prelim mode =>'||SQLERRM;
1777 retcode := -1;
1778 RETURN;
1779 END;
1780 END IF;
1781 END LOOP;
1782
1783
1784 -- End of Step 1A
1785
1786 -- Start of Step 1B
1787
1788 --Then check for exact overlap
1789 OPEN C_ALL_RANGES;
1790 FETCH C_ALL_RANGES INTO lc_exact_merge_range1;
1791 IF C_ALL_RANGES%NOTFOUND THEN
1792 CLOSE C_ALL_RANGES;
1793 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS => Processing completed');
1794 EXIT;
1795 END IF;
1796 CLOSE C_ALL_RANGES;
1797
1798 -- End of Step 1B
1799
1800 -- Start of Step 2
1801
1802 OPEN C_EXACT_OVERLAPPING_RANGE(lc_exact_merge_range1.range_id);
1803 FETCH C_EXACT_OVERLAPPING_RANGE INTO lc_exact_merge_range2;
1804 IF C_EXACT_OVERLAPPING_RANGE%FOUND THEN
1805 l_exact_overlap_exists := TRUE;
1806 ELSE
1807 l_exact_overlap_exists := FALSE;
1808 END IF;
1809 CLOSE C_EXACT_OVERLAPPING_RANGE;
1810
1811 IF l_exact_overlap_exists THEN
1812
1813
1814 BEGIN
1815
1816 UPDATE IGI_UPG_GL_BUDORG_BC_OPTIONS
1817 SET RANGE_ID = lc_exact_merge_range1.range_id
1818 WHERE RANGE_ID = lc_exact_merge_range2.range_id;
1819
1820 DELETE FROM IGI_UPG_GL_BUDGET_ASSIGNMENT WHERE RANGE_ID = lc_exact_merge_range2.range_id;
1821
1822 EXCEPTION
1823 WHEN OTHERS THEN
1824 fnd_file.put_line(fnd_file.output, 'Error merging data which overlaps exactly');
1825 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'
1826 ||'Error merging data which overlaps exactly =>'||SQLERRM);
1827 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error merging data which overlaps exactly =>'||SQLERRM;
1828 retcode := -1;
1829 RETURN;
1830 END;
1831 --Continue executing the loop
1832 --Goto is used to emulate the behaviour of continue
1833 GOTO CONTINUE;
1834 END IF;
1835
1836 -- End of Step 2
1837
1838 -- Start of Step 3
1839
1840 OPEN C_ALL_RANGES;
1841 FETCH C_ALL_RANGES INTO lc_merge_range1;
1842 IF C_ALL_RANGES%NOTFOUND THEN
1843 CLOSE C_ALL_RANGES;
1844 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS => Processing completed');
1845 EXIT;
1846 END IF;
1847 IF C_ALL_RANGES%FOUND AND l_data_type <> 0 THEN
1848 CLOSE C_ALL_RANGES;
1849 fnd_file.put_line(fnd_file.output, 'Module: LOOP_AND_PROCESS - You have segment ranges which merge with other segment ranges
1850 for the same ledger and currency. This upgrade script does
1851 not support merging segment ranges for segments which have variable
1852 non numeric values. Merging segment ranges are supported only if your
1853 segment contains fixed length numeric values. Please contact Oracle Support for help');
1854 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS - You have segment ranges which merge with other segment ranges
1855 for the same ledger and currency code. This upgrade script does
1856 not support merging segment ranges for segments which have variable
1857 non numeric values. Merging segment ranges are supported only if your
1858 segment contains fixed length numeric values. Please contact Oracle Support for help');
1859 errbuf := 'Aborting Upgrade Non numeric segments exists and merging ranges are found';
1860 retcode := -1;
1861 RETURN;
1862 END IF;
1863 CLOSE C_ALL_RANGES;
1864
1865
1866 -- This cursor selects the budgets associated to lc_merge_range1
1867 OPEN C_BC_OPTIONS(lc_merge_range1.range_id);
1868 FETCH C_BC_OPTIONS BULK COLLECT INTO lc_merge_range1_bc;
1869 CLOSE C_BC_OPTIONS;
1870
1871 -- This cursor selects the range which overlaps with the lc_merge_range1
1872 OPEN C_OVERLAPPING_RANGE(lc_merge_range1.range_id);
1873 FETCH C_OVERLAPPING_RANGE INTO lc_merge_range2;
1874 CLOSE C_OVERLAPPING_RANGE;
1875
1876 -- This cursor selects the budgets associated to lc_merge_range2
1877 OPEN C_BC_OPTIONS(lc_merge_range2.range_id);
1878 FETCH C_BC_OPTIONS BULK COLLECT INTO lc_merge_range2_bc;
1879 CLOSE C_BC_OPTIONS;
1880
1881
1882 --p_budget_range1 is assigned the value of lc_merge_range1
1883 --p_budget_range2 is assigned the value of lc_merge_range1
1884
1885 p_budget_range1.range_id := lc_merge_range1.range_id;
1886 p_budget_range1.segment_range_tab := segment_range_type();
1887 p_budget_range1.segment_range_tab.extend(30);
1888
1889 p_budget_range1.segment_range_tab(1).segment_low := lc_merge_range1.SEGMENT1_LOW;
1890 p_budget_range1.segment_range_tab(1).segment_high := lc_merge_range1.SEGMENT1_HIGH;
1891 p_budget_range1.segment_range_tab(1).data_type := l_data_type;
1892
1893 p_budget_range1.segment_range_tab(2).segment_low := lc_merge_range1.SEGMENT2_LOW;
1894 p_budget_range1.segment_range_tab(2).segment_high := lc_merge_range1.SEGMENT2_HIGH;
1895 p_budget_range1.segment_range_tab(2).data_type := l_data_type;
1896
1897 p_budget_range1.segment_range_tab(3).segment_low := lc_merge_range1.SEGMENT3_LOW;
1898 p_budget_range1.segment_range_tab(3).segment_high := lc_merge_range1.SEGMENT3_HIGH;
1899 p_budget_range1.segment_range_tab(3).data_type := l_data_type;
1900
1901 p_budget_range1.segment_range_tab(4).segment_low := lc_merge_range1.SEGMENT4_LOW;
1902 p_budget_range1.segment_range_tab(4).segment_high := lc_merge_range1.SEGMENT4_HIGH;
1903 p_budget_range1.segment_range_tab(4).data_type := l_data_type;
1904
1905 p_budget_range1.segment_range_tab(5).segment_low := lc_merge_range1.SEGMENT5_LOW;
1906 p_budget_range1.segment_range_tab(5).segment_high := lc_merge_range1.SEGMENT5_HIGH;
1907 p_budget_range1.segment_range_tab(5).data_type := l_data_type;
1908
1909 p_budget_range1.segment_range_tab(6).segment_low := lc_merge_range1.SEGMENT6_LOW;
1910 p_budget_range1.segment_range_tab(6).segment_high := lc_merge_range1.SEGMENT6_HIGH;
1911 p_budget_range1.segment_range_tab(6).data_type := l_data_type;
1912
1913 p_budget_range1.segment_range_tab(7).segment_low := lc_merge_range1.SEGMENT7_LOW;
1914 p_budget_range1.segment_range_tab(7).segment_high := lc_merge_range1.SEGMENT7_HIGH;
1915 p_budget_range1.segment_range_tab(7).data_type := l_data_type;
1916
1917 p_budget_range1.segment_range_tab(8).segment_low := lc_merge_range1.SEGMENT8_LOW;
1918 p_budget_range1.segment_range_tab(8).segment_high := lc_merge_range1.SEGMENT8_HIGH;
1919 p_budget_range1.segment_range_tab(8).data_type := l_data_type;
1920
1921 p_budget_range1.segment_range_tab(9).segment_low := lc_merge_range1.SEGMENT9_LOW;
1922 p_budget_range1.segment_range_tab(9).segment_high := lc_merge_range1.SEGMENT9_HIGH;
1923 p_budget_range1.segment_range_tab(9).data_type := l_data_type;
1924
1925 p_budget_range1.segment_range_tab(10).segment_low := lc_merge_range1.SEGMENT10_LOW;
1926 p_budget_range1.segment_range_tab(10).segment_high := lc_merge_range1.SEGMENT10_HIGH;
1927 p_budget_range1.segment_range_tab(10).data_type := l_data_type;
1928
1929 p_budget_range1.segment_range_tab(11).segment_low := lc_merge_range1.SEGMENT11_LOW;
1930 p_budget_range1.segment_range_tab(11).segment_high := lc_merge_range1.SEGMENT11_HIGH;
1931 p_budget_range1.segment_range_tab(11).data_type := l_data_type;
1932
1933 p_budget_range1.segment_range_tab(12).segment_low := lc_merge_range1.SEGMENT12_LOW;
1934 p_budget_range1.segment_range_tab(12).segment_high := lc_merge_range1.SEGMENT12_HIGH;
1935 p_budget_range1.segment_range_tab(12).data_type := l_data_type;
1936
1937 p_budget_range1.segment_range_tab(13).segment_low := lc_merge_range1.SEGMENT13_LOW;
1938 p_budget_range1.segment_range_tab(13).segment_high := lc_merge_range1.SEGMENT13_HIGH;
1939 p_budget_range1.segment_range_tab(13).data_type := l_data_type;
1940
1941 p_budget_range1.segment_range_tab(14).segment_low := lc_merge_range1.SEGMENT14_LOW;
1942 p_budget_range1.segment_range_tab(14).segment_high := lc_merge_range1.SEGMENT14_HIGH;
1943 p_budget_range1.segment_range_tab(14).data_type := l_data_type;
1944
1945 p_budget_range1.segment_range_tab(15).segment_low := lc_merge_range1.SEGMENT15_LOW;
1946 p_budget_range1.segment_range_tab(15).segment_high := lc_merge_range1.SEGMENT15_HIGH;
1947 p_budget_range1.segment_range_tab(15).data_type := l_data_type;
1948
1949 p_budget_range1.segment_range_tab(16).segment_low := lc_merge_range1.SEGMENT16_LOW;
1950 p_budget_range1.segment_range_tab(16).segment_high := lc_merge_range1.SEGMENT16_HIGH;
1951 p_budget_range1.segment_range_tab(16).data_type := l_data_type;
1952
1953 p_budget_range1.segment_range_tab(17).segment_low := lc_merge_range1.SEGMENT17_LOW;
1954 p_budget_range1.segment_range_tab(17).segment_high := lc_merge_range1.SEGMENT17_HIGH;
1955 p_budget_range1.segment_range_tab(17).data_type := l_data_type;
1956
1957 p_budget_range1.segment_range_tab(18).segment_low := lc_merge_range1.SEGMENT18_LOW;
1958 p_budget_range1.segment_range_tab(18).segment_high := lc_merge_range1.SEGMENT18_HIGH;
1959 p_budget_range1.segment_range_tab(18).data_type := l_data_type;
1960
1961 p_budget_range1.segment_range_tab(19).segment_low := lc_merge_range1.SEGMENT19_LOW;
1962 p_budget_range1.segment_range_tab(19).segment_high := lc_merge_range1.SEGMENT19_HIGH;
1963 p_budget_range1.segment_range_tab(19).data_type := l_data_type;
1964
1965 p_budget_range1.segment_range_tab(20).segment_low := lc_merge_range1.SEGMENT20_LOW;
1966 p_budget_range1.segment_range_tab(20).segment_high := lc_merge_range1.SEGMENT20_HIGH;
1967 p_budget_range1.segment_range_tab(20).data_type := l_data_type;
1968
1969 p_budget_range1.segment_range_tab(21).segment_low := lc_merge_range1.SEGMENT21_LOW;
1970 p_budget_range1.segment_range_tab(21).segment_high := lc_merge_range1.SEGMENT21_HIGH;
1971 p_budget_range1.segment_range_tab(21).data_type := l_data_type;
1972
1973 p_budget_range1.segment_range_tab(22).segment_low := lc_merge_range1.SEGMENT22_LOW;
1974 p_budget_range1.segment_range_tab(22).segment_high := lc_merge_range1.SEGMENT22_HIGH;
1975 p_budget_range1.segment_range_tab(22).data_type := l_data_type;
1976
1977 p_budget_range1.segment_range_tab(23).segment_low := lc_merge_range1.SEGMENT23_LOW;
1978 p_budget_range1.segment_range_tab(23).segment_high := lc_merge_range1.SEGMENT23_HIGH;
1979 p_budget_range1.segment_range_tab(23).data_type := l_data_type;
1980
1981 p_budget_range1.segment_range_tab(24).segment_low := lc_merge_range1.SEGMENT24_LOW;
1982 p_budget_range1.segment_range_tab(24).segment_high := lc_merge_range1.SEGMENT24_HIGH;
1983 p_budget_range1.segment_range_tab(24).data_type := l_data_type;
1984
1985 p_budget_range1.segment_range_tab(25).segment_low := lc_merge_range1.SEGMENT25_LOW;
1986 p_budget_range1.segment_range_tab(25).segment_high := lc_merge_range1.SEGMENT25_HIGH;
1987 p_budget_range1.segment_range_tab(25).data_type := l_data_type;
1988
1989 p_budget_range1.segment_range_tab(26).segment_low := lc_merge_range1.SEGMENT26_LOW;
1990 p_budget_range1.segment_range_tab(26).segment_high := lc_merge_range1.SEGMENT26_HIGH;
1991 p_budget_range1.segment_range_tab(26).data_type := l_data_type;
1992
1993 p_budget_range1.segment_range_tab(27).segment_low := lc_merge_range1.SEGMENT27_LOW;
1994 p_budget_range1.segment_range_tab(27).segment_high := lc_merge_range1.SEGMENT27_HIGH;
1995 p_budget_range1.segment_range_tab(27).data_type := l_data_type;
1996
1997 p_budget_range1.segment_range_tab(28).segment_low := lc_merge_range1.SEGMENT28_LOW;
1998 p_budget_range1.segment_range_tab(28).segment_high := lc_merge_range1.SEGMENT28_HIGH;
1999 p_budget_range1.segment_range_tab(28).data_type := l_data_type;
2000
2001 p_budget_range1.segment_range_tab(29).segment_low := lc_merge_range1.SEGMENT29_LOW;
2002 p_budget_range1.segment_range_tab(29).segment_high := lc_merge_range1.SEGMENT29_HIGH;
2003 p_budget_range1.segment_range_tab(29).data_type := l_data_type;
2004
2005 p_budget_range1.segment_range_tab(30).segment_low := lc_merge_range1.SEGMENT30_LOW;
2006 p_budget_range1.segment_range_tab(30).segment_high := lc_merge_range1.SEGMENT30_HIGH;
2007 p_budget_range1.segment_range_tab(30).data_type := l_data_type;
2008
2009
2010 p_budget_range2.range_id := lc_merge_range2.range_id;
2011 p_budget_range2.segment_range_tab := segment_range_type();
2012 p_budget_range2.segment_range_tab.extend(30);
2013
2014 p_budget_range2.segment_range_tab(1).segment_low := lc_merge_range2.SEGMENT1_LOW;
2015 p_budget_range2.segment_range_tab(1).segment_high := lc_merge_range2.SEGMENT1_HIGH;
2016 p_budget_range2.segment_range_tab(1).data_type := l_data_type;
2017
2018 p_budget_range2.segment_range_tab(2).segment_low := lc_merge_range2.SEGMENT2_LOW;
2019 p_budget_range2.segment_range_tab(2).segment_high := lc_merge_range2.SEGMENT2_HIGH;
2020 p_budget_range2.segment_range_tab(2).data_type := l_data_type;
2021
2022 p_budget_range2.segment_range_tab(3).segment_low := lc_merge_range2.SEGMENT3_LOW;
2023 p_budget_range2.segment_range_tab(3).segment_high := lc_merge_range2.SEGMENT3_HIGH;
2024 p_budget_range2.segment_range_tab(3).data_type := l_data_type;
2025
2026 p_budget_range2.segment_range_tab(4).segment_low := lc_merge_range2.SEGMENT4_LOW;
2027 p_budget_range2.segment_range_tab(4).segment_high := lc_merge_range2.SEGMENT4_HIGH;
2028 p_budget_range2.segment_range_tab(4).data_type := l_data_type;
2029
2030 p_budget_range2.segment_range_tab(5).segment_low := lc_merge_range2.SEGMENT5_LOW;
2031 p_budget_range2.segment_range_tab(5).segment_high := lc_merge_range2.SEGMENT5_HIGH;
2032 p_budget_range2.segment_range_tab(5).data_type := l_data_type;
2033
2034 p_budget_range2.segment_range_tab(6).segment_low := lc_merge_range2.SEGMENT6_LOW;
2035 p_budget_range2.segment_range_tab(6).segment_high := lc_merge_range2.SEGMENT6_HIGH;
2036 p_budget_range2.segment_range_tab(6).data_type := l_data_type;
2037
2038 p_budget_range2.segment_range_tab(7).segment_low := lc_merge_range2.SEGMENT7_LOW;
2039 p_budget_range2.segment_range_tab(7).segment_high := lc_merge_range2.SEGMENT7_HIGH;
2040 p_budget_range2.segment_range_tab(7).data_type := l_data_type;
2041
2042 p_budget_range2.segment_range_tab(8).segment_low := lc_merge_range2.SEGMENT8_LOW;
2043 p_budget_range2.segment_range_tab(8).segment_high := lc_merge_range2.SEGMENT8_HIGH;
2044 p_budget_range2.segment_range_tab(8).data_type := l_data_type;
2045
2046 p_budget_range2.segment_range_tab(9).segment_low := lc_merge_range2.SEGMENT9_LOW;
2047 p_budget_range2.segment_range_tab(9).segment_high := lc_merge_range2.SEGMENT9_HIGH;
2048 p_budget_range2.segment_range_tab(9).data_type := l_data_type;
2049
2050 p_budget_range2.segment_range_tab(10).segment_low := lc_merge_range2.SEGMENT10_LOW;
2051 p_budget_range2.segment_range_tab(10).segment_high := lc_merge_range2.SEGMENT10_HIGH;
2052 p_budget_range2.segment_range_tab(10).data_type := l_data_type;
2053
2054 p_budget_range2.segment_range_tab(11).segment_low := lc_merge_range2.SEGMENT11_LOW;
2055 p_budget_range2.segment_range_tab(11).segment_high := lc_merge_range2.SEGMENT11_HIGH;
2056 p_budget_range2.segment_range_tab(11).data_type := l_data_type;
2057
2058 p_budget_range2.segment_range_tab(12).segment_low := lc_merge_range2.SEGMENT12_LOW;
2059 p_budget_range2.segment_range_tab(12).segment_high := lc_merge_range2.SEGMENT12_HIGH;
2060 p_budget_range2.segment_range_tab(12).data_type := l_data_type;
2061
2062 p_budget_range2.segment_range_tab(13).segment_low := lc_merge_range2.SEGMENT13_LOW;
2063 p_budget_range2.segment_range_tab(13).segment_high := lc_merge_range2.SEGMENT13_HIGH;
2064 p_budget_range2.segment_range_tab(13).data_type := l_data_type;
2065
2066 p_budget_range2.segment_range_tab(14).segment_low := lc_merge_range2.SEGMENT14_LOW;
2067 p_budget_range2.segment_range_tab(14).segment_high := lc_merge_range2.SEGMENT14_HIGH;
2068 p_budget_range2.segment_range_tab(14).data_type := l_data_type;
2069
2070 p_budget_range2.segment_range_tab(15).segment_low := lc_merge_range2.SEGMENT15_LOW;
2071 p_budget_range2.segment_range_tab(15).segment_high := lc_merge_range2.SEGMENT15_HIGH;
2072 p_budget_range2.segment_range_tab(15).data_type := l_data_type;
2073
2074 p_budget_range2.segment_range_tab(16).segment_low := lc_merge_range2.SEGMENT16_LOW;
2075 p_budget_range2.segment_range_tab(16).segment_high := lc_merge_range2.SEGMENT16_HIGH;
2076 p_budget_range2.segment_range_tab(16).data_type := l_data_type;
2077
2078 p_budget_range2.segment_range_tab(17).segment_low := lc_merge_range2.SEGMENT17_LOW;
2079 p_budget_range2.segment_range_tab(17).segment_high := lc_merge_range2.SEGMENT17_HIGH;
2080 p_budget_range2.segment_range_tab(17).data_type := l_data_type;
2081
2082 p_budget_range2.segment_range_tab(18).segment_low := lc_merge_range2.SEGMENT18_LOW;
2083 p_budget_range2.segment_range_tab(18).segment_high := lc_merge_range2.SEGMENT18_HIGH;
2084 p_budget_range2.segment_range_tab(18).data_type := l_data_type;
2085
2086 p_budget_range2.segment_range_tab(19).segment_low := lc_merge_range2.SEGMENT19_LOW;
2087 p_budget_range2.segment_range_tab(19).segment_high := lc_merge_range2.SEGMENT19_HIGH;
2088 p_budget_range2.segment_range_tab(19).data_type := l_data_type;
2089
2090 p_budget_range2.segment_range_tab(20).segment_low := lc_merge_range2.SEGMENT20_LOW;
2091 p_budget_range2.segment_range_tab(20).segment_high := lc_merge_range2.SEGMENT20_HIGH;
2092 p_budget_range2.segment_range_tab(20).data_type := l_data_type;
2093
2094 p_budget_range2.segment_range_tab(21).segment_low := lc_merge_range2.SEGMENT21_LOW;
2095 p_budget_range2.segment_range_tab(21).segment_high := lc_merge_range2.SEGMENT21_HIGH;
2096 p_budget_range2.segment_range_tab(21).data_type := l_data_type;
2097
2098 p_budget_range2.segment_range_tab(22).segment_low := lc_merge_range2.SEGMENT22_LOW;
2099 p_budget_range2.segment_range_tab(22).segment_high := lc_merge_range2.SEGMENT22_HIGH;
2100 p_budget_range2.segment_range_tab(22).data_type := l_data_type;
2101
2102 p_budget_range2.segment_range_tab(23).segment_low := lc_merge_range2.SEGMENT23_LOW;
2103 p_budget_range2.segment_range_tab(23).segment_high := lc_merge_range2.SEGMENT23_HIGH;
2104 p_budget_range2.segment_range_tab(23).data_type := l_data_type;
2105
2106 p_budget_range2.segment_range_tab(24).segment_low := lc_merge_range2.SEGMENT24_LOW;
2107 p_budget_range2.segment_range_tab(24).segment_high := lc_merge_range2.SEGMENT24_HIGH;
2108 p_budget_range2.segment_range_tab(24).data_type := l_data_type;
2109
2110 p_budget_range2.segment_range_tab(25).segment_low := lc_merge_range2.SEGMENT25_LOW;
2111 p_budget_range2.segment_range_tab(25).segment_high := lc_merge_range2.SEGMENT25_HIGH;
2112 p_budget_range2.segment_range_tab(25).data_type := l_data_type;
2113
2114 p_budget_range2.segment_range_tab(26).segment_low := lc_merge_range2.SEGMENT26_LOW;
2115 p_budget_range2.segment_range_tab(26).segment_high := lc_merge_range2.SEGMENT26_HIGH;
2116 p_budget_range2.segment_range_tab(26).data_type := l_data_type;
2117
2118 p_budget_range2.segment_range_tab(27).segment_low := lc_merge_range2.SEGMENT27_LOW;
2119 p_budget_range2.segment_range_tab(27).segment_high := lc_merge_range2.SEGMENT27_HIGH;
2120 p_budget_range2.segment_range_tab(27).data_type := l_data_type;
2121
2122 p_budget_range2.segment_range_tab(28).segment_low := lc_merge_range2.SEGMENT28_LOW;
2123 p_budget_range2.segment_range_tab(28).segment_high := lc_merge_range2.SEGMENT28_HIGH;
2124 p_budget_range2.segment_range_tab(28).data_type := l_data_type;
2125
2126 p_budget_range2.segment_range_tab(29).segment_low := lc_merge_range2.SEGMENT29_LOW;
2127 p_budget_range2.segment_range_tab(29).segment_high := lc_merge_range2.SEGMENT29_HIGH;
2128 p_budget_range2.segment_range_tab(29).data_type := l_data_type;
2129
2130 p_budget_range2.segment_range_tab(30).segment_low := lc_merge_range2.SEGMENT30_LOW;
2131 p_budget_range2.segment_range_tab(30).segment_high := lc_merge_range2.SEGMENT30_HIGH;
2132 p_budget_range2.segment_range_tab(30).data_type := l_data_type;
2133
2134
2135 l_index_number := 0;
2136 p_segment_tab := segment_type();
2137
2138
2139 --This for loops determines the number of segments of p_budget_range1
2140 --and p_budget_range2 that overlap
2141 --Each segment that overlap is split by calling SPLIT_RANGES. Once this
2142 --for loop is executed p_segment_tab has the list of segments splitted
2143 FOR i IN 1..30 LOOP
2144 IF p_budget_range1.segment_range_tab(i).segment_low IS NOT NULL AND
2145 p_budget_range1.segment_range_tab(i).segment_high IS NOT NULL AND
2146 p_budget_range2.segment_range_tab(i).segment_low IS NOT NULL AND
2147 p_budget_range2.segment_range_tab(i).segment_high IS NOT NULL AND
2148 (p_budget_range1.segment_range_tab(i).segment_low <= p_budget_range2.segment_range_tab(i).segment_high
2149 AND
2150 p_budget_range1.segment_range_tab(i).segment_high >= p_budget_range2.segment_range_tab(i).segment_low
2151 )
2152 THEN
2153
2154 IF p_budget_range1.segment_range_tab(i).segment_low = p_budget_range2.segment_range_tab(i).segment_low
2155 AND p_budget_range2.segment_range_tab(i).segment_high = p_budget_range2.segment_range_tab(i).segment_high THEN
2156 NULL;
2157
2158 ELSE
2159 l_index_number := l_index_number + 1;
2160
2161
2162
2163 p_segment1.segment_number := i;
2164 p_segment1.data_type := l_data_type;
2165 p_segment1.segment_low := p_budget_range1.segment_range_tab(i).SEGMENT_LOW;
2166 p_segment1.segment_high := p_budget_range1.segment_range_tab(i).SEGMENT_HIGH;
2167 p_segment1.budget_tab := BUDGET_TYPE();
2168
2169 FOR m IN 1..lc_merge_range1_bc.COUNT LOOP
2170 p_segment1.budget_tab.extend(1);
2171 p_segment1.budget_tab(m) := lc_merge_range1_bc(m).funding_budget_version_id;
2172 END LOOP;
2173
2174
2175 p_segment2.segment_number := i;
2176 p_segment2.data_type := l_data_type;
2177 p_segment2.segment_low := p_budget_range2.segment_range_tab(i).SEGMENT_LOW;
2178 p_segment2.segment_high := p_budget_range2.segment_range_tab(i).SEGMENT_HIGH;
2179 p_segment2.budget_tab := BUDGET_TYPE();
2180
2181 FOR m IN 1..lc_merge_range2_bc.COUNT LOOP
2182 p_segment2.budget_tab.extend(1);
2183 p_segment2.budget_tab(m) := lc_merge_range2_bc(m).funding_budget_version_id;
2184 END LOOP;
2185
2186 SPLIT_RANGES(p_segment1,
2187 p_segment2,
2188 p_segment_tab,
2189 l_index_number,
2190 l_errbuf,
2191 l_retcode);
2192
2193 IF l_retcode IS NOT NULL AND l_retcode = -1 THEN
2194 retcode := l_retcode;
2195 errbuf := l_errbuf;
2196 RETURN;
2197 END IF;
2198
2199
2200
2201 END IF;
2202
2203 END IF;
2204
2205 END LOOP;
2206
2207 IF g_debug_enabled = 1 THEN
2208 PRINT_SPLIT_INFO(p_segment_tab);
2209 END IF;
2210
2211 l_final_budget_ranges := BUDGET_RANGE_TYPE();
2212
2213 -- Merging of segments in p_segment_tab happens by this function calll
2214 -- The final splitted budget ranges are present in l_final_budget_ranges
2215 MERGE_SEGMENTS(p_budget_range1, p_segment_tab, l_final_budget_ranges, l_index_number, l_errbuf, l_retcode);
2216
2217 IF l_retcode IS NOT NULL AND l_retcode = -1 THEN
2218 retcode := l_retcode;
2219 errbuf := l_errbuf;
2220 RETURN;
2221 END IF;
2222
2223 IF g_debug_enabled = 1 THEN
2224 PRINT_MERGE_INFO(l_final_budget_ranges);
2225 END IF;
2226
2227
2228 -- This for loop is used to insert the split ranges into the backend
2229 -- This is done by comparing the budgets associated to
2230 -- each split range with lc_merge_range2_bc or lc_merge_range1_bc
2231 -- Based on this insertion of corresponding data occurs
2232 FOR i IN 1..l_final_budget_ranges.COUNT LOOP
2233
2234 --If the current range has budgets equal to lc_merge_range2_bc
2235 --then insertion happens and data corresponding to lc_merge_range2_bc
2236 --are inserted into backend. Otherwise, data corresponding to
2237 --lc_merge_range1_bc is inserted.
2238
2239 --Compare Budgets If
2240 IF COMPARE_BUDGETS(l_final_budget_ranges(i).budget_tab,lc_merge_range2_bc) THEN
2241
2242 l_range_id_seq := l_range_id_seq + 1;
2243
2244 --Select the maximum sequence number
2245 DECLARE
2246 l_seq_number1 NUMBER;
2247 l_seq_number2 NUMBER;
2248 BEGIN
2249 SELECT max(sequence_number)+1
2250 INTO l_seq_number1
2251 FROM IGI_UPG_GL_BUDGET_ASSIGNMENT
2252 WHERE
2253 budget_entity_id = lc_merge_range2.budget_entity_id;
2254
2255 SELECT max(sequence_number)+1
2256 INTO l_seq_number2
2257 FROM GL_BUDGET_ASSIGNMENT_RANGES
2258 WHERE
2259 budget_entity_id = lc_merge_range2.budget_entity_id;
2260
2261 IF l_seq_number1 IS NULL and l_seq_number2 IS NULL THEN
2262 l_seq_number := 10;
2263 ELSE
2264 IF nvl(l_seq_number1,-1) < nvl(l_seq_number2,-1) THEN
2265 l_seq_number := l_seq_number2;
2266
2267 ELSE
2268 l_seq_number := l_seq_number1;
2269 END IF;
2270 END IF;
2271
2272 EXCEPTION
2273 WHEN OTHERS THEN
2274 l_seq_number := 10;
2275
2276 END;
2277
2278 IF l_seq_number IS NULL OR l_seq_number = 0 THEN
2279 l_seq_number := 10;
2280 END IF;
2281
2282 -- For range l_final_budget_ranges(i) insert data corresponding
2283 -- to lc_merge_range2
2284 BEGIN
2285
2286 INSERT INTO IGI_UPG_GL_BUDGET_ASSIGNMENT
2287 (
2288 BUDGET_ENTITY_ID,
2289 LEDGER_ID,
2290 CURRENCY_CODE,
2291 ENTRY_CODE,
2292 RANGE_ID,
2293 STATUS,
2294 LAST_UPDATE_DATE,
2295 AUTOMATIC_ENCUMBRANCE_FLAG,
2296 CREATED_BY,
2297 CREATION_DATE,
2298 FUNDS_CHECK_LEVEL_CODE,
2299 LAST_UPDATED_BY,
2300 LAST_UPDATE_LOGIN,
2301 SEQUENCE_NUMBER,
2302 SEGMENT1_LOW,
2303 SEGMENT1_HIGH,
2304 SEGMENT2_LOW,
2305 SEGMENT2_HIGH,
2306 SEGMENT3_LOW,
2307 SEGMENT3_HIGH,
2308 SEGMENT4_LOW,
2309 SEGMENT4_HIGH,
2310 SEGMENT5_LOW,
2311 SEGMENT5_HIGH,
2312 SEGMENT6_LOW,
2313 SEGMENT6_HIGH,
2314 SEGMENT7_LOW,
2315 SEGMENT7_HIGH,
2316 SEGMENT8_LOW,
2317 SEGMENT8_HIGH,
2318 SEGMENT9_LOW,
2319 SEGMENT9_HIGH,
2320 SEGMENT10_LOW,
2321 SEGMENT10_HIGH,
2322 SEGMENT11_LOW,
2323 SEGMENT11_HIGH,
2324 SEGMENT12_LOW,
2325 SEGMENT12_HIGH,
2326 SEGMENT13_LOW,
2327 SEGMENT13_HIGH,
2328 SEGMENT14_LOW,
2329 SEGMENT14_HIGH,
2330 SEGMENT15_LOW,
2331 SEGMENT15_HIGH,
2332 SEGMENT16_LOW,
2333 SEGMENT16_HIGH,
2334 SEGMENT17_LOW,
2335 SEGMENT17_HIGH,
2336 SEGMENT18_LOW,
2337 SEGMENT18_HIGH,
2338 SEGMENT19_LOW,
2339 SEGMENT19_HIGH,
2340 SEGMENT20_LOW,
2341 SEGMENT20_HIGH,
2342 SEGMENT21_LOW,
2343 SEGMENT21_HIGH,
2344 SEGMENT22_LOW,
2345 SEGMENT22_HIGH,
2346 SEGMENT23_LOW,
2347 SEGMENT23_HIGH,
2348 SEGMENT24_LOW,
2349 SEGMENT24_HIGH,
2350 SEGMENT25_LOW,
2351 SEGMENT25_HIGH,
2352 SEGMENT26_LOW,
2353 SEGMENT26_HIGH,
2354 SEGMENT27_LOW,
2355 SEGMENT27_HIGH,
2356 SEGMENT28_LOW,
2357 SEGMENT28_HIGH,
2358 SEGMENT29_LOW,
2359 SEGMENT29_HIGH,
2360 SEGMENT30_LOW,
2361 SEGMENT30_HIGH,
2362 AMOUNT_TYPE,
2363 BOUNDARY_CODE,
2364 CONTEXT,
2365 FUNDING_BUDGET_VERSION_ID,
2366 PROGRAM_APPLICATION_ID,
2367 PROGRAM_ID,
2368 PROGRAM_UPDATE_DATE,
2369 REQUEST_ID,
2370 ATTRIBUTE1,
2371 ATTRIBUTE2,
2372 ATTRIBUTE3,
2373 ATTRIBUTE4,
2374 ATTRIBUTE5,
2375 ATTRIBUTE6,
2376 ATTRIBUTE7,
2377 ATTRIBUTE8,
2378 ATTRIBUTE9,
2379 ATTRIBUTE10,
2380 ATTRIBUTE11,
2381 ATTRIBUTE12,
2382 ATTRIBUTE13,
2383 ATTRIBUTE14,
2384 ATTRIBUTE15
2385 )
2386
2387 VALUES (
2388 lc_merge_range2.budget_entity_id,
2389 lc_merge_range2.ledger_id,
2390 lc_merge_range2.currency_code,
2391 lc_merge_range2.entry_code,
2392 l_range_id_seq,
2393 lc_merge_range2.status,
2394 sysdate,
2395 lc_merge_range2.automatic_encumbrance_flag,
2396 lc_merge_range2.created_by,
2397 lc_merge_range2.creation_date,
2398 lc_merge_range2.funds_check_level_code,
2399 lc_merge_range2.last_updated_by,
2400 lc_merge_range2.last_update_login,
2401 l_seq_number,
2402 l_final_budget_ranges(i).segment_range_tab(1).SEGMENT_LOW,
2403 l_final_budget_ranges(i).segment_range_tab(1).SEGMENT_HIGH,
2404 l_final_budget_ranges(i).segment_range_tab(2).SEGMENT_LOW,
2405 l_final_budget_ranges(i).segment_range_tab(2).SEGMENT_HIGH,
2406 l_final_budget_ranges(i).segment_range_tab(3).SEGMENT_LOW,
2407 l_final_budget_ranges(i).segment_range_tab(3).SEGMENT_HIGH,
2408 l_final_budget_ranges(i).segment_range_tab(4).SEGMENT_LOW,
2409 l_final_budget_ranges(i).segment_range_tab(4).SEGMENT_HIGH,
2410 l_final_budget_ranges(i).segment_range_tab(5).SEGMENT_LOW,
2411 l_final_budget_ranges(i).segment_range_tab(5).SEGMENT_HIGH,
2412 l_final_budget_ranges(i).segment_range_tab(6).SEGMENT_LOW,
2413 l_final_budget_ranges(i).segment_range_tab(6).SEGMENT_HIGH,
2414 l_final_budget_ranges(i).segment_range_tab(7).SEGMENT_LOW,
2415 l_final_budget_ranges(i).segment_range_tab(7).SEGMENT_HIGH,
2416 l_final_budget_ranges(i).segment_range_tab(8).SEGMENT_LOW,
2417 l_final_budget_ranges(i).segment_range_tab(8).SEGMENT_HIGH,
2418 l_final_budget_ranges(i).segment_range_tab(9).SEGMENT_LOW,
2419 l_final_budget_ranges(i).segment_range_tab(9).SEGMENT_HIGH,
2420 l_final_budget_ranges(i).segment_range_tab(10).SEGMENT_LOW,
2421 l_final_budget_ranges(i).segment_range_tab(10).SEGMENT_HIGH,
2422 l_final_budget_ranges(i).segment_range_tab(11).SEGMENT_LOW,
2423 l_final_budget_ranges(i).segment_range_tab(11).SEGMENT_HIGH,
2424 l_final_budget_ranges(i).segment_range_tab(12).SEGMENT_LOW,
2425 l_final_budget_ranges(i).segment_range_tab(12).SEGMENT_HIGH,
2426 l_final_budget_ranges(i).segment_range_tab(13).SEGMENT_LOW,
2427 l_final_budget_ranges(i).segment_range_tab(13).SEGMENT_HIGH,
2428 l_final_budget_ranges(i).segment_range_tab(14).SEGMENT_LOW,
2429 l_final_budget_ranges(i).segment_range_tab(14).SEGMENT_HIGH,
2430 l_final_budget_ranges(i).segment_range_tab(15).SEGMENT_LOW,
2431 l_final_budget_ranges(i).segment_range_tab(15).SEGMENT_HIGH,
2432 l_final_budget_ranges(i).segment_range_tab(16).SEGMENT_LOW,
2433 l_final_budget_ranges(i).segment_range_tab(16).SEGMENT_HIGH,
2434 l_final_budget_ranges(i).segment_range_tab(17).SEGMENT_LOW,
2435 l_final_budget_ranges(i).segment_range_tab(17).SEGMENT_HIGH,
2436 l_final_budget_ranges(i).segment_range_tab(18).SEGMENT_LOW,
2437 l_final_budget_ranges(i).segment_range_tab(18).SEGMENT_HIGH,
2438 l_final_budget_ranges(i).segment_range_tab(19).SEGMENT_LOW,
2439 l_final_budget_ranges(i).segment_range_tab(19).SEGMENT_HIGH,
2440 l_final_budget_ranges(i).segment_range_tab(20).SEGMENT_LOW,
2441 l_final_budget_ranges(i).segment_range_tab(20).SEGMENT_HIGH,
2442 l_final_budget_ranges(i).segment_range_tab(21).SEGMENT_LOW,
2443 l_final_budget_ranges(i).segment_range_tab(21).SEGMENT_HIGH,
2444 l_final_budget_ranges(i).segment_range_tab(22).SEGMENT_LOW,
2445 l_final_budget_ranges(i).segment_range_tab(22).SEGMENT_HIGH,
2446 l_final_budget_ranges(i).segment_range_tab(23).SEGMENT_LOW,
2447 l_final_budget_ranges(i).segment_range_tab(23).SEGMENT_HIGH,
2448 l_final_budget_ranges(i).segment_range_tab(24).SEGMENT_LOW,
2449 l_final_budget_ranges(i).segment_range_tab(24).SEGMENT_HIGH,
2450 l_final_budget_ranges(i).segment_range_tab(25).SEGMENT_LOW,
2451 l_final_budget_ranges(i).segment_range_tab(25).SEGMENT_HIGH,
2452 l_final_budget_ranges(i).segment_range_tab(26).SEGMENT_LOW,
2453 l_final_budget_ranges(i).segment_range_tab(26).SEGMENT_HIGH,
2454 l_final_budget_ranges(i).segment_range_tab(27).SEGMENT_LOW,
2455 l_final_budget_ranges(i).segment_range_tab(27).SEGMENT_HIGH,
2456 l_final_budget_ranges(i).segment_range_tab(28).SEGMENT_LOW,
2457 l_final_budget_ranges(i).segment_range_tab(28).SEGMENT_HIGH,
2458 l_final_budget_ranges(i).segment_range_tab(29).SEGMENT_LOW,
2459 l_final_budget_ranges(i).segment_range_tab(29).SEGMENT_HIGH,
2460 l_final_budget_ranges(i).segment_range_tab(30).SEGMENT_LOW,
2461 l_final_budget_ranges(i).segment_range_tab(30).SEGMENT_HIGH,
2462 lc_merge_range2.amount_type,
2463 lc_merge_range2.boundary_code,
2464 lc_merge_range2.context,
2465 lc_merge_range2.funding_budget_version_id,
2466 lc_merge_range2.program_application_id,
2467 lc_merge_range2.program_id,
2468 lc_merge_range2.program_update_date,
2469 lc_merge_range2.request_id,
2470 lc_merge_range2.attribute1,
2471 lc_merge_range2.attribute2,
2472 lc_merge_range2.attribute3,
2473 lc_merge_range2.attribute4,
2474 lc_merge_range2.attribute5,
2475 lc_merge_range2.attribute6,
2476 lc_merge_range2.attribute7,
2477 lc_merge_range2.attribute8,
2478 lc_merge_range2.attribute9,
2479 lc_merge_range2.attribute10,
2480 lc_merge_range2.attribute11,
2481 lc_merge_range2.attribute12,
2482 lc_merge_range2.attribute13,
2483 lc_merge_range2.attribute14,
2484 lc_merge_range2.attribute15
2485 );
2486 EXCEPTION
2487 WHEN OTHERS THEN
2488 fnd_file.put_line(fnd_file.output, 'Error inserting records into IGI_UPG_GL_BUDGET_ASSIGNMENT Location 1');
2489 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'
2490 ||'Error inserting records into IGI_UPG_GL_BUDGET_ASSIGNMENT Location 1 '||SQLERRM);
2491 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into IGI_UPG_GL_BUDGET_ASSIGNMENT Location 1 '||SQLERRM;
2492 retcode := -1;
2493 RETURN;
2494 END;
2495
2496 --For each budget associated to this range, insert data
2497 --by determing the corresponding budget information
2498 --from lc_merge_range2_bc
2499 FOR j IN 1..l_final_budget_ranges(i).budget_tab.COUNT LOOP
2500 l_inserted := FALSE;
2501 FOR k IN 1..lc_merge_range2_bc.COUNT LOOP
2502 IF l_final_budget_ranges(i).budget_tab(j) = lc_merge_range2_bc(k).funding_budget_version_id THEN
2503 BEGIN
2504 INSERT INTO IGI_UPG_GL_BUDORG_BC_OPTIONS
2505 (
2506 RANGE_ID,
2507 FUNDING_BUDGET_VERSION_ID,
2508 FUNDS_CHECK_LEVEL_CODE,
2509 AMOUNT_TYPE,
2510 BOUNDARY_CODE,
2511 CREATED_BY,
2512 CREATION_DATE,
2513 LAST_UPDATED_BY,
2514 LAST_UPDATE_LOGIN,
2515 LAST_UPDATE_DATE
2516 )
2517 VALUES
2518 (
2519 l_range_id_seq,
2520 lc_merge_range2_bc(k).funding_budget_version_id,
2521 lc_merge_range2_bc(k).funds_check_level_code,
2522 lc_merge_range2_bc(k).amount_type,
2523 lc_merge_range2_bc(k).boundary_code,
2524 lc_merge_range2_bc(k).created_by,
2525 lc_merge_range2_bc(k).creation_date,
2526 lc_merge_range2_bc(k).last_updated_by,
2527 lc_merge_range2_bc(k).last_update_login,
2528 sysdate
2529 );
2530 EXCEPTION
2531 WHEN OTHERS THEN
2532 fnd_file.put_line(fnd_file.output, 'Error inserting records into IGI_UPG_GL_BUDORG_BC_OPTIONS Location 1');
2533 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'
2534 ||'Error inserting records into IGI_UPG_GL_BUDORG_BC_OPTIONS Location 1 '||SQLERRM);
2535 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2536 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 1 '||SQLERRM;
2537 retcode := -1;
2538 RETURN;
2539 END;
2540 l_inserted := TRUE;
2541 EXIT;
2542 END IF;
2543 END LOOP;
2544 IF NOT l_inserted THEN
2545 fnd_file.put_line(fnd_file.output, 'Insertion failed - Reason not explicit in merge 1');
2546 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Insertion failed - Reason not explicit in merge 1');
2547 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Insertion failed - Reason not explicit in merge 1';
2548 retcode := -1;
2549 RETURN;
2550 END IF;
2551 END LOOP; -- END l_final_budget_ranges(i).budget_tab
2552
2553 ELSE -- Else for Compare Budgets If
2554
2555
2556 l_range_id_seq := l_range_id_seq + 1;
2557
2558 --Select the maximum available sequence number
2559 DECLARE
2560 l_seq_number1 NUMBER;
2561 l_seq_number2 NUMBER;
2562 BEGIN
2563 SELECT max(sequence_number)+1
2564 INTO l_seq_number1
2565 FROM IGI_UPG_GL_BUDGET_ASSIGNMENT
2566 WHERE
2567 budget_entity_id = lc_merge_range1.budget_entity_id;
2568
2569 SELECT max(sequence_number)+1
2570 INTO l_seq_number2
2571 FROM GL_BUDGET_ASSIGNMENT_RANGES
2572 WHERE
2573 budget_entity_id = lc_merge_range1.budget_entity_id;
2574
2575 IF l_seq_number1 IS NULL and l_seq_number2 IS NULL THEN
2576 l_seq_number := 10;
2577 ELSE
2578 IF nvl(l_seq_number1,-1) < nvl(l_seq_number2,-1) THEN
2579 l_seq_number := l_seq_number2;
2580
2581 ELSE
2582 l_seq_number := l_seq_number1;
2583 END IF;
2584 END IF;
2585
2586 EXCEPTION
2587 WHEN OTHERS THEN
2588 l_seq_number := 10;
2589
2590 END;
2591
2592 IF l_seq_number IS NULL OR l_seq_number = 0 THEN
2593 l_seq_number := 10;
2594 END IF;
2595
2596
2597 -- For range l_final_budget_ranges(i) insert data corresponding
2598 -- to lc_merge_range1
2599 BEGIN
2600
2601 INSERT INTO IGI_UPG_GL_BUDGET_ASSIGNMENT
2602 (
2603 BUDGET_ENTITY_ID,
2604 LEDGER_ID,
2605 CURRENCY_CODE,
2606 ENTRY_CODE,
2607 RANGE_ID,
2608 STATUS,
2609 LAST_UPDATE_DATE,
2610 AUTOMATIC_ENCUMBRANCE_FLAG,
2611 CREATED_BY,
2612 CREATION_DATE,
2613 FUNDS_CHECK_LEVEL_CODE,
2614 LAST_UPDATED_BY,
2615 LAST_UPDATE_LOGIN,
2616 SEQUENCE_NUMBER,
2617 SEGMENT1_LOW,
2618 SEGMENT1_HIGH,
2619 SEGMENT2_LOW,
2620 SEGMENT2_HIGH,
2621 SEGMENT3_LOW,
2622 SEGMENT3_HIGH,
2623 SEGMENT4_LOW,
2624 SEGMENT4_HIGH,
2625 SEGMENT5_LOW,
2626 SEGMENT5_HIGH,
2627 SEGMENT6_LOW,
2628 SEGMENT6_HIGH,
2629 SEGMENT7_LOW,
2630 SEGMENT7_HIGH,
2631 SEGMENT8_LOW,
2632 SEGMENT8_HIGH,
2633 SEGMENT9_LOW,
2634 SEGMENT9_HIGH,
2635 SEGMENT10_LOW,
2636 SEGMENT10_HIGH,
2637 SEGMENT11_LOW,
2638 SEGMENT11_HIGH,
2639 SEGMENT12_LOW,
2640 SEGMENT12_HIGH,
2641 SEGMENT13_LOW,
2642 SEGMENT13_HIGH,
2643 SEGMENT14_LOW,
2644 SEGMENT14_HIGH,
2645 SEGMENT15_LOW,
2646 SEGMENT15_HIGH,
2647 SEGMENT16_LOW,
2648 SEGMENT16_HIGH,
2649 SEGMENT17_LOW,
2650 SEGMENT17_HIGH,
2651 SEGMENT18_LOW,
2652 SEGMENT18_HIGH,
2653 SEGMENT19_LOW,
2654 SEGMENT19_HIGH,
2655 SEGMENT20_LOW,
2656 SEGMENT20_HIGH,
2657 SEGMENT21_LOW,
2658 SEGMENT21_HIGH,
2659 SEGMENT22_LOW,
2660 SEGMENT22_HIGH,
2661 SEGMENT23_LOW,
2662 SEGMENT23_HIGH,
2663 SEGMENT24_LOW,
2664 SEGMENT24_HIGH,
2665 SEGMENT25_LOW,
2666 SEGMENT25_HIGH,
2667 SEGMENT26_LOW,
2668 SEGMENT26_HIGH,
2669 SEGMENT27_LOW,
2670 SEGMENT27_HIGH,
2671 SEGMENT28_LOW,
2672 SEGMENT28_HIGH,
2673 SEGMENT29_LOW,
2674 SEGMENT29_HIGH,
2675 SEGMENT30_LOW,
2676 SEGMENT30_HIGH,
2677 AMOUNT_TYPE,
2678 BOUNDARY_CODE,
2679 CONTEXT,
2680 FUNDING_BUDGET_VERSION_ID,
2681 PROGRAM_APPLICATION_ID,
2682 PROGRAM_ID,
2683 PROGRAM_UPDATE_DATE,
2684 REQUEST_ID,
2685 ATTRIBUTE1,
2686 ATTRIBUTE2,
2687 ATTRIBUTE3,
2688 ATTRIBUTE4,
2689 ATTRIBUTE5,
2690 ATTRIBUTE6,
2691 ATTRIBUTE7,
2692 ATTRIBUTE8,
2693 ATTRIBUTE9,
2694 ATTRIBUTE10,
2695 ATTRIBUTE11,
2696 ATTRIBUTE12,
2697 ATTRIBUTE13,
2698 ATTRIBUTE14,
2699 ATTRIBUTE15
2700 )
2701
2702 VALUES (
2703 lc_merge_range1.budget_entity_id,
2704 lc_merge_range1.ledger_id,
2705 lc_merge_range1.currency_code,
2706 lc_merge_range1.entry_code,
2707 l_range_id_seq,
2708 lc_merge_range1.status,
2709 sysdate,
2710 lc_merge_range1.automatic_encumbrance_flag,
2711 lc_merge_range1.created_by,
2712 lc_merge_range1.creation_date,
2713 lc_merge_range1.funds_check_level_code,
2714 lc_merge_range1.last_updated_by,
2715 lc_merge_range1.last_update_login,
2716 l_seq_number,
2717 l_final_budget_ranges(i).segment_range_tab(1).SEGMENT_LOW,
2718 l_final_budget_ranges(i).segment_range_tab(1).SEGMENT_HIGH,
2719 l_final_budget_ranges(i).segment_range_tab(2).SEGMENT_LOW,
2720 l_final_budget_ranges(i).segment_range_tab(2).SEGMENT_HIGH,
2721 l_final_budget_ranges(i).segment_range_tab(3).SEGMENT_LOW,
2722 l_final_budget_ranges(i).segment_range_tab(3).SEGMENT_HIGH,
2723 l_final_budget_ranges(i).segment_range_tab(4).SEGMENT_LOW,
2724 l_final_budget_ranges(i).segment_range_tab(4).SEGMENT_HIGH,
2725 l_final_budget_ranges(i).segment_range_tab(5).SEGMENT_LOW,
2726 l_final_budget_ranges(i).segment_range_tab(5).SEGMENT_HIGH,
2727 l_final_budget_ranges(i).segment_range_tab(6).SEGMENT_LOW,
2728 l_final_budget_ranges(i).segment_range_tab(6).SEGMENT_HIGH,
2729 l_final_budget_ranges(i).segment_range_tab(7).SEGMENT_LOW,
2730 l_final_budget_ranges(i).segment_range_tab(7).SEGMENT_HIGH,
2731 l_final_budget_ranges(i).segment_range_tab(8).SEGMENT_LOW,
2732 l_final_budget_ranges(i).segment_range_tab(8).SEGMENT_HIGH,
2733 l_final_budget_ranges(i).segment_range_tab(9).SEGMENT_LOW,
2734 l_final_budget_ranges(i).segment_range_tab(9).SEGMENT_HIGH,
2735 l_final_budget_ranges(i).segment_range_tab(10).SEGMENT_LOW,
2736 l_final_budget_ranges(i).segment_range_tab(10).SEGMENT_HIGH,
2737 l_final_budget_ranges(i).segment_range_tab(11).SEGMENT_LOW,
2738 l_final_budget_ranges(i).segment_range_tab(11).SEGMENT_HIGH,
2739 l_final_budget_ranges(i).segment_range_tab(12).SEGMENT_LOW,
2740 l_final_budget_ranges(i).segment_range_tab(12).SEGMENT_HIGH,
2741 l_final_budget_ranges(i).segment_range_tab(13).SEGMENT_LOW,
2742 l_final_budget_ranges(i).segment_range_tab(13).SEGMENT_HIGH,
2743 l_final_budget_ranges(i).segment_range_tab(14).SEGMENT_LOW,
2744 l_final_budget_ranges(i).segment_range_tab(14).SEGMENT_HIGH,
2745 l_final_budget_ranges(i).segment_range_tab(15).SEGMENT_LOW,
2746 l_final_budget_ranges(i).segment_range_tab(15).SEGMENT_HIGH,
2747 l_final_budget_ranges(i).segment_range_tab(16).SEGMENT_LOW,
2748 l_final_budget_ranges(i).segment_range_tab(16).SEGMENT_HIGH,
2749 l_final_budget_ranges(i).segment_range_tab(17).SEGMENT_LOW,
2750 l_final_budget_ranges(i).segment_range_tab(17).SEGMENT_HIGH,
2751 l_final_budget_ranges(i).segment_range_tab(18).SEGMENT_LOW,
2752 l_final_budget_ranges(i).segment_range_tab(18).SEGMENT_HIGH,
2753 l_final_budget_ranges(i).segment_range_tab(19).SEGMENT_LOW,
2754 l_final_budget_ranges(i).segment_range_tab(19).SEGMENT_HIGH,
2755 l_final_budget_ranges(i).segment_range_tab(20).SEGMENT_LOW,
2756 l_final_budget_ranges(i).segment_range_tab(20).SEGMENT_HIGH,
2757 l_final_budget_ranges(i).segment_range_tab(21).SEGMENT_LOW,
2758 l_final_budget_ranges(i).segment_range_tab(21).SEGMENT_HIGH,
2759 l_final_budget_ranges(i).segment_range_tab(22).SEGMENT_LOW,
2760 l_final_budget_ranges(i).segment_range_tab(22).SEGMENT_HIGH,
2761 l_final_budget_ranges(i).segment_range_tab(23).SEGMENT_LOW,
2762 l_final_budget_ranges(i).segment_range_tab(23).SEGMENT_HIGH,
2763 l_final_budget_ranges(i).segment_range_tab(24).SEGMENT_LOW,
2764 l_final_budget_ranges(i).segment_range_tab(24).SEGMENT_HIGH,
2765 l_final_budget_ranges(i).segment_range_tab(25).SEGMENT_LOW,
2766 l_final_budget_ranges(i).segment_range_tab(25).SEGMENT_HIGH,
2767 l_final_budget_ranges(i).segment_range_tab(26).SEGMENT_LOW,
2768 l_final_budget_ranges(i).segment_range_tab(26).SEGMENT_HIGH,
2769 l_final_budget_ranges(i).segment_range_tab(27).SEGMENT_LOW,
2770 l_final_budget_ranges(i).segment_range_tab(27).SEGMENT_HIGH,
2771 l_final_budget_ranges(i).segment_range_tab(28).SEGMENT_LOW,
2772 l_final_budget_ranges(i).segment_range_tab(28).SEGMENT_HIGH,
2773 l_final_budget_ranges(i).segment_range_tab(29).SEGMENT_LOW,
2774 l_final_budget_ranges(i).segment_range_tab(29).SEGMENT_HIGH,
2775 l_final_budget_ranges(i).segment_range_tab(30).SEGMENT_LOW,
2776 l_final_budget_ranges(i).segment_range_tab(30).SEGMENT_HIGH,
2777 lc_merge_range1.amount_type,
2778 lc_merge_range1.boundary_code,
2779 lc_merge_range1.context,
2780 lc_merge_range1.funding_budget_version_id,
2781 lc_merge_range1.program_application_id,
2782 lc_merge_range1.program_id,
2783 lc_merge_range1.program_update_date,
2784 lc_merge_range1.request_id,
2785 lc_merge_range1.attribute1,
2786 lc_merge_range1.attribute2,
2787 lc_merge_range1.attribute3,
2788 lc_merge_range1.attribute4,
2789 lc_merge_range1.attribute5,
2790 lc_merge_range1.attribute6,
2791 lc_merge_range1.attribute7,
2792 lc_merge_range1.attribute8,
2793 lc_merge_range1.attribute9,
2794 lc_merge_range1.attribute10,
2795 lc_merge_range1.attribute11,
2796 lc_merge_range1.attribute12,
2797 lc_merge_range1.attribute13,
2798 lc_merge_range1.attribute14,
2799 lc_merge_range1.attribute15
2800 );
2801
2802 EXCEPTION
2803 WHEN OTHERS THEN
2804 fnd_file.put_line(fnd_file.output, 'Error inserting records into IGI_UPG_GL_BUDGET_ASSIGNMENT Location 2');
2805 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'
2806 ||'Error inserting records into IGI_UPG_GL_BUDGET_ASSIGNMENT Location 2 '||SQLERRM);
2807 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2808 IGI_UPG_GL_BUDGET_ASSIGNMENT Location 2 '||SQLERRM;
2809 retcode := -1;
2810 RETURN;
2811 END;
2812
2813
2814 --For each budget associated to this range, determine which
2815 --budget tab the value is in. Based on this corresponding
2816 --budget data is inserted
2817 FOR j IN 1..l_final_budget_ranges(i).budget_tab.COUNT LOOP
2818
2819 --l_inserted is used to determine if the values is already
2820 --inserted or not
2821 l_inserted := FALSE;
2822
2823 FOR k IN 1..lc_merge_range1_bc.COUNT LOOP
2824 IF l_final_budget_ranges(i).budget_tab(j) = lc_merge_range1_bc(k).funding_budget_version_id
2825 THEN
2826 BEGIN
2827 INSERT INTO IGI_UPG_GL_BUDORG_BC_OPTIONS
2828 (
2829 RANGE_ID,
2830 FUNDING_BUDGET_VERSION_ID,
2831 FUNDS_CHECK_LEVEL_CODE,
2832 AMOUNT_TYPE,
2833 BOUNDARY_CODE,
2834 CREATED_BY,
2835 CREATION_DATE,
2836 LAST_UPDATED_BY,
2837 LAST_UPDATE_LOGIN,
2838 LAST_UPDATE_DATE
2839 )
2840 VALUES
2841 (
2842 l_range_id_seq,
2843 lc_merge_range1_bc(k).funding_budget_version_id,
2844 lc_merge_range1_bc(k).funds_check_level_code,
2845 lc_merge_range1_bc(k).amount_type,
2846 lc_merge_range1_bc(k).boundary_code,
2847 lc_merge_range1_bc(k).created_by,
2848 lc_merge_range1_bc(k).creation_date,
2849 lc_merge_range1_bc(k).last_updated_by,
2850 lc_merge_range1_bc(k).last_update_login,
2851 sysdate
2852 );
2853 EXCEPTION
2854 WHEN OTHERS THEN
2855 fnd_file.put_line(fnd_file.output, 'Error inserting records into
2856 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 2');
2857 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2858 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 2 '||SQLERRM);
2859 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2860 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 2 '||SQLERRM;
2861 retcode := -1;
2862 RETURN;
2863 END;
2864 l_inserted := TRUE;
2865 EXIT;
2866 END IF;
2867 END LOOP;
2868 IF NOT l_inserted THEN
2869 FOR r IN 1..lc_merge_range2_bc.COUNT LOOP
2870 IF l_final_budget_ranges(i).budget_tab(j) = lc_merge_range2_bc(r).funding_budget_version_id
2871 THEN
2872 BEGIN
2873 INSERT INTO IGI_UPG_GL_BUDORG_BC_OPTIONS
2874 (
2875 RANGE_ID,
2876 FUNDING_BUDGET_VERSION_ID,
2877 FUNDS_CHECK_LEVEL_CODE,
2878 AMOUNT_TYPE,
2879 BOUNDARY_CODE,
2880 CREATED_BY,
2881 CREATION_DATE,
2882 LAST_UPDATED_BY,
2883 LAST_UPDATE_LOGIN,
2884 LAST_UPDATE_DATE
2885 )
2886 VALUES
2887 (
2888 l_range_id_seq,
2889 lc_merge_range2_bc(r).funding_budget_version_id,
2890 lc_merge_range2_bc(r).funds_check_level_code,
2891 lc_merge_range2_bc(r).amount_type,
2892 lc_merge_range2_bc(r).boundary_code,
2893 lc_merge_range2_bc(r).created_by,
2894 lc_merge_range2_bc(r).creation_date,
2895 lc_merge_range2_bc(r).last_updated_by,
2896 lc_merge_range2_bc(r).last_update_login,
2897 sysdate
2898 );
2899 EXCEPTION
2900 WHEN OTHERS THEN
2901 fnd_file.put_line(fnd_file.output, 'Error inserting records into
2902 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 4');
2903 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2904 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 4 '||SQLERRM);
2905 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error inserting records into
2906 IGI_UPG_GL_BUDORG_BC_OPTIONS Location 4 '||SQLERRM;
2907 retcode := -1;
2908 RETURN;
2909 END;
2910 l_inserted := TRUE;
2911 EXIT;
2912 END IF;
2913 END LOOP;
2914 END IF;
2915
2916 IF NOT l_inserted THEN
2917 fnd_file.put_line(fnd_file.output, 'Insertion failed - Reason not explicit');
2918 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Insertion failed - Reason not explicit');
2919 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Insertion failed - Reason not explicit';
2920 retcode := -1;
2921 RETURN;
2922 END IF;
2923
2924 END LOOP; -- END l_final_budget_ranges(i).budget_tab FOR LOOP
2925
2926
2927 END IF; --End of Compare Budgets If
2928 END LOOP; -- End l_final_budget_ranges FOR LOOP
2929
2930 BEGIN
2931 --Since the splits ranges have been inserted
2932 --the original ranges have to be deleted from the backend
2933 DELETE FROM IGI_UPG_GL_BUDGET_ASSIGNMENT WHERE
2934 range_id = lc_merge_range2.range_id OR
2935 range_id = lc_merge_range1.range_id;
2936
2937 DELETE FROM IGI_UPG_GL_BUDORG_BC_OPTIONS WHERE
2938 range_id = lc_merge_range2.range_id OR
2939 range_id = lc_merge_range1.range_id;
2940 EXCEPTION
2941 WHEN OTHERS THEN
2942 fnd_file.put_line(fnd_file.output, 'Error deleting data');
2943 fnd_file.put_line(fnd_file.log, 'Module: LOOP_AND_PROCESS =>'||'Error deleting data'||SQLERRM);
2944 errbuf := 'Module: LOOP_AND_PROCESS =>'||'Error deleting data'||SQLERRM;
2945 retcode := -1;
2946 RETURN;
2947 END;
2948
2949 -- End of Step 3
2950
2951 -- Execution from Step 2 reaches this continue
2952 -- This continue is used to emulate the behavior of loop continuation
2953 <<continue>>
2954 NULL;
2955
2956 END LOOP;
2957
2958 END LOOP_AND_PROCESS;
2959
2960
2961 -- Procedure START_EFC_UPGRADE is the entry point for this upgrade program
2962 -- START_EFC_UPGRADE is called from the concurrent program
2963 -- START_EFC_UPGRADE does the necessary book keeping and in turn calls
2964 -- the procedure LOOP_AND_PROCESS
2965 PROCEDURE START_EFC_UPGRADE
2966 (
2967 errbuf OUT NOCOPY VARCHAR2,
2968 retcode OUT NOCOPY NUMBER,
2969 p_mode IN NUMBER,
2970 p_data_type IN NUMBER,
2971 p_debug_enabled IN NUMBER
2972 )
2973 IS
2974 -- This cursor determines whether overlapping ranges exist
2975 -- This is used to determine whether to proceed with the upgrade or not
2976 CURSOR C_OVERLAPPING_RANGE_EXISTS IS
2977 SELECT 1 FROM DUAL WHERE EXISTS
2978 (
2979 SELECT 1 FROM GL_BUDGET_ASSIGNMENT_RANGES BA1
2980 WHERE EXISTS
2981 (SELECT 1 FROM
2982 GL_BUDGET_ASSIGNMENT_RANGES BA2
2983 WHERE
2984 BA2.ledger_id = BA1.ledger_id
2985 AND BA2.currency_code = BA1.currency_code
2986 AND BA1.RANGE_ID <> BA2.RANGE_ID
2987 AND NVL(BA1.SEGMENT1_LOW,'X') <= NVL(BA2.SEGMENT1_HIGH,'X')
2988 AND NVL(BA1.SEGMENT1_HIGH,'X') >= NVL(BA2.SEGMENT1_LOW,'X')
2989 AND NVL(BA1.SEGMENT2_LOW,'X') <= NVL(BA2.SEGMENT2_HIGH,'X')
2990 AND NVL(BA1.SEGMENT2_HIGH,'X') >= NVL(BA2.SEGMENT2_LOW,'X')
2991 AND NVL(BA1.SEGMENT3_LOW,'X') <= NVL(BA2.SEGMENT3_HIGH,'X')
2992 AND NVL(BA1.SEGMENT3_HIGH,'X') >= NVL(BA2.SEGMENT3_LOW,'X')
2993 AND NVL(BA1.SEGMENT4_LOW,'X') <= NVL(BA2.SEGMENT4_HIGH,'X')
2994 AND NVL(BA1.SEGMENT4_HIGH,'X') >= NVL(BA2.SEGMENT4_LOW,'X')
2995 AND NVL(BA1.SEGMENT5_LOW,'X') <= NVL(BA2.SEGMENT5_HIGH,'X')
2996 AND NVL(BA1.SEGMENT5_HIGH,'X') >= NVL(BA2.SEGMENT5_LOW,'X')
2997 AND NVL(BA1.SEGMENT6_LOW,'X') <= NVL(BA2.SEGMENT6_HIGH,'X')
2998 AND NVL(BA1.SEGMENT6_HIGH,'X') >= NVL(BA2.SEGMENT6_LOW,'X')
2999 AND NVL(BA1.SEGMENT7_LOW,'X') <= NVL(BA2.SEGMENT7_HIGH,'X')
3000 AND NVL(BA1.SEGMENT7_HIGH,'X') >= NVL(BA2.SEGMENT7_LOW,'X')
3001 AND NVL(BA1.SEGMENT8_LOW,'X') <= NVL(BA2.SEGMENT8_HIGH,'X')
3002 AND NVL(BA1.SEGMENT8_HIGH,'X') >= NVL(BA2.SEGMENT8_LOW,'X')
3003 AND NVL(BA1.SEGMENT9_LOW,'X') <= NVL(BA2.SEGMENT9_HIGH,'X')
3004 AND NVL(BA1.SEGMENT9_HIGH,'X') >= NVL(BA2.SEGMENT9_LOW,'X')
3005 AND NVL(BA1.SEGMENT10_LOW,'X') <= NVL(BA2.SEGMENT10_HIGH,'X')
3006 AND NVL(BA1.SEGMENT10_HIGH,'X') >= NVL(BA2.SEGMENT10_LOW,'X')
3007 AND NVL(BA1.SEGMENT11_LOW,'X') <= NVL(BA2.SEGMENT11_HIGH,'X')
3008 AND NVL(BA1.SEGMENT11_HIGH,'X') >= NVL(BA2.SEGMENT11_LOW,'X')
3009 AND NVL(BA1.SEGMENT12_LOW,'X') <= NVL(BA2.SEGMENT12_HIGH,'X')
3010 AND NVL(BA1.SEGMENT12_HIGH,'X') >= NVL(BA2.SEGMENT12_LOW,'X')
3011 AND NVL(BA1.SEGMENT13_LOW,'X') <= NVL(BA2.SEGMENT13_HIGH,'X')
3012 AND NVL(BA1.SEGMENT13_HIGH,'X') >= NVL(BA2.SEGMENT13_LOW,'X')
3013 AND NVL(BA1.SEGMENT14_LOW,'X') <= NVL(BA2.SEGMENT14_HIGH,'X')
3014 AND NVL(BA1.SEGMENT14_HIGH,'X') >= NVL(BA2.SEGMENT14_LOW,'X')
3015 AND NVL(BA1.SEGMENT15_LOW,'X') <= NVL(BA2.SEGMENT15_HIGH,'X')
3016 AND NVL(BA1.SEGMENT15_HIGH,'X') >= NVL(BA2.SEGMENT15_LOW,'X')
3017 AND NVL(BA1.SEGMENT16_LOW,'X') <= NVL(BA2.SEGMENT16_HIGH,'X')
3018 AND NVL(BA1.SEGMENT16_HIGH,'X') >= NVL(BA2.SEGMENT16_LOW,'X')
3019 AND NVL(BA1.SEGMENT17_LOW,'X') <= NVL(BA2.SEGMENT17_HIGH,'X')
3020 AND NVL(BA1.SEGMENT17_HIGH,'X') >= NVL(BA2.SEGMENT17_LOW,'X')
3021 AND NVL(BA1.SEGMENT18_LOW,'X') <= NVL(BA2.SEGMENT18_HIGH,'X')
3022 AND NVL(BA1.SEGMENT18_HIGH,'X') >= NVL(BA2.SEGMENT18_LOW,'X')
3023 AND NVL(BA1.SEGMENT19_LOW,'X') <= NVL(BA2.SEGMENT19_HIGH,'X')
3024 AND NVL(BA1.SEGMENT19_HIGH,'X') >= NVL(BA2.SEGMENT19_LOW,'X')
3025 AND NVL(BA1.SEGMENT20_LOW,'X') <= NVL(BA2.SEGMENT20_HIGH,'X')
3026 AND NVL(BA1.SEGMENT20_HIGH,'X') >= NVL(BA2.SEGMENT20_LOW,'X')
3027 AND NVL(BA1.SEGMENT21_LOW,'X') <= NVL(BA2.SEGMENT21_HIGH,'X')
3028 AND NVL(BA1.SEGMENT21_HIGH,'X') >= NVL(BA2.SEGMENT21_LOW,'X')
3029 AND NVL(BA1.SEGMENT22_LOW,'X') <= NVL(BA2.SEGMENT22_HIGH,'X')
3030 AND NVL(BA1.SEGMENT22_HIGH,'X') >= NVL(BA2.SEGMENT22_LOW,'X')
3031 AND NVL(BA1.SEGMENT23_LOW,'X') <= NVL(BA2.SEGMENT23_HIGH,'X')
3032 AND NVL(BA1.SEGMENT23_HIGH,'X') >= NVL(BA2.SEGMENT23_LOW,'X')
3033 AND NVL(BA1.SEGMENT24_LOW,'X') <= NVL(BA2.SEGMENT24_HIGH,'X')
3034 AND NVL(BA1.SEGMENT24_HIGH,'X') >= NVL(BA2.SEGMENT24_LOW,'X')
3035 AND NVL(BA1.SEGMENT25_LOW,'X') <= NVL(BA2.SEGMENT25_HIGH,'X')
3036 AND NVL(BA1.SEGMENT25_HIGH,'X') >= NVL(BA2.SEGMENT25_LOW,'X')
3037 AND NVL(BA1.SEGMENT26_LOW,'X') <= NVL(BA2.SEGMENT26_HIGH,'X')
3038 AND NVL(BA1.SEGMENT26_HIGH,'X') >= NVL(BA2.SEGMENT26_LOW,'X')
3039 AND NVL(BA1.SEGMENT27_LOW,'X') <= NVL(BA2.SEGMENT27_HIGH,'X')
3040 AND NVL(BA1.SEGMENT27_HIGH,'X') >= NVL(BA2.SEGMENT27_LOW,'X')
3041 AND NVL(BA1.SEGMENT28_LOW,'X') <= NVL(BA2.SEGMENT28_HIGH,'X')
3042 AND NVL(BA1.SEGMENT28_HIGH,'X') >= NVL(BA2.SEGMENT28_LOW,'X')
3043 AND NVL(BA1.SEGMENT29_LOW,'X') <= NVL(BA2.SEGMENT29_HIGH,'X')
3044 AND NVL(BA1.SEGMENT29_HIGH,'X') >= NVL(BA2.SEGMENT29_LOW,'X')
3045 AND NVL(BA1.SEGMENT30_LOW,'X') <= NVL(BA2.SEGMENT30_HIGH,'X')
3046 AND NVL(BA1.SEGMENT30_HIGH,'X') >= NVL(BA2.SEGMENT30_LOW,'X')
3047 )
3048 AND BA1.RANGE_ID NOT IN (
3049 SELECT RANGE_ID FROM GL_BUDGET_ASSIGNMENT_RANGES BA3
3050 WHERE
3051 BA3.LEDGER_ID = BA1.LEDGER_ID AND
3052 BA3.CURRENCY_CODE = BA1.CURRENCY_CODE AND
3053 EXISTS
3054 (SELECT 1 FROM
3055 GL_BUDGET_ASSIGNMENT_RANGES BA4
3056 WHERE
3057 BA4.ledger_id = BA3.ledger_id
3058 AND BA4.currency_code = BA3.currency_code
3059 AND BA3.RANGE_ID <> BA4.RANGE_ID
3060 AND NVL(BA3.SEGMENT1_LOW,'X') = NVL(BA4.SEGMENT1_LOW,'X')
3061 AND NVL(BA3.SEGMENT1_HIGH,'X') = NVL(BA4.SEGMENT1_HIGH,'X')
3062 AND NVL(BA3.SEGMENT2_LOW,'X') = NVL(BA4.SEGMENT2_LOW,'X')
3063 AND NVL(BA3.SEGMENT2_HIGH,'X') = NVL(BA4.SEGMENT2_HIGH,'X')
3064 AND NVL(BA3.SEGMENT3_LOW,'X') = NVL(BA4.SEGMENT3_LOW,'X')
3065 AND NVL(BA3.SEGMENT3_HIGH,'X') = NVL(BA4.SEGMENT3_HIGH,'X')
3066 AND NVL(BA3.SEGMENT4_LOW,'X') = NVL(BA4.SEGMENT4_LOW,'X')
3067 AND NVL(BA3.SEGMENT4_HIGH,'X') = NVL(BA4.SEGMENT4_HIGH,'X')
3068 AND NVL(BA3.SEGMENT5_LOW,'X') = NVL(BA4.SEGMENT5_LOW,'X')
3069 AND NVL(BA3.SEGMENT5_HIGH,'X') = NVL(BA4.SEGMENT5_HIGH,'X')
3070 AND NVL(BA3.SEGMENT6_LOW,'X') = NVL(BA4.SEGMENT6_LOW,'X')
3071 AND NVL(BA3.SEGMENT6_HIGH,'X') = NVL(BA4.SEGMENT6_HIGH,'X')
3072 AND NVL(BA3.SEGMENT7_LOW,'X') = NVL(BA4.SEGMENT7_LOW,'X')
3073 AND NVL(BA3.SEGMENT7_HIGH,'X') = NVL(BA4.SEGMENT7_HIGH,'X')
3074 AND NVL(BA3.SEGMENT8_LOW,'X') = NVL(BA4.SEGMENT8_LOW,'X')
3075 AND NVL(BA3.SEGMENT8_HIGH,'X') = NVL(BA4.SEGMENT8_HIGH,'X')
3076 AND NVL(BA3.SEGMENT9_LOW,'X') = NVL(BA4.SEGMENT9_LOW,'X')
3077 AND NVL(BA3.SEGMENT9_HIGH,'X') = NVL(BA4.SEGMENT9_HIGH,'X')
3078 AND NVL(BA3.SEGMENT10_LOW,'X') = NVL(BA4.SEGMENT10_LOW,'X')
3079 AND NVL(BA3.SEGMENT10_HIGH,'X') = NVL(BA4.SEGMENT10_HIGH,'X')
3080 AND NVL(BA3.SEGMENT11_LOW,'X') = NVL(BA4.SEGMENT11_LOW,'X')
3081 AND NVL(BA3.SEGMENT11_HIGH,'X') = NVL(BA4.SEGMENT11_HIGH,'X')
3082 AND NVL(BA3.SEGMENT12_LOW,'X') = NVL(BA4.SEGMENT12_LOW,'X')
3083 AND NVL(BA3.SEGMENT12_HIGH,'X') = NVL(BA4.SEGMENT12_HIGH,'X')
3084 AND NVL(BA3.SEGMENT13_LOW,'X') = NVL(BA4.SEGMENT13_LOW,'X')
3085 AND NVL(BA3.SEGMENT13_HIGH,'X') = NVL(BA4.SEGMENT13_HIGH,'X')
3086 AND NVL(BA3.SEGMENT14_LOW,'X') = NVL(BA4.SEGMENT14_LOW,'X')
3087 AND NVL(BA3.SEGMENT14_HIGH,'X') = NVL(BA4.SEGMENT14_HIGH,'X')
3088 AND NVL(BA3.SEGMENT15_LOW,'X') = NVL(BA4.SEGMENT15_LOW,'X')
3089 AND NVL(BA3.SEGMENT15_HIGH,'X') = NVL(BA4.SEGMENT15_HIGH,'X')
3090 AND NVL(BA3.SEGMENT16_LOW,'X') = NVL(BA4.SEGMENT16_LOW,'X')
3091 AND NVL(BA3.SEGMENT16_HIGH,'X') = NVL(BA4.SEGMENT16_HIGH,'X')
3092 AND NVL(BA3.SEGMENT17_LOW,'X') = NVL(BA4.SEGMENT17_LOW,'X')
3093 AND NVL(BA3.SEGMENT17_HIGH,'X') = NVL(BA4.SEGMENT17_HIGH,'X')
3094 AND NVL(BA3.SEGMENT18_LOW,'X') = NVL(BA4.SEGMENT18_LOW,'X')
3095 AND NVL(BA3.SEGMENT18_HIGH,'X') = NVL(BA4.SEGMENT18_HIGH,'X')
3096 AND NVL(BA3.SEGMENT19_LOW,'X') = NVL(BA4.SEGMENT19_LOW,'X')
3097 AND NVL(BA3.SEGMENT19_HIGH,'X') = NVL(BA4.SEGMENT19_HIGH,'X')
3098 AND NVL(BA3.SEGMENT20_LOW,'X') = NVL(BA4.SEGMENT20_LOW,'X')
3099 AND NVL(BA3.SEGMENT20_HIGH,'X') = NVL(BA4.SEGMENT20_HIGH,'X')
3100 AND NVL(BA3.SEGMENT21_LOW,'X') = NVL(BA4.SEGMENT21_LOW,'X')
3101 AND NVL(BA3.SEGMENT21_HIGH,'X') = NVL(BA4.SEGMENT21_HIGH,'X')
3102 AND NVL(BA3.SEGMENT22_LOW,'X') = NVL(BA4.SEGMENT22_LOW,'X')
3103 AND NVL(BA3.SEGMENT22_HIGH,'X') = NVL(BA4.SEGMENT22_HIGH,'X')
3104 AND NVL(BA3.SEGMENT23_LOW,'X') = NVL(BA4.SEGMENT23_LOW,'X')
3105 AND NVL(BA3.SEGMENT23_HIGH,'X') = NVL(BA4.SEGMENT23_HIGH,'X')
3106 AND NVL(BA3.SEGMENT24_LOW,'X') = NVL(BA4.SEGMENT24_LOW,'X')
3107 AND NVL(BA3.SEGMENT24_HIGH,'X') = NVL(BA4.SEGMENT24_HIGH,'X')
3108 AND NVL(BA3.SEGMENT25_LOW,'X') = NVL(BA4.SEGMENT25_LOW,'X')
3109 AND NVL(BA3.SEGMENT25_HIGH,'X') = NVL(BA4.SEGMENT25_HIGH,'X')
3110 AND NVL(BA3.SEGMENT26_LOW,'X') = NVL(BA4.SEGMENT26_LOW,'X')
3111 AND NVL(BA3.SEGMENT26_HIGH,'X') = NVL(BA4.SEGMENT26_HIGH,'X')
3112 AND NVL(BA3.SEGMENT27_LOW,'X') = NVL(BA4.SEGMENT27_LOW,'X')
3113 AND NVL(BA3.SEGMENT27_HIGH,'X') = NVL(BA4.SEGMENT27_HIGH,'X')
3114 AND NVL(BA3.SEGMENT28_LOW,'X') = NVL(BA4.SEGMENT28_LOW,'X')
3115 AND NVL(BA3.SEGMENT28_HIGH,'X') = NVL(BA4.SEGMENT28_HIGH,'X')
3116 AND NVL(BA3.SEGMENT29_LOW,'X') = NVL(BA4.SEGMENT29_LOW,'X')
3117 AND NVL(BA3.SEGMENT29_HIGH,'X') = NVL(BA4.SEGMENT29_HIGH,'X')
3118 AND NVL(BA3.SEGMENT30_LOW,'X') = NVL(BA4.SEGMENT30_LOW,'X')
3119 AND NVL(BA3.SEGMENT30_HIGH,'X') = NVL(BA4.SEGMENT30_HIGH,'X')
3120 ))
3121 AND EXISTS
3122 (SELECT 1
3123 FROM GL_BUDGET_ENTITIES glent
3124 WHERE
3125 BA1.ledger_id = glent.ledger_id AND
3126 EXISTS (
3127 SELECT 1
3128 FROM PSA_EFC_OPTIONS psaefc
3129 WHERE psaefc.set_of_books_id = glent.ledger_id
3130 AND psaefc.mult_funding_budgets_flag = 'Y'
3131 ))
3132
3133 );
3134
3135 -- Fetches all EFC Enabled ledgers
3136 CURSOR c_ledger_info IS
3137 SELECT DISTINCT glent.ledger_id
3138 FROM gl_budget_entities glent
3139 WHERE EXISTS (
3140 SELECT 1
3141 FROM psa_efc_options psaefc
3142 WHERE psaefc.set_of_books_id = glent.ledger_id
3143 AND psaefc.mult_funding_budgets_flag = 'Y'
3144 );
3145
3146 -- This cursor is used to determine whether the upgrade has been run in
3147 -- final mode or not. When run in final mode this table is populated.
3148 CURSOR c_backup_exists IS
3149 SELECT * FROM IGI_EFC_BUDGET_ASSIGNMENT_BCK;
3150
3151 lc_backup_exists c_backup_exists%ROWTYPE;
3152 lc_c_ledger_info c_ledger_info%ROWTYPE;
3153
3154 l_errbuf VARCHAR2(2000);
3155 l_retcode NUMBER;
3156
3157 lc_overlapping_range_exists C_OVERLAPPING_RANGE_EXISTS%ROWTYPE;
3158
3159 request_id NUMBER;
3160
3161 BEGIN
3162
3163 SAVEPOINT EFC_UPGRADE_START;
3164
3165 budget_entity_tab := budget_entity_type();
3166
3167 -- Fetch all EFC enabled ledgers
3168 -- If no EFC Enabled ledgers exist then throw error
3169 OPEN c_ledger_info;
3170 FETCH c_ledger_info INTO lc_c_ledger_info;
3171 IF c_ledger_info%NOTFOUND THEN
3172 CLOSE c_ledger_info;
3173 fnd_file.put_line(fnd_file.output, 'No EFC Ledgers Found');
3174 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'No EFC Ledgers Found');
3175 errbuf := 'No EFC Ledgers Found';
3176 retcode := -1;
3177 RETURN;
3178 END IF;
3179 CLOSE c_ledger_info;
3180
3181 g_debug_enabled := p_debug_enabled;
3182
3183
3184 -- Check if any ranges overlap in merge fashion. If Yes, then
3185 -- proceed with upgrade only if p_data_type is 0
3186 -- Otherwise throw error
3187 OPEN C_OVERLAPPING_RANGE_EXISTS;
3188 FETCH C_OVERLAPPING_RANGE_EXISTS INTO lc_overlapping_range_exists;
3189 IF C_OVERLAPPING_RANGE_EXISTS%FOUND AND p_data_type <> 0 THEN
3190 CLOSE C_OVERLAPPING_RANGE_EXISTS;
3191 fnd_file.put_line(fnd_file.output, 'You have segment ranges which merge with other segment ranges
3192 for the same ledger and currency. This upgrade script does
3193 not support merging segment ranges for segments which have variable
3194 non numeric values. Merging segment ranges are supported only if your
3195 segment contains fixed length numeric values. Please contact Oracle Support for help');
3196 fnd_file.put_line(fnd_file.log, 'You have segment ranges which merge with other segment ranges
3197 for the same ledger and currency code. This upgrade script does
3198 not support merging segment ranges for segments which have variable
3199 non numeric values. Merging segment ranges are supported only if your
3200 segment contains fixed length numeric values. Please contact Oracle Support for help');
3201 errbuf := 'Non numeric segments exists and merging ranges are found';
3202 retcode := -1;
3203 RETURN;
3204 ELSE
3205 CLOSE C_OVERLAPPING_RANGE_EXISTS;
3206 END IF;
3207
3208 IF p_mode = 1 THEN
3209 fnd_file.put_line(fnd_file.output, 'Running EFC Upgrade in Final Mode');
3210 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Running EFC Upgrade in Final Mode');
3211 ELSE
3212 fnd_file.put_line(fnd_file.output, 'Running EFC Upgrade in Preliminary Mode');
3213 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Running EFC Upgrade in Preliminary Mode');
3214 END IF;
3215
3216
3217 -- Typically data should not exist in these tables at this point. Deletion
3218 -- has been added to ensure that no data exists
3219 BEGIN
3220
3221 DELETE FROM IGI_UPG_GL_BUDGET_ASSIGNMENT;
3222 DELETE FROM IGI_UPG_GL_BUDORG_BC_OPTIONS;
3223
3224 EXCEPTION
3225 WHEN OTHERS THEN
3226 fnd_file.put_line(fnd_file.output, 'Purging of tables failed');
3227 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Purging of tables failed =>'||SQLERRM);
3228 errbuf := 'Purging of tables failed'||SQLERRM;
3229 retcode := -1;
3230 RETURN;
3231 END;
3232
3233 -- If run in Final mode, backup all existing data
3234 IF p_mode = 1 THEN
3235
3236 -- Stop the upgrade if it has already been run in final mode
3237 OPEN c_backup_exists;
3238 FETCH c_backup_exists INTO lc_backup_exists;
3239 IF c_backup_exists%FOUND THEN
3240 --Error final mode run twice
3241 CLOSE c_backup_exists;
3242 fnd_file.put_line(fnd_file.output, 'Upgrade Script has been run in Final Mode and thus cannot be run in Final Mode again');
3243 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Upgrade Script has been run in Final Mode');
3244 errbuf := 'Upgrade Script has been run in Final Mode and thus cannot be run again';
3245 retcode := -1;
3246 RETURN;
3247 END IF;
3248 CLOSE c_backup_exists;
3249
3250
3251 -- Backup all existing data into IGI_EFC_BUDGET_ASSIGNMENT_BCK
3252 BEGIN
3253
3254 INSERT INTO IGI_EFC_BUDGET_ASSIGNMENT_BCK
3255 (
3256 BUDGET_ENTITY_ID,
3257 LEDGER_ID,
3258 CURRENCY_CODE,
3259 ENTRY_CODE,
3260 RANGE_ID,
3261 STATUS,
3262 LAST_UPDATE_DATE,
3263 AUTOMATIC_ENCUMBRANCE_FLAG,
3264 CREATED_BY,
3265 CREATION_DATE,
3266 FUNDS_CHECK_LEVEL_CODE,
3267 LAST_UPDATED_BY,
3268 LAST_UPDATE_LOGIN,
3269 SEQUENCE_NUMBER,
3270 SEGMENT1_LOW,
3271 SEGMENT1_HIGH,
3272 SEGMENT2_LOW,
3273 SEGMENT2_HIGH,
3274 SEGMENT3_LOW,
3275 SEGMENT3_HIGH,
3276 SEGMENT4_LOW,
3277 SEGMENT4_HIGH,
3278 SEGMENT5_LOW,
3279 SEGMENT5_HIGH,
3280 SEGMENT6_LOW,
3281 SEGMENT6_HIGH,
3282 SEGMENT7_LOW,
3283 SEGMENT7_HIGH,
3284 SEGMENT8_LOW,
3285 SEGMENT8_HIGH,
3286 SEGMENT9_LOW,
3287 SEGMENT9_HIGH,
3288 SEGMENT10_LOW,
3289 SEGMENT10_HIGH,
3290 SEGMENT11_LOW,
3291 SEGMENT11_HIGH,
3292 SEGMENT12_LOW,
3293 SEGMENT12_HIGH,
3294 SEGMENT13_LOW,
3295 SEGMENT13_HIGH,
3296 SEGMENT14_LOW,
3297 SEGMENT14_HIGH,
3298 SEGMENT15_LOW,
3299 SEGMENT15_HIGH,
3300 SEGMENT16_LOW,
3301 SEGMENT16_HIGH,
3302 SEGMENT17_LOW,
3303 SEGMENT17_HIGH,
3304 SEGMENT18_LOW,
3305 SEGMENT18_HIGH,
3306 SEGMENT19_LOW,
3307 SEGMENT19_HIGH,
3308 SEGMENT20_LOW,
3309 SEGMENT20_HIGH,
3310 SEGMENT21_LOW,
3311 SEGMENT21_HIGH,
3312 SEGMENT22_LOW,
3313 SEGMENT22_HIGH,
3314 SEGMENT23_LOW,
3315 SEGMENT23_HIGH,
3316 SEGMENT24_LOW,
3317 SEGMENT24_HIGH,
3318 SEGMENT25_LOW,
3319 SEGMENT25_HIGH,
3320 SEGMENT26_LOW,
3321 SEGMENT26_HIGH,
3322 SEGMENT27_LOW,
3323 SEGMENT27_HIGH,
3324 SEGMENT28_LOW,
3325 SEGMENT28_HIGH,
3326 SEGMENT29_LOW,
3327 SEGMENT29_HIGH,
3328 SEGMENT30_LOW,
3329 SEGMENT30_HIGH,
3330 AMOUNT_TYPE,
3331 BOUNDARY_CODE,
3332 CONTEXT,
3333 FUNDING_BUDGET_VERSION_ID,
3334 PROGRAM_APPLICATION_ID,
3335 PROGRAM_ID,
3336 PROGRAM_UPDATE_DATE,
3337 REQUEST_ID,
3338 ATTRIBUTE1,
3339 ATTRIBUTE2,
3340 ATTRIBUTE3,
3341 ATTRIBUTE4,
3342 ATTRIBUTE5,
3343 ATTRIBUTE6,
3344 ATTRIBUTE7,
3345 ATTRIBUTE8,
3346 ATTRIBUTE9,
3347 ATTRIBUTE10,
3348 ATTRIBUTE11,
3349 ATTRIBUTE12,
3350 ATTRIBUTE13,
3351 ATTRIBUTE14,
3352 ATTRIBUTE15
3353 )
3354 SELECT
3355 BUDGET_ENTITY_ID,
3356 LEDGER_ID,
3357 CURRENCY_CODE,
3358 ENTRY_CODE,
3359 RANGE_ID,
3360 STATUS,
3361 LAST_UPDATE_DATE,
3362 AUTOMATIC_ENCUMBRANCE_FLAG,
3363 CREATED_BY,
3364 CREATION_DATE,
3365 FUNDS_CHECK_LEVEL_CODE,
3366 LAST_UPDATED_BY,
3367 LAST_UPDATE_LOGIN,
3368 SEQUENCE_NUMBER,
3369 SEGMENT1_LOW,
3370 SEGMENT1_HIGH,
3371 SEGMENT2_LOW,
3372 SEGMENT2_HIGH,
3373 SEGMENT3_LOW,
3374 SEGMENT3_HIGH,
3375 SEGMENT4_LOW,
3376 SEGMENT4_HIGH,
3377 SEGMENT5_LOW,
3378 SEGMENT5_HIGH,
3379 SEGMENT6_LOW,
3380 SEGMENT6_HIGH,
3381 SEGMENT7_LOW,
3382 SEGMENT7_HIGH,
3383 SEGMENT8_LOW,
3384 SEGMENT8_HIGH,
3385 SEGMENT9_LOW,
3386 SEGMENT9_HIGH,
3387 SEGMENT10_LOW,
3388 SEGMENT10_HIGH,
3389 SEGMENT11_LOW,
3390 SEGMENT11_HIGH,
3391 SEGMENT12_LOW,
3392 SEGMENT12_HIGH,
3393 SEGMENT13_LOW,
3394 SEGMENT13_HIGH,
3395 SEGMENT14_LOW,
3396 SEGMENT14_HIGH,
3397 SEGMENT15_LOW,
3398 SEGMENT15_HIGH,
3399 SEGMENT16_LOW,
3400 SEGMENT16_HIGH,
3401 SEGMENT17_LOW,
3402 SEGMENT17_HIGH,
3403 SEGMENT18_LOW,
3404 SEGMENT18_HIGH,
3405 SEGMENT19_LOW,
3406 SEGMENT19_HIGH,
3407 SEGMENT20_LOW,
3408 SEGMENT20_HIGH,
3409 SEGMENT21_LOW,
3410 SEGMENT21_HIGH,
3411 SEGMENT22_LOW,
3412 SEGMENT22_HIGH,
3413 SEGMENT23_LOW,
3414 SEGMENT23_HIGH,
3415 SEGMENT24_LOW,
3416 SEGMENT24_HIGH,
3417 SEGMENT25_LOW,
3418 SEGMENT25_HIGH,
3419 SEGMENT26_LOW,
3420 SEGMENT26_HIGH,
3421 SEGMENT27_LOW,
3422 SEGMENT27_HIGH,
3423 SEGMENT28_LOW,
3424 SEGMENT28_HIGH,
3425 SEGMENT29_LOW,
3426 SEGMENT29_HIGH,
3427 SEGMENT30_LOW,
3428 SEGMENT30_HIGH,
3429 AMOUNT_TYPE,
3430 BOUNDARY_CODE,
3431 CONTEXT,
3432 FUNDING_BUDGET_VERSION_ID,
3433 PROGRAM_APPLICATION_ID,
3434 PROGRAM_ID,
3435 PROGRAM_UPDATE_DATE,
3436 REQUEST_ID,
3437 ATTRIBUTE1,
3438 ATTRIBUTE2,
3439 ATTRIBUTE3,
3440 ATTRIBUTE4,
3441 ATTRIBUTE5,
3442 ATTRIBUTE6,
3443 ATTRIBUTE7,
3444 ATTRIBUTE8,
3445 ATTRIBUTE9,
3446 ATTRIBUTE10,
3447 ATTRIBUTE11,
3448 ATTRIBUTE12,
3449 ATTRIBUTE13,
3450 ATTRIBUTE14,
3451 ATTRIBUTE15
3452 FROM GL_BUDGET_ASSIGNMENT_RANGES gar
3453 WHERE exists (SELECT 1
3454 FROM gl_budget_entities glent
3455 WHERE
3456 gar.ledger_id = glent.ledger_id AND
3457 EXISTS (
3458 SELECT 1
3459 FROM psa_efc_options psaefc
3460 WHERE psaefc.set_of_books_id = glent.ledger_id
3461 AND psaefc.mult_funding_budgets_flag = 'Y'
3462 ));
3463
3464 EXCEPTION
3465 WHEN OTHERS THEN
3466 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3467 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3468 IGI_EFC_BUDGET_ASSIGNMENT_BCK =>'||SQLERRM);
3469 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3470 IGI_EFC_BUDGET_ASSIGNMENT_BCK =>'||SQLERRM;
3471 retcode := -1;
3472 RETURN;
3473 END;
3474
3475 -- Backup all existing budgets into IGI_BUDORG_BC_OPTIONS_BCK
3476 BEGIN
3477 INSERT INTO IGI_BUDORG_BC_OPTIONS_BCK
3478 (
3479 RANGE_ID,
3480 FUNDING_BUDGET_VERSION_ID,
3481 FUNDS_CHECK_LEVEL_CODE,
3482 AMOUNT_TYPE,
3483 BOUNDARY_CODE,
3484 CREATED_BY,
3485 CREATION_DATE,
3486 LAST_UPDATED_BY,
3487 LAST_UPDATE_LOGIN,
3488 LAST_UPDATE_DATE
3489 )
3490 SELECT
3491 RANGE_ID,
3492 FUNDING_BUDGET_VERSION_ID,
3493 FUNDS_CHECK_LEVEL_CODE,
3494 AMOUNT_TYPE,
3495 BOUNDARY_CODE,
3496 CREATED_BY,
3497 CREATION_DATE,
3498 LAST_UPDATED_BY,
3499 LAST_UPDATE_LOGIN,
3500 LAST_UPDATE_DATE
3501 FROM GL_BUDORG_BC_OPTIONS
3502 WHERE range_id IN
3503 (SELECT range_id
3504 FROM
3505 IGI_EFC_BUDGET_ASSIGNMENT_BCK);
3506
3507 EXCEPTION
3508 WHEN OTHERS THEN
3509 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3510 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3511 IGI_BUDORG_BC_OPTIONS_BCK =>'||SQLERRM);
3512 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3513 IGI_BUDORG_BC_OPTIONS_BCK =>'||SQLERRM;
3514 retcode := -1;
3515 RETURN;
3516 END;
3517
3518 -- Backup all existing assignments into IGI_GL_BUDGET_ASSIGN_BCK
3519 BEGIN
3520 INSERT INTO IGI_GL_BUDGET_ASSIGN_BCK
3521 (
3522 LEDGER_ID,
3523 BUDGET_ENTITY_ID,
3524 CURRENCY_CODE,
3525 CODE_COMBINATION_ID,
3526 RANGE_ID,
3527 ENTRY_CODE,
3528 LAST_UPDATE_DATE,
3529 LAST_UPDATED_BY,
3530 AUTOMATIC_ENCUMBRANCE_FLAG,
3531 FUNDS_CHECK_LEVEL_CODE,
3532 ORDERING_VALUE,
3533 CREATION_DATE,
3534 CREATED_BY,
3535 LAST_UPDATE_LOGIN,
3536 ATTRIBUTE1,
3537 ATTRIBUTE2,
3538 ATTRIBUTE3,
3539 ATTRIBUTE4,
3540 ATTRIBUTE5,
3541 ATTRIBUTE6,
3542 ATTRIBUTE7,
3543 ATTRIBUTE8,
3544 CONTEXT,
3545 AMOUNT_TYPE,
3546 BOUNDARY_CODE,
3547 FUNDING_BUDGET_VERSION_ID,
3548 PROGRAM_APPLICATION_ID,
3549 PROGRAM_ID,
3550 PROGRAM_UPDATE_DATE,
3551 REQUEST_ID
3552 )
3553 SELECT
3554 LEDGER_ID,
3555 BUDGET_ENTITY_ID,
3556 CURRENCY_CODE,
3557 CODE_COMBINATION_ID,
3558 RANGE_ID,
3559 ENTRY_CODE,
3560 LAST_UPDATE_DATE,
3561 LAST_UPDATED_BY,
3562 AUTOMATIC_ENCUMBRANCE_FLAG,
3563 FUNDS_CHECK_LEVEL_CODE,
3564 ORDERING_VALUE,
3565 CREATION_DATE,
3566 CREATED_BY,
3567 LAST_UPDATE_LOGIN,
3568 ATTRIBUTE1,
3569 ATTRIBUTE2,
3570 ATTRIBUTE3,
3571 ATTRIBUTE4,
3572 ATTRIBUTE5,
3573 ATTRIBUTE6,
3574 ATTRIBUTE7,
3575 ATTRIBUTE8,
3576 CONTEXT,
3577 AMOUNT_TYPE,
3578 BOUNDARY_CODE,
3579 FUNDING_BUDGET_VERSION_ID,
3580 PROGRAM_APPLICATION_ID,
3581 PROGRAM_ID,
3582 PROGRAM_UPDATE_DATE,
3583 REQUEST_ID
3584 FROM GL_BUDGET_ASSIGNMENTS
3585 WHERE range_id IN
3586 (SELECT range_id
3587 FROM
3588 IGI_EFC_BUDGET_ASSIGNMENT_BCK);
3589
3590 EXCEPTION
3591 WHEN OTHERS THEN
3592 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3593 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3594 IGI_GL_BUDGET_ASSIGN_BCK =>'||SQLERRM);
3595 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3596 IGI_GL_BUDGET_ASSIGN_BCK =>'||SQLERRM;
3597 retcode := -1;
3598 RETURN;
3599 END;
3600 END IF; -- If mode is Final mode
3601
3602
3603 -- Copy all ranges belonging to EFC enabled ledgers into
3604 -- the processing table IGI_UPG_GL_BUDGET_ASSIGNMENT
3605 -- LOOP_AND_PROCESS picks up data from IGI_UPG_GL_BUDGET_ASSIGNMENT for
3606 -- processing. Data is pushed into IGI_UPG_GL_BUDGET_ASSIGNMENT
3607 -- instead of directly accessing it as recursive processing is needed to
3608 -- ensure non overlap of all ranges. Once all processing is completed
3609 -- data is inserted into the GL table
3610 BEGIN
3611
3612 INSERT INTO IGI_UPG_GL_BUDGET_ASSIGNMENT
3613 (
3614 BUDGET_ENTITY_ID,
3615 LEDGER_ID,
3616 CURRENCY_CODE,
3617 ENTRY_CODE,
3618 RANGE_ID,
3619 STATUS,
3620 LAST_UPDATE_DATE,
3621 AUTOMATIC_ENCUMBRANCE_FLAG,
3622 CREATED_BY,
3623 CREATION_DATE,
3624 FUNDS_CHECK_LEVEL_CODE,
3625 LAST_UPDATED_BY,
3626 LAST_UPDATE_LOGIN,
3627 SEQUENCE_NUMBER,
3628 SEGMENT1_LOW,
3629 SEGMENT1_HIGH,
3630 SEGMENT2_LOW,
3631 SEGMENT2_HIGH,
3632 SEGMENT3_LOW,
3633 SEGMENT3_HIGH,
3634 SEGMENT4_LOW,
3635 SEGMENT4_HIGH,
3636 SEGMENT5_LOW,
3637 SEGMENT5_HIGH,
3638 SEGMENT6_LOW,
3639 SEGMENT6_HIGH,
3640 SEGMENT7_LOW,
3641 SEGMENT7_HIGH,
3642 SEGMENT8_LOW,
3643 SEGMENT8_HIGH,
3644 SEGMENT9_LOW,
3645 SEGMENT9_HIGH,
3646 SEGMENT10_LOW,
3647 SEGMENT10_HIGH,
3648 SEGMENT11_LOW,
3649 SEGMENT11_HIGH,
3650 SEGMENT12_LOW,
3651 SEGMENT12_HIGH,
3652 SEGMENT13_LOW,
3653 SEGMENT13_HIGH,
3654 SEGMENT14_LOW,
3655 SEGMENT14_HIGH,
3656 SEGMENT15_LOW,
3657 SEGMENT15_HIGH,
3658 SEGMENT16_LOW,
3659 SEGMENT16_HIGH,
3660 SEGMENT17_LOW,
3661 SEGMENT17_HIGH,
3662 SEGMENT18_LOW,
3663 SEGMENT18_HIGH,
3664 SEGMENT19_LOW,
3665 SEGMENT19_HIGH,
3666 SEGMENT20_LOW,
3667 SEGMENT20_HIGH,
3668 SEGMENT21_LOW,
3669 SEGMENT21_HIGH,
3670 SEGMENT22_LOW,
3671 SEGMENT22_HIGH,
3672 SEGMENT23_LOW,
3673 SEGMENT23_HIGH,
3674 SEGMENT24_LOW,
3675 SEGMENT24_HIGH,
3676 SEGMENT25_LOW,
3677 SEGMENT25_HIGH,
3678 SEGMENT26_LOW,
3679 SEGMENT26_HIGH,
3680 SEGMENT27_LOW,
3681 SEGMENT27_HIGH,
3682 SEGMENT28_LOW,
3683 SEGMENT28_HIGH,
3684 SEGMENT29_LOW,
3685 SEGMENT29_HIGH,
3686 SEGMENT30_LOW,
3687 SEGMENT30_HIGH,
3688 AMOUNT_TYPE,
3689 BOUNDARY_CODE,
3690 CONTEXT,
3691 FUNDING_BUDGET_VERSION_ID,
3692 PROGRAM_APPLICATION_ID,
3693 PROGRAM_ID,
3694 PROGRAM_UPDATE_DATE,
3695 REQUEST_ID,
3696 ATTRIBUTE1,
3697 ATTRIBUTE2,
3698 ATTRIBUTE3,
3699 ATTRIBUTE4,
3700 ATTRIBUTE5,
3701 ATTRIBUTE6,
3702 ATTRIBUTE7,
3703 ATTRIBUTE8,
3704 ATTRIBUTE9,
3705 ATTRIBUTE10,
3706 ATTRIBUTE11,
3707 ATTRIBUTE12,
3708 ATTRIBUTE13,
3709 ATTRIBUTE14,
3710 ATTRIBUTE15
3711 )
3712 SELECT
3713 BUDGET_ENTITY_ID,
3714 LEDGER_ID,
3715 CURRENCY_CODE,
3716 ENTRY_CODE,
3717 RANGE_ID,
3718 STATUS,
3719 LAST_UPDATE_DATE,
3720 AUTOMATIC_ENCUMBRANCE_FLAG,
3721 CREATED_BY,
3722 CREATION_DATE,
3723 FUNDS_CHECK_LEVEL_CODE,
3724 LAST_UPDATED_BY,
3725 LAST_UPDATE_LOGIN,
3726 SEQUENCE_NUMBER,
3727 SEGMENT1_LOW,
3728 SEGMENT1_HIGH,
3729 SEGMENT2_LOW,
3730 SEGMENT2_HIGH,
3731 SEGMENT3_LOW,
3732 SEGMENT3_HIGH,
3733 SEGMENT4_LOW,
3734 SEGMENT4_HIGH,
3735 SEGMENT5_LOW,
3736 SEGMENT5_HIGH,
3737 SEGMENT6_LOW,
3738 SEGMENT6_HIGH,
3739 SEGMENT7_LOW,
3740 SEGMENT7_HIGH,
3741 SEGMENT8_LOW,
3742 SEGMENT8_HIGH,
3743 SEGMENT9_LOW,
3744 SEGMENT9_HIGH,
3745 SEGMENT10_LOW,
3746 SEGMENT10_HIGH,
3747 SEGMENT11_LOW,
3748 SEGMENT11_HIGH,
3749 SEGMENT12_LOW,
3750 SEGMENT12_HIGH,
3751 SEGMENT13_LOW,
3752 SEGMENT13_HIGH,
3753 SEGMENT14_LOW,
3754 SEGMENT14_HIGH,
3755 SEGMENT15_LOW,
3756 SEGMENT15_HIGH,
3757 SEGMENT16_LOW,
3758 SEGMENT16_HIGH,
3759 SEGMENT17_LOW,
3760 SEGMENT17_HIGH,
3761 SEGMENT18_LOW,
3762 SEGMENT18_HIGH,
3763 SEGMENT19_LOW,
3764 SEGMENT19_HIGH,
3765 SEGMENT20_LOW,
3766 SEGMENT20_HIGH,
3767 SEGMENT21_LOW,
3768 SEGMENT21_HIGH,
3769 SEGMENT22_LOW,
3770 SEGMENT22_HIGH,
3771 SEGMENT23_LOW,
3772 SEGMENT23_HIGH,
3773 SEGMENT24_LOW,
3774 SEGMENT24_HIGH,
3775 SEGMENT25_LOW,
3776 SEGMENT25_HIGH,
3777 SEGMENT26_LOW,
3778 SEGMENT26_HIGH,
3779 SEGMENT27_LOW,
3780 SEGMENT27_HIGH,
3781 SEGMENT28_LOW,
3782 SEGMENT28_HIGH,
3783 SEGMENT29_LOW,
3784 SEGMENT29_HIGH,
3785 SEGMENT30_LOW,
3786 SEGMENT30_HIGH,
3787 AMOUNT_TYPE,
3788 BOUNDARY_CODE,
3789 CONTEXT,
3790 FUNDING_BUDGET_VERSION_ID,
3791 PROGRAM_APPLICATION_ID,
3792 PROGRAM_ID,
3793 PROGRAM_UPDATE_DATE,
3794 REQUEST_ID,
3795 ATTRIBUTE1,
3796 ATTRIBUTE2,
3797 ATTRIBUTE3,
3798 ATTRIBUTE4,
3799 ATTRIBUTE5,
3800 ATTRIBUTE6,
3801 ATTRIBUTE7,
3802 ATTRIBUTE8,
3803 ATTRIBUTE9,
3804 ATTRIBUTE10,
3805 ATTRIBUTE11,
3806 ATTRIBUTE12,
3807 ATTRIBUTE13,
3808 ATTRIBUTE14,
3809 ATTRIBUTE15
3810 FROM GL_BUDGET_ASSIGNMENT_RANGES gar
3811 WHERE exists (SELECT 1
3812 FROM GL_BUDGET_ENTITIES glent
3813 WHERE
3814 gar.ledger_id = glent.ledger_id AND
3815 EXISTS (
3816 SELECT 1
3817 FROM PSA_EFC_OPTIONS psaefc
3818 WHERE psaefc.set_of_books_id = glent.ledger_id
3819 AND psaefc.mult_funding_budgets_flag = 'Y'
3820 ));
3821
3822 EXCEPTION
3823 WHEN OTHERS THEN
3824 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3825 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3826 IGI_UPG_GL_BUDGET_ASSIGNMENT =>'||SQLERRM);
3827 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3828 IGI_UPG_GL_BUDGET_ASSIGNMENT =>'||SQLERRM;
3829 retcode := -1;
3830 RETURN;
3831 END;
3832
3833
3834 BEGIN
3835
3836 INSERT INTO IGI_UPG_GL_BUDORG_BC_OPTIONS
3837 (
3838 RANGE_ID,
3839 FUNDING_BUDGET_VERSION_ID,
3840 FUNDS_CHECK_LEVEL_CODE,
3841 AMOUNT_TYPE,
3842 BOUNDARY_CODE,
3843 CREATED_BY,
3844 CREATION_DATE,
3845 LAST_UPDATED_BY,
3846 LAST_UPDATE_LOGIN,
3847 LAST_UPDATE_DATE
3848 )
3849 SELECT
3850 RANGE_ID,
3851 FUNDING_BUDGET_VERSION_ID,
3852 FUNDS_CHECK_LEVEL_CODE,
3853 AMOUNT_TYPE,
3854 BOUNDARY_CODE,
3855 CREATED_BY,
3856 CREATION_DATE,
3857 LAST_UPDATED_BY,
3858 LAST_UPDATE_LOGIN,
3859 LAST_UPDATE_DATE
3860 FROM GL_BUDORG_BC_OPTIONS
3861 WHERE range_id IN
3862 (SELECT range_id
3863 FROM
3864 IGI_UPG_GL_BUDGET_ASSIGNMENT);
3865
3866 EXCEPTION
3867 WHEN OTHERS THEN
3868 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3869 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3870 IGI_UPG_GL_BUDORG_BC_OPTIONS =>'||SQLERRM);
3871 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while inserting into
3872 IGI_UPG_GL_BUDORG_BC_OPTIONS =>'||SQLERRM;
3873 retcode := -1;
3874 RETURN;
3875 END;
3876
3877 -- If the report is run in final mode, then delete all
3878 -- the data that were picked up from the GL tables
3879 IF p_mode = 1 THEN
3880
3881 BEGIN
3882
3883 DELETE FROM GL_BUDORG_BC_OPTIONS
3884 WHERE range_id IN
3885 (SELECT range_id
3886 FROM
3887 IGI_EFC_BUDGET_ASSIGNMENT_BCK);
3888
3889 DELETE FROM GL_BUDGET_ASSIGNMENT_RANGES
3890 WHERE range_id IN
3891 (SELECT range_id
3892 FROM
3893 IGI_EFC_BUDGET_ASSIGNMENT_BCK);
3894
3895 DELETE FROM GL_BUDGET_ASSIGNMENTS
3896 WHERE range_id IN
3897 (SELECT range_id
3898 FROM
3899 IGI_EFC_BUDGET_ASSIGNMENT_BCK);
3900
3901 EXCEPTION
3902 WHEN OTHERS THEN
3903 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3904 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'||'Error while deletion =>'||SQLERRM);
3905 errbuf := 'Module: START_EFC_UPGRADE =>'||'Error while deletion =>'||SQLERRM;
3906 retcode := -1;
3907 RETURN;
3908 END;
3909
3910 END IF;
3911
3912 -- LOOP_AND_PROCESS does the main processing. When run in final mode
3913 -- a report output is created and all data is inserted into the GL table
3914 -- provided no error occurs. LOOP_AND_PROCESS when run in preliminary mode
3915 -- creates a report output only. No commit happens in the preliminary mode
3916 LOOP_AND_PROCESS(p_data_type,p_mode,l_errbuf,l_retcode);
3917
3918 -- If LOOP_AND_PROCESS ends in error, initiate a rollback and end the
3919 -- concurrent request in error.
3920 IF l_retcode IS NOT NULL AND l_retcode = -1 THEN
3921 errbuf := l_errbuf;
3922 retcode := l_retcode;
3923 fnd_file.put_line(fnd_file.output, 'Unexpected Error: Please check the log');
3924 fnd_file.put_line(fnd_file.log, 'Module: START_EFC_UPGRADE =>'|| l_errbuf);
3925 ROLLBACK TO EFC_UPGRADE_START;
3926 fnd_file.put_line(fnd_file.log, 'Rollback Completed');
3927 ELSE
3928
3929 -- If run in final mode, fire GL concurrent request
3930 -- "Assign Budget Ranges" in order to create assignments for the new
3931 -- ranges
3932 IF p_mode = 1 THEN
3933
3934 FOR i IN 1..budget_entity_tab.COUNT LOOP
3935 request_id := FND_REQUEST.SUBMIT_REQUEST(
3936 'SQLGL','GLBAAR','','',FALSE,
3937 to_char(budget_entity_tab(i).ledger_id),to_char(budget_entity_tab(i).budget_entity_id),chr(0),
3938 '','','','','','','',
3939 '','','','','','','','','','',
3940 '','','','','','','','','','',
3941 '','','','','','','','','','',
3942 '','','','','','','','','','',
3943 '','','','','','','','','','',
3944 '','','','','','','','','','',
3945 '','','','','','','','','','',
3946 '','','','','','','','','','',
3947 '','','','','','','','','','');
3948 IF request_id IS NULL or request_id = 0 THEN
3949 fnd_file.put_line(fnd_file.output, 'Unable to fire GLBAAR for ledger '
3950 ||budget_entity_tab(i).ledger_id||' and Budget Organization '||budget_entity_tab(i).budget_entity_id);
3951 fnd_file.put_line(fnd_file.log,'Unable to fire GLBAAR for ledger '
3952 ||budget_entity_tab(i).ledger_id||' and Budget Organization '||budget_entity_tab(i).budget_entity_id);
3953 errbuf := 'Unable to fire GLBAAR';
3954 retcode := -1;
3955 ROLLBACK TO EFC_UPGRADE_START;
3956 RETURN;
3957 ELSE
3958 fnd_file.put_line(fnd_file.output, 'Fired Concurrent Request '||request_id);
3959 fnd_file.put_line(fnd_file.log, 'Fired Concurrent Request '||request_id);
3960 END IF;
3961 END LOOP;
3962
3963 COMMIT;
3964 fnd_file.put_line(fnd_file.output, 'Process completed successfully in Final Mode');
3965 fnd_file.put_line(fnd_file.log, 'Process completed successfully in Final Mode');
3966 ELSE
3967 ROLLBACK TO EFC_UPGRADE_START;
3968 fnd_file.put_line(fnd_file.output, 'Process completed successfully in Preliminary Mode');
3969 fnd_file.put_line(fnd_file.log, 'Process completed successfully in Preliminary Mode');
3970 END IF;
3971
3972 END IF;
3973
3974 END START_EFC_UPGRADE;
3975
3976 END IGI_EFC_UPGRADE;