1 package body ff_client_engine as
2 /* $Header: ffcxeng.pkb 115.0 99/07/16 02:02:05 porting ship $ */
3
4 /*---------------------------------------------------------------------------*/
5 /*-------------------------- global variables -------------------------------*/
6 /*---------------------------------------------------------------------------*/
7 /*
8 * Need to keep the input and output data structures in global
9 * variables.
10 */
11 g_inputs ff_exec.inputs_t; -- inputs and contexts.
12 g_outputs ff_exec.outputs_t; -- the outputs.
13
14 /*---------------------------------------------------------------------------*/
15 /*------------------ local functions and procedures -------------------------*/
16 /*---------------------------------------------------------------------------*/
17
18 /*
19 * Actually deals with the core business of setting
20 * an input (or context) value.
21 * If the p_datatype parameter is null, it does not
22 * check the datatype of the input name - it assumes
23 * that it is correct.
24 * It is a private procedure.
25 */
26 procedure local_set_input
27 (
28 p_input_name in varchar2,
29 p_input_value in varchar2
30 ) is
31 l_count binary_integer;
32 l_found boolean := false;
33 begin
34
35 ff_utils.entry('client:local_set_input');
36
37 if(p_input_name is null) then
38 return; -- do not set if null.
39 end if;
40
41 for l_count in g_inputs.first..g_inputs.last loop
42 -- Search for a match in the name.
43 if(g_inputs(l_count).name = p_input_name) then
44 g_inputs(l_count).value := p_input_value;
45 l_found := TRUE;
46 exit; -- will only be one match.
47 end if;
48 end loop;
49
50 -- We expect to have found the input, so check that.
51 if(not l_found) then
52 hr_utility.set_message(801, 'FFPLX03_ITEM_NOT_FOUND');
53 hr_utility.set_message_token('NAME', p_input_name);
54 hr_utility.raise_error;
55 end if;
56
57 ff_utils.exit('client:local_set_input');
58
59 end local_set_input;
60
61 /*
62 * Generic, overloaded version of the get_output procedure
63 * called by the datatype specific versions.
64 * If the p_return_name parameter is null, the routine
65 * does not attempt to set a value.
66 * If the p_datatype parameter is null, it assumes
67 * the datatype of the input matches the expected
68 * type.
69 */
70 procedure local_get_output
71 (
72 p_return_name in varchar2,
73 p_return_value out varchar2
74 ) is
75 l_count binary_integer;
76 l_found boolean;
77 begin
78
79 ff_utils.entry('client:local_get_output');
80
81 -- Exit immediately if the return name is null.
82 if(p_return_name is null) then
83 return;
84 end if;
85
86 for l_count in g_outputs.first..g_outputs.last loop
87 if(g_outputs(l_count).name = p_return_name) then
88 p_return_value := g_outputs(l_count).value;
89 l_found := TRUE;
90 exit; -- wil be only one match.
91 end if;
92 end loop;
93
94 -- We expect to have found the input, so check that.
95 if(not l_found) then
96 hr_utility.set_message(801, 'FFPLX03_ITEM_NOT_FOUND');
97 hr_utility.set_message_token('NAME', p_return_name);
98 hr_utility.raise_error;
99 end if;
100
101 ff_utils.exit('client:local_get_output');
102
103 end local_get_output;
104
105
106 ---------------------------- init_formula -------------------------------------
107 /*
108 NAME
109 init_formula
110 DESCRIPTION
111 Initialises engine to allow execution of a formula.
112 NOTES
113 Calls the main formula initialisation, creating the tables.
114 */
115
116 procedure init_formula
117 (
118 p_formula_id in number,
119 p_effective_date in date
120 ) is
121 begin
122
123 ff_utils.entry('client:init_formula');
124
125 ff_exec.init_formula(p_formula_id, p_effective_date, g_inputs, g_outputs);
126
127 ff_utils.exit('client:init_formula');
128
129 end init_formula;
130
131 ------------------------------- set_input -------------------------------------
132 /*
133 NAME
134 set_input
135 DESCRIPTION
136 Allows the setting of inputs or contexts to the formula.
137 One version has to be used for all three data types.
138 NOTES
139 The input with the appropriate name is searched for in the
140 inputs table and the value set.
141 */
142
143 procedure set_input
144 (
145 p_input_name in varchar2,
146 p_value in varchar2
147 ) is
148 begin
149 ff_utils.entry('client:set_input (varchar2)');
150
151 -- Call the generic set_input procedure
152 local_set_input(p_input_name, p_value);
153
154 ff_utils.exit('set_input (varchar2)');
155
156 end set_input;
157
158 ------------------------------ run_formula ------------------------------------
159 /*
160 NAME
161 init_formula
162 DESCRIPTION
163 Uses data structures built up to execute Fast Formula.
164 NOTES
165 Calls the main run_formula routine.
166 Always uses the db item cache.
167 */
168
169 procedure run_formula is
170 begin
171
172 ff_utils.entry('client:run_formula');
173
174 ff_exec.run_formula(g_inputs, g_outputs);
175
176 ff_utils.exit('client:run_formula');
177
178 end run_formula;
179
180 ------------------------------- run_id_formula --------------------------------
181 /*
182 NAME
183 run_id_formula
184 DESCRIPTION
185 This procedure is designed specifically to be called from forms,
186 in that it reduces network round trips to a minimum, i.e. it sets
187 inputs and executes the formula in one network round-trip,
188 returning values on the way back.
189
190 This version is to be used when the caller knows the id of the
191 formula they wish to execute.
192
193 Unfortunately, since forms PLSQL is V1 - we cannot have an
194 arbitrarily large number of parameters (using defaults) - so
195 this procedure copes with up to 5 inputs, contexts and
196 outputs.
197
198 The clent will simply pass null values to the parameters
199 that are not needed.
200 */
201 procedure run_id_formula
202 (
203 p_formula_id in number,
204 p_effective_date in date,
205 p_input_name01 in varchar2, p_input_value01 in varchar2,
206 p_input_name02 in varchar2, p_input_value02 in varchar2,
207 p_input_name03 in varchar2, p_input_value03 in varchar2,
208 p_input_name04 in varchar2, p_input_value04 in varchar2,
209 p_input_name05 in varchar2, p_input_value05 in varchar2,
210 p_input_name06 in varchar2, p_input_value06 in varchar2,
211 p_input_name07 in varchar2, p_input_value07 in varchar2,
212 p_input_name08 in varchar2, p_input_value08 in varchar2,
213 p_input_name09 in varchar2, p_input_value09 in varchar2,
214 p_input_name10 in varchar2, p_input_value10 in varchar2,
215
216 p_context_name01 in varchar2, p_context_value01 in varchar2,
217 p_context_name02 in varchar2, p_context_value02 in varchar2,
218 p_context_name03 in varchar2, p_context_value03 in varchar2,
219 p_context_name04 in varchar2, p_context_value04 in varchar2,
220 p_context_name05 in varchar2, p_context_value05 in varchar2,
221 p_context_name06 in varchar2, p_context_value06 in varchar2,
222 p_context_name07 in varchar2, p_context_value07 in varchar2,
223 p_context_name08 in varchar2, p_context_value08 in varchar2,
224 p_context_name09 in varchar2, p_context_value09 in varchar2,
225 p_context_name10 in varchar2, p_context_value10 in varchar2,
226 p_context_name11 in varchar2, p_context_value11 in varchar2,
227 p_context_name12 in varchar2, p_context_value12 in varchar2,
228 p_context_name13 in varchar2, p_context_value13 in varchar2,
229 p_context_name14 in varchar2, p_context_value14 in varchar2,
230
231 p_return_name01 in varchar2, p_return_value01 in out varchar2,
232 p_return_name02 in varchar2, p_return_value02 in out varchar2,
233 p_return_name03 in varchar2, p_return_value03 in out varchar2,
234 p_return_name04 in varchar2, p_return_value04 in out varchar2,
235 p_return_name05 in varchar2, p_return_value05 in out varchar2,
236 p_return_name06 in varchar2, p_return_value06 in out varchar2,
237 p_return_name07 in varchar2, p_return_value07 in out varchar2,
238 p_return_name08 in varchar2, p_return_value08 in out varchar2,
239 p_return_name09 in varchar2, p_return_value09 in out varchar2,
240 p_return_name10 in varchar2, p_return_value10 in out varchar2
241 ) is
242 begin
243
244 ff_utils.entry('run_id_formula');
245
246 -- Initialise the formula.
247 ff_exec.init_formula(p_formula_id, p_effective_date, g_inputs, g_outputs);
248
249 -- Set the inputs.
250 local_set_input(p_input_name01, p_input_value01);
251 local_set_input(p_input_name02, p_input_value02);
252 local_set_input(p_input_name03, p_input_value03);
253 local_set_input(p_input_name04, p_input_value04);
254 local_set_input(p_input_name05, p_input_value05);
255 local_set_input(p_input_name06, p_input_value06);
256 local_set_input(p_input_name07, p_input_value07);
257 local_set_input(p_input_name08, p_input_value08);
258 local_set_input(p_input_name09, p_input_value09);
259 local_set_input(p_input_name10, p_input_value10);
260
261 -- Set the contexts.
262 local_set_input(p_context_name01, p_context_value01);
263 local_set_input(p_context_name02, p_context_value02);
264 local_set_input(p_context_name03, p_context_value03);
265 local_set_input(p_context_name04, p_context_value04);
266 local_set_input(p_context_name05, p_context_value05);
267 local_set_input(p_context_name06, p_context_value06);
268 local_set_input(p_context_name07, p_context_value07);
269 local_set_input(p_context_name08, p_context_value08);
270 local_set_input(p_context_name09, p_context_value09);
271 local_set_input(p_context_name10, p_context_value10);
272 local_set_input(p_context_name11, p_context_value11);
273 local_set_input(p_context_name12, p_context_value12);
274 local_set_input(p_context_name13, p_context_value13);
275 local_set_input(p_context_name14, p_context_value14);
276
277 -- Now execute the formula.
278 ff_client_engine.run_formula;
279
280 -- Get the outputs.
281 local_get_output(p_return_name01, p_return_value01);
282 local_get_output(p_return_name02, p_return_value02);
283 local_get_output(p_return_name03, p_return_value03);
284 local_get_output(p_return_name04, p_return_value04);
285 local_get_output(p_return_name05, p_return_value05);
286 local_get_output(p_return_name06, p_return_value06);
287 local_get_output(p_return_name07, p_return_value07);
288 local_get_output(p_return_name08, p_return_value08);
289 local_get_output(p_return_name09, p_return_value09);
290 local_get_output(p_return_name10, p_return_value10);
291
292 ff_utils.exit('run_id_formula');
293
294 end run_id_formula;
295
296 ------------------------------ run_name_formula -------------------------------
297 /*
298 NAME
299 run_name_formula
300 DESCRIPTION
301 This procedure is designed specifically to be called from forms,
302 in that it reduces network round trips to a minimum, i.e. it sets
303 inputs and executes the formula in one network round-trip,
304 returning values on the way back.
305
306 This version takes formula_name and formula_type_name as a
307 convenience for users who do not know the formula_id.
308
309 Unfortunately, since forms PLSQL is V1 - we cannot have an
310 arbitrarily large number of parameters (using defaults) - so
311 this procedure copes with up to 5 inputs, contexts and
312 outputs.
313
314 The clent will simply pass null values to the parameters
315 that are not needed.
316 */
317 procedure run_name_formula
318 (
319 p_formula_type_name in varchar2,
320 p_formula_name in varchar2,
321 p_effective_date in date,
322 p_input_name01 in varchar2, p_input_value01 in varchar2,
323 p_input_name02 in varchar2, p_input_value02 in varchar2,
324 p_input_name03 in varchar2, p_input_value03 in varchar2,
325 p_input_name04 in varchar2, p_input_value04 in varchar2,
326 p_input_name05 in varchar2, p_input_value05 in varchar2,
327 p_input_name06 in varchar2, p_input_value06 in varchar2,
328 p_input_name07 in varchar2, p_input_value07 in varchar2,
329 p_input_name08 in varchar2, p_input_value08 in varchar2,
330 p_input_name09 in varchar2, p_input_value09 in varchar2,
331 p_input_name10 in varchar2, p_input_value10 in varchar2,
332
333 p_context_name01 in varchar2, p_context_value01 in varchar2,
334 p_context_name02 in varchar2, p_context_value02 in varchar2,
335 p_context_name03 in varchar2, p_context_value03 in varchar2,
336 p_context_name04 in varchar2, p_context_value04 in varchar2,
337 p_context_name05 in varchar2, p_context_value05 in varchar2,
338 p_context_name06 in varchar2, p_context_value06 in varchar2,
339 p_context_name07 in varchar2, p_context_value07 in varchar2,
340 p_context_name08 in varchar2, p_context_value08 in varchar2,
341 p_context_name09 in varchar2, p_context_value09 in varchar2,
342 p_context_name10 in varchar2, p_context_value10 in varchar2,
343 p_context_name11 in varchar2, p_context_value11 in varchar2,
344 p_context_name12 in varchar2, p_context_value12 in varchar2,
345 p_context_name13 in varchar2, p_context_value13 in varchar2,
346 p_context_name14 in varchar2, p_context_value14 in varchar2,
347
348 p_return_name01 in varchar2, p_return_value01 in out varchar2,
349 p_return_name02 in varchar2, p_return_value02 in out varchar2,
350 p_return_name03 in varchar2, p_return_value03 in out varchar2,
351 p_return_name04 in varchar2, p_return_value04 in out varchar2,
352 p_return_name05 in varchar2, p_return_value05 in out varchar2,
353 p_return_name06 in varchar2, p_return_value06 in out varchar2,
354 p_return_name07 in varchar2, p_return_value07 in out varchar2,
355 p_return_name08 in varchar2, p_return_value08 in out varchar2,
356 p_return_name09 in varchar2, p_return_value09 in out varchar2,
357 p_return_name10 in varchar2, p_return_value10 in out varchar2
358 ) is
359 l_formula_id number;
360 begin
361 ff_utils.entry('run_name_formula');
362
363 -- Obtain the appropriate ids.
364 select fff.formula_id
365 into l_formula_id
366 from ff_formulas_f fff,
367 ff_formula_types fft
368 where fft.formula_type_name = p_formula_type_name
369 and fff.formula_type_id = fft.formula_type_id
370 and fff.formula_name = p_formula_name
371 and p_effective_date between
372 fff.effective_start_date and fff.effective_end_date;
373
374 -- Call the other version of run_formula.
375 ff_client_engine.run_id_formula
376 (
377 p_formula_id => l_formula_id,
378 p_effective_date => p_effective_date,
379 p_input_name01 => p_input_name01,
380 p_input_value01 => p_input_value01,
381 p_input_name02 => p_input_name02,
382 p_input_value02 => p_input_value02,
383 p_input_name03 => p_input_name03,
384 p_input_value03 => p_input_value03,
385 p_input_name04 => p_input_name04,
386 p_input_value04 => p_input_value04,
387 p_input_name05 => p_input_name05,
388 p_input_value05 => p_input_value05,
389 p_input_name06 => p_input_name06,
390 p_input_value06 => p_input_value06,
391 p_input_name07 => p_input_name07,
392 p_input_value07 => p_input_value07,
393 p_input_name08 => p_input_name08,
394 p_input_value08 => p_input_value08,
398 p_input_value10 => p_input_value10,
395 p_input_name09 => p_input_name09,
396 p_input_value09 => p_input_value09,
397 p_input_name10 => p_input_name10,
399
400 p_context_name01 => p_context_name01,
401 p_context_value01 => p_context_value01,
402 p_context_name02 => p_context_name02,
403 p_context_value02 => p_context_value02,
404 p_context_name03 => p_context_name03,
405 p_context_value03 => p_context_value03,
406 p_context_name04 => p_context_name04,
407 p_context_value04 => p_context_value04,
408 p_context_name05 => p_context_name05,
409 p_context_value05 => p_context_value05,
410 p_context_name06 => p_context_name06,
411 p_context_value06 => p_context_value06,
412 p_context_name07 => p_context_name07,
413 p_context_value07 => p_context_value07,
414 p_context_name08 => p_context_name08,
415 p_context_value08 => p_context_value08,
416 p_context_name09 => p_context_name09,
417 p_context_value09 => p_context_value09,
418 p_context_name10 => p_context_name10,
419 p_context_value10 => p_context_value10,
420 p_context_name11 => p_context_name11,
421 p_context_value11 => p_context_value11,
422 p_context_name12 => p_context_name12,
423 p_context_value12 => p_context_value12,
424 p_context_name13 => p_context_name13,
425 p_context_value13 => p_context_value13,
426 p_context_name14 => p_context_name14,
427 p_context_value14 => p_context_value14,
428
429 p_return_name01 => p_return_name01,
430 p_return_value01 => p_return_value01,
431 p_return_name02 => p_return_name02,
432 p_return_value02 => p_return_value02,
433 p_return_name03 => p_return_name03,
434 p_return_value03 => p_return_value03,
435 p_return_name04 => p_return_name04,
436 p_return_value04 => p_return_value04,
437 p_return_name05 => p_return_name05,
438 p_return_value05 => p_return_value05,
439 p_return_name06 => p_return_name06,
440 p_return_value06 => p_return_value06,
441 p_return_name07 => p_return_name07,
442 p_return_value07 => p_return_value07,
443 p_return_name08 => p_return_name08,
444 p_return_value08 => p_return_value08,
445 p_return_name09 => p_return_name09,
446 p_return_value09 => p_return_value09,
447 p_return_name10 => p_return_name10,
448 p_return_value10 => p_return_value10
449 );
450
451 ff_utils.exit('run_name_formula');
452
453 end run_name_formula;
454
455 -------------------------------- get_output -----------------------------------
456 /*
457 NAME
458 get_output
459 DESCRIPTION
460 Allows access to data returned from Fast Formula return variables.
461 This one function has to be used for all three data types.
462 */
463
464 procedure get_output
465 (
466 p_return_name in varchar2,
467 p_return_value out varchar2
468 ) is
469 begin
470
471 ff_utils.entry('client:get_output (varchar2)');
472
473 -- Call the generic get_output procedure.
474 local_get_output(p_return_name, p_return_value);
475
476 ff_utils.exit('client:get_output (varchar2)');
477
478 end get_output;
479
480 end ff_client_engine;