DBA Data[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;