DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_MAGTAPE_GENERIC

Source


1 package body pay_magtape_generic
2 /* $Header: pymaggen.pkb 120.7.12010000.1 2008/07/27 23:08:56 appldev ship $ */
3 as
4     g_debug boolean;  /* NOTE: CANNOT be initialised here !! */
5 --
6     type cursname_array is table of pay_magnetic_blocks.cursor_name%TYPE
7                        index by binary_integer;
8     type num_array is table of  number
9                        index by binary_integer;
10     type bool_array is table of boolean
11                        index by binary_integer;
12 -- Cursor Level arrays
13     curs                     cursname_array;
14     column_num               num_array;
15     block_id                 num_array;
16     formulas                 num_array;
17     first_run_flag           num_array;
18     row_counts               num_array;
19     intermediate_run         bool_array;
20     running_intermediate     bool_array;
21     level_no                 number;
22     report_id                pay_magnetic_blocks.report_format%TYPE;
23     int_prm_names            pay_mag_tape.host_array;
24     int_prm_values           pay_mag_tape.host_array;
25 --
26 -- Formula level details
27     formula_next_block       pay_magnetic_records.next_block_id%TYPE;
28     formula_id               pay_magnetic_records.formula_id%TYPE;
29     formula_frequency        pay_magnetic_records.frequency%TYPE;
30     formula_overflow         pay_magnetic_records.overflow_mode%TYPE;
31     formula_inter_repeat     pay_magnetic_records.last_run_executed_mode%TYPE;
32     formula_action_level     pay_magnetic_records.action_level%TYPE;
33     formula_block_label      pay_magnetic_records.block_label%TYPE;
34     formula_block_row_label  pay_magnetic_records.block_row_label%TYPE;
35     xml_proc_name            pay_magnetic_records.xml_proc_name%TYPE;
36     rec_sequence             pay_magnetic_records.sequence%TYPE;
37     return_arr_offset        number;
38 --
39 --
40 
41     procedure clear_cache
42     is
43     begin
44       level_no := 0;
45       formula_next_block := NULL;
46       use_action_block := 'N';
47       process_action_rec := 'N';
48     end clear_cache;
49 --
50 
51   -----------------------------------------------------------------------------
52   -- Name
53   --   date_earned
54   -- Purpose
55   --   Returns the least of the maximum date of an assignment and a date.
56   -- Arguments
57   -- Notes
58   --   Used within cursor definitions ie. can only be used from 7.1 of RDBMS
59   --   onwards.
60   -----------------------------------------------------------------------------
61  --
62  function date_earned
63  (
64   p_report_date   date,
65   p_assignment_id number
66  ) return date is
67    v_max_assignment_date date;
68    v_report_date         date := p_report_date;
69  begin
70    select max(SS.effective_end_date)
71    into   v_max_assignment_date
72    from   per_all_assignments_f SS
73    where  SS.assignment_id = p_assignment_id;
74    if v_max_assignment_date < v_report_date then
75      return (v_max_assignment_date);
76    else
77      return (v_report_date);
78    end if;
79  end date_earned;
80  --
81 
82 procedure set_paramter_value(asg_act_id number,
83 			     prm_name varchar,
84 			     prm_value varchar)
85 is
86 
87 begin
88    INSERT INTO FF_ARCHIVE_ITEMS
89                     (ARCHIVE_ITEM_ID,
90                      USER_ENTITY_ID,
91                      CONTEXT1,
92                      VALUE  ,
93                      ARCHIVE_TYPE,
94                      NAME
95                     )
96    VALUES
97                   (ff_archive_items_s.nextval,
98                    -1,
99                    asg_act_id,
100                    prm_value,
101                    'AAP',
102                    prm_name
103                     );
104 
105 end;
106 
107 
108 /*  Function - get_parameter_value
109     Action   - This returns the value of a named parameter from the
110                pay_mag_tape paramater tables.
111 */
112     function get_parameter_value(prm_name varchar2)
113     return varchar2 is
114      cnt number;
115      cnt2 number;
116      val varchar2(256);
117     begin
118       cnt := 1;
119       while cnt <= int_prm_values(1) loop
120          if int_prm_names(cnt) = prm_name then
121             val := int_prm_values(cnt);
122          end if;
123          cnt := cnt + 1;
124       end loop;
125       return val;
126     exception
127        when NO_DATA_FOUND then
128           return NULL;
129     end;
130 --
131 /*  Function - get_cursor_return
132     Action   - This returns a value retrieved by a named cursor and position
133                in that the column was selected.
134 */
135     function get_cursor_return(curs_name pay_magnetic_blocks.cursor_name%TYPE,
136                                pos number) return varchar is
137         column_no number;
138         level_cnt number;
139         cnt number;
140     begin
141         column_no := 0;
142         level_cnt := 1;
143 -- Find the cursor required
144         while curs(level_cnt) <> curs_name and level_cnt <> level_no loop
145            level_cnt := level_cnt + 1;
146         end loop;
147         if curs(level_cnt) = curs_name then
148            cnt := 1;
149            while cnt < level_cnt loop -- Find the position of column in
150                                       -- the returns table.
151                column_no := column_no + column_num(cnt);
152                cnt := cnt + 1;
153            end loop;
154            column_no := column_no + pos;
155            return ret_vals(column_no);
156         else
157            return NULL;
158         end if;
159     end;
160 --
161 /*  Function curs_is_open
162     Action:- This function is passed a cursor name and test to see if the
163              cursor is open.
164 */
165     function curs_is_open(cur_name pay_magnetic_blocks.cursor_name%TYPE)
166     return boolean is
167       sql_curs number;
168       rows_processed number;
169       statem varchar2(256);
170     begin
171        if g_debug then
172           hr_utility.trace('Entering pay_magtape_generic.curs_is_open');
173        end if;
174        statem := 'BEGIN IF '||cur_name||'%ISOPEN THEN '||
175                            'pay_magtape_generic.boolean_flag := TRUE; '||
176                            'ELSE pay_magtape_generic.boolean_flag := FALSE;'||
177                            ' END IF; END;';
178       sql_curs := dbms_sql.open_cursor;
179       dbms_sql.parse(sql_curs,
180                      statem,
181                      dbms_sql.v7);
182       rows_processed := dbms_sql.execute(sql_curs);
183       dbms_sql.close_cursor(sql_curs);
184        if g_debug then
185           hr_utility.trace('Exiting pay_magtape_generic.curs_is_open');
186        end if;
187       return boolean_flag;
188     end curs_is_open;
189 
190 /*  Procedure - curs_close
191     Actions   - This procedure close an already open cursor
192 */
193     procedure curs_close(cur_name pay_magnetic_blocks.cursor_name%TYPE) is
194       sql_curs number;
195       rows_processed number;
196       statem varchar2(256);
197     begin
198       if g_debug then
199          hr_utility.trace('Entering pay_magtape_generic.curs_close');
200       end if;
201       statem := 'BEGIN CLOSE '||cur_name||'; '||'end;';
202       sql_curs := dbms_sql.open_cursor;
203       dbms_sql.parse(sql_curs,
204                      statem,
205                      dbms_sql.v7);
206       rows_processed := dbms_sql.execute(sql_curs);
207       dbms_sql.close_cursor(sql_curs);
208       if g_debug then
209          hr_utility.trace('Exiting pay_magtape_generic.curs_close');
210       end if;
211     end curs_close;
212 
213 /*  Procedure - new_formula
214     Action    - This procedure sets up the context and the parameters table
215                 for the core C program from values setup in the controlling
216                 tables and cursors.
217 */
218     PROCEDURE new_formula
219     IS
220        found boolean;
221        cnt number;
222        no_rows number;
223        temp_formula_block_label      pay_magnetic_records.block_label%TYPE;
224        temp_formula_block_row_label   pay_magnetic_records.block_row_label%TYPE;
225        i number;
226        prm_cnt number;
227 
228 /*   Function tab_is_open
229      Action:- Test a number in a table to see if it relates to an open
230               cursor and returns TRUE is the cursor is open False
231               otherwise.
232 */
233     function tab_is_open(sql_cur num_array, sql_pos number) return boolean is
234       res boolean;
235     begin
236       if g_debug then
237          hr_utility.trace('Entering pay_magtape_generic.tab_is_open' || sql_cur(sql_pos));
238       end if;
239       res := dbms_sql.is_open(sql_cur(sql_pos));
240       if g_debug then
241          hr_utility.trace('Exiting pay_magtape_generic.tab_is_open');
242       end if;
243       return res;
244     exception
245        when NO_DATA_FOUND then
246           return FALSE;
247     end;
248 --
249 /*  Function first_run
250     Action:- THis function is passed a numeric value relating to a position
251              in the first_run_flag table and returns False if the value is
252              0 (ie. it is not the first run of this block) otherwise TRUE.
253 */
254     function first_run(pos number) return boolean is
255       res boolean;
256     begin
257       if g_debug then
258          hr_utility.trace('Entering pay_magtape_generic.first_run');
259       end if;
260       if first_run_flag(pos) = 1 then
261          first_run_flag(pos) := 0;
262          if g_debug then
263             hr_utility.trace('Exiting pay_magtape_generic.first_run');
264          end if;
265          return FALSE;
266       else
267          first_run_flag(pos) := 1;
268          if g_debug then
269             hr_utility.trace('Exiting pay_magtape_generic.first_run');
270          end if;
271          return TRUE;
272       end if;
273     exception
274        when NO_DATA_FOUND then
275          first_run_flag(pos) := 1;
276          if g_debug then
277             hr_utility.trace('Exiting pay_magtape_generic.first_run');
278          end if;
279           return TRUE;
280     end;
281 --
282 --
283 /*  Function curs_no_data
284     Action:- This function is passed a cursor name and test to see if data
285              was retrieved on the last fetch.
286 */
287     function curs_no_data(cur_name pay_magnetic_blocks.cursor_name%TYPE)
288     return boolean is
289       sql_curs number;
290       rows_processed number;
291       statem varchar2(256);
292     begin
293        if g_debug then
294           hr_utility.trace('Entering pay_magtape_generic.curs_no_data');
295        end if;
296        statem := 'BEGIN IF '||cur_name||'%FOUND THEN '||
297                            'pay_magtape_generic.boolean_flag := FALSE; '||
298                            'ELSE pay_magtape_generic.boolean_flag := TRUE;'||
299                            ' END IF; END;';
300       sql_curs := dbms_sql.open_cursor;
301       dbms_sql.parse(sql_curs,
302                      statem,
303                      dbms_sql.v7);
304       rows_processed := dbms_sql.execute(sql_curs);
305       dbms_sql.close_cursor(sql_curs);
306       if g_debug then
307          hr_utility.trace('Exiting pay_magtape_generic.curs_no_data');
308       end if;
309       return boolean_flag;
310     end curs_no_data;
311 --
312 /*  Procedure - curs_open
313     Action    - This opens a specified cursor.
314 */
315     procedure curs_open(cur_name pay_magnetic_blocks.cursor_name%TYPE) is
316       sql_curs number;
317       rows_processed number;
318       statem varchar2(256);
319     begin
320       if g_debug then
321          hr_utility.trace('Entering pay_magtape_generic.curs_open');
322       end if;
323       statem := 'BEGIN OPEN '||cur_name||'; '||'end;';
324       sql_curs := dbms_sql.open_cursor;
325       dbms_sql.parse(sql_curs,
326                      statem,
327                      dbms_sql.v7);
328       rows_processed := dbms_sql.execute(sql_curs);
329       dbms_sql.close_cursor(sql_curs);
330       if g_debug then
331          hr_utility.trace('Exiting pay_magtape_generic.curs_open');
332       end if;
333     end curs_open;
334 --
335 /*  Procedure - curs_fetch
336     Action    - This procedure executes a fetch into the retrieval table,
337                 given the cursor name and the number of vales being selected.
338 */
339     procedure curs_fetch(cur_name pay_magnetic_blocks.cursor_name%TYPE,
340                          return_no pay_magnetic_blocks.no_column_returned%TYPE)
341     is
342       sql_curs number;
343       rows_processed number;
344       statem varchar2(6000);
345       cnt number;
346       first boolean;
347       arr_num number;
348       pkg_name varchar2(50);
349     begin
350       if g_debug then
351          hr_utility.trace('Entering pay_magtape_generic.curs_fetch');
352       end if;
353       cnt := 1;
354 --
355 -- Workaround for bug #297130
356 --
357       pkg_name := substr(cur_name, 1, instr(cur_name, '.'));
358       statem := 'BEGIN '||pkg_name||'level_cnt := '||pkg_name||
359                     'level_cnt; FETCH '||cur_name||' INTO ';
360 /*
361       statem := 'BEGIN FETCH '||cur_name||' INTO ';
362 */
363       first := TRUE;
364       while cnt <= return_no loop   -- loop for the number of columns in
365          if first then              -- the select statement
366             first := FALSE;
367          else
368             statem := statem||',';
369          end if;
370          arr_num := return_arr_offset + cnt;  -- Add the off set so that
371                                               -- this cursor retrieves into
372                                               -- its own allocated area.
373 --
374          statem := statem||' pay_magtape_generic.ret_vals('||arr_num||')';
375          cnt := cnt + 1;
376       end loop;
377       statem := statem||'; END;';
378 hr_utility.trace(statem);
379      sql_curs := dbms_sql.open_cursor;
380       dbms_sql.parse(sql_curs,
381                      statem,
382                      dbms_sql.v7);
383       rows_processed := dbms_sql.execute(sql_curs);
384       dbms_sql.close_cursor(sql_curs);
385       if g_debug then
386          hr_utility.trace('Exiting pay_magtape_generic.curs_fetch');
387       end if;
388     end curs_fetch;
389 --
390 --
391 /*  Function - is_intermediate_required
392     Action   - This returns true if any rows of the formula table for a
393                particular block,  may require to be run after the last row
394                of the cursor for that block is retrieved.
395 */
396     function is_intermediate_required(level_no number) return boolean is
397       dummy char(1);
398     begin
399        if g_debug then
400           hr_utility.trace('Entering pay_magtape_generic.is_intermediate_required');
401        end if;
402        select 'M'
403        into dummy
404        from pay_magnetic_records pmr
405        where pmr.magnetic_block_id = block_id(level_no)
406        and   pmr.last_run_executed_mode in ('A', 'R', 'F');
407 --
408        return TRUE;
409        if g_debug then
410           hr_utility.trace('Exiting pay_magtape_generic.is_intermediate_required');
414           if g_debug then
411        end if;
412     exception
413        when NO_DATA_FOUND then
415              hr_utility.trace('Exiting pay_magtape_generic.is_intermediate_required');
416           end if;
417           return FALSE;
418        when TOO_MANY_ROWS then
419           if g_debug then
420              hr_utility.trace('Exiting pay_magtape_generic.is_intermediate_required');
421           end if;
422           return TRUE;
423     end;
424 --
425 /*  Function - open_formula
426     Action   - This opens a cursor for the formula for a particular cursor
427                and returns the new cursor id
428 */
429     function open_formula(block pay_magnetic_blocks.magnetic_block_id%TYPE)
430     return number is
431       sql_cur number;
432       ignore number;
433       statem varchar2(256);
434     begin
435        if g_debug then
436           hr_utility.trace('Entering pay_magtape_generic.open_formula');
437        end if;
438        sql_cur := dbms_sql.open_cursor;
439        statem := 'select formula_id, next_block_id,'||
440                  ' frequency, overflow_mode, '||
441                  'last_run_executed_mode, action_level ,'||
442                  'block_label,block_row_label,xml_proc_name,sequence '||
443                  ' from pay_magnetic_records '||
444                  'where magnetic_block_id = '||block||
445                  ' order by sequence';
446        dbms_sql.parse(sql_cur,
447                   statem,
448                   dbms_sql.v7);
449        dbms_sql.define_column(sql_cur, 1, formula_id);
450        dbms_sql.define_column(sql_cur, 2, formula_next_block);
451        dbms_sql.define_column(sql_cur, 3, formula_frequency);
452        dbms_sql.define_column(sql_cur, 4, formula_overflow, 1);
453        dbms_sql.define_column(sql_cur, 5, formula_inter_repeat, 1);
454        dbms_sql.define_column(sql_cur, 6, formula_action_level, 1);
455        dbms_sql.define_column(sql_cur, 7, formula_block_label,30);
456        dbms_sql.define_column(sql_cur, 8, formula_block_row_label,30);
457        dbms_sql.define_column(sql_cur, 9, xml_proc_name,256);
458        dbms_sql.define_column(sql_cur, 10, rec_sequence);
459        ignore := dbms_sql.execute(sql_cur);
460        if g_debug then
461           hr_utility.trace('Exiting pay_magtape_generic.open_formula');
462        end if;
463        return sql_cur;
464     end open_formula;
465 --
466 
467 /*  Function - intermediate_needed
468     Action   - This function determines if an extra run is required after the
469                last row of the cursor is retrieved.
470 */
471     function intermediate_needed return boolean is
472     found boolean;
473     begin
474       if g_debug then
475          hr_utility.trace('Entering pay_magtape_generic.intermediate_needed');
476       end if;
477       found := FALSE;
478       if formula_inter_repeat = 'A' then
479          found := TRUE;
480       else
481          if formula_inter_repeat = 'R' then
482             if intermediate_run(level_no) then
483                found := TRUE;
484             end if;
485          else
486             if not intermediate_run(level_no) then
487                found := TRUE;
488             end if;
489          end if;
490       end if;
491       if g_debug then
492          hr_utility.trace('Exiting pay_magtape_generic.intermediate_needed');
493       end if;
494       return found;
495     end;
496 --
497 /*  Function - open_inter_formula
498     Action   - This function does the same as open_formula except it select
499                statement only selects rows that have their last_run_execute
500                flag set to R, A or F (ie if a run may be required).
501 */
502     function open_inter_formula(block
503            pay_magnetic_blocks.magnetic_block_id%TYPE) return number is
504       sql_cur number;
505       ignore number;
506       statem varchar2(512);
507     begin
508        if g_debug then
509           hr_utility.trace('Entering pay_magtape_generic.intermediate_needed');
510        end if;
511        sql_cur := dbms_sql.open_cursor;
512        statem := 'select formula_id,next_block_id,'||
513                  'frequency,overflow_mode,'||
514                  'last_run_executed_mode,action_level,'||
515                  'block_label,block_row_label,xml_proc_name,sequence '||
516                  'from pay_magnetic_records '||
517                  'where magnetic_block_id='||block||
518                  ' and last_run_executed_mode in (''R'',''A'',''F'')'||
519                  ' order by sequence';
520        dbms_sql.parse(sql_cur,
521                   statem,
522                   dbms_sql.v7);
523        dbms_sql.define_column(sql_cur, 1, formula_id);
524        dbms_sql.define_column(sql_cur, 2, formula_next_block);
525        dbms_sql.define_column(sql_cur, 3, formula_frequency);
526        dbms_sql.define_column(sql_cur, 4, formula_overflow, 1);
527        dbms_sql.define_column(sql_cur, 5, formula_inter_repeat, 1);
528        dbms_sql.define_column(sql_cur, 6, formula_action_level, 1);
529        dbms_sql.define_column(sql_cur, 7, formula_block_label, 30);
530        dbms_sql.define_column(sql_cur, 8, formula_block_row_label, 30);
531        dbms_sql.define_column(sql_cur, 9, xml_proc_name, 256);
532        dbms_sql.define_column(sql_cur, 10, rec_sequence);
533        ignore := dbms_sql.execute(sql_cur);
537        return sql_cur;
534        if g_debug then
535           hr_utility.trace('Exiting pay_magtape_generic.intermediate_needed');
536        end if;
538     end open_inter_formula;
539 --
540 /*  Function - run_overflow
541     Action   - This function searches the parameter table for the parameter
542                TRANSFER_RUN_OVERFLOW, if it is found and its value is set to
543                Y then the boolean value true is returned otherwise false is
544                returned.
545 */
546     function run_overflow return boolean is
547       cnt number;
548     begin
549        if g_debug then
550           hr_utility.trace('Entering pay_magtape_generic.run_overflow');
551        end if;
552        cnt := 2;
553        while cnt <= pay_mag_tape.internal_prm_values(1) loop
554          if ((pay_mag_tape.internal_prm_names(cnt) = 'TRANSFER_RUN_OVERFLOW')
555              and (pay_mag_tape.internal_prm_values(cnt) = 'Y')) then
556             pay_mag_tape.internal_prm_values(cnt) := 'N';
557             return TRUE;
558          end if;
559          cnt := cnt + 1;
560        end loop;
561        if g_debug then
562           hr_utility.trace('Exiting pay_magtape_generic.run_overflow');
563        end if;
564        return FALSE;
565     exception
566        when NO_DATA_FOUND then
567           if g_debug then
568              hr_utility.trace('Exiting pay_magtape_generic.run_overflow');
569           end if;
570           return FALSE;
571     end run_overflow;
572 --
573 /*  Procedure - set_report_id
574     Action    - This procedure sets the report id on the first run of the
575                 procedure.
576 */
577     procedure set_report_id is
578     cnt number;
579     report_name varchar2(30);
580     begin
581        if g_debug then
582           hr_utility.trace('Entering pay_magtape_generic.set_report_id');
583        end if;
584        report_id := '0';
585        cnt := 1;
586 --
587        if (use_action_block = 'Y') then
588           report_name := 'MAGTAPE_ASG_REPORT_ID';
589        else
590           report_name := 'MAGTAPE_REPORT_ID';
591        end if;
592 --
593        while cnt <= pay_mag_tape.internal_prm_values(1) loop
594           if pay_mag_tape.internal_prm_names(cnt) = report_name then
595              hr_utility.trace('Match');
596              report_id := pay_mag_tape.internal_prm_values(cnt);
597              hr_utility.trace('Set Value');
598           end if;
599           cnt := cnt + 1;
600        end loop;
601        if g_debug then
602           hr_utility.trace('Exiting pay_magtape_generic.set_report_id');
603        end if;
604     end;
605 --
606 /*  Procedure - setup return_values
607     Action    - This procedure sets up the PL/SQL tables for the Fast Formula
608                 The context rules and the parameters are transfered from the
609                 retrieval table.
610 */
611     procedure setup_return_values (formula_id number,xml_proc_name varchar,
612                     return_num number) is
613     cnt number;
614     cxt_cnt number;
615     prm_cnt number;
616     xml_cnt number;
617     chk_cxt number;
618     pos number;
619     str varchar(256);
620     con_str varchar(256);
621     begin
622 -- Set up the Contexts
623        if g_debug then
624           hr_utility.trace('Entering pay_magtape_generic.setup_return_values');
625        end if;
626        cnt := return_num + return_arr_offset;  -- Set up the outer loop to
627        cxt_cnt := 1;                           -- run from the last entry
628        while cnt > 0 loop                      -- in the retrieval list to
629           pos := instr(ret_vals(cnt), '=');    -- the first.
630           if pos <> 0 then
631              str := substr(ret_vals(cnt),
632                             pos + 1, pos + 2);
633              con_str := substr(ret_vals(cnt),0, pos - 1);
634                                                -- If entry is a context rule
635              if str = 'C' then                 -- then search context table
636                 found := FALSE;                -- for an existing entry for
637                 chk_cxt := 1;                  -- this context.
638                 while chk_cxt <= cxt_cnt loop
639                    if pay_mag_tape.internal_cxt_names(chk_cxt) =
640                                               con_str then
641                        found := TRUE;
642                    end if;
643                    chk_cxt := chk_cxt + 1;
644                 end loop;
645                 if not found then              -- If there was no entry for
646                    cxt_cnt := cxt_cnt + 1;     -- the context then enter one.
647                    pay_mag_tape.internal_cxt_names(cxt_cnt) :=
648                                 substr(ret_vals(cnt),
649                                       0, pos - 1);
650                    pay_mag_tape.internal_cxt_values(cxt_cnt) := ret_vals(cnt +
651                                                                 1);
652 -- Bug 259276. Fix between the two following lines
653 -- Problem with using the to_char fuction within the dynamically called
654 -- cursors.
655 -- This code is now redundant as the value of the date context is
656 -- already in canonical form.
657 -- ---------------------------------------------------------------------------
658 --                   if pay_mag_tape.internal_cxt_names(cxt_cnt) like 'DATE%'
662 --                             'YYYY/MM/DD');
659 --                   then
660 --                     pay_mag_tape.internal_cxt_values(cxt_cnt) :=
661 --                     to_char(to_date(pay_mag_tape.internal_cxt_values(cxt_cnt), 'YYYY/MM/DD'),
663 --                   end if;
664 -- --------------------------------------------------------------------------
665                  end if;
666               end if;
667           end if;
668           cnt := cnt - 1;
669        end loop;
670 -- Set up the parameters
671        cnt := return_arr_offset + 1;                     -- Search the returns
672        while cnt <= return_num + return_arr_offset loop  -- table for the new
673           pos := instr(ret_vals(cnt), '=');              -- parameter values
674           if pos <> 0 then
675              str := substr(ret_vals(cnt),
676                             pos + 1, pos + 2);
677              con_str := substr(ret_vals(cnt),0, pos - 1);
678              if str = 'P' then
679                 found := FALSE;
680                 prm_cnt := 1;
681                 while prm_cnt <= pay_mag_tape.internal_prm_values(1) loop
682                    if pay_mag_tape.internal_prm_names(prm_cnt) = con_str then
683                       found := TRUE;
684                       cnt := cnt + 1;
685                       pay_mag_tape.internal_prm_values(prm_cnt) :=
686                                                            ret_vals(cnt);
687                    end if;
688                    prm_cnt := prm_cnt + 1;
689                 end loop;
690                 if not found then              -- Add new parameter to table
691                    pay_mag_tape.internal_prm_names(prm_cnt) := con_str;
692                    cnt := cnt + 1;
693                    pay_mag_tape.internal_prm_values(prm_cnt) :=
694                                                       ret_vals(cnt);
695                    pay_mag_tape.internal_prm_values(1) := prm_cnt;
696                 end if;
697              end if;
698             end if;
699             cnt := cnt + 1;
700          end loop;
701       cnt := return_arr_offset + 1;                     -- Search the returns
702        xml_cnt := pay_mag_tape.internal_xml_values(1);
703        while cnt <= return_num + return_arr_offset loop  -- table for the new
704           pos := instr(ret_vals(cnt), '=');              -- parameter values
705           if pos <> 0 then
706              str := substr(ret_vals(cnt),
707                             pos + 1, pos + 2);
708              con_str := substr(ret_vals(cnt),0, pos - 1);
709              if str = 'X' then
710                    xml_cnt := pay_mag_tape.internal_xml_values(1)+1;
711                    pay_mag_tape.internal_xml_names(xml_cnt) := con_str;
712                    cnt := cnt + 1;
713                    pay_mag_tape.internal_xml_values(xml_cnt) :=
714                                                       ret_vals(cnt);
715                    xml_cnt := pay_mag_tape.internal_xml_values(1)+2;
716                    pay_mag_tape.internal_xml_names(xml_cnt) := '/'||con_str;
717                    pay_mag_tape.internal_xml_values(1) := xml_cnt;
718              end if;
719             end if;
720             cnt := cnt + 1;
721          end loop;
722 --
723 --  Set up the formula id and context count
724        pay_mag_tape.internal_cxt_values(1) := cxt_cnt;
725        pay_mag_tape.internal_xml_values(1) := xml_cnt;
726        pay_mag_tape.internal_prm_values(2) := formula_id;
727        pay_mag_tape.internal_xml_values(2) := xml_proc_name;
728        int_prm_names := pay_mag_tape.internal_prm_names;
729        int_prm_values := pay_mag_tape.internal_prm_values;
730        if (nvl(formula_action_level, 'N') = 'A') then
731          process_action_rec := 'Y';
732        else
733          process_action_rec := 'N';
734        end if;
735        if g_debug then
736           hr_utility.trace('Exiting pay_magtape_generic.setup_return_values');
737        end if;
738     end setup_return_values;
739 --
740     BEGIN
741        g_debug := hr_utility.debug_enabled;
742        if g_debug then
743           hr_utility.trace('Entering pay_magtape_generic.new_formula');
744        end if;
745                                 -- First run through setup report details
746        int_prm_names := pay_mag_tape.internal_prm_names;
747        int_prm_values := pay_mag_tape.internal_prm_values;
748        if level_no = 0 then
749           g_debug := hr_utility.debug_enabled;
750           set_report_id;
751           level_no := 1;
752           return_arr_offset := 0;
753           select cursor_name, nvl(no_column_returned,0), magnetic_block_id
754           into   curs(1),  column_num(1), block_id(1)
755           from   pay_magnetic_blocks
756           where main_block_flag = 'Y'
757           and   report_format = report_id;
758 
759           hr_utility.trace(curs(1)||'..'||to_char(column_num(1))||'..'||to_char(block_id(1)));
760 
761        prm_cnt :=pay_mag_tape.internal_prm_values(1)+1;
762        pay_mag_tape.internal_prm_names(prm_cnt) :='magnetic_block_id';
763        pay_mag_tape.internal_prm_values(prm_cnt):=block_id(1);
764        prm_cnt :=pay_mag_tape.internal_prm_values(1)+2;
765        pay_mag_tape.internal_prm_names(prm_cnt) :='rec_sequence';
766        pay_mag_tape.internal_prm_values(1):=prm_cnt;
767        int_prm_names := pay_mag_tape.internal_prm_names;
768        int_prm_values := pay_mag_tape.internal_prm_values;
769 
773            pay_mag_tape.internal_xml_names(2) := formula_block_label;
770        end if;
771        if formula_block_label is not null
772        then
774            pay_mag_tape.internal_xml_values(1) := 2;
775        end if;
776                                 -- The previous formula requests a new
777                                 -- block to be set up
778        if formula_next_block is not null then
779           return_arr_offset := return_arr_offset + column_num(level_no);
780           level_no := level_no + 1;
781           select cursor_name, nvl(no_column_returned,0), magnetic_block_id
782           into   curs(level_no),  column_num(level_no), block_id(level_no)
783           from   pay_magnetic_blocks
784           where magnetic_block_id = formula_next_block
785           and   report_format = report_id;
786           hr_utility.trace(to_char(level_no)||'..'||curs(level_no)||'..'||to_char(column_num(level_no))||'..'||to_char(block_id(level_no)));
787         i:=1;
788         while (pay_mag_tape.internal_prm_names(i) <>'magnetic_block_id')
789         loop
790              i:=i+1;
791         end loop;
792         pay_mag_tape.internal_prm_values(i):=block_id(level_no);
793          int_prm_values := pay_mag_tape.internal_prm_values;
794        end if;
795        found := FALSE;
796 --
797 -- Is formula an overflow repeat and is the overflow formula requested to run
798 --
799        if (formula_overflow = 'R') then
800           if run_overflow then
801              if not running_intermediate(level_no) then
802                 found := TRUE;
803              else
804                 if intermediate_needed then
805                    found := TRUE;
806                 end if;
807              end if;
808           end if;
809        end if;
810 --
811 -- Loop until the next formula is found
812 --
813 
814        cur_fetch:=FALSE;
815        while not found loop
816                             -- If formulas cursor is not open then open
817                             -- cursor
818           if not tab_is_open(formulas, level_no) then
819                             -- If a driving cursor exists and its not open
820                             -- then set the cursor up.
821              if not(curs(level_no) is null) then
822                  if not curs_is_open(curs(level_no)) then
823                     curs_open(curs(level_no));
824                     row_counts(level_no) := 0;
825                     running_intermediate(level_no) := FALSE;
826                     intermediate_run(level_no) := FALSE;
827                  end if;
828                  curs_fetch(curs(level_no), column_num(level_no));
829                  row_counts(level_no) := row_counts(level_no) + 1;
830                              -- If no data is retrieved from the driving
831                              -- cursor return to the previous level after
832                              -- an intermediate run if required.
833                  if curs_no_data(curs(level_no)) then
834                     cur_fetch:=FALSE;
835                     if (is_intermediate_required(level_no)
836                         and not running_intermediate(level_no)) then
837                       formulas(level_no) := open_inter_formula(
838                                                block_id(level_no));
839                       running_intermediate(level_no) := TRUE;
840                     else
841                       if (formula_id=-9999 and xml_proc_name is null) then
842 
843                         no_rows :=  dbms_sql.last_row_count;
844                         if (level_no >1) then
845                          dbms_sql.column_value(formulas(level_no-1), 7,
846                                                     temp_formula_block_label);
847                        /*  if (no_rows=0 and temp_formula_block_label is not NULL) then
848                            cnt :=pay_mag_tape.internal_xml_values(1)-1;
849                            pay_mag_tape.internal_xml_values(1) := cnt;
850                          els*/if (temp_formula_block_label is not NULL) then
851                            cnt :=pay_mag_tape.internal_xml_values(1)+1;
852                            pay_mag_tape.internal_xml_names(cnt) := '/'||temp_formula_block_label;
853                            pay_mag_tape.internal_xml_values(1) := cnt;
854                          end if;
855                         end if;
856                       end if;
857                       curs_close(curs(level_no));
858                       level_no := level_no - 1;
859                       return_arr_offset := return_arr_offset -
860                                              column_num(level_no);
861                     end if;
862                  else
863                       cur_fetch:=TRUE;
864                       formulas(level_no) := open_formula(block_id(level_no));
865                  end if;
866              else
867                  if first_run(level_no) then
868                       formulas(level_no) := open_formula(block_id(level_no));
869                       running_intermediate(level_no) := FALSE;
870                       intermediate_run(level_no) := FALSE;
871                  else
872                     level_no := level_no -1;
873                  end if;
874               end if;
875           else
876 -- Get formula details
877            if dbms_sql.fetch_rows(formulas(level_no)) > 0 then
881              dbms_sql.column_value(formulas(level_no), 4, formula_overflow);
878              dbms_sql.column_value(formulas(level_no), 1, formula_id);
879              dbms_sql.column_value(formulas(level_no), 2, formula_next_block);
880              dbms_sql.column_value(formulas(level_no), 3, formula_frequency);
882              dbms_sql.column_value(formulas(level_no), 5,
883                                                        formula_inter_repeat);
884              dbms_sql.column_value(formulas(level_no), 6,
885                                                        formula_action_level);
886              dbms_sql.column_value(formulas(level_no), 7,
887                                                        formula_block_label);
888              dbms_sql.column_value(formulas(level_no), 8,
889                                                        formula_block_row_label);
890              dbms_sql.column_value(formulas(level_no), 9, xml_proc_name);
891              dbms_sql.column_value(formulas(level_no), 10, rec_sequence);
892 
893 -- set up mgnetic record id a s a paramter
894         i:=1;
895         while (pay_mag_tape.internal_prm_names(i) <>'rec_sequence')
896         loop
897              i:=i+1;
898         end loop;
899         pay_mag_tape.internal_prm_values(i):=rec_sequence;
900          int_prm_values := pay_mag_tape.internal_prm_values;
901 
902 --
903 -- Is formula an overflow and is the overflow formula requested to run
904 --
905              if ((formula_overflow = 'Y') or (formula_overflow = 'R')) then
906                 if run_overflow then
907                    if not running_intermediate(level_no) then
908                      found := TRUE;
909                    else
910                       if intermediate_needed then
911                          found := TRUE;
912                       end if;
913                    end if;
914                 end if;
915              else
916 --
917 -- Is formula a skip count and has the count reached the run point
918 --
919                 if formula_frequency is not null then
920                    if not running_intermediate(level_no) then
921                       if (row_counts(level_no)
922                                  mod formula_frequency) = 0 then
923                          intermediate_run(level_no) := TRUE;
924                          found := TRUE;
925                       end if;
926                    else
927                       if ((row_counts(level_no) -1)
928                                  mod formula_frequency <> 0) and
929                                   intermediate_needed then
930                          found := TRUE;
931                       end if;
932                    end if;
933                 else
934 --
935 -- Ordinary formula that runs everytime
936 --
937                    if not running_intermediate(level_no) then
938                       found := TRUE;
939                    else
940                       if intermediate_needed then
941                          found := TRUE;
942                       end if;
943                    end if;
944                 end if;
945               end if;
946            else
947               dbms_sql.close_cursor(formulas(level_no));
948            end if;
949           end if;
950       end loop;
951 
952      if (formula_id=-9999 and xml_proc_name is null) then
953       if (level_no>1) then
954        dbms_sql.column_value(formulas(level_no-1), 8, temp_formula_block_row_label);
955        if (cur_fetch=TRUE and temp_formula_block_row_label is not null)
956        then
957          hr_utility.trace(to_char(cnt)||temp_formula_block_row_label);
958         cnt :=pay_mag_tape.internal_xml_values(1)+1;
959         pay_mag_tape.internal_xml_names(cnt) := temp_formula_block_row_label;
960         pay_mag_tape.internal_xml_values(1) := cnt;
961         setup_return_values(formula_id,xml_proc_name, column_num(level_no));
962          hr_utility.trace(to_char(cnt)||'..'||pay_mag_tape.internal_xml_values(1));
963         cnt :=pay_mag_tape.internal_xml_values(1)+1;
964          hr_utility.trace(to_char(cnt));
965         pay_mag_tape.internal_xml_names(cnt) := '/'||temp_formula_block_row_label;
966         pay_mag_tape.internal_xml_values(1) := cnt;
967        elsif (cur_fetch=TRUE)  then
968         setup_return_values(formula_id,xml_proc_name,  column_num(level_no));
969        end if;
970       elsif  (cur_fetch=TRUE)  then
971         setup_return_values(formula_id,xml_proc_name, column_num(level_no));
972       end if;
973      else
974         setup_return_values(formula_id,xml_proc_name, column_num(level_no));
975      end if;
976 
977       if g_debug then
978          hr_utility.trace('Exiting pay_magtape_generic.new_formula');
979       end if;
980     END new_formula;
981 --
982 procedure clear_cursors is
983 begin
984 while level_no >0
985 loop
986  if (dbms_sql.is_open(formulas(level_no))) then
987   dbms_sql.close_cursor(formulas(level_no));
988  end if;
989  if curs_is_open(curs(level_no)) then
990   curs_close(curs(level_no));
991  end if;
992  level_no := level_no-1;
993 end loop;
994 return_arr_offset := 0;
995 formula_next_block := NULL;
996 process_action_rec := 'N';
997 
998 end;
999 
1000    BEGIN
1001       level_no := 0;
1002       formula_next_block := NULL;
1003       use_action_block := 'N';
1004       process_action_rec := 'N';
1005    END pay_magtape_generic;