[Home] [Help]
PACKAGE BODY: APPS.AMS_ACTMETRICS_ENGINE_PVT
Source
1 PACKAGE BODY AMS_ACTMETRICS_ENGINE_PVT AS
2 /* $Header: amsvmrnb.pls 120.5.12000000.2 2007/07/24 03:35:48 batoleti ship $ */
3 --------------------------------------------------------------------------------
4 --
5 -- NAME
6 -- AMS_ActMetrics_Engine_PVT 11.5.10
7 --
8 -- HISTORY
9 -- 27-Mar-2001 huili Created
10 -- 28-Mar-2001 dmvincen added core engine
11 -- 23-Apr-2001 dmvincen Fixed Traverse_one_node to hand data incosistancy.
12 -- 23-Apr-2001 dmvincen Tuned select statements.
13 -- 17-May-2001 dmvincen Patch for 11.5.4.07.
14 -- 21-May-2001 huili fix bugs for calculation for 11.5.4.07
15 -- 22-May-2001 dmvincen Updated for 11.5.4.11 (SUMMARY metrics).
16 -- 07-June-2001 huili Changed to new hierarchy for new version 11.5.5
17 -- 13-June-2001 huili Added bulk update to set the dirty_flag of parent act
18 -- metrics when building the tree
19 -- 10-Jul-2001 dmvincen Removed references to ECAM. No such object type.
20 -- 26-Jul-2001 huili Removed rollup from "Deliverable"s, added debugging info.
21 -- 16-Aug-2001 dmvincen Make sure all functional currencies are the same.
22 -- And totaling currencies is homogeneous.
23 -- 21-Aug-2001 dmvincen Syncronize the transaction currency with the object.
24 -- 21-Aug-2001 dmvincen Do not rollup values of canceled objects unless
25 -- actual values are incurred. BUG# 1868868
26 -- 21-Aug-2001 dmvincen Moved type definitions inside this module. No need
27 -- to expose.
28 -- 18-Oct-2001 dmvincen Fixed logic error for cancelled objects.
29 -- 24-Oct-2001 dmvincen Check for cancelled objects every time.
30 -- 29-Oct-2001 huili Add check for the "show_campaign_flag" while looking up
31 -- parent campaign for 11.5.6.05. For bug #2082639.
32 -- 29-Nov-2001 dmvincen Added Update_History.
33 -- 14-Dec-2001 dmvincen Added delta tracking for history.
34 -- 14-Dec-2001 dmvincen Turned on history tracking.
35 -- 04-Jan-2002 dmvincen Update_history adds new metrics and checks deleted.
36 -- Improved queries for updating history.
37 -- Changed log message for better detail and tracking.
38 -- 09-Jan-2002 dmvincen BUG2175735: Performance improvements.
39 -- 10-Jan-2002 dmvincen BUG2175735: Removed first_rows hint.
40 -- 15-Jan-2002 huili Added the "p_update_history" to the
41 -- "Refresh_Act_Metrics_Engine" module.
42 -- 28-Jan-2002 dmvincen p_update_history flag excepts 'Y' and 'T'.
43 -- 06-Feb-2002 dmvincen BUG2214496: Wrap delta calc with NVL(..,0).
44 -- 08-Mar-2002 dmvincen Added columns to Update_History, description,
45 -- act_metric_date, function_used_by_id,
46 -- arc_function_used_by.
47 -- 28-Mar-2002 dmvincen Added dialog and components.
48 -- 12-Jun-2002 dmvincen BUG2385692: Fixed function update.
49 -- 27-Nov-2002 dmvincen Added refreshing at the object level.
50 -- 11-Dec-2003 dmvincen Added Batch commit.
51 -- 07-Feb-2003 dmvincen BUG2789661: Added NOCOPY.
52 -- 13-Feb-2003 dmvincen BUG2802817: Fixed FORALL array check.
53 -- 03-Mar-2003 dmvincen Handle create actmetric failure, report and ignore.
54 -- 03-Mar-2003 dmvincen Added intermediate commits to not repeat work on failure.
55 -- 11-Mar-2003 dmvincen BUG2832400: Ignore invalid object hierarchy.
56 -- 19-Mar-2003 choang Bug 2853777 - Added DELV to get_object_list.
57 -- 21-May-2003 dmvincen Performance enhancements in calculate this metric.
58 -- 21-May-2003 dmvincen Back port synchronization to 11.5.8.1R.
59 -- 21-Aug-2003 dmvincen Updated variable metric calculations.
60 -- 21-Aug-2003 dmvincen Updated history to include all fields.
61 -- 21-Aug-2003 dmvincen Adding Formula calculation functionality.
62 -- 22-Aug-2003 dmvincen Added APIs for Run_functions, Update_Variable,
63 -- and Update_formulas.
64 -- 22-Aug-2003 dmvincen Added Display Type support.
65 -- 28-Aug-2003 dmvincen BUG3119211 - Removed a first_rows hint.
66 -- 29-Aug-2003 dmvincen BUG3121639: Level counter not set correctly.
67 -- 17-Sep-2003 sunkumar Object level locking introduced in get_object_lists.
68 -- 12-Nov-2003 choang Removed "ams." and fixed p_commit param.
69 -- 14-Nov-2003 dmvincen Setting dirty flag for formulas.
70 -- 14-Nov-2003 dmvincen Purge the formula definition before reloading.
71 -- 25-Nov-2003 dmvincen Check stack under flow on pop formula.
72 -- 25-Nov-2003 dmvincen Always set msg_count for return values.
73 -- 16-Dec-2003 dmvincen BUG3322880: Added ALIST.
74 -- 16-Jan-2004 dmvincen BUG3355479,3192350: Fix to delete history.
75 -- 16-Jan-2004 dmvincen Removed locking, only required when creating metrics.
76 -- 23-Feb-2004 dmvincen BUG3456849: Wrong event to program link.
77 -- 15-Mar-2004 dmvincen BUG3478590: Variable forecast times multi-forecast.
78 -- 02-Apr-2004 dmvincen BUG3551174: Variable actual divide by zero.
79 -- 15-Jun-2004 dmvincen BUG3687608: Initialize run_function arrays.
80 -- 17-Sep-2004 dmvincen BUG3484528: Drive currency with display type.
81 --
82 -- Global variables and constants.
83 --
84 -- Name of the current package.
85 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AMS_ACTMETRICS_ENGINE_PVT';
86 G_MAX_VALUE CONSTANT NUMBER := 3.5E24;
87 G_MAX_DEPTH CONSTANT NUMBER := 50;
88 G_MAX_DIRTY_COUNT CONSTANT NUMBER := 1000000;
89 --G_MSG_COUNT NUMBER := 10000;
90
91 G_BATCH_SIZE number := NVL(FND_PROFILE.value('AMS_BATCH_SIZE'),10000);
92 G_BATCH_PAD NUMBER := 100; -- Never save less than 100 rows.
93
94 G_MARKETING_APP_ID CONSTANT NUMBER := 530;
95
96 -- Calculation types
97 G_ROLLUP CONSTANT VARCHAR2(30) := 'ROLLUP';
98 G_SUMMARY CONSTANT VARCHAR2(30) := 'SUMMARY';
99 G_FUNCTION CONSTANT VARCHAR2(30) := 'FUNCTION';
100 G_FORMULA CONSTANT VARCHAR2(30) := 'FORMULA';
101 G_MANUAL CONSTANT VARCHAR2(30) := 'MANUAL';
102
103 -- Accrual type
104 G_VARIABLE CONSTANT VARCHAR2(30) := 'VARIABLE';
105
106 -- function metric types.
107 G_IS_FUNCTION CONSTANT VARCHAR2(1) := 'Y';
108 G_IS_PROCEDURE CONSTANT VARCHAR2(1) := 'N';
109
110 -- Frozen flag
111 G_NOT_FROZEN CONSTANT VARCHAR2(1) := 'N';
112
113 -- Update history flag
114 G_UPDATE_HISTORY CONSTANT VARCHAR2(1) := 'Y';
115
116 -- Enabled flag
117 G_IS_ENABLED CONSTANT VARCHAR2(1) := 'Y';
118
119 --
120 G_SHOW CONSTANT VARCHAR2(1) := 'Y';
121 G_HIDE CONSTANT VARCHAR2(1) := 'N';
122
123 -- Object Types
124 G_CAMP CONSTANT VARCHAR2(30) := 'CAMP';
125 G_CSCH CONSTANT VARCHAR2(30) := 'CSCH';
126 G_DELV CONSTANT VARCHAR2(30) := 'DELV';
127 G_EVEO CONSTANT VARCHAR2(30) := 'EVEO';
128 G_EVEH CONSTANT VARCHAR2(30) := 'EVEH';
129 G_RCAM CONSTANT VARCHAR2(30) := 'RCAM';
130 G_EONE CONSTANT VARCHAR2(30) := 'EONE';
131 --G_DILG CONSTANT VARCHAR2(30) := 'DILG';
132 --G_AMS_COMP_START CONSTANT VARCHAR2(30) := 'AMS_COMP_START';
133 --G_AMS_COMP_SHOW_WEB_PAGE CONSTANT VARCHAR2(30) := 'AMS_COMP_SHOW_WEB_PAGE';
134 --G_AMS_COMP_END CONSTANT VARCHAR2(30) := 'AMS_COMP_END';
135 G_ALIST CONSTANT VARCHAR2(30) := 'ALIST';
136
137 -- dirty flag
138 G_IS_DIRTY CONSTANT VARCHAR2(1) := 'Y';
139 G_NOT_DIRTY CONSTANT VARCHAR2(1) := 'N';
140 G_SAVED_DIRTY CONSTANT VARCHAR2(1) := 'S'; -- special internal flag.
141
142 -- Value types
143 G_RATIO CONSTANT VARCHAR2(1) := 'R';
144
145 -- Metric category name.
146 G_COST CONSTANT VARCHAR2(10) := 'COST';
147
148 -- Apportioning types.
149 G_ACTUAL CONSTANT VARCHAR2(10) := 'ACTUAL';
150 G_COMMITTED CONSTANT VARCHAR2(10) := 'COMMITTED';
151 G_FORECASTED CONSTANT VARCHAR2(10) := 'FORECASTED';
152
153 -- Metric category ids.
154 G_COST_ID CONSTANT NUMBER := 901;
155 G_REVENUE_ID CONSTANT NUMBER := 902;
156
157 -- Usage types
158 G_CREATED CONSTANT VARCHAR2(10) := 'CREATED';
159 G_USED_BY CONSTANT VARCHAR2(10) := 'USED_BY';
160
161 -- Display Types
162 G_INTEGER CONSTANT VARCHAR2(10) := 'INTEGER';
163 G_PERCENT CONSTANT VARCHAR2(10) := 'PERCENT';
164 G_CURRENCY CONSTANT VARCHAR2(10) := 'CURRENCY';
165
166 -- Formula Types
167 G_POSTFIX CONSTANT VARCHAR2(10) := 'POSTFIX';
168 G_CATEGORY CONSTANT VARCHAR2(10) := 'CATEGORY';
169 G_METRIC CONSTANT VARCHAR2(10) := 'METRIC';
170 G_NUMBER CONSTANT VARCHAR2(10) := 'NUMBER';
171 G_OPERATOR CONSTANT VARCHAR2(10) := 'OPERATOR';
172
173 -- Formula Operators
174 G_PLUS CONSTANT VARCHAR2(30) := 'PLUS';
175 G_MINUS CONSTANT VARCHAR2(30) := 'MINUS';
176 G_TIMES CONSTANT VARCHAR2(30) := 'TIMES';
177 G_DIVIDE CONSTANT VARCHAR2(30) := 'DIVIDE';
178
179 -- Hierarchy level counter starting point.
180 G_LEAF_LEVEL CONSTANT NUMBER := 0;
181
182 -- Object Status
183 G_CANCELLED CONSTANT VARCHAR2(30) := 'CANCELLED';
184
185 AMS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
186 AMS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
187 AMS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
188
189 --
190 -- Start type definition
191 --
192 TYPE act_metric_ids_type IS TABLE
193 OF NUMBER INDEX BY BINARY_INTEGER;
194
195 --
196 -- index is metric_id
197 --
198 /** OBSOLETE
199 TYPE met_info_lookup_type IS RECORD (
200 value_type VARCHAR2(30), -- metric.value_type
201 metric_calculation_type VARCHAR2(30), -- metric.metric_caluclation_type
202 accrual_type VARCHAR2(30), -- metric.accural_type
203 compute_using_function VARCHAR2(4000), -- metric.compute_using_function
204 default_uom_code VARCHAR2(3) -- mertric.default_uom_code
205 );
206
207 TYPE met_info_set_type IS TABLE
208 OF met_info_lookup_type INDEX BY BINARY_INTEGER;
209 ** OBSOLETE **/
210 --
211 --index is the activity metric id
212 --
213 TYPE act_met_ref_rec_type IS RECORD (
214 activity_metric_id NUMBER,
215 metric_id NUMBER,
216 object_version_number NUMBER,
217 metric_uom_code VARCHAR2(3),
218 func_forecast_value NUMBER,
219 func_actual_value NUMBER,
220 func_currency_code VARCHAR2(15),
221 summarize_to_metric NUMBER,
222 rollup_to_metric NUMBER,
223 last_calculated_date DATE,
224 days_since_last_refresh NUMBER,
225 diff_since_last_calc NUMBER,
226 computed_using_function_value NUMBER,
227 activity_metric_origin_id NUMBER,
228 -- variable_value NUMBER,
229 -- forecasted_variable_value NUMBER,
230 trans_currency_code VARCHAR2(15),
231
232 COUNT NUMBER := 0,
233 parent_id NUMBER,
234 -- parent_type CHAR(1),
235 dirty_flag CHAR(1) := G_NOT_DIRTY,
236 orig_actual_value NUMBER,
237 orig_forecast_value NUMBER,
238 trans_actual_value NUMBER,
239 trans_forecast_value NUMBER,
240 depend_act_metric NUMBER,
241 arc_act_metric_used_by VARCHAR2(30),
242 act_metric_used_by_id NUMBER,
243
244 value_type VARCHAR2(30), -- metric.value_type
245 metric_calculation_type VARCHAR2(30), -- metric.metric_caluclation_type
246 accrual_type VARCHAR2(30), -- metric.accural_type
247 compute_using_function VARCHAR2(4000), -- metric.compute_using_function
248 default_uom_code VARCHAR2(3), -- mertric.default_uom_code
249 display_type VARCHAR2(30)
250 );
251
252 TYPE act_met_ref_rec_set_type IS TABLE
253 OF act_met_ref_rec_type INDEX BY BINARY_INTEGER;
254
255 TYPE date_table_type IS TABLE
256 OF DATE INDEX BY BINARY_INTEGER;
257
258 TYPE num_table_type IS TABLE
259 OF NUMBER INDEX BY BINARY_INTEGER;
260
261 TYPE dirty_flag_table_type IS TABLE
262 OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
263
264 TYPE currency_code_table_type IS TABLE
265 OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
266
267 TYPE varchar2_table_type IS TABLE
268 OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
269
270 TYPE char1_table_type IS TABLE
271 OF char(1) INDEX BY BINARY_INTEGER;
272
273 TYPE object_currency_type IS RECORD (
274 obj_id NUMBER,
275 obj_type VARCHAR2(30),
276 currency VARCHAR2(15)
277 );
278 TYPE object_currency_table IS TABLE
279 OF object_currency_type INDEX BY BINARY_INTEGER;
280
281 Empty_object_currency_table object_currency_table;
282
283 TYPE object_detail_type is record (
284 obj_type VARCHAR2(30),
285 obj_id NUMBER,
286 currency VARCHAR2(15),
287 parent_type varchar2(30),
288 parent_id number,
289 cancelled_flag varchar2(1),
290 show_flag varchar2(1)
291 );
292
293 TYPE object_detail_table is table
294 of object_detail_type index by binary_integer;
295 /**
296 TYPE object_list_type is record (
297 obj_type varchar2(30),
298 object_table object_detail_table
299 );
300
301 type object_list_table is table
302 of object_list_type index by binary_integer;
303
304 G_OBJECT_CACHE object_list_table;
305 **/
306 /**
307 G_RCAM_Parents_table num_table_type;
308 G_CSCH_Parents_table num_table_type;
309 G_EVEO_Parents_table num_table_type;
310 G_EVEH_Parents_table num_table_type;
311 G_EONE_Parents_table num_table_type;
312
313 G_CAMP_status_table dirty_flag_table_type;
314 G_CSCH_status_table dirty_flag_table_type;
315 G_EVEO_status_table dirty_flag_table_type;
316 G_EVEH_status_table dirty_flag_table_type;
317 ****/
318
319 type stack_element_type is record(
320 forecasted_value number,
321 actual_value number
322 );
323
324 type stack_element_table is table
325 of stack_element_type index by binary_integer;
326
327 G_STACK stack_element_table;
328
329 --
330 -- End type definition
331 --
332
333
334 -- Start forward declaration
335 -- Forward Declaration for private functions since they are not in specs.
336
337 PROCEDURE write_msg(p_procedure IN VARCHAR2, p_message IN VARCHAR2)
338 IS
339
340 BEGIN
341 Ams_Utility_Pvt.Write_Conc_Log(TO_CHAR(DBMS_UTILITY.get_time)||': '||
342 G_PKG_NAME||'.'||p_procedure||': '||p_message);
343 -- --bms_output.put_line(TO_CHAR(DBMS_UTILITY.get_time)||': '||
344 -- G_PKG_NAME||'.'||p_procedure||': '||p_message);
345 END;
346
347 PROCEDURE write_error(p_procedure IN varchar2)
348 IS
349 l_msg varchar2(4000);
350 BEGIN
351 -- fnd_msg_pub.reset;
352 LOOP
353 l_msg := fnd_msg_pub.get(p_encoded => FND_API.G_FALSE);
354 EXIT WHEN l_msg IS NULL;
358 END;
355 write_msg(p_procedure, 'ERROR: '||l_msg);
356 END LOOP;
357 --fnd_msg_pub.initialize;
359
360 PROCEDURE Check_Create_Rollup_Parents (
361 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
362 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
363 x_return_status OUT NOCOPY VARCHAR2,
364 p_object_list IN object_currency_table := Empty_object_currency_table
365 );
366
367 PROCEDURE Check_Cr_Roll_Par_Helper (
368 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
369 p_metric_parent_id IN NUMBER,
370 p_act_metric_id IN NUMBER,
371 p_obj_id IN NUMBER,
372 p_obj_type IN VARCHAR2,
373 x_act_metric_parents IN OUT NOCOPY act_metric_ids_type,
374 x_act_metrics IN OUT NOCOPY act_metric_ids_type,
375 p_depth IN NUMBER := 0,
376 x_creates IN OUT NOCOPY NUMBER,
377
378 x_act_metric_id OUT NOCOPY NUMBER, -- Id of the activity metric created
379 x_return_status OUT NOCOPY VARCHAR2,
380 p_commit IN VARCHAR2 := FND_API.G_FALSE
381 );
382
383
384 --FUNCTION Exec_Function (
385 -- p_activity_metric_id IN NUMBER,
386 -- p_function_name IN VARCHAR2
387 --) RETURN NUMBER;
388
389
390 PROCEDURE Get_Met_Apport_Val(
391 p_obj_association_id IN NUMBER,
392 x_return_status OUT NOCOPY VARCHAR2,
393 x_apportioned_value OUT NOCOPY NUMBER
394 );
395
396 PROCEDURE GetMetCatVal (
397 x_return_status OUT NOCOPY VARCHAR2,
398 p_arc_act_metric_used_by IN VARCHAR2,
399 p_act_metric_used_by_id IN NUMBER,
400 p_metric_category IN VARCHAR2,
401 p_return_type IN VARCHAR2,
402 x_value OUT NOCOPY NUMBER
403 );
404
405 FUNCTION Convert_Uom(
406 p_from_uom_code IN VARCHAR2,
407 p_to_uom_code IN VARCHAR2,
408 p_from_quantity IN NUMBER,
409 p_precision IN NUMBER DEFAULT NULL,
410 p_from_uom_name IN VARCHAR2 DEFAULT NULL,
411 p_to_uom_name IN VARCHAR2 DEFAULT NULL
412 )
413 RETURN NUMBER;
414
415 PROCEDURE check_object_status(
416 p_arc_act_metric_used_by IN VARCHAR2,
417 p_act_metric_used_by_id IN NUMBER,
418 x_is_canceled OUT NOCOPY VARCHAR2
419 );
420
421 PROCEDURE Get_Object_List(p_arc_act_metric_used_by varchar2,
422 p_act_metric_used_by_id number,
423 x_return_status OUT NOCOPY VARCHAR2,
424 x_msg_count OUT NOCOPY NUMBER,
425 x_msg_data OUT NOCOPY VARCHAR2,
426 x_object_list OUT NOCOPY object_currency_table
427 );
428
429 PROCEDURE Run_Functions
430 (x_errbuf OUT NOCOPY VARCHAR2,
431 x_retcode OUT NOCOPY NUMBER,
432 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
433 p_object_list IN object_currency_table := Empty_object_currency_table,
434 p_current_date IN date,
435 p_func_currency IN varchar2
436 );
437
438 PROCEDURE UPDATE_VARIABLE
439 (x_errbuf OUT NOCOPY VARCHAR2,
440 x_retcode OUT NOCOPY NUMBER,
441 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
442 p_object_list IN object_currency_table := Empty_object_currency_table,
443 p_current_date IN date,
444 p_func_currency IN varchar2
445 );
446
447 PROCEDURE Update_formulas(
448 x_errbuf OUT NOCOPY VARCHAR2,
449 x_retcode OUT NOCOPY NUMBER,
450 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
451 p_object_list IN object_currency_table := Empty_object_currency_table,
452 p_current_date IN date,
453 p_func_currency IN varchar2
454 );
455
456 PROCEDURE Clear_Cache;
457
458 FUNCTION get_object_details(p_object_type varchar2, p_object_id number)
459 return object_detail_type;
460
461 procedure get_parent_object(p_obj_type varchar2, p_obj_id number,
462 x_parent_obj_type out nocopy varchar2, x_parent_obj_id out nocopy number,
463 x_show_flag out nocopy varchar2);
464
465 -- End forward declaration
466
467 -- For Debugging only.
468 -- NAME
469 -- Show_Table
470 --
471 -- PURPOSE
472 -- Display the contents of the activity metric rollup table and the
473 -- metric definition table.
474 --
475 -- NOTES
476 --
477 -- HISTORY
478 -- 03/26/2001 huili Created.
479 --
480 PROCEDURE Show_Table (
481 p_dirty_table IN act_met_ref_rec_set_type --,
482 -- p_metric_info IN met_info_set_type
483 )
484 IS
485 l_index NUMBER;
486 BEGIN
487 write_msg('Show_Table','The content OF the dirty act_met TABLE IS:');
488 l_index := p_dirty_table.FIRST;
489 LOOP
490 EXIT WHEN l_index IS NULL;
491 write_msg('Show_Table',
492 'Act_Met_id:' || l_index
493 --|| ' COUNT:' || p_dirty_table(l_index).COUNT
494 || ' parent_id:' || p_dirty_table(l_index).parent_id
495 || ' dirty_flag:' || p_dirty_table(l_index).dirty_flag
496 || ' metric_id:' || p_dirty_table(l_index).metric_id
497 --|| ' obj_ver_num:' || p_dirty_table(l_index).object_version_number
498 --|| ' met_uom_code:' || p_dirty_table(l_index).metric_uom_code
502 --|| ' func_curr_code:' || p_dirty_table(l_index).func_currency_code
499 || ' f_for_value:' || p_dirty_table(l_index).func_forecast_value);
500 write_msg('Show_Table',
501 ' f_act_value:' || p_dirty_table(l_index).func_actual_value
503
504 --|| ' l_cal_date:' || p_dirty_table(l_index).last_calculated_date
505 --|| ' day_lst_fresh:' ||p_dirty_table(l_index).days_since_last_refresh
506 --|| ' diff:' || p_dirty_table(l_index).diff_since_last_calc
507 --|| ' o_act_val:' || p_dirty_table(l_index).orig_actual_value
508 || ' o_for_val:' || p_dirty_table(l_index).orig_forecast_value
509
510 || ' comp_us_func_value:'
511 || p_dirty_table(l_index).computed_using_function_value);
512 write_msg('Show_Table',
513 ' act_met_or_id:' || p_dirty_table(l_index).activity_metric_origin_id
514 --|| ' var_val:' || p_dirty_table(l_index).variable_value
515 --|| ' tr_cur_code:' || p_dirty_table(l_index).trans_currency_code
516 --|| ' tr_act_val:' || p_dirty_table(l_index).trans_actual_value
517 --|| ' tr_for_val:' || p_dirty_table(l_index).trans_forecast_value
518 );
519 l_index := p_dirty_table.NEXT(l_index);
520 END LOOP;
521 write_msg('Show_Table','Finish the act metric!');
522 /**
523 write_msg('Show_Table','The content OF the metrics info TABLE IS:');
524 l_index := p_metric_info.FIRST;
525 LOOP
526 EXIT WHEN l_index IS NULL;
527 write_msg('Show_Table','Metric_id:' || l_index || ' value_type:'
528 || p_metric_info(l_index).value_type
529 || ' met_cal_type:' || p_metric_info(l_index).metric_calculation_type
530 || ' ac_type:' || p_metric_info(l_index).accrual_type
531
532 || ' comp_func:' || p_metric_info(l_index).compute_using_function
533
534 || ' def_uom_code:' || p_metric_info(l_index).default_uom_code);
535
536
537 l_index := p_metric_info.NEXT(l_index);
538 END LOOP;
539 write_msg('Show_Table','Finish the metric');
540 **/
541 END Show_Table;
542
543 PROCEDURE Clear_Cache
544 is
545 begin
546 --G_OBJECT_CACHE.delete;
547 null;
548 /**
549 G_RCAM_Parents_table.delete;
550 G_CSCH_Parents_table.delete;
551 G_EVEO_Parents_table.delete;
552 G_EVEH_Parents_table.delete;
553 G_EONE_Parents_table.delete;
554
555 G_FORECASTED_STACK.delete;
556 G_ACTUAL_STACK.delete;
557
558 G_CAMP_status_table.delete;
559 G_CSCH_status_table.delete;
560 G_EVEO_status_table.delete;
561 G_EVEH_status_table.delete;
562 **/
563 end clear_cache;
564
565 -- NAME
566 -- Build_Refresh_Act_Metrics
567 --
568 -- PURPOSE
569 -- The procedure does the following:
570 -- 1. Select all the activity metrics with the dirty flag set;
571 -- 2. For each activity metric in the above set, traverse the heirarchy
572 -- all the way up until the root node. Add each visited node to the table
573 -- and record the times this node gets visited;
574 -- 3. Also record the parent node for each node to prevent database hit
575 -- every time.
576 --
577 -- NOTES
578 --
579 -- HISTORY
580 -- 03/26/2001 huili Created.
581 --
582 PROCEDURE Build_Refresh_Act_Metrics (
583
584 x_dirty_act_metric_table IN OUT NOCOPY act_met_ref_rec_set_type,
585 x_max_count IN OUT NOCOPY NUMBER,
586 p_calc_type IN VARCHAR2,
587
588 x_return_status IN OUT NOCOPY VARCHAR2,
589 p_object_list IN object_currency_table := Empty_object_currency_table
590 )
591 IS
592 --
593 -- Standard API information constants.
594 --
595 L_API_VERSION CONSTANT NUMBER := 1.0;
596 L_API_NAME CONSTANT VARCHAR2(30) := 'BUILD_REFRESH_ACT_METRICS';
597 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| L_API_NAME;
598
599 l_dirty_act_metric_id NUMBER;
600 l_table_ite NUMBER;
601
602 --l_temp_act_metric_table act_met_ref_rec_set_type;
603 l_temp_act_metric_record act_met_ref_rec_type;
604
605 --select all activity metrics with dirty bit set
606 -- 06/22/2001 huili changed
607 CURSOR c_all_dirty_act_metrics(l_calc_type VARCHAR2)
608 return act_met_ref_rec_type IS
609 SELECT --/*+ first_rows */
610 activity_metric_id, a.metric_id, a.object_version_number,
611 metric_uom_code, func_forecasted_value, func_actual_value,
612 functional_currency_code, summarize_to_metric, rollup_to_metric,
613 last_calculated_date, days_since_last_refresh,
614 difference_since_last_calc, computed_using_function_value,
615 activity_metric_origin_id,
616 --variable_value, forecasted_variable_value,
617 transaction_currency_code,
618 G_LEAF_LEVEL, DECODE(l_calc_type,G_ROLLUP,rollup_to_metric,summarize_to_metric),
619 --NULL,
620 dirty_flag,
621 func_actual_value orig_actual_value,
622 func_forecasted_value orig_forecasted_value,
623 trans_actual_value, trans_forecasted_value, depend_act_metric,
624 arc_act_metric_used_by, act_metric_used_by_id,
625 value_type ,
629 default_uom_code, display_type
626 metric_calculation_type ,
627 accrual_type ,
628 compute_using_function ,
630 FROM ams_act_metrics_all a, ams_metrics_all_b b
631 WHERE arc_act_metric_used_by IN
632 (select lookup_code from ams_lookups
633 where lookup_type in ('AMS_METRIC_OBJECT_TYPE', 'AMS_METRIC_ROLLUP_TYPE'))
634 -- Replaced with metadata lookups above.
635 --(G_CAMP, G_CSCH, G_DELV, G_EVEO, G_EVEH, G_RCAM, G_EONE)
636 --BUG2845365: Removed dialogue components.
637 --G_DILG, G_AMS_COMP_START, G_AMS_COMP_SHOW_WEB_PAGE, G_AMS_COMP_END)
638 AND dirty_flag = G_IS_DIRTY
639 AND a.metric_id = b.metric_id
640 AND b.metric_calculation_type = l_calc_type;
641
642 CURSOR c_dirty_act_metrics_by_obj(l_calc_type VARCHAR2,
643 l_object_type varchar2, l_object_id number)
644 return act_met_ref_rec_type IS
645 SELECT
646 activity_metric_id, a.metric_id, a.object_version_number,
647 metric_uom_code, func_forecasted_value, func_actual_value,
648 functional_currency_code, summarize_to_metric, rollup_to_metric,
649 last_calculated_date, days_since_last_refresh,
650 difference_since_last_calc, computed_using_function_value,
651 activity_metric_origin_id,
652 -- variable_value, forecasted_variable_value,
653 transaction_currency_code,
654 G_LEAF_LEVEL, DECODE(l_calc_type,G_ROLLUP,rollup_to_metric,summarize_to_metric),
655 --NULL,
656 dirty_flag,
657 func_actual_value orig_actual_value,
658 func_forecasted_value orig_forecasted_value,
659 trans_actual_value, trans_forecasted_value, depend_act_metric,
660 arc_act_metric_used_by, act_metric_used_by_id,
661 value_type ,
662 metric_calculation_type ,
663 accrual_type ,
664 compute_using_function ,
665 default_uom_code, display_type
666 FROM ams_act_metrics_all a, ams_metrics_all_b b
667 WHERE dirty_flag = G_IS_DIRTY
668 AND a.metric_id = b.metric_id
669 AND b.metric_calculation_type = l_calc_type
670 AND a.arc_act_metric_used_by = l_object_type
671 AND a.act_metric_used_by_id = l_object_id;
672
673 l_act_metric_id NUMBER;
674 l_metric_id NUMBER;
675 l_traversed_table act_metric_ids_type;
676 l_trav_table_count NUMBER := 0;
677 l_count NUMBER := 0;
678 l_obj_index NUMBER := 0;
679
680 l_parent_id NUMBER;
681
682 --select one parent activity metrics
683 CURSOR c_act_metric (l_parent_act_metric_id NUMBER)
684 return act_met_ref_rec_type IS
685 SELECT activity_metric_id, a.metric_id, a.object_version_number,
686 metric_uom_code, func_forecasted_value, func_actual_value,
687 functional_currency_code, summarize_to_metric, rollup_to_metric,
688 last_calculated_date, days_since_last_refresh,
689 difference_since_last_calc, computed_using_function_value,
690 activity_metric_origin_id,
691 -- variable_value, forecasted_variable_value,
692 transaction_currency_code,
693 G_LEAF_LEVEL, DECODE(metric_calculation_type,G_ROLLUP,rollup_to_metric,summarize_to_metric),
694 --NULL,
695 dirty_flag,
696 func_actual_value orig_actual_value,
697 func_forecasted_value orig_forecasted_value,
698 trans_actual_value, trans_forecasted_value, depend_act_metric,
699 arc_act_metric_used_by, act_metric_used_by_id,
700 value_type ,
701 metric_calculation_type ,
702 accrual_type ,
703 compute_using_function ,
704 default_uom_code, display_type
705 FROM ams_act_metrics_all a, ams_metrics_all_b b
706 WHERE activity_metric_id = l_parent_act_metric_id
707 AND a.metric_id = b.metric_id;
708
709 l_act_metric_rec act_met_ref_rec_type;--c_act_metric_rec%ROWTYPE;
710 -- l_parent_type CHAR(1);
711 l_used_actmet_ids act_metric_ids_type;
712 l_depth NUMBER := 0;
713 /*****
714 l_activity_metric_ids num_table_type;
715 l_metric_ids num_table_type;
716 l_object_version_numbers num_table_type;
717 l_metric_uom_codes varchar2_table_type;
718 l_func_forecast_values num_table_type;
719 l_func_actual_values num_table_type;
720 l_func_currency_codes varchar2_table_type;
721 l_summarize_to_metrics num_table_type;
722 l_rollup_to_metrics num_table_type;
723 l_last_calculated_dates date_table_type;
724 l_days_since_last_refreshs num_table_type;
725 l_diff_since_last_calcs num_table_type;
726 l_computed_using_func_values num_table_type;
727 l_activity_metric_origin_ids num_table_type;
728 -- l_variable_values num_table_type;
729 -- l_forecasted_variable_values num_table_type;
730 l_trans_currency_codes varchar2_table_type;
731
732 l_COUNTs num_table_type;
733 l_parent_ids num_table_type;
734 -- l_parent_types char1_table_type;
735 l_dirty_flags char1_table_type;
736 l_orig_actual_values num_table_type;
737 l_orig_forecast_values num_table_type;
738 l_trans_actual_values num_table_type;
739 l_trans_forecast_values num_table_type;
740 l_depend_act_metrics num_table_type;
741 l_arc_act_metric_used_bys varchar2_table_type;
742 l_act_metric_used_by_ids num_table_type;
743
744 l_value_types varchar2_table_type;
748 l_default_uom_codes varchar2_table_type;
745 l_metric_calculation_types varchar2_table_type;
746 l_accrual_types varchar2_table_type;
747 l_compute_using_functions varchar2_table_type;
749 l_display_types varchar2_table_type;
750 ***/
751 BEGIN
752
753 IF AMS_DEBUG_HIGH_ON THEN
754 write_msg(L_API_NAME,'START: '||p_calc_type);
755 END IF;
756 --
757 --Phase 1, we build the table based on all dirty records
758 --
759 l_obj_index := 0;
760 LOOP
761 IF p_object_list.count > l_obj_index THEN
762 l_obj_index := l_obj_index + 1;
763 OPEN c_dirty_act_metrics_by_obj(p_calc_type,
764 p_object_list(l_obj_index).obj_type,p_object_list(l_obj_index).obj_id);
765 --FETCH c_dirty_act_metrics_by_obj BULK COLLECT INTO
766 -- l_temp_act_metric_table;
767 LOOP
768 FETCH c_dirty_act_metrics_by_obj into l_temp_act_metric_record;
769 exit when c_dirty_act_metrics_by_obj%NOTFOUND;
770 l_act_metric_id := l_temp_act_metric_record.activity_metric_id;
771 x_dirty_act_metric_table(l_act_metric_id) := l_temp_act_metric_record;
772 l_trav_table_count := l_traversed_table.COUNT+1;
773 l_traversed_table (l_trav_table_count) := l_act_metric_id;
774 END LOOP;
775 /**
776 l_activity_metric_ids,
777 l_metric_ids,
778 l_object_version_numbers ,
779 l_metric_uom_codes ,
780 l_func_forecast_values ,
781 l_func_actual_values ,
782 l_func_currency_codes ,
783 l_summarize_to_metrics ,
784 l_rollup_to_metrics ,
785 l_last_calculated_dates ,
786 l_days_since_last_refreshs ,
787 l_diff_since_last_calcs ,
788 l_computed_using_func_values ,
789 l_activity_metric_origin_ids ,
790 -- l_variable_values ,
791 -- l_forecast_variable_values,
792 l_trans_currency_codes ,
793
794 l_COUNTs ,
795 l_parent_ids ,
796 -- l_parent_types ,
797 l_dirty_flags ,
798 l_orig_actual_values ,
799 l_orig_forecast_values ,
800 l_trans_actual_values ,
801 l_trans_forecast_values ,
802 l_depend_act_metrics ,
803 l_arc_act_metric_used_bys ,
804 l_act_metric_used_by_ids ,
805
806 l_value_types ,
807 l_metric_calculation_types ,
808 l_accrual_types ,
809 l_compute_using_functions ,
810 l_default_uom_codes,
811 l_display_types ;
812 **/
813 CLOSE c_dirty_act_metrics_by_obj;
814 ELSIF p_object_list.count = 0 THEN
815 OPEN c_all_dirty_act_metrics(p_calc_type);
816 --fetch c_all_dirty_act_metrics bulk collect into
817 -- l_temp_act_metric_table;
818 LOOP
819 FETCH c_all_dirty_act_metrics into l_temp_act_metric_record;
820 exit when c_all_dirty_act_metrics%NOTFOUND;
821 l_act_metric_id := l_temp_act_metric_record.activity_metric_id;
822 x_dirty_act_metric_table(l_act_metric_id) := l_temp_act_metric_record;
823 l_trav_table_count := l_traversed_table.COUNT+1;
824 l_traversed_table (l_trav_table_count) := l_act_metric_id;
825 END LOOP;
826 /**
827 FETCH c_all_dirty_act_metrics BULK COLLECT INTO
828 l_activity_metric_ids,
829 l_metric_ids,
830 l_object_version_numbers ,
831 l_metric_uom_codes ,
832 l_func_forecast_values ,
833 l_func_actual_values ,
834 l_func_currency_codes ,
835 l_summarize_to_metrics ,
836 l_rollup_to_metrics ,
837 l_last_calculated_dates ,
838 l_days_since_last_refreshs ,
839 l_diff_since_last_calcs ,
840 l_computed_using_func_values ,
841 l_activity_metric_origin_ids ,
842 -- l_variable_values ,
843 -- l_forecast_variable_values,
844 l_trans_currency_codes ,
845
846 l_COUNTs ,
847 l_parent_ids ,
848 -- l_parent_types ,
849 l_dirty_flags ,
850 l_orig_actual_values ,
851 l_orig_forecast_values ,
852 l_trans_actual_values ,
853 l_trans_forecast_values ,
854 l_depend_act_metrics ,
855 l_arc_act_metric_used_bys ,
856 l_act_metric_used_by_ids ,
857
858 l_value_types ,
859 l_metric_calculation_types ,
860 l_accrual_types ,
861 l_compute_using_functions ,
862 l_default_uom_codes,
863 l_display_types ;
864 ****/
865 CLOSE c_all_dirty_act_metrics;
866 END IF;
867 /***
868 IF l_activity_metric_ids.count > 0 THEN
869 FOR l_amet_index IN l_activity_metric_ids.first..l_activity_metric_ids.last
870 ****/
871 /***
872 IF l_temp_act_metric_table.count > 0 then
873 FOR l_amet_index in l_temp_act_metric_table.first..l_temp_act_metric_table.last
874 LOOP
875
876 l_act_metric_id := l_temp_act_metric_table(l_amet_index).activity_metric_id;
877 x_dirty_act_metric_table(l_act_metric_id) := l_temp_act_metric_table(l_amet_index);
878 ***/
879 /**
883 x_dirty_act_metric_table(l_act_metric_id).metric_id := l_metric_ids (l_amet_index);
880 l_act_metric_id := l_activity_metric_ids(l_amet_index);
881
882 x_dirty_act_metric_table(l_act_metric_id).activity_metric_id := l_act_metric_id;
884 x_dirty_act_metric_table(l_act_metric_id).object_version_number := l_object_version_numbers (l_amet_index);
885 x_dirty_act_metric_table(l_act_metric_id).metric_uom_code := l_metric_uom_codes (l_amet_index);
886 x_dirty_act_metric_table(l_act_metric_id).func_forecast_value := l_func_forecast_values (l_amet_index);
887 x_dirty_act_metric_table(l_act_metric_id).func_actual_value := l_func_actual_values (l_amet_index);
888 x_dirty_act_metric_table(l_act_metric_id).func_currency_code := l_func_currency_codes (l_amet_index);
889 x_dirty_act_metric_table(l_act_metric_id).summarize_to_metric := l_summarize_to_metrics (l_amet_index);
890 x_dirty_act_metric_table(l_act_metric_id).rollup_to_metric := l_rollup_to_metrics (l_amet_index);
891 x_dirty_act_metric_table(l_act_metric_id).last_calculated_date := l_last_calculated_dates (l_amet_index);
892 x_dirty_act_metric_table(l_act_metric_id).days_since_last_refresh := l_days_since_last_refreshs (l_amet_index);
893 x_dirty_act_metric_table(l_act_metric_id).diff_since_last_calc := l_diff_since_last_calcs (l_amet_index);
894 x_dirty_act_metric_table(l_act_metric_id).computed_using_function_value := l_computed_using_func_values (l_amet_index);
895 x_dirty_act_metric_table(l_act_metric_id).activity_metric_origin_id := l_activity_metric_origin_ids (l_amet_index);
896 -- x_dirty_act_metric_table(l_act_metric_id).variable_value := l_variable_values (l_amet_index);
897 -- x_dirty_act_metric_table(l_act_metric_id).forecasted_variable_value := l_forecasted_variable_values (l_amet_index);
898 x_dirty_act_metric_table(l_act_metric_id).trans_currency_code := l_trans_currency_codes (l_amet_index);
899
900 x_dirty_act_metric_table(l_act_metric_id).COUNT := l_COUNTs (l_amet_index);
901 x_dirty_act_metric_table(l_act_metric_id).parent_id := l_parent_ids (l_amet_index);
902 -- x_dirty_act_metric_table(l_act_metric_id).parent_type := l_parent_types (l_amet_index);
903 x_dirty_act_metric_table(l_act_metric_id).dirty_flag := l_dirty_flags (l_amet_index);
904 x_dirty_act_metric_table(l_act_metric_id).orig_actual_value := l_orig_actual_values (l_amet_index);
905 x_dirty_act_metric_table(l_act_metric_id).orig_forecast_value := l_orig_forecast_values (l_amet_index);
906 x_dirty_act_metric_table(l_act_metric_id).trans_actual_value := l_trans_actual_values (l_amet_index);
907 x_dirty_act_metric_table(l_act_metric_id).trans_forecast_value := l_trans_forecast_values (l_amet_index);
908 x_dirty_act_metric_table(l_act_metric_id).depend_act_metric := l_depend_act_metrics (l_amet_index);
909 x_dirty_act_metric_table(l_act_metric_id).arc_act_metric_used_by := l_arc_act_metric_used_bys (l_amet_index);
910 x_dirty_act_metric_table(l_act_metric_id).act_metric_used_by_id := l_act_metric_used_by_ids (l_amet_index);
911
912 x_dirty_act_metric_table(l_act_metric_id).value_type := l_value_types (l_amet_index);
913 x_dirty_act_metric_table(l_act_metric_id).metric_calculation_type := l_metric_calculation_types (l_amet_index);
914 x_dirty_act_metric_table(l_act_metric_id).accrual_type := l_accrual_types (l_amet_index);
915 x_dirty_act_metric_table(l_act_metric_id).compute_using_function := l_compute_using_functions (l_amet_index);
916 x_dirty_act_metric_table(l_act_metric_id).default_uom_code := l_default_uom_codes (l_amet_index);
917 x_dirty_act_metric_table(l_act_metric_id).display_type := l_display_types (l_amet_index);
918 ****/
919 /***
920 l_trav_table_count := l_traversed_table.COUNT+1;
921 l_traversed_table (l_trav_table_count) := l_act_metric_id;
922 END LOOP;
923 END IF;
924 ***/
925 EXIT WHEN p_object_list.count <= l_obj_index;
926 END LOOP;
927
928 --
929 --Phase 2, we go through each record in the above table, traverse the
930 --whole tree starting from that node and calculate the count number properly.
931 --
932 x_max_count := G_LEAF_LEVEL;
933 l_table_ite := l_traversed_table.FIRST;
934 LOOP
935 EXIT WHEN l_table_ite IS NULL;
936 IF x_dirty_act_metric_table.COUNT > G_MAX_DIRTY_COUNT THEN
937 write_msg(l_api_name,'Maximum dirty activity metrics limit reached ('
938 ||G_MAX_DIRTY_COUNT||'). Cannot continue.');
939 EXIT;
940 END IF;
941 --
942 --We need to traverse this node
943 --
944 l_parent_id := l_traversed_table(l_table_ite);
945 -- Only traverse if this node has not previously been traversed.
946 IF x_dirty_act_metric_table(l_parent_id).dirty_flag = G_IS_DIRTY THEN
947 l_depth := 0;
948 LOOP
949 l_depth := l_depth +1;
950 IF l_depth > 500 THEN
951 --write_msg('Too deep FOR me');
952 EXIT;
953 END IF;
954 l_act_metric_id := l_parent_id;
955 l_parent_id := x_dirty_act_metric_table (l_act_metric_id).parent_id;
956 EXIT WHEN l_parent_id IS NULL;
957 -- If this node has been traversed then there are circular links.
958 IF l_used_actmet_ids.EXISTS(l_parent_id) THEN
959 x_dirty_act_metric_table(l_act_metric_id).parent_id := NULL;
960 EXIT;
961 ELSE
962 l_used_actmet_ids(l_parent_id) := l_parent_id;
963 END IF;
964 --
965 --if parent id is there, need to traverse parent
966 --
967 --
968 -- if parent is in the memory table, need to adjust the traversal count
969 -- and set the dirty flag to G_NOT_DIRTY
970 --
971 IF x_dirty_act_metric_table.EXISTS(l_parent_id) THEN
972 -- If the parent's count is greater than it has been traversed,
973 -- and its count is correct. No need to continue up the hierarchy.
974 EXIT WHEN x_dirty_act_metric_table(l_act_metric_id).COUNT <
975 x_dirty_act_metric_table(l_parent_id).COUNT;
976 -- The parent must be calculated after all the children.
977 -- The parent count must be at one greater than the maximum
978 -- of all the children to be calculated in the correct order.
979 x_dirty_act_metric_table(l_parent_id).COUNT
980 := x_dirty_act_metric_table(l_act_metric_id).COUNT + 1;
981 -- Set max_count to determine the iterations through the dirty list
982 -- to complete all calculations.
983 IF x_max_count < x_dirty_act_metric_table(l_parent_id).COUNT THEN
984 x_max_count := x_dirty_act_metric_table(l_parent_id).COUNT;
985 END IF;
986 -- Only leaf nodes are flagged as dirty to identify the starting
987 -- point of the calculations.
988 x_dirty_act_metric_table(l_parent_id).dirty_flag := G_NOT_DIRTY;
989
990 --
991 --otherwise, need to grab one from DB
992 --
993 ELSE
994 OPEN c_act_metric (l_parent_id);
995 FETCH c_act_metric INTO l_act_metric_rec;
996 IF c_act_metric%FOUND THEN
997 x_dirty_act_metric_table(l_parent_id) := l_act_metric_rec;
998 x_dirty_act_metric_table(l_parent_id).COUNT
999 := x_dirty_act_metric_table(l_act_metric_id).COUNT + 1;
1000 x_dirty_act_metric_table(l_parent_id).dirty_flag := G_NOT_DIRTY;
1001 -- BUG3121639: Failed to increment counter correctly.
1002 -- Set max_count to determine the iterations through the dirty
1003 -- list to complete all calculations.
1004 IF x_max_count < x_dirty_act_metric_table(l_parent_id).COUNT THEN
1005 x_max_count := x_dirty_act_metric_table(l_parent_id).COUNT;
1006 END IF;
1007 ELSE
1008 -- Database incosistancy. The parent ID is invalid.
1009 -- Reset the parent and stop traversing.
1010 x_dirty_act_metric_table (l_act_metric_id).parent_id := NULL;
1011 CLOSE c_act_metric;
1012 EXIT;
1013 END IF;
1014 CLOSE c_act_metric;
1015 END IF;
1016
1017 -- x_dirty_act_metric_table(l_parent_id).parent_type := l_parent_type;
1018
1019 END LOOP;
1020 l_used_actmet_ids.DELETE;
1021 END IF; -- x_dirty_act_metric_table(l_parent_id).dirty_flag = G_DIRTY
1022 l_table_ite := l_traversed_table.NEXT (l_table_ite);
1023 END LOOP;
1024
1025 IF AMS_DEBUG_HIGH_ON THEN
1026 write_msg(L_API_NAME,'END: '||p_calc_type||': COUNT='||x_dirty_act_metric_table.COUNT);
1027 END IF;
1028 END Build_Refresh_Act_Metrics;
1029
1030 -- NAME
1031 -- Calculate_This_Metric
1032 --
1033 -- PURPOSE
1034 --
1035 --
1036 -- ALGORITHM
1037 -- With the list of all dirty metrics iterate through to find all the
1041 --
1038 -- nodes at the current level and a dirty flag set. Once no dirty
1039 -- flags are found at this level, increment to the next level and
1040 -- repeat. End when all levels have expired.
1042 -- NOTES
1043 --
1044 -- HISTORY
1045 -- 03/26/2001 dmvincen Created
1046 -- 08/17/2001 dmvincen Added check for currency consistancy.
1047 -- 08/17/2001 dmvincen Added check for canceled business objects.
1048 -- 08/27/2001 huili Added bulk collection to find all summary and rollup children.
1049 --
1050 PROCEDURE Calculate_This_Metric(
1051 x_dirty_actmets IN OUT NOCOPY act_met_ref_rec_set_type,
1052 p_max_level IN NUMBER,
1053 p_calc_type IN VARCHAR2,
1054 x_return_status OUT NOCOPY VARCHAR2,
1055 p_default_currency IN VARCHAR2
1056 )
1057 IS
1058 TYPE t_actmet_id IS TABLE OF ams_act_metrics_all.activity_metric_id%TYPE;
1059 TYPE t_value IS TABLE OF ams_act_metrics_all.FUNC_ACTUAL_VALUE%TYPE;
1060 TYPE t_curr IS TABLE OF ams_act_metrics_all.FUNCTIONAL_CURRENCY_CODE%TYPE;
1061 TYPE t_uom IS TABLE OF ams_act_metrics_all.METRIC_UOM_CODE%TYPE;
1062 TYPE t_objtype IS TABLE OF ams_act_metrics_all.ARC_ACT_METRIC_USED_BY%TYPE;
1063 TYPE t_objid IS TABLE OF ams_act_metrics_all.ACT_METRIC_USED_BY_ID%TYPE;
1064
1065 l_activity_metric_ids t_actmet_id;
1066 l_func_forecasted_values t_value;
1067 l_func_actual_values t_value;
1068 l_functional_currency_codes t_curr;
1069 l_metric_uom_codes t_uom;
1070 l_arc_act_metric_used_bys t_objtype;
1071 l_act_metric_used_by_ids t_objid;
1072
1073 CURSOR c_check_assoc_metric(l_metric_id NUMBER) IS
1074 SELECT COUNT(1)
1075 FROM ams_metric_accruals
1076 WHERE metric_id = l_metric_id;
1077
1078 l_flag NUMBER;
1079
1080 l_comp_actual_value NUMBER := 0;
1081 l_trans_actual_value NUMBER := 0;
1082 l_func_actual_value NUMBER := 0;
1083 l_func_forecast_value NUMBER := 0;
1084 l_final_actual_value NUMBER := 0;
1085 l_final_forecast_value NUMBER := 0;
1086 l_conv_uom_actual_value NUMBER := 0;
1087 l_conv_uom_forecast_value NUMBER := 0;
1088 l_parent_id NUMBER;
1089 l_child_count NUMBER := 0;
1090 l_current_date DATE := SYSDATE;
1091 l_metric_id NUMBER;
1092 l_id NUMBER;
1093 l_id_outside NUMBER;
1094 l_level NUMBER := G_LEAF_LEVEL-1;
1095 l_return_status VARCHAR2(1);
1096 l_arc_act_metric_used_by VARCHAR2(30);
1097 l_act_metric_used_by_id NUMBER;
1098 l_is_canceled VARCHAR2(1);
1099 l_func_currency_code VARCHAR2(15);
1100 l_child_id NUMBER;
1101 l_metric_uom_code VARCHAR2(3);
1102 l_default_uom_code VARCHAR2(3);
1103 l_metric_calc_type VARCHAR2(30);
1104 l_hits NUMBER := 0;
1105 l_tests NUMBER := 0;
1106 /**
1107 l_CAMP_status_table dirty_flag_table_type;
1108 l_CSCH_status_table dirty_flag_table_type;
1109 l_EVEO_status_table dirty_flag_table_type;
1110 l_EVEH_status_table dirty_flag_table_type;
1111 **/
1112 l_act_metric_id_levels num_table_type;
1113
1114 BEGIN
1115
1116 IF AMS_DEBUG_HIGH_ON THEN
1117 write_msg('Calculate_This_Metric', 'START: '||p_calc_type
1118 ||', max_level='||p_max_level
1119 ||', dirty_count='||x_dirty_actmets.count);
1120 END IF;
1121
1122 -- Load first level and dirty metrics to short list.
1123 l_id := x_dirty_actmets.FIRST;
1124 LOOP
1125 exit when l_id is null;
1126 if x_dirty_actmets(l_id).COUNT = 0 AND
1127 x_dirty_actmets(l_id).dirty_flag = 'Y' then
1128 l_act_metric_id_levels(l_id) := 0;
1129 end if;
1130 l_id := x_dirty_actmets.next(l_id);
1131 END LOOP;
1132
1133 LOOP
1134
1135 IF l_id_outside IS NULL THEN -- At the end of the list.
1136 l_level := l_level + 1;
1137 EXIT WHEN l_level > p_max_level; -- All levels have expired.
1138 --l_id_outside := x_dirty_actmets.FIRST; -- Reset the index.
1139 l_id_outside := l_act_metric_id_levels.FIRST;
1140 EXIT WHEN l_id_outside IS NULL;
1141 END IF;
1142
1143 l_tests := l_tests + 1;
1144 -- Find an actmet that is dirty at the current level.
1145 IF x_dirty_actmets(l_id_outside).dirty_flag = G_IS_DIRTY AND
1146 x_dirty_actmets(l_id_outside).COUNT = l_level
1147 THEN
1148 l_hits := l_hits + 1;
1149 l_act_metric_id_levels.DELETE(l_id_outside);
1150
1151 l_id := l_id_outside;
1152 LOOP
1153 EXIT WHEN l_id IS NULL;
1154
1155 l_metric_calc_type := x_dirty_actmets(l_id).metric_calculation_type;
1156 -- Branch nodes must accumulate from all immediate children.
1157 IF l_metric_calc_type IN (G_SUMMARY, G_ROLLUP) THEN
1158 -- Is apportioned metric.
1159 IF x_dirty_actmets(l_id).activity_metric_origin_id IS NOT NULL
1160 THEN
1161 l_child_count := 0;
1162
1163 OPEN c_check_assoc_metric(l_metric_id);
1164 FETCH c_check_assoc_metric INTO l_flag;
1165 CLOSE c_check_assoc_metric;
1166 IF l_flag > 0 THEN
1170 x_dirty_actmets(l_id).orig_forecast_value;
1167 l_func_actual_value :=
1168 x_dirty_actmets(l_id).orig_actual_value;
1169 l_func_forecast_value :=
1171 ELSE
1172 Get_Met_Apport_Val(
1173 p_obj_association_id =>
1174 x_dirty_actmets(l_id).activity_metric_origin_id,
1175 x_return_status => x_return_status,
1176 x_apportioned_value => l_func_actual_value);
1177 IF x_dirty_actmets(l_id).default_uom_code IS NOT NULL
1178 AND
1179 x_dirty_actmets(l_id).metric_uom_code IS NOT NULL THEN
1180 l_final_actual_value :=
1181 -- Changed to using local definition.
1182 --Ams_Refreshmetric_Pvt.CONVERT_UOM(
1183 Convert_UOM(
1184 p_from_uom_code =>
1185 x_dirty_actmets(l_id).metric_uom_code,
1186 p_to_uom_code=>
1187 x_dirty_actmets(l_id).default_uom_code,
1188 p_from_quantity => l_func_actual_value);
1189 IF l_final_actual_value < 0 THEN
1190 l_final_actual_value := 0;
1191 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1192 END IF;
1193 ELSE
1194 l_final_actual_value := l_func_actual_value;
1195 END IF;
1196 END IF;
1197 ELSE -- metric_origin_id is null
1198 -- Scan all the child nodes and accumulate.
1199
1200 l_final_actual_value := 0;
1201 l_final_forecast_value := 0;
1202 l_child_count := 0;
1203
1204 IF p_calc_type = G_SUMMARY THEN
1205 SELECT activity_metric_id,
1206 func_forecasted_value,
1207 func_actual_value,
1208 functional_currency_code,
1209 metric_uom_code,
1210 arc_act_metric_used_by,
1211 act_metric_used_by_id
1212 BULK COLLECT INTO l_activity_metric_ids,
1213 l_func_forecasted_values,
1214 l_func_actual_values,
1215 l_functional_currency_codes,
1216 l_metric_uom_codes,
1217 l_arc_act_metric_used_bys,
1218 l_act_metric_used_by_ids
1219 FROM ams_act_metrics_all
1220 WHERE summarize_to_metric = l_id;
1221 --ORDER BY arc_act_metric_used_by, act_metric_used_by_id;
1222 ELSE
1223 SELECT activity_metric_id,
1224 func_forecasted_value,
1225 func_actual_value,
1226 functional_currency_code,
1227 metric_uom_code,
1228 arc_act_metric_used_by,
1229 act_metric_used_by_id
1230 BULK COLLECT INTO l_activity_metric_ids,
1231 l_func_forecasted_values,
1232 l_func_actual_values,
1233 l_functional_currency_codes,
1234 l_metric_uom_codes,
1235 l_arc_act_metric_used_bys,
1236 l_act_metric_used_by_ids
1237 FROM ams_act_metrics_all
1238 WHERE rollup_to_metric = l_id;
1239 --ORDER BY arc_act_metric_used_by, act_metric_used_by_id;
1240 END IF;
1241
1242 IF l_activity_metric_ids.COUNT > 0 THEN
1243 FOR l_amet_index IN l_activity_metric_ids.FIRST..
1244 l_activity_metric_ids.LAST
1245 LOOP
1246 l_child_id := l_activity_metric_ids(l_amet_index);
1247
1248 IF x_dirty_actmets.EXISTS(l_child_id) THEN
1249 -- Child nodes ought never be dirty.
1250 IF x_dirty_actmets(l_child_id).dirty_flag = G_IS_DIRTY
1251 THEN
1252 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1253 END IF;
1254
1255 l_func_actual_value := x_dirty_actmets(l_child_id).
1256 func_actual_value;
1257 IF l_func_actual_value IS NOT NULL AND
1258 (l_func_actual_value >= G_MAX_VALUE OR
1259 l_func_actual_value <= -G_MAX_VALUE) THEN
1260 l_func_actual_value := 0;
1261 x_dirty_actmets(l_child_id).func_actual_value := 0;
1262 END IF;
1266 func_forecast_value;
1263 l_func_actual_value := NVL(l_func_actual_value,0);
1264
1265 l_func_forecast_value := x_dirty_actmets(l_child_id).
1267 IF l_func_forecast_value IS NOT NULL AND
1268 (l_func_forecast_value >= G_MAX_VALUE OR
1269 l_func_forecast_value <= -G_MAX_VALUE) THEN
1270 l_func_forecast_value := 0;
1271 x_dirty_actmets(l_child_id).func_forecast_value := 0;
1272 END IF;
1273 l_func_forecast_value := NVL(l_func_forecast_value,0);
1274
1275 -- BUG3484528: Drive currency by display type.
1276 -- l_func_currency_code :=
1277 -- x_dirty_actmets(l_child_id).func_currency_code;
1278 IF x_dirty_actmets(l_id).display_type =
1279 G_CURRENCY THEN
1280 l_func_currency_code :=
1281 NVL(x_dirty_actmets(l_child_id).
1282 func_currency_code, p_default_currency);
1283 ELSE
1284 l_func_currency_code := NULL;
1285 END IF;
1286 -- BUG3484528: END
1287
1288 ELSE -- If not in dirty table use database values.
1289
1290 l_func_actual_value :=
1291 NVL(l_func_actual_values(l_amet_index), 0);
1292
1293 IF l_func_actual_value >= G_MAX_VALUE OR
1294 l_func_actual_value <= -G_MAX_VALUE THEN
1295 l_func_actual_value := 0;
1296 END IF;
1297
1298 l_func_forecast_value :=
1299 NVL(l_func_forecasted_values(l_amet_index),0);
1300
1301 IF l_func_forecast_value >= G_MAX_VALUE OR
1302 l_func_forecast_value <= -G_MAX_VALUE THEN
1303 l_func_forecast_value := 0;
1304 END IF;
1305
1306 -- BUG3484528: Drive currency by display type.
1307 -- l_func_currency_code :=
1308 -- l_functional_currency_codes(l_amet_index);
1309 IF x_dirty_actmets(l_id).display_type =
1310 G_CURRENCY THEN
1311 l_func_currency_code :=
1312 NVL(l_functional_currency_codes(l_amet_index),
1313 p_default_currency);
1314 ELSE
1315 l_func_currency_code := NULL;
1316 END IF;
1317 -- BUG3484528: END
1318
1319 END IF;
1320 -- Skip canceled business object with no actual values.
1321 IF p_calc_type = G_ROLLUP AND
1322 -- l_func_actual_value <> 0 AND
1323 -- IF the object has not been looked up yet.
1324 (l_arc_act_metric_used_by IS NULL OR
1325 (l_arc_act_metric_used_by <>
1326 l_arc_act_metric_used_bys (l_amet_index) OR
1327 l_act_metric_used_by_id <>
1328 l_act_metric_used_by_ids (l_amet_index) ))
1329 THEN
1330 l_arc_act_metric_used_by :=
1331 l_arc_act_metric_used_bys (l_amet_index);
1332 l_act_metric_used_by_id :=
1333 l_act_metric_used_by_ids (l_amet_index);
1334 /**
1335 if l_arc_act_metric_used_by in (G_CAMP,G_RCAM) and
1336 l_CAMP_status_table.exists(l_act_metric_used_by_id) then
1337 l_is_canceled := l_CAMP_status_table(l_act_metric_used_by_id);
1338 elsif l_arc_act_metric_used_by = G_CSCH and
1339 l_CSCH_status_table.exists(l_act_metric_used_by_id) then
1340 l_is_canceled := l_CSCH_status_table(l_act_metric_used_by_id);
1341 elsif l_arc_act_metric_used_by = G_EVEH and
1342 l_EVEH_status_table.exists(l_act_metric_used_by_id) then
1343 l_is_canceled := l_EVEH_status_table(l_act_metric_used_by_id);
1344 elsif l_arc_act_metric_used_by in (G_EVEO,G_EONE) and
1345 l_EVEO_status_table.exists(l_act_metric_used_by_id) then
1346 l_is_canceled := l_EVEO_status_table(l_act_metric_used_by_id);
1347 else
1348 **/
1349 l_is_canceled := Fnd_Api.G_FALSE;
1350 -- Changed to use local definition.
1351 --Ams_Refreshmetric_Pvt.CHECK_OBJECT_STATUS(
1352 Check_Object_Status(
1353 p_arc_act_metric_used_by => l_arc_act_metric_used_by,
1357 /**
1354 p_act_metric_used_by_id => l_act_metric_used_by_id,
1355 x_is_canceled => l_is_canceled
1356 );
1358 if l_arc_act_metric_used_by in (G_CAMP,G_RCAM) then
1359 l_CAMP_status_table(l_act_metric_used_by_id) := l_is_canceled;
1360 elsif l_arc_act_metric_used_by = G_CSCH then
1361 l_CSCH_status_table(l_act_metric_used_by_id) := l_is_canceled;
1362 elsif l_arc_act_metric_used_by = G_EVEH then
1363 l_EVEH_status_table(l_act_metric_used_by_id) := l_is_canceled;
1364 elsif l_arc_act_metric_used_by in (G_EVEO,G_EONE) then
1365 l_EVEO_status_table(l_act_metric_used_by_id) := l_is_canceled;
1366 end if;
1367 end if;
1368 **/
1369 END IF;
1370
1371 IF p_calc_type = G_SUMMARY OR
1372 l_is_canceled = Fnd_Api.G_FALSE OR
1373 l_func_actual_value <> 0
1374 THEN
1375 -- Validate that the currencies are the same.
1376 -- BUG3484528: Drive by display type.
1377 IF x_dirty_actmets(l_id).display_type = G_CURRENCY
1378 AND l_func_currency_code <> p_default_currency
1379 THEN
1380 -- IF l_func_currency_code IS NOT NULL AND
1381 -- l_func_currency_code <> p_default_currency THEN
1382 Ams_Actmetric_Pvt.CONVERT_CURRENCY2(
1383 x_return_status => l_return_status,
1384 p_from_currency => l_func_currency_code,
1385 p_to_currency => p_default_currency,
1386 p_conv_date => l_current_date,
1387 p_from_amount => l_func_actual_value,
1388 x_to_amount => l_func_actual_value,
1389 p_from_amount2 => l_func_forecast_value,
1390 x_to_amount2 => l_func_forecast_value,
1391 p_round => Fnd_Api.G_FALSE
1392 );
1393 END IF;
1394 l_child_count := l_child_count + 1;
1395 l_final_actual_value := l_final_actual_value +
1396 l_func_actual_value;
1397 l_final_forecast_value := l_final_forecast_value +
1398 l_func_forecast_value;
1399 END IF;
1400 END LOOP;
1401 END IF;
1402
1403 l_activity_metric_ids.DELETE;
1404 l_func_forecasted_values.DELETE;
1405 l_func_actual_values.DELETE;
1406 l_functional_currency_codes.DELETE;
1407 l_metric_uom_codes.DELETE;
1408 l_arc_act_metric_used_bys.DELETE;
1409 l_act_metric_used_by_ids.DELETE;
1410
1411 IF x_dirty_actmets(l_id).value_type = G_RATIO AND
1412 l_child_count > 0 THEN
1413 l_final_actual_value := l_final_actual_value / l_child_count;
1414 l_final_forecast_value := l_final_forecast_value / l_child_count;
1415 END IF;
1416
1417 END IF;
1418 END IF; -- MANUAL
1419
1420 l_metric_uom_code := x_dirty_actmets(l_id).metric_uom_code;
1421 l_default_uom_code := x_dirty_actmets(l_id).default_uom_code;
1422 IF l_default_uom_code IS NOT NULL AND
1423 l_metric_uom_code IS NOT NULL THEN
1424 l_conv_uom_actual_value := /*Ams_Refreshmetric_Pvt.*/CONVERT_UOM(
1425 p_from_uom_code => l_default_uom_code,
1426 p_to_uom_code => l_metric_uom_code,
1427 p_from_quantity => l_final_actual_value);
1428 l_conv_uom_forecast_value := /*Ams_Refreshmetric_Pvt.*/CONVERT_UOM(
1429 p_from_uom_code => l_default_uom_code,
1430 p_to_uom_code => l_metric_uom_code,
1431 p_from_quantity => l_final_forecast_value);
1432 IF l_conv_uom_actual_value < 0 OR
1433 l_conv_uom_forecast_value < 0 THEN
1434 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1435 END IF;
1436 ELSE
1437 l_conv_uom_actual_value := l_final_actual_value;
1438 l_conv_uom_forecast_value := l_final_forecast_value;
1439 END IF;
1440
1441 -- Update all relevent fields with new values.
1442 x_dirty_actmets(l_id).func_actual_value := l_conv_uom_actual_value;
1443 x_dirty_actmets(l_id).func_forecast_value :=
1444 l_conv_uom_forecast_value;
1445 -- IF x_dirty_actmets(l_id).func_currency_code IS NOT NULL THEN
1446 IF x_dirty_actmets(l_id).display_type = G_CURRENCY THEN
1447 x_dirty_actmets(l_id).func_currency_code := p_default_currency;
1448 END IF;
1449 x_dirty_actmets(l_id).computed_using_function_value :=
1450 l_comp_actual_value;
1454 l_current_date - x_dirty_actmets(l_id).last_calculated_date;
1451 x_dirty_actmets(l_id).diff_since_last_calc := l_func_actual_value -
1452 NVL(x_dirty_actmets(l_id).func_actual_value,0);
1453 x_dirty_actmets(l_id).days_since_last_refresh :=
1455 x_dirty_actmets(l_id).last_calculated_date := l_current_date;
1456 x_dirty_actmets(l_id).dirty_flag := G_NOT_DIRTY;
1457
1458 -- Find the parent activity metric id.
1459 l_parent_id := x_dirty_actmets(l_id).parent_id;
1460
1461 IF l_parent_id IS NOT NULL THEN
1462 -- Check if the parent is at the same level.
1463 IF x_dirty_actmets(l_parent_id).COUNT =
1464 x_dirty_actmets(l_id).COUNT THEN
1465 -- Recurse to calculate the parent node.
1466 l_id := l_parent_id;
1467 ELSE
1468 -- If the values have changed and at the next level
1469 -- then set the parent to be dirty.
1470 x_dirty_actmets(l_parent_id).dirty_flag := G_IS_DIRTY;
1471 l_act_metric_id_levels(l_parent_id) := x_dirty_actmets(l_parent_id).COUNT;
1472 EXIT; -- outside loop
1473 END IF;
1474 ELSE
1475 EXIT;
1476 END IF; -- parent is not null
1477 END LOOP; -- top
1478
1479 END IF;
1480
1481 --l_id_outside := x_dirty_actmets.NEXT(l_id_outside); -- Try the next one.
1482 l_id_outside := l_act_metric_id_levels.NEXT(l_id_outside);
1483
1484 END LOOP;
1485 /**
1486 l_CAMP_status_table.delete;
1487 l_CSCH_status_table.delete;
1488 l_EVEO_status_table.delete;
1489 l_EVEH_status_table.delete;
1490 **/
1491 IF AMS_DEBUG_HIGH_ON THEN
1492 write_msg('Calculate_This_Metric', 'END: '||p_calc_type
1493 ||', tests='||l_tests
1494 ||', hits='||l_hits);
1495 END IF;
1496
1497 END Calculate_This_Metric;
1498
1499 -- NAME
1500 -- Bulk_update
1501 --
1502 -- PURPOSE
1503 --
1504 -- ALGORITHM
1505 --
1506 -- NOTES
1507 --
1508 -- HISTORY
1509 --
1510 PROCEDURE Bulk_update(
1511 x_dirty_actmet IN OUT NOCOPY act_met_ref_rec_set_type,
1512 p_calc_type IN VARCHAR2,
1513 p_commit IN varchar2,
1514 x_return_status OUT NOCOPY VARCHAR2
1515 )
1516 IS
1517 L_API_NAME CONSTANT VARCHAR2(100) := 'BULK_UPDATE';
1518 l_id NUMBER;
1519 l_act_met_id num_table_type;
1520 l_cal_date_table date_table_type;
1521 l_sin_last_ref num_table_type;
1522 l_func_act_va num_table_type;
1523 l_tran_act_va num_table_type;
1524 l_func_for_value num_table_type;
1525 l_trans_for_value num_table_type;
1526 l_dirty_flag dirty_flag_table_type;
1527 l_diff num_table_type;
1528 l_obj_version num_table_type;
1529 l_func_curr_code currency_code_table_type;
1530 l_trans_curr_code currency_code_table_type;
1531 l_summarize_ids num_table_type;
1532 l_summarize_count NUMBER := 0;
1533 l_index NUMBER;
1534 l_count NUMBER := 0;
1535 l_obj_currencies object_currency_table;
1536 l_obj_currency object_currency_type;
1537 l_trans_currency_code VARCHAR2(15);
1538 l_act_metric_used_by_id NUMBER;
1539 l_arc_act_metric_used_by VARCHAR2(30);
1540 l_today DATE := SYSDATE;
1541 l_actmet_id number;
1542 l_default_currency VARCHAR2(15) := null;
1543 BEGIN
1544 IF AMS_DEBUG_HIGH_ON THEN
1545 write_msg(L_API_NAME, 'START: '||p_calc_type||': COUNT='||x_dirty_actmet.COUNT);
1546 END IF;
1547 l_default_currency := ams_actmetric_pvt.default_func_currency;
1548 --
1549 -- Phase 4, convert all currencies to transactional amount
1550 --
1551 l_id := x_dirty_actmet.FIRST;
1552 LOOP
1553 EXIT WHEN l_id IS NULL;
1554 -- Only convert if the currency codes are validate and not equal.
1555 IF x_dirty_actmet(l_id).display_type = G_CURRENCY THEN
1556 -- IF x_dirty_actmet(l_id).func_currency_code IS NOT NULL AND
1557 -- x_dirty_actmet(l_id).trans_currency_code IS NOT NULL THEN
1558
1559 -- Verify the transaction currency code matches the object.
1560 l_act_metric_used_by_id := x_dirty_actmet(l_id).act_metric_used_by_id;
1561 l_arc_act_metric_used_by := x_dirty_actmet(l_id).arc_act_metric_used_by;
1562 IF l_obj_currencies.EXISTS(l_act_metric_used_by_id)
1563 AND l_obj_currencies(l_act_metric_used_by_id).obj_type =
1564 l_arc_act_metric_used_by THEN
1565 l_trans_currency_code :=
1566 l_obj_currencies(l_act_metric_used_by_id).currency;
1567 ELSE
1568 Ams_Actmetric_Pvt.GET_TRANS_CURR_CODE(
1569 p_obj_id => l_act_metric_used_by_id,
1570 p_obj_type => l_arc_act_metric_used_by,
1571 x_trans_curr_code => l_trans_currency_code
1572 );
1573 l_obj_currency.obj_id := l_act_metric_used_by_id;
1574 l_obj_currency.obj_type := l_arc_act_metric_used_by;
1575 l_obj_currency.currency := l_trans_currency_code;
1576 l_obj_currencies(l_act_metric_used_by_id) := l_obj_currency;
1577 END IF;
1578 -- BUG 3484528: Make certian that currency codes are set.
1582 -- BUG 3484528: END
1579 -- x_dirty_actmet(l_id).trans_currency_code := l_trans_currency_code;
1580 x_dirty_actmet(l_id).trans_currency_code :=
1581 nvl(l_trans_currency_code, l_default_currency);
1583 Ams_Actmetric_Pvt.Convert_Currency2 (
1584 x_return_status => x_return_status,
1585 p_from_currency => x_dirty_actmet(l_id).func_currency_code,
1586 p_to_currency => x_dirty_actmet(l_id).trans_currency_code,
1587 p_conv_date => x_dirty_actmet(l_id).last_calculated_date,
1588 p_from_amount => x_dirty_actmet(l_id).func_actual_value,
1589 x_to_amount => x_dirty_actmet(l_id).trans_actual_value,
1590 p_from_amount2 => x_dirty_actmet(l_id).func_forecast_value,
1591 x_to_amount2 => x_dirty_actmet(l_id).trans_forecast_value,
1592 p_round => Fnd_Api.G_TRUE);
1593 ELSE
1594 -- Otherwise transfer resulting values to the transaction values.
1595 x_dirty_actmet(l_id).trans_actual_value :=
1596 x_dirty_actmet(l_id).func_actual_value;
1597 x_dirty_actmet(l_id).trans_forecast_value :=
1598 x_dirty_actmet(l_id).func_forecast_value;
1599 END IF;
1600 l_id := x_dirty_actmet.NEXT(l_id);
1601 END LOOP;
1602
1603 -- Save the activity metrics to database.
1604
1605 -- Each value to be updated in the database must be written to individual
1606 -- tables and indexed sequencially. Bulk update does not support refrencing
1607 -- individual members of an object or record (though the documentation
1608 -- show an example of that). Thus individual tables for each value are
1609 -- required. Also 'FORALL' only supports sequencial values.
1610 --
1611 -- Phase 5, build bulk update tables
1612 --
1613 l_index := x_dirty_actmet.FIRST;
1614 LOOP
1615 EXIT WHEN l_index IS NULL;
1616 -- Find a leaf that has not been saved.
1617 IF x_dirty_actmet(l_index).COUNT = 0 AND
1618 x_dirty_actmet(l_index).dirty_flag = G_NOT_DIRTY THEN
1619 l_actmet_id := l_index;
1620 -- Save the leaf and all unsaved parents.
1621 LOOP
1622 EXIT WHEN l_actmet_id IS NULL;
1623 EXIT WHEN x_dirty_actmet(l_actmet_id).dirty_flag = G_SAVED_DIRTY; -- already saved
1624 l_count := l_act_met_id.count + 1;
1625 l_act_met_id (l_count) := l_actmet_id;
1626 l_cal_date_table(l_count) := x_dirty_actmet(l_actmet_id).last_calculated_date;
1627 l_sin_last_ref(l_count) := x_dirty_actmet(l_actmet_id).days_since_last_refresh;
1628 l_func_act_va(l_count) := x_dirty_actmet(l_actmet_id).func_actual_value;
1629 l_tran_act_va(l_count) := x_dirty_actmet(l_actmet_id).trans_actual_value;
1630 l_func_for_value(l_count) := x_dirty_actmet(l_actmet_id).func_forecast_value;
1631 l_trans_for_value(l_count) := x_dirty_actmet(l_actmet_id).trans_forecast_value;
1632 l_dirty_flag(l_count) := x_dirty_actmet(l_actmet_id).dirty_flag;
1633 l_diff(l_count) := x_dirty_actmet(l_actmet_id).diff_since_last_calc;
1634 l_obj_version(l_count):= x_dirty_actmet(l_actmet_id).object_version_number;
1635 l_func_curr_code(l_count):= x_dirty_actmet(l_actmet_id).func_currency_code;
1636 l_trans_curr_code(l_count):= x_dirty_actmet(l_actmet_id).trans_currency_code;
1637 IF p_calc_type = G_ROLLUP AND
1638 x_dirty_actmet(l_actmet_id).summarize_to_metric IS NOT NULL THEN
1639 l_summarize_ids(l_summarize_ids.count) :=
1640 x_dirty_actmet(l_actmet_id).summarize_to_metric;
1641 END IF;
1642 x_dirty_actmet(l_actmet_id).dirty_flag := G_SAVED_DIRTY; -- saved
1643 -- Next parent.
1644 l_actmet_id := x_dirty_actmet(l_actmet_id).parent_id;
1645 END LOOP;
1646 END IF;
1647
1648 l_index := x_dirty_actmet.NEXT(l_index);
1649
1650 IF l_act_met_id.count >= G_BATCH_SIZE
1651 OR (l_index IS NULL AND l_act_met_id.count > 0) THEN
1652 FORALL l_count IN l_act_met_id.FIRST .. l_act_met_id.LAST
1653 UPDATE ams_act_metrics_all
1654 SET last_calculated_date = l_cal_date_table (l_count),
1655 days_since_last_refresh = l_sin_last_ref(l_count),
1656 func_actual_value = l_func_act_va(l_count),
1657 trans_actual_value = l_tran_act_va(l_count),
1658 func_forecasted_value = l_func_for_value(l_count),
1659 trans_forecasted_value = l_trans_for_value(l_count),
1660 dirty_flag = l_dirty_flag(l_count),
1661 difference_since_last_calc = l_diff(l_count),
1662 functional_currency_code = l_func_curr_code(l_count),
1663 transaction_currency_code = l_trans_curr_code(l_count),
1664 last_update_date = l_today,
1665 object_version_number = object_version_number + 1
1666 WHERE activity_metric_id = l_act_met_id (l_count)
1667 AND OBJECT_VERSION_NUMBER = l_obj_version(l_count);
1668 IF p_calc_type = G_ROLLUP AND l_summarize_ids.COUNT > 0 THEN
1669 FORALL l_count IN l_summarize_ids.FIRST .. l_summarize_ids.LAST
1670 UPDATE ams_act_metrics_all
1671 SET dirty_flag = G_IS_DIRTY
1672 WHERE activity_metric_id = l_summarize_ids(l_count);
1673 END IF;
1677 set dirty_flag = G_IS_DIRTY
1674 -- Set the formulas to dirty that are effected by this update.
1675 FORALL l_count IN l_act_met_id.FIRST .. l_act_met_id.LAST
1676 /* update ams_act_metrics_all
1678 where activity_metric_id in
1679 (select a.activity_metric_id
1680 from ams_act_metrics_all a, ams_metrics_all_b m,
1681 ams_metric_formulas f, ams_act_metrics_all b, ams_metrics_all_b c
1682 where a.metric_id = m.metric_id
1683 and m.metric_id = f.metric_id
1684 and b.metric_id = c.metric_id
1685 and a.arc_act_metric_used_by = b.arc_act_metric_used_by
1686 and a.act_metric_used_by_id = b.act_metric_used_by_id
1687 and m.metric_calculation_type = G_FORMULA
1688 and ((b.metric_id = f.source_id and f.source_type = G_METRIC)
1689 or (c.metric_category = f.source_id and f.source_type = G_CATEGORY))
1690 and b.activity_metric_id = l_act_met_id (l_count)); */
1691 --batoleti bug# 5879514
1692 update ams_act_metrics_all
1693 set dirty_flag = G_IS_DIRTY
1694 where activity_metric_id in
1695 (select a.activity_metric_id
1696 from ams_act_metrics_all a, ams_metrics_all_b m,
1697 ams_metric_formulas f, ams_act_metrics_all b, ams_metrics_all_b c
1698 where a.metric_id = m.metric_id
1699 and m.metric_id = f.metric_id
1700 and b.metric_id = c.metric_id
1701 and a.arc_act_metric_used_by = b.arc_act_metric_used_by
1702 and a.act_metric_used_by_id = b.act_metric_used_by_id
1703 and m.metric_calculation_type = G_FORMULA
1704 and ((b.metric_id in (select decode(c1.summary_metric_id, NULL, f1.source_id,c1.summary_metric_id)
1705 from ams_metric_formulas f1, ams_metrics_all_b c1
1706 where c1.metric_id=f1.source_id) and f.source_type = G_METRIC)
1707 or (c.metric_category = f.source_id and f.source_type = G_CATEGORY))
1708 and b.activity_metric_id = l_act_met_id (l_count));
1709
1710 IF p_commit = fnd_api.G_TRUE THEN
1711 COMMIT;
1712 IF AMS_DEBUG_MEDIUM_ON THEN
1713 write_msg(L_API_NAME, 'BATCH UPDATE COMMIT: COUNT='||
1714 l_act_met_id.COUNT||', Dirty index='||l_index);
1715 END IF;
1716 END IF;
1717 l_act_met_id.delete;
1718 l_cal_date_table.delete;
1719 l_sin_last_ref.delete;
1720 l_func_act_va.delete;
1721 l_tran_act_va.delete;
1722 l_func_for_value.delete;
1723 l_trans_for_value.delete;
1724 l_dirty_flag.delete;
1725 l_diff.delete;
1726 l_func_curr_code.delete;
1727 l_trans_curr_code.delete;
1728 l_obj_version.delete;
1729 l_summarize_ids.delete;
1730 END IF;
1731
1732 END LOOP;
1733
1734 IF AMS_DEBUG_HIGH_ON THEN
1735 write_msg(L_API_NAME, 'END: '||p_calc_type);
1736 END IF;
1737 END Bulk_update;
1738
1739 -- NAME
1740 -- Refresh_Act_Metrics_Engine
1741 --
1742 -- PURPOSE
1743 -- A set of dirty activity metrics are passed in to have the data refreshed.
1744 --
1745 -- ALGORITHM
1746 -- With the list of all dirty metrics iterate through to find all the
1747 -- nodes at the current level and a dirty flag set. Once no dirty
1748 -- flags are found at this level, increment to the next level and
1749 -- repeat. End when all levels have expired.
1750 --
1751 -- NOTES
1752 --
1753 -- HISTORY
1754 -- 03/26/2001 dmvincen Created
1755 --
1756 PROCEDURE Refresh_Act_Metrics_Engine
1757 (x_errbuf OUT NOCOPY VARCHAR2,
1758 x_retcode OUT NOCOPY NUMBER,
1759 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
1760 p_run_functions IN VARCHAR2 := Fnd_Api.G_TRUE,
1761 p_update_history IN VARCHAR2 := Fnd_Api.G_FALSE
1762 )
1763 IS
1764 L_API_VERSION CONSTANT NUMBER := 1.0;
1765 L_API_NAME VARCHAR2(30) := 'Refresh_Act_Metrics_Engine';
1766 L_FULL_NAME CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1767
1768 l_dirty_actmet act_met_ref_rec_set_type;
1769 l_id NUMBER;
1770 l_max_level NUMBER;
1771 l_return_status VARCHAR2(1) ;
1772 l_msg_count NUMBER ;
1773 l_msg_data VARCHAR2(2000);
1774
1775 l_index NUMBER;
1776 l_count NUMBER := 1;
1777 /**
1778 l_act_met_id num_table_type;
1779 l_cal_date_table date_table_type;
1780 l_sin_last_ref num_table_type;
1781 l_func_act_va num_table_type;
1782 l_tran_act_va num_table_type;
1783 l_func_for_value num_table_type;
1784 l_trans_for_value num_table_type;
1785 l_dirty_flag dirty_flag_table_type;
1786 l_diff num_table_type;
1787 l_obj_version num_table_type;
1788 **/
1789 l_first NUMBER;
1790 l_last NUMBER;
1791 l_default_currency VARCHAR2(15) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
1792 l_current_date date := SYSDATE;
1793
1794 BEGIN
1795 x_retcode := 0;
1796
1800
1797 IF AMS_DEBUG_HIGH_ON THEN
1798 write_msg(L_API_NAME,'START');
1799 END IF;
1801 Clear_Cache;
1802
1803 Check_Create_Rollup_Parents (
1804 p_init_msg_list => Fnd_Api.G_TRUE,
1805 p_commit => FND_API.G_FALSE,
1806 x_return_status => l_return_status
1807 );
1808
1809 IF p_run_functions = Fnd_Api.G_TRUE THEN
1810 run_functions(x_errbuf => x_errbuf,
1811 x_retcode => x_retcode,
1812 p_commit => FND_API.G_FALSE,
1813 p_current_date => l_current_date,
1814 p_func_currency => l_default_currency);
1815 END IF;
1816
1817 UPDATE_VARIABLE(x_errbuf => x_errbuf,
1818 x_retcode => x_retcode,
1819 p_commit => FND_API.G_FALSE,
1820 p_current_date => l_current_date,
1821 p_func_currency => l_default_currency);
1822
1823 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1824 RAISE Fnd_Api.G_EXC_ERROR;
1825 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1826 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1827 END IF;
1828
1829 Build_Refresh_Act_Metrics (
1830 x_dirty_act_metric_table => l_dirty_actmet,
1831 x_max_count => l_max_level,
1832 p_calc_type => G_ROLLUP,
1833 x_return_status => l_return_status
1834 );
1835
1836 -- Show_Table(l_dirty_actmet /*, l_metric_set */);
1837
1838 Calculate_This_Metric(
1839 x_dirty_actmets => l_dirty_actmet,
1840 p_max_level => l_max_level,
1841 p_calc_type => G_ROLLUP,
1842 x_return_status => l_return_status,
1843 p_default_currency => l_default_currency);
1844
1845 Bulk_Update(
1846 x_dirty_actmet => l_dirty_actmet,
1847 p_calc_type => G_ROLLUP,
1848 p_commit => FND_API.G_FALSE,
1849 x_return_status => l_return_status
1850 );
1851
1852 l_dirty_actmet.DELETE;
1853 l_max_level := 0;
1854
1855 Build_Refresh_Act_Metrics (
1856 x_dirty_act_metric_table => l_dirty_actmet,
1857 x_max_count => l_max_level,
1858 p_calc_type => G_SUMMARY,
1859 x_return_status => l_return_status
1860 );
1861
1862 -- Show_Table(l_dirty_actmet /* , l_metric_set */ );
1863
1864 Calculate_This_Metric(
1865 x_dirty_actmets => l_dirty_actmet,
1866 p_max_level => l_max_level,
1867 p_calc_type => G_SUMMARY,
1868 x_return_status => l_return_status,
1869 p_default_currency => l_default_currency);
1870
1871 Bulk_Update(
1872 x_dirty_actmet => l_dirty_actmet,
1873 p_calc_type => G_SUMMARY,
1874 p_commit => FND_API.G_FALSE,
1875 x_return_status => l_return_status
1876 );
1877
1878 l_dirty_actmet.DELETE;
1879
1880 Update_formulas(x_errbuf => x_errbuf,
1881 x_retcode => x_retcode,
1882 p_commit => FND_API.G_FALSE,
1883 p_current_date => l_current_date,
1884 p_func_currency => l_default_currency);
1885
1886 -- Update history if flag is either 'T' or 'Y'.
1887 -- Due to concurrent program restrictions.
1888 IF p_update_history IN (Fnd_Api.G_TRUE, G_UPDATE_HISTORY) THEN
1889 Update_History(p_commit => FND_API.G_FALSE);
1890 END IF;
1891
1892 Clear_Cache;
1893
1894 x_errbuf := l_msg_data;
1895
1896 --
1897 -- Add success message to message list.
1898 --
1899 IF AMS_DEBUG_HIGH_ON THEN
1900 write_msg(L_API_NAME,'END');
1901 END IF;
1902 EXCEPTION
1903 WHEN Fnd_Api.G_EXC_ERROR THEN
1904 l_return_status := Fnd_Api.G_RET_STS_ERROR;
1905 write_error(l_api_name);
1906 -- Fnd_Msg_Pub.Count_And_Get (
1907 -- p_count => l_msg_count,
1908 -- p_data => l_msg_data
1909 -- );
1910 x_retcode := 1;
1911 -- x_errbuf := l_msg_data;
1912 RAISE;
1913 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1914 l_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1915 write_error(l_api_name);
1916 -- Fnd_Msg_Pub.Count_And_Get (
1917 -- p_count => l_msg_count,
1918 -- p_data => l_msg_data
1919 -- );
1920 x_retcode := 1;
1921 -- x_errbuf := l_msg_data;
1922 RAISE;
1923 WHEN OTHERS THEN
1924 l_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1925 x_errbuf := SQLERRM;
1926 write_msg(l_api_name,'SQLERROR: '||x_errbuf);
1927 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
1928 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
1929 END IF;
1930 -- Fnd_Msg_Pub.Count_And_Get (
1931 -- p_count => l_msg_count,
1932 -- p_data => l_msg_data
1933 -- );
1934 x_retcode := 1;
1935 -- x_errbuf := l_msg_data;
1936 RAISE;
1937 END Refresh_Act_Metrics_Engine;
1938
1939 -- NAME
1940 -- Refresh_Act_Metrics_Engine
1941 --
1942 -- PURPOSE
1946 -- With the list of all dirty metrics iterate through to find all the
1943 -- A set of dirty activity metrics are passed in to have the data refreshed.
1944 --
1945 -- ALGORITHM
1947 -- nodes at the current level and a dirty flag set. Once no dirty
1948 -- flags are found at this level, increment to the next level and
1949 -- repeat. End when all levels have expired.
1950 --
1951 -- NOTES
1952 --
1953 -- HISTORY
1954 -- 03/26/2001 dmvincen Created
1955 --
1956 PROCEDURE Refresh_Act_Metrics_Engine
1957 (p_api_version IN NUMBER,
1958 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_TRUE,
1959 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
1960 x_return_status IN OUT NOCOPY VARCHAR2,
1961 x_msg_count IN OUT NOCOPY NUMBER,
1962 x_msg_data IN OUT NOCOPY VARCHAR2,
1963 p_arc_act_metric_used_by IN varchar2,
1964 p_act_metric_used_by_id IN number,
1965 p_run_functions IN VARCHAR2 := Fnd_Api.G_TRUE,
1966 p_update_history IN VARCHAR2 := Fnd_Api.G_FALSE
1967 )
1968 IS
1969 L_API_VERSION CONSTANT NUMBER := 1.0;
1970 L_API_NAME VARCHAR2(30) := 'Refresh_Act_Metrics_Engine';
1971 L_FULL_NAME CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1972
1973 l_dirty_actmet act_met_ref_rec_set_type;
1974 l_id NUMBER;
1975 l_max_level NUMBER;
1976 l_return_status VARCHAR2(1) ;
1977 l_msg_count NUMBER ;
1978 l_msg_data VARCHAR2(2000);
1979
1980 l_index NUMBER;
1981 l_count NUMBER := 1;
1982 /***
1983 l_act_met_id num_table_type;
1984 l_cal_date_table date_table_type;
1985 l_sin_last_ref num_table_type;
1986 l_func_act_va num_table_type;
1987 l_tran_act_va num_table_type;
1988 l_func_for_value num_table_type;
1989 l_trans_for_value num_table_type;
1990 l_dirty_flag dirty_flag_table_type;
1991 l_diff num_table_type;
1992 l_obj_version num_table_type;
1993 **/
1994 l_first NUMBER;
1995 l_last NUMBER;
1996 l_default_currency VARCHAR2(15) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
1997 l_current_date date := SYSDATE;
1998
1999 l_object_list object_currency_table;
2000
2001 l_errbuf varchar2(4000);
2002 l_retcode number;
2003
2004 BEGIN
2005
2006 IF AMS_DEBUG_HIGH_ON THEN
2007 write_msg(L_API_NAME,'START');
2008 END IF;
2009 --
2010 -- Initialize message list if p_init_msg_list is set to TRUE.
2011 --
2012 IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2013 Fnd_Msg_Pub.Initialize;
2014 END IF;
2015
2016 --
2017 -- Standard check for API version compatibility.
2018 --
2019 IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2020 p_api_version,
2021 L_API_NAME,
2022 G_PKG_NAME)
2023 THEN
2024 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2025 END IF;
2026
2027 Clear_Cache;
2028
2029 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2030 l_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2031
2032 Get_Object_List(p_arc_act_metric_used_by => p_arc_act_metric_used_by,
2033 p_act_metric_used_by_id => p_act_metric_used_by_id,
2034 x_return_status => l_return_status ,
2035 x_msg_count => l_msg_count ,
2036 x_msg_data => l_msg_data ,
2037 x_object_list => l_object_list );
2038
2039 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2040 RAISE Fnd_Api.G_EXC_ERROR;
2041 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2042 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2043 END IF;
2044
2045 Check_Create_Rollup_Parents (
2046 p_init_msg_list => FND_API.G_FALSE,
2047 p_commit => FND_API.G_FALSE,
2048 x_return_status => l_return_status,
2049 p_object_list => l_object_list
2050 );
2051
2052 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2053 RAISE Fnd_Api.G_EXC_ERROR;
2054 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2055 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2056 END IF;
2057
2058 IF p_run_functions = Fnd_Api.G_TRUE THEN
2059 run_functions(x_errbuf => l_errbuf,
2060 x_retcode => l_retcode,
2061 p_commit => FND_API.G_FALSE,
2062 p_object_list => l_object_list,
2063 p_current_date => l_current_date,
2064 p_func_currency => l_default_currency);
2065
2066 END IF;
2067
2068 UPDATE_VARIABLE(x_errbuf => l_errbuf,
2069 x_retcode => l_retcode,
2070 p_commit => FND_API.G_FALSE,
2071 p_object_list => l_object_list,
2072 p_current_date => l_current_date,
2073 p_func_currency => l_default_currency);
2074
2075 Build_Refresh_Act_Metrics (
2076 x_dirty_act_metric_table => l_dirty_actmet,
2080 p_object_list => l_object_list);
2077 x_max_count => l_max_level,
2078 p_calc_type => G_ROLLUP,
2079 x_return_status => l_return_status,
2081
2082 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2083 RAISE Fnd_Api.G_EXC_ERROR;
2084 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2085 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2086 END IF;
2087
2088 Calculate_This_Metric(
2089 x_dirty_actmets => l_dirty_actmet,
2090 p_max_level => l_max_level,
2091 p_calc_type => G_ROLLUP,
2092 x_return_status => l_return_status,
2093 p_default_currency => l_default_currency);
2094
2095 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2096 RAISE Fnd_Api.G_EXC_ERROR;
2097 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2098 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2099 END IF;
2100
2101 Bulk_Update(
2102 x_dirty_actmet => l_dirty_actmet,
2103 p_calc_type => G_ROLLUP,
2104 p_commit => FND_API.G_FALSE,
2105 x_return_status => l_return_status
2106 );
2107
2108 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2109 RAISE Fnd_Api.G_EXC_ERROR;
2110 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2111 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2112 END IF;
2113
2114 l_dirty_actmet.DELETE;
2115 l_max_level := 0;
2116
2117 Build_Refresh_Act_Metrics (
2118 x_dirty_act_metric_table => l_dirty_actmet,
2119 x_max_count => l_max_level,
2120 p_calc_type => G_SUMMARY,
2121 x_return_status => l_return_status,
2122 p_object_list => l_object_list);
2123
2124 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2125 RAISE Fnd_Api.G_EXC_ERROR;
2126 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2127 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2128 END IF;
2129
2130 Calculate_This_Metric(
2131 x_dirty_actmets => l_dirty_actmet,
2132 p_max_level => l_max_level,
2133 p_calc_type => G_SUMMARY,
2134 x_return_status => l_return_status,
2135 p_default_currency => l_default_currency);
2136
2137 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2138 RAISE Fnd_Api.G_EXC_ERROR;
2139 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2140 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2141 END IF;
2142
2143 Bulk_Update(
2144 x_dirty_actmet => l_dirty_actmet,
2145 p_calc_type => G_SUMMARY,
2146 p_commit => FND_API.G_FALSE,
2147 x_return_status => l_return_status
2148 );
2149
2150 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2151 RAISE Fnd_Api.G_EXC_ERROR;
2152 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2153 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2154 END IF;
2155
2156 l_dirty_actmet.DELETE;
2157
2158 Update_formulas(x_errbuf => l_errbuf,
2159 x_retcode => l_retcode,
2160 p_commit => FND_API.G_FALSE,
2161 p_object_list => l_object_list,
2162 p_current_date => l_current_date,
2163 p_func_currency => l_default_currency);
2164
2165 -- Update history if flag is either 'T' or 'Y'.
2166 -- Due to concurrent program restrictions.
2167 IF p_update_history IN (Fnd_Api.G_TRUE, G_UPDATE_HISTORY) THEN
2168 Update_History(p_commit => FND_API.G_FALSE);
2169 END IF;
2170
2171 Clear_Cache;
2172
2173 Fnd_Msg_Pub.Count_And_Get (
2174 p_count => x_msg_count,
2175 p_data => x_msg_data
2176 );
2177 --
2178 -- Add success message to message list.
2179 --
2180 IF AMS_DEBUG_HIGH_ON THEN
2181 write_msg(L_API_NAME,'END');
2182 END IF;
2183 EXCEPTION
2184 WHEN Fnd_Api.G_EXC_ERROR THEN
2185 x_return_status := Fnd_Api.G_RET_STS_ERROR;
2186 x_msg_count := l_msg_count;
2187 x_msg_data := l_msg_data;
2188 Fnd_Msg_Pub.Count_And_Get (
2189 p_count => x_msg_count,
2190 p_data => x_msg_data
2191 );
2192 -- RAISE;
2193 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2194 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2195 x_msg_count := l_msg_count;
2196 x_msg_data := l_msg_data;
2197 Fnd_Msg_Pub.Count_And_Get (
2198 p_count => x_msg_count,
2199 p_data => x_msg_data
2200 );
2201 -- RAISE;
2202 WHEN OTHERS THEN
2203 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2204 x_msg_count := l_msg_count;
2205 x_msg_data := l_msg_data;
2206 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2207 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2208 END IF;
2209 Fnd_Msg_Pub.Count_And_Get (
2210 p_count => x_msg_count,
2211 p_data => x_msg_data
2212 );
2213 -- RAISE;
2214 END Refresh_Act_Metrics_Engine;
2215
2216 -- NAME
2217 -- Check_Create_Rollup_Parents
2218 --
2219 -- PURPOSE
2223 -- the tree hierarchy, fills all the missing "rollup_to" fields of
2220 -- The following procedure collects all activity metrics with missing
2221 -- "rollup_to" field, while the corresponding metric template and
2222 -- business objects that have parents, checks their ancestors along
2224 -- the "ams_act_metrics_all" table.
2225 --
2226 -- NOTES
2227 --
2228 -- HISTORY
2229 -- 03/19/2001 huili Created.
2230 -- 03/20/2001 huili Modified to check all the ancestors
2231 -- 10/23/2001 huili Took out the "arc_metric_used_for_object"
2232 -- from the "c_act_metrics_parents" cursor.
2233 --
2234 PROCEDURE Check_Create_Rollup_Parents (
2235 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
2236 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
2237 x_return_status OUT NOCOPY VARCHAR2,
2238 p_object_list IN object_currency_table := Empty_object_currency_table
2239 )
2240 IS
2241
2242 --
2243 -- Standard API information constants.
2244 --
2245 L_API_VERSION CONSTANT NUMBER := 1.0;
2246 L_API_NAME CONSTANT VARCHAR2(30) := 'CHECK_CREATE_ROLLUP_PARENTS';
2247 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| L_API_NAME;
2248 l_return_status varchar2(1);
2249 l_msg_count number;
2250 l_msg_data varchar2(4000);
2251
2252 l_act_metric_parents act_metric_ids_type;
2253 l_act_metrics act_metric_ids_type;
2254
2255 l_metric_parent_id NUMBER;
2256 l_act_metric_id NUMBER;
2257 l_obj_id NUMBER;
2258 l_num_rows NUMBER := 0;
2259 l_row_count NUMBER := 1;
2260 l_new_act_metric_id NUMBER;
2261 l_obj_type VARCHAR2(30);
2262 l_creates NUMBER := 0;
2263 l_creates_committed NUMBER := 0;
2264
2265 l_metric_parent_ids num_table_type;
2266 l_act_metric_ids num_table_type;
2267 l_obj_ids num_table_type;
2268 l_obj_types varchar2_table_type;
2269
2270 l_metric_parent_ids2 num_table_type;
2271 l_act_metric_ids2 num_table_type;
2272 l_obj_ids2 num_table_type;
2273 l_obj_types2 varchar2_table_type;
2274
2275 --select all activity metrics which have parent and missing "rollup_to_metric"
2276 -- BUG 3119211 - Removed first_rows hint.
2277 CURSOR c_act_metrics_parents IS
2278 SELECT --/*+ first_rows */
2279 a.metric_parent_id, b.activity_metric_id, b.act_metric_used_by_id,
2280 b.arc_act_metric_used_by
2281 FROM ams_metrics_all_b a, ams_act_metrics_all b
2282 WHERE a.metric_parent_id IS NOT NULL
2283 AND b.rollup_to_metric IS NULL
2284 AND a.metric_id = b.metric_id;
2285 --AND a.arc_metric_used_for_object = b.arc_act_metric_used_by;
2286
2287 --select all activity metrics which have parent and missing "rollup_to_metric"
2288 CURSOR c_act_metrics_parents_by_obj(p_object_type varchar2, p_object_id NUMBER) IS
2289 SELECT /*+ first_rows */
2290 a.metric_parent_id, b.activity_metric_id, b.act_metric_used_by_id,
2291 b.arc_act_metric_used_by
2292 FROM ams_metrics_all_b a, ams_act_metrics_all b
2293 WHERE a.metric_parent_id IS NOT NULL
2294 AND b.rollup_to_metric IS NULL
2295 AND a.metric_id = b.metric_id
2296 AND b.arc_act_metric_used_by = p_object_type
2297 AND b.act_metric_used_by_id = p_object_id;
2298 --AND a.arc_metric_used_for_object = b.arc_act_metric_used_by;
2299
2300 --l_start_time NUMBER;
2301 l_count NUMBER;
2302 l_first number;
2303 l_last number;
2304
2305 BEGIN
2306
2307 SAVEPOINT CREATE_ROLLUP_PARENTS_SP1;
2308
2309 IF AMS_DEBUG_HIGH_ON THEN
2310 write_msg(L_API_NAME,'START');
2311 END IF;
2312 --
2313 -- Initialize message list if p_init_msg_list is set to TRUE.
2314 --
2315 IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2316 Fnd_Msg_Pub.Initialize;
2317 END IF;
2318
2319 --
2320 -- Standard check for API version compatibility.
2321 --
2322 /*** NOT REQUIRED
2323 IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2324 p_api_version,
2325 L_API_NAME,
2326 G_PKG_NAME)
2327 THEN
2328 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2329 END IF;
2330 ****/
2331
2332 --
2333 -- Initialize API return status to success.
2334 --
2335 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2336
2337 IF p_object_list.count = 0 THEN
2338 OPEN c_act_metrics_parents;
2339 FETCH c_act_metrics_parents BULK COLLECT INTO
2340 l_metric_parent_ids, l_act_metric_ids, l_obj_ids, l_obj_types;
2341 CLOSE c_act_metrics_parents;
2342 ELSE
2343 IF p_object_list.count > 0 THEN
2344 FOR l_index IN p_object_list.first..p_object_list.last
2345 LOOP
2346 OPEN c_act_metrics_parents_by_obj(p_object_list(l_index).obj_type,
2347 p_object_list(l_index).obj_id);
2348 FETCH c_act_metrics_parents_by_obj BULK COLLECT INTO
2349 l_metric_parent_ids2, l_act_metric_ids2, l_obj_ids2, l_obj_types2;
2350 CLOSE c_act_metrics_parents_by_obj;
2351 IF l_metric_parent_ids2.count > 0 THEN
2352 FOR l_index2 IN l_metric_parent_ids2.first..l_metric_parent_ids2.last
2353 LOOP
2354 l_count:= l_metric_parent_ids.count +1;
2358 l_obj_types(l_count) := l_obj_types2(l_index2);
2355 l_metric_parent_ids(l_count) := l_metric_parent_ids2(l_index2);
2356 l_act_metric_ids(l_count) := l_act_metric_ids2(l_index2);
2357 l_obj_ids(l_count) := l_obj_ids2(l_index2);
2359 END LOOP;
2360 END IF;
2361 END LOOP;
2362 END IF;
2363 END IF;
2364
2365 IF AMS_DEBUG_MEDIUM_ON THEN
2366 write_msg(L_API_NAME,'Parents to check: '||l_metric_parent_ids.count);
2367 END IF;
2368 IF l_metric_parent_ids.count > 0 THEN
2369 /**
2370 G_RCAM_Parents_table.DELETE;
2371 G_CSCH_Parents_table.DELETE;
2372 G_EVEO_Parents_table.DELETE;
2373 G_EVEH_Parents_table.DELETE;
2374 G_EONE_Parents_table.DELETE;
2375 **/
2376 FOR l_index IN l_metric_parent_ids.first..l_metric_parent_ids.last
2377 LOOP
2378 BEGIN
2379 SAVEPOINT CREATE_ROLLUP_PARENTS_SP2;
2380 l_new_act_metric_id := NULL;
2381
2382 IF AMS_DEBUG_MEDIUM_ON THEN
2383 write_msg(L_API_NAME,'checking: actmetricid'||l_act_metric_ids(l_index));
2384 END IF;
2385 Check_Cr_Roll_Par_Helper (
2386 p_init_msg_list => p_init_msg_list,
2387 p_metric_parent_id => l_metric_parent_ids(l_index),
2388 p_act_metric_id => l_act_metric_ids(l_index),
2389 p_obj_id => l_obj_ids(l_index),
2390 p_obj_type => l_obj_types(l_index),
2391 x_creates => l_creates,
2392 x_act_metric_parents => l_act_metric_parents,
2393 x_act_metrics => l_act_metrics,
2394 x_act_metric_id => l_new_act_metric_id,
2395 x_return_status => l_return_status);
2396
2397 IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2398 RAISE Fnd_Api.G_EXC_ERROR;
2399 ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2400 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2401 END IF;
2402
2403 EXCEPTION
2404 WHEN others THEN
2405 ROLLBACK TO CREATE_ROLLUP_PARENTS_SP2;
2406 END;
2407 -- Commit subsets of new rollup metrics
2408 IF (l_creates - l_creates_committed > G_BATCH_SIZE OR
2409 (l_index = l_metric_parent_ids.last AND
2410 l_creates - l_creates_committed > 0)) AND
2411 p_commit = FND_API.G_TRUE THEN
2412 COMMIT;
2413 l_creates_committed := l_creates;
2414 IF AMS_DEBUG_MEDIUM_ON THEN
2415 write_msg(L_API_NAME,'BATCH COMMIT: PARENTS CREATED='||l_creates);
2416 END IF;
2417 END IF;
2418
2419 END LOOP;
2420
2421 l_metric_parent_ids.delete;
2422 /**
2423 G_RCAM_Parents_table.DELETE;
2424 G_CSCH_Parents_table.DELETE;
2425 G_EVEO_Parents_table.DELETE;
2426 G_EVEH_Parents_table.DELETE;
2427 G_EONE_Parents_table.DELETE;
2428 **/
2429 END IF;
2430
2431 IF AMS_DEBUG_HIGH_ON THEN
2432 write_msg(L_API_NAME,'PARENT CHECK COMPLETE: PARENTS CREATED='||l_creates);
2433 END IF;
2434 --write_msg('Per LOOP TIME: '|| (DBMS_UTILITY.get_time-l_start_time)/l_count);
2435
2436 --now, do bulk update
2437 IF l_act_metrics.count > 0 then
2438 l_first := l_act_metrics.first;
2439 LOOP
2440 EXIT WHEN l_first > l_act_metrics.last;
2441 IF l_first + G_BATCH_SIZE + G_BATCH_PAD > l_act_metrics.last THEN
2442 l_last := l_act_metrics.last;
2443 ELSE
2444 l_last := l_first + G_BATCH_SIZE - 1;
2445 END IF;
2446 FORALL l_row_count IN l_first .. l_last
2447 UPDATE ams_act_metrics_all
2448 SET rollup_to_metric = l_act_metric_parents (l_row_count)
2449 WHERE activity_metric_id = l_act_metrics (l_row_count);
2450
2451 -- 06/13/2001 huili added to set the dirty_flag of parent activity metrics
2452 FORALL l_row_count IN l_first .. l_last
2453 UPDATE ams_act_metrics_all
2454 SET dirty_flag = G_IS_DIRTY
2455 WHERE activity_metric_id = l_act_metric_parents (l_row_count)
2456 AND dirty_flag = G_NOT_DIRTY;
2457 -- Commit a batch of rollup ids.
2458 IF p_commit = FND_API.G_TRUE THEN
2459 COMMIT;
2460 IF AMS_DEBUG_MEDIUM_ON THEN
2461 write_msg(L_API_NAME,'BATCH COMMIT: ROLLUPS='||l_last);
2462 END IF;
2463 END IF;
2464 l_first := l_last + 1;
2465 END LOOP;
2466 END IF;
2467 --
2468 --release memory
2469 --
2470 IF AMS_DEBUG_HIGH_ON THEN
2471 write_msg(L_API_NAME,'END: ROWS UPDATED='||l_act_metrics.count);
2472 END IF;
2473 l_act_metric_parents.DELETE;
2474 l_act_metrics.DELETE;
2475
2476 --
2477 -- Standard check for commit request.
2478 --
2479 IF Fnd_Api.To_Boolean (p_commit) THEN
2480 COMMIT WORK;
2481 END IF;
2482 --
2483 -- Standard API to get message count, and if 1,
2484 -- set the message data OUT variable.
2485 --
2486 -- Fnd_Msg_Pub.Count_And_Get (
2487 -- p_count => x_msg_count,
2488 -- p_data => x_msg_data,
2489 -- p_encoded => Fnd_Api.G_FALSE
2490 -- );
2491
2492 EXCEPTION
2496 -- Fnd_Msg_Pub.Count_And_Get (
2493 WHEN Fnd_Api.G_EXC_ERROR THEN
2494 ROLLBACK TO CREATE_ROLLUP_PARENTS_SP1;
2495 x_return_status := Fnd_Api.G_RET_STS_ERROR;
2497 -- p_count => x_msg_count,
2498 -- p_data => x_msg_data
2499 -- );
2500 -- RAISE Fnd_Api.G_EXC_ERROR;
2501 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2502 ROLLBACK TO CREATE_ROLLUP_PARENTS_SP1;
2503 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2504 -- Fnd_Msg_Pub.Count_And_Get (
2505 -- p_count => x_msg_count,
2506 -- p_data => x_msg_data
2507 -- );
2508 -- RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR ;
2509
2510 WHEN OTHERS THEN
2511 ROLLBACK TO CREATE_ROLLUP_PARENTS_SP1;
2512 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2513 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2514 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2515 END IF;
2516 -- Fnd_Msg_Pub.Count_And_Get (
2517 -- p_count => x_msg_count,
2518 -- p_data => x_msg_data
2519 -- );
2520 -- RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR ;
2521 END Check_Create_Rollup_Parents;
2522
2523
2524 -- NAME
2525 -- Check_Cr_Roll_Par_Helper
2526 --
2527 -- PURPOSE
2528 -- The following procedure checks the existance of a rollup activity metric for the
2529 -- parent Marketing objects. If none eixists, one will be generated. The checking
2530 -- will recursively happen along the hierarchy. The id will
2531 -- be saved on the "ROLLUP_TO_METRIC" column of the "AMS_ACT_METRICS_ALL" table.
2532 --
2533 -- NOTES
2534 --
2535 -- HISTORY
2536 -- 03/20/2001 huili Created.
2537 -- 06/07/2001 huili Changed to the new hierarchy for new version 11.5.5
2538 -- 07/26/2001 huili Removed rollup from "Deliverable" business object.
2539 -- 10/23/2001 huili Commented out the "c_metric_used_type" cursor.
2540 --
2541 PROCEDURE Check_Cr_Roll_Par_Helper (
2542
2543 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
2544 p_metric_parent_id IN NUMBER,
2545 p_act_metric_id IN NUMBER,
2546 p_obj_id IN NUMBER,
2547 p_obj_type IN VARCHAR2,
2548 x_act_metric_parents IN OUT NOCOPY act_metric_ids_type,
2549 x_act_metrics IN OUT NOCOPY act_metric_ids_type,
2550 p_depth IN NUMBER := 0,
2551 x_creates IN OUT NOCOPY NUMBER,
2552
2553 x_act_metric_id OUT NOCOPY NUMBER, -- Id of the activity metric created
2554 x_return_status OUT NOCOPY VARCHAR2,
2555 p_commit IN VARCHAR2 := FND_API.G_FALSE
2556 )
2557
2558 IS
2559
2560 l_api_version constant NUMBER := 1.0;
2561 l_api_name constant varchar2(30) := 'CHECK_CR_ROLL_PAR_HELPER';
2562 l_return_status varchar2(1);
2563 l_msg_count number;
2564 l_msg_data varchar2(4000);
2565
2566 l_parent_obj_type VARCHAR2(30);
2567 l_parent_obj_id NUMBER;
2568
2569 l_parent_act_metric_id NUMBER;
2570 l_act_metrics_rec Ams_Actmetric_Pvt.act_metric_rec_type;
2571
2572 l_parent_metric_id NUMBER;
2573 l_new_act_metric_id NUMBER;
2574
2575 l_obj_type VARCHAR2(30);
2576 l_error varchar2(4000);
2577
2578 l_count number;
2579
2580 l_show_flag varchar2(1);
2581
2582 --find parent metric_id
2583 CURSOR c_parent_metric_id (l_metric_id NUMBER) IS
2584 SELECT metric_parent_id
2585 FROM ams_metrics_all_b
2586 WHERE metric_id = l_metric_id;
2587 /**
2588 --check for the parent campaign
2589 CURSOR c_check_parent_campaign(l_act_metric_used_by_id NUMBER) IS
2590 SELECT parent_campaign_id
2591 FROM ams_campaigns_all_b
2592 WHERE campaign_id = l_act_metric_used_by_id
2593 AND UPPER(show_campaign_flag) = 'Y';
2594
2595 --check for the parent event
2596 CURSOR c_check_parent_event_o(l_act_metric_used_by_id NUMBER) IS
2597 SELECT event_header_id
2598 FROM ams_event_offers_all_b
2599 WHERE event_offer_id = l_act_metric_used_by_id;
2600
2601 --check for the parent event
2602 -- BUG 3456849: Changed parent to be a program_id.
2603 CURSOR c_check_parent_event_h(l_act_metric_used_by_id NUMBER) IS
2604 SELECT program_id
2605 FROM ams_event_headers_all_b
2606 WHERE event_header_id = l_act_metric_used_by_id;
2607
2608 -- 06/23/2001 huili changed the "c_check_event_camp"
2609 -- 06/07/2001 huili added two cursors
2610 --check another type of parent event: execution campaign
2611 CURSOR c_check_event_camp (l_act_metric_used_by_id NUMBER) IS
2612 SELECT program_id
2613 FROM ams_event_headers_all_b
2614 WHERE event_header_id = l_act_metric_used_by_id;
2615
2616 CURSOR c_check_camp_type (l_camp_id NUMBER) IS
2617 SELECT rollup_type
2618 FROM ams_campaigns_all_b
2619 WHERE campaign_id = l_camp_id;
2620
2621 -- 06/23/2001 huili added
2622 --check the parent campaign for schedule
2623 CURSOR c_check_parent_schedule (l_act_metric_used_by_id NUMBER) IS
2624 SELECT campaign_id
2625 FROM ams_campaign_schedules_b
2626 WHERE schedule_id = l_act_metric_used_by_id;
2627
2631 WHERE event_offer_id = l_act_metric_used_by_id
2628 CURSOR c_check_parent_one_event(l_act_metric_used_by_id NUMBER) IS
2629 SELECT parent_id
2630 FROM ams_event_offers_all_b
2632 AND parent_type = G_RCAM;
2633 -- END
2634 **/
2635 -- check if act_metrics exists
2636 CURSOR c_verify_act_metric(l_metric_parent_id NUMBER,
2637 l_obj_id NUMBER,
2638 l_obj_code VARCHAR2) IS
2639 SELECT activity_metric_id
2640 FROM ams_act_metrics_all
2641 WHERE metric_id = l_metric_parent_id
2642 AND act_metric_used_by_id = l_obj_id
2643 AND arc_act_metric_used_by = l_obj_code;
2644
2645 BEGIN
2646
2647 --
2648 -- Initialize API return status to success.
2649 --
2650 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2651
2652 IF p_depth > G_MAX_DEPTH THEN
2653 write_msg(l_api_name,'Exceeded depth '||G_MAX_DEPTH||': p_act_metric_id='||p_act_metric_id);
2654 RETURN;
2655 END IF;
2656
2657 l_parent_obj_id := NULL;
2658 l_parent_obj_type := NULL;
2659 /**
2660 -- 06/22/2001 huili changed
2661 IF p_obj_type IS NOT NULL THEN
2662 l_obj_type := UPPER (p_obj_type);
2663 -- campaign to program and program to another program
2664 IF l_obj_type in (G_CAMP, G_RCAM) THEN
2665 IF G_RCAM_Parents_table.EXISTS(p_obj_id) THEN
2666 l_parent_obj_id := G_RCAM_Parents_table(p_obj_id);
2667 ELSE
2668 OPEN c_check_parent_campaign (p_obj_id);
2669 FETCH c_check_parent_campaign INTO l_parent_obj_id;
2670 CLOSE c_check_parent_campaign;
2671 G_RCAM_Parents_Table(p_obj_id) := l_parent_obj_id;
2672 END IF;
2673 l_parent_obj_type := G_RCAM;
2674 -- schedule to campaign
2675 ELSIF l_obj_type = G_CSCH THEN
2676 IF G_CSCH_Parents_table.EXISTS(p_obj_id) THEN
2677 l_parent_obj_id := G_CSCH_Parents_table(p_obj_id);
2678 ELSE
2679 OPEN c_check_parent_schedule (p_obj_id);
2680 FETCH c_check_parent_schedule INTO l_parent_obj_id;
2681 CLOSE c_check_parent_schedule;
2682 G_CSCH_Parents_Table(p_obj_id) := l_parent_obj_id;
2683 END IF;
2684 l_parent_obj_type := G_CAMP;
2685 -- Event Schedule to Event
2686 ELSIF l_obj_type = G_EVEO THEN
2687 IF G_EVEO_Parents_table.EXISTS(p_obj_id) THEN
2688 l_parent_obj_id := G_EVEO_Parents_table(p_obj_id);
2689 ELSE
2690 OPEN c_check_parent_event_o (p_obj_id);
2691 FETCH c_check_parent_event_o INTO l_parent_obj_id;
2692 CLOSE c_check_parent_event_o;
2693 G_EVEO_Parents_Table(p_obj_id) := l_parent_obj_id;
2694 END IF;
2695 l_parent_obj_type := G_EVEH;
2696 -- Event to Program
2697 ELSIF l_obj_type = G_EVEH THEN
2698 IF G_EVEH_Parents_table.EXISTS(p_obj_id) THEN
2699 l_parent_obj_id := G_EVEH_Parents_table(p_obj_id);
2700 ELSE
2701 OPEN c_check_event_camp (p_obj_id);
2702 FETCH c_check_event_camp INTO l_parent_obj_id;
2703 CLOSE c_check_event_camp;
2704 G_EVEH_Parents_Table(p_obj_id) := l_parent_obj_id;
2705 END IF;
2706 l_parent_obj_type := G_RCAM;
2707 -- One Off Event to Program
2708 ELSIF l_obj_type = G_EONE THEN
2709 IF G_EONE_Parents_table.EXISTS(p_obj_id) THEN
2710 l_parent_obj_id := G_EONE_Parents_table(p_obj_id);
2711 ELSE
2712 OPEN c_check_parent_one_event (p_obj_id);
2713 FETCH c_check_parent_one_event INTO l_parent_obj_id;
2714 CLOSE c_check_parent_one_event;
2715 G_EONE_Parents_Table(p_obj_id) := l_parent_obj_id;
2716 END IF;
2717 l_parent_obj_type := G_RCAM;
2718 END IF;
2719 END IF;
2720 **/
2721 IF AMS_DEBUG_MEDIUM_ON THEN
2722 write_msg(l_api_name, 'object='||p_obj_type||'/'||p_obj_id);
2723 END IF;
2724 get_parent_object(p_obj_type, p_obj_id, l_parent_obj_type, l_parent_obj_id,
2725 l_show_flag);
2726 IF AMS_DEBUG_MEDIUM_ON THEN
2727 write_msg(l_api_name, 'object='||p_obj_type||'/'||p_obj_id||', parent='||l_parent_obj_type||'/'||l_parent_obj_id);
2728 END IF;
2729 if l_show_flag = G_HIDE then
2730 -- Do no rollup hidden campaigns.
2731 l_parent_obj_id := null;
2732 l_parent_obj_type := null;
2733 end if;
2734
2735 IF l_parent_obj_id IS NOT NULL THEN -- parent object exists
2736 OPEN c_verify_act_metric(p_metric_parent_id,
2737 l_parent_obj_id, l_parent_obj_type);
2738 l_parent_act_metric_id := NULL;
2739 FETCH c_verify_act_metric INTO l_parent_act_metric_id;
2740 CLOSE c_verify_act_metric;
2741
2742 IF AMS_DEBUG_MEDIUM_ON THEN
2743 write_msg(L_API_NAME,'l_parent_act_metric_id='||l_parent_act_metric_id);
2744 END IF;
2745 IF l_parent_act_metric_id IS NULL THEN
2746 -- The parent obj exists while the corresponding act_metric does not
2747 -- exist then create the parent.
2748 l_act_metrics_rec.act_metric_used_by_id := l_parent_obj_id;
2749 l_act_metrics_rec.arc_act_metric_used_by := l_parent_obj_type;
2750 l_act_metrics_rec.metric_id := p_metric_parent_id;
2751 l_act_metrics_rec.application_id := G_MARKETING_APP_ID;
2752 l_act_metrics_rec.dirty_flag := G_IS_DIRTY;
2753
2754 IF AMS_DEBUG_MEDIUM_ON THEN
2755 write_msg(L_API_NAME,'creating parent: metric_id='||p_metric_parent_id);
2756 END IF;
2757 Ams_Actmetric_Pvt.Create_ActMetric (
2758 p_api_version => l_api_version,
2762 x_msg_count => l_msg_count,
2759 p_init_msg_list => FND_API.G_FALSE,
2760 p_act_metric_rec => l_act_metrics_rec,
2761 x_return_status => l_return_status,
2763 x_msg_data => l_msg_data,
2764 x_activity_metric_id => l_parent_act_metric_id,
2765 p_commit => FND_API.G_FALSE);
2766
2767 x_creates := x_creates + 1;
2768
2769 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2770 IF p_init_msg_list = FND_API.G_TRUE THEN
2771 --write_msg(l_api_name,'CREATE_ACTMETRIC ERROR on metric_id='||p_metric_parent_id
2772 -- ||', obj_type='||l_parent_obj_type||', obj_id='||l_parent_obj_id);
2773 fnd_message.Set_Name('AMS','AMS_METR_IGNORE_ERROR');
2774 Fnd_Msg_Pub.Add;
2775 write_error(l_api_name);
2776 END IF;
2777 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2778 IF p_init_msg_list = FND_API.G_TRUE THEN
2779 --write_msg(l_api_name,'CREATE_ACTMETRIC UNEXP on metric_id='||p_metric_parent_id
2780 -- ||', obj_type='||l_parent_obj_type||', obj_id='||l_parent_obj_id);
2781 fnd_message.Set_Name('AMS','AMS_METR_IGNORE_ERROR');
2782 Fnd_Msg_Pub.Add;
2783 write_error(l_api_name);
2784 END IF;
2785 ELSE
2786
2787 IF l_parent_act_metric_id IS NOT NULL THEN
2788 l_count := x_act_metrics.count +1;
2789 x_act_metric_parents (l_count) := l_parent_act_metric_id;
2790 x_act_metrics (l_count) := p_act_metric_id;
2791
2792 x_act_metric_id := l_parent_act_metric_id;
2793
2794 --
2795 -- Only recursively check the newly created one since the other ones are
2796 -- checked by the "Check_Create_Rollup_Parents" function.
2797 --
2798 OPEN c_parent_metric_id (p_metric_parent_id);
2799 l_parent_metric_id := NULL;
2800 FETCH c_parent_metric_id INTO l_parent_metric_id;
2801 CLOSE c_parent_metric_id;
2802
2803 l_new_act_metric_id := NULL;
2804 IF l_parent_metric_id IS NOT NULL THEN --parent metric exists
2805 Check_Cr_Roll_Par_Helper (
2806 p_init_msg_list => p_init_msg_list,
2807 p_metric_parent_id => l_parent_metric_id,
2808 p_act_metric_id => l_parent_act_metric_id,
2809 p_obj_id => l_parent_obj_id,
2810 p_obj_type => l_parent_obj_type,
2811 x_creates => x_creates,
2812
2813 x_act_metric_parents => x_act_metric_parents,
2814 x_act_metrics => x_act_metrics,
2815 p_depth => p_depth+1,
2816 x_act_metric_id => l_new_act_metric_id,
2817 x_return_status => x_return_status);
2818
2819 END IF; --l_parent_metric_id IS NOT NULL
2820
2821 ELSE -- need to update this one
2822 l_count := x_act_metrics.count +1;
2823 x_act_metric_parents (l_count) := l_parent_act_metric_id;
2824 x_act_metrics (l_count) := p_act_metric_id;
2825 END IF;--l_parent_act_metric_id IS NULL
2826 END IF; -- l_return_status = Fnd_Api.G_RET_STS_ERROR
2827 ELSE --l_parent_act_metric_id IS NOT NULL
2828 l_count := x_act_metrics.count +1;
2829 x_act_metric_parents (l_count) := l_parent_act_metric_id;
2830 x_act_metrics (l_count) := p_act_metric_id;
2831 END IF;--l_parent_act_metric_id IS NULL
2832
2833 END IF; --l_parent_obj_id IS NOT NULL
2834
2835 --
2836 -- Standard API to get message count, and if 1,
2837 -- set the message data OUT variable.
2838 --
2839 /*** Not required for this routine.
2840 Fnd_Msg_Pub.Count_And_Get (
2841 p_count => x_msg_count,
2842 p_data => x_msg_data,
2843 p_encoded => Fnd_Api.G_FALSE
2844 );
2845 ****/
2846 /*
2847 EXCEPTION
2848 WHEN Fnd_Api.G_EXC_ERROR THEN
2849 x_return_status := Fnd_Api.G_RET_STS_ERROR;
2850 Fnd_Msg_Pub.Count_And_Get (
2851 p_count => x_msg_count,
2852 p_data => x_msg_data
2853 );
2854 RAISE Fnd_Api.G_EXC_ERROR;
2855 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2856 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2857 Fnd_Msg_Pub.Count_And_Get (
2858 p_count => x_msg_count,
2859 p_data => x_msg_data
2860 );
2861 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR ;
2862
2863 WHEN OTHERS THEN
2864 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2865 Fnd_Msg_Pub.Count_And_Get (
2866 p_count => x_msg_count,
2867 p_data => x_msg_data
2868 );
2869 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR ;
2870 */
2871 END Check_Cr_Roll_Par_Helper;
2872
2873 --
2874 -- NAME
2875 -- Exec_Function
2876 --
2877 -- PURPOSE
2878 -- Executes the given function using values derived from the
2879 -- activity_metric_id. Return the value derived from the given function.
2880 --
2881 -- NOTES
2882 -- Use Native Dynamic SQL (8i feature) for executing the function.
2883 --
2884 -- HISTORY
2888 --
2885 -- 07/05/1999 choang Created.
2886 -- 08/29/2001 huili Added non-parameter call for execution of
2887 -- stored procedures
2889 FUNCTION Exec_Function (
2890 p_activity_metric_id IN NUMBER := NULL,
2891 p_function_name IN VARCHAR2,
2892 x_return_status OUT NOCOPY VARCHAR2,
2893 p_arc_act_metric_used_by IN varchar2 := NULL,
2894 p_act_metric_used_by_id IN number := NULL
2895 )RETURN NUMBER
2896 IS
2897 L_API_NAME CONSTANT varchar2(100) := 'EXEC_FUNCTION';
2898 l_return_value NUMBER := NULL;
2899 l_sql_str VARCHAR2(4000);
2900 l_error VARCHAR2(4000);
2901 BEGIN
2902 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2903 IF p_activity_metric_id IS NOT NULL THEN
2904 l_sql_str := 'BEGIN :return_value := ' || p_function_name ||
2905 '( :activity_metric_id ); END;';
2906 EXECUTE IMMEDIATE l_sql_str
2907 USING OUT l_return_value,
2908 IN p_activity_metric_id;
2909 ELSE
2910 IF p_arc_act_metric_used_by IS NOT NULL AND
2911 p_act_metric_used_by_id IS NOT NULL THEN
2912 l_sql_str := 'BEGIN ' || p_function_name ||
2913 '( :p_arc_act_metric_used_by, :p_act_metric_used_by_id ); END;';
2914 EXECUTE IMMEDIATE l_sql_str
2915 USING IN p_arc_act_metric_used_by,
2916 p_act_metric_used_by_id;
2917 ELSE
2918 l_sql_str := 'BEGIN ' || p_function_name || '; END;';
2919 EXECUTE IMMEDIATE l_sql_str;
2920 END IF;
2921 END IF;
2922 RETURN l_return_value;
2923 EXCEPTION
2924 WHEN OTHERS THEN
2925 l_error := SQLERRM;
2926 write_msg(L_API_NAME,'EXCEPTION: '|| l_error);
2927 write_msg(L_API_NAME,'SQL_STR: '||l_sql_str);
2928 write_msg(L_API_NAME,'ACTIVITY_METRIC_ID="'||p_activity_metric_id
2929 ||'", p_arc_act_metric_used_by="'||p_arc_act_metric_used_by
2930 ||'", p_act_metric_used_by_id="'||p_act_metric_used_by_id||'"');
2931 x_return_status := Fnd_Api.G_RET_STS_ERROR;
2932 RETURN l_return_value;
2933 END Exec_Function;
2934
2935 -------------------------------------------------------------------------------
2936 -- NAME
2937 -- Run_Functions
2938 -- PURPOSE
2939 -- For all activity metrics of type FUNCTION, if the function's evaluated
2940 -- value is different from it's original value, update the activity metric
2941 -- to reflect the change and make it dirty, which also makes all activity
2942 -- metrics above it in the hierarchy dirty.
2943 -- HISTORY
2944 -- 13-Oct-2000 choang Created.
2945 -- 03-Apr-2001 dmvincen Transfered from Ams_RefreshMetrics_Pvt
2946 -- 29-Aug-2001 huili Added stored procedure support.
2947 -- 16-Jun-2004 dmvincen Initialize l_func_currencies and l_new_trans_actuals.
2948 -------------------------------------------------------------------------------
2949 PROCEDURE Run_Functions
2950 (x_errbuf OUT NOCOPY VARCHAR2,
2951 x_retcode OUT NOCOPY NUMBER,
2952 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
2953 p_object_list IN object_currency_table := Empty_object_currency_table,
2954 p_current_date IN date,
2955 p_func_currency IN varchar2
2956 )
2957 IS
2958 L_API_NAME VARCHAR2(30) := 'Run_Functions';
2959 L_FULL_NAME CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2960 l_new_func_value AMS_ACT_METRICS_ALL.FUNC_ACTUAL_VALUE%TYPE;
2961 -- l_act_metric_rec Ams_Actmetric_Pvt.Act_Metric_Rec_Type;
2962
2963 l_return_status VARCHAR2(1);
2964 l_msg_count NUMBER;
2965 l_msg_data VARCHAR2(4000);
2966 cntr NUMBER := 1;
2967 l_dummy_result NUMBER;
2968 TYPE t_procedures IS TABLE OF ams_metrics_all_b.function_name%TYPE;
2969
2970 l_function_list t_procedures;
2971 l_function_name ams_metrics_all_b.function_name%TYPE;
2972
2973 --All functions
2974 CURSOR c_functions IS
2975 SELECT /*+ first_rows */ activity_metric_id,
2976 function_name,
2977 func_actual_value,
2978 last_calculated_date,
2979 metric_category,
2980 TRANSACTION_CURRENCY_CODE,
2981 functional_currency_code
2982 FROM ams_metrics_all_b a, ams_act_metrics_all b,
2983 ams_lookups lkup
2984 WHERE a.metric_id = b.metric_id
2985 -- BUG4924982: Performance, join to metric definition.
2986 AND a.arc_metric_used_for_object = lkup.lookup_code
2987 AND lookup_type = 'AMS_METRIC_OBJECT_TYPE'
2988 AND a.metric_calculation_type = G_FUNCTION
2989 AND a.function_type = G_IS_FUNCTION;
2990
2991 --Some Functions
2992 CURSOR c_function(l_object_type varchar2, l_object_id number) IS
2993 SELECT /*+ first_rows */ activity_metric_id,
2994 function_name,
2995 func_actual_value,
2996 last_calculated_date,
2997 metric_category,
2998 TRANSACTION_CURRENCY_CODE,
2999 functional_currency_code
3000 FROM ams_metrics_all_b a, ams_act_metrics_all b
3001 WHERE a.metric_id = b.metric_id
3002 AND b.arc_act_metric_used_by = l_object_type
3003 AND b.act_metric_used_by_id = l_object_id
3004 AND a.metric_calculation_type = G_FUNCTION
3005 AND a.function_type = G_IS_FUNCTION;
3006
3007 CURSOR c_met_procedures IS
3011 (select lookup_code from ams_lookups
3008 SELECT DISTINCT function_name
3009 FROM ams_metrics_all_b
3010 WHERE arc_metric_used_for_object IN
3012 where lookup_type = 'AMS_METRIC_OBJECT_TYPE')
3013 -- Replaced with metadata lookups above.
3014 --(G_CAMP, G_CSCH, G_DELV, G_EVEO, G_EVEH, G_RCAM, G_EONE)
3015 --BUG2845365: Removed dialogue components.
3016 --G_DILG, G_AMS_COMP_START, G_AMS_COMP_SHOW_WEB_PAGE, G_AMS_COMP_END)
3017 AND metric_calculation_type = G_FUNCTION
3018 AND function_type = G_IS_PROCEDURE
3019 AND enabled_flag = G_IS_ENABLED;
3020
3021 CURSOR c_has_procedure(l_function_name varchar2,
3022 l_obj_type varchar2, l_obj_id number) IS
3023 SELECT count(1)
3024 FROM ams_act_metrics_all a, ams_metrics_all_b b
3025 WHERE a.metric_id = b.metric_id
3026 AND b.function_name = l_function_name
3027 AND a.arc_act_metric_used_by = l_obj_type
3028 AND a.act_metric_used_by_id = l_obj_id
3029 AND b.metric_calculation_type = G_FUNCTION
3030 AND b.function_type = G_IS_PROCEDURE
3031 AND b.enabled_flag = G_IS_ENABLED;
3032
3033 l_count number;
3034 l_function_rec c_functions%ROWTYPE;
3035 l_current_date DATE := p_current_date;
3036 l_start_time NUMBER;
3037 l_act_metric_ids num_table_type;
3038 l_function_names varchar2_table_type;
3039 l_func_actual_values num_table_type;
3040 l_last_calculated_dates date_table_type;
3041 l_temp_act_metric_ids num_table_type;
3042 l_temp_function_names varchar2_table_type;
3043 l_temp_func_actual_values num_table_type;
3044 l_temp_last_calculated_dates date_table_type;
3045 l_new_act_metric_ids num_table_type;
3046 l_new_func_actuals num_table_type;
3047 l_new_trans_actuals num_table_type;
3048 l_days_since_last_refreshs num_table_type;
3049 l_trans_currencies varchar2_table_type;
3050 l_temp_trans_currencies varchar2_table_type;
3051 l_temp_func_currencies varchar2_table_type;
3052 l_func_currencies varchar2_table_type;
3053 l_categories num_table_type;
3054 l_temp_categories num_table_type;
3055 l_func_currency varchar2(30) := p_func_currency;
3056
3057 l_error varchar2(4000);
3058 l_first number;
3059 l_last number;
3060
3061 BEGIN
3062 IF AMS_DEBUG_HIGH_ON THEN
3063 write_msg(L_API_NAME,'START');
3064 END IF;
3065
3066 --Step 1, execute all stored procedures on metric table
3067 OPEN c_met_procedures;
3068 FETCH c_met_procedures BULK COLLECT INTO l_function_list;
3069 CLOSE c_met_procedures;
3070 IF l_function_list.COUNT > 0 THEN
3071 FOR l_index IN l_function_list.FIRST..l_function_list.LAST
3072 LOOP
3073 IF AMS_DEBUG_HIGH_ON THEN
3074 write_msg(L_API_NAME,'PROCEDURE = '||l_function_list(l_index));
3075 END IF;
3076 l_start_time := DBMS_UTILITY.get_time;
3077 IF p_object_list.COUNT > 0 THEN
3078 FOR l_index2 IN p_object_list.first..p_object_list.last
3079 LOOP
3080 OPEN c_has_procedure(l_function_list(l_index),
3081 p_object_list(l_index2).obj_type,
3082 p_object_list(l_index2).obj_id);
3083 FETCH c_has_procedure INTO l_dummy_result;
3084 CLOSE c_has_procedure;
3085 IF l_dummy_result > 0 THEN
3086 l_dummy_result := Exec_Function (
3087 p_function_name => l_function_list(l_index),
3088 x_return_status => l_return_status,
3089 p_arc_act_metric_used_by => p_object_list(l_index2).obj_type,
3090 p_act_metric_used_by_id => p_object_list(l_index2).obj_id);
3091 END IF;
3092 END LOOP;
3093 ELSE
3094 l_dummy_result := Exec_Function (
3095 p_function_name => l_function_list(l_index),
3096 x_return_status => l_return_status);
3097 END IF;
3098 IF AMS_DEBUG_HIGH_ON THEN
3099 write_msg(L_API_NAME,'elapse time (seconds)= '
3100 || ((DBMS_UTILITY.get_time - l_start_time) / 100));
3101 END IF;
3102 IF p_commit = FND_API.G_TRUE THEN
3103 COMMIT;
3104 IF AMS_DEBUG_MEDIUM_ON THEN
3105 write_msg(L_API_NAME,'BATCH COMMIT');
3106 END IF;
3107 END IF;
3108 END LOOP;
3109 IF AMS_DEBUG_HIGH_ON THEN
3110 write_msg(L_API_NAME,'PROCEDURES RUN='||l_function_list.COUNT);
3111 END IF;
3112 l_function_list.DELETE;
3113 END IF;
3114
3115 --Step 2, execute all function against each activity metric
3116 IF AMS_DEBUG_HIGH_ON THEN
3117 write_msg(L_API_NAME,'COLLECTING FUNCTIONS TO RUN');
3118 END IF;
3119
3120 IF p_object_list.count > 0 THEN
3121 FOR l_index IN p_object_list.first..p_object_list.last
3122 LOOP
3123 OPEN c_function(p_object_list(l_index).obj_type,
3124 p_object_list(l_index).obj_id);
3125 FETCH c_function BULK COLLECT INTO
3126 l_temp_act_metric_ids,
3127 l_temp_function_names,
3128 l_temp_func_actual_values,
3129 l_temp_last_calculated_dates,
3130 l_temp_categories,
3131 l_temp_trans_currencies,
3132 l_temp_func_currencies;
3133 CLOSE c_function;
3137 l_count := l_act_metric_ids.count + 1;
3134 IF l_temp_act_metric_ids.count > 0 THEN
3135 FOR l_index2 IN l_temp_act_metric_ids.first..l_temp_act_metric_ids.last
3136 LOOP
3138 l_act_metric_ids(l_count) := l_temp_act_metric_ids(l_index2);
3139 l_function_names(l_count) := l_temp_function_names(l_index2);
3140 l_func_actual_values(l_count) := l_temp_func_actual_values(l_index2);
3141 l_last_calculated_dates(l_count) := l_temp_last_calculated_dates(l_index2);
3142 l_trans_currencies(l_count) := l_temp_trans_currencies(l_index2);
3143 l_func_currencies(l_count) := l_temp_func_currencies(l_index2);
3144 /*******
3145 IF l_temp_categories(l_index2) IN (G_COST_ID,G_REVENUE_ID) THEN
3146 l_func_currencies(l_count) := l_func_currency;
3147 ELSE
3148 l_func_currencies(l_count) := NULL;
3149 END IF;
3150 *******/
3151 l_categories(l_count) := l_temp_categories(l_index2);
3152 END LOOP;
3153 END IF;
3154 l_temp_act_metric_ids.delete;
3155 l_temp_function_names.delete;
3156 l_temp_func_actual_values.delete;
3157 l_temp_last_calculated_dates.delete;
3158 l_temp_categories.delete;
3159 l_temp_trans_currencies.delete;
3160 l_temp_func_currencies.delete;
3161 END LOOP;
3162 ELSE
3163 OPEN c_functions;
3164 FETCH c_functions BULK COLLECT INTO
3165 l_act_metric_ids,
3166 l_function_names,
3167 l_func_actual_values,
3168 l_last_calculated_dates,
3169 l_categories,
3170 l_trans_currencies,
3171 l_func_currencies;
3172 CLOSE c_functions;
3173 END IF;
3174
3175 IF AMS_DEBUG_HIGH_ON THEN
3176 write_msg(L_API_NAME,'FUNCTION METRICS TO RUN='||l_act_metric_ids.COUNT);
3177 END IF;
3178
3179 IF l_act_metric_ids.count > 0 THEN
3180 FOR l_index IN l_act_metric_ids.first..l_act_metric_ids.last
3181 LOOP
3182 l_new_func_value := Exec_Function (
3183 p_activity_metric_id => l_act_metric_ids(l_index),
3184 p_function_name => l_function_names(l_index),
3185 x_return_status => l_return_status);
3186
3187 IF AMS_DEBUG_LOW_ON THEN
3188 write_msg(L_API_NAME,'actmetid='||l_act_metric_ids(l_index)||
3189 ': function_name='||l_function_names(l_index)||
3190 ': actual_value='||l_func_actual_values(l_index)||
3191 ': new_value='||l_new_func_value);
3192 END IF;
3193 IF l_return_status <> Fnd_Api.G_RET_STS_ERROR
3194 AND NVL(l_new_func_value,0) <> NVL(l_func_actual_values(l_index),0)
3195 THEN
3196 l_count := l_new_act_metric_ids.count+1;
3197 l_new_act_metric_ids(l_count) := l_act_metric_ids(l_index);
3198 l_new_func_actuals(l_count) := l_new_func_value;
3199 l_days_since_last_refreshs(l_count) :=
3200 l_current_date - l_last_calculated_dates(l_index);
3201 l_new_trans_actuals(l_count) := l_new_func_value;
3202 IF l_func_currencies(l_count) IS NOT NULL THEN
3203 Ams_Actmetric_Pvt.Convert_Currency (
3204 x_return_status => l_return_status,
3205 p_from_currency => l_func_currencies(l_count),
3206 p_to_currency => l_trans_currencies(l_count),
3207 p_conv_date => l_current_date,
3208 p_from_amount => l_new_func_value,
3209 x_to_amount => l_new_trans_actuals(l_count),
3210 p_round => Fnd_Api.G_TRUE);
3211 ELSE
3212 l_new_trans_actuals(l_count) := l_new_func_value;
3213 END IF;
3214 END IF;
3215 END LOOP;
3216
3217 IF AMS_DEBUG_HIGH_ON THEN
3218 write_msg(L_API_NAME,'NEW ACTUALS TO UPDATE='||l_new_act_metric_ids.COUNT);
3219 END IF;
3220
3221 IF l_new_act_metric_ids.count > 0 THEN
3222 l_first := l_new_act_metric_ids.first;
3223 LOOP
3224 EXIT WHEN l_first > l_new_act_metric_ids.last;
3225 IF l_first + G_BATCH_SIZE + G_BATCH_PAD > l_new_act_metric_ids.last
3226 THEN
3227 l_last := l_new_act_metric_ids.last;
3228 ELSE
3229 l_last := l_first + G_BATCH_SIZE - 1;
3230 END IF;
3231 FORALL l_count IN l_first .. l_last
3232 UPDATE ams_act_metrics_all
3233 SET last_calculated_date = l_current_date,
3234 last_update_date = l_current_date,
3235 func_actual_value = l_new_func_actuals(l_count),
3236 -- FUNCTIONAL_CURRENCY_CODE = l_func_currencies(l_count),
3237 days_since_last_refresh = l_days_since_last_refreshs(l_count),
3238 trans_actual_value = l_new_trans_actuals(l_count)
3239 WHERE activity_metric_id = l_new_act_metric_ids(l_count);
3240
3241 FORALL l_count IN l_first .. l_last
3242 UPDATE ams_act_metrics_all
3243 SET dirty_flag = G_IS_DIRTY
3244 WHERE activity_metric_id IN
3245 (SELECT rollup_to_metric FROM ams_act_metrics_all
3249 SELECT summarize_to_metric FROM ams_act_metrics_all
3246 WHERE activity_metric_id = l_new_act_metric_ids(l_count)
3247 AND rollup_to_metric IS NOT NULL
3248 UNION ALL
3250 WHERE activity_metric_id = l_new_act_metric_ids(l_count)
3251 AND summarize_to_metric IS NOT NULL);
3252
3253 l_first := l_last + 1;
3254 IF p_commit = fnd_api.g_true THEN
3255 COMMIT;
3256 IF AMS_DEBUG_MEDIUM_ON THEN
3257 write_msg(L_API_NAME,'BATCH COMMIT: l_last='||l_last);
3258 END IF;
3259 END IF;
3260 END LOOP;
3261
3262 l_new_func_actuals.delete;
3263 -- l_func_currencies.delete;
3264 l_days_since_last_refreshs.delete;
3265 l_new_trans_actuals.delete;
3266 l_new_act_metric_ids.delete;
3267 END IF;
3268 l_act_metric_ids.delete;
3269 l_function_names.delete;
3270 l_func_actual_values.delete;
3271 l_last_calculated_dates.delete;
3272 l_categories.delete;
3273 l_trans_currencies.delete;
3274 l_func_currencies.delete;
3275 END IF;
3276 x_errbuf := l_msg_data;
3277 IF AMS_DEBUG_HIGH_ON THEN
3278 write_msg(L_API_NAME,'END');
3279 END IF;
3280 EXCEPTION
3281 WHEN OTHERS THEN
3282 l_error := SQLERRM;
3283 write_msg(L_API_NAME,'EXCEPTION: '|| l_error);
3284 END Run_Functions;
3285
3286 -------------------------------------------------------------------------------
3287 -- NAME
3288 -- Run_Functions
3289 -- PURPOSE
3290 -- External API to run all the function with in a single object.
3291 -- HISTORY
3292 -- 22-Aug_2003 dmvincen Created.
3293 -------------------------------------------------------------------------------
3294 PROCEDURE Run_Functions (
3295 p_api_version IN NUMBER,
3296 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
3297 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
3298
3299 x_return_status OUT NOCOPY VARCHAR2,
3300 x_msg_count OUT NOCOPY NUMBER,
3301 x_msg_data OUT NOCOPY VARCHAR2,
3302
3303 p_arc_act_metric_used_by IN VARCHAR2,
3304 p_act_metric_used_by_id IN NUMBER
3305 )
3306 is
3307 L_API_NAME CONSTANT VARCHAR2(100) := 'RUN_FUNCTIONS';
3308
3309 l_errbuf VARCHAR2(4000);
3310 l_retcode VARCHAR2(10);
3311 l_index number;
3312 l_object_list object_currency_table;
3313 l_current_date date := sysdate;
3314 l_default_currency VARCHAR2(15) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
3315 begin
3316
3317 savepoint sp_run_functions;
3318
3319 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3320
3321 l_index := l_object_list.count + 1;
3322 l_object_list(l_index).obj_type := p_arc_act_metric_used_by;
3323 l_object_list(l_index).obj_id := p_act_metric_used_by_id;
3324
3325 run_functions(x_errbuf => l_errbuf,
3326 x_retcode => l_retcode,
3327 p_commit => FND_API.G_FALSE,
3328 p_object_list => l_object_list,
3329 p_current_date => l_current_date,
3330 p_func_currency => l_default_currency);
3331
3332 -- If any errors happen abort API.
3333 IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
3334 RAISE Fnd_Api.G_EXC_ERROR;
3335 END IF;
3336
3337 --COMMIT WORK;
3338
3339 IF Fnd_Api.to_boolean(p_commit) THEN
3340 COMMIT;
3341 END IF;
3342
3343 --
3344 -- Standard API to get message count, and if 1,
3345 -- set the message data OUT NOCOPY variable.
3346 --
3347 Fnd_Msg_Pub.Count_And_Get (
3348 p_count => x_msg_count,
3349 p_data => x_msg_data,
3350 p_encoded => Fnd_Api.G_FALSE
3351 );
3352
3353 EXCEPTION
3354 WHEN Fnd_Api.G_EXC_ERROR THEN
3355 ROLLBACK TO sp_run_functions;
3356 x_return_status := Fnd_Api.G_RET_STS_ERROR;
3357 Fnd_Msg_Pub.Count_And_Get (
3358 p_count => x_msg_count,
3359 p_data => x_msg_data,
3360 p_encoded => FND_API.G_FALSE
3361 );
3362 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3363 ROLLBACK TO sp_run_functions;
3364 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3365 Fnd_Msg_Pub.Count_And_Get (
3366 p_count => x_msg_count,
3367 p_data => x_msg_data,
3368 p_encoded => FND_API.G_FALSE
3369 );
3370 WHEN OTHERS THEN
3371 ROLLBACK TO sp_run_functions;
3372 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3373 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3374 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3375 END IF;
3376 Fnd_Msg_Pub.Count_And_Get (
3377 p_count => x_msg_count,
3378 p_data => x_msg_data,
3379 p_encoded => FND_API.G_FALSE
3380 );
3381
3382 end run_functions;
3383
3384 -- NAME
3385 -- Get_Met_Apport_Val
3386 --
3387 -- PURPOSE
3388 -- Returns the Value of the Approtioned Metric
3392 -- HISTORY
3389 --
3390 -- NOTES
3391 --
3393 -- 10/20/1999 ptendulk Created.
3394 --
3395 PROCEDURE Get_Met_Apport_Val(
3396 p_obj_association_id IN NUMBER,
3397 x_return_status OUT NOCOPY VARCHAR2,
3398 x_apportioned_value OUT NOCOPY NUMBER
3399 )
3400 IS
3401 l_return_status VARCHAR2(1);
3402 CURSOR c_obj_det IS
3403 SELECT master_object_type,
3404 master_object_id,
3405 using_object_type,
3406 using_object_id,
3407 TO_NUMBER(DECODE(usage_type,G_CREATED,100,G_USED_BY,
3408 NVL(pct_of_cost_to_charge_used_by,0)))
3409 pct_of_cost_to_charge_used_by,
3410 cost_frozen_flag
3411 FROM ams_object_associations
3412 WHERE object_association_id = p_obj_association_id ;
3413 CURSOR c_amt_met IS
3414 SELECT func_actual_value
3415 FROM ams_act_metrics_all
3416 WHERE activity_metric_origin_id = p_obj_association_id ;
3417 l_obj_det_rec c_obj_det%ROWTYPE ;
3418 l_amount NUMBER ;
3419 l_apport_value NUMBER ;
3420 BEGIN
3421 --
3422 -- Initialize API return status to success.
3423 --
3424 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3425 --
3426 -- Begin API Body
3427 --
3428 OPEN c_obj_det ;
3429 FETCH c_obj_det INTO l_obj_det_rec ;
3430 CLOSE c_obj_det ;
3431 -- If Cost frozen flag is 'Y' don't apportion Metric
3432 IF l_obj_det_rec.cost_frozen_flag = G_NOT_FROZEN THEN
3433 -- Call Proc to get the Value of the
3434 GetMetCatVal (
3435 x_return_status => l_return_status,
3436 p_arc_act_metric_used_by => l_obj_det_rec.using_object_type,
3437 p_act_metric_used_by_id => l_obj_det_rec.using_object_id,
3438 p_metric_category => G_COST, --Apportioning only for Cost
3439 p_return_type => G_ACTUAL, -- Return the Actual Value
3440 x_value => l_amount
3441 ) ;
3442 IF l_return_status = Fnd_Api.G_RET_STS_SUCCESS THEN
3443 l_apport_value :=
3444 l_amount * l_obj_det_rec.pct_of_cost_to_charge_used_by/100 ;
3445 ELSE
3446 x_return_status := l_return_status ;
3447 RETURN;
3448 END IF;
3449 ELSE
3450 OPEN c_amt_met;
3451 FETCH c_amt_met INTO l_apport_value ;
3452 CLOSE c_amt_met ;
3453 END IF ;
3454 --
3455 -- Set Output Variables.
3456 --
3457 x_apportioned_value := l_apport_value ;
3458 --
3459 -- End API Body.
3460 --
3461 EXCEPTION
3462 WHEN OTHERS THEN
3463 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3464 END Get_Met_Apport_Val;
3465
3466 -- NAME
3467 -- GetMetricCatVal
3468 --
3469 -- PURPOSE
3470 -- Return the functional forecasted value, committed value, actual
3471 -- value depending on Return type for a given metric.
3472 --
3473 -- NOTES
3474 --
3475 -- HISTORY
3476 -- 10/13/1999 ptendulk Created.
3477 --
3478 PROCEDURE GetMetCatVal (
3479 x_return_status OUT NOCOPY VARCHAR2,
3480 p_arc_act_metric_used_by IN VARCHAR2,
3481 p_act_metric_used_by_id IN NUMBER,
3482 p_metric_category IN VARCHAR2,
3483 p_return_type IN VARCHAR2,
3484 x_value OUT NOCOPY NUMBER
3485 )
3486 IS
3487 CURSOR c_sum_metrics(l_metric_id IN NUMBER,
3488 l_arc_act_metric_used_by VARCHAR2) IS
3489 SELECT metric_id
3490 FROM ams_metrics_all_b
3491 WHERE arc_metric_used_for_object = l_arc_act_metric_used_by
3492 START WITH metric_id = l_metric_id
3493 CONNECT BY PRIOR summary_metric_id = metric_id
3494 ORDER BY LEVEL DESC ;
3495
3496
3497 CURSOR c_cat_metrics(l_metric_category VARCHAR2,
3498 l_arc_act_metric_used_by VARCHAR2,
3499 l_act_metric_used_by_id NUMBER) IS
3500 SELECT act.activity_metric_id activity_metric_id,
3501 met.metric_id metric_id
3502 FROM ams_act_metrics_all act,ams_metrics_all_b met
3503 WHERE met.metric_id = act.metric_id
3504 AND act.arc_act_metric_used_by = l_arc_act_metric_used_by
3505 AND act.act_metric_used_by_id = l_act_metric_used_by_id
3506 AND met.metric_category = l_metric_category ;
3507
3508 CURSOR c_amount(l_met_id IN NUMBER,
3509 l_arc_act_metric_used_by VARCHAR2,
3510 l_act_metric_used_by_id NUMBER) IS
3511 SELECT NVL(func_actual_value,0) func_actual_value,
3512 NVL(func_forecasted_value,0) func_forecasted_value,
3513 NVL(func_committed_value,0) func_committed_value
3514 FROM ams_act_metrics_all
3515 WHERE metric_id = l_met_id
3516 AND arc_act_metric_used_by = l_arc_act_metric_used_by
3517 AND act_metric_used_by_id = l_act_metric_used_by_id ;
3518
3519 l_cat_met_rec c_cat_metrics%ROWTYPE ;
3520 l_sum_met_rec c_sum_metrics%ROWTYPE ;
3521 l_amount_rec c_amount%ROWTYPE ;
3522 BEGIN
3523 --
3524 -- Initialize API return status to success.
3525 --
3529 --
3526 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3527 --
3528 -- Begin API Body.
3530 -- Take the First Metric ID of all the Metrics attached to this Usage and of
3531 -- this class
3532 OPEN c_cat_metrics(p_metric_category,
3533 p_arc_act_metric_used_by,
3534 p_act_metric_used_by_id);
3535 FETCH c_cat_metrics INTO l_cat_met_rec;
3536 CLOSE c_cat_metrics ;
3537
3538 -- This Cursor will Find out Summary Metric of all the metrics attached to
3539 -- this usage type (for e.g. Total Cost )
3540 OPEN c_sum_metrics(l_cat_met_rec.metric_id, p_arc_act_metric_used_by);
3541 FETCH c_sum_metrics INTO l_sum_met_rec;
3542 IF c_sum_metrics%NOTFOUND THEN
3543 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3544 RETURN;
3545 END IF;
3546 CLOSE c_sum_metrics;
3547
3548 -- Following Cursor will Find out the value for this summary metric and
3549 -- for this Usage
3550 -- ASSUMPTIONS : There will be only one Summary Metric(e.g. Total Cost)
3551 -- attached to one Usage(For e.g. Camp C1)
3552 OPEN c_amount(l_sum_met_rec.metric_id,
3553 p_arc_act_metric_used_by,
3554 p_act_metric_used_by_id) ;
3555 FETCH c_amount INTO l_amount_rec ;
3556 CLOSE c_amount;
3557
3558 --
3559 -- Set OUT values.
3560 --
3561 -- This amount is in Functional Currency Code
3562 IF p_return_type = G_ACTUAL THEN
3563 x_value := l_amount_rec.func_actual_value ;
3564 ELSIF p_return_type = G_FORECASTED THEN
3565 x_value := l_amount_rec.func_forecasted_value ;
3566 ELSIF p_return_type = G_COMMITTED THEN
3567 x_value := l_amount_rec.func_committed_value ;
3568 END IF;
3569 --
3570 -- End API Body.
3571 --
3572 EXCEPTION
3573 WHEN OTHERS THEN
3574 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3575 RETURN;
3576 END GetMetCatVal;
3577
3578 --
3579 -- NAME
3580 -- Convert_Uom
3581 --
3582 -- PURPOSE
3583 -- This Procedure will call the Inventory API to convert Uom
3584 -- It will return the calculated quantity (in UOM of to_uom_code )
3585 -- All the Calculations to calculate Value of the metrics
3586 -- are done in Base Uom defined for that Metric. So the First step before
3587 -- calculation starts is to convert the UOM into Base UOM.
3588 -- Once the Value is calculated it's converted back to the Original UOM
3589 -- Activity Metric table will be updated with this UOM
3590 -- NOTES
3591 --
3592 -- HISTORY
3593 -- 09/30/1999 ptendulk Created.
3594 --
3595 FUNCTION Convert_Uom(
3596 p_from_uom_code IN VARCHAR2,
3597 p_to_uom_code IN VARCHAR2,
3598 p_from_quantity IN NUMBER,
3599 p_precision IN NUMBER DEFAULT NULL,
3600 p_from_uom_name IN VARCHAR2 DEFAULT NULL,
3601 p_to_uom_name IN VARCHAR2 DEFAULT NULL
3602 )
3603 RETURN NUMBER
3604 IS
3605 l_to_quantity NUMBER ;
3606 BEGIN
3607 -- Call UOM Conversion API. Pass Item ID as 0 as the UOM is not attached to Item
3608 l_to_quantity := Inv_Convert.Inv_Um_Convert (
3609 item_id => 0 , -- As This is Standard Conversion
3610 PRECISION => p_precision,
3611 from_quantity=> p_from_quantity,
3612 from_unit => p_from_uom_code,
3613 to_unit => p_to_uom_code,
3614 from_name => p_from_uom_name,
3615 to_name => p_to_uom_name ) ;
3616 RETURN l_to_quantity ;
3617 EXCEPTION
3618 WHEN OTHERS THEN
3619 l_to_quantity := -1 ;
3620 RETURN l_to_quantity ;
3621 END Convert_Uom;
3622
3623 --
3624 -- NAME
3625 -- check_object_status
3626 --
3627 -- PURPOSE
3628 -- Check if the business object has been canceled.
3629 --
3630 -- NOTES
3631 --
3632 -- HISTORY
3633 -- 08/16/2001 dmvincen Created
3634 --
3635 PROCEDURE check_object_status(
3636 p_arc_act_metric_used_by IN VARCHAR2,
3637 p_act_metric_used_by_id IN NUMBER,
3638 x_is_canceled OUT NOCOPY VARCHAR2
3639 )
3640 IS
3641 /**
3642 CURSOR c_camp(id NUMBER) IS
3643 SELECT Fnd_Api.G_TRUE
3644 FROM ams_campaigns_all_b
3645 WHERE campaign_id = id
3646 AND status_code = G_CANCELLED;
3647
3648 CURSOR c_csch(id NUMBER) IS
3649 SELECT Fnd_Api.G_TRUE
3650 FROM ams_campaign_schedules_b
3651 WHERE schedule_id = id
3652 AND status_code = G_CANCELLED;
3653
3654 CURSOR c_delv(id NUMBER) IS
3655 SELECT Fnd_Api.G_TRUE
3656 FROM ams_deliverables_all_b
3657 WHERE deliverable_id = id
3658 AND status_code = G_CANCELLED;
3659
3660 CURSOR c_eveh(id NUMBER) IS
3661 SELECT Fnd_Api.G_TRUE
3662 FROM ams_event_headers_all_b
3663 WHERE event_header_id = id
3664 AND system_status_code = G_CANCELLED;
3665
3666 CURSOR c_eveo(id NUMBER) IS
3667 SELECT Fnd_Api.G_TRUE
3668 FROM ams_event_offers_all_b
3669 WHERE event_offer_id = id
3670 AND system_status_code IN (G_CANCELLED);
3671 **/
3672 l_is_canceled VARCHAR2(1) := Fnd_Api.G_FALSE;
3673
3674 BEGIN
3675 /**
3676 if p_arc_act_metric_used_by in (G_CAMP,G_RCAM) and
3677 G_CAMP_status_table.exists(p_act_metric_used_by_id) then
3681 l_is_canceled := g_CSCH_status_table(p_act_metric_used_by_id);
3678 l_is_canceled := g_CAMP_status_table(p_act_metric_used_by_id);
3679 elsif p_arc_act_metric_used_by = G_CSCH and
3680 G_CSCH_status_table.exists(p_act_metric_used_by_id) then
3682 elsif p_arc_act_metric_used_by = G_EVEH and
3683 G_EVEH_status_table.exists(p_act_metric_used_by_id) then
3684 l_is_canceled := g_EVEH_status_table(p_act_metric_used_by_id);
3685 elsif p_arc_act_metric_used_by in (G_EVEO,G_EONE) and
3686 G_EVEO_status_table.exists(p_act_metric_used_by_id) then
3687 l_is_canceled := g_EVEO_status_table(p_act_metric_used_by_id);
3688 else
3689 l_is_canceled := Fnd_Api.G_FALSE;
3690 IF p_arc_act_metric_used_by IN (G_RCAM, G_CAMP) THEN
3691 OPEN c_camp(p_act_metric_used_by_id);
3692 FETCH c_camp INTO l_is_canceled;
3693 CLOSE c_camp;
3694
3695 ELSIF (p_arc_act_metric_used_by = G_CSCH) THEN
3696 OPEN c_csch(p_act_metric_used_by_id);
3697 FETCH c_csch INTO l_is_canceled;
3698 CLOSE c_csch;
3699
3700 ELSIF (p_arc_act_metric_used_by = G_DELV) THEN
3701 OPEN c_delv(p_act_metric_used_by_id);
3702 FETCH c_delv INTO l_is_canceled;
3703 CLOSE c_delv;
3704
3705 ELSIF (p_arc_act_metric_used_by = G_EVEH) THEN
3706 OPEN c_eveh(p_act_metric_used_by_id);
3707 FETCH c_eveh INTO l_is_canceled;
3708 CLOSE c_eveh;
3709
3710 ELSIF p_arc_act_metric_used_by IN (G_EONE, G_EVEO) THEN
3711 OPEN c_eveo(p_act_metric_used_by_id);
3712 FETCH c_eveo INTO l_is_canceled;
3713 CLOSE c_eveo;
3714
3715 END IF;
3716
3717 if p_arc_act_metric_used_by in (G_CAMP,G_RCAM) then
3718 G_CAMP_status_table(p_act_metric_used_by_id) := l_is_canceled;
3719 elsif p_arc_act_metric_used_by = G_CSCH then
3720 G_CSCH_status_table(p_act_metric_used_by_id) := l_is_canceled;
3721 elsif p_arc_act_metric_used_by = G_EVEH then
3722 G_EVEH_status_table(p_act_metric_used_by_id) := l_is_canceled;
3723 elsif p_arc_act_metric_used_by in (G_EVEO,G_EONE) then
3724 G_EVEO_status_table(p_act_metric_used_by_id) := l_is_canceled;
3725 end if;
3726 end if;
3727
3728 x_is_canceled := l_is_canceled;
3729 **/
3730 x_is_canceled := get_object_details(p_arc_act_metric_used_by, p_act_metric_used_by_id).cancelled_flag;
3731
3732 END check_object_status;
3733
3734 -- NAME
3735 -- UPDATE_VARIABLE
3736 --
3737 -- PURPOSE
3738 -- Calculates the variable metrics based on multiplier metrics.
3739 -- The indication to recalculate is when the multipliers last_update_date
3740 -- is greater than the variable metrics last_calculated_date.
3741 -- Added Forecasted_variable_value to ams_act_metrics_all.
3742 -- The forecasted value is calculated by using the actual multiplier value
3743 -- if non-null and non-zero, otherwise use the forecasted multiplier value.
3744 -- The trans_actual_value for the variable metric is fixed and the actual
3745 -- unit value (variable_value) is calculated by dividing trans_actual_value
3746 -- by the actual multiplier value. If the multiplier values are null then
3747 -- the variable values are null. If the multiplier actual value is zero
3748 -- then the trans_actual_value is null.
3749 --
3750 -- NOTES
3751 --
3752 -- HISTORY
3753 -- 11/15/2002 DMVINCEN Created.
3754 -- 08/21/2003 DMVINCEN New logic for calculating.
3755 --
3756 PROCEDURE UPDATE_VARIABLE
3757 (x_errbuf OUT NOCOPY VARCHAR2,
3758 x_retcode OUT NOCOPY NUMBER,
3759 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
3760 p_object_list IN object_currency_table := Empty_object_currency_table,
3761 p_current_date IN date,
3762 p_func_currency IN varchar2
3763 )
3764 IS
3765 L_API_NAME CONSTANT VARCHAR2(100) := 'UPDATE_VARIABLE';
3766
3767 CURSOR c_get_variable_metrics(l_func_currency_code varchar2) IS
3768 SELECT activity_metric_id,
3769 transaction_currency_code,
3770 functional_currency_code,
3771 actual_multiplier,
3772 forecast_multiplier,
3773 trans_actual_value,
3774 trans_forecasted_value,
3775 variable_value,
3776 forecasted_variable_value,
3777 LAST_CALCULATED_DATE
3778 FROM (
3779 SELECT a.activity_metric_id,
3780 a.transaction_currency_code,
3781 a.functional_currency_code,
3782 a.variable_value,
3783 a.forecasted_variable_value,
3784 a.trans_actual_value,
3785 a.trans_forecasted_value,
3786 a.last_calculated_date,
3787 a.dirty_flag,
3788 sum(c.trans_actual_value) actual_multiplier,
3789 sum(c.trans_forecasted_value) forecast_multiplier,
3790 max(c.last_update_date) last_update_date
3791 FROM ams_act_metrics_all a, ams_metrics_all_b b, ams_act_metrics_all c
3792 WHERE a.metric_id = b.metric_id
3793 AND b.accrual_type = G_VARIABLE
3794 AND a.arc_act_metric_used_by = c.arc_act_metric_used_by(+)
3795 AND a.act_metric_used_by_id = c.act_metric_used_by_id(+)
3796 AND c.metric_id = to_number(compute_using_function)
3797 GROUP BY a.activity_metric_id,
3798 a.transaction_currency_code,
3799 a.functional_currency_code,
3800 a.VARIABLE_VALUE,
3804 a.last_calculated_date,
3801 a.forecasted_variable_value,
3802 a.trans_actual_value,
3803 a.trans_forecasted_value,
3805 a.dirty_flag)
3806 WHERE last_update_date > nvl(last_calculated_date,last_update_date-1)
3807 OR functional_currency_code <> l_func_currency_code
3808 OR dirty_flag = G_IS_DIRTY;
3809
3810 CURSOR c_get_variable_metrics_by_obj(l_func_currency_code varchar2,
3811 l_obj_type varchar2, l_obj_id number) is
3812 SELECT activity_metric_id,
3813 transaction_currency_code,
3814 functional_currency_code,
3815 actual_multiplier,
3816 forecast_multiplier,
3817 trans_actual_value,
3818 trans_forecasted_value,
3819 variable_value,
3820 forecasted_variable_value,
3821 LAST_CALCULATED_DATE
3822 FROM (
3823 SELECT a.activity_metric_id,
3824 a.transaction_currency_code,
3825 a.functional_currency_code,
3826 a.variable_value,
3827 a.forecasted_variable_value,
3828 a.trans_actual_value,
3829 a.trans_forecasted_value,
3830 a.last_calculated_date,
3831 a.dirty_flag,
3832 sum(c.trans_actual_value) actual_multiplier,
3833 sum(c.trans_forecasted_value) forecast_multiplier,
3834 max(c.last_update_date) last_update_date
3835 FROM ams_act_metrics_all a, ams_metrics_all_b b, ams_act_metrics_all c
3836 WHERE a.metric_id = b.metric_id
3837 AND b.accrual_type = G_VARIABLE
3838 AND a.arc_act_metric_used_by = l_obj_type
3839 AND a.act_metric_used_by_id = l_obj_id
3840 AND a.arc_act_metric_used_by = c.arc_act_metric_used_by(+)
3841 AND a.act_metric_used_by_id = c.act_metric_used_by_id(+)
3842 AND c.metric_id = to_number(compute_using_function)
3843 GROUP BY a.activity_metric_id,
3844 a.transaction_currency_code,
3845 a.functional_currency_code,
3846 a.VARIABLE_VALUE,
3847 a.forecasted_variable_value,
3848 a.trans_actual_value,
3849 a.trans_forecasted_value,
3850 a.last_calculated_date,
3851 a.dirty_flag)
3852 WHERE last_update_date > nvl(last_calculated_date,last_update_date-1)
3853 OR functional_currency_code <> l_func_currency_code
3854 OR dirty_flag = G_IS_DIRTY;
3855
3856
3857 l_count number;
3858 l_activity_metric_ids num_table_type;
3859 l_trans_currencies varchar2_table_type;
3860 l_func_currencies varchar2_table_type;
3861 l_actual_multipliers num_table_type;
3862 l_forecast_multipliers num_table_type;
3863 l_trans_actual_values num_table_type;
3864 l_trans_forecasted_values num_table_type;
3865 l_variable_values num_table_type;
3866 l_forecasted_variable_values num_table_type;
3867 l_LAST_CALCULATED_DATEs date_table_type;
3868
3869 l_temp_activity_metric_ids num_table_type;
3870 l_temp_trans_currencies varchar2_table_type;
3871 l_temp_func_currencies varchar2_table_type;
3872 l_temp_actual_multipliers num_table_type;
3873 l_temp_forecast_multipliers num_table_type;
3874 l_temp_trans_actual_values num_table_type;
3875 l_temp_trans_forecasted_values num_table_type;
3876 l_temp_variable_values num_table_type;
3877 l_temp_forecasted_variable_val num_table_type;
3878 l_temp_LAST_CALCULATED_DATEs date_table_type;
3879
3880 l_new_activity_metric_ids num_table_type;
3881 l_new_variable_values num_table_type;
3882 l_new_func_forecasted_values num_table_type;
3883 l_new_trans_forecasted_values num_table_type;
3884 l_new_func_currencies varchar2_table_type;
3885 l_new_days_since_last_refreshs num_table_type;
3886 l_new_last_calculated_dates date_table_type;
3887 l_new_func_actual_values num_table_type;
3888 l_new_forecast_variable_values num_table_type;
3889
3890 l_current_date date := SYSDATE;
3891 l_func_currency_code varchar2(30) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
3892 l_return_status varchar2(10);
3893 l_first number;
3894 l_last number;
3895
3896 BEGIN
3897 IF AMS_DEBUG_HIGH_ON THEN
3898 write_msg(L_API_NAME, 'START: object_list count='||p_object_list.count);
3899 END IF;
3900
3901 IF p_object_list.count > 0 THEN
3902 FOR l_index IN p_object_list.first..p_object_list.last
3903 LOOP
3904 OPEN c_get_variable_metrics_by_obj(l_func_currency_code,
3905 p_object_list(l_index).obj_type,p_object_list(l_index).obj_id);
3906 FETCH c_get_variable_metrics_by_obj BULK COLLECT INTO
3907 l_temp_activity_metric_ids,
3908 l_temp_trans_currencies,
3909 l_temp_func_currencies,
3910 l_temp_actual_multipliers,
3911 l_temp_forecast_multipliers,
3912 l_temp_trans_actual_values,
3913 l_temp_trans_forecasted_values,
3914 l_temp_variable_values,
3915 l_temp_forecasted_variable_val,
3916 l_temp_LAST_CALCULATED_DATEs;
3917 CLOSE c_get_variable_metrics_by_obj;
3918 IF l_temp_activity_metric_ids.count > 0 THEN
3919 FOR l_index2 IN l_temp_activity_metric_ids.first..l_temp_activity_metric_ids.last
3920 LOOP
3921 l_count := l_activity_metric_ids.count+1;
3925 l_actual_multipliers(l_count) := l_temp_actual_multipliers(l_index2);
3922 l_activity_metric_ids(l_count) := l_temp_activity_metric_ids(l_index2);
3923 l_trans_currencies(l_count) := l_temp_trans_currencies(l_index2);
3924 l_func_currencies(l_count) := l_temp_func_currencies(l_index2);
3926 l_forecast_multipliers(l_count) := l_temp_forecast_multipliers(l_index2);
3927 l_trans_actual_values(l_count) := l_temp_trans_actual_values(l_index2);
3928 l_trans_forecasted_values(l_count) := l_temp_trans_forecasted_values(l_index2);
3929 l_variable_values(l_count) := l_temp_variable_values(l_index2);
3930 l_forecasted_variable_values(l_count) := l_temp_forecasted_variable_val(l_index2);
3931 l_last_calculated_dates(l_count) := l_temp_last_calculated_dates(l_index2);
3932 END LOOP;
3933 l_temp_activity_metric_ids.delete;
3934 l_temp_trans_currencies.delete;
3935 l_temp_func_currencies.delete;
3936 l_temp_actual_multipliers.delete;
3937 l_temp_forecast_multipliers.delete;
3938 l_temp_trans_actual_values.delete;
3939 l_temp_trans_forecasted_values.delete;
3940 l_temp_variable_values.delete;
3941 l_temp_forecasted_variable_val.delete;
3942 l_temp_LAST_CALCULATED_DATEs.delete;
3943 END IF;
3944 END LOOP;
3945 ELSE
3946 OPEN c_get_variable_metrics(l_func_currency_code);
3947 FETCH c_get_variable_metrics BULK COLLECT INTO
3948 l_activity_metric_ids,
3949 l_trans_currencies,
3950 l_func_currencies,
3951 l_actual_multipliers,
3952 l_forecast_multipliers,
3953 l_trans_actual_values,
3954 l_trans_forecasted_values,
3955 l_variable_values,
3956 l_forecasted_variable_values,
3957 l_LAST_CALCULATED_DATEs;
3958 CLOSE c_get_variable_metrics;
3959 END IF;
3960
3961 IF AMS_DEBUG_HIGH_ON THEN
3962 write_msg(L_API_NAME, 'UPDATING: count='||l_activity_metric_ids.count);
3963 END IF;
3964
3965 IF l_activity_metric_ids.count > 0 THEN
3966 FOR l_index IN l_activity_metric_ids.first..l_activity_metric_ids.last
3967 LOOP
3968 l_new_days_since_last_refreshs(l_index) :=
3969 l_current_date - l_LAST_CALCULATED_DATEs(l_index);
3970 -- BUG3551174: Prevent divide by zero.
3971 IF l_actual_multipliers(l_index) is not null and
3972 l_actual_multipliers(l_index) <> 0 then
3973 l_new_variable_values(l_index) :=
3974 l_trans_actual_values(l_index) / l_actual_multipliers(l_index);
3975 ELSE
3976 l_new_variable_values(l_index) := NULL;
3977 END IF;
3978
3979 IF l_forecasted_variable_values(l_index) is null THEN
3980 -- Calculate the forecasted unit value.
3981 IF l_forecast_multipliers(l_index) is not null AND
3982 l_forecast_multipliers(l_index) <> 0 THEN
3983 l_new_forecast_variable_values(l_index) :=
3984 l_trans_forecasted_values(l_index) /
3985 l_forecast_multipliers(l_index);
3986 ELSE
3987 l_new_forecast_variable_values(l_index) := null;
3988 END IF;
3989 l_new_trans_forecasted_values(l_index) :=
3990 l_trans_forecasted_values(l_index);
3991 ELSE
3992 -- Calculate the forecasted value.
3993 l_new_trans_forecasted_values(l_index) :=
3994 l_forecasted_variable_values(l_index) *
3995 l_forecast_multipliers(l_index);
3996 l_new_forecast_variable_values(l_index) :=
3997 l_forecasted_variable_values(l_index);
3998 END IF;
3999
4000 IF l_trans_currencies(l_index) IS NOT NULL THEN
4001 l_new_func_currencies(l_index) := l_func_currency_code;
4002 ams_actmetric_pvt.Convert_Currency2 (
4003 x_return_status => l_return_status,
4004 p_from_currency => l_trans_currencies(l_index),
4005 p_to_currency => l_new_func_currencies(l_index),
4006 p_conv_date => l_current_date,
4007 p_from_amount => l_trans_actual_values(l_index),
4008 x_to_amount => l_new_func_actual_values(l_index),
4009 p_from_amount2 => l_new_trans_forecasted_values(l_index),
4010 x_to_amount2 => l_new_func_forecasted_values(l_index),
4011 p_round => fnd_api.g_false);
4012 ELSE
4013 -- Variables only apply to costs and revenues.
4014 -- This code should never execute.
4015 l_new_func_currencies(l_index) := NULL;
4016 l_new_func_actual_values(l_index) := l_trans_actual_values(l_index);
4017 l_new_func_forecasted_values(l_index) := l_trans_forecasted_values(l_index);
4018 END IF;
4019 END LOOP;
4020
4021 l_first := l_activity_metric_ids.first;
4022 LOOP
4023 EXIT WHEN l_first > l_activity_metric_ids.last;
4024 IF l_first + G_BATCH_SIZE + G_BATCH_PAD > l_activity_metric_ids.last THEN
4025 l_last := l_activity_metric_ids.last;
4026 ELSE
4027 l_last := l_first + G_BATCH_SIZE - 1;
4028 END IF;
4032 SET last_calculated_date = l_current_date,
4029 --FORALL l_index IN l_act_metric_ids.FIRST .. l_act_metric_ids.LAST
4030 FORALL l_index IN l_first .. l_last
4031 UPDATE ams_act_metrics_all
4033 last_update_date = l_current_date,
4034 object_version_number = object_version_number + 1,
4035 functional_currency_code = l_new_func_currencies(l_index),
4036 DAYS_SINCE_LAST_REFRESH = l_new_days_since_last_refreshs(l_index),
4037 --trans_actual_value = l_new_trans_actual_values(l_index),
4038 func_actual_value = l_new_func_actual_values(l_index),
4039 func_forecasted_value = l_new_func_forecasted_values(l_index),
4040 trans_forecasted_value = l_new_trans_forecasted_values(l_index),
4041 variable_value = l_new_variable_values(l_index),
4042 forecasted_variable_value =
4043 l_new_forecast_variable_values(l_index),
4044 dirty_flag = G_NOT_DIRTY
4045 WHERE activity_metric_id = l_activity_metric_ids(l_index);
4046
4047 -- set the dirty flags for all summary and rollup parents.
4048 --FORALL l_index IN l_act_metric_ids.FIRST .. l_act_metric_ids.LAST
4049 FORALL l_index IN l_first .. l_last
4050 UPDATE ams_act_metrics_all
4051 SET dirty_flag = G_IS_DIRTY
4052 WHERE activity_metric_id IN
4053 (SELECT rollup_to_metric FROM ams_act_metrics_all
4054 WHERE activity_metric_id = l_activity_metric_ids(l_index)
4055 UNION ALL
4056 SELECT summarize_to_metric FROM ams_act_metrics_all
4057 WHERE activity_metric_id = l_activity_metric_ids(l_index));
4058 l_first := l_last + 1;
4059 IF p_commit = FND_API.G_TRUE THEN
4060 COMMIT;
4061 IF AMS_DEBUG_MEDIUM_ON THEN
4062 write_msg(L_API_NAME, 'BATCH COMMIT: l_last='||l_last);
4063 END IF;
4064 END IF;
4065 END LOOP;
4066
4067 l_activity_metric_ids.delete;
4068 l_trans_currencies.delete;
4069 l_func_currencies.delete;
4070 l_actual_multipliers.delete;
4071 l_forecast_multipliers.delete;
4072 l_trans_actual_values.delete;
4073 l_trans_forecasted_values.delete;
4074 l_variable_values.delete;
4075 l_forecasted_variable_values.delete;
4076 l_LAST_CALCULATED_DATEs.delete;
4077 l_new_activity_metric_ids.delete;
4078 l_new_variable_values.delete;
4079 l_new_func_forecasted_values.delete;
4080 l_new_trans_forecasted_values.delete;
4081 l_new_func_currencies.delete;
4082 l_new_days_since_last_refreshs.delete;
4083 l_new_last_calculated_dates.delete;
4084 l_new_func_actual_values.delete;
4085 l_new_forecast_variable_values.delete;
4086 END IF;
4087 IF AMS_DEBUG_HIGH_ON THEN
4088 write_msg(L_API_NAME, 'END');
4089 END IF;
4090 END;
4091
4092 -------------------------------------------------------------------------------
4093 -- NAME
4094 -- Update_Variable
4095 -- PURPOSE
4096 -- External API to calculate variable metrics with in a single object.
4097 -- HISTORY
4098 -- 22-Aug_2003 dmvincen Created.
4099 -------------------------------------------------------------------------------
4100 PROCEDURE Update_Variable (
4101 p_api_version IN NUMBER,
4102 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
4103 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
4104
4105 x_return_status OUT NOCOPY VARCHAR2,
4106 x_msg_count OUT NOCOPY NUMBER,
4107 x_msg_data OUT NOCOPY VARCHAR2,
4108
4109 p_arc_act_metric_used_by IN VARCHAR2,
4110 p_act_metric_used_by_id IN NUMBER
4111 )
4112 is
4113 L_API_NAME CONSTANT VARCHAR2(100) := 'UPDATE_VARIABLE';
4114
4115 l_errbuf VARCHAR2(4000);
4116 l_retcode VARCHAR2(10);
4117 l_index number;
4118 l_object_list object_currency_table;
4119 l_current_date date := sysdate;
4120 l_default_currency VARCHAR2(15) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
4121 begin
4122
4123 savepoint sp_Update_Variable;
4124
4125 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4126
4127 l_index := l_object_list.count + 1;
4128 l_object_list(l_index).obj_type := p_arc_act_metric_used_by;
4129 l_object_list(l_index).obj_id := p_act_metric_used_by_id;
4130
4131 Update_Variable(x_errbuf => l_errbuf,
4132 x_retcode => l_retcode,
4133 p_commit => FND_API.G_FALSE,
4134 p_object_list => l_object_list,
4135 p_current_date => l_current_date,
4136 p_func_currency => l_default_currency);
4137
4138 -- If any errors happen abort API.
4139 IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
4140 RAISE Fnd_Api.G_EXC_ERROR;
4141 END IF;
4142
4143 --COMMIT WORK;
4144
4145 IF Fnd_Api.to_boolean(p_commit) THEN
4146 COMMIT;
4147 END IF;
4148
4149 --
4150 -- Standard API to get message count, and if 1,
4151 -- set the message data OUT NOCOPY variable.
4152 --
4153 Fnd_Msg_Pub.Count_And_Get (
4157 );
4154 p_count => x_msg_count,
4155 p_data => x_msg_data,
4156 p_encoded => Fnd_Api.G_FALSE
4158
4159 EXCEPTION
4160 WHEN Fnd_Api.G_EXC_ERROR THEN
4161 ROLLBACK TO sp_Update_Variable;
4162 x_return_status := Fnd_Api.G_RET_STS_ERROR;
4163 Fnd_Msg_Pub.Count_And_Get (
4164 p_count => x_msg_count,
4165 p_data => x_msg_data,
4166 p_encoded => FND_API.G_FALSE
4167 );
4168 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4169 ROLLBACK TO sp_Update_Variable;
4170 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4171 Fnd_Msg_Pub.Count_And_Get (
4172 p_count => x_msg_count,
4173 p_data => x_msg_data,
4174 p_encoded => FND_API.G_FALSE
4175 );
4176 WHEN OTHERS THEN
4177 ROLLBACK TO sp_Update_Variable;
4178 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4179 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
4180 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
4181 END IF;
4182 Fnd_Msg_Pub.Count_And_Get (
4183 p_count => x_msg_count,
4184 p_data => x_msg_data,
4185 p_encoded => FND_API.G_FALSE
4186 );
4187
4188 end Update_Variable;
4189
4190 -- NAME
4191 -- get_object_details
4192 --
4193 -- PURPOSE
4194 -- Get all useful details for an object.
4195 --
4196 -- NOTES
4197 --
4198 -- HISTORY
4199 -- 09/30/2003 DMVINCEN Created.
4200 --
4201 FUNCTION get_object_details(p_object_type varchar2, p_object_id number)
4202 return object_detail_type
4203 is
4204 l_api_name varchar2(30) := 'GET_OBJECT_DETAILS';
4205 --check the parent campaign or program
4206 CURSOR c_check_campaign(l_act_metric_used_by_id NUMBER)
4207 return object_detail_type IS
4208 SELECT decode(rollup_type,G_RCAM,G_RCAM,G_CAMP), campaign_id, transaction_currency_code, G_RCAM, parent_campaign_id,
4209 decode(status_code, G_CANCELLED, Fnd_Api.G_TRUE, Fnd_Api.G_FALSE) cancelled_flag,
4210 upper(show_campaign_flag)
4211 FROM ams_campaigns_all_b
4212 WHERE campaign_id = l_act_metric_used_by_id;
4213 -- AND UPPER(show_campaign_flag) = 'Y';
4214
4215 CURSOR c_check_schedule (l_act_metric_used_by_id NUMBER)
4216 return object_detail_type IS
4217 SELECT G_CSCH, campaign_id, transaction_currency_code, G_CAMP, campaign_id,
4218 decode(status_code, G_CANCELLED, Fnd_Api.G_TRUE, Fnd_Api.G_FALSE) cancelled_flag,
4219 G_SHOW
4220 FROM ams_campaign_schedules_b
4221 WHERE schedule_id = l_act_metric_used_by_id;
4222
4223 --check the event header
4224 -- BUG 3456849: Changed parent to be a program_id.
4225 CURSOR c_check_event_h(l_act_metric_used_by_id NUMBER)
4226 return object_detail_type IS
4227 SELECT G_EVEH, event_header_id, currency_code_tc, G_RCAM, program_id,
4228 decode(system_status_code, G_CANCELLED, Fnd_Api.G_TRUE, Fnd_Api.G_FALSE) cancelled_flag,
4229 G_SHOW
4230 FROM ams_event_headers_all_b
4231 WHERE event_header_id = l_act_metric_used_by_id;
4232
4233 --check for the parent event
4234 CURSOR c_check_event_o(l_act_metric_used_by_id NUMBER)
4235 return object_detail_type IS
4236 SELECT event_object_type, event_offer_id, currency_code_tc,
4237 decode(parent_type,null,G_EVEH,parent_type) parent_type,
4238 decode(parent_type,null, event_header_id, parent_id) parent_id,
4239 decode(system_status_code, G_CANCELLED, Fnd_Api.G_TRUE, Fnd_Api.G_FALSE) cancelled_flag,
4240 G_SHOW
4241 FROM ams_event_offers_all_b
4242 WHERE event_offer_id = l_act_metric_used_by_id;
4243
4244 CURSOR c_check_deliverable(l_act_metric_used_by_id NUMBER)
4245 return object_detail_type IS
4246 SELECT G_DELV, deliverable_id, transaction_currency_code, NULL, NULL,
4247 decode(status_code, G_CANCELLED, Fnd_Api.G_TRUE, Fnd_Api.G_FALSE) cancelled_flag,
4248 G_SHOW
4249 FROM ams_deliverables_all_b
4250 WHERE deliverable_id = l_act_metric_used_by_id;
4251
4252 CURSOR c_check_act_list(l_act_metric_used_by_id NUMBER)
4253 return object_detail_type IS
4254 SELECT G_ALIST, act_list_header_id, Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY,
4255 NULL, NULL, Fnd_Api.G_FALSE cancelled_flag,
4256 G_SHOW
4257 FROM ams_act_lists
4258 WHERE act_list_header_id = l_act_metric_used_by_id;
4259
4260 l_object_details object_detail_type;
4261 l_index number := 0;
4262 l_obj_index number := 0;
4263 begin
4264 /**
4265 IF G_OBJECT_CACHE.count > 0 then
4266 IF AMS_DEBUG_MEDIUM_ON THEN
4267 write_msg(L_API_NAME,'looking in cache for: '||p_object_type||'/'||p_object_id);
4268 END IF;
4269 for l_index in G_OBJECT_CACHE.first .. G_OBJECT_CACHE.last
4270 loop
4271 if G_OBJECT_CACHE(l_index).obj_type = p_object_type then
4272 if G_OBJECT_CACHE(l_index).object_table.EXISTS(p_object_id) then
4273 l_object_details := G_OBJECT_CACHE(l_index).object_table(p_object_id);
4274 IF AMS_DEBUG_MEDIUM_ON THEN
4275 write_msg(L_API_NAME,'object was cached: '||p_object_type||'/'||p_object_id);
4276 END IF;
4277 return l_object_details;
4278 end if;
4279 exit;
4280 end if;
4284 IF AMS_DEBUG_MEDIUM_ON THEN
4281 end loop;
4282 end if;
4283
4285 write_msg(L_API_NAME,'object not cached: object'||p_object_type||'/'||p_object_id);
4286 END IF;
4287 **/
4288 IF p_object_type in (G_CAMP, G_RCAM) THEN
4289 OPEN c_check_campaign (p_object_id);
4290 FETCH c_check_campaign INTO l_object_details;
4291 CLOSE c_check_campaign;
4292 -- schedule to campaign
4293 ELSIF p_object_type = G_CSCH THEN
4294 OPEN c_check_schedule (p_object_id);
4295 FETCH c_check_schedule INTO l_object_details;
4296 CLOSE c_check_schedule;
4297 -- Event Schedule to Event
4298 ELSIF p_object_type in (G_EVEO, G_EONE) THEN
4299 OPEN c_check_event_o (p_object_id);
4300 FETCH c_check_event_o INTO l_object_details;
4301 CLOSE c_check_event_o;
4302 -- Event to Program
4303 ELSIF p_object_type = G_EVEH THEN
4304 OPEN c_check_event_h (p_object_id);
4305 FETCH c_check_event_h INTO l_object_details;
4306 CLOSE c_check_event_h;
4307 -- One Off Event to Program
4308 ELSIF p_object_type = G_DELV THEN
4309 OPEN c_check_deliverable (p_object_id);
4310 FETCH c_check_deliverable INTO l_object_details;
4311 CLOSE c_check_deliverable;
4312 ELSIF p_object_type = G_ALIST THEN
4313 OPEN c_check_act_list (p_object_id);
4314 FETCH c_check_act_list INTO l_object_details;
4315 CLOSE c_check_act_list;
4316 END IF;
4317 /**
4318 IF G_OBJECT_CACHE.count > 0 then
4319 for l_index in G_OBJECT_CACHE.first .. G_OBJECT_CACHE.last
4320 loop
4321 IF AMS_DEBUG_MEDIUM_ON THEN
4322 write_msg(L_API_NAME,'object cache type:'||G_OBJECT_CACHE(l_index).obj_type||
4323 ', count='||G_OBJECT_CACHE(l_index).object_table.count);
4324 END IF;
4325 if G_OBJECT_CACHE(l_index).obj_type = p_object_type then
4326 l_obj_index := l_index;
4327 IF AMS_DEBUG_MEDIUM_ON THEN
4328 write_msg(L_API_NAME,'found object type at: '||l_obj_index);
4329 END IF;
4330 exit;
4331 end if;
4332 end loop;
4333 l_obj_index := G_OBJECT_CACHE.last + 1;
4334 else
4335 l_obj_index := 1;
4336 end if;
4337
4338 if G_OBJECT_CACHE.COUNT = 0 or l_obj_index > G_OBJECT_CACHE.last then
4339 IF AMS_DEBUG_MEDIUM_ON THEN
4340 write_msg(L_API_NAME,'adding new object type in cache:'||p_object_type);
4341 END IF;
4342 G_OBJECT_CACHE(l_obj_index).obj_type := p_object_type;
4343 G_OBJECT_CACHE(l_obj_index).object_table.delete;
4344 end if;
4345 G_OBJECT_CACHE(l_obj_index).object_table(p_object_id) := l_object_details;
4346
4347 IF AMS_DEBUG_MEDIUM_ON THEN
4348 write_msg(L_API_NAME,'object_details.parent'||l_object_details.parent_type||'/'||l_object_details.parent_id);
4349 END IF;
4350 **/
4351 return l_object_details;
4352
4353 end get_object_details;
4354
4355 procedure get_parent_object(p_obj_type varchar2, p_obj_id number,
4356 x_parent_obj_type out nocopy varchar2, x_parent_obj_id out nocopy number,
4357 x_show_flag out nocopy varchar2)
4358 is
4359 l_object_details object_detail_type;
4360 begin
4361 l_object_details := get_object_details(p_obj_type, p_obj_id);
4362 x_parent_obj_type := l_object_details.parent_type;
4363 x_parent_obj_id := l_object_details.parent_id;
4364 x_show_flag := l_object_details.show_flag;
4365 end get_parent_object;
4366
4367 -- NAME
4368 -- Get_Object_List
4369 --
4370 -- PURPOSE
4371 -- Get objects to refresh, includes children and parents of given object.
4372 --
4373 -- NOTES
4374 --
4375 -- HISTORY
4376 -- 11/15/2002 DMVINCEN Created.
4377 -- 19-Mar-2003 choang Bug 2853777 - Added DELV
4378 -- 16-Dec-2003 dmvincen BUG 3322880 - Added ALIST
4379 --
4380 PROCEDURE Get_Object_List(p_arc_act_metric_used_by varchar2,
4381 p_act_metric_used_by_id number,
4382 x_return_status OUT NOCOPY VARCHAR2,
4383 x_msg_count OUT NOCOPY NUMBER,
4384 x_msg_data OUT NOCOPY VARCHAR2,
4385 x_object_list OUT NOCOPY object_currency_table
4386 )
4387 IS
4388 CURSOR c_get_program_family (l_act_metric_used_by_id number) IS
4389 SELECT campaign_id obj_id, G_RCAM obj_type,
4390 TRANSACTION_CURRENCY_CODE currency
4391 FROM ams_campaigns_all_b
4392 START WITH campaign_id = l_act_metric_used_by_id
4393 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4394 UNION ALL
4395 SELECT campaign_id obj_id,
4396 decode(rollup_type,G_RCAM,G_RCAM,G_CAMP) obj_type,
4397 TRANSACTION_CURRENCY_CODE currency
4398 FROM ams_campaigns_all_b
4399 WHERE parent_campaign_id = l_act_metric_used_by_id
4400 UNION ALL
4401 SELECT EVENT_HEADER_ID obj_id, G_EVEH obj_type, CURRENCY_CODE_TC currency
4402 FROM ams_event_headers_all_b
4403 WHERE PROGRAM_ID = l_act_metric_used_by_id
4404 UNION ALL
4405 SELECT EVENT_OFFER_ID obj_id, G_EONE obj_type, CURRENCY_CODE_TC currency
4406 FROM ams_event_offers_all_b
4407 WHERE parent_id = l_act_metric_used_by_id
4408 ORDER BY obj_type, obj_id;
4409
4410 CURSOR c_get_campaign_family (l_act_metric_used_by_id number) IS
4414 FROM ams_campaigns_all_b
4411 SELECT campaign_id obj_id,
4412 decode(rollup_type,G_RCAM,G_RCAM,G_CAMP) obj_type,
4413 TRANSACTION_CURRENCY_CODE currency
4415 START WITH campaign_id = l_act_metric_used_by_id
4416 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4417 UNION ALL
4418 SELECT SCHEDULE_ID obj_id, G_CSCH obj_type,
4419 TRANSACTION_CURRENCY_CODE currency
4420 FROM ams_campaign_schedules_b
4421 WHERE CAMPAIGN_ID = l_act_metric_used_by_id
4422 ORDER BY obj_type, obj_id;
4423
4424 CURSOR c_get_event_family (l_act_metric_used_by_id number) IS
4425 SELECT campaign_id obj_id, G_RCAM obj_type,
4426 TRANSACTION_CURRENCY_CODE currency
4427 FROM ams_campaigns_all_b
4428 START WITH campaign_id = (SELECT PROGRAM_ID FROM ams_event_headers_all_b
4429 WHERE event_header_id = l_act_metric_used_by_id)
4430 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4431 UNION ALL
4432 SELECT EVENT_HEADER_ID obj_id, G_EVEH obj_type, CURRENCY_CODE_TC currency
4433 FROM ams_event_headers_all_b
4434 WHERE EVENT_HEADER_ID = l_act_metric_used_by_id
4435 UNION ALL
4436 SELECT EVENT_OFFER_ID obj_id, G_EVEO obj_type, CURRENCY_CODE_TC currency
4437 FROM ams_event_offers_all_b
4438 WHERE EVENT_HEADER_ID = l_act_metric_used_by_id
4439 ORDER BY obj_type, obj_id;
4440
4441 CURSOR c_get_csch_family (l_act_metric_used_by_id number) IS
4442 SELECT schedule_id obj_id, G_CSCH obj_type,TRANSACTION_CURRENCY_CODE currency
4443 FROM ams_campaign_schedules_b
4444 WHERE schedule_id = l_act_metric_used_by_id
4445 UNION ALL
4446 SELECT campaign_id obj_id,
4447 decode(rollup_type,G_RCAM,G_RCAM,G_CAMP) obj_type,
4448 TRANSACTION_CURRENCY_CODE currency
4449 FROM ams_campaigns_all_b
4450 START WITH campaign_id = (SELECT campaign_id FROM ams_campaign_schedules_b
4451 WHERE schedule_id = l_act_metric_used_by_id)
4452 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4453 ORDER BY obj_type, obj_id;
4454
4455 CURSOR c_get_eveo_family (l_act_metric_used_by_id number) IS
4456 SELECT EVENT_OFFER_ID obj_id, G_EVEO obj_type, CURRENCY_CODE_TC currency
4457 FROM ams_event_offers_all_b
4458 WHERE EVENT_OFFER_ID = l_act_metric_used_by_id
4459 UNION ALL
4460 SELECT EVENT_HEADER_ID obj_id, G_EVEH obj_type, CURRENCY_CODE_TC currency
4461 FROM ams_event_headers_all_b
4462 WHERE EVENT_HEADER_ID = (SELECT event_header_id FROM ams_event_offers_all_b
4463 WHERE event_offer_id = l_act_metric_used_by_id)
4464 UNION ALL
4465 SELECT campaign_id obj_id, G_RCAM obj_type, TRANSACTION_CURRENCY_CODE currency
4466 FROM ams_campaigns_all_b
4467 START WITH campaign_id = (SELECT PROGRAM_ID FROM ams_event_headers_all_b
4468 WHERE event_header_id = (SELECT event_header_id FROM ams_event_offers_all_b
4469 WHERE event_offer_id = l_act_metric_used_by_id))
4470 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4471 ORDER BY obj_type, obj_id;
4472
4473 CURSOR c_get_eone_family (l_act_metric_used_by_id number) IS
4474 SELECT campaign_id obj_id, G_RCAM obj_type,
4475 TRANSACTION_CURRENCY_CODE currency
4476 FROM ams_campaigns_all_b
4477 START WITH campaign_id = (SELECT PARENT_ID FROM ams_event_offers_all_b
4478 WHERE event_offer_id = l_act_metric_used_by_id)
4479 CONNECT BY campaign_id = PRIOR PARENT_CAMPAIGN_ID
4480 UNION ALL
4481 SELECT event_offer_id obj_id, G_EONE obj_type, CURRENCY_CODE_TC currency
4482 FROM ams_event_offers_all_b
4483 WHERE event_offer_id = l_act_metric_used_by_id
4484 ORDER BY obj_type, obj_id;
4485
4486 CURSOR c_get_deliv (p_deliverable_id NUMBER) IS
4487 SELECT deliverable_id obj_id, G_DELV obj_type, transaction_currency_code currency
4488 FROM ams_deliverables_all_b
4489 WHERE deliverable_id = p_deliverable_id;
4490
4491 CURSOR c_get_act_list (p_act_list_header_id NUMBER) IS
4492 SELECT act_list_header_id obj_id, G_ALIST obj_type, Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY currency
4493 FROM ams_act_lists
4494 WHERE act_list_header_id = p_act_list_header_id;
4495
4496 /*** BUG2845365: Removed dialogue Components.
4497 CURSOR c_get_components(p_dialog_id NUMBER) IS
4498 SELECT dialog_id, G_DILG, NULL
4499 FROM AMS_DIALOGS_ALL_B
4500 WHERE dialog_id = p_dialog_id
4501 UNION ALL
4502 SELECT flow_component_id obj_id,component_type_code obj_type, NULL
4503 FROM ams_dlg_flow_comps_b
4504 WHERE dialog_id= p_dialog_id;
4505 ***** BUG2845365 *****/
4506
4507 l_obj_ids num_table_type;
4508 l_obj_types varchar2_table_type;
4509 l_obj_currencies currency_code_table_type;
4510 l_obj_item object_currency_type;
4511
4512 /***** NOT REQUIRED *****
4513 l_is_locked VARCHAR2(1);
4514 l_return_status VARCHAR2(1);
4515 l_msg_count NUMBER;
4516 l_msg_data VARCHAR2(2000);
4517 ****** NOT REQUIRED ****/
4518
4519 BEGIN
4520 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4521
4522 IF p_arc_act_metric_used_by = G_RCAM THEN
4523 OPEN c_get_program_family(p_act_metric_used_by_id);
4524 FETCH c_get_program_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4525 CLOSE c_get_program_family;
4526 ELSIF p_arc_act_metric_used_by = G_CAMP THEN
4527 OPEN c_get_campaign_family(p_act_metric_used_by_id);
4528 FETCH c_get_campaign_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4529 CLOSE c_get_campaign_family;
4530 ELSIF p_arc_act_metric_used_by = G_EVEH THEN
4531 OPEN c_get_event_family(p_act_metric_used_by_id);
4532 FETCH c_get_event_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4533 CLOSE c_get_event_family;
4534 ELSIF p_arc_act_metric_used_by = G_CSCH THEN
4535 OPEN c_get_csch_family(p_act_metric_used_by_id);
4536 FETCH c_get_csch_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4537 CLOSE c_get_csch_family;
4538 ELSIF p_arc_act_metric_used_by = G_EVEO THEN
4539 OPEN c_get_eveo_family(p_act_metric_used_by_id);
4540 FETCH c_get_eveo_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4541 CLOSE c_get_eveo_family;
4542 ELSIF p_arc_act_metric_used_by = G_EONE THEN
4543 OPEN c_get_eone_family(p_act_metric_used_by_id);
4544 FETCH c_get_eone_family BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4545 CLOSE c_get_eone_family;
4546 /***** BUG2845365: Removed Dialogue Components.
4547 ELSIF p_arc_act_metric_used_by = G_DILG THEN
4548 OPEN c_get_components(p_act_metric_used_by_id);
4549 FETCH c_get_components BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4550 CLOSE c_get_components;
4551 ****** BUG2845365 ******/
4552 ELSIF p_arc_act_metric_used_by = G_DELV THEN
4553 -- Use bulk collect as standard for this procedure
4554 -- in case deliverables implementation changes in
4555 -- the future.
4556 OPEN c_get_deliv (p_act_metric_used_by_id);
4557 FETCH c_get_deliv BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4558 CLOSE c_get_deliv;
4559 ELSIF p_arc_act_metric_used_by = G_ALIST THEN
4560 OPEN c_get_act_list (p_act_metric_used_by_id);
4561 FETCH c_get_act_list BULK COLLECT INTO l_obj_ids, l_obj_types, l_obj_currencies;
4562 CLOSE c_get_act_list;
4563 ELSE
4564 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4565 FND_MESSAGE.set_name('AMS', 'AMS_METR_INVALID_OBJECT');
4566 FND_MESSAGE.set_token('OBJTYPE', p_arc_act_metric_used_by);
4567 FND_MESSAGE.set_token('OBJID', p_act_metric_used_by_id);
4568 FND_MSG_PUB.add;
4569 END IF;
4570 x_return_status := Fnd_Api.G_RET_STS_ERROR;
4571 END IF;
4572
4573 IF x_return_status = Fnd_Api.G_RET_STS_SUCCESS
4574 AND l_obj_ids.count > 0 THEN
4575 FOR l_index IN l_obj_ids.first .. l_obj_ids.last
4576 LOOP
4577 l_obj_item.obj_id := l_obj_ids(l_index);
4578 l_obj_item.obj_type := l_obj_types(l_index);
4579 l_obj_item.currency := l_obj_currencies(l_index);
4580 /***** NOT REQUIRED *******
4581 ***** Locking is only required when created new metrics *****
4582 --Sunkumar Bug# 3106033
4583 IF l_obj_item.obj_id IS NOT NULL THEN
4584 l_is_locked := ams_actmetric_pvt.lock_object(
4585 p_api_version => 1 ,
4586 p_init_msg_list => Fnd_Api.G_FALSE,
4587 p_arc_act_metric_used_by => l_obj_item.obj_type,
4588 p_act_metric_used_by_id => l_obj_item.obj_id,
4589 x_return_status => l_return_status,
4590 x_msg_count => l_msg_count,
4591 x_msg_data => l_msg_data);
4592
4593 IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
4594 RAISE Fnd_Api.G_EXC_ERROR;
4595 ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
4596 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4597 elsif l_is_locked = FND_API.G_FALSE THEN
4598 -- the object needs to be lock by this process.
4599 RAISE ams_utility_pvt.resource_locked;
4600 END IF;
4601 END IF;
4602 ****** NOT REQUIRED *******/
4603
4604 x_object_list(l_index) := l_obj_item;
4605 END LOOP;
4606 END IF;
4607
4608 END GET_OBJECT_LIST;
4609
4610 PROCEDURE write_object_list(p_object_list in object_currency_table, p_output OUT NOCOPY varchar2 )
4611 IS
4612 BEGIN
4613 IF p_object_list.COUNT > 0 THEN
4614 FOR l_index IN p_object_list.FIRST..p_object_list.LAST
4615 LOOP
4616 p_output := p_output || p_object_list(l_index).obj_type
4617 ||'/'||p_object_list(l_index).obj_id||'/'||p_object_list(l_index).currency||'
4618 ';
4619 END LOOP;
4620 END IF;
4621 END;
4622
4623 /****** For development use only. Removed for production. ******
4624 PROCEDURE test_get_object_list(p_output out nocopy varchar2)
4625 IS
4626 l_object_list object_currency_table;
4627 l_return_status VARCHAR2(10);
4628 l_msg_count NUMBER;
4629 l_msg_data VARCHAR2(4000);
4630 l_RCAM_id NUMBER;
4631 l_camp_id number;
4632 l_csch_id number;
4633 l_eveh_id number;
4634 l_eveo_id number;
4635 l_eone_id number;
4636 l_output varchar2(4000);
4637 BEGIN
4638 SELECT campaign_id INTO l_RCAM_id FROM ams_campaigns_all_b
4639 WHERE rollup_type = G_RCAM
4640 AND parent_campaign_id IS NOT NULL
4641 AND ROWNUM = 1;
4642 Get_Object_List(G_RCAM,l_RCAM_id,
4643 l_return_status, l_msg_count, l_msg_data, l_object_list);
4644 p_output := 'RCAM count='||l_object_list.COUNT||'
4645 ';
4646 write_object_list(l_object_list,l_output);
4647 p_output := p_output || l_output;
4648 l_object_list.delete;
4649
4650 SELECT campaign_id into l_camp_id FROM ams_campaigns_all_b
4651 WHERE PARENT_CAMPAIGN_ID IS NOT NULL
4652 AND ROWNUM = 1;
4653 Get_Object_List(G_CAMP,l_camp_id,
4654 l_return_status, l_msg_count, l_msg_data, l_object_list);
4655 p_output := p_output || 'CAMP count='||l_object_list.COUNT||'
4656 ';
4657 write_object_list(l_object_list,l_output);
4658 p_output := p_output || l_output;
4659 l_object_list.delete;
4660
4661 SELECT schedule_id INTO l_csch_id FROM ams_campaign_schedules_b
4662 WHERE campaign_id IS NOT NULL
4663 AND ROWNUM = 1;
4664 Get_Object_List(G_CSCH,l_csch_id,
4665 l_return_status, l_msg_count, l_msg_data, l_object_list);
4666 p_output := p_output || 'CSCH count='||l_object_list.COUNT||'
4667 ';
4668 write_object_list(l_object_list,l_output);
4669 p_output := p_output || l_output;
4670 l_object_list.delete;
4671
4672 SELECT event_header_id INTO l_eveh_id FROM ams_event_headers_all_b
4673 WHERE PROGRAM_ID IS NOT NULL
4674 AND ROWNUM = 1;
4675 Get_Object_List(G_EVEH,l_eveh_id,
4676 l_return_status, l_msg_count, l_msg_data, l_object_list);
4677 p_output := p_output || 'EVEH count='||l_object_list.COUNT||'
4678 ';
4679 write_object_list(l_object_list,l_output);
4680 p_output := p_output || l_output;
4681 l_object_list.delete;
4682
4683 SELECT event_offer_id INTO l_eveo_id FROM ams_event_offers_all_b
4684 WHERE event_header_id IS NOT NULL
4685 AND ROWNUM = 1;
4686 Get_Object_List(G_EVEO,l_eveo_id,
4687 l_return_status, l_msg_count, l_msg_data, l_object_list);
4688 p_output := p_output || 'EVEO count='||l_object_list.COUNT||'
4689 ';
4690 write_object_list(l_object_list,l_output);
4691 p_output := p_output || l_output;
4692 l_object_list.delete;
4693
4694 SELECT event_offer_id INTO l_eone_id FROM ams_event_offers_all_b
4695 WHERE PARENT_ID IS NOT NULL
4696 AND ROWNUM = 1;
4697 Get_Object_List(G_EONE,l_eone_id,
4698 l_return_status, l_msg_count, l_msg_data, l_object_list);
4699 p_output := p_output || 'EONE count='||l_object_list.COUNT||'
4700 ';
4701 write_object_list(l_object_list,l_output);
4702 p_output := p_output || l_output;
4703 l_object_list.delete;
4704
4705 END test_get_object_list;
4706 ****** For development only. Removed for production. *******/
4707
4708
4709 -- NAME
4710 -- UPDATE_HISTORY
4711 --
4712 -- PURPOSE
4713 -- Record historical data for activity metrics.
4714 --
4715 -- NOTES
4716 --
4717 -- HISTORY
4718 -- 11/29/2001 DMVINCEN Created.
4719 -- 12/14/2001 DMVINCEN Added delta tracking.
4720 -- 02/06/2002 DMVINCEN BUG2214496: delta calculations fix.
4721 --
4722 PROCEDURE Update_History(p_commit IN VARCHAR2)
4723 IS
4724 L_API_NAME CONSTANT VARCHAR2(100) := 'UPDATE_HISTORY';
4725
4726 CURSOR c_get_act_metric_hst IS
4727 SELECT ACT_MET_HST_ID,
4728 a.ACTIVITY_METRIC_ID,
4729 a.LAST_UPDATE_DATE,
4730 a.LAST_UPDATED_BY,
4731 a.CREATION_DATE,
4732 a.CREATED_BY,
4733 a.LAST_UPDATE_LOGIN,
4734 a.OBJECT_VERSION_NUMBER,
4735 a.ACT_METRIC_USED_BY_ID,
4736 a.ARC_ACT_METRIC_USED_BY,
4737 a.APPLICATION_ID,
4738 a.METRIC_ID,
4739 a.TRANSACTION_CURRENCY_CODE,
4740 a.TRANS_FORECASTED_VALUE,
4741 a.TRANS_COMMITTED_VALUE,
4742 a.TRANS_ACTUAL_VALUE,
4743 a.FUNCTIONAL_CURRENCY_CODE,
4744 a.FUNC_FORECASTED_VALUE,
4745 a.FUNC_COMMITTED_VALUE,
4746 a.DIRTY_FLAG,
4747 a.FUNC_ACTUAL_VALUE,
4748 a.LAST_CALCULATED_DATE,
4749 a.VARIABLE_VALUE,
4750 a.COMPUTED_USING_FUNCTION_VALUE,
4751 a.METRIC_UOM_CODE,
4752 a.ORG_ID,
4753 a.DIFFERENCE_SINCE_LAST_CALC,
4754 a.ACTIVITY_METRIC_ORIGIN_ID,
4755 a.ARC_ACTIVITY_METRIC_ORIGIN,
4756 a.DAYS_SINCE_LAST_REFRESH,
4757 a.SUMMARIZE_TO_METRIC,
4758 a.ROLLUP_TO_METRIC,
4759 a.SCENARIO_ID,
4760 a.ATTRIBUTE_CATEGORY,
4761 a.ATTRIBUTE1,
4762 a.ATTRIBUTE2,
4763 a.ATTRIBUTE3,
4764 a.ATTRIBUTE4,
4765 a.ATTRIBUTE5,
4766 a.ATTRIBUTE6,
4767 a.ATTRIBUTE7,
4768 a.ATTRIBUTE8,
4769 a.ATTRIBUTE9,
4770 a.ATTRIBUTE10,
4771 a.ATTRIBUTE11,
4772 a.ATTRIBUTE12,
4773 a.ATTRIBUTE13,
4774 a.ATTRIBUTE14,
4775 a.ATTRIBUTE15,
4776 a.DESCRIPTION,
4777 a.ACT_METRIC_DATE,
4778 a.ARC_FUNCTION_USED_BY,
4779 a.FUNCTION_USED_BY_ID,
4780 a.PURCHASE_REQ_RAISED_FLAG,
4781 a.SENSITIVE_DATA_FLAG,
4782 a.BUDGET_ID,
4783 a.FORECASTED_VARIABLE_VALUE,
4784 a.HIERARCHY_ID,
4785 a.PUBLISHED_FLAG,
4786 a.PRE_FUNCTION_NAME,
4787 a.POST_FUNCTION_NAME,
4788 a.START_NODE,
4789 a.FROM_LEVEL,
4790 a.TO_LEVEL,
4791 a.FROM_DATE,
4792 a.TO_DATE,
4793 a.AMOUNT1,
4794 a.AMOUNT2,
4795 a.AMOUNT3,
4796 a.PERCENT1,
4797 a.PERCENT2,
4798 a.PERCENT3,
4799 a.STATUS_CODE,
4800 a.ACTION_CODE,
4801 a.METHOD_CODE,
4802 a.BASIS_YEAR,
4803 a.EX_START_NODE,
4804 a.HIERARCHY_TYPE,
4805 a.DEPEND_ACT_METRIC,
4806 b.FUNC_FORECASTED_DELTA,
4807 b.FUNC_ACTUAL_DELTA
4808 FROM ams_act_metrics_all a, ams_act_metric_hst b
4809 WHERE b.activity_metric_id = a.activity_metric_id
4810 AND trunc(a.last_update_date) = trunc(b.last_update_date)
4811 AND a.last_update_date > b.last_update_date
4812 AND b.last_update_date =
4813 (SELECT MAX(last_update_date)
4814 FROM ams_act_metric_hst c
4815 WHERE c.activity_metric_id = b.activity_metric_id)
4816 ;
4817
4818 l_ACT_MET_HST_ID num_table_type;
4819 l_ACTIVITY_METRIC_ID num_table_type;
4820 l_LAST_UPDATE_DATE date_table_type;
4821 l_LAST_UPDATED_BY num_table_type;
4822 l_CREATION_DATE date_table_type;
4823 l_CREATED_BY num_table_type;
4824 l_LAST_UPDATE_LOGIN num_table_type;
4825 l_OBJECT_VERSION_NUMBER num_table_type;
4826 l_ACT_METRIC_USED_BY_ID num_table_type;
4827 l_ARC_ACT_METRIC_USED_BY varchar2_table_type;
4828 l_APPLICATION_ID num_table_type;
4829 l_METRIC_ID num_table_type;
4830 l_TRANSACTION_CURRENCY_CODE varchar2_table_type;
4831 l_TRANS_FORECASTED_VALUE num_table_type;
4832 l_TRANS_COMMITTED_VALUE num_table_type;
4833 l_TRANS_ACTUAL_VALUE num_table_type;
4834 l_FUNCTIONAL_CURRENCY_CODE varchar2_table_type;
4835 l_FUNC_FORECASTED_VALUE num_table_type;
4836 l_FUNC_COMMITTED_VALUE num_table_type;
4837 l_DIRTY_FLAG varchar2_table_type;
4838 l_FUNC_ACTUAL_VALUE num_table_type;
4839 l_LAST_CALCULATED_DATE varchar2_table_type;
4840 l_VARIABLE_VALUE num_table_type;
4841 l_COMPUTED_USING_FUNCTION_VALU num_table_type;
4842 l_METRIC_UOM_CODE varchar2_table_type;
4843 l_ORG_ID num_table_type;
4844 l_DIFFERENCE_SINCE_LAST_CALC num_table_type;
4845 l_ACTIVITY_METRIC_ORIGIN_ID num_table_type;
4846 l_ARC_ACTIVITY_METRIC_ORIGIN varchar2_table_type;
4847 l_DAYS_SINCE_LAST_REFRESH num_table_type;
4848 l_SUMMARIZE_TO_METRIC num_table_type;
4849 l_ROLLUP_TO_METRIC num_table_type;
4850 l_SCENARIO_ID num_table_type;
4851 l_ATTRIBUTE_CATEGORY varchar2_table_type;
4852 l_ATTRIBUTE1 varchar2_table_type;
4853 l_ATTRIBUTE2 varchar2_table_type;
4854 l_ATTRIBUTE3 varchar2_table_type;
4855 l_ATTRIBUTE4 varchar2_table_type;
4856 l_ATTRIBUTE5 varchar2_table_type;
4857 l_ATTRIBUTE6 varchar2_table_type;
4858 l_ATTRIBUTE7 varchar2_table_type;
4859 l_ATTRIBUTE8 varchar2_table_type;
4860 l_ATTRIBUTE9 varchar2_table_type;
4861 l_ATTRIBUTE10 varchar2_table_type;
4862 l_ATTRIBUTE11 varchar2_table_type;
4863 l_ATTRIBUTE12 varchar2_table_type;
4864 l_ATTRIBUTE13 varchar2_table_type;
4865 l_ATTRIBUTE14 varchar2_table_type;
4866 l_ATTRIBUTE15 varchar2_table_type;
4867 -- l_SECURITY_GROUP_ID num_table_type;
4868 l_FUNC_FORECASTED_DELTA num_table_type;
4869 l_FUNC_ACTUAL_DELTA num_table_type;
4873 l_FUNCTION_USED_BY_ID num_table_type;
4870 l_DESCRIPTION varchar2_table_type;
4871 l_ACT_METRIC_DATE date_table_type;
4872 l_ARC_FUNCTION_USED_BY varchar2_table_type;
4874 l_PURCHASE_REQ_RAISED_FLAG varchar2_table_type;
4875 l_SENSITIVE_DATA_FLAG varchar2_table_type;
4876 l_BUDGET_ID num_table_type;
4877 l_FORECASTED_VARIABLE_VALUE num_table_type;
4878 l_HIERARCHY_ID num_table_type;
4879 l_PUBLISHED_FLAG varchar2_table_type;
4880 l_PRE_FUNCTION_NAME varchar2_table_type;
4881 l_POST_FUNCTION_NAME varchar2_table_type;
4882 l_START_NODE num_table_type;
4883 l_FROM_LEVEL num_table_type;
4884 l_TO_LEVEL num_table_type;
4885 l_FROM_DATE date_table_type;
4886 l_TO_DATE date_table_type;
4887 l_AMOUNT1 num_table_type;
4888 l_AMOUNT2 num_table_type;
4889 l_AMOUNT3 num_table_type;
4890 l_PERCENT1 num_table_type;
4891 l_PERCENT2 num_table_type;
4892 l_PERCENT3 num_table_type;
4893 l_STATUS_CODE varchar2_table_type;
4894 l_ACTION_CODE varchar2_table_type;
4895 l_METHOD_CODE varchar2_table_type;
4896 l_BASIS_YEAR num_table_type;
4897 l_EX_START_NODE varchar2_table_type;
4898 l_HIERARCHY_TYPE varchar2_table_type;
4899 l_DEPEND_ACT_METRIC num_table_type;
4900
4901 l_count NUMBER;
4902 l_count1 number;
4903 l_today DATE := SYSDATE;
4904
4905 CURSOR c_get_deleted_today IS
4906 SELECT act_met_hst_id
4907 FROM ams_act_metric_hst a
4908 WHERE NOT EXISTS (SELECT 'x' FROM ams_act_metrics_all b
4909 WHERE a.activity_metric_id = b.activity_metric_id)
4910 AND last_update_date =
4911 (SELECT MAX(c.last_update_date)
4912 FROM ams_act_metric_hst c
4913 WHERE c.activity_metric_id = a.activity_metric_id)
4914 AND trunc(last_update_date) = trunc(l_today)
4915 AND (NVL(func_actual_value,0) <> 0 OR NVL(func_forecasted_value,0) <> 0);
4916
4917 BEGIN
4918
4919 -- Create new history for items last updated prior to today.
4920 IF AMS_DEBUG_HIGH_ON THEN
4921 write_msg(L_API_NAME, 'BEGIN');
4922 END IF;
4923
4924 INSERT INTO ams_act_metric_hst
4925 (ACT_MET_HST_ID,
4926 ACTIVITY_METRIC_ID,
4927 LAST_UPDATE_DATE,
4928 LAST_UPDATED_BY,
4929 CREATION_DATE,
4930 CREATED_BY,
4931 LAST_UPDATE_LOGIN,
4932 OBJECT_VERSION_NUMBER,
4933 ACT_METRIC_USED_BY_ID,
4934 ARC_ACT_METRIC_USED_BY,
4935 APPLICATION_ID,
4936 METRIC_ID,
4937 TRANSACTION_CURRENCY_CODE,
4938 TRANS_FORECASTED_VALUE,
4939 TRANS_COMMITTED_VALUE,
4940 TRANS_ACTUAL_VALUE,
4941 FUNCTIONAL_CURRENCY_CODE,
4942 FUNC_FORECASTED_VALUE,
4943 FUNC_COMMITTED_VALUE,
4944 DIRTY_FLAG,
4945 FUNC_ACTUAL_VALUE,
4946 LAST_CALCULATED_DATE,
4947 VARIABLE_VALUE,
4948 COMPUTED_USING_FUNCTION_VALUE,
4949 METRIC_UOM_CODE,
4950 ORG_ID,
4951 DIFFERENCE_SINCE_LAST_CALC,
4952 ACTIVITY_METRIC_ORIGIN_ID,
4953 ARC_ACTIVITY_METRIC_ORIGIN,
4954 DAYS_SINCE_LAST_REFRESH,
4955 SUMMARIZE_TO_METRIC,
4956 ROLLUP_TO_METRIC,
4957 SCENARIO_ID,
4958 ATTRIBUTE_CATEGORY,
4959 ATTRIBUTE1,
4960 ATTRIBUTE2,
4961 ATTRIBUTE3,
4962 ATTRIBUTE4,
4963 ATTRIBUTE5,
4964 ATTRIBUTE6,
4965 ATTRIBUTE7,
4966 ATTRIBUTE8,
4967 ATTRIBUTE9,
4968 ATTRIBUTE10,
4969 ATTRIBUTE11,
4970 ATTRIBUTE12,
4971 ATTRIBUTE13,
4972 ATTRIBUTE14,
4973 ATTRIBUTE15,
4974 DESCRIPTION,
4975 ACT_METRIC_DATE,
4976 ARC_FUNCTION_USED_BY,
4977 FUNCTION_USED_BY_ID,
4978 PURCHASE_REQ_RAISED_FLAG,
4979 SENSITIVE_DATA_FLAG,
4980 BUDGET_ID,
4981 FORECASTED_VARIABLE_VALUE,
4982 HIERARCHY_ID,
4983 PUBLISHED_FLAG,
4984 PRE_FUNCTION_NAME,
4985 POST_FUNCTION_NAME,
4986 START_NODE,
4987 FROM_LEVEL,
4988 TO_LEVEL,
4989 FROM_DATE,
4990 TO_DATE,
4991 AMOUNT1,
4992 AMOUNT2,
4993 AMOUNT3,
4994 PERCENT1,
4995 PERCENT2,
4996 PERCENT3,
4997 STATUS_CODE,
4998 ACTION_CODE,
4999 METHOD_CODE,
5000 BASIS_YEAR,
5001 EX_START_NODE,
5002 HIERARCHY_TYPE,
5003 DEPEND_ACT_METRIC,
5004 FUNC_FORECASTED_DELTA,
5005 FUNC_ACTUAL_DELTA)
5006 SELECT AMS_ACT_METRIC_HST_S.NEXTVAL,
5007 a.ACTIVITY_METRIC_ID,
5008 a.LAST_UPDATE_DATE,
5009 a.LAST_UPDATED_BY,
5010 a.CREATION_DATE,
5011 a.CREATED_BY,
5012 a.LAST_UPDATE_LOGIN,
5013 a.OBJECT_VERSION_NUMBER,
5014 a.ACT_METRIC_USED_BY_ID,
5015 a.ARC_ACT_METRIC_USED_BY,
5016 a.APPLICATION_ID,
5017 a.METRIC_ID,
5018 a.TRANSACTION_CURRENCY_CODE,
5019 a.TRANS_FORECASTED_VALUE,
5020 a.TRANS_COMMITTED_VALUE,
5024 a.FUNC_COMMITTED_VALUE,
5021 a.TRANS_ACTUAL_VALUE,
5022 a.FUNCTIONAL_CURRENCY_CODE,
5023 a.FUNC_FORECASTED_VALUE,
5025 a.DIRTY_FLAG,
5026 a.FUNC_ACTUAL_VALUE,
5027 a.LAST_CALCULATED_DATE,
5028 a.VARIABLE_VALUE,
5029 a.COMPUTED_USING_FUNCTION_VALUE,
5030 a.METRIC_UOM_CODE,
5031 a.ORG_ID,
5032 a.DIFFERENCE_SINCE_LAST_CALC,
5033 a.ACTIVITY_METRIC_ORIGIN_ID,
5034 a.ARC_ACTIVITY_METRIC_ORIGIN,
5035 a.DAYS_SINCE_LAST_REFRESH,
5036 a.SUMMARIZE_TO_METRIC,
5037 a.ROLLUP_TO_METRIC,
5038 a.SCENARIO_ID,
5039 a.ATTRIBUTE_CATEGORY,
5040 a.ATTRIBUTE1,
5041 a.ATTRIBUTE2,
5042 a.ATTRIBUTE3,
5043 a.ATTRIBUTE4,
5044 a.ATTRIBUTE5,
5045 a.ATTRIBUTE6,
5046 a.ATTRIBUTE7,
5047 a.ATTRIBUTE8,
5048 a.ATTRIBUTE9,
5049 a.ATTRIBUTE10,
5050 a.ATTRIBUTE11,
5051 a.ATTRIBUTE12,
5052 a.ATTRIBUTE13,
5053 a.ATTRIBUTE14,
5054 a.ATTRIBUTE15,
5055 a.DESCRIPTION,
5056 a.ACT_METRIC_DATE,
5057 a.ARC_FUNCTION_USED_BY,
5058 a.FUNCTION_USED_BY_ID,
5059 a.PURCHASE_REQ_RAISED_FLAG,
5060 a.SENSITIVE_DATA_FLAG,
5061 a.BUDGET_ID,
5062 a.FORECASTED_VARIABLE_VALUE,
5063 a.HIERARCHY_ID,
5064 a.PUBLISHED_FLAG,
5065 a.PRE_FUNCTION_NAME,
5066 a.POST_FUNCTION_NAME,
5067 a.START_NODE,
5068 a.FROM_LEVEL,
5069 a.TO_LEVEL,
5070 a.FROM_DATE,
5071 a.TO_DATE,
5072 a.AMOUNT1,
5073 a.AMOUNT2,
5074 a.AMOUNT3,
5075 a.PERCENT1,
5076 a.PERCENT2,
5077 a.PERCENT3,
5078 a.STATUS_CODE,
5079 a.ACTION_CODE,
5080 a.METHOD_CODE,
5081 a.BASIS_YEAR,
5082 a.EX_START_NODE,
5083 a.HIERARCHY_TYPE,
5084 a.DEPEND_ACT_METRIC,
5085 NVL(a.FUNC_FORECASTED_VALUE,0) - NVL(b.FUNC_FORECASTED_VALUE,0),
5086 NVL(a.FUNC_ACTUAL_VALUE,0) - NVL(b.FUNC_ACTUAL_VALUE,0)
5087 FROM ams_act_metrics_all a, ams_act_metric_hst b
5088 WHERE a.activity_metric_id = b.activity_metric_id
5089 AND b.last_update_date =
5090 (SELECT MAX(last_update_date)
5091 FROM ams_act_metric_hst c
5092 WHERE c.activity_metric_id = a.activity_metric_id)
5093 AND TRUNC(a.last_update_date) > TRUNC(b.last_update_date)
5094 ;
5095 IF AMS_DEBUG_HIGH_ON THEN
5096 write_msg(L_API_NAME, 'INSERTED EXISTING METRICS: '||SQL%ROWCOUNT);
5097 END IF;
5098
5099 IF SQL%ROWCOUNT > 0 AND p_commit = FND_API.G_TRUE THEN
5100 COMMIT;
5101 IF AMS_DEBUG_HIGH_ON THEN
5102 write_msg(L_API_NAME, 'COMMIT');
5103 END IF;
5104 END IF;
5105
5106
5107 -- Insert new activity metrics.
5108 INSERT INTO ams_act_metric_hst
5109 (ACT_MET_HST_ID,
5110 ACTIVITY_METRIC_ID,
5111 LAST_UPDATE_DATE,
5112 LAST_UPDATED_BY,
5113 CREATION_DATE,
5114 CREATED_BY,
5115 LAST_UPDATE_LOGIN,
5116 OBJECT_VERSION_NUMBER,
5117 ACT_METRIC_USED_BY_ID,
5118 ARC_ACT_METRIC_USED_BY,
5119 APPLICATION_ID,
5120 METRIC_ID,
5121 TRANSACTION_CURRENCY_CODE,
5122 TRANS_FORECASTED_VALUE,
5123 TRANS_COMMITTED_VALUE,
5124 TRANS_ACTUAL_VALUE,
5125 FUNCTIONAL_CURRENCY_CODE,
5126 FUNC_FORECASTED_VALUE,
5127 FUNC_COMMITTED_VALUE,
5128 DIRTY_FLAG,
5129 FUNC_ACTUAL_VALUE,
5130 LAST_CALCULATED_DATE,
5131 VARIABLE_VALUE,
5132 COMPUTED_USING_FUNCTION_VALUE,
5133 METRIC_UOM_CODE,
5134 ORG_ID,
5135 DIFFERENCE_SINCE_LAST_CALC,
5136 ACTIVITY_METRIC_ORIGIN_ID,
5137 ARC_ACTIVITY_METRIC_ORIGIN,
5138 DAYS_SINCE_LAST_REFRESH,
5139 SUMMARIZE_TO_METRIC,
5140 ROLLUP_TO_METRIC,
5141 SCENARIO_ID,
5142 ATTRIBUTE_CATEGORY,
5143 ATTRIBUTE1,
5144 ATTRIBUTE2,
5145 ATTRIBUTE3,
5146 ATTRIBUTE4,
5147 ATTRIBUTE5,
5148 ATTRIBUTE6,
5149 ATTRIBUTE7,
5150 ATTRIBUTE8,
5151 ATTRIBUTE9,
5152 ATTRIBUTE10,
5153 ATTRIBUTE11,
5154 ATTRIBUTE12,
5155 ATTRIBUTE13,
5156 ATTRIBUTE14,
5157 ATTRIBUTE15,
5158 DESCRIPTION,
5159 ACT_METRIC_DATE,
5160 ARC_FUNCTION_USED_BY,
5161 FUNCTION_USED_BY_ID,
5162 PURCHASE_REQ_RAISED_FLAG,
5163 SENSITIVE_DATA_FLAG,
5164 BUDGET_ID,
5165 FORECASTED_VARIABLE_VALUE,
5166 HIERARCHY_ID,
5167 PUBLISHED_FLAG,
5168 PRE_FUNCTION_NAME,
5169 POST_FUNCTION_NAME,
5170 START_NODE,
5171 FROM_LEVEL,
5172 TO_LEVEL,
5173 FROM_DATE,
5174 TO_DATE,
5175 AMOUNT1,
5176 AMOUNT2,
5177 AMOUNT3,
5178 PERCENT1,
5179 PERCENT2,
5180 PERCENT3,
5181 STATUS_CODE,
5185 EX_START_NODE,
5182 ACTION_CODE,
5183 METHOD_CODE,
5184 BASIS_YEAR,
5186 HIERARCHY_TYPE,
5187 DEPEND_ACT_METRIC,
5188 FUNC_FORECASTED_DELTA,
5189 FUNC_ACTUAL_DELTA)
5190 SELECT AMS_ACT_METRIC_HST_S.NEXTVAL,
5191 a.ACTIVITY_METRIC_ID,
5192 a.LAST_UPDATE_DATE,
5193 a.LAST_UPDATED_BY,
5194 a.CREATION_DATE,
5195 a.CREATED_BY,
5196 a.LAST_UPDATE_LOGIN,
5197 a.OBJECT_VERSION_NUMBER,
5198 a.ACT_METRIC_USED_BY_ID,
5199 a.ARC_ACT_METRIC_USED_BY,
5200 a.APPLICATION_ID,
5201 a.METRIC_ID,
5202 a.TRANSACTION_CURRENCY_CODE,
5203 a.TRANS_FORECASTED_VALUE,
5204 a.TRANS_COMMITTED_VALUE,
5205 a.TRANS_ACTUAL_VALUE,
5206 a.FUNCTIONAL_CURRENCY_CODE,
5207 a.FUNC_FORECASTED_VALUE,
5208 a.FUNC_COMMITTED_VALUE,
5209 a.DIRTY_FLAG,
5210 a.FUNC_ACTUAL_VALUE,
5211 a.LAST_CALCULATED_DATE,
5212 a.VARIABLE_VALUE,
5213 a.COMPUTED_USING_FUNCTION_VALUE,
5214 a.METRIC_UOM_CODE,
5215 a.ORG_ID,
5216 a.DIFFERENCE_SINCE_LAST_CALC,
5217 a.ACTIVITY_METRIC_ORIGIN_ID,
5218 a.ARC_ACTIVITY_METRIC_ORIGIN,
5219 a.DAYS_SINCE_LAST_REFRESH,
5220 a.SUMMARIZE_TO_METRIC,
5221 a.ROLLUP_TO_METRIC,
5222 a.SCENARIO_ID,
5223 a.ATTRIBUTE_CATEGORY,
5224 a.ATTRIBUTE1,
5225 a.ATTRIBUTE2,
5226 a.ATTRIBUTE3,
5227 a.ATTRIBUTE4,
5228 a.ATTRIBUTE5,
5229 a.ATTRIBUTE6,
5230 a.ATTRIBUTE7,
5231 a.ATTRIBUTE8,
5232 a.ATTRIBUTE9,
5233 a.ATTRIBUTE10,
5234 a.ATTRIBUTE11,
5235 a.ATTRIBUTE12,
5236 a.ATTRIBUTE13,
5237 a.ATTRIBUTE14,
5238 a.ATTRIBUTE15,
5239 a.DESCRIPTION,
5240 a.ACT_METRIC_DATE,
5241 a.ARC_FUNCTION_USED_BY,
5242 a.FUNCTION_USED_BY_ID,
5243 a.PURCHASE_REQ_RAISED_FLAG,
5244 a.SENSITIVE_DATA_FLAG,
5245 a.BUDGET_ID,
5246 a.FORECASTED_VARIABLE_VALUE,
5247 a.HIERARCHY_ID,
5248 a.PUBLISHED_FLAG,
5249 a.PRE_FUNCTION_NAME,
5250 a.POST_FUNCTION_NAME,
5251 a.START_NODE,
5252 a.FROM_LEVEL,
5253 a.TO_LEVEL,
5254 a.FROM_DATE,
5255 a.TO_DATE,
5256 a.AMOUNT1,
5257 a.AMOUNT2,
5258 a.AMOUNT3,
5259 a.PERCENT1,
5260 a.PERCENT2,
5261 a.PERCENT3,
5262 a.STATUS_CODE,
5263 a.ACTION_CODE,
5264 a.METHOD_CODE,
5265 a.BASIS_YEAR,
5266 a.EX_START_NODE,
5267 a.HIERARCHY_TYPE,
5268 a.DEPEND_ACT_METRIC,
5269 -- BUG2214496: Initialize to original value.
5270 a.FUNC_FORECASTED_VALUE,
5271 a.FUNC_ACTUAL_VALUE
5272 FROM ams_act_metrics_all a
5273 WHERE NOT EXISTS (SELECT 'x' FROM ams_act_metric_hst b
5274 WHERE a.activity_metric_id = b.activity_metric_id);
5275 IF AMS_DEBUG_HIGH_ON THEN
5276 write_msg(L_API_NAME, 'INSERTED new metrics: '|| SQL%ROWCOUNT);
5277 END IF;
5278
5279 IF SQL%ROWCOUNT > 0 AND p_commit = FND_API.G_TRUE THEN
5280 COMMIT;
5281 IF AMS_DEBUG_HIGH_ON THEN
5282 write_msg(L_API_NAME, 'COMMIT');
5283 END IF;
5284 END IF;
5285
5286 -- Collect all items last recorded today but values have been updated again.
5287 OPEN c_get_act_metric_hst;
5288 FETCH c_get_act_metric_hst
5289 BULK COLLECT INTO
5290 l_ACT_MET_HST_ID,
5291 l_ACTIVITY_METRIC_ID,
5292 l_LAST_UPDATE_DATE,
5293 l_LAST_UPDATED_BY,
5294 l_CREATION_DATE,
5295 l_CREATED_BY,
5296 l_LAST_UPDATE_LOGIN,
5297 l_OBJECT_VERSION_NUMBER,
5298 l_ACT_METRIC_USED_BY_ID,
5299 l_ARC_ACT_METRIC_USED_BY,
5300 l_APPLICATION_ID,
5301 l_METRIC_ID,
5302 l_TRANSACTION_CURRENCY_CODE,
5303 l_TRANS_FORECASTED_VALUE,
5304 l_TRANS_COMMITTED_VALUE,
5305 l_TRANS_ACTUAL_VALUE,
5306 l_FUNCTIONAL_CURRENCY_CODE,
5307 l_FUNC_FORECASTED_VALUE,
5308 l_FUNC_COMMITTED_VALUE,
5309 l_DIRTY_FLAG,
5310 l_FUNC_ACTUAL_VALUE,
5311 l_LAST_CALCULATED_DATE,
5312 l_VARIABLE_VALUE,
5313 l_COMPUTED_USING_FUNCTION_VALU,
5314 l_METRIC_UOM_CODE,
5315 l_ORG_ID,
5316 l_DIFFERENCE_SINCE_LAST_CALC,
5317 l_ACTIVITY_METRIC_ORIGIN_ID,
5318 l_ARC_ACTIVITY_METRIC_ORIGIN,
5319 l_DAYS_SINCE_LAST_REFRESH,
5320 l_SUMMARIZE_TO_METRIC,
5321 l_ROLLUP_TO_METRIC,
5322 l_SCENARIO_ID,
5323 l_ATTRIBUTE_CATEGORY,
5324 l_ATTRIBUTE1,
5325 l_ATTRIBUTE2,
5326 l_ATTRIBUTE3,
5327 l_ATTRIBUTE4,
5328 l_ATTRIBUTE5,
5329 l_ATTRIBUTE6,
5330 l_ATTRIBUTE7,
5331 l_ATTRIBUTE8,
5332 l_ATTRIBUTE9,
5333 l_ATTRIBUTE10,
5334 l_ATTRIBUTE11,
5335 l_ATTRIBUTE12,
5336 l_ATTRIBUTE13,
5337 l_ATTRIBUTE14,
5338 l_ATTRIBUTE15,
5339 l_DESCRIPTION,
5340 l_ACT_METRIC_DATE,
5344 l_SENSITIVE_DATA_FLAG,
5341 l_ARC_FUNCTION_USED_BY,
5342 l_FUNCTION_USED_BY_ID,
5343 l_PURCHASE_REQ_RAISED_FLAG,
5345 l_BUDGET_ID,
5346 l_FORECASTED_VARIABLE_VALUE,
5347 l_HIERARCHY_ID,
5348 l_PUBLISHED_FLAG,
5349 l_PRE_FUNCTION_NAME,
5350 l_POST_FUNCTION_NAME,
5351 l_START_NODE,
5352 l_FROM_LEVEL,
5353 l_TO_LEVEL,
5354 l_FROM_DATE,
5355 l_TO_DATE,
5356 l_AMOUNT1,
5357 l_AMOUNT2,
5358 l_AMOUNT3,
5359 l_PERCENT1,
5360 l_PERCENT2,
5361 l_PERCENT3,
5362 l_STATUS_CODE,
5363 l_ACTION_CODE,
5364 l_METHOD_CODE,
5365 l_BASIS_YEAR,
5366 l_EX_START_NODE,
5367 l_HIERARCHY_TYPE,
5368 l_DEPEND_ACT_METRIC,
5369 l_FUNC_FORECASTED_DELTA,
5370 l_FUNC_ACTUAL_DELTA;
5371 CLOSE c_get_act_metric_hst;
5372
5373 IF AMS_DEBUG_HIGH_ON THEN
5374 write_msg(L_API_NAME,'UPDATE repeat updates selected: '||l_act_met_hst_id.COUNT);
5375 END IF;
5376
5377 -- If any items returned, bulk update.
5378 IF l_ACT_MET_HST_ID.COUNT > 0 THEN
5379
5380 FORALL l_count IN l_ACT_MET_HST_ID.FIRST .. l_ACT_MET_HST_ID.LAST
5381 UPDATE ams_act_metric_hst
5382 SET LAST_UPDATE_DATE = l_LAST_UPDATE_DATE(l_count),
5383 LAST_UPDATED_BY = l_LAST_UPDATED_BY(l_count),
5384 CREATION_DATE = l_CREATION_DATE(l_count),
5385 CREATED_BY = l_CREATED_BY(l_count),
5386 LAST_UPDATE_LOGIN = l_LAST_UPDATE_LOGIN(l_count),
5387 OBJECT_VERSION_NUMBER = l_OBJECT_VERSION_NUMBER(l_count),
5388 ACT_METRIC_USED_BY_ID = l_ACT_METRIC_USED_BY_ID(l_count),
5389 ARC_ACT_METRIC_USED_BY = l_ARC_ACT_METRIC_USED_BY(l_count),
5390 APPLICATION_ID = l_APPLICATION_ID(l_count),
5391 METRIC_ID = l_METRIC_ID(l_count),
5392 TRANSACTION_CURRENCY_CODE = l_TRANSACTION_CURRENCY_CODE(l_count),
5393 TRANS_FORECASTED_VALUE = l_TRANS_FORECASTED_VALUE(l_count),
5394 TRANS_COMMITTED_VALUE = l_TRANS_COMMITTED_VALUE(l_count),
5395 TRANS_ACTUAL_VALUE = l_TRANS_ACTUAL_VALUE(l_count),
5396 FUNCTIONAL_CURRENCY_CODE = l_FUNCTIONAL_CURRENCY_CODE(l_count),
5397 FUNC_FORECASTED_VALUE = l_FUNC_FORECASTED_VALUE(l_count),
5398 FUNC_COMMITTED_VALUE = l_FUNC_COMMITTED_VALUE(l_count),
5399 DIRTY_FLAG = l_DIRTY_FLAG(l_count),
5400 FUNC_ACTUAL_VALUE = l_FUNC_ACTUAL_VALUE(l_count),
5401 LAST_CALCULATED_DATE = l_LAST_CALCULATED_DATE(l_count),
5402 VARIABLE_VALUE = l_VARIABLE_VALUE(l_count),
5403 COMPUTED_USING_FUNCTION_VALUE = l_COMPUTED_USING_FUNCTION_VALU(l_count),
5404 METRIC_UOM_CODE = l_METRIC_UOM_CODE(l_count),
5405 ORG_ID = l_ORG_ID(l_count),
5406 DIFFERENCE_SINCE_LAST_CALC = l_DIFFERENCE_SINCE_LAST_CALC(l_count),
5407 ACTIVITY_METRIC_ORIGIN_ID = l_ACTIVITY_METRIC_ORIGIN_ID(l_count),
5408 ARC_ACTIVITY_METRIC_ORIGIN = l_ARC_ACTIVITY_METRIC_ORIGIN(l_count),
5409 DAYS_SINCE_LAST_REFRESH = l_DAYS_SINCE_LAST_REFRESH(l_count),
5410 SUMMARIZE_TO_METRIC = l_SUMMARIZE_TO_METRIC(l_count),
5411 ROLLUP_TO_METRIC = l_ROLLUP_TO_METRIC(l_count),
5412 SCENARIO_ID = l_SCENARIO_ID(l_count),
5413 ATTRIBUTE_CATEGORY = l_ATTRIBUTE_CATEGORY(l_count),
5414 ATTRIBUTE1 = l_ATTRIBUTE1(l_count),
5415 ATTRIBUTE2 = l_ATTRIBUTE2(l_count),
5416 ATTRIBUTE3 = l_ATTRIBUTE3(l_count),
5417 ATTRIBUTE4 = l_ATTRIBUTE4(l_count),
5418 ATTRIBUTE5 = l_ATTRIBUTE5(l_count),
5419 ATTRIBUTE6 = l_ATTRIBUTE6(l_count),
5420 ATTRIBUTE7 = l_ATTRIBUTE7(l_count),
5421 ATTRIBUTE8 = l_ATTRIBUTE8(l_count),
5422 ATTRIBUTE9 = l_ATTRIBUTE9(l_count),
5423 ATTRIBUTE10 = l_ATTRIBUTE10(l_count),
5424 ATTRIBUTE11 = l_ATTRIBUTE11(l_count),
5425 ATTRIBUTE12 = l_ATTRIBUTE12(l_count),
5426 ATTRIBUTE13 = l_ATTRIBUTE13(l_count),
5427 ATTRIBUTE14 = l_ATTRIBUTE14(l_count),
5428 ATTRIBUTE15 = l_ATTRIBUTE15(l_count),
5429 DESCRIPTION = l_DESCRIPTION(l_count),
5430 ACT_METRIC_DATE = l_ACT_METRIC_DATE(l_count),
5431 ARC_FUNCTION_USED_BY = l_ARC_FUNCTION_USED_BY(l_count),
5432 FUNCTION_USED_BY_ID = l_FUNCTION_USED_BY_ID(l_count),
5433 PURCHASE_REQ_RAISED_FLAG = l_PURCHASE_REQ_RAISED_FLAG(l_count),
5434 SENSITIVE_DATA_FLAG = l_SENSITIVE_DATA_FLAG(l_count),
5435 BUDGET_ID = l_BUDGET_ID(l_count),
5436 FORECASTED_VARIABLE_VALUE = l_FORECASTED_VARIABLE_VALUE(l_count),
5437 HIERARCHY_ID = l_HIERARCHY_ID(l_count),
5438 PUBLISHED_FLAG = l_PUBLISHED_FLAG(l_count),
5439 PRE_FUNCTION_NAME = l_PRE_FUNCTION_NAME(l_count),
5440 POST_FUNCTION_NAME = l_POST_FUNCTION_NAME(l_count),
5441 START_NODE = l_START_NODE(l_count),
5442 FROM_LEVEL = l_FROM_LEVEL(l_count),
5443 TO_LEVEL = l_TO_LEVEL(l_count),
5444 FROM_DATE = l_FROM_DATE(l_count),
5445 TO_DATE = l_TO_DATE(l_count),
5446 AMOUNT1 = l_AMOUNT1(l_count),
5447 AMOUNT2 = l_AMOUNT2(l_count),
5448 AMOUNT3 = l_AMOUNT3(l_count),
5449 PERCENT1 = l_PERCENT1(l_count),
5450 PERCENT2 = l_PERCENT2(l_count),
5451 PERCENT3 = l_PERCENT3(l_count),
5452 STATUS_CODE = l_STATUS_CODE(l_count),
5453 ACTION_CODE = l_ACTION_CODE(l_count),
5457 HIERARCHY_TYPE = l_HIERARCHY_TYPE(l_count),
5454 METHOD_CODE = l_METHOD_CODE(l_count),
5455 BASIS_YEAR = l_BASIS_YEAR(l_count),
5456 EX_START_NODE = l_EX_START_NODE(l_count),
5458 DEPEND_ACT_METRIC = l_DEPEND_ACT_METRIC(l_count),
5459 -- BUG2214496: Wrap values with NVL.
5460 FUNC_FORECASTED_DELTA = NVL(l_FUNC_FORECASTED_DELTA(l_count),0) +
5461 NVL(l_FUNC_FORECASTED_VALUE(l_count),0) -
5462 NVL(FUNC_FORECASTED_VALUE,0),
5463 FUNC_ACTUAL_DELTA = NVL(l_FUNC_ACTUAL_DELTA(l_count),0) +
5464 NVL(l_FUNC_ACTUAL_VALUE(l_count),0) -
5465 NVL(FUNC_ACTUAL_VALUE,0)
5466 WHERE act_met_hst_id = l_ACT_MET_HST_ID(l_count);
5467
5468 l_ACT_MET_HST_ID.delete;
5469 l_ACTIVITY_METRIC_ID.delete;
5470 l_LAST_UPDATE_DATE.delete;
5471 l_LAST_UPDATED_BY.delete;
5472 l_CREATION_DATE.delete;
5473 l_CREATED_BY.delete;
5474 l_LAST_UPDATE_LOGIN.delete;
5475 l_OBJECT_VERSION_NUMBER.delete;
5476 l_ACT_METRIC_USED_BY_ID.delete;
5477 l_ARC_ACT_METRIC_USED_BY.delete;
5478 l_APPLICATION_ID.delete;
5479 l_METRIC_ID.delete;
5480 l_TRANSACTION_CURRENCY_CODE.delete;
5481 l_TRANS_FORECASTED_VALUE.delete;
5482 l_TRANS_COMMITTED_VALUE.delete;
5483 l_TRANS_ACTUAL_VALUE.delete;
5484 l_FUNCTIONAL_CURRENCY_CODE.delete;
5485 l_FUNC_FORECASTED_VALUE.delete;
5486 l_FUNC_COMMITTED_VALUE.delete;
5487 l_DIRTY_FLAG.delete;
5488 l_FUNC_ACTUAL_VALUE.delete;
5489 l_LAST_CALCULATED_DATE.delete;
5490 l_VARIABLE_VALUE.delete;
5491 l_COMPUTED_USING_FUNCTION_VALU.delete;
5492 l_METRIC_UOM_CODE.delete;
5493 l_ORG_ID.delete;
5494 l_DIFFERENCE_SINCE_LAST_CALC.delete;
5495 l_ACTIVITY_METRIC_ORIGIN_ID.delete;
5496 l_ARC_ACTIVITY_METRIC_ORIGIN.delete;
5497 l_DAYS_SINCE_LAST_REFRESH.delete;
5498 l_SUMMARIZE_TO_METRIC.delete;
5499 l_ROLLUP_TO_METRIC.delete;
5500 l_SCENARIO_ID.delete;
5501 l_ATTRIBUTE_CATEGORY.delete;
5502 l_ATTRIBUTE1.delete;
5503 l_ATTRIBUTE2.delete;
5504 l_ATTRIBUTE3.delete;
5505 l_ATTRIBUTE4.delete;
5506 l_ATTRIBUTE5.delete;
5507 l_ATTRIBUTE6.delete;
5508 l_ATTRIBUTE7.delete;
5509 l_ATTRIBUTE8.delete;
5510 l_ATTRIBUTE9.delete;
5511 l_ATTRIBUTE10.delete;
5512 l_ATTRIBUTE11.delete;
5513 l_ATTRIBUTE12.delete;
5514 l_ATTRIBUTE13.delete;
5515 l_ATTRIBUTE14.delete;
5516 l_ATTRIBUTE15.delete;
5517 l_DESCRIPTION.delete;
5518 l_ACT_METRIC_DATE.delete;
5519 l_ARC_FUNCTION_USED_BY.delete;
5520 l_FUNCTION_USED_BY_ID.delete;
5521 l_PURCHASE_REQ_RAISED_FLAG.delete;
5522 l_SENSITIVE_DATA_FLAG.delete;
5523 l_BUDGET_ID.delete;
5524 l_FORECASTED_VARIABLE_VALUE.delete;
5525 l_HIERARCHY_ID.delete;
5526 l_PUBLISHED_FLAG.delete;
5527 l_PRE_FUNCTION_NAME.delete;
5528 l_POST_FUNCTION_NAME.delete;
5529 l_START_NODE.delete;
5530 l_FROM_LEVEL.delete;
5531 l_TO_LEVEL.delete;
5532 l_FROM_DATE.delete;
5533 l_TO_DATE.delete;
5534 l_AMOUNT1.delete;
5535 l_AMOUNT2.delete;
5536 l_AMOUNT3.delete;
5537 l_PERCENT1.delete;
5538 l_PERCENT2.delete;
5539 l_PERCENT3.delete;
5540 l_STATUS_CODE.delete;
5541 l_ACTION_CODE.delete;
5542 l_METHOD_CODE.delete;
5543 l_BASIS_YEAR.delete;
5544 l_EX_START_NODE.delete;
5545 l_HIERARCHY_TYPE.delete;
5546 l_DEPEND_ACT_METRIC.delete;
5547 l_FUNC_FORECASTED_DELTA.DELETE;
5548 l_FUNC_ACTUAL_DELTA.DELETE;
5549 END IF;
5550
5551 IF AMS_DEBUG_HIGH_ON THEN
5552 write_msg(L_API_NAME, 'UPDATED repeat updates: count='||SQL%ROWCOUNT);
5553 END IF;
5554
5555 IF SQL%ROWCOUNT > 0 AND p_commit = FND_API.G_TRUE THEN
5556 COMMIT;
5557 IF AMS_DEBUG_HIGH_ON THEN
5558 write_msg(L_API_NAME, 'COMMIT');
5559 END IF;
5560 END IF;
5561
5562 OPEN c_get_deleted_today;
5563 FETCH c_get_deleted_today
5564 BULK COLLECT INTO l_ACT_MET_HST_ID;
5565 CLOSE c_get_deleted_today;
5566
5567 IF AMS_DEBUG_HIGH_ON THEN
5568 write_msg(L_API_NAME, 'Deleted before today selected: '||l_ACT_MET_HST_ID.COUNT);
5569 END IF;
5570
5571 IF l_ACT_MET_HST_ID.COUNT > 0 THEN
5572 FORALL l_count IN l_ACT_MET_HST_ID.FIRST .. l_ACT_MET_HST_ID.LAST
5573 UPDATE ams_act_metric_hst
5574 SET LAST_UPDATE_DATE = SYSDATE,
5575 TRANS_FORECASTED_VALUE = 0,
5576 TRANS_COMMITTED_VALUE = 0,
5577 TRANS_ACTUAL_VALUE = 0,
5578 FUNC_FORECASTED_VALUE = 0,
5579 FUNC_COMMITTED_VALUE = 0,
5580 FUNC_ACTUAL_VALUE = 0,
5581 -- BUG2214496: Wrap values with NVL.
5582 FUNC_FORECASTED_DELTA = NVL(FUNC_FORECASTED_DELTA,0) -
5583 NVL(FUNC_FORECASTED_VALUE,0),
5584 FUNC_ACTUAL_DELTA = NVL(FUNC_ACTUAL_DELTA,0) -
5585 NVL(FUNC_ACTUAL_VALUE,0)
5586 WHERE act_met_hst_id = l_ACT_MET_HST_ID(l_count);
5590
5587 l_ACT_MET_HST_ID.DELETE;
5588
5589 END IF;
5591 IF AMS_DEBUG_HIGH_ON THEN
5592 write_msg(L_API_NAME, 'Deleted today UPDATED: '||SQL%ROWCOUNT);
5593 END IF;
5594
5595 IF SQL%ROWCOUNT > 0 AND p_commit = FND_API.G_TRUE THEN
5596 COMMIT;
5597 IF AMS_DEBUG_HIGH_ON THEN
5598 write_msg(L_API_NAME, 'COMMIT');
5599 END IF;
5600 END IF;
5601
5602 INSERT INTO ams_act_metric_hst
5603 (ACT_MET_HST_ID,
5604 ACTIVITY_METRIC_ID,
5605 LAST_UPDATE_DATE,
5606 LAST_UPDATED_BY,
5607 CREATION_DATE,
5608 CREATED_BY,
5609 LAST_UPDATE_LOGIN,
5610 OBJECT_VERSION_NUMBER,
5611 ACT_METRIC_USED_BY_ID,
5612 ARC_ACT_METRIC_USED_BY,
5613 APPLICATION_ID,
5614 METRIC_ID,
5615 TRANSACTION_CURRENCY_CODE,
5616 TRANS_FORECASTED_VALUE,
5617 TRANS_COMMITTED_VALUE,
5618 TRANS_ACTUAL_VALUE,
5619 FUNCTIONAL_CURRENCY_CODE,
5620 FUNC_FORECASTED_VALUE,
5621 FUNC_COMMITTED_VALUE,
5622 DIRTY_FLAG,
5623 FUNC_ACTUAL_VALUE,
5624 LAST_CALCULATED_DATE,
5625 VARIABLE_VALUE,
5626 COMPUTED_USING_FUNCTION_VALUE,
5627 METRIC_UOM_CODE,
5628 ORG_ID,
5629 DIFFERENCE_SINCE_LAST_CALC,
5630 ACTIVITY_METRIC_ORIGIN_ID,
5631 ARC_ACTIVITY_METRIC_ORIGIN,
5632 DAYS_SINCE_LAST_REFRESH,
5633 SUMMARIZE_TO_METRIC,
5634 ROLLUP_TO_METRIC,
5635 SCENARIO_ID,
5636 ATTRIBUTE_CATEGORY,
5637 ATTRIBUTE1,
5638 ATTRIBUTE2,
5639 ATTRIBUTE3,
5640 ATTRIBUTE4,
5641 ATTRIBUTE5,
5642 ATTRIBUTE6,
5643 ATTRIBUTE7,
5644 ATTRIBUTE8,
5645 ATTRIBUTE9,
5646 ATTRIBUTE10,
5647 ATTRIBUTE11,
5648 ATTRIBUTE12,
5649 ATTRIBUTE13,
5650 ATTRIBUTE14,
5651 ATTRIBUTE15,
5652 DESCRIPTION,
5653 ACT_METRIC_DATE,
5654 ARC_FUNCTION_USED_BY,
5655 FUNCTION_USED_BY_ID,
5656 PURCHASE_REQ_RAISED_FLAG,
5657 SENSITIVE_DATA_FLAG,
5658 BUDGET_ID,
5659 FORECASTED_VARIABLE_VALUE,
5660 HIERARCHY_ID,
5661 PUBLISHED_FLAG,
5662 PRE_FUNCTION_NAME,
5663 POST_FUNCTION_NAME,
5664 START_NODE,
5665 FROM_LEVEL,
5666 TO_LEVEL,
5667 FROM_DATE,
5668 TO_DATE,
5669 AMOUNT1,
5670 AMOUNT2,
5671 AMOUNT3,
5672 PERCENT1,
5673 PERCENT2,
5674 PERCENT3,
5675 STATUS_CODE,
5676 ACTION_CODE,
5677 METHOD_CODE,
5678 BASIS_YEAR,
5679 EX_START_NODE,
5680 HIERARCHY_TYPE,
5681 DEPEND_ACT_METRIC,
5682 FUNC_FORECASTED_DELTA,
5683 FUNC_ACTUAL_DELTA)
5684 SELECT AMS_ACT_METRIC_HST_S.NEXTVAL,
5685 a.ACTIVITY_METRIC_ID,
5686 l_today,
5687 a.LAST_UPDATED_BY,
5688 a.CREATION_DATE,
5689 a.CREATED_BY,
5690 a.LAST_UPDATE_LOGIN,
5691 a.OBJECT_VERSION_NUMBER+1,
5692 a.ACT_METRIC_USED_BY_ID,
5693 a.ARC_ACT_METRIC_USED_BY,
5694 a.APPLICATION_ID,
5695 a.METRIC_ID,
5696 a.TRANSACTION_CURRENCY_CODE,
5697 0,
5698 0,
5699 0,
5700 a.FUNCTIONAL_CURRENCY_CODE,
5701 0,
5702 0,
5703 a.DIRTY_FLAG,
5704 0,
5705 a.LAST_CALCULATED_DATE,
5706 0,
5707 0,
5708 a.METRIC_UOM_CODE,
5709 a.ORG_ID,
5710 a.DIFFERENCE_SINCE_LAST_CALC,
5711 a.ACTIVITY_METRIC_ORIGIN_ID,
5712 a.ARC_ACTIVITY_METRIC_ORIGIN,
5713 a.DAYS_SINCE_LAST_REFRESH,
5714 a.SUMMARIZE_TO_METRIC,
5715 a.ROLLUP_TO_METRIC,
5716 a.SCENARIO_ID,
5717 a.ATTRIBUTE_CATEGORY,
5718 a.ATTRIBUTE1,
5719 a.ATTRIBUTE2,
5720 a.ATTRIBUTE3,
5721 a.ATTRIBUTE4,
5722 a.ATTRIBUTE5,
5723 a.ATTRIBUTE6,
5724 a.ATTRIBUTE7,
5725 a.ATTRIBUTE8,
5726 a.ATTRIBUTE9,
5727 a.ATTRIBUTE10,
5728 a.ATTRIBUTE11,
5729 a.ATTRIBUTE12,
5730 a.ATTRIBUTE13,
5731 a.ATTRIBUTE14,
5732 a.ATTRIBUTE15,
5733 a.DESCRIPTION,
5734 a.ACT_METRIC_DATE,
5735 a.ARC_FUNCTION_USED_BY,
5736 a.FUNCTION_USED_BY_ID,
5737 a.PURCHASE_REQ_RAISED_FLAG,
5738 a.SENSITIVE_DATA_FLAG,
5739 a.BUDGET_ID,
5740 0,
5741 a.HIERARCHY_ID,
5742 a.PUBLISHED_FLAG,
5743 a.PRE_FUNCTION_NAME,
5744 a.POST_FUNCTION_NAME,
5745 a.START_NODE,
5746 a.FROM_LEVEL,
5747 a.TO_LEVEL,
5748 a.FROM_DATE,
5749 a.TO_DATE,
5750 a.AMOUNT1,
5751 a.AMOUNT2,
5752 a.AMOUNT3,
5753 a.PERCENT1,
5754 a.PERCENT2,
5755 a.PERCENT3,
5756 a.STATUS_CODE,
5757 a.ACTION_CODE,
5758 a.METHOD_CODE,
5759 a.BASIS_YEAR,
5760 a.EX_START_NODE,
5761 a.HIERARCHY_TYPE,
5765 FROM ams_act_metric_hst a
5762 a.DEPEND_ACT_METRIC,
5763 -NVL(a.FUNC_FORECASTED_VALUE,0),
5764 -NVL(a.FUNC_ACTUAL_VALUE,0)
5766 WHERE NOT EXISTS (SELECT 'x' FROM ams_act_metrics_all b
5767 WHERE a.activity_metric_id = b.activity_metric_id)
5768 AND last_update_date =
5769 (SELECT MAX(c.last_update_date)
5770 FROM ams_act_metric_hst c
5771 WHERE c.activity_metric_id = a.activity_metric_id)
5772 AND last_update_date < TRUNC(l_today)
5773 AND (NVL(func_actual_value,0) <> 0 OR NVL(func_forecasted_value,0) <> 0);
5774
5775 IF AMS_DEBUG_HIGH_ON THEN
5776 write_msg(L_API_NAME, 'Inserted delete before today: '||SQL%ROWCOUNT);
5777 END IF;
5778
5779 IF SQL%ROWCOUNT > 0 AND p_commit = FND_API.G_TRUE THEN
5780 COMMIT;
5781 IF AMS_DEBUG_HIGH_ON THEN
5782 write_msg(L_API_NAME, 'COMMIT');
5783 END IF;
5784 END IF;
5785
5786 IF AMS_DEBUG_HIGH_ON THEN
5787 write_msg(L_API_NAME, 'COMPLETED');
5788 END IF;
5789
5790 END Update_History;
5791
5792 -- NAME
5793 -- push
5794 --
5795 -- PURPOSE
5796 -- Stack support for formula calculations.
5797 -- Stores the forecasted and actual value on the stack.
5798 --
5799 -- NOTES
5800 --
5801 -- HISTORY
5802 -- 08/21/2003 DMVINCEN Created.
5803 --
5804 procedure pop(x_forecasted_value out nocopy number, x_actual_value out nocopy number)
5805 is
5806 l_index number;
5807 begin
5808 l_index := g_stack.count;
5809 if (g_stack.exists(l_index)) then
5810 x_forecasted_value := g_stack(l_index).forecasted_value;
5811 x_actual_value := g_stack(l_index).actual_value;
5812 g_stack.delete(l_index);
5813 else
5814 x_forecasted_value := null;
5815 x_actual_value := null;
5816 end if;
5817 IF AMS_DEBUG_MEDIUM_ON THEN
5818 write_msg('POP', 'l_index='||l_index||', forecast='||x_forecasted_value||', actual='||x_actual_value);
5819 END IF;
5820 end pop;
5821
5822 -- NAME
5823 -- push
5824 --
5825 -- PURPOSE
5826 -- Stack support for formula calculations.
5827 -- Stores the forecasted and actual value on the stack.
5828 --
5829 -- NOTES
5830 --
5831 -- HISTORY
5832 -- 08/21/2003 DMVINCEN Created.
5833 --
5834 procedure push(p_forecasted_value number, p_actual_value number)
5835 is
5836 l_index number;
5837 begin
5838 l_index := g_stack.count + 1;
5839 IF AMS_DEBUG_MEDIUM_ON THEN
5840 write_msg('PUSH', 'l_index='||l_index||', forecast='||p_forecasted_value||', actual='||p_actual_value);
5841 END IF;
5842 g_stack(l_index).forecasted_value := p_forecasted_value;
5843 g_stack(l_index).actual_value := p_actual_value;
5844 end push;
5845
5846 -- NAME
5847 -- apply
5848 --
5849 -- PURPOSE
5850 -- Stack support for formula calculations.
5851 -- Applies an operator to the top two values on the stack.
5852 -- Stack operation is applied as postfix: 'a b -' or infix: 'a - b'.
5853 -- When pushing the values on the stack A is pushed first, and b
5854 -- is on the top of the stack.
5855 --
5856 -- NOTES
5857 --
5858 -- HISTORY
5859 -- 08/21/2003 DMVINCEN Created.
5860 --
5861 procedure apply(p_operator varchar2)
5862 is
5863 l_forecasted_value_a number;
5864 l_forecasted_value_b number;
5865 l_new_forecasted_value number;
5866 l_actual_value_a number;
5867 l_actual_value_b number;
5868 l_new_actual_value number;
5869 begin
5870 pop(l_forecasted_value_b,l_actual_value_b);
5871 pop(l_forecasted_value_a,l_actual_value_a);
5872 if p_operator = G_PLUS then
5873 l_new_forecasted_value := l_forecasted_value_a + l_forecasted_value_b;
5874 l_new_actual_value := l_actual_value_a + l_actual_value_b;
5875 elsif p_operator = G_MINUS then
5876 l_new_forecasted_value := l_forecasted_value_a - l_forecasted_value_b;
5877 l_new_actual_value := l_actual_value_a - l_actual_value_b;
5878 elsif p_operator = G_TIMES then
5879 l_new_forecasted_value := l_forecasted_value_a * l_forecasted_value_b;
5880 l_new_actual_value := l_actual_value_a * l_actual_value_b;
5881 elsif p_operator = G_DIVIDE then
5882 if l_forecasted_value_b = 0 then
5883 l_new_forecasted_value := null;
5884 else
5885 l_new_forecasted_value := l_forecasted_value_a / l_forecasted_value_b;
5886 end if;
5887 if l_actual_value_b = 0 then
5888 l_new_actual_value := null;
5889 else
5890 l_new_actual_value := l_actual_value_a / l_actual_value_b;
5891 end if;
5892 else
5893 null; -- error
5894 end if;
5895 IF AMS_DEBUG_MEDIUM_ON THEN
5896 write_msg('APPLY', 'forecasted: '||l_new_forecasted_value||'='||l_forecasted_value_a||' '||p_operator||' '||l_forecasted_value_b);
5897 write_msg('APPLY', 'actual: '||l_new_actual_value||'='||l_actual_value_a||' '||p_operator||' '||l_actual_value_b);
5898 END IF;
5899 push(l_new_forecasted_value,l_new_actual_value);
5900 end apply;
5901
5902 -- NAME
5903 -- stack_count
5904 --
5905 -- PURPOSE
5906 -- Return the size of the stack.
5907 --
5908 -- NOTES
5909 --
5910 -- HISTORY
5911 -- 08/21/2003 DMVINCEN Created.
5912 --
5913 FUNCTION stack_count
5914 return number
5915 is
5916 begin
5917 return G_STACK.count;
5918 end stack_count;
5919
5920 -- NAME
5921 -- pop
5922 --
5923 -- PURPOSE
5927 --
5924 -- Return the top items on the stack and delete.
5925 --
5926 -- NOTES
5928 -- HISTORY
5929 -- 08/21/2003 DMVINCEN Created.
5930 --
5931 procedure clear_stack
5932 is
5933 begin
5934 G_STACK.delete;
5935 end clear_stack;
5936
5937 -- NAME
5938 -- Update_formulas
5939 --
5940 -- PURPOSE
5941 -- Compute formula metrics.
5942 --
5943 -- NOTES
5944 --
5945 -- HISTORY
5946 -- 08/21/2003 DMVINCEN Created.
5947 --
5948 PROCEDURE Update_formulas(
5949 x_errbuf OUT NOCOPY VARCHAR2,
5950 x_retcode OUT NOCOPY NUMBER,
5951 p_commit IN VARCHAR2 := Fnd_Api.G_TRUE,
5952 p_object_list IN object_currency_table := Empty_object_currency_table,
5953 p_current_date IN date,
5954 p_func_currency IN varchar2
5955 )
5956 IS
5957 L_API_NAME CONSTANT VARCHAR2(100) := 'UPDATE_FORMULAS';
5958
5959 TYPE act_metric_formula_type is record (
5960 activity_metric_id number,
5961 metric_id number,
5962 arc_act_metric_used_by varchar2(30),
5963 act_metric_used_by_id number,
5964 last_calculated_date date,
5965 display_type varchar2(30)
5966 );
5967
5968 TYPE act_metric_formula_table is table
5969 of act_metric_formula_type INDEX BY BINARY_INTEGER;
5970
5971 cursor c_get_dirty_formulas
5972 return act_metric_formula_type is
5973 select a.activity_metric_id, a.metric_id ,
5974 a.arc_act_metric_used_by, a.act_metric_used_by_id,
5975 a.last_calculated_date, b.display_type
5976 from ams_act_metrics_all a, ams_metrics_all_b b
5977 where a.metric_id = b.metric_id
5978 and b.metric_calculation_type = G_FORMULA
5979 and a.dirty_flag = G_IS_DIRTY
5980 order by a.metric_id;
5981
5982 cursor c_get_dirty_formulas_by_obj(p_object_type VARCHAR2, p_object_id NUMBER)
5983 return act_metric_formula_type is
5984 select a.activity_metric_id, a.metric_id,
5985 a.arc_act_metric_used_by, a.act_metric_used_by_id,
5986 a.last_calculated_date, b.display_type
5987 from ams_act_metrics_all a, ams_metrics_all_b b
5988 where a.metric_id = b.metric_id
5989 and b.metric_calculation_type = G_FORMULA
5990 and a.dirty_flag = G_IS_DIRTY
5991 and a.arc_act_metric_used_by = p_object_type
5992 and a.act_metric_used_by_id = p_object_id
5993 order by a.metric_id;
5994
5995 TYPE metric_formula_type is record (
5996 source_type varchar2(30),
5997 source_id number,
5998 source_sub_id number,
5999 source_value number,
6000 token varchar2(15),
6001 use_sub_id_flag varchar2(1)
6002 );
6003
6004 TYPE metric_formula_table is table
6005 of metric_formula_type index by binary_integer;
6006
6007 cursor c_get_formula(p_metric_id NUMBER)
6008 return metric_formula_type is
6009 select source_type, source_id, source_sub_id, source_value, token,
6010 use_sub_id_flag
6011 from ams_metric_formulas f
6012 where f.metric_id = p_metric_id
6013 and f.notation_type = G_POSTFIX
6014 order by sequence;
6015
6016 cursor c_get_values_by_metric(p_metric_id number, p_object_type VARCHAR2, p_object_id NUMBER) is
6017 select sum(func_forecasted_value), sum(func_actual_value), functional_currency_code
6018 from ams_act_metrics_all a
6019 where a.metric_id = p_metric_id
6020 and a.arc_act_metric_used_by = p_object_type
6021 and a.act_metric_used_by_id = p_object_id
6022 group by functional_currency_code;
6023
6024 cursor c_get_values_by_category(p_category_id number, p_object_type VARCHAR2, p_object_id NUMBER) is
6025 select sum(func_forecasted_value), sum(func_actual_value), functional_currency_code
6026 from ams_act_metrics_all a, ams_metrics_all_b b
6027 where a.metric_id = b.metric_id
6028 and b.metric_category = p_category_id
6029 and a.arc_act_metric_used_by = p_object_type
6030 and a.act_metric_used_by_id = p_object_id
6031 group by functional_currency_code;
6032
6033 cursor c_get_values_by_category_only(p_category_id number, p_object_type VARCHAR2, p_object_id NUMBER) is
6034 select sum(func_forecasted_value), sum(func_actual_value), functional_currency_code
6035 from ams_act_metrics_all a, ams_metrics_all_b b
6036 where a.metric_id = b.metric_id
6037 and b.metric_category = p_category_id
6038 and b.metric_sub_category is null
6039 and a.arc_act_metric_used_by = p_object_type
6040 and a.act_metric_used_by_id = p_object_id
6041 group by functional_currency_code;
6042
6043 cursor c_get_values_by_sub_category(p_category_id number, p_sub_category_id number, p_object_type VARCHAR2, p_object_id NUMBER) is
6044 select sum(func_forecasted_value), sum(func_actual_value), functional_currency_code
6045 from ams_act_metrics_all a, ams_metrics_all_b b
6046 where a.metric_id = b.metric_id
6047 and b.metric_category = p_category_id
6048 and b.metric_sub_category = p_sub_category_id
6049 and a.arc_act_metric_used_by = p_object_type
6050 and a.act_metric_used_by_id = p_object_id
6051 and b.metric_calculation_type in (G_MANUAL, G_FUNCTION, G_ROLLUP)
6052 group by functional_currency_code;
6053
6054 -- Dirty formula tables.
6055 l_activity_metric_ids num_table_type;
6056 l_metric_ids num_table_type;
6057 l_arc_act_metric_used_bys varchar2_table_type;
6058 l_act_metric_used_by_ids num_table_type;
6059 l_last_calculated_dates date_table_type;
6063 l_temp_activity_metric_ids num_table_type;
6060 l_display_types varchar2_table_type;
6061
6062 -- Temporary storage for querying by object types.
6064 l_temp_metric_ids num_table_type;
6065 l_temp_arc_act_metric_used_bys varchar2_table_type;
6066 l_temp_act_metric_used_by_ids num_table_type;
6067 l_temp_last_calculated_dates date_table_type;
6068 l_temp_display_types varchar2_table_type;
6069 l_temp_func_forecasted_values num_table_type;
6070 l_temp_func_actual_values num_table_type;
6071
6072 -- Formula Definition table.
6073 l_metric_formula_table metric_formula_table;
6074 l_metric_formula_record metric_formula_type;
6075
6076 -- Output Data
6077 l_functional_currency_codes varchar2_table_type;
6078 l_func_forecasted_values num_table_type;
6079 l_func_actual_values num_table_type;
6080 l_transactional_currency_codes varchar2_table_type;
6081 l_trans_forecasted_values num_table_type;
6082 l_trans_actual_values num_table_type;
6083 l_days_since_last_refreshs num_table_type;
6084
6085 l_obj_currencies object_currency_table;
6086 l_obj_currency object_currency_type;
6087
6088 l_func_forecasted_value number;
6089 l_func_actual_value number;
6090 l_functional_currency_code varchar2(20);
6091 l_return_status varchar2(10);
6092 l_obj_index NUMBER;
6093 l_count number;
6094 l_last_metric_id number := -1;
6095 l_first number;
6096 l_last number;
6097 begin
6098 IF AMS_DEBUG_HIGH_ON THEN
6099 write_msg(L_API_NAME, 'START: object_list count='||p_object_list.count);
6100 END IF;
6101
6102 -- Collect dirty formulas.
6103 IF p_object_list.count > 0 THEN
6104 -- Collect dirty formulas only with the object set.
6105 FOR l_obj_index IN p_object_list.first..p_object_list.last
6106 LOOP
6107 open c_get_dirty_formulas_by_obj(p_object_list(l_obj_index).obj_type,p_object_list(l_obj_index).obj_id);
6108 fetch c_get_dirty_formulas_by_obj
6109 bulk collect into
6110 l_temp_activity_metric_ids, l_temp_metric_ids,
6111 l_temp_arc_act_metric_used_bys, l_temp_act_metric_used_by_ids,
6112 l_temp_last_calculated_dates, l_temp_display_types;
6113 close c_get_dirty_formulas_by_obj;
6114 IF l_temp_activity_metric_ids.count > 0 THEN
6115 FOR l_index2 IN l_temp_activity_metric_ids.first..l_temp_activity_metric_ids.last
6116 LOOP
6117 l_count := l_activity_metric_ids.count+1;
6118 l_activity_metric_ids(l_count) := l_temp_activity_metric_ids(l_index2);
6119 l_metric_ids(l_count) := l_temp_metric_ids(l_index2);
6120 l_arc_act_metric_used_bys(l_count) := l_temp_arc_act_metric_used_bys(l_index2);
6121 l_act_metric_used_by_ids(l_count) := l_temp_act_metric_used_by_ids(l_index2);
6122 l_last_calculated_dates(l_count) := l_temp_last_calculated_dates(l_index2);
6123 l_display_types(l_count) := l_temp_display_types(l_index2);
6124 END LOOP;
6125 l_temp_activity_metric_ids.delete;
6126 l_temp_metric_ids.delete;
6127 l_temp_arc_act_metric_used_bys.delete;
6128 l_temp_act_metric_used_by_ids.delete;
6129 l_temp_last_calculated_dates.delete;
6130 l_temp_display_types.delete;
6131 END IF;
6132 end loop;
6133 else
6134 -- Collect dirty formulas system wide.
6135 open c_get_dirty_formulas;
6136 fetch c_get_dirty_formulas bulk collect into
6137 l_activity_metric_ids, l_metric_ids,
6138 l_arc_act_metric_used_bys, l_act_metric_used_by_ids,
6139 l_last_calculated_dates, l_display_types;
6140 close c_get_dirty_formulas;
6141 end if;
6142
6143 IF AMS_DEBUG_HIGH_ON THEN
6144 write_msg(L_API_NAME, 'Formula count='||l_activity_metric_ids.count);
6145 END IF;
6146
6147 if l_activity_metric_ids.count > 0 then
6148
6149 for l_index in l_activity_metric_ids.first..l_activity_metric_ids.last
6150 loop
6151 IF AMS_DEBUG_MEDIUM_ON THEN
6152 write_msg(L_API_NAME, 'activity_metric_id='||l_activity_metric_ids(l_index));
6153 END IF;
6154 l_days_since_last_refreshs(l_index) := p_current_date - l_last_calculated_dates(l_index);
6155 if l_metric_ids(l_index) <> l_last_metric_id then
6156 l_last_metric_id := l_metric_ids(l_index);
6157 l_metric_formula_table.delete;
6158 open c_get_formula(l_last_metric_id);
6159 loop
6160 fetch c_get_formula into l_metric_formula_record;
6161 exit when c_get_formula%NOTFOUND;
6162 l_metric_formula_table(l_metric_formula_table.count+1) := l_metric_formula_record;
6163 end loop;
6164 close c_get_formula;
6165 end if;
6166 IF AMS_DEBUG_MEDIUM_ON THEN
6167 write_msg(L_API_NAME, 'metric_id='||l_metric_ids(l_index)||', formula size ='||l_metric_formula_table.count);
6168 END IF;
6169 if l_metric_formula_table.count > 0 then
6170 clear_stack;
6171 for l_index2 in l_metric_formula_table.first..l_metric_formula_table.last
6172 loop
6173 IF AMS_DEBUG_LOW_ON THEN
6174 write_msg(L_API_NAME, 'source_type='||l_metric_formula_table(l_index2).source_type);
6175 END IF;
6176 l_func_forecasted_value := null;
6177 l_func_actual_value := null;
6181 l_act_metric_used_by_ids(l_index));
6178 if l_metric_formula_table(l_index2).source_type = G_METRIC then
6179 open c_get_values_by_metric(l_metric_formula_table(l_index2).source_id,
6180 l_arc_act_metric_used_bys(l_index),
6182 fetch c_get_values_by_metric
6183 into l_func_forecasted_value, l_func_actual_value,
6184 l_functional_currency_code;
6185 close c_get_values_by_metric;
6186 push(l_func_forecasted_value, l_func_actual_value);
6187 elsif l_metric_formula_table(l_index2).source_type = G_CATEGORY then
6188 if l_metric_formula_table(l_index2).use_sub_id_flag = 'Y' then
6189 if l_metric_formula_table(l_index2).source_sub_id is null then
6190 open c_get_values_by_category_only(
6191 l_metric_formula_table(l_index2).source_id,
6192 l_arc_act_metric_used_bys(l_index),
6193 l_act_metric_used_by_ids(l_index));
6194 fetch c_get_values_by_category_only
6195 into l_func_forecasted_value, l_func_actual_value,
6196 l_functional_currency_code;
6197 close c_get_values_by_category_only;
6198 else
6199 open c_get_values_by_sub_category(
6200 l_metric_formula_table(l_index2).source_id,
6201 l_metric_formula_table(l_index2).source_sub_id,
6202 l_arc_act_metric_used_bys(l_index),
6203 l_act_metric_used_by_ids(l_index));
6204 fetch c_get_values_by_sub_category
6205 into l_func_forecasted_value, l_func_actual_value,
6206 l_functional_currency_code;
6207 close c_get_values_by_sub_category;
6208 end if;
6209 else
6210 open c_get_values_by_category(
6211 l_metric_formula_table(l_index2).source_id,
6212 l_arc_act_metric_used_bys(l_index),
6213 l_act_metric_used_by_ids(l_index));
6214 fetch c_get_values_by_category
6215 into l_func_forecasted_value, l_func_actual_value,
6216 l_functional_currency_code;
6217 close c_get_values_by_category;
6218 end if;
6219 push(l_func_forecasted_value, l_func_actual_value);
6220 elsif l_metric_formula_table(l_index2).source_type = G_NUMBER then
6221 push(l_metric_formula_table(l_index2).source_value, l_metric_formula_table(l_index2).source_value);
6222 elsif l_metric_formula_table(l_index2).source_type = G_OPERATOR then
6223 apply(l_metric_formula_table(l_index2).token);
6224 else
6225 null;-- error
6226 end if;
6227 end loop;
6228 IF AMS_DEBUG_MEDIUM_ON THEN
6229 write_msg(L_API_NAME, 'stack_count='||stack_count);
6230 END IF;
6231 if stack_count > 1 then
6232 -- error
6233 l_func_forecasted_values(l_index) := null;
6234 l_func_actual_values(l_index) := null;
6235 else
6236 pop(l_func_forecasted_value, l_func_actual_value);
6237 IF AMS_DEBUG_MEDIUM_ON THEN
6238 write_msg(L_API_NAME, 'The successfull results are='||
6239 l_func_forecasted_value||'/'||l_func_actual_value);
6240 END IF;
6241 l_func_forecasted_values(l_index) := l_func_forecasted_value;
6242 l_func_actual_values(l_index) := l_func_actual_value;
6243 end if;
6244 else
6245 IF AMS_DEBUG_MEDIUM_ON THEN
6246 write_msg(L_API_NAME, 'No formula was found, metric_id='||
6247 l_last_metric_id);
6248 END IF;
6249 -- No formula was found.
6250 l_func_forecasted_values(l_index) := null;
6251 l_func_actual_values(l_index) := null;
6252 end if;
6253 IF AMS_DEBUG_MEDIUM_ON THEN
6254 write_msg(L_API_NAME, 'display_type='||l_display_types(l_index));
6255 END IF;
6256 if l_display_types(l_index) = G_INTEGER then
6257 l_trans_forecasted_values(l_index) :=
6258 l_func_forecasted_values(l_index);
6259 l_trans_actual_values(l_index) := l_func_actual_values(l_index);
6260 l_functional_currency_codes(l_index) := null;
6261 l_transactional_currency_codes(l_index) := null;
6262 elsif l_display_types(l_index) = G_PERCENT then
6263 l_trans_forecasted_values(l_index) :=
6264 ROUND(l_func_forecasted_values(l_index) * 1000)/10;
6265 l_trans_actual_values(l_index) :=
6266 ROUND(l_func_actual_values(l_index) * 1000)/10;
6267 l_functional_currency_codes(l_index) := null;
6268 l_transactional_currency_codes(l_index) := null;
6269 elsif l_display_types(l_index) = G_CURRENCY then
6270 l_functional_currency_codes(l_index) := p_func_currency;
6271 -- Verify the transaction currency code matches the object.
6272 IF l_obj_currencies.EXISTS(l_act_metric_used_by_ids(l_index)) AND
6276 l_transactional_currency_codes(l_index) :=
6273 l_obj_currencies(l_act_metric_used_by_ids(l_index)).obj_type =
6274 l_arc_act_metric_used_bys(l_index)
6275 THEN
6277 l_obj_currencies(l_act_metric_used_by_ids(l_index)).currency;
6278 ELSE
6279 Ams_Actmetric_Pvt.GET_TRANS_CURR_CODE(
6280 p_obj_id => l_act_metric_used_by_ids(l_index),
6281 p_obj_type => l_arc_act_metric_used_bys(l_index),
6282 x_trans_curr_code => l_transactional_currency_codes(l_index)
6283 );
6284 l_obj_currency.obj_id := l_act_metric_used_by_ids(l_index);
6285 l_obj_currency.obj_type := l_arc_act_metric_used_bys(l_index);
6286 l_obj_currency.currency :=
6287 NVL(l_transactional_currency_codes(l_index),p_func_currency);
6288 l_obj_currencies(l_act_metric_used_by_ids(l_index)) :=
6289 l_obj_currency;
6290 END IF;
6291 ams_actmetric_pvt.Convert_Currency2 (
6292 x_return_status => l_return_status,
6293 p_from_currency => l_functional_currency_codes(l_index),
6294 p_to_currency => l_transactional_currency_codes(l_index),
6295 p_conv_date => p_current_date,
6296 p_from_amount => l_func_actual_values(l_index),
6297 x_to_amount => l_trans_actual_values(l_index),
6298 p_from_amount2 => l_func_forecasted_values(l_index),
6299 x_to_amount2 => l_trans_forecasted_values(l_index),
6300 p_round => fnd_api.g_false);
6301 else -- Error: display type not supported.
6302 IF AMS_DEBUG_MEDIUM_ON THEN
6303 write_msg(L_API_NAME, 'display_type not supported='||
6304 l_display_types(l_index));
6305 END IF;
6306 l_trans_forecasted_values(l_index) := null;
6307 l_trans_actual_values(l_index) := null;
6308 l_functional_currency_codes(l_index) := null;
6309 l_transactional_currency_codes(l_index) := null;
6310 end if;
6311 end loop;
6312
6313 l_metric_formula_table.delete;
6314 clear_stack;
6315
6316 IF AMS_DEBUG_HIGH_ON THEN
6317 write_msg(L_API_NAME, 'formula calculations complete');
6318 END IF;
6319
6320 l_first := l_activity_metric_ids.first;
6321 LOOP
6322 EXIT WHEN l_first > l_activity_metric_ids.last;
6323 IF l_first + G_BATCH_SIZE + G_BATCH_PAD >
6324 l_activity_metric_ids.last THEN
6325 l_last := l_activity_metric_ids.last;
6326 ELSE
6327 l_last := l_first + G_BATCH_SIZE - 1;
6328 END IF;
6329 FORALL l_index IN l_first .. l_last
6330 UPDATE ams_act_metrics_all
6331 SET last_calculated_date = p_current_date,
6332 last_update_date = p_current_date,
6333 object_version_number = object_version_number + 1,
6334 days_since_last_refresh = l_days_since_last_refreshs(l_index),
6335 transaction_currency_code = l_transactional_currency_codes(l_index),
6336 functional_currency_code = l_functional_currency_codes(l_index),
6337 trans_forecasted_value = l_trans_forecasted_values(l_index),
6338 func_forecasted_value = l_func_forecasted_values(l_index),
6339 trans_actual_value = l_trans_actual_values(l_index),
6340 func_actual_value = l_func_actual_values(l_index),
6341 dirty_flag = G_NOT_DIRTY
6342 WHERE activity_metric_id = l_activity_metric_ids(l_index);
6343
6344 l_first := l_last + 1;
6345 IF p_commit = FND_API.G_TRUE THEN
6346 COMMIT;
6347 IF AMS_DEBUG_MEDIUM_ON THEN
6348 write_msg(L_API_NAME, 'BATCH COMMIT: l_last='||l_last);
6349 END IF;
6350 END IF;
6351 END LOOP;
6352
6353 l_activity_metric_ids.delete;
6354 l_metric_ids.delete;
6355 l_arc_act_metric_used_bys.delete;
6356 l_act_metric_used_by_ids.delete;
6357 l_last_calculated_dates.delete;
6358 l_display_types.delete;
6359 l_functional_currency_codes.delete;
6360 l_func_forecasted_values.delete;
6361 l_func_actual_values.delete;
6362 l_transactional_currency_codes.delete;
6363 l_trans_forecasted_values.delete;
6364 l_trans_actual_values.delete;
6365 l_days_since_last_refreshs.delete;
6366 l_obj_currencies.delete;
6367 end if;
6368
6369 IF AMS_DEBUG_HIGH_ON THEN
6370 write_msg(L_API_NAME, 'END');
6371 END IF;
6372
6373 end Update_formulas;
6374
6375 -------------------------------------------------------------------------------
6376 -- NAME
6377 -- Update_formulas
6378 -- PURPOSE
6379 -- External API to calculate Formula metrics with in a single object.
6380 -- HISTORY
6381 -- 22-Aug_2003 dmvincen Created.
6382 -------------------------------------------------------------------------------
6383 PROCEDURE Update_formulas (
6384 p_api_version IN NUMBER,
6385 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
6386 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
6387
6388 x_return_status OUT NOCOPY VARCHAR2,
6389 x_msg_count OUT NOCOPY NUMBER,
6390 x_msg_data OUT NOCOPY VARCHAR2,
6391
6395 is
6392 p_arc_act_metric_used_by IN VARCHAR2,
6393 p_act_metric_used_by_id IN NUMBER
6394 )
6396 L_API_NAME CONSTANT VARCHAR2(100) := 'UPDATE_FORMULAS';
6397
6398 l_errbuf VARCHAR2(4000);
6399 l_retcode VARCHAR2(10);
6400 l_index number;
6401 l_object_list object_currency_table;
6402 l_current_date date := sysdate;
6403 l_default_currency VARCHAR2(15) := Ams_Actmetric_Pvt.DEFAULT_FUNC_CURRENCY;
6404 begin
6405
6406 savepoint sp_Update_formulas;
6407
6408 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6409
6410 l_index := l_object_list.count + 1;
6411 l_object_list(l_index).obj_type := p_arc_act_metric_used_by;
6412 l_object_list(l_index).obj_id := p_act_metric_used_by_id;
6413
6414 Update_formulas(x_errbuf => l_errbuf,
6415 x_retcode => l_retcode,
6416 p_commit => FND_API.G_FALSE,
6417 p_object_list => l_object_list,
6418 p_current_date => l_current_date,
6419 p_func_currency => l_default_currency);
6420
6421 -- If any errors happen abort API.
6422 IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
6423 RAISE Fnd_Api.G_EXC_ERROR;
6424 END IF;
6425
6426 --COMMIT WORK;
6427
6428 IF Fnd_Api.to_boolean(p_commit) THEN
6429 COMMIT;
6430 END IF;
6431
6432 --
6433 -- Standard API to get message count, and if 1,
6434 -- set the message data OUT NOCOPY variable.
6435 --
6436 Fnd_Msg_Pub.Count_And_Get (
6437 p_count => x_msg_count,
6438 p_data => x_msg_data,
6439 p_encoded => Fnd_Api.G_FALSE
6440 );
6441
6442 EXCEPTION
6443 WHEN Fnd_Api.G_EXC_ERROR THEN
6444 ROLLBACK TO sp_Update_formulas;
6445 x_return_status := Fnd_Api.G_RET_STS_ERROR;
6446 Fnd_Msg_Pub.Count_And_Get (
6447 p_count => x_msg_count,
6448 p_data => x_msg_data,
6449 p_encoded => FND_API.G_FALSE
6450 );
6451 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6452 ROLLBACK TO sp_Update_formulas;
6453 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6454 Fnd_Msg_Pub.Count_And_Get (
6455 p_count => x_msg_count,
6456 p_data => x_msg_data,
6457 p_encoded => FND_API.G_FALSE
6458 );
6459 WHEN OTHERS THEN
6460 ROLLBACK TO sp_Update_formulas;
6461 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6462 IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
6463 Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
6464 END IF;
6465 Fnd_Msg_Pub.Count_And_Get (
6466 p_count => x_msg_count,
6467 p_data => x_msg_data,
6468 p_encoded => FND_API.G_FALSE
6469 );
6470
6471 end Update_formulas;
6472
6473
6474
6475
6476 --========================================================================
6477 -- PROCEDURE
6478 -- populate_all
6479 -- Purpose
6480 -- 1. populates metrics all denorm table completely
6481 -- HISTORY
6482 -- 01-Oct-2003 asaha Created.
6483 --
6484 --========================================================================
6485 --
6486 PROCEDURE populate_all(
6487 x_msg_data OUT NOCOPY VARCHAR2,
6488 x_return_status OUT NOCOPY VARCHAR2
6489 ) IS
6490
6491 l_metric_col_date DATE;
6492 l_msg_data VARCHAR2(2000);
6493
6494
6495 BEGIN
6496
6497 x_return_status := FND_API.G_RET_STS_SUCCESS;
6498 x_msg_data := l_msg_data;
6499
6500 --bms_output.put_line('deleting all entries');
6501 IF AMS_DEBUG_HIGH_ON THEN
6502 write_msg('populate_all','Deleting all entris from ams_act_metrics_all_denorm');
6503 END IF;
6504
6505
6506 delete
6507 from ams_act_metrics_all_denorm;
6508
6509 ----Ams_Utility_Pvt.Write_Conc_log('Inserting entries ams_act_metrics_all_denorm') ;
6510 l_metric_col_date := SYSDATE;
6511 --bms_output.put_line('inserting all entries with metric collection date : '||TO_CHAR(l_metric_col_date,'DD-MON-YYYY HH:MI:SS'));
6512 IF AMS_DEBUG_HIGH_ON THEN
6513 write_msg('populate_all','inserting all entries with metric collection date : '||TO_CHAR(l_metric_col_date,'DD-MON-YYYY HH:MI:SS'));
6514 END IF;
6515
6516
6517 insert into ams_act_metrics_all_denorm (creation_date,created_by,last_update_date,last_updated_by,last_update_login,act_metrics_denorm_id,metric_collection_date,object_type
6518 ,object_id,leads,top_leads,top_leads_ratio,leads_accepted,lead_acceptance_rate,dead_leads,dead_leads_ratio,opportunities
6519 ,leads_to_opportunity_rate,quotes,quotes_amount,orders,orders_amount,booked_revenue,invoiced_revenue
6520 ,booked_revenue_per_lead,invoiced_revenue_per_lead,cost,cost_per_lead,booked_roi,invoiced_roi
6521 ,responses,contact_group_size,target_group_size
6522 ,leads_forecast,top_leads_forecast,top_leads_ratio_forecast,leads_accepted_forecast,leads_accepted_ratio_forecast
6523 ,dead_leads_forecast,dead_leads_ratio_forecast,opportunities_forecast,lead_opportunity_rate_forecast
6524 ,quotes_forecast,quotes_amount_forecast,orders_forecast,orders_amount_forecast
6525 ,booked_revenue_forecast,invoiced_revenue_forecast,booked_rev_per_lead_forecast,invoiced_rev_per_lead_forecast
6526 ,cost_forecast,cost_per_lead_forecast,booked_roi_forecast,
6527 invoiced_roi_forecast,contact_group_size_forecast,target_group_size_forecast,responses_forecast
6528 )
6532 ,dead_leads,dead_leads_ratio,opportunities,leads_to_opportunity_rate,quotes,quotes_amount,orders,orders_amount
6529 select sysdate,Fnd_Global.User_Id,sysdate,Fnd_Global.User_Id,Fnd_Global.Conc_Login_Id,AMS_ACT_METRICS_ALL_DENORM_S.NEXTVAL,
6530 sysdate,object_type,object_id
6531 ,leads,top_leads,top_leads_ratio,leads_accepted,lead_acceptance_rate
6533 ,booked_revenue,invoiced_revenue,booked_revenue_per_lead,invoiced_revenue_per_lead,cost,cost_per_lead,booked_roi,
6534 invoiced_roi,responses,contact_group_size,target_group_size
6535 ,leads_forecast,top_leads_forecast,top_leads_ratio_forecast,leads_accepted_forecast,leads_accepted_ratio_forecast
6536 ,dead_leads_forecast,dead_leads_ratio_forecast,opportunities_forecast,lead_opportunity_rate_forecast
6537 ,quotes_forecast,quotes_amount_forecast,orders_forecast,orders_amount_forecast
6538 ,booked_revenue_forecast,invoiced_revenue_forecast,booked_rev_per_lead_forecast,invoiced_rev_per_lead_forecast
6539 ,cost_forecast,cost_per_lead_forecast,booked_roi_forecast,
6540 invoiced_roi_forecast,responses_forecast,contact_group_size_forecast,target_group_size_forecast
6541 from (
6542 select h1.arc_act_metric_used_by object_type,h1.act_metric_used_by_id object_id,
6543 sum(decode(met.denorm_code,'METRIC_01',h1.func_actual_value,0)) leads,
6544 sum(decode(met.denorm_code,'METRIC_02',h1.func_actual_value,0)) top_leads,
6545 sum(decode(met.denorm_code,'METRIC_03',h1.func_actual_value,0)) top_leads_ratio,
6546 sum(decode(met.denorm_code,'METRIC_04',h1.func_actual_value,0)) leads_accepted,
6547 sum(decode(met.denorm_code,'METRIC_05',h1.func_actual_value,0)) lead_acceptance_rate,
6548 sum(decode(met.denorm_code,'METRIC_06',h1.func_actual_value,0)) dead_leads,
6549 sum(decode(met.denorm_code,'METRIC_07',h1.func_actual_value,0)) dead_leads_ratio,
6550 sum(decode(met.denorm_code,'METRIC_08',h1.func_actual_value,0)) opportunities,
6551 sum(decode(met.denorm_code,'METRIC_09',h1.func_actual_value,0)) leads_to_opportunity_rate,
6552 sum(decode(met.denorm_code,'METRIC_10',h1.func_actual_value,0)) quotes,
6553 sum(decode(met.denorm_code,'METRIC_11',h1.func_actual_value,0)) quotes_amount,
6554 sum(decode(met.denorm_code,'METRIC_12',h1.func_actual_value,0)) orders,
6555 sum(decode(met.denorm_code,'METRIC_13',h1.func_actual_value,0)) orders_amount,
6556 sum(decode(met.denorm_code,'METRIC_14',h1.func_actual_value,0)) booked_revenue,
6557 sum(decode(met.denorm_code,'METRIC_15',h1.func_actual_value,0)) invoiced_revenue,
6558 sum(decode(met.denorm_code,'METRIC_16',h1.func_actual_value,0)) booked_revenue_per_lead,
6559 sum(decode(met.denorm_code,'METRIC_17',h1.func_actual_value,0)) invoiced_revenue_per_lead,
6560 sum(decode(met.denorm_code,'METRIC_18',h1.func_actual_value,0)) cost,
6561 sum(decode(met.denorm_code,'METRIC_19',h1.func_actual_value,0)) cost_per_lead,
6562 sum(decode(met.denorm_code,'METRIC_20',h1.func_actual_value,0)) booked_roi,
6563 sum(decode(met.denorm_code,'METRIC_21',h1.func_actual_value,0)) invoiced_roi,
6564 sum(decode(met.denorm_code,'METRIC_22',h1.func_actual_value,0)) responses,
6565 sum(decode(met.denorm_code,'METRIC_23',h1.func_actual_value,0)) contact_group_size,
6566 sum(decode(met.denorm_code,'METRIC_24',h1.func_actual_value,0)) target_group_size,
6567 sum(decode(met.denorm_code,'METRIC_01',h1.func_forecasted_value,0)) leads_forecast,
6568 sum(decode(met.denorm_code,'METRIC_02',h1.func_forecasted_value,0)) top_leads_forecast,
6569 sum(decode(met.denorm_code,'METRIC_03',h1.func_forecasted_value,0)) top_leads_ratio_forecast,
6570 sum(decode(met.denorm_code,'METRIC_04',h1.func_forecasted_value,0)) leads_accepted_forecast,
6571 sum(decode(met.denorm_code,'METRIC_05',h1.func_forecasted_value,0)) leads_accepted_ratio_forecast,
6572 sum(decode(met.denorm_code,'METRIC_06',h1.func_forecasted_value,0)) dead_leads_forecast,
6573 sum(decode(met.denorm_code,'METRIC_07',h1.func_forecasted_value,0)) dead_leads_ratio_forecast,
6574 sum(decode(met.denorm_code,'METRIC_08',h1.func_forecasted_value,0)) opportunities_forecast,
6575 sum(decode(met.denorm_code,'METRIC_09',h1.func_forecasted_value,0)) lead_opportunity_rate_forecast,
6576 sum(decode(met.denorm_code,'METRIC_10',h1.func_forecasted_value,0)) quotes_forecast,
6577 sum(decode(met.denorm_code,'METRIC_11',h1.func_forecasted_value,0)) quotes_amount_forecast,
6578 sum(decode(met.denorm_code,'METRIC_12',h1.func_forecasted_value,0)) orders_forecast,
6579 sum(decode(met.denorm_code,'METRIC_13',h1.func_forecasted_value,0)) orders_amount_forecast,
6580 sum(decode(met.denorm_code,'METRIC_14',h1.func_forecasted_value,0)) booked_revenue_forecast,
6581 sum(decode(met.denorm_code,'METRIC_15',h1.func_forecasted_value,0)) invoiced_revenue_forecast,
6582 sum(decode(met.denorm_code,'METRIC_16',h1.func_forecasted_value,0)) booked_rev_per_lead_forecast,
6583 sum(decode(met.denorm_code,'METRIC_17',h1.func_forecasted_value,0)) invoiced_rev_per_lead_forecast,
6584 sum(decode(met.denorm_code,'METRIC_18',h1.func_forecasted_value,0)) cost_forecast,
6585 sum(decode(met.denorm_code,'METRIC_19',h1.func_forecasted_value,0)) cost_per_lead_forecast,
6586 sum(decode(met.denorm_code,'METRIC_20',h1.func_forecasted_value,0)) booked_roi_forecast,
6587 sum(decode(met.denorm_code,'METRIC_21',h1.func_forecasted_value,0)) invoiced_roi_forecast,
6588 sum(decode(met.denorm_code,'METRIC_22',h1.func_forecasted_value,0)) responses_forecast,
6589 sum(decode(met.denorm_code,'METRIC_23',h1.func_forecasted_value,0)) contact_group_size_forecast,
6590 sum(decode(met.denorm_code,'METRIC_24',h1.func_forecasted_value,0)) target_group_size_forecast
6591 from ams_act_metrics_all h1, ams_metrics_all_b met
6592 where h1.metric_id = met.metric_id
6593 and met.denorm_code in
6594 (
6595 'METRIC_01'
6596 ,'METRIC_02'
6597 ,'METRIC_03'
6598 ,'METRIC_04'
6599 ,'METRIC_05'
6600 ,'METRIC_06'
6601 ,'METRIC_07'
6602 ,'METRIC_08'
6603 ,'METRIC_09'
6604 ,'METRIC_10'
6605 ,'METRIC_11'
6606 ,'METRIC_12'
6607 ,'METRIC_13'
6608 ,'METRIC_14'
6609 ,'METRIC_15'
6610 ,'METRIC_16'
6614 ,'METRIC_20'
6611 ,'METRIC_17'
6612 ,'METRIC_18'
6613 ,'METRIC_19'
6615 ,'METRIC_21'
6616 ,'METRIC_22'
6617 ,'METRIC_23'
6618 ,'METRIC_24')
6619 group by h1.arc_act_metric_used_by ,h1.act_metric_used_by_id
6620 );
6621
6622 IF AMS_DEBUG_HIGH_ON THEN
6623 write_msg('populate_all','Done Inserting entries ams_act_metrics_all_denorm');
6624 END IF;
6625
6626 --bms_output.put_line('Done Inserting entries ');
6627
6628 END populate_all;
6629
6630
6631 --========================================================================
6632 -- PROCEDURE
6633 -- populate_incremental
6634 -- Purpose
6635 -- 1. populates metrics all denorm table incrementally
6636 -- HISTORY
6637 -- 01-Oct-2003 asaha Created.
6638 --
6639 --========================================================================
6640 PROCEDURE populate_incremental(
6641 p_last_run_date IN DATE,
6642 x_msg_data OUT NOCOPY VARCHAR2,
6643 x_return_status OUT NOCOPY VARCHAR2
6644 ) IS
6645 l_metric_col_date DATE;
6646 l_msg_data VARCHAR2(2000);
6647
6648 CURSOR c_new_objects_csr(p_date DATE) IS
6649 select distinct concat(concat(arc_act_metric_used_by,'_'),TO_CHAR(act_metric_used_by_id))
6650 from ams_act_metrics_all
6651 where last_update_date > p_date;
6652
6653 new_object_row VARCHAR2(100);
6654 l_obj_type VARCHAR2(30);
6655 l_obj_id NUMBER;
6656 l_no_of_objects NUMBER := 0;
6657
6658 l_index NUMBER;
6659
6660 l_calc_since DATE := sysdate - fnd_profile.value('AMS_METR_SEEDED_CALC_EXP');
6661
6662 BEGIN
6663
6664 x_return_status := FND_API.G_RET_STS_SUCCESS;
6665
6666 ----Ams_Utility_Pvt.Write_Conc_log('Inserting entries ams_act_metrics_all_denorm') ;
6667 l_metric_col_date := SYSDATE;
6668
6669 IF AMS_DEBUG_HIGH_ON THEN
6670 write_msg('populate_incremental','max last run date : '||TO_CHAR(p_last_run_date,'DD-MON-YYYY HH:MI:SS'));
6671 write_msg('populate_incremental','metric collection date determined: '||TO_CHAR(l_metric_col_date,'DD-MON-YYYY HH:MI:SS'));
6672 END IF;
6673
6674 --bms_output.put_line('last run date : '||TO_CHAR(p_last_run_date,'DD-MON-YYYY HH:MI:SS'));
6675 --bms_output.put_line('metric collection date : '||TO_CHAR(l_metric_col_date,'DD-MON-YYYY HH:MI:SS'));
6676
6677 --first update those rows in ams_act_metrics_all_denorm whose values have been changed in
6678 --ams_act_metrics_all since last metrics collection date
6679 update ams_act_metrics_all_denorm a
6680 set
6681 (
6682 a.last_updated_by
6683 ,a.last_update_date
6684 ,a.last_update_login
6685 ,a.metric_collection_date
6686 ,a.object_version_number
6687 ,a.leads,top_leads,a.top_leads_ratio,a.leads_accepted,a.lead_acceptance_rate
6688 ,a.dead_leads,a.dead_leads_ratio,opportunities,a.leads_to_opportunity_rate,a.quotes,a.quotes_amount,a.orders,a.orders_amount
6689 ,a.booked_revenue,invoiced_revenue,a.booked_revenue_per_lead,a.invoiced_revenue_per_lead,a.cost,a.cost_per_lead,a.booked_roi
6690 ,a.invoiced_roi,a.responses,a.contact_group_size,a.target_group_size
6691 ,a.leads_forecast,a.top_leads_forecast,a.top_leads_ratio_forecast,a.leads_accepted_forecast,a.leads_accepted_ratio_forecast
6692 ,a.dead_leads_forecast,a.dead_leads_ratio_forecast,a.opportunities_forecast,a.lead_opportunity_rate_forecast
6693 ,a.quotes_forecast,a.quotes_amount_forecast,a.orders_forecast,a.orders_amount_forecast
6694 ,a.booked_revenue_forecast,a.invoiced_revenue_forecast,a.booked_rev_per_lead_forecast,a.invoiced_rev_per_lead_forecast
6695 ,a.cost_forecast,a.cost_per_lead_forecast,a.booked_roi_forecast
6696 ,a.invoiced_roi_forecast,a.responses_forecast,a.contact_group_size_forecast,a.target_group_size_forecast
6697 ) =
6698 (select Fnd_Global.User_Id,sysdate,Fnd_Global.User_Id,sysdate,
6699 nvl(a.object_version_number,1) + 1,
6700 sum(decode(met.denorm_code,'METRIC_01',h1.func_actual_value,0)) leads,
6701 sum(decode(met.denorm_code,'METRIC_02',h1.func_actual_value,0)) top_leads,
6702 sum(decode(met.denorm_code,'METRIC_03',h1.func_actual_value,0)) top_leads_ratio,
6703 sum(decode(met.denorm_code,'METRIC_04',h1.func_actual_value,0)) leads_accepted,
6704 sum(decode(met.denorm_code,'METRIC_05',h1.func_actual_value,0)) lead_acceptance_rate,
6705 sum(decode(met.denorm_code,'METRIC_06',h1.func_actual_value,0)) dead_leads,
6706 sum(decode(met.denorm_code,'METRIC_07',h1.func_actual_value,0)) dead_leads_ratio,
6707 sum(decode(met.denorm_code,'METRIC_08',h1.func_actual_value,0)) opportunities,
6708 sum(decode(met.denorm_code,'METRIC_09',h1.func_actual_value,0)) leads_to_opportunity_rate,
6709 sum(decode(met.denorm_code,'METRIC_10',h1.func_actual_value,0)) quotes,
6710 sum(decode(met.denorm_code,'METRIC_11',h1.func_actual_value,0)) quotes_amount,
6711 sum(decode(met.denorm_code,'METRIC_12',h1.func_actual_value,0)) orders,
6712 sum(decode(met.denorm_code,'METRIC_13',h1.func_actual_value,0)) orders_amount,
6713 sum(decode(met.denorm_code,'METRIC_14',h1.func_actual_value,0)) booked_revenue,
6714 sum(decode(met.denorm_code,'METRIC_15',h1.func_actual_value,0)) invoiced_revenue,
6715 sum(decode(met.denorm_code,'METRIC_16',h1.func_actual_value,0)) booked_revenue_per_lead,
6716 sum(decode(met.denorm_code,'METRIC_17',h1.func_actual_value,0)) invoiced_revenue_per_lead,
6717 sum(decode(met.denorm_code,'METRIC_18',h1.func_actual_value,0)) cost,
6718 sum(decode(met.denorm_code,'METRIC_19',h1.func_actual_value,0)) cost_per_lead,
6719 sum(decode(met.denorm_code,'METRIC_20',h1.func_actual_value,0)) booked_roi,
6720 sum(decode(met.denorm_code,'METRIC_21',h1.func_actual_value,0)) invoiced_roi,
6721 sum(decode(met.denorm_code,'METRIC_22',h1.func_actual_value,0)) responses,
6722 sum(decode(met.denorm_code,'METRIC_23',h1.func_actual_value,0)) contact_group_size,
6726 sum(decode(met.denorm_code,'METRIC_03',h1.func_forecasted_value,0)) top_leads_ratio_forecast,
6723 sum(decode(met.denorm_code,'METRIC_24',h1.func_actual_value,0)) target_group_size,
6724 sum(decode(met.denorm_code,'METRIC_01',h1.func_forecasted_value,0)) leads_forecast,
6725 sum(decode(met.denorm_code,'METRIC_02',h1.func_forecasted_value,0)) top_leads_forecast,
6727 sum(decode(met.denorm_code,'METRIC_04',h1.func_forecasted_value,0)) leads_accepted_forecast,
6728 sum(decode(met.denorm_code,'METRIC_05',h1.func_forecasted_value,0)) leads_accepted_ratio_forecast,
6729 sum(decode(met.denorm_code,'METRIC_06',h1.func_forecasted_value,0)) dead_leads_forecast,
6730 sum(decode(met.denorm_code,'METRIC_07',h1.func_forecasted_value,0)) dead_leads_ratio_forecast,
6731 sum(decode(met.denorm_code,'METRIC_08',h1.func_forecasted_value,0)) opportunities_forecast,
6732 sum(decode(met.denorm_code,'METRIC_09',h1.func_forecasted_value,0)) lead_opportunity_rate_forecast,
6733 sum(decode(met.denorm_code,'METRIC_10',h1.func_forecasted_value,0)) quotes_forecast,
6734 sum(decode(met.denorm_code,'METRIC_11',h1.func_forecasted_value,0)) quotes_amount_forecast,
6735 sum(decode(met.denorm_code,'METRIC_12',h1.func_forecasted_value,0)) orders_forecast,
6736 sum(decode(met.denorm_code,'METRIC_13',h1.func_forecasted_value,0)) orders_amount_forecast,
6737 sum(decode(met.denorm_code,'METRIC_14',h1.func_forecasted_value,0)) booked_revenue_forecast,
6738 sum(decode(met.denorm_code,'METRIC_15',h1.func_forecasted_value,0)) invoiced_revenue_forecast,
6739 sum(decode(met.denorm_code,'METRIC_16',h1.func_forecasted_value,0)) booked_rev_per_lead_forecast,
6740 sum(decode(met.denorm_code,'METRIC_17',h1.func_forecasted_value,0)) invoiced_rev_per_lead_forecast,
6741 sum(decode(met.denorm_code,'METRIC_18',h1.func_forecasted_value,0)) cost_forecast,
6742 sum(decode(met.denorm_code,'METRIC_19',h1.func_forecasted_value,0)) cost_per_lead_forecast,
6743 sum(decode(met.denorm_code,'METRIC_20',h1.func_forecasted_value,0)) booked_roi_forecast,
6744 sum(decode(met.denorm_code,'METRIC_21',h1.func_forecasted_value,0)) invoiced_roi_forecast,
6745 sum(decode(met.denorm_code,'METRIC_22',h1.func_forecasted_value,0)) responses_forecast,
6746 sum(decode(met.denorm_code,'METRIC_23',h1.func_forecasted_value,0)) contact_group_size_forecast,
6747 sum(decode(met.denorm_code,'METRIC_24',h1.func_forecasted_value,0)) target_group_size_forecast
6748 from ams_act_metrics_all h1, ams_metrics_all_b met
6749 where h1.metric_id = met.metric_id
6750 and met.denorm_code in
6751 (
6752 'METRIC_01'
6753 ,'METRIC_02'
6754 ,'METRIC_03'
6755 ,'METRIC_04'
6756 ,'METRIC_05'
6757 ,'METRIC_06'
6758 ,'METRIC_07'
6759 ,'METRIC_08'
6760 ,'METRIC_09'
6761 ,'METRIC_10'
6762 ,'METRIC_11'
6763 ,'METRIC_12'
6764 ,'METRIC_13'
6765 ,'METRIC_14'
6766 ,'METRIC_15'
6767 ,'METRIC_16'
6768 ,'METRIC_17'
6769 ,'METRIC_18'
6770 ,'METRIC_19'
6771 ,'METRIC_20'
6772 ,'METRIC_21'
6773 ,'METRIC_22'
6774 ,'METRIC_23'
6775 ,'METRIC_24')
6776 and h1.arc_act_metric_used_by(+) = a.object_type
6777 and h1.act_metric_used_by_id(+) = a.object_id
6778 )
6779 where a.last_update_date > l_calc_since
6780 and exists (select 1 from ams_act_metrics_all amet, ams_metrics_all_b met
6781 where amet.last_update_date > a.last_update_date
6782 and amet.metric_id = met.metric_id
6783 and met.denorm_code is not null
6784 and amet.arc_act_metric_used_by = a.object_type
6785 and amet.act_metric_used_by_id = a.object_id
6786 and rownum = 1
6787 )
6788 ;
6789
6790
6791 insert into ams_act_metrics_all_denorm (creation_date,created_by,last_update_date,last_updated_by,last_update_login
6792 ,act_metrics_denorm_id,metric_collection_date,object_type
6793 ,object_id,leads,top_leads,top_leads_ratio,leads_accepted,lead_acceptance_rate,dead_leads,dead_leads_ratio,opportunities
6794 ,leads_to_opportunity_rate,quotes,quotes_amount,orders,orders_amount,booked_revenue,invoiced_revenue
6795 ,booked_revenue_per_lead,invoiced_revenue_per_lead,cost,cost_per_lead,booked_roi,invoiced_roi
6796 ,responses,contact_group_size,target_group_size
6797 ,leads_forecast,top_leads_forecast,top_leads_ratio_forecast,leads_accepted_forecast,leads_accepted_ratio_forecast
6798 ,dead_leads_forecast,dead_leads_ratio_forecast,opportunities_forecast,lead_opportunity_rate_forecast
6799 ,quotes_forecast,quotes_amount_forecast,orders_forecast,orders_amount_forecast
6800 ,booked_revenue_forecast,invoiced_revenue_forecast,booked_rev_per_lead_forecast,invoiced_rev_per_lead_forecast
6801 ,cost_forecast,cost_per_lead_forecast,booked_roi_forecast,
6802 invoiced_roi_forecast,contact_group_size_forecast,target_group_size_forecast,responses_forecast
6803 )
6804 select sysdate,Fnd_Global.User_Id,sysdate,Fnd_Global.User_Id,Fnd_Global.Conc_Login_Id,AMS_ACT_METRICS_ALL_DENORM_S.NEXTVAL,
6805 sysdate,object_type,object_id
6806 ,leads,top_leads,top_leads_ratio,leads_accepted,lead_acceptance_rate
6807 ,dead_leads,dead_leads_ratio,opportunities,leads_to_opportunity_rate,quotes,quotes_amount,orders,orders_amount
6808 ,booked_revenue,invoiced_revenue,booked_revenue_per_lead,invoiced_revenue_per_lead,cost,cost_per_lead,booked_roi,
6809 invoiced_roi,responses,contact_group_size,target_group_size
6810 ,leads_forecast,top_leads_forecast,top_leads_ratio_forecast,leads_accepted_forecast,leads_accepted_ratio_forecast
6811 ,dead_leads_forecast,dead_leads_ratio_forecast,opportunities_forecast,lead_opportunity_rate_forecast
6812 ,quotes_forecast,quotes_amount_forecast,orders_forecast,orders_amount_forecast
6813 ,booked_revenue_forecast,invoiced_revenue_forecast,booked_rev_per_lead_forecast,invoiced_rev_per_lead_forecast
6814 ,cost_forecast,cost_per_lead_forecast,booked_roi_forecast,
6815 invoiced_roi_forecast,responses_forecast,contact_group_size_forecast,target_group_size_forecast
6816 from (
6817 select h1.arc_act_metric_used_by object_type,h1.act_metric_used_by_id object_id,
6821 sum(decode(met.denorm_code,'METRIC_04',h1.func_actual_value,0)) leads_accepted,
6818 sum(decode(met.denorm_code,'METRIC_01',h1.func_actual_value,0)) leads,
6819 sum(decode(met.denorm_code,'METRIC_02',h1.func_actual_value,0)) top_leads,
6820 sum(decode(met.denorm_code,'METRIC_03',h1.func_actual_value,0)) top_leads_ratio,
6822 sum(decode(met.denorm_code,'METRIC_05',h1.func_actual_value,0)) lead_acceptance_rate,
6823 sum(decode(met.denorm_code,'METRIC_06',h1.func_actual_value,0)) dead_leads,
6824 sum(decode(met.denorm_code,'METRIC_07',h1.func_actual_value,0)) dead_leads_ratio,
6825 sum(decode(met.denorm_code,'METRIC_08',h1.func_actual_value,0)) opportunities,
6826 sum(decode(met.denorm_code,'METRIC_09',h1.func_actual_value,0)) leads_to_opportunity_rate,
6827 sum(decode(met.denorm_code,'METRIC_10',h1.func_actual_value,0)) quotes,
6828 sum(decode(met.denorm_code,'METRIC_11',h1.func_actual_value,0)) quotes_amount,
6829 sum(decode(met.denorm_code,'METRIC_12',h1.func_actual_value,0)) orders,
6830 sum(decode(met.denorm_code,'METRIC_13',h1.func_actual_value,0)) orders_amount,
6831 sum(decode(met.denorm_code,'METRIC_14',h1.func_actual_value,0)) booked_revenue,
6832 sum(decode(met.denorm_code,'METRIC_15',h1.func_actual_value,0)) invoiced_revenue,
6833 sum(decode(met.denorm_code,'METRIC_16',h1.func_actual_value,0)) booked_revenue_per_lead,
6834 sum(decode(met.denorm_code,'METRIC_17',h1.func_actual_value,0)) invoiced_revenue_per_lead,
6835 sum(decode(met.denorm_code,'METRIC_18',h1.func_actual_value,0)) cost,
6836 sum(decode(met.denorm_code,'METRIC_19',h1.func_actual_value,0)) cost_per_lead,
6837 sum(decode(met.denorm_code,'METRIC_20',h1.func_actual_value,0)) booked_roi,
6838 sum(decode(met.denorm_code,'METRIC_21',h1.func_actual_value,0)) invoiced_roi,
6839 sum(decode(met.denorm_code,'METRIC_22',h1.func_actual_value,0)) responses,
6840 sum(decode(met.denorm_code,'METRIC_23',h1.func_actual_value,0)) contact_group_size,
6841 sum(decode(met.denorm_code,'METRIC_24',h1.func_actual_value,0)) target_group_size,
6842 sum(decode(met.denorm_code,'METRIC_01',h1.func_forecasted_value,0)) leads_forecast,
6843 sum(decode(met.denorm_code,'METRIC_02',h1.func_forecasted_value,0)) top_leads_forecast,
6844 sum(decode(met.denorm_code,'METRIC_03',h1.func_forecasted_value,0)) top_leads_ratio_forecast,
6845 sum(decode(met.denorm_code,'METRIC_04',h1.func_forecasted_value,0)) leads_accepted_forecast,
6846 sum(decode(met.denorm_code,'METRIC_05',h1.func_forecasted_value,0)) leads_accepted_ratio_forecast,
6847 sum(decode(met.denorm_code,'METRIC_06',h1.func_forecasted_value,0)) dead_leads_forecast,
6848 sum(decode(met.denorm_code,'METRIC_07',h1.func_forecasted_value,0)) dead_leads_ratio_forecast,
6849 sum(decode(met.denorm_code,'METRIC_08',h1.func_forecasted_value,0)) opportunities_forecast,
6850 sum(decode(met.denorm_code,'METRIC_09',h1.func_forecasted_value,0)) lead_opportunity_rate_forecast,
6851 sum(decode(met.denorm_code,'METRIC_10',h1.func_forecasted_value,0)) quotes_forecast,
6852 sum(decode(met.denorm_code,'METRIC_11',h1.func_forecasted_value,0)) quotes_amount_forecast,
6853 sum(decode(met.denorm_code,'METRIC_12',h1.func_forecasted_value,0)) orders_forecast,
6854 sum(decode(met.denorm_code,'METRIC_13',h1.func_forecasted_value,0)) orders_amount_forecast,
6855 sum(decode(met.denorm_code,'METRIC_14',h1.func_forecasted_value,0)) booked_revenue_forecast,
6856 sum(decode(met.denorm_code,'METRIC_15',h1.func_forecasted_value,0)) invoiced_revenue_forecast,
6857 sum(decode(met.denorm_code,'METRIC_16',h1.func_forecasted_value,0)) booked_rev_per_lead_forecast,
6858 sum(decode(met.denorm_code,'METRIC_17',h1.func_forecasted_value,0)) invoiced_rev_per_lead_forecast,
6859 sum(decode(met.denorm_code,'METRIC_18',h1.func_forecasted_value,0)) cost_forecast,
6860 sum(decode(met.denorm_code,'METRIC_19',h1.func_forecasted_value,0)) cost_per_lead_forecast,
6861 sum(decode(met.denorm_code,'METRIC_20',h1.func_forecasted_value,0)) booked_roi_forecast,
6862 sum(decode(met.denorm_code,'METRIC_21',h1.func_forecasted_value,0)) invoiced_roi_forecast,
6863 sum(decode(met.denorm_code,'METRIC_22',h1.func_forecasted_value,0)) responses_forecast,
6864 sum(decode(met.denorm_code,'METRIC_23',h1.func_forecasted_value,0)) contact_group_size_forecast,
6865 sum(decode(met.denorm_code,'METRIC_24',h1.func_forecasted_value,0)) target_group_size_forecast
6866 from ams_act_metrics_all h1, ams_metrics_all_b met
6867 where h1.metric_id = met.metric_id
6868 and met.denorm_code in
6869 (
6870 'METRIC_01'
6871 ,'METRIC_02'
6872 ,'METRIC_03'
6873 ,'METRIC_04'
6874 ,'METRIC_05'
6875 ,'METRIC_06'
6876 ,'METRIC_07'
6877 ,'METRIC_08'
6878 ,'METRIC_09'
6879 ,'METRIC_10'
6880 ,'METRIC_11'
6881 ,'METRIC_12'
6882 ,'METRIC_13'
6883 ,'METRIC_14'
6884 ,'METRIC_15'
6885 ,'METRIC_16'
6886 ,'METRIC_17'
6887 ,'METRIC_18'
6888 ,'METRIC_19'
6889 ,'METRIC_20'
6890 ,'METRIC_21'
6891 ,'METRIC_22'
6892 ,'METRIC_23'
6893 ,'METRIC_24')
6894 and (h1.arc_act_metric_used_by,h1.act_metric_used_by_id) not in
6895 (
6896 select distinct object_type, object_id
6897 from ams_act_metrics_all_denorm
6898 )
6899 group by h1.arc_act_metric_used_by ,h1.act_metric_used_by_id
6900 );
6901
6902 --bms_output.put_line('No of objects modified '||TO_CHAR(l_no_of_objects));
6903 IF AMS_DEBUG_HIGH_ON THEN
6904 write_msg('populate_incremental','No of objects modified '||TO_CHAR(l_no_of_objects));
6905 END IF;
6906
6907 x_msg_data := l_msg_data;
6908
6909 END populate_incremental;
6910
6911 --========================================================================
6912 -- PROCEDURE
6913 -- populate_metrics_denorm
6914 -- Purpose
6915 -- 1. populates metrics all denorm table
6916 -- 2. refreshes yearly,weekly,monthly and quarterly materialized views
6917 -- HISTORY
6918 -- 30-Sep-2003 asaha Created.
6919 --
6923 retcode OUT NOCOPY NUMBER,
6920 --========================================================================
6921 PROCEDURE populate_metrics_denorm(
6922 errbuf OUT NOCOPY VARCHAR2,
6924 p_run_incremental IN VARCHAR2 := Fnd_Api.G_TRUE
6925 ) IS
6926
6927 l_return_status VARCHAR2(1) ;
6928 l_msg_count NUMBER ;
6929 l_msg_data VARCHAR2(2000);
6930 l_api_version NUMBER := 1.0 ;
6931
6932 l_metric_collection_date DATE;
6933 l_last_run_date DATE := NULL;
6934
6935 CURSOR c_last_run_date_csr is
6936 select max(metric_collection_date)
6937 from ams_act_metrics_all_denorm;
6938
6939 BEGIN
6940 FND_MSG_PUB.initialize;
6941
6942 --bms_output.put_line('Entered populate_metrics_denorm');
6943 --Ams_Utility_Pvt.Write_Conc_log('Entered populate_metrics_denorm');
6944 IF AMS_DEBUG_HIGH_ON THEN
6945 write_msg('populate_metrics_denorm','Entered populate_metrics_denorm');
6946 END IF;
6947
6948
6949 OPEN c_last_run_date_csr;
6950 FETCH c_last_run_date_csr INTO l_last_run_date;
6951 CLOSE c_last_run_date_csr;
6952
6953 --bms_output.put_line('Last run date determined '||TO_CHAR(l_last_run_date,'DD_MON_RRRR HH:MM:SS'));
6954 IF AMS_DEBUG_HIGH_ON THEN
6955 write_msg('populate_metrics_denorm','Last run date determined '||TO_CHAR(l_last_run_date,'DD_MON_RRRR HH:MM:SS'));
6956 END IF;
6957
6958 IF (p_run_incremental IN (Fnd_Api.G_TRUE, 'Y') AND l_last_run_date IS NOT NULL) THEN
6959 IF AMS_DEBUG_HIGH_ON THEN
6960 write_msg('populate_metrics_denorm','Calling populate incremental');
6961 END IF;
6962
6963 --bms_output.put_line('Calling populate incremental');
6964
6965 populate_incremental(l_last_run_date, l_msg_data,l_return_status);
6966
6967 --bms_output.put_line('Done with populate incremental');
6968 IF AMS_DEBUG_HIGH_ON THEN
6969 write_msg('populate_metrics_denorm','Done with populate incremental');
6970 END IF;
6971 ELSE
6972 IF AMS_DEBUG_HIGH_ON THEN
6973 write_msg('populate_metrics_denorm','Calling populate all');
6974 END IF;
6975 --bms_output.put_line('Calling populate all');
6976
6977 populate_all(l_msg_data, l_return_status);
6978
6979 --bms_output.put_line('Done with populate all');
6980 IF AMS_DEBUG_HIGH_ON THEN
6981 write_msg('populate_metrics_denorm','Done with populate all');
6982 END IF;
6983 END IF;
6984
6985 --bms_output.put_line('Calling Refresh the Materialized Views');
6986 IF AMS_DEBUG_HIGH_ON THEN
6987 write_msg('populate_metrics_denorm','Calling Refresh the Materialized Views');
6988 END IF;
6989
6990 /* Bug#4669156: No longer need materialized views.
6991 Commenting out the following mv refresh calls
6992 Also, see High Buffer Gets issues bug#5158052 and 5158040
6993 */
6994 --dbms_snapshot.refresh('ams_act_metrics_weekly_mv','C');
6995 --dbms_snapshot.refresh('ams_act_metrics_qtrly_mv','C');
6996 --dbms_snapshot.refresh('ams_act_metrics_monthly_mv','C');
6997 --dbms_snapshot.refresh('ams_act_metrics_yearly_mv','C');
6998
6999 --bms_output.put_line('Done Refreshing the Materialized Views');
7000 IF AMS_DEBUG_HIGH_ON THEN
7001 write_msg('populate_metrics_denorm','Done Refreshing the Materialized Views');
7002 END IF;
7003
7004 --Write_log ;
7005 ----Ams_Utility_Pvt.Write_Conc_log ;
7006
7007 IF(l_return_status = FND_API.G_RET_STS_SUCCESS)THEN
7008 retcode :=0;
7009 ELSE
7010 retcode := 2;
7011 errbuf := l_msg_data ;
7012 END IF;
7013
7014 --bms_output.put_line('Done in populate_metrics_denorm');
7015 IF AMS_DEBUG_HIGH_ON THEN
7016 write_msg('populate_metrics_denorm','Done in populate_metrics_denorm with status : '||TO_CHAR(retcode));
7017 END IF;
7018
7019
7020 END populate_metrics_denorm;
7021
7022
7023
7024
7025 END Ams_Actmetrics_Engine_Pvt;