1 PACKAGE BODY JA_CN_FSG_FORMULA_EXTRACT_PKG AS
2 --$Header: JACNDFEB.pls 120.1 2011/01/28 11:38:11 choli noship $
3 --+=======================================================================+
4 --| Copyright (c) 2006 Oracle Corporation
5 --| Redwood Shores, CA, USA
6 --| All rights reserved.
7 --+=======================================================================
8 --| FILENAME
9 --| JACNDFEB.pls
10 --|
11 --| DESCRIPTION
12 --|
13 --| This package contains the following PL/SQL tables/procedures/functions
14 --| to extract formula for each row in the four FSG reports.
15 --|
16 --| TYPE LIEST
17 --| G_PERIOD_NAME_TBL
18 --|
19 --| PROCEDURE LIST
20 --| Extract_Row_Formula
21 --|
22 --| HISTORY
23 --| 19-JAN-2010 Wei Huang Created
24 --| 04-Feb-2010 Wei Huang Updated, add procedure Populate_formula
25 --| 28-JAN-2011 Jianchao Chi Update fix bug 11675682
26 --|
27 --+======================================================================*/
28
29
30 --==========================================================================
31 -- PROCEDURE NAME:
32 --
33 -- Extract_Row_Formula Public
34 --
35 -- DESCRIPTION:
36 --
37 -- This funciton is to extract formula for each row in the four FSG
38 -- reports.
39 --
40 -- PARAMETERS:
41 -- In: pn_report_id Report ID
42 -- pn_ledger_id Ledger ID
43 -- pn_axis_seq Row Sequence
44 --
45 -- Out:
46 --
47 -- DESIGN REFERENCES:
48 --
49 --
50 -- CHANGE HISTORY:
51 -- 19-JAN-2010 Wei Huang Created
52 -- 28-JAN-2011 Jianchao Chi Updated fix bug 11675682
53 --
54 --==========================================================================
55 FUNCTION Extract_Row_Formula
56 (pn_coa IN NUMBER
57 ,pn_axis_set_id IN NUMBER
58 ,pn_axis_seq IN NUMBER
59 ) RETURN VARCHAR2
60 IS
61 ln_coa Number :=pn_coa;
62 ln_axis_set_id rg_report_axis_sets.axis_set_id%TYPE :=pn_axis_set_id;
63
64 ln_axis_seq rg_report_axes.axis_seq%TYPE :=pn_axis_seq;
65 lv_type VARCHAR2(1);
66 lv_change_sign_flag VARCHAR2(1);
67 ln_row_count NUMBER;
68 lv_rowcnt VARCHAR2(50);
69 lv_lincnt VARCHAR2(50);
70 lv_colcnt VARCHAR2(50) :='c1001';
71
72 lv_operator VARCHAR2(10);
73 lv_operands VARCHAR2(4000);
74 lv_formula VARCHAR2(4000);
75
76 --The following variables are added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
77 lv_seq_tag VARCHAR2(10) :='N';
78 ln_axis_seq_update rg_report_axes.axis_seq%TYPE;
79
80 --Added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
81 CURSOR c_axis_seq
82 IS
83 SELECT
84 axis_seq
85 FROM
86 ja_cn_cfs_row_cgs_gt
87 WHERE axis_set_id=ln_axis_set_id
88 AND display_flag='Y'
89 ORDER BY axis_seq
90 FOR UPDATE;
91
92 CURSOR c_axis_row
93 IS
94 SELECT
95 type
96 ,change_sign_flag
97 ,rowcnt
98 ,lincnt
99 FROM
100 ja_cn_cfs_row_cgs_gt
101 WHERE axis_set_id=ln_axis_set_id
102 AND axis_seq = ln_axis_seq
103 AND display_flag='Y';
104
105 CURSOR c_calculation_lines
106 IS
107 SELECT
108 jcccg.operator
109 ,jccrcg.lincnt
110 ,jccrcg.change_sign_flag
111 FROM
112 ja_cn_cfs_calculations_gt jcccg
113 ,ja_cn_cfs_row_cgs_gt jccrcg
114 WHERE jcccg.axis_set_id=ln_axis_set_id
115 AND jcccg.axis_seq=ln_axis_seq
116 AND jcccg.axis_set_id=jccrcg.axis_set_id
117 AND jcccg.cal_axis_seq=jccrcg.axis_seq
118 ORDER BY jcccg.calculation_seq;
119
120 ln_dbg_level NUMBER :=FND_LOG.G_CURRENT_RUNTIME_LEVEL;
121 ln_proc_level NUMBER :=FND_LOG.LEVEL_PROCEDURE;
122 lv_proc_name VARCHAR2(100) :='Extract_Row_Formula';
123
124 BEGIN
125
126 --log
127 IF (ln_proc_level >= ln_dbg_level)
128 THEN
129 FND_LOG.String(ln_proc_level
130 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.begin'
131 ,'Enter procedure'
132 );
133 FND_LOG.String(ln_proc_level
134 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
135 ,'pn_coa '||ln_coa
136 );
137 FND_LOG.String(ln_proc_level
138 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
139 ,'pn_axis_set_id '||ln_axis_set_id
140 );
141 FND_LOG.String(ln_proc_level
142 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
143 ,'pn_axis_seq '||ln_axis_seq
144 );
145 END IF;
146
147 --Commented by Jianchao Chi for bug 11675682
148 --1.Populate formula data to table ja_cn_cfs_calculations_gt and
149 --ja_cn_cfs_row_cgs_gt according to parameters
150 --Populate_Formula(pn_coa =>ln_coa
151 -- ,pn_axis_set_id =>ln_axis_set_id
152 -- ,pn_axis_seq => ln_axis_seq);
153
154
155 --Added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
156 --Call the procedure 'JA_CN_CFS_CALCULATE_PKG.Populate_Fomula' to popluate most detailed
157 --calculation lines for FSG row with calculation.
158 JA_CN_CFS_CALCULATE_PKG.Populate_Formula(p_coa =>ln_coa
159 ,p_axis_set_id =>ln_axis_set_id
160 );
161
162 --Added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
163 --Call the procedure 'JA_CN_CFS_CALCULATE_PKG.Categorize_Rows' to categorize FSG row
164 JA_CN_CFS_CALCULATE_PKG.Categorize_Rows(p_coa =>ln_coa
165 ,p_axis_set_id =>ln_axis_set_id
166 );
167 --commit;
168 --To populate row count and line count for each row in the rowset <l_axis_set_id>
169 ln_row_count:=0;
170 lv_seq_tag :='N';--Added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
171 OPEN c_axis_seq;
172 FETCH c_axis_seq INTO ln_axis_seq_update;
173
174 WHILE c_axis_seq%FOUND--Added by Jianchao Chi on 28-Jan-2011 to fix bug 11675682
175 LOOP
176 --To number the row
177 ln_row_count:=ln_row_count+1;
178
179 IF ln_row_count = ln_axis_seq/10 AND lv_seq_tag = 'N' THEN
180 ln_axis_seq := ln_axis_seq_update;
181 lv_seq_tag :='Y';
182 END IF;
183 --To populate rowcount and linecount for output xml like FSG
184 lv_rowcnt:='r1'||lpad(to_char(ln_row_count),5,'0');
185 lv_lincnt:='l1'||lpad(to_char(ln_row_count),5,'0');
186
187 --Update current row with row count and line count
188 UPDATE
189 ja_cn_cfs_row_cgs_gt
190 SET
191 rowcnt=lv_rowcnt
192 ,lincnt=lv_lincnt
193 WHERE CURRENT OF c_axis_seq;
194
195 FETCH c_axis_seq INTO ln_axis_seq_update;
196 END LOOP; --c_axis_seq%FOUND
197
198 CLOSE c_axis_seq;
199
200 SELECT COUNT(*)
201 INTO ln_row_count
202 FROM
203 ja_cn_cfs_row_cgs_gt
204 WHERE axis_set_id=ln_axis_set_id
205 AND axis_seq = ln_axis_seq
206 AND display_flag='Y'
207 AND calculation_flag='Y';
208
209 IF ln_row_count > 0 THEN
210
211 OPEN c_axis_row;
212 FETCH c_axis_row INTO lv_type,lv_change_sign_flag,lv_rowcnt,lv_lincnt;
213 CLOSE c_axis_row;
214
215
216 IF lv_type = 'E' -- lv_type = 'E' means that the formula of the row is wrong
217 THEN
218 lv_formula := '';
219 ELSE
220 lv_operands:='';
221 lv_formula:='';
222
223
224 --Retrieve calculation lines for current row
225 FOR l_calculation_lines IN c_calculation_lines
226 LOOP
227 --operator should be generated according to 'Change Sign Flag'
228 IF l_calculation_lines.change_sign_flag='Y'
229 THEN
230 SELECT
231 decode(l_calculation_lines.operator,'+','-','-','+','+')
232 INTO
233 lv_operator
234 FROM dual;
235 ELSE
236 lv_operator:=l_calculation_lines.operator;
237 END IF;
238
239 --lv_operands IS NULL
240 IF lv_operands IS NULL
241 THEN
242 lv_operands:=lv_operator||l_calculation_lines.lincnt||':'||lv_colcnt;
243 ELSE
244 lv_operands:=lv_operands||lv_operator||l_calculation_lines.lincnt||':'||lv_colcnt;
245 END IF;
246 END LOOP;
247
248 --Populate final formula
249 lv_formula:=lv_lincnt||':'||lv_colcnt||'='||lv_operands;
250
251 END IF;
252
253 END IF;
254
255 -- Return the formula
256 RETURN lv_formula;
257
258 --log for debug
259 IF ( ln_proc_level >= ln_dbg_level)
260 THEN
261 FND_LOG.STRING(ln_proc_level
262 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.end'
263 ,'Exit procedure'
264 );
265 END IF;
266
267 EXCEPTION
268 WHEN OTHERS THEN
269 IF (ln_proc_level >= ln_dbg_level)
270 THEN
271 FND_LOG.String(ln_proc_level
272 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'. Other_Exception '
273 ,SQLCODE||':'||SQLERRM
274 );
275 END IF;
276
277 END Extract_Row_Formula;
278
279
280 --==========================================================================
281 -- PROCEDURE NAME:
282 --
283 -- Populate_Formula Public
284 --
285 -- DESCRIPTION:
286 --
287 -- The procedure 'Populate_Formula' is used to populate the calculation
288 -- lines for a specified row.
289 --
290 -- PARAMETERS:
291 -- In: pn_report_id Report ID
292 -- pn_ledger_id Ledger ID
293 -- pn_axis_seq Row Sequence
294 --
295 -- Out:
296 --
297 -- DESIGN REFERENCES:
298 --
299 --
300 -- CHANGE HISTORY:
301 -- 04-Feb-2010 Wei Huang Created
302 --
303 --==========================================================================
304 PROCEDURE Populate_Formula
305 (pn_coa IN NUMBER
306 ,pn_axis_set_id IN NUMBER
307 ,pn_axis_seq IN NUMBER
308 )
309 IS
310 ln_coa NUMBER := pn_coa;
311 ln_axis_set_id rg_report_axis_sets.axis_set_id%TYPE :=pn_axis_set_id;
312 ln_axis_seq rg_report_axes.axis_seq%TYPE :=pn_axis_seq;
313
314 ln_calculation_seq NUMBER;
315 ln_application_id rg_report_axes.application_id%TYPE;
316 ln_axis_seq_low rg_report_calculations.axis_seq_low%TYPE;
317 ln_axis_seq_high rg_report_calculations.axis_seq_high%TYPE;
318 lv_axis_name_low rg_report_calculations.axis_name_low%TYPE;
319 lv_operator rg_report_calculations.operator%TYPE;
320 ln_operator_flag NUMBER;
321 lv_exit_flag VARCHAR2(1);
322 ln_cal_axis_seq rg_report_axes.axis_seq%TYPE;
323 ln_constant rg_report_calculations.constant%TYPE;
324 lv_type VARCHAR2(1);
325 lv_display_flag VARCHAR2(1);
326 lv_display_zero_flag VARCHAR2(1);
327 lv_change_sign_flag VARCHAR2(1);
328 ln_row_count NUMBER;
329
330
331 CURSOR c_report_axis
332 IS
333 SELECT
334 DISTINCT
335 rra.application_id
336 ,rra.display_flag
337 ,rra.display_zero_amount_flag
338 ,rra.change_sign_flag
339 FROM
340 rg_report_axes rra
341 ,rg_report_calculations rrc
342 WHERE rra.axis_set_id=ln_axis_set_id
343 AND rra.axis_set_id=rrc.axis_set_id
344 AND rra.axis_seq=rrc.axis_seq
345 AND rra.axis_seq=ln_axis_seq;
346
347 CURSOR c_report_calculations
348 IS
349 SELECT
350 operator
351 ,axis_seq_low
352 ,axis_seq_high
353 ,axis_name_low
354 ,constant
355 FROM
356 rg_report_calculations
357 WHERE application_id=ln_application_id
358 AND axis_set_id=ln_axis_set_id
359 AND axis_seq=ln_axis_seq
360 ORDER BY calculation_seq;
361
362 CURSOR c_axis_seqs_per_line
363 IS
364 SELECT
365 rra.axis_seq
366 FROM
367 rg_report_axes rra
368 WHERE rra.axis_set_id=ln_axis_set_id
369 AND rra.axis_seq BETWEEN ln_axis_seq_low AND ln_axis_seq_high
370 AND (EXISTS (SELECT
371 rrac.axis_seq
372 FROM
373 rg_report_axis_contents rrac
374 WHERE rrac.application_id=rra.application_id
375 AND rrac.axis_set_id=rra.axis_set_id
376 AND rrac.axis_seq=rra.axis_seq
377 )
378 OR
379 EXISTS (SELECT
380 jccaa.axis_seq
381 FROM
382 ja_cn_cfs_assignments_all jccaa
383 WHERE jccaa.chart_of_accounts_id=ln_coa
384 AND rra.axis_set_id=jccaa.axis_set_id
385 AND jccaa.axis_seq=rra.axis_seq
386 )
387 OR
388 EXISTS (SELECT
389 rrc.axis_seq
390 FROM
391 rg_report_calculations rrc
392 WHERE rrc.application_id=rra.application_id
393 AND rra.axis_set_id=rrc.axis_set_id
394 AND rrc.axis_seq=rra.axis_seq
395 )
396 );
397
398 CURSOR c_axis_seq
399 IS
400 SELECT
401 axis_seq
402 FROM
403 rg_report_axes
404 WHERE application_id=ln_application_id
405 AND axis_set_id=ln_axis_set_id
406 AND axis_name=lv_axis_name_low;
407
408
409 ln_dbg_level NUMBER :=FND_LOG.G_Current_Runtime_Level;
410 ln_proc_level NUMBER :=FND_LOG.Level_Procedure;
411 lv_proc_name VARCHAR2(100) :='Populate_Formula';
412
413
414 BEGIN
415
416 --log for debug
417 IF (ln_proc_level >= ln_dbg_level)
418 THEN
419 FND_LOG.String(ln_proc_level
420 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.begin'
421 ,'Enter procedure'
422 );
423 FND_LOG.String(ln_proc_level
424 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
425 ,'pn_coa '||ln_coa
426 );
427 FND_LOG.String(ln_proc_level
428 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
429 ,'pn_axis_set_id '||ln_axis_set_id
430 );
431 FND_LOG.String(ln_proc_level
432 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.parameters'
433 ,'pn_axis_seq '||ln_axis_seq
434 );
435 END IF;
436
437 --Retrive initial canculation lines from RG_REPORT_CALCULATIONS table for
438 --specify item(row) in FSG Row Set that have calculation definition.
439 --If a calculation line contain sequence number range that perform calculation,
440 --then split this calculation line to multiple calculation lines and each line only
441 --have one sequence number that perform calcluation, instead of a range.
442
443 --Retrive all rows that have calculation definition for current FSG Row Set
444 OPEN c_report_axis;
445 --hw FETCH c_report_axis INTO ln_application_id,ln_axis_seq,lv_display_flag,lv_display_zero_flag,lv_change_sign_flag;
446 FETCH c_report_axis INTO ln_application_id,lv_display_flag,lv_display_zero_flag,lv_change_sign_flag;
447 WHILE c_report_axis%FOUND
448 LOOP
449 ln_calculation_seq:=1;
450 lv_exit_flag:='N';
451
452 --Retrive calculation lines for current row
453 OPEN c_report_calculations;
454 FETCH c_report_calculations INTO lv_operator,ln_axis_seq_low,ln_axis_seq_high,lv_axis_name_low,ln_constant;
455 WHILE c_report_calculations%FOUND
456 LOOP
457
458 --Calculation for Cash flow statment only supports '+'/'-'/Enter as operator, if operator is '*'/'/'
459 --or any other operaters, then program would not perform calcuation for current FSG row and will show
460 --an error message in correspondng item of Cash Flow Statement that is ultimately generated
461 --by xml publisher
462
463 --If lv_operator is not '+'/'-'/'Enter', then doesn't continue checking curent cash flow item
464 --and marked calculation for this item as error
465 IF lv_operator NOT IN ('+','-','ENTER')
466 THEN
467 lv_exit_flag:='Y';
468 EXIT;
469 ELSE
470
471 --If current calculation line is defined by sequence number range,then
472 --Convert the range to multiple single sequence number, so the calculation line
473 --would be split to multiple calculation line and inserted into temporary table
474 --'JA_CN_CFS_CALCULATION_GBLTEMP
475
476 --Operator 'Enter' has the same function as'+'
477 IF lv_operator='ENTER'
478 THEN
479 lv_operator:='+';
480 END IF; --lv_operator='ENTER'
481
482 --To set operator flag
483 IF lv_operator='+'
484 THEN
485 ln_operator_flag:=1;
486 ELSIF lv_operator='-'
487 THEN
488 ln_operator_flag:=-1;
489 END IF;--lv_operator='+'
490
491
492 IF (ln_axis_seq_low IS NOT NULL) AND
493 (ln_axis_seq_high IS NOT NULL)
494 THEN
495
496 --Split current line to multiple lines by sequence number range,
497 --each line only contain one sequence number
498
499 OPEN c_axis_seqs_per_line;
500 FETCH c_axis_seqs_per_line INTO ln_cal_axis_seq;
501 WHILE c_axis_seqs_per_line%FOUND
502 LOOP
503
504
505 INSERT
506 INTO
507 ja_cn_cfs_calculations_gt
508 (application_id,axis_set_id
509 ,axis_seq
510 ,calculation_seq
511 ,operator
512 ,operator_flag
513 ,cal_axis_seq
514 ,constant
515 )
516 VALUES
517 (ln_application_id
518 ,ln_axis_set_id
519 ,ln_axis_seq
520 ,ln_calculation_seq
521 ,lv_operator
522 ,ln_operator_flag
523 ,ln_cal_axis_seq
524 ,''
525 );
526
527 ln_calculation_seq:=ln_calculation_seq+1;
528 FETCH c_axis_seqs_per_line INTO ln_cal_axis_seq;
529 END LOOP;
530
531 CLOSE c_axis_seqs_per_line;
532
533 --If current calculation line only contains one row name as operand,
534 --then retrieve sequence number by row name and insert it into temporary table
535 --'JA_CN_CFS_CALCULATION_GBLTEMP'
536 ELSIF lv_axis_name_low IS NOT NULL
537 THEN
538 OPEN c_axis_seq;
539 FETCH c_axis_seq INTO ln_cal_axis_seq;
540 CLOSE c_axis_seq;
541
542 INSERT
543 INTO
544 ja_cn_cfs_calculations_gt
545 (application_id,axis_set_id
546 ,axis_seq
547 ,calculation_seq
548 ,operator
549 ,operator_flag
550 ,cal_axis_seq
551 ,constant
552 )
553 VALUES
554 (ln_application_id
555 ,ln_axis_set_id
556 ,ln_axis_seq
557 ,ln_calculation_seq
558 ,lv_operator
559 ,ln_operator_flag
560 ,ln_cal_axis_seq
561 ,''
562 );
563
564 ln_calculation_seq:=ln_calculation_seq+1;
565
566 --If current calculation line only constains a constant,then directly insert this
567 --line into temporary table 'JA_CN_CFS_CALCULATION_GBLTEMP'
568 ELSIF ln_constant IS NOT NULL THEN
569
570
571 INSERT
572 INTO
573 ja_cn_cfs_calculations_gt
574 (application_id,axis_set_id
575 ,axis_seq
576 ,calculation_seq
577 ,operator
578 ,operator_flag
579 ,cal_axis_seq
580 ,constant
581 )
582 VALUES
583 (ln_application_id
584 ,ln_axis_set_id
585 ,ln_axis_seq
586 ,ln_calculation_seq
587 ,lv_operator
588 ,ln_operator_flag
589 ,''
590 ,ln_constant
591 );
592
593 ln_calculation_seq:=ln_calculation_seq+1;
594 END IF; --(ln_axis_seq_low IS NOT NULL)
595 END IF; --lv_operator<>'+' or lv_operator<>'-' or lv_operator <> 'ENTER'
596 FETCH c_report_calculations INTO lv_operator,ln_axis_seq_low,ln_axis_seq_high,lv_axis_name_low,ln_constant;
597 END LOOP; --WHILE c_report_calculation%FOUND
598
599 CLOSE c_report_calculations;
600
601 --Insert current item(Row) into the tempoary table 'ja_cn_cfs_row_cgs_gt'
602 --and set value of the column 'CALCULATION_FLAG' as 'Y'. If current item(Row) has calcuation lines with
603 --wrong operator, then set value of the column 'TYPE' as 'E'
604
605 IF lv_exit_flag='Y'
606 THEN
607 lv_type:='E';
608 ELSE
609 lv_type:='';
610 END IF; --lv_exit_flag='Y'
611
612 INSERT
613 INTO
614 ja_cn_cfs_row_cgs_gt
615 (application_id
616 ,axis_set_id
617 ,axis_seq
618 ,type
619 ,calculation_flag
620 ,display_flag
621 ,display_zero_amount_flag
622 ,change_sign_flag
623 )
624 VALUES
625 (ln_application_id
626 ,ln_axis_set_id
627 ,ln_axis_seq
628 ,lv_type
629 ,'Y'
630 ,lv_display_flag
631 ,lv_display_zero_flag
632 ,lv_change_sign_flag
633 );
634
635 --Get the sequence of current row in it's row set
636 SELECT COUNT(DISTINCT rra.axis_seq)
637 INTO ln_row_count
638 FROM
639 rg_report_axes rra
640 ,rg_report_calculations rrc
641 WHERE rra.axis_set_id=ln_axis_set_id
642 AND rra.axis_set_id=rrc.axis_set_id
643 AND rra.axis_seq=rrc.axis_seq
644 AND rrc.axis_seq<=ln_axis_seq;
645
646 --Update current row with row count and line count
647 UPDATE
648 ja_cn_cfs_row_cgs_gt
649 SET
650 rowcnt='r1'||lpad(to_char(ln_row_count),5,'0')
651 ,lincnt='l1'||lpad(to_char(ln_row_count),5,'0')
652 WHERE
653 application_id=ln_application_id
654 AND axis_set_id=ln_axis_set_id
655 AND axis_seq=ln_axis_seq;
656
657
658 FETCH c_report_axis INTO ln_application_id,lv_display_flag,lv_display_zero_flag,lv_change_sign_flag;
659 END LOOP; --c_report_axis%FOUND
660
661 CLOSE c_report_axis;
662
663 --log for debug
664 IF ( ln_proc_level >= ln_dbg_level)
665 THEN
666 FND_LOG.STRING(ln_proc_level
667 ,GV_MODULE_PREFIX||'.'||lv_proc_name||'.end'
668 ,'Exit procedure'
669 );
670 END IF;
671
672 EXCEPTION
673 WHEN OTHERS THEN
674 IF (ln_proc_level >= ln_dbg_level)
675 THEN
676 FND_LOG.String(ln_proc_level
677 ,GV_module_prefix||'.'||lv_proc_name||'.Other_Exception '
678 ,SQLCODE||':'||SQLERRM
679 );
680 END IF; --(ln_proc_level >= ln_dbg_level)
681
682 END Populate_Formula;
683
684 END JA_CN_FSG_FORMULA_EXTRACT_PKG;
685