[Home] [Help]
PACKAGE BODY: APPS.FEM_DIM_MEMBER_LOADER_PKG
Source
1 PACKAGE BODY FEM_DIM_MEMBER_LOADER_PKG AS
2 -- $Header: femdimldr_pkb.plb 120.22 2008/02/15 18:20:28 gcheng ship $
3
4 /***************************************************************************
5 Copyright (c) 2003 Oracle Corporation
6 Redwood Shores, CA, USA
7 All rights reserved.
8 ***************************************************************************
9 FILENAME
10 femdimldr_pkb.plb
11
12 DESCRIPTION
13 See femdimldr_pkh.pls for details
14
15 HISTORY
16 Rob Flippo 20-Oct-2003 Created
17 Rob Flippo 24-Dec-2003 Fixed put message for unexpected error
18 Added log messages in GET_ATTR_VERSION
19 Fixed GET_ATTR_VERSION so that version_id
20 select returns only versions for that
21 attribute and dimension label combo
22 Rob Flippo 29-Dec-2003 Fixed read_only_flag select from
23 FEM_DIM_ATTRIBUTES_B to
24 assignment_is_read_only;
25 Also fixed case where new member has
26 TL row but with status <>'LOAD' - now
27 such members get status update
28 'MISSING NAME';
29 Rob Flippo 02-Jan-2004 Fixed problem where missing required
30 attribute did not update _B status
31 Rob Flippo 06-Jan-2004 Fixed no_data_found problem for
32 retrieving attr assign value set
33 Rob Flippo 16-Mar-2004 Modified for Drop3 db. Implemented
34 Process Locks; Implemented other changes
35 documented in the detail design doc.
36 Rob Flippo 24-Mar-2004 Fixed problem with null dimension_group
37 for member loads. To do this, added outer
38 join (+) to attr_select and member_Select
39 queries
40 Rob Flippo 31-Mar-2004 Implemented Error Reprocesing. Fixed
41 several bugs having to do with outputing
42 the correct status for failed records,
43 and preventing members from loading with
44 insufficient req attr assignments in the
45 _ATTR_T table.
46 Rob Flippo 06-May-2004 Implemented changes for Multi-processing.
47 Also added support for non-value set
48 attribute dims, like Financial Element,
49 Dataset, etc.
50 Rob Flippo 29-June-2004 Remove deprecated code for
51 BULK_FETCH_LIMIT profile option
52 Rob Flippo 16-Sep-2004 Bug#3835758 Incorrect logic on checking
53 the Value Set of Attribute assignments
54 Bug#3848996 Simple Dimension loads fail
55
56 Also fixed several issues with the
57 status messaging. Previously, error rows
58 were getting incorrect STATUS.
59 Also removed the error row count from the
60 log, since it is not possible for this
61 number to be accurate due to the fact that
62 the loader performs several bulk updates
63 on bad data in the interface tables.
64
65 Also fixed the logic on checking attributes
66 in FEM_DIM_ATTR_GRPS - this has been
67 changed so that the loader ignores any
68 entries into FEM_DIM_ATTR_GRPS for required
69 attributes assigned. Because the DHM is
70 supposed to prevent such occurrences - only
71 optional attributes are allowed to be
72 assigned to a specific group.
73 Rob Flippo 17-Sep-04 Bug#3843739 DIM LOAD REPROCESS FAILS IF
74 _TL_T STATUS=LOAD.
75 This is fixed by modifying the loader so
76 that when run in Error Reprocessing mode
77 it loads both 'LOAD' and error status
78 records.
79 Bug#3881433 ERROR MESSAGE REQUIRED TO
80 DEBUG MULTI LANG LOADS THAT FAIL.
81 The loader now updates the STATUS column
82 in _TL_T table to "LANGUAGE_NOT_INSTALLED"
83 for all records where the LANGUAGE value
84 is not designated as installed in
85 FND_LANGUAGES.
86 Rob Flippo 21-Sep-04 Bug#3900960 INSUFFICIENT ERROR MESSAGES
87 WHEN RUNNING FEM DIMENSION LOADER
88 - to fix this, add to_char wrapper
89 on date values inside of the to_date
90 Rob Flippo 27-Sep-04 Bug#3906366 ADD ABILITY TO
91 TRACK NUMBER OF ERROR ROWS IN THE MEMBER
92 LOADER
93 -- added accumulators for total rows
94 to load as well as counting all the
95 various error rows encountered
96 Bug#3909390 SIMPLE DIM LOADER ISSUE WHEN
97 SAME MEMBER_CODE IN 2 DIFFT TBLS
98 -- This was fixed by adding a where
99 condition on the "existing" mbr select stmt
100 on dimension_varchar_label when the load
101 is for simple dims.
102 Rob Flippo 28-Sep-04 Bug#3906218 NEED ABILITY TO UNDELETE
103 DIMENSIONS
104 -- added new procedure
105 build_enable_update_stmt; modified the
106 Base_Update procedure to call this new
107 update
108 Rob Flippo 01-OCT-04 Bug#3925620 CAL PERIOD LOAD FAILS WHEN
109 UPDATING CAL_PERIOD_END_DATE ATTRIBUTE IN
110 INTF TABLE
111 -- The loader now allows update on
112 assignment_is_read_only attributes, but
113 only as long as the update is identical
114 to the existing assignment.
115 Rob Flippo 11-OCT-04 Bug#3906182 Enable RCM dimensions for
116 loading
117 - added object_definition_id values
118 to the CASE statement in Main
119 Rob Flippo 13-OCT-04 Added SIC and Credit Status dims
120
121 Rob Flippo 27-OCT-04 Bug#3973837
122 FEM.C.DP3.4: DIMENSION LOADER
123 ERRORS ALL ATTRIBUTES IN ATTR_T TABLE
124 -- this change affected the
125 build_bad_attr_select_stmt procedure
126
127 Rob Flippo 01-NOV-04 Attributes for members with
128 invalid_dim_grps not getting updated -
129 modified new_members procedure
130 so that it continues even if bad drp
131 or value_set so that the attr records
132 get updated.
133 Rob Flippo 11-NOV-04 Bug#4002917 DIM LDR SHOULD PROHIBIT
134 OVERLAP CAL PERIODS
135 - modify the start/end date validations
136 for cal period so that overlaps are
137 prevented;
138 also added restriction that
139 cal_period_number must always be >0
140 Rob Flippo 22-NOV-04 Overlap changes
141 Bug#4019853 - Fix Data Overlap logic -
142 Added section that checks within the
143 attr array for date overlaps. This logic
144 assumes num_of_processes = 1 for CAL_PEIOD
145 load
146 Rob Flippo 23-NOV-04 Fixes to the error counts
147
148 Rob Flippo 24-NOV-04 Bug#4031308 Remove periods_in_year check
149 Rob Flippo 16-DEC-04 Bug#4061097 CAN NOT CREATE BUDGET DIM USING
150 DIMENSION MEMBER LOADER
151 Bug#3654256 UPDATE DIMENSION NAMES IN DHM
152 SHOULD ALSO UPDATE LOADER OBJECT NAMES
153 -- the loader now requires a dim_id as a
154 parm and reads the associated object_Def_id
155 from the fem_Xdim_dimensions table
156 Rob Flippo 02-FEB-05 Bug#4066869 FEM.D MODIFY DIM MBR LOADER TO
157 READ DIM_ID AS PARM INSTEAD OF OBJECT_DEF_ID
158 Bug#4030717 FEM.D: MODIFY DIM MBR LOADER
159 OVERLAP DATE LOGIC TO ALLOW MP FOR CAL_PERIOD
160 Bug#3822561 FEM.D.1.DP1: MODIFY DIM MEMBER
161 LOADER TO SUPPORT ATTRIBUTES OF CAL PERIOD
162 -- added the CALPATTR columns to support
163 attributes of CAL_PERIOD dimension;
164 -- revised the OVERLAP logic so that it now
165 uses temporary tables. This means that
166 CAL_PERIOD loads can now be Multi-processed
167 -- implemented FEM_SHARED_ATTR_T as a
168 shared interface table for attributed
169 dimensions that don't have their own
170 separate tables
171 Rob Flippo 02-FEB-18 Fix Dimension Group problem where if name
172 is same for 2 dim grps in different dims
173 the loader fails because of no where
174 condition on dimension_id
175 -- this prob recognized in FEM.C in
176 bug#4189544
177 Rob Flippo 02-MAR-05 Bug#4170444 Add check to see if
178 READ_ONLY_FLAG='Y' in the target ATTR
179 table for existing rows. If it is, then
180 set STATUS = 'PROTECTED_ATTR_ASSIGN'
181 Rob Flippo 03-MAR-05 Modify base_update so that for dim grp
182 load we don't
183 get a unique dimgrp seq error unless the conflict is
184 caused by a dimension group other than the one
185 that is being loaded.
186 Rob Flippo 15-MAR-05 Bug#4226011
187 - new entity attributes require new col
188 USER_ASSIGN_ALLOWED_FLAG in FEM_DIM_ATTRIBUTES_B.
189 Modify all attribute queries to exclude attributes
190 where user_assign_allowed_flag = 'N'; Also add
191 update in Pre_Valid_attr to mark rows where the
192 attribute_varchar_label is
193 user_assign_allowed_flag='N';
194 -- also fix enabled_flag update stmt to use
195 value_set in the subquery
196 Rob Flippo 22-MAR-05 Bug#4030730 add ability to update dimgrp
197 of a member
198 as long as member not in a sequence enforced hier;
199 Add p_dimension_id as parm for
200 build_remain_mbr_select
201 Rob Flippo 22-APR-05 Bug#4305050 Calendar_ID and Dimension_Group_ID
202 were being swapped on insert member in
203 Post_Cal_Periods procedure
204 sshanmug 28-APR-05 Support for Composite Dimension Loader
205 Added the following PROCEDURES
206 Pre_Process
207 Process_Rows
208 Get_Display_Codes
209
210 sshanmug 09-MAY-05 Modified according to Nico Review comments
211 Added a PROCEDURE Metadata_Initialize
212 Rflippo 26-MAY-05 Bug#4355484
213 Added raise_member_bus_event procedure
214 to be called
215 whenever a new member is created
216 Rob Flippo 02-JUN-05 Bug#4408918 Fix Overlap comparisons to not use
217 to_char and instead do direct date compare
218 using bind variables
219 Rob Flippo 14-JUN-05 Bug numbers:
220 4107370 - folder security
221 3920599 - log file changes
222 3928148 - prevent TL update for
223 read only members
224 3895203 - status update for level
225 specific attr
226 3923485 - remove date_format_mask parm
227 4429725 - array out of bounds error
228 4429443 - changes for splitting out
229 comp dim loader
230 Rob Flippo 30-JUN-05 Bug#4355484
231 CALL BUS EVENT WHEN CCC-ORGS
232 LOADED WITH DIM LOADER
233 As long as >0 new members created in a load
234 the loader calls the bus. event
235 Rob Flippo 11-AUG-05 Bug#4547868 performance issue -
236 fixed the Attr_assign_update so that the
237 member_id and value_set_id are retrieved
238 in the main attr query, thus allowing
239 the later query on does_attr_exist
240 to use those values directly, rather than join
241 with the base table.
242 Same applies to the actual
243 ATTR update statement - it no longer
244 joins with the base table.
245 Rob Flippo 07-OCT-05 Bug#4630742 10G issue -
246 Attr_assign_update fails
247 on does_attr_exist checks: Modified the fetch
248 so that both the "version" and
249 "non-version" queries
250 are identical for output variables;
251 Bug#4628009 Fixed problem in
252 Post_Cal_Periods where
253 the Cal Period Name and Description table
254 variables had a type of varchar2(30)
255 instead of 150 and 255;
256 Modified Cal period update statement in
257 build_tl_ro_mbr_upd_stmt for performance
258 issue encountered during regression
259 testing (no bug)
260 Rob Flippo 24-JAN-06 Bug#4927869 Change ICX_DATE_FORMAT to
261 FEM_INTF_ATTR_DATE_FORMAT_MASK;
262 Rob Flippo 13-MAR-06 Bug#5068022 Need check on member name to ensure that
263 it doesn't already exist. Added new status
264 'DUPLICATE_NAME' for this situation. Edit occurs in
265 new_members and tl_update procedures;
266 Rob Flippo 04-APR-06 Bug#5117594 Remove unique name check for Customer
267 dimension
268 Naveen Kumar 26-APR-06 Bug#4736810. Added the call to get_mp_rows_rejected
269 after the call to MP engine for composite dimensions.
270 Rob Flippo 28-APR-06 Bug 5174039
271 New_Members and Attr_Assign_Update: Added validation
272 that calp start_date must be <= calp end date
273 Rob Flippo 18-JUL-06 Bug 5024575 Updates for Many-to-many attributes
274 Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
275 Rob Flippo 12-AUG-06 Bug 5459028 fixed bind variable error for
276 :b_gv_apps_user_id
277 Naveen Kumar 07-Sep-06 Bug#4429427. Call to FEM_COMP_DIM_MEMBER_LOADER_PKG.Process_Rows
278 through fem_multi_proc_pkg.MASTER altered to comply with Bind Variable Push
279 architecture.
280 Rob Flippo 15-MAR-07 Bug#5900463 - TL rows for other languages
281 getting deleted when new members are being
282 loaded - modifications to build_calp_delete_stmt
283 to fix this
284 Rob Flippo 15-MAR-07 Bug#5905501 Need to update source_lang so that
285 translated rows get marked properly
286 G Cheng 15-FEM-08 6407625 (FP:6256819). Commented out two IF conditions
287 in get_dimension_info
288
289 *******************************************************************/
290
291 -------------------------------
292 -- Declare package variables --
293 -------------------------------
294 f_set_status BOOLEAN;
295
296 c_log_level_1 CONSTANT NUMBER := fnd_log.level_statement;
297 c_log_level_2 CONSTANT NUMBER := fnd_log.level_procedure;
298 c_log_level_3 CONSTANT NUMBER := fnd_log.level_event;
299 c_log_level_4 CONSTANT NUMBER := fnd_log.level_exception;
300 c_log_level_5 CONSTANT NUMBER := fnd_log.level_error;
301 c_log_level_6 CONSTANT NUMBER := fnd_log.level_unexpected;
302
303 v_log_level NUMBER;
304
305 gv_prg_msg VARCHAR2(2000);
306 gv_callstack VARCHAR2(2000);
307
308 -- Global Variables for Post Processing information
309 gv_rows_fetched NUMBER := 0;
310 gv_rows_rejected NUMBER := 0;
311 gv_rows_loaded NUMBER := 0;
312 gv_temp_rows_rejected NUMBER := 0;
313
314 gv_dimgrp_rows_rejected NUMBER := 0;
315
316 gv_request_id NUMBER := fnd_global.conc_request_id;
317 gv_apps_user_id NUMBER := FND_GLOBAL.User_Id;
318 gv_login_id NUMBER := FND_GLOBAL.Login_Id;
319 gv_pgm_id NUMBER := FND_GLOBAL.Conc_Program_Id;
320 gv_pgm_app_id NUMBER := FND_GLOBAL.Prog_Appl_ID;
321 gv_concurrent_status BOOLEAN;
322
323 -- Engine SQL for Composite Dimension Loader
324
325 g_select_statement LONG;
326
327 /* -- This stores the details of each component dimensions of Flex Field
328
329 TYPE rt_metadata IS RECORD (
330 dimension_id fem_xdim_dimensions.dimension_id%TYPE,
331 member_col fem_xdim_dimensions.member_col%TYPE,
332 member_display_code_col fem_xdim_dimensions.member_display_code_col%TYPE,
333 member_b_table_name fem_xdim_dimensions.member_b_table_name%TYPE,
334 value_set_required_flag fem_xdim_dimensions.value_set_required_flag%TYPE,
335 dimension_varchar_label VARCHAR2(100),
336 member_sql VARCHAR2(200));
337
338 TYPE tt_metadata IS TABLE OF rt_metadata INDEX BY BINARY_INTEGER;
339 t_metadata tt_metadata;
340
341
342 -- This is used to store the values of the Interface(_T) tables
343 TYPE display_code_type IS TABLE OF VARCHAR2(150) INDEX BY BINARY_INTEGER;
344 t_global_vs_combo_dc display_code_type;
345 t_fin_elem_dc display_code_type;
346 t_ledger_dc display_code_type;
347 t_cctr_org_dc display_code_type;
348 t_product_dc display_code_type;
349 t_channel_dc display_code_type;
350 t_project_dc display_code_type;
351 t_customer_dc display_code_type;
352 t_task_dc display_code_type;
353 t_user_dim1_dc display_code_type;
354 t_user_dim2_dc display_code_type;
355 t_user_dim3_dc display_code_type;
356 t_user_dim4_dc display_code_type;
357 t_user_dim5_dc display_code_type;
358 t_user_dim6_dc display_code_type;
359 t_user_dim7_dc display_code_type;
360 t_user_dim8_dc display_code_type;
361 t_user_dim9_dc display_code_type;
362 t_user_dim10_dc display_code_type;
363
364 -- This stores the concatenated display code for composite dimension
365 t_display_code display_code_type;
366
367 -- This stores the value of 'UOM_CODE' column for FEM_COST_OBECTS Table.
368 t_uom_code display_code_type;
369
370 --This is used to store the component dimensions of Composite Dimension
371
372 TYPE dim_structure IS TABLE OF VARCHAR2(150) INDEX BY BINARY_INTEGER;
373 t_component_dim_dc dim_structure;*/
374
375 -- TYPE varchar2_std_type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
376 t_status varchar2_150_type;
377 -- Execution Mode Clause for all Fetches against the interface tables
378 --gv_exec_mode_clause VARCHAR2(100);
379
380 -- Bulk Fetch profile no longer used
381 -- Default limit for all BULK Fetches
382 --gv_fetch_limit NUMBER := NVL(FND_PROFILE.Value_Specific(
383 -- 'FEM_BULK_FETCH_LIMIT',gv_apps_user_id,null,null),
384 -- c_fetch_limit);
385
386 -------------------------------------
387 -- Array of Source System Codes for the load
388 -- This is a global table so that the data in it doesn't need
389 -- to be passed between procedures
390 -------------------------------------
391 tg_src_system_dc varchar2_150_type;
392
393 -----------------------------------------------
394 -- Declare private procedures and functions --
395 -----------------------------------------------
396 -- Wrapper module that calls all Primary modules
397 PROCEDURE Load_Dimension (
398 x_rows_rejected_accum OUT NOCOPY NUMBER
399 ,x_rows_to_load OUT NOCOPY NUMBER
400 ,p_execution_mode IN VARCHAR2
401 ,p_object_id IN NUMBER
402 ,p_object_definition_id IN NUMBER
403 ,p_dimension_varchar_label IN VARCHAR2
404 ,p_master_request_id IN NUMBER);
405
406
407 -- Primary Modules: These are procedures called from Load_Dimension
408 PROCEDURE Engine_Master_Prep ( p_dimension_varchar_label IN VARCHAR2
409 ,p_object_definition_id IN NUMBER
410 ,p_execution_mode IN VARCHAR2
411 ,x_dimension_id OUT NOCOPY NUMBER
412 ,x_target_b_table OUT NOCOPY VARCHAR2
413 ,x_target_tl_table OUT NOCOPY VARCHAR2
414 ,x_target_attr_table OUT NOCOPY VARCHAR2
415 ,x_source_b_table OUT NOCOPY VARCHAR2
416 ,x_source_tl_table OUT NOCOPY VARCHAR2
417 ,x_source_attr_table OUT NOCOPY VARCHAR2
418 ,x_member_col OUT NOCOPY VARCHAR2
419 ,x_member_dc_col OUT NOCOPY VARCHAR2
420 ,x_member_t_dc_col OUT NOCOPY VARCHAR2
421 ,x_member_name_col OUT NOCOPY VARCHAR2
422 ,x_member_t_name_col OUT NOCOPY VARCHAR2
423 ,x_member_description_col OUT NOCOPY VARCHAR2
424 ,x_value_set_required_flag OUT NOCOPY VARCHAR2
425 ,x_user_defined_flag OUT NOCOPY VARCHAR2
426 ,x_simple_dimension_flag OUT NOCOPY VARCHAR2
427 ,x_shared_dimension_flag OUT NOCOPY VARCHAR2
428 ,x_table_handler_name OUT NOCOPY VARCHAR2
429 ,x_composite_dimension_flag OUT NOCOPY VARCHAR2
430 ,x_structure_id OUT NOCOPY NUMBER
431 ,x_exec_mode_clause OUT NOCOPY VARCHAR2
432 ,x_eng_master_prep_status OUT NOCOPY VARCHAR2
433 ,x_hier_table_name OUT NOCOPY VARCHAR2
434 ,x_hier_dimension_flag OUT NOCOPY VARCHAR2
435 ,x_member_id_method_code OUT NOCOPY VARCHAR2
436 ,x_rows_to_load OUT NOCOPY NUMBER
437 ,x_date_format_mask OUT NOCOPY VARCHAR2
438 );
439
440
441
442 PROCEDURE Register_process_execution (p_object_id IN NUMBER
443 ,p_obj_def_id IN NUMBER
444 ,p_execution_mode IN VARCHAR2
445 ,x_completion_status OUT NOCOPY VARCHAR2);
446
447 PROCEDURE Eng_Master_Post_Proc (p_object_id IN NUMBER
448 ,p_rows_rejected_accum IN NUMBER
449 ,p_rows_to_load IN NUMBER);
450
451
452 PROCEDURE Post_dim_status (p_dimension_id IN VARCHAR2
453 ,p_source_system_dc IN VARCHAR2
454 ,p_source_attr_table IN VARCHAR2);
455
456 /*--For Composite Dimension Loader
457 PROCEDURE Process_Rows (x_status OUT NOCOPY NUMBER
458 ,x_message OUT NOCOPY VARCHAR2
459 ,x_rows_processed OUT NOCOPY NUMBER
460 ,x_rows_loaded OUT NOCOPY NUMBER
461 ,x_rows_rejected OUT NOCOPY NUMBER
462 ,p_eng_sql IN VARCHAR2
463 ,p_data_slc IN VARCHAR2
464 ,p_proc_num IN VARCHAR2
465 ,p_slice_id IN VARCHAR2
466 ,p_fetch_limit IN NUMBER
467 ,p_load_type IN VARCHAR2
468 ,p_dimension_varchar_label IN VARCHAR2
469 ,p_execution_mode IN VARCHAR2
470 ,p_structure_id IN NUMBER);
471
472 /*PROCEDURE Pre_Process (x_pre_process_status OUT NOCOPY NUMBER
473 ,p_execution_mode IN VARCHAR2
474 ,p_dimension_varchar_label IN VARCHAR2);
475
476 PROCEDURE Get_Display_Codes (p_dimension_varchar_label IN VARCHAR2,
477 p_structure_id IN NUMBER);
478
479 PROCEDURE Metadata_Initialize(p_dimension_varchar_label IN VARCHAR2);*/
480
481 PROCEDURE Get_Put_Messages (p_msg_count IN NUMBER
482 ,p_msg_data IN VARCHAR2);
483
484 procedure get_dimension_info (p_dimension_varchar_label IN VARCHAR2
485 ,x_dimension_id OUT NOCOPY NUMBER
486 ,x_target_b_table OUT NOCOPY VARCHAR2
487 ,x_target_tl_table OUT NOCOPY VARCHAR2
488 ,x_target_attr_table OUT NOCOPY VARCHAR2
489 ,x_source_b_table OUT NOCOPY VARCHAR2
490 ,x_source_tl_table OUT NOCOPY VARCHAR2
491 ,x_source_attr_table OUT NOCOPY VARCHAR2
492 ,x_member_col OUT NOCOPY VARCHAR2
493 ,x_member_dc_col OUT NOCOPY VARCHAR2
494 ,x_member_t_dc_col OUT NOCOPY VARCHAR2
495 ,x_member_name_col OUT NOCOPY VARCHAR2
496 ,x_member_t_name_col OUT NOCOPY VARCHAR2
497 ,x_member_description_col OUT NOCOPY VARCHAR2
498 ,x_value_set_required_flag OUT NOCOPY VARCHAR2
499 ,x_user_defined_flag OUT NOCOPY VARCHAR2
500 ,x_simple_dimension_flag OUT NOCOPY VARCHAR2
501 ,x_shared_dimension_flag OUT NOCOPY VARCHAR2
502 ,x_hier_table_name OUT NOCOPY VARCHAR2
503 ,x_hier_dimension_flag OUT NOCOPY VARCHAR2
504 ,x_member_id_method_code OUT NOCOPY VARCHAR2
505 ,x_table_handler_name OUT NOCOPY VARCHAR2
506 ,x_composite_dimension_flag OUT NOCOPY VARCHAR2
507 ,x_structure_id OUT NOCOPY NUMBER);
508
509
510 procedure build_mbr_select_stmt (p_load_type IN VARCHAR2
511 ,p_dimension_varchar_label IN VARCHAR2
512 ,p_dimension_id IN NUMBER
513 ,p_target_b_table IN VARCHAR2
514 ,p_target_tl_table IN VARCHAR2
515 ,p_source_b_table IN VARCHAR2
516 ,p_source_tl_table IN VARCHAR2
517 ,p_member_dc_col IN VARCHAR2
518 ,p_member_t_dc_col IN VARCHAR2
519 ,p_member_t_name_col IN VARCHAR2
520 ,p_member_description_col IN VARCHAR2
521 ,p_value_set_required_flag IN VARCHAR2
522 ,p_shared_dimension_flag IN VARCHAR2
523 ,p_hier_dimension_flag IN VARCHAR2
524 ,p_exists_flag IN VARCHAR2
525 ,p_exec_mode_clause IN VARCHAR2
526 ,x_select_stmt OUT NOCOPY VARCHAR2);
527
528 procedure build_bad_tl_select_stmt (p_load_type IN VARCHAR2
529 ,p_dimension_varchar_label IN VARCHAR2
530 ,p_dimension_id IN NUMBER
531 ,p_target_b_table IN VARCHAR2
532 ,p_target_tl_table IN VARCHAR2
533 ,p_source_b_table IN VARCHAR2
534 ,p_source_tl_table IN VARCHAR2
535 ,p_member_dc_col IN VARCHAR2
536 ,p_member_t_dc_col IN VARCHAR2
537 ,p_value_set_required_flag IN VARCHAR2
538 ,p_shared_dimension_flag IN VARCHAR2
539 ,p_hier_dimension_flag IN VARCHAR2
540 ,p_exec_mode_clause IN VARCHAR2
541 ,x_select_stmt OUT NOCOPY VARCHAR2);
542
543 procedure build_tl_ro_mbr_upd_stmt (p_load_type IN VARCHAR2
544 ,p_dimension_varchar_label IN VARCHAR2
545 ,p_dimension_id IN NUMBER
546 ,p_source_tl_table IN VARCHAR2
547 ,p_target_b_table IN VARCHAR2
548 ,p_member_dc_col IN VARCHAR2
549 ,p_member_t_dc_col IN VARCHAR2
550 ,p_exec_mode_clause IN VARCHAR2
551 ,p_shared_dimension_flag IN VARCHAR2
552 ,p_value_set_required_flag IN VARCHAR2
553 ,x_update_stmt OUT NOCOPY VARCHAR2);
554
555
556 procedure build_bad_lang_upd_stmt (p_load_type IN VARCHAR2
557 ,p_dimension_varchar_label IN VARCHAR2
558 ,p_dimension_id IN NUMBER
559 ,p_source_tl_table IN VARCHAR2
560 ,p_exec_mode_clause IN VARCHAR2
561 ,p_shared_dimension_flag IN VARCHAR2
562 ,p_value_set_required_flag IN VARCHAR2
563 ,x_update_stmt OUT NOCOPY VARCHAR2);
564
565 procedure build_enable_update_stmt (p_dimension_varchar_label IN VARCHAR2
566 ,p_dimension_id IN NUMBER
567 ,p_load_type IN VARCHAR2
568 ,p_target_b_table IN VARCHAR2
569 ,p_member_col IN VARCHAR2
570 ,p_member_dc_col IN VARCHAR2
571 ,p_value_set_required_flag IN VARCHAR2
572 ,x_update_stmt OUT NOCOPY VARCHAR2);
573
574 procedure build_tl_update_stmt (p_dimension_varchar_label IN VARCHAR2
575 ,p_dimension_id IN NUMBER
576 ,p_load_type IN VARCHAR2
577 ,p_target_b_table IN VARCHAR2
578 ,p_target_tl_table IN VARCHAR2
579 ,p_member_col IN VARCHAR2
580 ,p_member_dc_col IN VARCHAR2
581 ,p_member_name_col IN VARCHAR2
582 ,p_member_description_col IN VARCHAR2
583 ,p_value_set_required_flag IN VARCHAR2
584 ,x_update_stmt OUT NOCOPY VARCHAR2);
585
586 procedure build_tl_dupname_stmt (p_dimension_varchar_label IN VARCHAR2
587 ,p_dimension_id IN NUMBER
588 ,p_load_type IN VARCHAR2
589 ,p_target_b_table IN VARCHAR2
590 ,p_target_tl_table IN VARCHAR2
591 ,p_member_col IN VARCHAR2
592 ,p_member_dc_col IN VARCHAR2
593 ,p_member_name_col IN VARCHAR2
594 ,p_value_set_required_flag IN VARCHAR2
595 ,p_calling_mode IN VARCHAR2
596 ,x_select_stmt OUT NOCOPY VARCHAR2);
597
598 procedure build_does_attr_exist_stmt (p_target_attr_table IN VARCHAR2
599 ,p_target_b_table IN VARCHAR2
600 ,p_member_col IN VARCHAR2
601 ,p_member_dc_col IN VARCHAR2
602 ,p_value_set_required_flag IN VARCHAR2
603 ,p_version_flag IN VARCHAR2
604 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
605
606 procedure build_does_multattr_exist_stmt (p_target_attr_table IN VARCHAR2
607 ,p_target_b_table IN VARCHAR2
608 ,p_member_col IN VARCHAR2
609 ,p_member_dc_col IN VARCHAR2
610 ,p_value_set_required_flag IN VARCHAR2
611 ,p_attr_value_column_name IN VARCHAR2
612 ,p_attr_assign_vs_id IN NUMBER
613 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
614
615
616 procedure build_get_identical_assgn_stmt (p_target_attr_table IN VARCHAR2
617 ,p_target_b_table IN VARCHAR2
618 ,p_member_col IN VARCHAR2
619 ,p_member_dc_col IN VARCHAR2
620 ,p_value_set_required_flag IN VARCHAR2
621 ,p_date_format_mask IN VARCHAR2
622 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
623
624 procedure build_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
625 ,p_dimension_id IN NUMBER
626 ,p_source_b_table IN VARCHAR2
627 ,p_source_attr_table IN VARCHAR2
628 ,p_target_b_table IN VARCHAR2
629 ,p_member_t_dc_col IN VARCHAR2
630 ,p_member_dc_col IN VARCHAR2
631 ,p_member_col IN VARCHAR2
632 ,p_value_set_required_flag IN VARCHAR2
633 ,p_shared_dimension_flag IN VARCHAR2
634 ,p_hier_dimension_flag IN VARCHAR2
635 ,p_outer_join_flag IN VARCHAR2
636 ,p_specific_member_flag IN VARCHAR2
637 ,p_exec_mode_clause IN VARCHAR2
638 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
639
640 procedure build_attr_lvlspec_select_stmt (p_dimension_varchar_label IN VARCHAR2
641 ,p_dimension_id IN NUMBER
642 ,p_source_b_table IN VARCHAR2
643 ,p_source_attr_table IN VARCHAR2
644 ,p_target_b_table IN VARCHAR2
645 ,p_member_t_dc_col IN VARCHAR2
646 ,p_member_dc_col IN VARCHAR2
647 ,p_value_set_required_flag IN VARCHAR2
648 ,p_shared_dimension_flag IN VARCHAR2
649 ,p_hier_dimension_flag IN VARCHAR2
650 ,p_outer_join_flag IN VARCHAR2
651 ,p_exec_mode_clause IN VARCHAR2
652 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
653
654
655 procedure build_bad_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
656 ,p_dimension_id IN NUMBER
657 ,p_source_b_table IN VARCHAR2
658 ,p_source_tl_table IN VARCHAR2
659 ,p_source_attr_table IN VARCHAR2
660 ,p_target_b_table IN VARCHAR2
661 ,p_member_t_dc_col IN VARCHAR2
662 ,p_member_dc_col IN VARCHAR2
663 ,p_value_set_required_flag IN VARCHAR2
664 ,p_shared_dimension_flag IN VARCHAR2
665 ,p_exec_mode_clause IN VARCHAR2
666 ,x_bad_attr_select_stmt OUT NOCOPY VARCHAR2);
667
668
669 procedure verify_attr_member (p_attribute_varchar_label IN VARCHAR2
670 ,p_dimension_varchar_label IN VARCHAR2
671 ,p_attr_member_dc IN VARCHAR2
672 ,p_attr_member_vs_dc IN VARCHAR2
673 ,x_attr_success OUT NOCOPY VARCHAR2
674 ,x_member OUT NOCOPY VARCHAR2);
675
676
677 procedure build_member_exists_stmt (p_member_table IN VARCHAR2
678 ,p_member_col IN VARCHAR2
679 ,p_member_dc_col IN VARCHAR2
680 ,p_value_set_required_flag IN VARCHAR2
681 ,x_member_exists_stmt OUT NOCOPY VARCHAR2);
682
683 procedure build_bad_new_mbrs_stmt (p_load_type IN VARCHAR2
684 ,p_dimension_varchar_label IN VARCHAR2
685 ,p_source_b_table IN VARCHAR2
686 ,p_source_tl_table IN VARCHAR2
687 ,p_target_b_table IN VARCHAR2
688 ,p_member_t_dc_col IN VARCHAR2
689 ,p_member_dc_col IN VARCHAR2
690 ,p_value_set_required_flag IN VARCHAR2
691 ,p_shared_dimension_flag IN VARCHAR2
692 ,p_exec_mode_clause IN VARCHAR2
693 ,x_bad_member_select_stmt OUT NOCOPY VARCHAR2);
694
695 procedure build_bad_attr_vers_stmt (p_dimension_varchar_label IN VARCHAR2
696 ,p_source_attr_table IN VARCHAR2
697 ,p_shared_dimension_flag IN VARCHAR2
698 ,p_exec_mode_clause IN VARCHAR2
699 ,x_bad_attr_vers_select_stmt OUT NOCOPY VARCHAR2);
700
701 procedure get_attr_version (p_dimension_varchar_label IN VARCHAR2
702 ,p_attribute_varchar_label IN VARCHAR2
703 ,p_version_display_code IN VARCHAR2
704 ,x_version_id OUT NOCOPY NUMBER);
705
706 procedure build_insert_member_stmt (p_table_handler_name IN VARCHAR2
707 ,p_dimension_id IN NUMBER
708 ,p_value_set_required_flag IN VARCHAR2
709 ,p_hier_dimension_flag IN VARCHAR2
710 ,p_simple_dimension_flag IN VARCHAR2
711 ,p_member_id_method_code VARCHAR2
712 ,p_member_col IN VARCHAR2
713 ,p_member_dc_col IN VARCHAR
714 ,p_member_name_col IN VARCHAR2
715 ,x_insert_member_stmt OUT NOCOPY VARCHAR2);
716
717 procedure build_insert_attr_stmt (p_target_attr_table IN VARCHAR2
718 ,p_target_b_table IN VARCHAR2
719 ,p_member_col IN VARCHAR2
720 ,p_member_dc_col IN VARCHAR2
721 ,p_value_set_required_flag IN VARCHAR2
722 ,x_insert_attr_stmt OUT NOCOPY VARCHAR2);
723
724
725 procedure build_status_update_stmt (p_source_table IN VARCHAR2
726 ,x_update_status_stmt OUT NOCOPY VARCHAR2);
727
728 procedure build_dep_status_update_stmt (p_dimension_varchar_label IN VARCHAR2
729 ,p_source_table IN VARCHAR2
730 ,p_member_t_dc_col IN VARCHAR2
731 ,p_value_set_required_flag IN VARCHAR2
732 ,x_update_status_stmt OUT NOCOPY VARCHAR2);
733
734 procedure build_attrlab_update_stmt (p_dimension_varchar_label IN VARCHAR2
735 ,p_source_attr_table IN VARCHAR2
736 ,p_shared_dimension_flag IN VARCHAR2
737 ,p_exec_mode_clause IN VARCHAR2
738 ,x_update_status_stmt OUT NOCOPY VARCHAR2);
739
740 procedure build_not_user_label_upd_stmt (p_dimension_varchar_label IN VARCHAR2
741 ,p_source_attr_table IN VARCHAR2
742 ,p_shared_dimension_flag IN VARCHAR2
743 ,p_exec_mode_clause IN VARCHAR2
744 ,x_update_status_stmt OUT NOCOPY VARCHAR2);
745
746 procedure build_delete_stmt (p_source_table IN VARCHAR2
747 ,x_delete_stmt OUT NOCOPY VARCHAR2);
748
749 procedure build_special_delete_stmt (p_source_table IN VARCHAR2
750 ,x_delete_stmt OUT NOCOPY VARCHAR2);
751
752 procedure build_remain_mbr_select_stmt (p_load_type IN VARCHAR2
753 ,p_dimension_id IN NUMBER
754 ,p_dimension_varchar_label IN VARCHAR2
755 ,p_shared_dimension_flag IN VARCHAR2
756 ,p_value_set_required_flag IN VARCHAR2
757 ,p_hier_dimension_flag IN VARCHAR2
758 ,p_source_b_table IN VARCHAR2
759 ,p_target_b_table IN VARCHAR2
760 ,p_member_col IN VARCHAR2
761 ,p_member_dc_col IN VARCHAR2
762 ,p_member_t_dc_col IN VARCHAR2
763 ,p_exec_mode_clause IN VARCHAR2
764 ,x_remain_mbr_select_stmt OUT NOCOPY VARCHAR2);
765
766 procedure build_dimgrp_update_stmt (p_target_b_table IN VARCHAR2
767 ,p_value_set_required_flag IN VARCHAR2
768 ,p_member_dc_col IN VARCHAR2
769 ,x_update_stmt OUT NOCOPY VARCHAR2);
770
771 procedure build_attr_update_stmt (p_target_attr_table IN VARCHAR2
772 ,p_target_b_table IN VARCHAR2
773 ,p_member_dc_col IN VARCHAR2
774 ,p_member_col IN VARCHAR2
775 ,p_value_set_required_flag IN VARCHAR2
776 ,x_update_stmt OUT NOCOPY VARCHAR2);
777
778 procedure build_src_sys_select_stmt (p_dimension_varchar_label IN VARCHAR2
779 ,p_source_attr_table IN VARCHAR2
780 ,p_shared_dimension_flag IN VARCHAR2
781 ,x_src_sys_select_stmt OUT NOCOPY VARCHAR2);
782
783 procedure get_mp_rows_rejected (x_rows_rejected OUT NOCOPY NUMBER
784 ,x_rows_loaded OUT NOCOPY NUMBER);
785
786 procedure build_seq_enf_hiercount_stmt (p_value_set_required_flag IN VARCHAR2
787 ,p_hier_table_name IN VARCHAR2
788 ,x_select_stmt OUT NOCOPY VARCHAR2);
789
790 procedure calp_date_overlap_check(x_rows_rejected OUT NOCOPY NUMBER
791 ,p_operation_mode IN VARCHAR2);
792
793 procedure build_calp_interim_insert_stmt (x_insert_calp_stmt OUT NOCOPY VARCHAR2
794 ,x_insert_calp_attr_stmt OUT NOCOPY VARCHAR2);
795
796 procedure build_calp_status_update_stmt (p_operation_mode IN VARCHAR2
797 ,p_source_table IN VARCHAR2
798 ,x_update_status_stmt OUT NOCOPY VARCHAR2);
799
800 procedure build_calp_delete_stmt (p_source_table IN VARCHAR2
801 ,p_operation_mode IN VARCHAR2
802 ,x_calp_delete_stmt OUT NOCOPY VARCHAR2);
803
804
805 procedure truncate_calp_interim;
806
807 procedure get_attr_assign_calp (x_cal_period_id OUT NOCOPY VARCHAR2
808 ,x_record_status OUT NOCOPY VARCHAR2
809 ,p_calendar_dc IN VARCHAR2
810 ,p_dimension_group_dc IN VARCHAR2
811 ,p_end_date IN DATE
812 ,p_cal_period_number IN NUMBER);
813
814
815 procedure raise_member_bus_event (p_dimension_varchar_label IN VARCHAR2);
816
817 -----------------------------------------------------------------------------
818 -- Package bodies for functions/procedures
819 -----------------------------------------------------------------------------
820
821 -------------------------------------------------------------
822 -- Procedure for getting number of rejected rows from the MP sub-processes
823 -- Bug#4355484 also gets the number of rows loaded so that we can figure
824 -- out if we created new members or not
825 -------------------------------------------------------------
826 procedure get_mp_rows_rejected (x_rows_rejected OUT NOCOPY NUMBER
827 ,x_rows_loaded OUT NOCOPY NUMBER) IS
828
829 BEGIN
830
831
832 SELECT NVL(SUM(rows_rejected),0), NVL(SUM(rows_loaded),0)
833 INTO x_rows_rejected, x_rows_loaded
834 FROM fem_mp_process_ctl_t
835 WHERE req_id = gv_request_id;
836
837 END get_mp_rows_rejected;
838 -------------------------------------------------------------
839 -- Procedure for getting messages off the stack
840 -------------------------------------------------------------
841 PROCEDURE Get_Put_Messages (
842 p_msg_count IN NUMBER,
843 p_msg_data IN VARCHAR2
844 )
845 IS
846
847 v_msg_count NUMBER;
848 v_msg_data VARCHAR2(4000);
849 v_msg_out NUMBER;
850 v_message VARCHAR2(4000);
851
852 v_block CONSTANT VARCHAR2(80) :=
853 'fem.plsql.fem_dim_member_loader_pkg.get_put_messages';
854
855 BEGIN
856
857 FEM_ENGINES_PKG.TECH_MESSAGE
858 (p_severity => c_log_level_2,
859 p_module => v_block||'.msg_count',
860 p_msg_text => p_msg_count);
861
862 v_msg_data := p_msg_data;
863
864 IF (p_msg_count = 1)
865 THEN
866 FND_MESSAGE.Set_Encoded(v_msg_data);
867 v_message := FND_MESSAGE.Get;
868
869 FEM_ENGINES_PKG.User_Message(
870 p_msg_text => v_message);
871
872 FEM_ENGINES_PKG.TECH_MESSAGE
873 (p_severity => c_log_level_2,
874 p_module => v_block||'.msg_data',
875 p_msg_text => v_message);
876
877 ELSIF (p_msg_count > 1)
878 THEN
879 FOR i IN 1..p_msg_count
880 LOOP
881 FND_MSG_PUB.Get(
882 p_msg_index => i,
883 p_encoded => c_false,
884 p_data => v_message,
885 p_msg_index_out => v_msg_out);
886
887 FEM_ENGINES_PKG.User_Message(
888 p_msg_text => v_message);
889
890 FEM_ENGINES_PKG.TECH_MESSAGE
891 (p_severity => c_log_level_2,
892 p_module => v_block||'.msg_data',
893 p_msg_text => v_message);
894
895 END LOOP;
896 END IF;
897
898 FND_MSG_PUB.Initialize;
899
900 END Get_Put_Messages;
901
902
903 /*===========================================================================+
904 | PROCEDURE
905 | Raise_member_bus_event
906 |
907 | DESCRIPTION
908 | Raises a business event for when a new member is
909 | created or updated
910 |
911 | SCOPE - PRIVATE
912 |
913 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
914 |
915 | ARGUMENTS : IN:
916 |
917 | OUT:
918 |
919 | IN/ OUT:
920 |
921 | RETURNS : NONE
922 |
923 | NOTES
924 |
925 |
926 | MODIFICATION HISTORY
927 | Rob Flippo 25-MAY-05 Created
928 +===========================================================================*/
929
930 procedure raise_member_bus_event (p_dimension_varchar_label IN VARCHAR2) IS
931
932 v_param_list wf_parameter_list_t;
933 v_event_sequence NUMBER;
934 c_proc_name VARCHAR2(30) := 'Raise_bus_event';
935 BEGIN
936 FEM_ENGINES_PKG.TECH_MESSAGE
937 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
938
939
940 SELECT FEM_DHM_METADATA_OPS_KEY_S.nextval
941 INTO v_event_sequence
942 FROM dual;
943
944
945 WF_EVENT.addparametertolist
946 (p_name => 'DIMENSION_VARCHAR_LABEL',
947 p_value => p_dimension_varchar_label,
948 p_parameterlist => v_param_list);
949
950
951 WF_Event.Raise( p_event_name => 'oracle.apps.fem.dhm.dimension.event'
952 ,p_event_key => v_event_sequence
953 ,p_parameters => v_param_list);
954
955 FEM_ENGINES_PKG.TECH_MESSAGE
956 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
957
958
959 END raise_member_bus_event;
960
961
962 /*===========================================================================+
963 | PROCEDURE
964 | Engine_Master_Prep
965 |
966 | DESCRIPTION
967 | Called from Load Dimension
968 | Validates input parameters and gets dimension metadata
969 | for the run
970 | SCOPE - PRIVATE
971 |
972 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
973 |
974 | ARGUMENTS : IN:
975 |
976 |
977 | OUT:
978 |
979 |
980 |
981 | IN/ OUT:
982 |
983 | RETURNS : NONE
984 |
985 | NOTES
986 | Added SQL verification on having multiple versions for the dimension
987 | marked as "Default = Y". Since this data error causes unexpected behavior
988 | in the loader, the loader throws an exception for this and requires the
989 | user to clean up the versions for that dimension before proceeding with
990 | the load
991 |
992 | MODIFICATION HISTORY
993 | Rob Flippo 27-FEB-04 Created
994 | Rob Flippo 21-SEP-04 Bug#3900960 Add mesaging for when 0 rows found
995 | for Snapshot loading
996 | Rob Flippo 16-MAR-05 Bug#4244082 Added x_hier_table_name
997 | Rob Flippo 24-JAN-06 Bug#4927869 - Changed ICX Date format to
998 | FEM_INTF_ATTR_DATE_FORMAT_MASK;
999 +===========================================================================*/
1000
1001 PROCEDURE Engine_Master_Prep ( p_dimension_varchar_label IN VARCHAR2
1002 ,p_object_definition_id IN NUMBER
1003 ,p_execution_mode IN VARCHAR2
1004 ,x_dimension_id OUT NOCOPY NUMBER
1005 ,x_target_b_table OUT NOCOPY VARCHAR2
1006 ,x_target_tl_table OUT NOCOPY VARCHAR2
1007 ,x_target_attr_table OUT NOCOPY VARCHAR2
1008 ,x_source_b_table OUT NOCOPY VARCHAR2
1009 ,x_source_tl_table OUT NOCOPY VARCHAR2
1010 ,x_source_attr_table OUT NOCOPY VARCHAR2
1011 ,x_member_col OUT NOCOPY VARCHAR2
1012 ,x_member_dc_col OUT NOCOPY VARCHAR2
1013 ,x_member_t_dc_col OUT NOCOPY VARCHAR2
1014 ,x_member_name_col OUT NOCOPY VARCHAR2
1015 ,x_member_t_name_col OUT NOCOPY VARCHAR2
1016 ,x_member_description_col OUT NOCOPY VARCHAR2
1017 ,x_value_set_required_flag OUT NOCOPY VARCHAR2
1018 ,x_user_defined_flag OUT NOCOPY VARCHAR2
1019 ,x_simple_dimension_flag OUT NOCOPY VARCHAR2
1020 ,x_shared_dimension_flag OUT NOCOPY VARCHAR2
1021 ,x_table_handler_name OUT NOCOPY VARCHAR2
1022 ,x_composite_dimension_flag OUT NOCOPY VARCHAR2
1023 ,x_structure_id OUT NOCOPY NUMBER
1024 ,x_exec_mode_clause OUT NOCOPY VARCHAR2
1025 ,x_eng_master_prep_status OUT NOCOPY VARCHAR2
1026 ,x_hier_table_name OUT NOCOPY VARCHAR2
1027 ,x_hier_dimension_flag OUT NOCOPY VARCHAR2
1028 ,x_member_id_method_code OUT NOCOPY VARCHAR2
1029 ,x_rows_to_load OUT NOCOPY NUMBER
1030 ,x_date_format_mask OUT NOCOPY VARCHAR2
1031 )
1032 IS
1033
1034 -- Variable for validating if the Date Format Mask is valid
1035 v_date_format_result DATE;
1036 c_proc_name VARCHAR2(30) := 'Engine_Maser_Prep';
1037 v_default_version_count NUMBER;
1038 v_temp_attribute VARCHAR2(30); -- temporary holding variable for attribute
1039 -- when there is more than 1 default version
1040 -- defined for it
1041 v_sql_stmt VARCHAR2(4000); -- variable for holding NDS statements
1042 v_dim_label_where_cond VARCHAR2(1000);
1043
1044 -- for testing the date format
1045 v_test_date DATE;
1046
1047 -- variables for counting rows in the source tables
1048 v_source_b_count NUMBER :=0;
1049 v_source_tl_count NUMBER :=0;
1050 v_source_attr_count NUMBER :=0;
1051 v_source_dimgrpb_count NUMBER :=0;
1052 v_source_dimgrptl_count NUMBER :=0;
1053 v_obj_def_display_name VARCHAR2(150); -- translatable name for the load operation
1054
1055 CURSOR c_attr_vers (p_dimension_id NUMBER) IS
1056 SELECT attribute_id, attribute_varchar_label
1057 FROM fem_dim_attributes_b
1058 WHERE dimension_id = p_dimension_id;
1059
1060 BEGIN
1061
1062 FEM_ENGINES_PKG.TECH_MESSAGE
1063 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1064
1065 /**************************************************************
1066 RCF 5/31/2005 Bug#3923485 Commenting out date_format_mask validation
1067 since we are going to use the ICX: Date Format Mask profile option
1068 BEGIN
1069 IF p_date_format_mask IS NULL THEN
1070 RAISE e_invalid_date_mask;
1071 END IF;
1072 v_date_format_result := to_date((to_char(sysdate,p_date_format_mask)),p_date_format_mask);
1073 EXCEPTION
1074 WHEN e_invalid_date_result THEN
1075 RAISE e_invalid_date_mask;
1076 WHEN e_invalid_date_month THEN
1077 RAISE e_invalid_date_mask;
1078 END;
1079 ***************************************************************/
1080
1081 ------------------------------------------------------------------------------
1082 -- Bug#4927869 Date format mask comes from FEM_INTF_ATTR_DATE_FORMAT_MASK profile option
1083 ------------------------------------------------------------------------------
1084 x_date_format_mask:= FND_PROFILE.Value_Specific(
1085 'FEM_INTF_ATTR_DATE_FORMAT_MASK',null,null,null);
1086
1087 BEGIN
1088 IF x_date_format_mask IS NULL THEN
1089 RAISE e_invalid_date_mask;
1090 ELSE
1091 v_test_date := to_date((to_char(sysdate,x_date_format_mask)),x_date_format_mask);
1092 END IF;
1093 EXCEPTION
1094 WHEN OTHERS THEN
1095 RAISE e_invalid_date_mask;
1096 END;
1097
1098
1099 ------------------------------------------------------------------------------
1100 -- Validate the Dimension input parameter and get the source and target table
1101 -- names for the members and translatable names/descriptions
1102 ------------------------------------------------------------------------------
1103
1104 get_dimension_info (p_dimension_varchar_label
1105 ,x_dimension_id
1106 ,x_target_b_table
1107 ,x_target_tl_table
1108 ,x_target_attr_table
1109 ,x_source_b_table
1110 ,x_source_tl_table
1111 ,x_source_attr_table
1112 ,x_member_col
1113 ,x_member_dc_col
1114 ,x_member_t_dc_col
1115 ,x_member_name_col
1116 ,x_member_t_name_col
1117 ,x_member_description_col
1118 ,x_value_set_required_flag
1119 ,x_user_defined_flag
1120 ,x_simple_dimension_flag
1121 ,x_shared_dimension_flag
1122 ,x_hier_table_name
1123 ,x_hier_dimension_flag
1124 ,x_member_id_method_code
1125 ,x_table_handler_name
1126 ,x_composite_dimension_flag
1127 ,x_structure_id);
1128
1129 -- Setting the Execution Mode clause for Selects against the interface tables
1130 IF p_execution_mode = 'S' THEN
1131 x_exec_mode_clause := ' IN (''LOAD'')';
1132 ELSE
1133 x_exec_mode_clause := ' LIKE ''%''';
1134 END IF; -- execution mode where condition
1135
1136 -- Begin comp_dim_loader code
1137 IF x_composite_dimension_flag = 'N' THEN
1138
1139 -- Verification that only one default version exists
1140 -- for each attribute of the dimension being processed
1141 FOR attr IN c_attr_vers (x_dimension_id) LOOP
1142 SELECT count(*)
1143 INTO v_default_version_count
1144 FROM fem_dim_attr_versions_b
1145 WHERE attribute_id = attr.attribute_id
1146 AND default_version_flag='Y';
1147
1148 IF (v_default_version_count > 1) THEN
1149 v_temp_attribute := attr.attribute_varchar_label;
1150 RAISE e_mult_default_version;
1151 END IF;
1152 END LOOP; -- c_attr_vers cursor
1153
1154 -- Bug#3900960 Raise exception when Snapshot load and 0 rows found
1155 -- in all interface tables
1156 IF x_shared_dimension_flag = 'Y' and x_value_set_required_flag = 'N' THEN
1157 v_dim_label_where_cond := ' AND dimension_varchar_label = '''||p_dimension_varchar_label||'''';
1158 ELSE v_dim_label_where_cond := '';
1159 END IF;
1160 END IF;
1161
1162 FEM_ENGINES_PKG.TECH_MESSAGE
1163 (p_severity => c_log_level_1,
1164 p_module => c_block||'.'||'Engine_Master_Prep',
1165 p_msg_text => 'Check for Source rows');
1166
1167 v_sql_stmt := 'SELECT count(*) FROM '||x_source_b_table||
1168 ' WHERE status '||x_exec_mode_clause||
1169 v_dim_label_where_cond;
1170
1171 FEM_ENGINES_PKG.TECH_MESSAGE
1172 (p_severity => c_log_level_1,
1173 p_module => c_block||'.'||'Engine_Master_Prep'||'.source_b',
1174 p_msg_text => v_sql_stmt);
1175 execute immediate v_sql_stmt
1176 into v_source_b_count;
1177
1178 IF x_composite_dimension_flag = 'N' then --
1179
1180 v_sql_stmt := 'SELECT count(*) FROM '||x_source_tl_table||
1181 ' WHERE status '||x_exec_mode_clause||
1182 v_dim_label_where_cond;
1183 FEM_ENGINES_PKG.TECH_MESSAGE
1184 (p_severity => c_log_level_1,
1185 p_module => c_block||'.'||'Engine_Master_Prep'||'.source_tl',
1186 p_msg_text => v_sql_stmt);
1187 execute immediate v_sql_stmt
1188 into v_source_tl_count;
1189
1190
1191 IF x_simple_dimension_flag ='N' THEN
1192 v_sql_stmt := 'SELECT count(*) FROM '||x_source_attr_table||
1193 ' WHERE status '||x_exec_mode_clause||
1194 v_dim_label_where_cond;
1195 FEM_ENGINES_PKG.TECH_MESSAGE
1196 (p_severity => c_log_level_1,
1197 p_module => c_block||'.'||'Engine_Master_Prep'||'.source_attr',
1198 p_msg_text => v_sql_stmt);
1199 execute immediate v_sql_stmt
1200 into v_source_attr_count;
1201 END IF;
1202
1203 FEM_ENGINES_PKG.TECH_MESSAGE
1204 (c_log_level_1,c_block||'.'||c_proc_name||'.after attr count',null);
1205
1206 IF x_hier_dimension_flag = 'Y' THEN
1207 v_sql_stmt := 'SELECT count(*) FROM fem_dimension_grps_b_t '||
1208 ' WHERE dimension_varchar_label ='||
1209 ''''||p_dimension_varchar_label||''''||
1210 ' AND status '||x_exec_mode_clause;
1211 FEM_ENGINES_PKG.TECH_MESSAGE
1212 (p_severity => c_log_level_1,
1213 p_module => c_block||'.'||'Engine_Master_Prep'||'.dimgrp_b',
1214 p_msg_text => v_sql_stmt);
1215 execute immediate v_sql_stmt
1216 into v_source_dimgrpb_count;
1217 v_sql_stmt := 'SELECT count(*) FROM fem_dimension_grps_tl_t '||
1218 'WHERE dimension_varchar_label ='||
1219 ''''||p_dimension_varchar_label||''''||
1220 ' AND status '||x_exec_mode_clause;
1221 FEM_ENGINES_PKG.TECH_MESSAGE
1222 (p_severity => c_log_level_1,
1223 p_module => c_block||'.'||'Engine_Master_Prep'||'.dimgrp_tl',
1224 p_msg_text => v_sql_stmt);
1225
1226 execute immediate v_sql_stmt
1227 into v_source_dimgrptl_count;
1228 END IF;
1229
1230 -- If no rows exist in all source tables, quit with an exception
1231 IF --p_execution_mode = 'S' AND
1232 v_source_b_count = 0 AND v_source_tl_count = 0 AND
1233 v_source_attr_count = 0 AND v_source_dimgrpb_count = 0 AND
1234 v_source_dimgrptl_count = 0 THEN
1235 RAISE e_no_rows_to_load;
1236 END IF;
1237 ELSE
1238
1239 IF --p_execution_mode = 'S' AND
1240 v_source_b_count = 0 THEN
1241
1242 RAISE e_no_rows_to_load;
1243 END IF;
1244
1245 x_rows_to_load := v_source_b_count;
1246 END IF;
1247
1248
1249 x_rows_to_load := v_source_b_count + v_source_tl_count + v_source_attr_count
1250 + v_source_dimgrpb_count + v_source_dimgrptl_count;
1251
1252 x_eng_master_prep_status := 'SUCCESS';
1253
1254 FEM_ENGINES_PKG.TECH_MESSAGE
1255 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1256
1257 EXCEPTION
1258 WHEN e_no_rows_to_load THEN
1259
1260 SELECT display_name
1261 INTO v_obj_def_display_name
1262 FROM fem_object_definition_vl
1263 WHERE object_definition_id = p_object_definition_id;
1264
1265 FEM_ENGINES_PKG.TECH_MESSAGE
1266 (p_severity => c_log_level_5
1267 ,p_module => c_block||'.'||c_proc_name||'.Exception'
1268 ,p_app_name => c_fem
1269 ,p_msg_name => G_NO_ROWS_TO_LOAD
1270 ,P_TOKEN1 => 'OPERATION'
1271 ,P_VALUE1 => v_obj_def_display_name);
1272
1273 FEM_ENGINES_PKG.USER_MESSAGE
1274 (p_app_name => c_fem
1275 ,p_msg_name => G_NO_ROWS_TO_LOAD
1276 ,P_TOKEN1 => 'OPERATION'
1277 ,P_VALUE1 => v_obj_def_display_name);
1278
1279 x_eng_master_prep_status := 'ERROR';
1280
1281 WHEN e_invalid_date_mask THEN
1282
1283 FEM_ENGINES_PKG.TECH_MESSAGE
1284 (p_severity => c_log_level_5
1285 ,p_module => c_block||'.'||c_proc_name||'.Exception'
1286 ,p_app_name => c_fem
1287 ,p_msg_name => G_INVALID_DATE_MASK);
1288
1289 FEM_ENGINES_PKG.USER_MESSAGE
1290 (p_app_name => c_fem
1291 ,p_msg_name => G_INVALID_DATE_MASK);
1292
1293 x_eng_master_prep_status := 'ERROR';
1294
1295
1296 WHEN e_dimension_not_found THEN
1297
1298 FEM_ENGINES_PKG.TECH_MESSAGE
1299 (p_severity => c_log_level_5
1300 ,p_module => c_block||'.'||c_proc_name||'.Exception'
1301 ,p_app_name => c_fem
1302 ,p_msg_name => G_DIM_NOT_FOUND);
1303
1304 FEM_ENGINES_PKG.USER_MESSAGE
1305 (p_app_name => c_fem
1306 ,p_msg_name => G_DIM_NOT_FOUND);
1307
1308 x_eng_master_prep_status := 'ERROR';
1309
1310 WHEN e_invalid_simple_dim THEN
1311
1312 FEM_ENGINES_PKG.TECH_MESSAGE
1313 (p_severity => c_log_level_5
1314 ,p_module => c_block||'.'||c_proc_name||'.Exception'
1315 ,p_app_name => c_fem
1316 ,p_msg_name => G_INVALID_SIMPLE_DIM);
1317
1318 FEM_ENGINES_PKG.USER_MESSAGE
1319 (p_app_name => c_fem
1320 ,p_msg_name => G_INVALID_SIMPLE_DIM);
1321
1322 x_eng_master_prep_status := 'ERROR';
1323
1324 WHEN e_mult_default_version THEN
1325
1326 FEM_ENGINES_PKG.TECH_MESSAGE
1327 (p_severity => c_log_level_5
1328 ,p_module => c_block||'.'||c_proc_name||'.Exception'
1329 ,p_app_name => c_fem
1330 ,p_msg_name => G_MULT_DEFAULT_VERSION);
1331
1332 FEM_ENGINES_PKG.USER_MESSAGE
1333 (p_app_name => c_fem
1334 ,p_msg_name => G_MULT_DEFAULT_VERSION
1335 ,P_TOKEN1 => 'ATTRIBUTE_VARCHAR_LABEL'
1336 ,P_VALUE1 => v_temp_attribute);
1337
1338 x_eng_master_prep_status := 'ERROR';
1339
1340
1341 END Engine_Master_Prep;
1342
1343 /*===========================================================================+
1344 | PROCEDURE
1345 | Register_process_execution
1346 |
1347 | DESCRIPTION
1348 | Registers the concurrent request in FEM_PL_REQUESTS, registers
1349 | the object execution in FEM_PL_OBJECT_EXECUTIION, obtaining an
1350 | FEM "execution lock, and performs other FEM process initialization
1351 | steps.
1352 | SCOPE - PRIVATE
1353 |
1354 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1355 |
1356 | ARGUMENTS : IN:
1357 |
1358 |
1359 | OUT:
1360 | x_completion_code returns 0 for success, 2 for failure.
1361 |
1362 |
1363 | IN/ OUT:
1364 |
1365 | RETURNS : NONE
1366 |
1367 | NOTES
1368 |
1369 |
1370 | MODIFICATION HISTORY
1371 | Rob Flippo 27-FEB-04 Created
1372 |
1373 +===========================================================================*/
1374
1375 PROCEDURE Register_process_execution (p_object_id IN NUMBER
1376 ,p_obj_def_id IN NUMBER
1377 ,p_execution_mode IN VARCHAR2
1378 ,x_completion_status OUT NOCOPY VARCHAR2)
1379 IS
1380
1381 v_API_return_status VARCHAR2(30);
1382 v_exec_state VARCHAR2(30); -- NORMAL, RESTART, RERUN
1383 v_num_msg NUMBER;
1384 v_stmt_type fem_pl_tables.statement_type%TYPE;
1385 i PLS_INTEGER;
1386 v_msg_count NUMBER;
1387 v_msg_data VARCHAR2(4000);
1388 v_previous_request_id NUMBER;
1389
1390 Exec_Lock_Exists EXCEPTION;
1391 e_pl_register_req_failed EXCEPTION;
1392 e_exec_lock_failed EXCEPTION;
1393
1394
1395 BEGIN
1396 x_completion_status := 'SUCCESS';
1397
1398 FEM_ENGINES_PKG.Tech_Message
1399 (p_severity => c_log_level_2,
1400 p_module => c_block||'.'||'Register_process_execution',
1401 p_msg_text => 'BEGIN');
1402
1403 -- Call the FEM_PL_PKG.Register_Request API procedure to register
1404 -- the concurrent request in FEM_PL_REQUESTS.
1405
1406 FEM_PL_PKG.Register_Request
1407 (P_API_VERSION => c_api_version,
1408 P_COMMIT => c_false,
1409 P_CAL_PERIOD_ID => null,
1410 P_LEDGER_ID => null,
1411 P_DATASET_IO_OBJ_DEF_ID => null,
1412 P_OUTPUT_DATASET_CODE => null,
1413 P_SOURCE_SYSTEM_CODE => null,
1414 P_EFFECTIVE_DATE => null,
1415 P_RULE_SET_OBJ_DEF_ID => null,
1416 P_RULE_SET_NAME => null,
1417 P_REQUEST_ID => gv_request_id,
1418 P_USER_ID => gv_apps_user_id,
1419 P_LAST_UPDATE_LOGIN => gv_login_id,
1420 P_PROGRAM_ID => gv_pgm_id,
1421 P_PROGRAM_LOGIN_ID => gv_login_id,
1422 P_PROGRAM_APPLICATION_ID => gv_pgm_app_id,
1423 P_EXEC_MODE_CODE => p_execution_mode,
1424 P_DIMENSION_ID => null,
1425 P_TABLE_NAME => null,
1426 P_HIERARCHY_NAME => null,
1427 X_MSG_COUNT => v_msg_count,
1428 X_MSG_DATA => v_msg_data,
1429 X_RETURN_STATUS => v_API_return_status);
1430
1431 FEM_ENGINES_PKG.Tech_Message
1432 (p_severity => c_log_level_1,
1433 p_module => c_block||'.'||'Register_request.v_api_return_status',
1434 p_msg_text => v_API_return_status);
1435
1436 IF v_API_return_status NOT IN ('S') THEN
1437 RAISE e_pl_register_req_failed;
1438 END IF;
1439 -- Check for process locks and process overlaps and register
1440 -- the execution in FEM_PL_OBJECT_EXECUTIONS, obtaining an execution lock.
1441
1442 FEM_PL_PKG.Register_Object_Execution
1443 (P_API_VERSION => c_api_version,
1444 P_COMMIT => c_false,
1445 P_REQUEST_ID => gv_request_id,
1446 P_OBJECT_ID => p_object_id,
1447 P_EXEC_OBJECT_DEFINITION_ID => p_obj_def_id,
1448 P_USER_ID => gv_apps_user_id,
1449 P_LAST_UPDATE_LOGIN => gv_login_id,
1450 P_EXEC_MODE_CODE => p_execution_mode,
1451 X_EXEC_STATE => v_exec_state,
1452 X_PREV_REQUEST_ID => v_previous_request_id,
1453 X_MSG_COUNT => v_msg_count,
1454 X_MSG_DATA => v_msg_data,
1455 X_RETURN_STATUS => v_API_return_status);
1456
1457 IF v_API_return_status NOT IN ('S') THEN
1458 -- Lock exists or API call failed
1459 RAISE e_exec_lock_failed;
1460 END IF;
1461
1462 FEM_PL_PKG.Register_Object_Def
1463 (P_API_VERSION => c_api_version,
1464 P_COMMIT => c_false,
1465 P_REQUEST_ID => gv_request_id,
1466 P_OBJECT_ID => p_object_id,
1467 P_OBJECT_DEFINITION_ID => p_obj_def_id,
1468 P_USER_ID => gv_apps_user_id,
1469 P_LAST_UPDATE_LOGIN => gv_login_id,
1470 X_MSG_COUNT => v_msg_count,
1471 X_MSG_DATA => v_msg_data,
1472 X_RETURN_STATUS => v_API_return_status);
1473
1474 IF v_API_return_status NOT IN ('S') THEN
1475 -- Lock exists or API call failed
1476 RAISE e_exec_lock_failed;
1477 END IF;
1478
1479 -- Successful completion
1480
1481 FEM_ENGINES_PKG.Tech_Message
1482 (p_severity => c_log_level_1,
1483 p_module => c_block||'.'||'Register_process_execution',
1484 p_msg_text => 'END');
1485
1486
1487 COMMIT;
1488
1489 EXCEPTION
1490 WHEN e_pl_register_req_failed THEN
1491 -- get errors from the stack
1492 Get_Put_Messages (
1493 p_msg_count => v_msg_count,
1494 p_msg_data => v_msg_data);
1495
1496 -- display user message
1497 FEM_ENGINES_PKG.USER_MESSAGE
1498 (P_APP_NAME => c_fem
1499 ,P_MSG_NAME => G_PL_REG_REQUEST_ERR);
1500
1501 FEM_ENGINES_PKG.USER_MESSAGE
1502 (P_APP_NAME => c_fem
1503 ,P_MSG_NAME => 'FEM_DIM_MBR_LDR_OBJEXEC');
1504
1505 x_completion_status := 'ERROR';
1506
1507 RAISE e_pl_registration_failed;
1508
1509 WHEN e_exec_lock_failed THEN
1510 -- get errors from the stack
1511 -- Bug#3920599 - remove extraneous messages
1512 -- Get_Put_Messages (
1513 -- p_msg_count => v_msg_count,
1514 -- p_msg_data => v_msg_data);
1515
1516 --FEM_ENGINES_PKG.USER_MESSAGE
1517 --(P_APP_NAME => c_fem
1518 --,P_MSG_NAME => G_PL_OBJ_EXEC_LOCK_ERR);
1519
1520 FEM_ENGINES_PKG.USER_MESSAGE
1521 (P_APP_NAME => c_fem
1522 ,P_MSG_NAME => 'FEM_DIM_MBR_LDR_OBJEXEC');
1523
1524 FEM_ENGINES_PKG.Tech_Message
1525 (p_severity => c_log_level_1,
1526 p_module => c_block||'.'||'Register_process_execution',
1527 p_msg_text => 'raising Exec_Lock_failed');
1528
1529 FEM_PL_PKG.Unregister_Request(
1530 P_API_VERSION => c_api_version,
1531 P_COMMIT => c_true,
1532 P_REQUEST_ID => gv_request_id,
1533 X_MSG_COUNT => v_msg_count,
1534 X_MSG_DATA => v_msg_data,
1535 X_RETURN_STATUS => v_API_return_status);
1536 -- Technical messages have already been logged by the API;
1537
1538 x_completion_status := 'ERROR';
1539
1540 RAISE e_pl_registration_failed;
1541
1542 END Register_Process_Execution;
1543
1544
1545 /*===========================================================================+
1546 | PROCEDURE
1547 | Eng_Master_Post_Proc
1548 |
1549 | DESCRIPTION
1550 | Updates the PL data model with rows rejected and rows loaded
1551 | Registers the Dimension Load Status
1552 | SCOPE - PRIVATE
1553 |
1554 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1555 |
1556 | ARGUMENTS : IN:
1557 |
1558 |
1559 | OUT:
1560 |
1561 |
1562 |
1563 | IN/ OUT:
1564 |
1565 | RETURNS : NONE
1566 |
1567 | NOTES
1568 |
1569 |
1570
1571 | MODIFICATION HISTORY
1572 | Rob Flippo 4-MAR-04 Created
1573 | Rob Flippo 16-SEP-2004 Removing the error row count message
1574 | Since it is impossible to get an accrurate count
1575 | of error rows given that a number of status updates
1576 | are bulk
1577 |
1578 +===========================================================================*/
1579
1580 PROCEDURE Eng_Master_Post_Proc (p_object_id IN NUMBER
1581 ,p_rows_rejected_accum IN NUMBER
1582 ,p_rows_to_load IN NUMBER)
1583 IS
1584
1585 v_execution_status VARCHAR2(30);
1586 v_msg_count NUMBER;
1587 v_msg_data VARCHAR2(4000);
1588 v_API_return_status VARCHAR2(30);
1589 --v_rows_rejected NUMBER;
1590 e_post_process EXCEPTION;
1591 v_rows_loaded NUMBER;
1592
1593 BEGIN
1594 v_rows_loaded := p_rows_to_load - p_rows_rejected_accum;
1595
1596 IF p_rows_rejected_accum > 0 THEN
1597 v_execution_status := 'ERROR_RERUN';
1598 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
1599 ELSE v_execution_status := 'SUCCESS';
1600 gv_concurrent_status := fnd_concurrent.set_completion_status('NORMAL',null);
1601 END IF;
1602 /*****************************************
1603 -- Clean out the data slice table
1604 FEM_MULTI_PROC_PKG.Delete_Data_Slices(
1605 p_req_id => gv_request_id);
1606 ******************************************/
1607
1608 ------------------------------------
1609 -- Update Object Execution Errors --
1610 ------------------------------------
1611 FEM_PL_PKG.Update_Obj_Exec_Errors(
1612 P_API_VERSION => c_api_version,
1613 P_COMMIT => c_true,
1614 P_REQUEST_ID => gv_request_id,
1615 P_OBJECT_ID => p_object_id,
1616 P_ERRORS_REPORTED => p_rows_rejected_accum,
1617 P_ERRORS_REPROCESSED => 0,
1618 P_USER_ID => gv_apps_user_id,
1619 P_LAST_UPDATE_LOGIN => null,
1620 X_MSG_COUNT => v_msg_count,
1621 X_MSG_DATA => v_msg_data,
1622 X_RETURN_STATUS => v_API_return_status);
1623
1624 IF v_API_return_status NOT IN ('S') THEN
1625 RAISE e_post_process;
1626 END IF;
1627
1628 ----------------------------------
1629 -- Update Number of Rows Loaded --
1630 ----------------------------------
1631
1632 ------------------------------------
1633 -- Update Object Execution Status --
1634 ------------------------------------
1635
1636 FEM_PL_PKG.Update_Obj_Exec_Status(
1637 P_API_VERSION => c_api_version,
1638 P_COMMIT => c_true,
1639 P_REQUEST_ID => gv_request_id,
1640 P_OBJECT_ID => p_object_id,
1641 P_EXEC_STATUS_CODE => v_execution_status,
1642 P_USER_ID => gv_apps_user_id,
1643 P_LAST_UPDATE_LOGIN => null,
1644 X_MSG_COUNT => v_msg_count,
1645 X_MSG_DATA => v_msg_data,
1646 X_RETURN_STATUS => v_API_return_status);
1647
1648 IF v_API_return_status NOT IN ('S') THEN
1649 RAISE e_post_process;
1650 END IF;
1651
1652 ---------------------------
1653 -- Update Request Status --
1654 ---------------------------
1655 FEM_PL_PKG.Update_Request_Status(
1656 P_API_VERSION => c_api_version,
1657 P_COMMIT => c_true,
1658 P_REQUEST_ID => gv_request_id,
1659 P_EXEC_STATUS_CODE => v_execution_status,
1660 P_USER_ID => gv_apps_user_id,
1661 P_LAST_UPDATE_LOGIN => null,
1662 X_MSG_COUNT => v_msg_count,
1663 X_MSG_DATA => v_msg_data,
1664 X_RETURN_STATUS => v_API_return_status);
1665
1666 IF v_API_return_status NOT IN ('S') THEN
1667 RAISE e_post_process;
1668 END IF;
1669
1670 -------------------
1671 -- Post Messages --
1672 -------------------
1673
1674 FEM_ENGINES_PKG.USER_MESSAGE
1675 (P_APP_NAME => c_fem
1676 ,P_MSG_NAME => 'FEM_SD_LDR_PROCESS_SUMMARY'
1677 ,P_TOKEN1 => 'LOADNUM'
1678 ,P_VALUE1 => v_rows_loaded
1679 ,P_TOKEN2 => 'REJECTNUM'
1680 ,P_VALUE2 => p_rows_rejected_accum);
1681
1682 IF v_execution_status = 'ERROR_RERUN' THEN
1683
1684 FEM_ENGINES_PKG.USER_MESSAGE
1685 (P_APP_NAME => c_fem
1686 ,P_MSG_NAME => 'FEM_EXEC_RERUN');
1687
1688 ELSE
1689 FEM_ENGINES_PKG.USER_MESSAGE
1690 (P_APP_NAME => c_fem
1691 ,P_MSG_NAME => 'FEM_EXEC_SUCCESS');
1692 END IF;
1693
1694 FEM_ENGINES_PKG.TECH_MESSAGE
1695 (p_severity => c_log_level_3,
1696 p_module => c_block||'.'||'Eng_Master_Post_Proc',
1697 p_msg_text => 'End');
1698
1699 EXCEPTION
1700 WHEN e_post_process THEN
1701 -- get messages from the stack
1702 Get_Put_Messages (
1703 p_msg_count => v_msg_count,
1704 p_msg_data => v_msg_data);
1705
1706 FEM_ENGINES_PKG.TECH_MESSAGE
1707 (p_severity => c_log_level_1,
1708 p_module => c_block||'.'||'Eng_Master_Post_Proc',
1709 p_msg_text => 'Post Process failed');
1710
1711 FEM_ENGINES_PKG.USER_MESSAGE
1712 (P_APP_NAME => c_fem
1713 ,P_MSG_NAME => G_EXT_LDR_POST_PROC_ERR);
1714
1715
1716 WHEN OTHERS THEN
1717 -- get messages from the stack
1718 Get_Put_Messages (
1719 p_msg_count => v_msg_count,
1720 p_msg_data => v_msg_data);
1721
1722 gv_prg_msg := sqlerrm;
1723 gv_callstack := dbms_utility.format_call_stack;
1724
1725 FEM_ENGINES_PKG.TECH_MESSAGE
1726 (p_severity => c_log_level_6
1727 ,p_module => c_block||'.'||'Eng_Master_Post_Proc.Unexpected Exception'
1728 ,p_msg_text => gv_prg_msg);
1729
1730 FEM_ENGINES_PKG.TECH_MESSAGE
1731 (p_severity => c_log_level_6
1732 ,p_module => c_block||'.'||'Eng_Master_Post_Proc.Unexpected Exception'
1733 ,p_msg_text => gv_callstack);
1734
1735 FEM_ENGINES_PKG.USER_MESSAGE
1736 (p_app_name => c_fem
1737 ,p_msg_text => gv_prg_msg);
1738
1739 FEM_ENGINES_PKG.USER_MESSAGE
1740 (P_APP_NAME => c_fem
1741 ,P_MSG_NAME => G_EXT_LDR_POST_PROC_ERR);
1742
1743
1744 END Eng_Master_Post_Proc;
1745
1746
1747 /*===========================================================================+
1748 | PROCEDURE
1749 | Pre_Validation
1750 |
1751 | DESCRIPTION
1752 | New Dimension Members without corresponding TL records
1753 | This step processes members that do not yet exist in FEM
1754 | but that do not have at least one TL record in the _TL_T interface table.
1755 | These groups are "bad" so we will update their status to MISSING_NAME
1756 |
1757 | This step also updates the records in the TL_T table where the LANGUAGE
1758 | is not installed.
1759 |
1760 |
1761 | SCOPE - PRIVATE
1762 |
1763 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1764 |
1765 | ARGUMENTS : IN:
1766 |
1767 |
1768 | OUT:
1769 |
1770 | IN/ OUT:
1771 |
1772 | RETURNS : NONE
1773 |
1774 | NOTES
1775 |
1776 | 1. Update Status of all "new" members missing TL_T record with 'MISSING_NAME'
1777 | 2. (Simple Dim = 'N') Update Status of attribute assignments where the member
1778 | doesn't exist in FEM and also is not in the join of _B_T/_TL_T with 'INVALID_MEMBER'
1779 | 3. Special Status update for CAL PERIOD attribute assignment records
1780 | with invalid CALENDAR_DISPLAY_CODE or DIMENSION_GROUP_DISPLAY_CODE.
1781 | Status is 'INVALID_MEMBER'
1782 | 4. (Simple Dim = 'N') Update status of all attribute assignment records where the
1783 | VERSION_DISPLAY_CODE doesn't exist. Status is 'INVALID_VERSION'
1784 |
1785 | MODIFICATION HISTORY
1786 | Rob Flippo 22-MAR-04 Created
1787 | Rob Flippo 17-SEP-04 Modified to add update on the _TL_T tables where
1788 | the LANGUAGE is not installed
1789 |
1790 +===========================================================================*/
1791
1792 PROCEDURE Pre_Validation (p_eng_sql IN VARCHAR2
1793 ,p_data_slc IN VARCHAR2
1794 ,p_proc_num IN NUMBER
1795 ,p_partition_code IN NUMBER
1796 ,p_fetch_limit IN NUMBER
1797 ,p_load_type IN VARCHAR2
1798 ,p_dimension_varchar_label IN VARCHAR2
1799 ,p_dimension_id IN NUMBER
1800 ,p_source_b_table IN VARCHAR2
1801 ,p_source_tl_table IN VARCHAR2
1802 ,p_source_attr_table IN VARCHAR2
1803 ,p_target_b_table IN VARCHAR2
1804 ,p_member_t_dc_col IN VARCHAR2
1805 ,p_member_dc_col IN VARCHAR2
1806 ,p_value_set_required_flag IN VARCHAR2
1807 ,p_simple_dimension_flag IN VARCHAR2
1808 ,p_shared_dimension_flag IN VARCHAR2
1809 ,p_exec_mode_clause IN VARCHAR2
1810 ,p_master_request_id IN NUMBER)
1811
1812
1813 IS
1814 -- Constants
1815 c_proc_name VARCHAR2(30) := 'Pre_Validation';
1816 -- Dynamic SQL statement variables
1817 x_bad_mbr_select_stmt VARCHAR2(4000);
1818 x_update_mbr_status_stmt VARCHAR2(4000);
1819
1820 -- Count variables for manipulating the member and attribute arrays
1821 v_mbr_last_row NUMBER;
1822 v_rows_rejected NUMBER :=0;
1823 v_temp_rows_rejected NUMBER :=0;
1824
1825 -- Other variables
1826 v_fetch_limit NUMBER;
1827
1828 -- MP variables
1829 v_loop_counter NUMBER;
1830 v_slc_id NUMBER;
1831 v_slc_val VARCHAR2(100);
1832 v_slc_val2 VARCHAR2(100);
1833 v_slc_val3 VARCHAR2(100);
1834 v_slc_val4 VARCHAR2(100);
1835 v_mp_status VARCHAR2(30);
1836 v_mp_message VARCHAR2(4000);
1837 v_num_vals NUMBER;
1838 v_part_name VARCHAR2(4000);
1839
1840 -------------------------------------
1841 -- Declare bulk collection columns --
1842 -------------------------------------
1843
1844 -- Common abbreviations:
1845 -- t_ = array of raw interface table member rows
1846 -- tf = "final" array of interface table member rows that have been validated for insert
1847 -- ta = array of raw interface table attribute rows
1848 -- tfa = "final" array of interface table attribute rows that have been validated for insert
1849
1850 t_rowid rowid_type;
1851 t_b_status varchar2_std_type;
1852
1853 ---------------------
1854 -- Declare cursors --
1855 ---------------------
1856 cv_get_bad_mbr cv_curs;
1857
1858 BEGIN
1859 FEM_ENGINES_PKG.TECH_MESSAGE
1860 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1861
1862
1863 --x_status := 0; -- initialize status of the Pre_Validation procedure
1864 --x_message := 'COMPLETE:NORMAL';
1865
1866
1867 build_bad_new_mbrs_stmt (p_load_type
1868 ,p_dimension_varchar_label
1869 ,p_source_b_table
1870 ,p_source_tl_table
1871 ,p_target_b_table
1872 ,p_member_t_dc_col
1873 ,p_member_dc_col
1874 ,p_value_set_required_flag
1875 ,p_shared_dimension_flag
1876 ,p_exec_mode_clause
1877 ,x_bad_mbr_select_stmt);
1878
1879 IF p_data_slc IS NOT NULL THEN
1880 x_bad_mbr_select_stmt := REPLACE(x_bad_mbr_select_stmt,'{{data_slice}}',p_data_slc);
1881 ELSE
1882 x_bad_mbr_select_stmt := REPLACE(x_bad_mbr_select_stmt,'{{data_slice}}','1=1');
1883 END IF;
1884
1885 -- set the local fetch limit variable based on the parameter
1886 -- this will be null for Dimension Group loads
1887 v_fetch_limit := p_fetch_limit;
1888 IF v_fetch_limit IS NULL THEN
1889 v_fetch_limit := 10000;
1890 END IF;
1891
1892 FEM_ENGINES_PKG.TECH_MESSAGE
1893 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_new_mbrs_select_stmt',x_bad_mbr_select_stmt);
1894
1895 build_status_update_stmt (p_source_b_table
1896 ,x_update_mbr_status_stmt);
1897
1898 FEM_ENGINES_PKG.TECH_MESSAGE
1899 (c_log_level_1,c_block||'.'||c_proc_name||'.update_mbr_status_stmt '
1900 ,x_update_mbr_status_stmt);
1901
1902 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
1903 -- the data slice loop
1904 LOOP
1905
1906 IF p_load_type <> ('DIMENSION_GROUP') THEN
1907
1908 FEM_Multi_Proc_Pkg.Get_Data_Slice(
1909 x_slc_id => v_slc_id,
1910 x_slc_val1 => v_slc_val,
1911 x_slc_val2 => v_slc_val2,
1912 x_slc_val3 => v_slc_val3,
1913 x_slc_val4 => v_slc_val4,
1914 x_num_vals => v_num_vals,
1915 x_part_name => v_part_name,
1916 p_req_id => p_master_request_id,
1917 p_proc_num => p_proc_num);
1918
1919 FEM_ENGINES_PKG.TECH_MESSAGE
1920 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
1921 ,v_slc_val);
1922 FEM_ENGINES_PKG.TECH_MESSAGE
1923 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
1924 ,v_slc_val2);
1925 FEM_ENGINES_PKG.TECH_MESSAGE
1926 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
1927 ,v_slc_val3);
1928 FEM_ENGINES_PKG.TECH_MESSAGE
1929 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
1930 ,v_slc_val4);
1931
1932
1933 EXIT WHEN (v_slc_id IS NULL);
1934 ELSE
1935 EXIT WHEN (v_loop_counter > 0);
1936 v_loop_counter := v_loop_counter + 1;
1937 END IF;
1938
1939 IF p_load_type <> ('DIMENSION_GROUP') THEN
1940
1941 OPEN cv_get_bad_mbr FOR x_bad_mbr_select_stmt USING v_slc_val, v_slc_val2;
1942 ELSE
1943 OPEN cv_get_bad_mbr FOR x_bad_mbr_select_stmt;
1944 END IF;
1945
1946 LOOP
1947 ------------------------------------------------------------------
1948 -- Bulk Collect Rows from the source _B_T table missing TL_T name
1949 -- where the member does not already exist in FEM
1950 -- Using Dynamic SELECT Statement
1951 ------------------------------------------------------------------
1952
1953 FETCH cv_get_bad_mbr BULK COLLECT INTO
1954 t_rowid
1955 ,t_b_status
1956 LIMIT v_fetch_limit;
1957
1958 ----------------------------------------------
1959 -- EXIT Fetch LOOP If No Rows are Retrieved --
1960 ----------------------------------------------
1961
1962 v_mbr_last_row := t_rowid.LAST;
1963
1964 FEM_ENGINES_PKG.TECH_MESSAGE
1965 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mbr_last_row'
1966 ,v_mbr_last_row);
1967
1968 IF (v_mbr_last_row IS NULL)
1969 THEN
1970 EXIT;
1971 END IF;
1972
1973 ----------------------------------------------------------
1974 -- Update Status of Bad Member Collection
1975 ----------------------------------------------------------
1976 FORALL i IN 1..v_mbr_last_row
1977 EXECUTE IMMEDIATE x_update_mbr_status_stmt
1978 USING t_b_status(i)
1979 ,t_rowid(i)
1980 ,t_b_status(i);
1981
1982 COMMIT;
1983
1984 ----------------------------------------------------------
1985 -- Count the error rows
1986 ----------------------------------------------------------
1987 v_rows_rejected := v_rows_rejected + v_mbr_last_row;
1988 FEM_ENGINES_PKG.TECH_MESSAGE
1989 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
1990 ,v_rows_rejected);
1991
1992 ----------------------------------------------------------
1993 -- Clear the array for the next BULK fetch
1994 ----------------------------------------------------------
1995 t_rowid.DELETE;
1996 t_b_status.DELETE;
1997
1998 END LOOP; -- bad_members
1999
2000 IF p_load_type <> ('DIMENSION_GROUP') THEN
2001 FEM_Multi_Proc_Pkg.Post_Data_Slice(
2002 p_req_id => p_master_request_id,
2003 p_slc_id => v_slc_id,
2004 p_status => v_mp_status,
2005 p_message => v_mp_message,
2006 p_rows_processed => 0,
2007 p_rows_loaded => 0,
2008 p_rows_rejected => v_rows_rejected);
2009 END IF;
2010
2011 END LOOP; -- data_slice loop
2012
2013 IF p_load_type = ('DIMENSION_GROUP') THEN
2014 gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
2015 END IF;
2016
2017 IF cv_get_bad_mbr%ISOPEN THEN
2018 CLOSE cv_get_bad_mbr;
2019 END IF;
2020 --x_rows_rejected := v_rows_rejected;
2021 FEM_ENGINES_PKG.TECH_MESSAGE
2022 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2023
2024 EXCEPTION
2025 WHEN OTHERS THEN
2026 IF cv_get_bad_mbr%ISOPEN THEN
2027 CLOSE cv_get_bad_mbr;
2028 END IF;
2029 --x_status:= 2;
2030 --x_message := 'COMPLETE:ERROR';
2031
2032 gv_prg_msg := sqlerrm;
2033 gv_callstack := dbms_utility.format_call_stack;
2034
2035 FEM_ENGINES_PKG.TECH_MESSAGE
2036 (p_severity => c_log_level_6
2037 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2038 ,p_msg_text => gv_prg_msg);
2039
2040 FEM_ENGINES_PKG.TECH_MESSAGE
2041 (p_severity => c_log_level_6
2042 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2043 ,p_msg_text => gv_callstack);
2044
2045 FEM_ENGINES_PKG.USER_MESSAGE
2046 (p_app_name => c_fem
2047 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
2048 ,P_TOKEN1 => 'ERR_MSG'
2049 ,P_VALUE1 => gv_prg_msg);
2050
2051 RAISE e_main_terminate;
2052
2053
2054 END Pre_Validation;
2055
2056
2057 /*===========================================================================+
2058 | PROCEDURE
2059 | Pre_Validation_Attr
2060 |
2061 | DESCRIPTION
2062 | This procedure performs validations on the _ATTR_T table for bad records
2063 |
2064 | Attribute assignment rows with bad version_display_code
2065 | This step processes records in the _ATTR_T table
2066 | that have a version_display_code which does not exist in FEM.
2067 | These assignments are "bad" so we will update their status to INVALID_VERSION
2068 |
2069 | Attribute assignment rows where the member doesn't exist in FEM
2070 | and the member doesn't exist in the join of the _B_T and _TL_T tables.
2071 | The member in this case is either a 'MISSING_NAME' member in the _B_T,
2072 | or it is just a non-existent member. These attribute assignment rows are
2073 | marked as 'INVALID_MEMBER'.
2074 |
2075 | SCOPE - PRIVATE
2076 |
2077 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2078 |
2079 | ARGUMENTS : IN:
2080 |
2081 |
2082 | OUT:
2083 |
2084 | IN/ OUT:
2085 |
2086 | RETURNS : NONE
2087 |
2088 | NOTES
2089 |
2090 | MODIFICATION HISTORY
2091 | Rob Flippo 15-APR-04 Created
2092 | Rob Flippo 15-MAR-05 Bug#4226011 added call to not_user_label procedure
2093 | to update attr_t records where the attribute
2094 | is user_assign_allowed_flag = 'N';
2095 | Rob Flippo 09-JUN-05 Bug#3895203 modified to update level specific
2096 | attributes
2097 +===========================================================================*/
2098
2099 PROCEDURE Pre_Validation_Attr (p_eng_sql IN VARCHAR2
2100 ,p_data_slc IN VARCHAR2
2101 ,p_proc_num IN VARCHAR2
2102 ,p_partition_code IN NUMBER
2103 ,p_fetch_limit IN NUMBER
2104 ,p_load_type IN VARCHAR2
2105 ,p_dimension_varchar_label IN VARCHAR2
2106 ,p_dimension_id IN NUMBER
2107 ,p_source_b_table IN VARCHAR2
2108 ,p_source_tl_table IN VARCHAR2
2109 ,p_source_attr_table IN VARCHAR2
2110 ,p_target_b_table IN VARCHAR2
2111 ,p_member_t_dc_col IN VARCHAR2
2112 ,p_member_dc_col IN VARCHAR2
2113 ,p_value_set_required_flag IN VARCHAR2
2114 ,p_simple_dimension_flag IN VARCHAR2
2115 ,p_shared_dimension_flag IN VARCHAR2
2116 ,p_hier_dimension_flag IN VARCHAR2
2117 ,p_exec_mode_clause IN VARCHAR2
2118 ,p_master_request_id IN NUMBER)
2119 IS
2120 -- Constants
2121 c_proc_name VARCHAR2(30) := 'Pre_Validation_Attr';
2122 -- Dynamic SQL statement variables
2123 x_bad_attr_select_stmt VARCHAR2(4000);
2124 x_bad_attr_vers_select_stmt VARCHAR2(4000);
2125 x_not_user_label_status_stmt VARCHAR2(4000);
2126 x_bad_attrlab_status_stmt VARCHAR2(4000);
2127 x_update_attr_status_stmt VARCHAR2(4000);
2128 x_special_calp_status_stmt VARCHAR2(4000);
2129 x_attr_lvlspec_select_stmt VARCHAR2(4000);
2130
2131 -- Count variables for manipulating the member and attribute arrays
2132 v_attr_last_row NUMBER;
2133 v_rows_rejected NUMBER :=0;
2134 v_rows_loaded NUMBER :=0;
2135 v_temp_rows_rejected NUMBER :=0;
2136 v_bulk_rows_rejected NUMBER :=0; -- rows rejected for any status
2137 --bulk update statements
2138
2139 -- Other variables
2140 v_fetch_limit NUMBER;
2141
2142 -- MP variables
2143 v_loop_counter NUMBER;
2144 v_slc_id NUMBER;
2145 v_slc_val VARCHAR2(100);
2146 v_slc_val2 VARCHAR2(100);
2147 v_slc_val3 VARCHAR2(100);
2148 v_slc_val4 VARCHAR2(100);
2149 v_mp_status VARCHAR2(30);
2150 v_mp_message VARCHAR2(4000);
2151 v_num_vals NUMBER;
2152 v_part_name VARCHAR2(4000);
2153
2154
2155 -------------------------------------
2156 -- Declare bulk collection columns --
2157 -------------------------------------
2158
2159 -- Common abbreviations:
2160 -- t_ = array of raw interface table member rows
2161 -- tf = "final" array of interface table member rows that have been validated for insert
2162 -- ta = array of raw interface table attribute rows
2163 -- tfa = "final" array of interface table attribute rows that have been validated for insert
2164
2165 t_rowid rowid_type;
2166 t_b_status varchar2_std_type;
2167
2168 ---------------------
2169 -- Declare cursors --
2170 ---------------------
2171 cv_get_bad_attr cv_curs;
2172 cv_get_bad_attr_vers cv_curs;
2173
2174 BEGIN
2175 FEM_ENGINES_PKG.TECH_MESSAGE
2176 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2177
2178 --DBMS_SESSION.SET_SQL_TRACE (sql_trace => TRUE);
2179 --x_status := 0; -- initialize status of the Pre_Validation procedure
2180 --x_message := 'COMPLETE:NORMAL';
2181
2182
2183 -- set the local fetch limit variable based on the parameter
2184 -- this will be null for Dimension Group loads
2185 v_fetch_limit := p_fetch_limit;
2186 IF v_fetch_limit IS NULL THEN
2187 v_fetch_limit := 10000;
2188 END IF;
2189
2190 -----------------------------------------------------------------------
2191 -- Update rows in the _ATTR_T table where the attribute_varchar_label
2192 -- doesn't exist
2193 ----------------------------------------------------------------------------
2194 FEM_ENGINES_PKG.TECH_MESSAGE
2195 (c_log_level_3,c_block||'.'||c_proc_name
2196 ,'Invalid ATTRIBUTE_VARCHAR_LABEL');
2197
2198
2199 build_attrlab_update_stmt (p_dimension_varchar_label
2200 ,p_source_attr_table
2201 ,p_shared_dimension_flag
2202 ,p_exec_mode_clause
2203 ,x_bad_attrlab_status_stmt);
2204
2205 IF p_data_slc IS NOT NULL THEN
2206 x_bad_attrlab_status_stmt := REPLACE(x_bad_attrlab_status_stmt,'{{data_slice}}',p_data_slc);
2207 ELSE
2208 x_bad_attrlab_status_stmt := REPLACE(x_bad_attrlab_status_stmt,'{{data_slice}}','1=1');
2209 END IF;
2210
2211 FEM_ENGINES_PKG.TECH_MESSAGE
2212 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attrlab_status_stmt',x_bad_attrlab_status_stmt);
2213
2214
2215 build_not_user_label_upd_stmt (p_dimension_varchar_label
2216 ,p_source_attr_table
2217 ,p_shared_dimension_flag
2218 ,p_exec_mode_clause
2219 ,x_not_user_label_status_stmt);
2220
2221 IF p_data_slc IS NOT NULL THEN
2222 x_not_user_label_status_stmt := REPLACE(x_not_user_label_status_stmt,'{{data_slice}}',p_data_slc);
2223 ELSE
2224 x_not_user_label_status_stmt := REPLACE(x_not_user_label_status_stmt,'{{data_slice}}','1=1');
2225 END IF;
2226
2227 FEM_ENGINES_PKG.TECH_MESSAGE
2228 (c_log_level_1,c_block||'.'||c_proc_name||'.not_user_label_status_stmt',x_not_user_label_status_stmt);
2229
2230
2231
2232 FEM_ENGINES_PKG.TECH_MESSAGE
2233 (c_log_level_3,c_block||'.'||c_proc_name
2234 ,'Attribute assignments for Invalid member');
2235
2236 build_status_update_stmt (p_source_attr_table
2237 ,x_update_attr_status_stmt);
2238
2239 build_bad_attr_select_stmt (p_dimension_varchar_label
2240 ,p_dimension_id
2241 ,p_source_b_table
2242 ,p_source_tl_table
2243 ,p_source_attr_table
2244 ,p_target_b_table
2245 ,p_member_t_dc_col
2246 ,p_member_dc_col
2247 ,p_value_set_required_flag
2248 ,p_shared_dimension_flag
2249 ,p_exec_mode_clause
2250 ,x_bad_attr_select_stmt);
2251 IF p_data_slc IS NOT NULL THEN
2252 x_bad_attr_select_stmt := REPLACE(x_bad_attr_select_stmt,'{{data_slice}}',p_data_slc);
2253 ELSE
2254 x_bad_attr_select_stmt := REPLACE(x_bad_attr_select_stmt,'{{data_slice}}','1=1');
2255 END IF;
2256
2257
2258 build_attr_lvlspec_select_stmt (p_dimension_varchar_label
2259 ,p_dimension_id
2260 ,p_source_b_table
2261 ,p_source_attr_table
2262 ,p_target_b_table
2263 ,p_member_t_dc_col
2264 ,p_member_dc_col
2265 ,p_value_set_required_flag
2266 ,p_shared_dimension_flag
2267 ,p_hier_dimension_flag
2268 ,'Y'
2269 ,p_exec_mode_clause
2270 ,x_attr_lvlspec_select_stmt);
2271
2272 IF p_data_slc IS NOT NULL THEN
2273 x_attr_lvlspec_select_stmt := REPLACE(x_attr_lvlspec_select_stmt,'{{data_slice}}',p_data_slc);
2274 ELSE
2275 x_attr_lvlspec_select_stmt := REPLACE(x_attr_lvlspec_select_stmt,'{{data_slice}}','1=1');
2276 END IF;
2277
2278
2279 build_bad_attr_vers_stmt (p_dimension_varchar_label
2280 ,p_source_attr_table
2281 ,p_shared_dimension_flag
2282 ,p_exec_mode_clause
2283 ,x_bad_attr_vers_select_stmt);
2284
2285 IF p_data_slc IS NOT NULL THEN
2286 x_bad_attr_vers_select_stmt := REPLACE(x_bad_attr_vers_select_stmt,'{{data_slice}}',p_data_slc);
2287 ELSE
2288 x_bad_attr_vers_select_stmt := REPLACE(x_bad_attr_vers_select_stmt,'{{data_slice}}','1=1');
2289 END IF;
2290
2291
2292 FEM_ENGINES_PKG.TECH_MESSAGE
2293 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_vers_select_stmt',x_bad_attr_vers_select_stmt);
2294
2295 FEM_ENGINES_PKG.TECH_MESSAGE
2296 (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_status_stmt '
2297 ,x_update_attr_status_stmt);
2298
2299 FEM_ENGINES_PKG.TECH_MESSAGE
2300 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_select_stmt'
2301 ,x_bad_attr_select_stmt);
2302
2303 FEM_ENGINES_PKG.TECH_MESSAGE
2304 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_lvlspec_select_stmt'
2305 ,x_attr_lvlspec_select_stmt);
2306
2307 LOOP
2308
2309 IF p_load_type <> ('DIMENSION_GROUP') THEN
2310
2311 FEM_Multi_Proc_Pkg.Get_Data_Slice(
2312 x_slc_id => v_slc_id,
2313 x_slc_val1 => v_slc_val,
2314 x_slc_val2 => v_slc_val2,
2315 x_slc_val3 => v_slc_val3,
2316 x_slc_val4 => v_slc_val4,
2317 x_num_vals => v_num_vals,
2318 x_part_name => v_part_name,
2319 p_req_id => p_master_request_id,
2320 p_proc_num => p_proc_num);
2321
2322 FEM_ENGINES_PKG.TECH_MESSAGE
2323 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
2324 ,v_slc_val);
2325 FEM_ENGINES_PKG.TECH_MESSAGE
2326 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
2327 ,v_slc_val2);
2328 FEM_ENGINES_PKG.TECH_MESSAGE
2329 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
2330 ,v_slc_val3);
2331 FEM_ENGINES_PKG.TECH_MESSAGE
2332 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
2333 ,v_slc_val4);
2334
2335
2336 EXIT WHEN (v_slc_id IS NULL);
2337 ELSE
2338 EXIT WHEN (v_loop_counter > 0);
2339 v_loop_counter := v_loop_counter + 1;
2340 END IF;
2341
2342 ---------------------------------------------------------------------------
2343 -- Execute the updates
2344 IF p_load_type <> ('DIMENSION_GROUP') THEN
2345 EXECUTE IMMEDIATE x_bad_attrlab_status_stmt USING v_slc_val, v_slc_val2;
2346 ELSE
2347 EXECUTE IMMEDIATE x_bad_attrlab_status_stmt;
2348 END IF;
2349 v_bulk_rows_rejected := SQL%ROWCOUNT;
2350 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2351
2352 IF p_load_type <> ('DIMENSION_GROUP') THEN
2353 EXECUTE IMMEDIATE x_not_user_label_status_stmt USING v_slc_val, v_slc_val2;
2354 ELSE
2355 EXECUTE IMMEDIATE x_not_user_label_status_stmt;
2356 END IF;
2357 v_bulk_rows_rejected := SQL%ROWCOUNT;
2358 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2359 ---------------------------------------------------------------------------
2360
2361
2362 IF p_load_type <> ('DIMENSION_GROUP') THEN
2363 OPEN cv_get_bad_attr FOR x_bad_attr_select_stmt USING v_slc_val, v_slc_val2;
2364 ELSE
2365 OPEN cv_get_bad_attr FOR x_bad_attr_select_stmt;
2366 END IF;
2367
2368
2369 LOOP
2370 -------------------------------------------
2371 -- Bulk Collect Rows from the source _ATTR_T table
2372 -- where the member doesn't exist in FEM and the member
2373 -- doesn't exist in the join of _B_T/_TL_T tables
2374 -- but the version is a valid version
2375 -- Using Dynamic SELECT Statement
2376 -------------------------------------------
2377 FETCH cv_get_bad_attr BULK COLLECT INTO
2378 t_rowid
2379 ,t_b_status
2380 LIMIT v_fetch_limit;
2381
2382 ----------------------------------------------
2383 -- EXIT Fetch LOOP If No Rows are Retrieved --
2384 ----------------------------------------------
2385 v_attr_last_row := t_rowid.LAST;
2386
2387 FEM_ENGINES_PKG.TECH_MESSAGE
2388 (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2389 ,v_attr_last_row);
2390
2391 IF (v_attr_last_row IS NULL)
2392 THEN
2393 EXIT;
2394 END IF;
2395
2396 ----------------------------------------------------------
2397 -- Update Status of Bad Attr Collection
2398 ----------------------------------------------------------
2399 FORALL i IN 1..v_attr_last_row
2400 EXECUTE IMMEDIATE x_update_attr_status_stmt
2401 USING t_b_status(i)
2402 ,t_rowid(i)
2403 ,t_b_status(i);
2404
2405 COMMIT;
2406
2407 ----------------------------------------------------------
2408 -- Count the error rows
2409 ----------------------------------------------------------
2410 v_rows_rejected := v_rows_rejected + v_attr_last_row;
2411 FEM_ENGINES_PKG.TECH_MESSAGE
2412 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2413 ,v_rows_rejected);
2414
2415 ----------------------------------------------------------
2416 -- Clear the array for the next BULK fetch
2417 ----------------------------------------------------------
2418 t_rowid.DELETE;
2419 t_b_status.DELETE;
2420
2421 END LOOP; -- attributes with Invalid Member
2422 IF cv_get_bad_attr%ISOPEN THEN
2423 CLOSE cv_get_bad_attr;
2424 END IF;
2425
2426
2427 IF p_hier_dimension_flag = 'Y' AND p_load_type <> 'DIMENSION_GROUP' THEN
2428 OPEN cv_get_bad_attr FOR x_attr_lvlspec_select_stmt USING v_slc_val, v_slc_val2;
2429
2430 LOOP
2431 -------------------------------------------
2432 -- Bulk Collect Rows from the source _ATTR_T table
2433 -- where the attribute is a level specific attribute
2434 -- and the member doesn't belong to that level
2435 -------------------------------------------
2436 FETCH cv_get_bad_attr BULK COLLECT INTO
2437 t_rowid
2438 ,t_b_status
2439 LIMIT v_fetch_limit;
2440
2441 ----------------------------------------------
2442 -- EXIT Fetch LOOP If No Rows are Retrieved --
2443 ----------------------------------------------
2444 v_attr_last_row := t_rowid.LAST;
2445
2446 FEM_ENGINES_PKG.TECH_MESSAGE
2447 (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2448 ,v_attr_last_row);
2449
2450 IF (v_attr_last_row IS NULL)
2451 THEN
2452 EXIT;
2453 END IF;
2454
2455 ----------------------------------------------------------
2456 -- Update Status of Bad Attr Collection
2457 ----------------------------------------------------------
2458 FORALL i IN 1..v_attr_last_row
2459 EXECUTE IMMEDIATE x_update_attr_status_stmt
2460 USING t_b_status(i)
2461 ,t_rowid(i)
2462 ,t_b_status(i);
2463
2464 COMMIT;
2465
2466 ----------------------------------------------------------
2467 -- Count the error rows
2468 ----------------------------------------------------------
2469 v_rows_rejected := v_rows_rejected + v_attr_last_row;
2470 FEM_ENGINES_PKG.TECH_MESSAGE
2471 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2472 ,v_rows_rejected);
2473
2474 ----------------------------------------------------------
2475 -- Clear the array for the next BULK fetch
2476 ----------------------------------------------------------
2477 t_rowid.DELETE;
2478 t_b_status.DELETE;
2479
2480 END LOOP; -- attributes with Invalid Member
2481 IF cv_get_bad_attr%ISOPEN THEN
2482 CLOSE cv_get_bad_attr;
2483 END IF;
2484 END IF; -- p_hier_dimension_flag = 'Y'
2485
2486 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
2487 --------------------------------------------------------------
2488 -- Special Status Update for CAL_PERIOD ATTR_T records
2489 -- where either the CALENDAR_DISPLAY_CODE or DIMENSION_GROUP_DISPLAY_CODE
2490 -- do not exist. We have to update these records because they will
2491 -- not otherwise be marked as Invalid since they don't show up in any
2492 -- of the CAL_PERIOD cursors
2493 ----------------------------------------------------------------
2494 x_special_calp_status_stmt := 'UPDATE fem_cal_periods_attr_t B'||
2495 ' SET status = ''INVALID_CALENDAR'''||
2496 ' WHERE NOT EXISTS (SELECT 0 FROM fem_calendars_b C2'||
2497 ' WHERE C2.calendar_display_code = B.calendar_display_code)'||
2498 ' AND {{data_slice}} '||
2499 ' AND B.STATUS'||p_exec_mode_clause;
2500
2501 IF p_data_slc IS NOT NULL THEN
2502 x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}',p_data_slc);
2503 ELSE
2504 x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}','1=1');
2505 END IF;
2506
2507 EXECUTE IMMEDIATE x_special_calp_status_stmt USING v_slc_val, v_slc_val2;
2508 v_bulk_rows_rejected := SQL%ROWCOUNT;
2509 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2510 FEM_ENGINES_PKG.TECH_MESSAGE
2511 (c_log_level_1,c_block||'.'||c_proc_name||'.bulk_rows_rejected',v_bulk_rows_rejected);
2512
2513
2514 x_special_calp_status_stmt := 'UPDATE fem_cal_periods_attr_t B'||
2515 ' SET status = ''INVALID_DIMENSION_GROUP'''||
2516 ' WHERE NOT EXISTS (SELECT 0 FROM fem_dimension_grps_b D2'||
2517 ' WHERE D2.dimension_group_display_code = B.dimension_group_display_code)'||
2518 ' AND {{data_slice}} '||
2519 ' AND EXISTS (SELECT 0 FROM FEM_CALENDARS_B C3'||
2520 ' WHERE C3.calendar_display_code = B.calendar_display_code)'||
2521 ' AND B.STATUS'||p_exec_mode_clause;
2522 IF p_data_slc IS NOT NULL THEN
2523 x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}',p_data_slc);
2524 ELSE
2525 x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}','1=1');
2526 END IF;
2527
2528 EXECUTE IMMEDIATE x_special_calp_status_stmt USING v_slc_val, v_slc_val2;
2529 v_bulk_rows_rejected := SQL%ROWCOUNT;
2530 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2531 FEM_ENGINES_PKG.TECH_MESSAGE
2532 (c_log_level_1,c_block||'.'||c_proc_name||'.bulk_rows_rejected',v_bulk_rows_rejected);
2533
2534 --------------------------------------------------------------------------
2535 -- END Special CAL_PERIOD Status Update
2536 --------------------------------------------------------------------------
2537 END IF; -- special CAL_PERIOD status update
2538 --------------------------------------------------------------------------
2539 -- BEGIN Invalid Version Display Code in ATTR_T table
2540 --------------------------------------------------------------------------
2541 FEM_ENGINES_PKG.TECH_MESSAGE
2542 (c_log_level_3,c_block||'.'||c_proc_name
2543 ,'Attribute assignments with invalid version_display_code');
2544
2545 FEM_ENGINES_PKG.TECH_MESSAGE
2546 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_vers_select_stmt',x_bad_attr_vers_select_stmt);
2547
2548 FEM_ENGINES_PKG.TECH_MESSAGE
2549 (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_status_stmt '
2550 ,x_update_attr_status_stmt);
2551
2552 IF p_load_type <> ('DIMENSION_GROUP') THEN
2553 OPEN cv_get_bad_attr_vers FOR x_bad_attr_vers_select_stmt USING v_slc_val, v_slc_val2;
2554 ELSE
2555 OPEN cv_get_bad_attr_vers FOR x_bad_attr_vers_select_stmt;
2556 END IF;
2557
2558 LOOP
2559 -------------------------------------------
2560 -- Bulk Collect Rows from the source _ATTR_T table
2561 -- where the version_display_code doesn't exist
2562 -- Using Dynamic SELECT Statement
2563 -------------------------------------------
2564
2565 FETCH cv_get_bad_attr_vers BULK COLLECT INTO
2566 t_rowid
2567 ,t_b_status
2568 LIMIT v_fetch_limit;
2569
2570 ----------------------------------------------
2571 -- EXIT Fetch LOOP If No Rows are Retrieved --
2572 ----------------------------------------------
2573 v_attr_last_row := t_rowid.LAST;
2574
2575 FEM_ENGINES_PKG.TECH_MESSAGE
2576 (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2577 ,v_attr_last_row);
2578
2579 IF (v_attr_last_row IS NULL)
2580 THEN
2581 EXIT;
2582 END IF;
2583
2584 ----------------------------------------------------------
2585 -- Update Status of Bad Attr Version Collection
2586 ----------------------------------------------------------
2587 FORALL i IN 1..v_attr_last_row
2588 EXECUTE IMMEDIATE x_update_attr_status_stmt
2589 USING t_b_status(i)
2590 ,t_rowid(i)
2591 ,t_b_status(i);
2592
2593 COMMIT;
2594
2595 ----------------------------------------------------------
2596 -- Count the error rows
2597 ----------------------------------------------------------
2598 v_rows_rejected := v_rows_rejected + v_attr_last_row;
2599 FEM_ENGINES_PKG.TECH_MESSAGE
2600 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2601 ,v_rows_rejected);
2602
2603 ----------------------------------------------------------
2604 -- Clear the array for the next BULK fetch
2605 ----------------------------------------------------------
2606 t_rowid.DELETE;
2607 t_b_status.DELETE;
2608
2609 END LOOP; -- bad_attr_vers
2610
2611 FEM_Multi_Proc_Pkg.Post_Data_Slice(
2612 p_req_id => p_master_request_id,
2613 p_slc_id => v_slc_id,
2614 p_status => v_mp_status,
2615 p_message => v_mp_message,
2616 p_rows_processed => 0,
2617 p_rows_loaded => 0,
2618 p_rows_rejected => v_rows_rejected);
2619
2620 END LOOP; -- get_data_slice
2621 IF cv_get_bad_attr_vers%ISOPEN THEN
2622 CLOSE cv_get_bad_attr_vers;
2623 END IF;
2624
2625 --x_rows_rejected := v_rows_rejected;
2626 FEM_ENGINES_PKG.TECH_MESSAGE
2627 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2628
2629 EXCEPTION
2630 WHEN OTHERS THEN
2631 IF cv_get_bad_attr%ISOPEN THEN
2632 CLOSE cv_get_bad_attr;
2633 END IF;
2634
2635 IF cv_get_bad_attr_vers%ISOPEN THEN
2636 CLOSE cv_get_bad_attr;
2637 END IF;
2638 --x_status:= 2;
2639 --x_message := 'COMPLETE:ERROR';
2640
2641 gv_prg_msg := sqlerrm;
2642 gv_callstack := dbms_utility.format_call_stack;
2643
2644 FEM_ENGINES_PKG.TECH_MESSAGE
2645 (p_severity => c_log_level_6
2646 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2647 ,p_msg_text => gv_prg_msg);
2648
2649 FEM_ENGINES_PKG.TECH_MESSAGE
2650 (p_severity => c_log_level_6
2651 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2652 ,p_msg_text => gv_callstack);
2653
2654 FEM_ENGINES_PKG.USER_MESSAGE
2655 (p_app_name => c_fem
2656 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
2657 ,P_TOKEN1 => 'ERR_MSG'
2658 ,P_VALUE1 => gv_prg_msg);
2659
2660 /* FEM_ENGINES_PKG.USER_MESSAGE
2661 (p_app_name => c_fem
2662 ,p_msg_text => gv_prg_msg); */
2663
2664
2665 RAISE e_main_terminate;
2666
2667
2668 END Pre_Validation_Attr;
2669
2670
2671 /*===========================================================================+
2672 | PROCEDURE
2673 | New_Members
2674 |
2675 | DESCRIPTION
2676 | Loop through the members that do not yet exist and have names/desc in the TL table
2677 | to perform validations and eventually insert into the target dimension member tables
2678 | In the case where the user provides multiple versions of the attribute
2679 | assignments for the same member, only the "default" version is read for "required"
2680 | attributes
2681 | SCOPE - PRIVATE
2682 |
2683 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2684 |
2685 | ARGUMENTS : IN:
2686 |
2687 |
2688 | OUT:
2689 |
2690 | IN/ OUT:
2691 |
2692 | RETURNS : NONE
2693 |
2694 | NOTES
2695 |
2696 | New Members
2697 |
2698 | 1. Retrieve members from join of _B_T/_TL_T where the member does not
2699 | already exist in FEM.
2700 | 2. If Simple Dim = 'N', for each member, retrieve all "required" attribute
2701 | assignment records from _ATTR_T where the VERSION_DISPLAY_CODE exists.
2702 | 3. If number attribute assignments < number of required attributes, the member
2703 | fails with status = 'MISSING_REQUIRED_ATTRIBUTE'. The _TL_T gets
2704 | 'INVALID_MEMBER' and all of the _ATTR_T records get 'INVALID_MEMBER'.
2705 | 4. If the number of attribute assignments = number of required attributes,
2706 | then each assignment record is validated individually:
2707 | For Dimension Groups - check the Dim Group Sequence. Failure =
2708 | 'DIM_GROUP_SEQUENCE_NOT_UNIQUE'.
2709 | For Dimension Groups (CAL_PERIOD only) - check Time Group Type Code.
2710 | Failure = 'INVALID_TIME_GROUP_TYPE'.
2711 | If a DIMENSION assignment, then assignment value must exist in the
2712 | attribute dimension table. Status = 'INVALID_DIM_ASSIGNMENT' for failure
2713 | If a DATE assignment, then assignment value must be a valid date.
2714 | Status='INVALID_DATE' for failure
2715 | If a NUMBER assignment, then assignment value must be a valid number.
2716 | Status = 'INVALID_NUMBER' for failure.
2717 | Special CAL_PERIOD validation on GL_PERIOD_NUM attribute - attribute
2718 | assignment must match value in the CAL_PERIOD_NUMBER identifier column
2719 | Status = 'INVALID_CAL_PERIOD_END_DATE' for failure
2720 |
2721 | The _B_T gets 'INVALID_REQUIRED_ATTRIBUTE' whenever one fails. The
2722 | _TL_T gets 'INVALID_MEMBER'.
2723 | 5. Insert success records into FEM. Only the _TL_T record for the user's
2724 | current session is used to initially create the member - records for
2725 | other installed languages default to that value for this stage.
2726 | 6. Delete success records from _B_T/_TL_T/_ATTR_T.
2727 |
2728 | SPECIAL NOTE: The x_rows_loaded output variable is only populated if a
2729 | new member is created. It does not represent the number of
2730 | rows loaded. Rather, it is just serving as a flag to indicate
2731 | that at least one new member was created.
2732 | MODIFICATION HISTORY
2733 | Rob Flippo 22-MAR-04 Created
2734 | Rob Flippo 13-SEP-04 Bug#3835758 Validation on the attr_Assign_vs
2735 | was modified to include dimension_id
2736 | in the where condition
2737 |
2738 | Rob Flippo 14-SEP-04 Removed the build_dep_status_update procedure call
2739 | since attribute records where the member is invalid
2740 | is already handled in the attr_update section
2741 | Rob Flippo 15-SEP-04 Bug#3835758 Added exception handler so no failure
2742 | if VS didn't exist. Also moved the section
2743 | that verifies the VS so that only called
2744 | for DIMENSION attributes;
2745 | Rob Flippo 16-NOV-04 Bug#4002917 for preventing overlap cal periods
2746 | Added a new section in the attr validations for
2747 | checking date overlap conditions; also added
2748 | new validation to require cal_period_number > 0;
2749 | Rob Flippo 22-NOV-04 Bug#4019066 Add validation on Accounting_Year
2750 | and GL_PERIOD_NUM for CAL_PERIOD; ACCOUNTING_YEAR
2751 | must be >=1900 and <= 2599 while GL_PERIOD_NUM
2752 | must be <= periods_in_year for the Time Group Type
2753 | Rob Flippo 24-NOV-04 Bug#4041308 Remove periods_in_year check
2754 | Rob Flippo 03-JAN-05 Bug#4030717 FEM.D: MODIFY DIM MBR LOADER OVERLAP
2755 | DATE LOGIC TO ALLOW MP FOR CAL_PERIOD
2756 | -- using 2 new interim tables for Cal Period loads
2757 | FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T
2758 | The loader inserts from the final array into
2759 | these new tables, then performs date overlap
2760 | check before moving all good records into FEM
2761 | Rob Flippo 30-JUN-05 Bug#4355484
2762 | CALL BUS EVENT WHEN CCC-ORGS LOADED WITH DIM LOADER
2763 | As long as >0 new members created in a load, the
2764 | loader calls the bus. event
2765 | Rob Flippo 10-MAR-06 Bug#5068022 - unique constraint error on duplicate
2766 | names
2767 | Rob Flippo 04-APR-06 Bug#5117594 Remove unique name check for Customer
2768 | dimension
2769 | Rob Flippo 28-APR-06 Bug 5174039 Added validation that calp start_date
2770 | must be <= calp end date
2771 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
2772 +===========================================================================*/
2773
2774 PROCEDURE New_Members (p_eng_sql IN VARCHAR2
2775 ,p_data_slc IN VARCHAR2
2776 ,p_proc_num IN VARCHAR2
2777 ,p_partition_code IN NUMBER
2778 ,p_fetch_limit IN NUMBER
2779 ,p_load_type IN VARCHAR2
2780 ,p_dimension_varchar_label IN VARCHAR2
2781 ,p_date_format_mask IN VARCHAR2
2782 ,p_dimension_id IN VARCHAR2
2783 ,p_target_b_table IN VARCHAR2
2784 ,p_target_tl_table IN VARCHAR2
2785 ,p_target_attr_table IN VARCHAR2
2786 ,p_source_b_table IN VARCHAR2
2787 ,p_source_tl_table IN VARCHAR2
2788 ,p_source_attr_table IN VARCHAR2
2789 ,p_table_handler_name IN VARCHAR2
2790 ,p_member_col IN VARCHAR2
2791 ,p_member_dc_col IN VARCHAR2
2792 ,p_member_name_col IN VARCHAR2
2793 ,p_member_t_dc_col IN VARCHAR2
2794 ,p_member_t_name_col IN VARCHAR2
2795 ,p_member_description_col IN VARCHAR2
2796 ,p_value_set_required_flag IN VARCHAR2
2797 ,p_simple_dimension_flag IN VARCHAR2
2798 ,p_shared_dimension_flag IN VARCHAR2
2799 ,p_hier_dimension_flag IN VARCHAR2
2800 ,p_member_id_method_code IN VARCHAR2
2801 ,p_exec_mode_clause IN VARCHAR2
2802 ,p_master_request_id IN NUMBER)
2803 IS
2804 -- Constants
2805 c_proc_name VARCHAR2(30) := 'New_Members';
2806
2807 -- variables storing temporary state information
2808 v_attr_success VARCHAR2(30);
2809 v_temp_member VARCHAR2(100);
2810 v_count NUMBER;
2811 v_req_attribute_count NUMBER;
2812
2813 -- Dynamic SQL statement variables
2814 x_select_stmt VARCHAR2(4000);
2815 x_attr_select_stmt VARCHAR2(4000);
2816 x_remain_mbr_select_stmt VARCHAR2(4000);
2817 x_insert_member_stmt VARCHAR2(4000);
2818 x_insert_attr_stmt VARCHAR2(4000);
2819 x_update_stmt VARCHAR2(4000);
2820 x_attr_update_stmt VARCHAR2(4000);
2821 x_update_tl_stmt VARCHAR2(4000);
2822 x_update_dep_attr_status_stmt VARCHAR2(4000);
2823 x_update_dep_tl_status_stmt VARCHAR2(4000);
2824 x_update_attr_status_stmt VARCHAR2(4000);
2825 x_update_mbr_status_stmt VARCHAR2(4000);
2826 x_update_tl_status_stmt VARCHAR2(4000);
2827 x_update_dimgrp_stmt VARCHAR2(4000);
2828 x_delete_attr_stmt VARCHAR2(4000);
2829 x_special_delete_attr_stmt VARCHAR2(4000);
2830 x_delete_mbr_stmt VARCHAR2(4000);
2831 x_delete_tl_stmt VARCHAR2(4000);
2832 x_does_attr_exist_stmt VARCHAR2(4000);
2833 x_does_attr_exist_novers_stmt VARCHAR2(4000);
2834 x_overlap_sql_stmt VARCHAR2(4000);
2835 x_adj_period_stmt VARCHAR2(4000);
2836 x_dupname_count_stmt VARCHAR2(4000);
2837
2838 -- special stmt for CAL_PERIOD loads only
2839 -- for inserting into interim tables (to support Date Overlap checks)
2840 x_calp_interim_stmt VARCHAR2(4000);
2841 x_calp_attr_interim_stmt VARCHAR2(4000);
2842
2843 -- Count variables for manipulating the member and attribute arrays
2844 v_dupname_count NUMBER := 0;
2845 v_attr_final_count NUMBER := 0;
2846 v_mbr_final_count NUMBER := 0;
2847 v_mbr_count NUMBER := 0;
2848 v_mbr_subcount NUMBER := 0;
2849 v_attr_count NUMBER := 0;
2850 v_final_mbr_last_row NUMBER;
2851 v_attr_last_row NUMBER;
2852 v_mbr_last_row NUMBER;
2853 v_rows_fetched NUMBER;
2854 v_temp_rows_rejected NUMBER :=0;
2855 v_rows_rejected NUMBER :=0;
2856 v_rows_loaded NUMBER :=0;
2857 v_temp_rows_loaded NUMBER :=0;
2858 v_adj_period_count NUMBER :=0;
2859 v_overlap_count NUMBER :=0; -- counter for the number of
2860 -- cal periods that have overlapping
2861 -- dates in the _ATTR_T table
2862 v_duplicate_attr_count NUMBER; -- counter for verifying that duplicate
2863 -- assignments for same attr don't exist
2864 -- in the interface table
2865
2866 -- Other variables
2867 v_fetch_limit NUMBER;
2868
2869 -- MP variables
2870 v_loop_counter NUMBER;
2871 v_slc_id NUMBER;
2872 v_slc_val VARCHAR2(100);
2873 v_slc_val2 VARCHAR2(100);
2874 v_slc_val3 VARCHAR2(100);
2875 v_slc_val4 VARCHAR2(100);
2876 v_mp_status VARCHAR2(30);
2877 v_mp_message VARCHAR2(4000);
2878 v_num_vals NUMBER;
2879 v_part_name VARCHAR2(4000);
2880
2881 -------------------------------------
2882 -- Declare bulk collection columns --
2883 -------------------------------------
2884
2885 -- Common abbreviations:
2886 -- t_ = array of raw interface table member rows
2887 -- tf = "final" array of interface table member rows that have been validated for insert
2888 -- ta = array of raw interface table attribute rows
2889 -- tfa = "final" array of interface table attribute rows that have been validated for insert
2890
2891 t_rowid rowid_type;
2892 t_tl_rowid rowid_type;
2893 tf_tl_rowid rowid_type;
2894 tf_rowid rowid_type;
2895 ta_rowid rowid_type;
2896 tfa_rowid rowid_type;
2897
2898
2899 --t_member_id number_type;
2900 t_value_set_id number_type;
2901 t_dimension_group_id number_type;
2902 t_calendar_id number_type;
2903 t_cal_period_number number_type;
2904 t_dimension_group_seq number_type;
2905 t_time_group_type_code varchar2_std_type;
2906 t_seq_conflict_count number_type;
2907 -- t_periods_in_year number_type; -- not used at this time
2908 -- per bug#4031308
2909
2910 --tf_member_id number_type;
2911 tf_value_set_id number_type;
2912 tf_dimension_group_id number_type;
2913 tf_calendar_id number_type;
2914 tf_cal_period_number number_type;
2915 tf_dimension_group_seq number_type;
2916 tf_time_dimension_group_key number_type;
2917 tf_time_group_type_code varchar2_std_type;
2918 tf_dimension_id number_type;
2919 tf_dimgrp_dimension_group_id number_type;
2920
2921 ta_attribute_id number_type;
2922 ta_attribute_dimension_id number_type;
2923 ta_dim_attr_numeric_member number_type;
2924 ta_number_assign_value number_type;
2925 ta_version_id number_type;
2926 ta_attr_assign_vs_id number_type;
2927 ta_attr_exists_count number_type; -- count of existing attr assign with version_id
2928 ta_attr_exists_novers_count number_type; -- count of existing attr assign without version_id
2929
2930
2931 tfa_attribute_id number_type;
2932 tfa_dim_attr_numeric_member number_type;
2933 tfa_number_assign_value number_type;
2934 tfa_version_id number_type;
2935 tfa_attr_assign_vs_id number_type;
2936
2937 t_cal_period_end_date date_type;
2938 ta_cal_period_end_date date_type;
2939 tf_cal_period_end_date date_type;
2940 tfa_cal_period_end_date date_type;
2941 t_cal_period_start_date date_type;
2942 tf_cal_period_start_date date_type;
2943
2944 ta_date_assign_value date_type;
2945 tfa_date_assign_value date_type;
2946
2947 t_b_status varchar2_std_type;
2948 t_tl_status varchar2_std_type;
2949 tf_status varchar2_std_type;
2950
2951 ta_attribute_varchar_label varchar2_std_type;
2952 tfa_attribute_varchar_label varchar2_std_type;
2953 ta_attr_value_column_name varchar2_std_type;
2954 ta_attribute_data_type_code varchar2_std_type;
2955 ta_dim_attr_varchar_member varchar2_std_type;
2956 ta_status varchar2_std_type;
2957
2958
2959 tfa_dim_attr_varchar_member varchar2_std_type;
2960 tfa_status varchar2_std_type;
2961
2962 t_member_dc varchar2_150_type;
2963 t_calendar_dc varchar2_150_type;
2964 t_value_set_dc varchar2_150_type;
2965 t_dimension_group_dc varchar2_150_type;
2966 t_member_name varchar2_150_type;
2967 t_adj_period_flag flag_type; -- Y means it is an adj period
2968
2969 tf_member_dc varchar2_150_type;
2970 tf_member_name varchar2_150_type;
2971 tf_calendar_dc varchar2_150_type;
2972 tf_dimension_group_dc varchar2_150_type;
2973 tf_adj_period_flag flag_type;
2974
2975 ta_member_dc varchar2_150_type;
2976 ta_value_set_dc varchar2_150_type;
2977 ta_version_display_code varchar2_150_type;
2978 ta_attr_assign_vs_dc varchar2_150_type;
2979
2980 tfa_member_dc varchar2_150_type;
2981 tfa_value_set_dc varchar2_150_type;
2982
2983 t_member_desc desc_type;
2984 tf_member_desc desc_type;
2985
2986 t_new_member_flag flag_type;
2987
2988 ta_attribute_required_flag flag_type;
2989 ta_allow_mult_assign_flag flag_type;
2990 ta_read_only_flag flag_type;
2991 ta_allow_mult_versions_flag flag_type;
2992 ta_use_interim_table_flag flag_type; -- placeholder only - not functional
2993
2994 t_language lang_type;
2995 tf_language lang_type;
2996 ta_language lang_type;
2997
2998 ta_varchar_assign_value varchar2_1000_type;
2999 ta_attribute_assign_value varchar2_1000_type;
3000 tfa_varchar_assign_value varchar2_1000_type;
3001
3002 ta_member_read_only_flag flag_type; -- designates if the member is
3003 -- read only; this is ignored
3004 -- in the new_member section and
3005 -- only included for consistency
3006 -- with the bulk select
3007 -- variables for holding attributes of CAL_PERIOD
3008 ta_calpattr_cal_dc varchar2_std_type;
3009 ta_calpattr_dimgrp_dc varchar2_std_type;
3010 ta_calpattr_end_date date_type;
3011 ta_calpattr_period_num number_type;
3012
3013 ---------------------
3014 -- Declare cursors --
3015 ---------------------
3016 cv_get_rows cv_curs;
3017 cv_get_attr_rows cv_curs;
3018
3019 BEGIN
3020 FEM_ENGINES_PKG.TECH_MESSAGE
3021 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
3022
3023 --DBMS_SESSION.SET_SQL_TRACE (sql_trace => TRUE);
3024
3025 FEM_ENGINES_PKG.TECH_MESSAGE
3026 (c_log_level_1,c_block||'.'||c_proc_name||'.p_simple_dimension_flag'
3027 ,p_simple_dimension_flag);
3028
3029 --x_status := 0; -- initialize status of the New_Members procedure
3030 --x_message := 'COMPLETE:NORMAL';
3031
3032 ------------------------------------------------------------------------------
3033 -- Build the select stmt for new Dimension members using the information
3034 -- returned from get_dimension_info
3035 ------------------------------------------------------------------------------
3036
3037 build_mbr_select_stmt (p_load_type
3038 ,p_dimension_varchar_label
3039 ,p_dimension_id
3040 ,p_target_b_table
3041 ,p_target_tl_table
3042 ,p_source_b_table
3043 ,p_source_tl_table
3044 ,p_member_dc_col
3045 ,p_member_t_dc_col
3046 ,p_member_t_name_col
3047 ,p_member_description_col
3048 ,p_value_set_required_flag
3049 ,p_shared_dimension_flag
3050 ,p_hier_dimension_flag
3051 ,'N'
3052 ,p_exec_mode_clause
3053 ,x_select_stmt);
3054
3055 IF p_data_slc IS NOT NULL THEN
3056 x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}',p_data_slc);
3057 ELSE
3058 x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}','1=1');
3059 END IF;
3060
3061 -- set the local fetch limit variable based on the parameter
3062 -- this will be null for Dimension Group loads
3063 v_fetch_limit := p_fetch_limit;
3064 IF v_fetch_limit IS NULL THEN
3065 v_fetch_limit := 10000;
3066 END IF;
3067
3068 FEM_ENGINES_PKG.TECH_MESSAGE
3069 (c_log_level_1,c_block||'.'||c_proc_name||'.member select_stmt'
3070 ,x_select_stmt);
3071
3072
3073 build_insert_member_stmt (p_table_handler_name
3074 ,p_dimension_id
3075 ,p_value_set_required_flag
3076 ,p_hier_dimension_flag
3077 ,p_simple_dimension_flag
3078 ,p_member_id_method_code
3079 ,p_member_col
3080 ,p_member_dc_col
3081 ,p_member_name_col
3082 ,x_insert_member_stmt);
3083
3084 FEM_ENGINES_PKG.TECH_MESSAGE
3085 (c_log_level_1,c_block||'.'||c_proc_name||'.insert member stmt'
3086 ,x_insert_member_stmt);
3087
3088 build_status_update_stmt (p_source_b_table
3089 ,x_update_mbr_status_stmt);
3090
3091 build_status_update_stmt (p_source_tl_table
3092 ,x_update_tl_status_stmt);
3093
3094 build_delete_stmt (p_source_b_table
3095 ,x_delete_mbr_stmt);
3096
3097 build_delete_stmt (p_source_tl_table
3098 ,x_delete_tl_stmt);
3099
3100
3101 build_tl_dupname_stmt (p_dimension_varchar_label
3102 ,p_dimension_id
3103 ,p_load_type
3104 ,p_target_b_table
3105 ,p_target_tl_table
3106 ,p_member_col
3107 ,p_member_dc_col
3108 ,p_member_name_col
3109 ,p_value_set_required_flag
3110 ,'NEW_MEMBERS'
3111 ,x_dupname_count_stmt);
3112 FEM_ENGINES_PKG.TECH_MESSAGE
3113 (c_log_level_1,c_block||'.'||c_proc_name||'.dupname select stmt'
3114 ,x_dupname_count_stmt);
3115
3116
3117 IF (p_simple_dimension_flag = 'N') THEN
3118 build_attr_select_stmt (p_dimension_varchar_label
3119 ,p_dimension_id
3120 ,p_source_b_table
3121 ,p_source_attr_table
3122 ,p_target_b_table
3123 ,p_member_t_dc_col
3124 ,p_member_dc_col
3125 ,p_member_col
3126 ,p_value_set_required_flag
3127 ,p_shared_dimension_flag
3128 ,p_hier_dimension_flag
3129 ,'Y'
3130 ,'Y'
3131 ,p_exec_mode_clause
3132 ,x_attr_select_stmt);
3133
3134 IF p_data_slc IS NOT NULL THEN
3135 x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}',p_data_slc);
3136 ELSE
3137 x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}','1=1');
3138 END IF;
3139
3140 FEM_ENGINES_PKG.TECH_MESSAGE
3141 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute select stmt'
3142 ,x_attr_select_stmt);
3143
3144
3145 build_status_update_stmt (p_source_attr_table
3146 ,x_update_attr_status_stmt);
3147
3148 /* RCF 9-14-2004 Commented out since no longer needed
3149 build_dep_status_update_stmt (p_dimension_varchar_label
3150 ,p_source_attr_table
3151 ,p_member_t_dc_col
3152 ,p_value_set_required_flag
3153 ,x_update_dep_attr_status_stmt); */
3154
3155 build_insert_attr_stmt (p_target_attr_table
3156 ,p_target_b_table
3157 ,p_member_col
3158 ,p_member_dc_col
3159 ,p_value_set_required_flag
3160 ,x_insert_attr_stmt);
3161
3162 FEM_ENGINES_PKG.TECH_MESSAGE
3163 (c_log_level_1,c_block||'.'||c_proc_name||'.insert attr stmt'
3164 ,x_insert_attr_stmt);
3165
3166
3167 build_delete_stmt (p_source_attr_table
3168 ,x_delete_attr_stmt);
3169
3170 -- special insert stmts for the INTERIM tables for CAL_PERIOD loads
3171 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
3172
3173 build_calp_interim_insert_stmt(x_calp_interim_stmt
3174 ,x_calp_attr_interim_stmt);
3175 END IF;
3176
3177 END IF; --v_simple_dimension_flag = 'N'
3178
3179 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
3180 -- the data slice loop
3181 LOOP
3182
3183 IF p_load_type <> ('DIMENSION_GROUP') THEN
3184
3185 FEM_Multi_Proc_Pkg.Get_Data_Slice(
3186 x_slc_id => v_slc_id,
3187 x_slc_val1 => v_slc_val,
3188 x_slc_val2 => v_slc_val2,
3189 x_slc_val3 => v_slc_val3,
3190 x_slc_val4 => v_slc_val4,
3191 x_num_vals => v_num_vals,
3192 x_part_name => v_part_name,
3193 p_req_id => p_master_request_id,
3194 p_proc_num => p_proc_num);
3195
3196 FEM_ENGINES_PKG.TECH_MESSAGE
3197 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
3198 ,v_slc_val);
3199 FEM_ENGINES_PKG.TECH_MESSAGE
3200 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
3201 ,v_slc_val2);
3202 FEM_ENGINES_PKG.TECH_MESSAGE
3203 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
3204 ,v_slc_val3);
3205 FEM_ENGINES_PKG.TECH_MESSAGE
3206 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
3207 ,v_slc_val4);
3208
3209 EXIT WHEN (v_slc_id IS NULL);
3210 ELSE
3211 EXIT WHEN (v_loop_counter > 0);
3212 v_loop_counter := v_loop_counter + 1;
3213 END IF;
3214
3215
3216 ------------------------------------------------------------------------------
3217 -- Loop through the new members
3218 -- to perform validations and eventually insert into the target dimension tables
3219 ------------------------------------------------------------------------------
3220 IF p_load_type <> ('DIMENSION_GROUP') THEN
3221 OPEN cv_get_rows FOR x_select_stmt USING v_slc_val, v_slc_val2;
3222 ELSE
3223 OPEN cv_get_rows FOR x_select_stmt;
3224 END IF;
3225
3226
3227 LOOP
3228
3229 -------------------------------------------
3230 -- Bulk Collect Rows from the source _T tables
3231 -- Using Dynamic SELECT Statement
3232 -------------------------------------------
3233 FETCH cv_get_rows BULK COLLECT INTO
3234 t_rowid
3235 ,t_tl_rowid
3236 ,t_member_dc
3237 ,t_calendar_dc
3238 ,t_calendar_id
3239 ,t_cal_period_end_date
3240 ,t_cal_period_number
3241 ,t_value_set_dc
3242 ,t_value_set_id
3243 ,t_dimension_group_dc
3244 ,t_dimension_group_id
3245 ,t_b_status
3246 ,t_member_name
3247 ,t_member_desc
3248 ,t_language
3249 ,t_tl_status
3250 ,t_cal_period_start_date
3251 ,t_dimension_group_seq
3252 ,t_time_group_type_code
3253 LIMIT v_fetch_limit;
3254 ----------------------------------------------
3255 -- EXIT Fetch LOOP If No Rows are Retrieved --
3256 ----------------------------------------------
3257
3258 v_mbr_last_row := t_member_dc.LAST;
3259
3260 IF (v_mbr_last_row IS NULL)
3261 THEN
3262 EXIT;
3263 END IF;
3264
3265 FEM_ENGINES_PKG.TECH_MESSAGE
3266 (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
3267
3268 v_rows_fetched := v_rows_fetched + v_mbr_last_row;
3269
3270 ----------------------------------------------
3271 -- Begin Validations
3272 ----------------------------------------------
3273 FOR i IN 1..v_mbr_last_row
3274 LOOP
3275
3276 FEM_ENGINES_PKG.TECH_MESSAGE
3277 (c_log_level_1,c_block||'.'||c_proc_name||'.member display code'
3278 ,t_member_dc(i));
3279 FEM_ENGINES_PKG.TECH_MESSAGE
3280 (c_log_level_1,c_block||'.'||c_proc_name||'.dimension_group_id'
3281 ,t_dimension_group_id(i));
3282
3283 -- initializing the adj_period_flag
3284 -- this will get set appropriately if the period
3285 -- is not an adj period during the date_overlap check
3286 t_adj_period_flag(i) := 'Y';
3287
3288 -------------------------------------------------------------------
3289 -- For CAL_PERIOD member load, need to retrieve the periods_in_year
3290 -- for the Time Group Type of the new member.
3291 /***************************************************
3292 RCF 11/24/2004 Removing this check per bug#4031308
3293 IF (p_dimension_varchar_label = 'CAL_PERIOD'
3294 AND p_load_type NOT IN ('DIMENSION_GROUP')) THEN
3295 BEGIN
3296 SELECT A.number_assign_value
3297 INTO t_periods_in_year(i)
3298 FROM fem_time_grp_types_attr A
3299 ,fem_dim_attributes_b DA
3300 ,fem_dim_attr_versions_B V
3301 ,fem_dimension_grps_b DG
3302 WHERE A.time_group_type_code = DG.time_group_type_code
3303 AND DG.dimension_group_id = t_dimension_group_id(i)
3304 AND A.attribute_id = DA.attribute_id
3305 AND DA.dimension_id = 33
3306 AND DA.attribute_varchar_label = 'PERIODS_IN_YEAR'
3307 AND A.version_id = V.version_id
3308 AND V.default_version_flag = 'Y'
3309 AND V.aw_snapshot_flag = 'N'
3310 AND V.attribute_id = DA.attribute_id;
3311 EXCEPTION
3312 WHEN no_data_found THEN
3313 t_periods_in_year(i) := 0;
3314 FEM_ENGINES_PKG.TECH_MESSAGE
3315 (c_log_level_1,c_block||'.'||c_proc_name||'.periods_in_year'
3316 ,t_periods_in_year(i));
3317
3318 END;
3319 END IF; -- CAL_PERIOD
3320 *************************************************/
3321
3322 ----------------------------------------------
3323 -- Begin Duplicate Name Validations (only if dim <> 'CUSTOMER')
3324 -- Check to see if the translatabe name that will be load
3325 -- already exists for ANY language in the target TL table
3326 -- Set STATUS = 'DUPLICATE_NAME' if the name already exists
3327 ----------------------------------------------
3328 IF p_dimension_varchar_label <> 'CUSTOMER' THEN
3329 IF p_dimension_varchar_label = 'CAL_PERIOD'
3330 AND p_load_type <> 'DIMENSION_GROUP' THEN
3331 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3332 USING t_member_name(i)
3333 ,t_dimension_group_id(i)
3334 ,t_calendar_id(i);
3335
3336 ELSE
3337 IF p_value_set_required_flag = 'Y' THEN
3338 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3339 USING t_member_name(i)
3340 ,t_value_set_dc(i);
3341 ELSE
3342 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3343 USING t_member_name(i);
3344 END IF;
3345 END IF;
3346
3347 IF v_dupname_count > 0 THEN
3348 t_b_status(i) := 'INVALID_MEMBER';
3349 t_tl_status(i) := 'DUPLICATE_NAME';
3350 END IF;
3351 END IF; -- p_dim_label <> 'CUSTOMER'
3352
3353 ----------------------------------------------
3354 -- Begin Dimension Group Validations
3355 ----------------------------------------------
3356 IF (p_load_type = 'DIMENSION_GROUP') AND t_b_status(i) = 'LOAD' THEN
3357 SELECT count(*)
3358 INTO t_seq_conflict_count(i)
3359 FROM fem_dimension_grps_b
3360 WHERE dimension_group_seq = t_dimension_group_seq(i)
3361 AND dimension_id = p_dimension_id;
3362
3363 IF t_seq_conflict_count(i) > 0 THEN
3364 t_b_status(i) := 'DIMENSION_GROUP_SEQ_NOT_UNIQUE';
3365 END IF; -- seq_conflict_count
3366 IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
3367 SELECT count(*)
3368 INTO v_count
3369 FROM fem_time_group_types_b
3370 WHERE time_group_type_code = t_time_group_type_code(i);
3371
3372 IF v_count =0 THEN
3373 t_b_status(i) := 'INVALID_TIME_GROUP_TYPE';
3374 t_tl_status(i) := 'INVALID_MEMBER';
3375 END IF;
3376 END IF; -- CAL_PERIOD
3377 ELSE
3378 IF (p_value_set_required_flag = 'Y' AND t_value_set_id(i) IS NULL) THEN
3379 t_b_status(i) := 'INVALID_VALUE_SET';
3380 t_tl_status(i) := 'INVALID_MEMBER';
3381 END IF;
3382
3383 IF (p_dimension_varchar_label = 'CAL_PERIOD' AND t_calendar_id(i) IS NULL) THEN
3384 t_b_status(i) := 'INVALID_CALENDAR';
3385 t_tl_status(i) := 'INVALID_MEMBER';
3386 END IF;
3387
3388 IF (p_hier_dimension_flag = 'Y'
3389 AND t_b_status(i) = 'LOAD'
3390 AND t_dimension_group_dc(i) IS NOT NULL
3391 AND t_dimension_group_id(i) IS NULL) THEN
3392 t_b_status(i) := 'INVALID_DIMENSION_GROUP';
3393 t_tl_status(i) := 'INVALID_MEMBER';
3394 END IF; -- Validate Dimension Group
3395 END IF; -- Load Type Dimension Group v.s. Dimension
3396
3397 IF p_simple_dimension_flag = 'N' THEN
3398
3399 -- Count the number of required attribute rows
3400 SELECT count(*)
3401 INTO v_req_attribute_count
3402 FROM fem_dim_attributes_b
3403 WHERE dimension_id = p_dimension_id
3404 AND attribute_required_flag = 'Y'
3405 AND nvl(user_assign_allowed_flag,'Y') NOT IN ('N');
3406
3407 /* This section commented out - because Required attributes can't be assigned
3408 to a level. Only optional attributes
3409 AND (attribute_id NOT IN (SELECT attribute_id FROM fem_dim_attr_grps)
3410 OR attribute_id IN (SELECT attribute_id
3411 FROM fem_dim_attr_grps
3412 WHERE dimension_group_id = t_dimension_group_id(i))); */
3413
3414
3415 FEM_ENGINES_PKG.TECH_MESSAGE
3416 (c_log_level_1,c_block||'.'||c_proc_name||'.member status'
3417 ,t_b_status(i));
3418
3419 ------------------------------------------------------------
3420 -- Bulk Collect ATTR_T Rows
3421 -- Using Dynamic SELECT Statement
3422 -- 11/03/2004 For this section, we only want to enter
3423 -- the attribute loop for Cal Period dimension when
3424 -- the Dimension Group is valid. Otherwise, the loader
3425 -- would report MISSING_REQ_ATTRIBUTE status for that member
3426 -- which is not correct. For other dimensions, we want to
3427 -- enter the loop even when the Dimension Group is incorrect,
3428 -- so that all required attr rows in the _ATTR_T table get
3429 -- updated with INVALID_MEMBER
3430 -- The special update in the Pre Validation Attr section
3431 -- will update any req attr rows for CAL_PERIOD dimension
3432 -- when the Dimension Group is wrong
3433 ------------------------------------------------------------
3434 IF ((p_dimension_varchar_label = 'CAL_PERIOD' AND
3435 t_b_status(i) in ('LOAD')) OR
3436 (p_dimension_varchar_label NOT IN ('CAL_PERIOD') AND
3437 t_b_status(i) IN ('LOAD','INVALID_VALUE_SET',
3438 'INVALID_DIMENSION_GROUP')))
3439 THEN
3440 IF (p_value_set_required_flag = 'Y') THEN
3441 OPEN cv_get_attr_rows FOR x_attr_select_stmt
3442 USING t_member_dc(i)
3443 ,t_value_set_dc(i);
3444 ELSE
3445 OPEN cv_get_attr_rows FOR x_attr_select_stmt
3446 USING t_member_dc(i);
3447 END IF; -- v_value_set_required_flag
3448
3449 FETCH cv_get_attr_rows BULK COLLECT INTO
3450 ta_rowid
3451 ,ta_member_read_only_flag
3452 ,ta_attribute_id
3453 ,ta_attribute_varchar_label
3454 ,ta_attribute_dimension_id
3455 ,ta_attr_value_column_name
3456 ,ta_attribute_data_type_code
3457 ,ta_attribute_required_flag
3458 ,ta_read_only_flag
3459 ,ta_allow_mult_versions_flag
3460 ,ta_allow_mult_assign_flag
3461 ,ta_member_dc
3462 ,ta_value_set_dc
3463 ,ta_attribute_assign_value
3464 ,ta_dim_attr_numeric_member
3465 ,ta_dim_attr_varchar_member
3466 ,ta_number_assign_value
3467 ,ta_varchar_assign_value
3468 ,ta_date_assign_value
3469 ,ta_version_display_code
3470 ,ta_version_id
3471 ,ta_attr_assign_vs_dc
3472 ,ta_attr_assign_vs_id
3473 ,ta_status
3474 ,ta_use_interim_table_flag
3475 ,ta_calpattr_cal_dc
3476 ,ta_calpattr_dimgrp_dc
3477 ,ta_calpattr_end_date
3478 ,ta_calpattr_period_num
3479 LIMIT v_fetch_limit;
3480
3481 v_attr_last_row := NVL(ta_attribute_id.LAST,0);
3482 FEM_ENGINES_PKG.TECH_MESSAGE
3483 (c_log_level_1,c_block||'.'||c_proc_name||'.assignment rows',v_attr_last_row);
3484
3485 FEM_ENGINES_PKG.TECH_MESSAGE
3486 (c_log_level_1,c_block||'.'||c_proc_name||'.req_attr_rows',v_req_attribute_count);
3487
3488 -- Not enough attribute rows were returned because of either:
3489 -- 1) the join to the Version table (bad version display_code in _ATTR_T)
3490 -- or
3491 -- 2) a missing required attribute row
3492 -- In either case, we mark
3493 -- the member as MISSING_REQUIRED_ATTRIBUTE and the attribute rows with the
3494 -- valid version_display_code will get 'INVALID_MEMBER'. The
3495 -- Bad version display_code records have already been marked as
3496 -- INVALID_VERSION in the Pre_validation
3497 -- Note: It is also possible to return too many attr rows,
3498 -- if the user has attempted to provide "many to many"
3499 -- for a requried attribute (which is not allowed).
3500 -- So the comparison is <> to check for this case
3501 IF t_b_status(i) IN ('LOAD')
3502 AND v_attr_last_row < v_req_attribute_count THEN
3503 t_b_status(i) := 'MISSING_REQUIRED_ATTRIBUTE';
3504 t_tl_status(i) := 'INVALID_MEMBER';
3505 FEM_ENGINES_PKG.TECH_MESSAGE
3506 (c_log_level_1,c_block||'.'||c_proc_name||'.missing_req - end_date=',t_cal_period_end_date(i));
3507 ELSIF t_b_status(i) IN ('LOAD')
3508 AND v_attr_last_row > v_req_attribute_count THEN
3509 t_b_status(i) := 'DUPLICATE_REQUIRED_ATTRIBUTES';
3510 t_tl_status(i) := 'INVALID_MEMBER';
3511 ELSE
3512 FOR j IN 1..v_attr_last_row
3513 LOOP
3514
3515 FEM_ENGINES_PKG.TECH_MESSAGE
3516 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_label'
3517 ,ta_attribute_varchar_label(j));
3518 FEM_ENGINES_PKG.TECH_MESSAGE
3519 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute assign value'
3520 ,ta_attribute_assign_value(j));
3521 FEM_ENGINES_PKG.TECH_MESSAGE
3522 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_column_name'
3523 ,ta_attr_value_column_name(j));
3524
3525 /*
3526 -- Checking for duplicate attribute assignments
3527 -- Because the unique index on the ATTR_T table allows
3528 -- for duplicate assignments, we need to identify if such
3529 -- cases exist and update the status appropriately
3530 -- If allow_mult_assign = 'N' and duplicate exists,
3531 -- then status = MULT_ASSIGN_NOT_ALLOWED
3532 -- If allow_mult_assign = 'Y', then we have to check if
3533 -- the assignments are identical - if they are identical,
3534 -- then status = DUPLICATE_ATTR_ASSIGNMENTS
3535 -- Note: Since this is in the NEW_MEMBERS procedure,
3536 -- we are dealing with just the default version here
3537 -- which means we don't have compare version by version
3538 IF ta_allow_mult_assign_flag(j) = 'N' THEN
3539 v_duplicate_attr_count := 0;
3540 FOR k IN 1..v_attr_last_row LOOP
3541 IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k) THEN
3542 v_duplicate_attr_count := v_duplicate_attr_count + 1;
3543 END IF;
3544 END LOOP;
3545 IF v_duplicate_attr_count > 1 THEN
3546 ta_status(j) := 'MULT_ASSIGN_NOT_ALLOWED';
3547 t_b_status(i) := 'INVALID_MEMBER';
3548 t_tl_status(i) := 'INVALID_MEMBER';
3549 EXIT; -- member is no good so exit
3550 END IF;
3551 -- for the default version, can't have multiple records with same assignment
3552 -- when attribute is not CAL_PERIOD
3553 ELSIF ta_allow_mult_assign_flag(j) = 'Y'
3554 AND ta_attribute_dimension_id(j) <> 1 THEN
3555 v_duplicate_attr_count := 0;
3556 FOR k IN 1..v_attr_last_row LOOP
3557 IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k)
3558 AND ta_attribute_assign_value(j) = ta_attribute_assign_value(k)
3559 THEN
3560 v_duplicate_attr_count := v_duplicate_attr_count + 1;
3561 END IF;
3562 END LOOP;
3563 IF v_duplicate_attr_count > 1 THEN
3564 ta_status(j) := 'DUPLICATE_ATTR_ASSIGNMENTS';
3565 t_b_status(i) := 'INVALID_MEMBER';
3566 t_tl_status(i) := 'INVALID_MEMBER';
3567 EXIT; -- member is no good so exit
3568 END IF;
3569 -- for the default version, can't have multiple records with the same
3570 -- CAL_PERIOD attr assignment columns when the attribute
3571 -- is of dimension = CAL_PERIOD
3572 ELSIF ta_allow_mult_assign_flag(j) = 'Y'
3573 AND ta_attribute_dimension_id(j) = 1 THEN
3574 v_duplicate_attr_count := 0;
3575 FOR k IN 1..v_attr_last_row LOOP
3576 IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k)
3577 AND ta_calpattr_cal_dc(j) = ta_calpattr_cal_dc(j)
3578 AND ta_calpattr_dimgrp_dc(j) = ta_calpattr_dimgrp_dc(j)
3579 AND ta_calpattr_end_date(j) = ta_calpattr_end_date(j)
3580 AND ta_calpattr_period_num(j) = ta_calpattr_period_num(j)
3581 THEN
3582 v_duplicate_attr_count := v_duplicate_attr_count + 1;
3583 END IF;
3584 END LOOP;
3585 IF v_duplicate_attr_count > 1 THEN
3586 ta_status(j) := 'DUPLICATE_ATTR_ASSIGNMENTS';
3587 t_b_status(i) := 'INVALID_MEMBER';
3588 t_tl_status(i) := 'INVALID_MEMBER';
3589 EXIT; -- member is no good so exit
3590 END IF;
3591 END IF;
3592 */
3593 -----------------------------------------
3594 -- Bug#3822561 Support for attributes of CAL_PERIOD
3595 -- if the attribute_dimension_id = 1 (CAL_PERIOD)
3596 -- then we construct a CAL_PERIOD_ID from the
3597 -- special CALP columns and move it into the
3598 -- ta_attribute_assign_value(j)
3599 -----------------------------------------
3600 IF ta_attribute_dimension_id(j) = 1 THEN
3601 get_attr_assign_calp(ta_attribute_assign_value(j)
3602 ,ta_status(j)
3603 ,ta_calpattr_cal_dc(j)
3604 ,ta_calpattr_dimgrp_dc(j)
3605 ,ta_calpattr_end_date(j)
3606 ,ta_calpattr_period_num(j));
3607
3608 IF ta_status(j) NOT IN ('LOAD') THEN
3609 FEM_ENGINES_PKG.TECH_MESSAGE
3610 (c_log_level_1,c_block||'.'||c_proc_name
3611 ,'Invalid Member - exiting Attribute loop');
3612
3613 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3614 t_tl_status(i) := 'INVALID_MEMBER';
3615 EXIT; -- member is no good so exit
3616 END IF;
3617 END IF;
3618 -----------------------------------------
3619 -- BEGIN ATTR VALIDATIONS
3620 -- validate version_display_code
3621 -----------------------------------------
3622 get_attr_version (p_dimension_varchar_label
3623 ,ta_attribute_varchar_label(j)
3624 ,ta_version_display_code(j)
3625 ,ta_version_id(j));
3626
3627 -----------------------------------------
3628 -- validate attribute_assign_value
3629 -----------------------------------------
3630 -- VARCHAR_ASSIGN_VALUE
3631 IF (ta_attr_value_column_name(j) = 'VARCHAR_ASSIGN_VALUE'
3632 AND ta_attribute_assign_value(j) IS NOT NULL
3633 AND ta_version_id(j) IS NOT NULL) THEN
3634
3635 ta_varchar_assign_value(j)
3636 := to_char(ta_attribute_assign_value(j));
3637 -- NUMBER_ASSIGN_VALUE
3638 ELSIF (ta_attr_value_column_name(j) = 'NUMBER_ASSIGN_VALUE'
3639 AND ta_attribute_assign_value(j) IS NOT NULL
3640 AND ta_version_id(j) IS NOT NULL) THEN
3641 BEGIN
3642 ta_number_assign_value(j)
3643 := to_number(ta_attribute_assign_value(j));
3644
3645 -- Special validation for CAL_PERIOD_NUMBER
3646 -- ensures that the GL_PERIOD_NUM attr is identical
3647 -- to the value in the CAL_PERIOD_NUMBER column
3648 -- in the interface table
3649 -- and also must be <= periods_in_year for the
3650 -- Time Group Type
3651 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
3652 ta_attribute_varchar_label(j) = 'GL_PERIOD_NUM' AND
3653 ((t_cal_period_number(i) <> ta_number_assign_value(j) OR
3654 t_cal_period_number(i) < 1 )) THEN
3655
3656 FEM_ENGINES_PKG.TECH_MESSAGE
3657 (c_log_level_1,c_block||'.'||c_proc_name||'.period_number'
3658 ,ta_number_assign_value(j));
3659
3660 RAISE e_invalid_cal_period_number;
3661 END IF;
3662
3663 -- Special validation for ACCOUNTING_YEAR
3664 -- ensures that the ACCOUNTING_YEAR value
3665 -- is within the year range supported
3666 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
3667 ta_attribute_varchar_label(j) = 'ACCOUNTING_YEAR' AND
3668 (ta_number_assign_value(j) < 1900 OR
3669 ta_number_assign_value(j) >= 2599) THEN
3670 RAISE e_invalid_acct_year;
3671 END IF;
3672
3673 EXCEPTION
3674 WHEN e_invalid_cal_period_number THEN
3675 ta_status(j) := 'INVALID_GL_PERIOD_NUM';
3676 t_b_status(i) := 'INVALID_GL_PERIOD_NUM';
3677 t_tl_status(i) := 'INVALID_GL_PERIOD_NUM';
3678
3679 WHEN e_invalid_acct_year THEN
3680 ta_status(j) := 'INVALID_ACCOUNTING_YEAR';
3681 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3682 t_tl_status(i) := 'INVALID_MEMBER';
3683
3684 WHEN e_invalid_number THEN
3685 ta_status(j) := 'INVALID_NUMBER';
3686 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3687 t_tl_status(i) := 'INVALID_MEMBER';
3688
3689 WHEN e_invalid_number1722 THEN
3690 ta_status(j) := 'INVALID_NUMBER';
3691 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3692 t_tl_status(i) := 'INVALID_MEMBER';
3693
3694 END; -- NUMBER_ASSIGN_VALUE
3695 -- DATE_ASSIGN_VALUE
3696 ELSIF (ta_attr_value_column_name(j) = 'DATE_ASSIGN_VALUE'
3697 AND ta_attribute_assign_value(j) IS NOT NULL
3698 AND ta_version_id(j) IS NOT NULL) THEN
3699 BEGIN
3700 FEM_ENGINES_PKG.TECH_MESSAGE
3701 (c_log_level_1,c_block||'.'||c_proc_name||'.assigning date'
3702 ,ta_attribute_assign_value(j));
3703 ta_date_assign_value(j)
3704 := to_date(ta_attribute_assign_value(j),p_date_format_mask);
3705
3706 FEM_ENGINES_PKG.TECH_MESSAGE
3707 (c_log_level_1,c_block||'.'||c_proc_name||'.end assigning date'
3708 ,ta_date_assign_value(j));
3709
3710 -- Special validations for CAL_PERIOD
3711 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
3712
3713 IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
3714 -- Saving the start_date at the member level so we
3715 -- can compare it later for date overlaps
3716 t_cal_period_start_date(i) := ta_date_assign_value(j);
3717
3718 IF t_cal_period_start_date(i) > t_cal_period_end_date(i) THEN
3719 RAISE e_invalid_calp_start_date;
3720 END IF;
3721
3722 END IF;
3723
3724 IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_END_DATE' AND
3725 t_cal_period_end_date(i) <> ta_date_assign_value(j) THEN
3726 RAISE e_invalid_cal_period_end_date;
3727 END IF;
3728 -- Special validation for CAL_PERIOD_START_DATE
3729 -- looking for overlap periods in the _ATTR_T table for
3730 -- new Cal Periods that the user is trying to load
3731 -- We are only checking within our data slice, since
3732 -- if the overlap is in a separate data slice, the main
3733 -- check on "existing" overlap records will catch it
3734 IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
3735 -- query to see if any records exist for the same
3736 -- calendar/dimgrp in the ATTR_T interface table
3737 -- for the data slice
3738 -- where start_date <= x and end_date >= x
3739 -- (where x is the new start date)
3740
3741 -- First check to see if the new cal period with the new start
3742 -- date is an adj. period or not
3743 /*********************************************************
3744 bug#5060746 - comment out so can convert literals to bind variables
3745 x_adj_period_stmt := 'select count(*)'||
3746 ' from fem_cal_periods_attr_t A1'||
3747 ' where A1.calendar_display_code = '''||t_calendar_dc(i)||''''||
3748 ' and A1.dimension_group_display_code = '''||t_dimension_group_dc(i)||''''||
3749 ' and A1.cal_period_number = '''||t_cal_period_number(i)||''''||
3750 ' and to_char(A1.cal_period_end_date,'''||p_date_format_mask||''')'||
3751 ' = '''||to_char(t_cal_period_end_date(i),p_date_format_mask)||''''||
3752 ' and A1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3753 ' and A1.attribute_assign_value = ''Y''';
3754 ********************************************************/
3755
3756 x_adj_period_stmt := 'select count(*)'||
3757 ' from fem_cal_periods_attr_t A1'||
3758 ' where A1.calendar_display_code = :b_cal_dc'||
3759 ' and A1.dimension_group_display_code = :b_dimgrp_dc'||
3760 ' and A1.cal_period_number = :b_calp_nbr'||
3761 ' and A1.cal_period_end_date'||
3762 ' = :b_calp_end_date'||
3763 ' and A1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3764 ' and A1.attribute_assign_value = ''Y''';
3765
3766 EXECUTE IMMEDIATE x_adj_period_stmt INTO v_adj_period_count
3767 USING t_calendar_dc(i)
3768 ,t_dimension_group_dc(i)
3769 ,t_cal_period_number(i)
3770 ,t_cal_period_end_date(i);
3771
3772 -- If not an adjustment period, then we need to check for
3773 -- date overlap
3774 IF v_adj_period_count = 0 THEN
3775 t_adj_period_flag(i) := 'N';
3776 -- query to see if any records exist for the same
3777 -- calendar/dimgrp in the offical db
3778 -- (new) array_start_date <= table.end_date AND
3779 -- array_end_date >= table.start_date
3780 -- and the existing members are not adj periods
3781 -- and the existing members are enabled=Y
3782 x_overlap_sql_stmt :=
3783 'select count(*)'||
3784 ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
3785 ' fem_cal_periods_b C,'||
3786 ' fem_dim_attributes_b AE,'||
3787 ' fem_dim_attr_Versions_b VE,'||
3788 ' fem_cal_periods_attr CP,'||
3789 ' fem_dim_attributes_b AP,'||
3790 ' fem_dim_attr_versions_b VP'||
3791 ' where CS.cal_period_id = C.cal_period_id'||
3792 ' and C.cal_period_id = CP.cal_period_id'||
3793 ' and C.enabled_flag = ''Y'''||
3794 ' and CP.attribute_id = AP.attribute_id'||
3795 ' and CP.version_id = VP.version_id'||
3796 ' and CP.dim_attribute_varchar_member = ''N'''||
3797 ' and AP.dimension_id = 1'||
3798 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3799 ' and VP.attribute_id = AP.attribute_id'||
3800 ' and VP.default_version_flag = ''Y'''||
3801 ' and VP.aw_snapshot_flag = ''N'''||
3802 ' and C.calendar_id = :b_cal_id'||
3803 ' and C.dimension_group_id = :b_dimgrp_id'||
3804 ' and CS.attribute_id = :b_attr_id'||
3805 ' and CS.version_id = :b_vers_id'||
3806 ' and CS.date_assign_value'||
3807 ' <= :b_new_end_date'||
3808 ' and CS.cal_period_id = CE.cal_period_id'||
3809 ' and CE.attribute_id = AE.attribute_id'||
3810 ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
3811 ' and CE.version_id = VE.version_id'||
3812 ' and VE.aw_snapshot_flag = ''N'''||
3813 ' and VE.default_version_flag = ''Y'''||
3814 ' and VE.attribute_id = AE.attribute_id'||
3815 ' and CE.date_assign_value'||
3816 ' >= :b_new_start_date';
3817
3818 FEM_ENGINES_PKG.TECH_MESSAGE
3819 (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt3'
3820 ,x_overlap_sql_stmt);
3821
3822 EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count
3823 USING t_calendar_id(i)
3824 ,t_dimension_group_id(i)
3825 ,ta_attribute_id(j)
3826 ,ta_version_id(j)
3827 ,t_cal_period_end_date(i)
3828 ,ta_date_assign_value(j);
3829
3830
3831 /********************************************************
3832 bug#5060746 - comment out so can convert literals to bind variables
3833 x_overlap_sql_stmt :=
3834 'select count(*)'||
3835 ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
3836 ' fem_cal_periods_b C,'||
3837 ' fem_dim_attributes_b AE,'||
3838 ' fem_dim_attr_Versions_b VE,'||
3839 ' fem_cal_periods_attr CP,'||
3840 ' fem_dim_attributes_b AP,'||
3841 ' fem_dim_attr_versions_b VP'||
3842 ' where CS.cal_period_id = C.cal_period_id'||
3843 ' and C.cal_period_id = CP.cal_period_id'||
3844 ' and C.enabled_flag = ''Y'''||
3845 ' and CP.attribute_id = AP.attribute_id'||
3846 ' and CP.version_id = VP.version_id'||
3847 ' and CP.dim_attribute_varchar_member = ''N'''||
3848 ' and AP.dimension_id = 1'||
3849 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3850 ' and VP.attribute_id = AP.attribute_id'||
3851 ' and VP.default_version_flag = ''Y'''||
3852 ' and VP.aw_snapshot_flag = ''N'''||
3853 ' and C.calendar_id = '||t_calendar_id(i)||
3854 ' and C.dimension_group_id = '||t_dimension_group_id(i)||
3855 ' and CS.attribute_id = '||ta_attribute_id(j)||
3856 ' and CS.version_id = '||ta_version_id(j)||
3857 ' and CS.date_assign_value'||
3858 ' <= :b_new_end_date'||
3859 ' and CS.cal_period_id = CE.cal_period_id'||
3860 ' and CE.attribute_id = AE.attribute_id'||
3861 ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
3862 ' and CE.version_id = VE.version_id'||
3863 ' and VE.aw_snapshot_flag = ''N'''||
3864 ' and VE.default_version_flag = ''Y'''||
3865 ' and VE.attribute_id = AE.attribute_id'||
3866 ' and CE.date_assign_value'||
3867 ' >= :b_new_start_date';
3868 **********************************************************/
3869
3870
3871 IF v_overlap_count > 0 THEN
3872 ta_status(j) := 'OVERLAP_EXIST_START_DATE';
3873 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3874 t_tl_status(i) := 'INVALID_MEMBER';
3875 END IF; -- overlap if
3876 /*******************************************************
3877 ELSE -- query to see if any records exist for the same
3878 -- calendar/dimgrp in the offical db
3879 -- where start_date >= x and start_date <= y
3880 -- (where x is the new start date and
3881 -- y is the new end date)
3882 -- and the exist periods are not adj periods
3883 x_overlap_sql_stmt :=
3884 'select count(*)'||
3885 ' from fem_cal_periods_attr CS,'||
3886 ' fem_cal_periods_b C,'||
3887 ' fem_cal_periods_attr CP,'||
3888 ' fem_dim_attributes_b AP,'||
3889 ' fem_dim_attr_versions_b VP'||
3890 ' where CS.cal_period_id = C.cal_period_id'||
3891 ' and C.cal_period_id = CP.cal_period_id'||
3892 ' and C.enabled_flag = ''Y'''||
3893 ' and CP.attribute_id = AP.attribute_id'||
3894 ' and CP.version_id = VP.version_id'||
3895 ' and CP.dim_attribute_varchar_member = ''N'''||
3896 ' and AP.dimension_id = 1'||
3897 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3898 ' and VP.attribute_id = AP.attribute_id'||
3899 ' and VP.default_version_flag = ''Y'''||
3900 ' and VP.aw_snapshot_flag = ''N'''||
3901 ' and C.calendar_id = '||t_calendar_id(i)||
3902 ' and C.dimension_group_id = '||t_dimension_group_id(i)||
3903 ' and CS.attribute_id = '||ta_attribute_id(j)||
3904 ' and CS.version_id = '||ta_version_id(j)||
3905 ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
3906 ' >= '''||to_char(ta_date_assign_value(j),p_date_format_mask)||''''||
3907 ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
3908 ' <= '''||to_char(t_cal_period_end_date(i),p_date_format_mask)||'''';
3909
3910 FEM_ENGINES_PKG.TECH_MESSAGE
3911 (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt4'
3912 ,x_overlap_sql_stmt);
3913 EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count;
3914
3915 IF v_overlap_count > 0 THEN
3916 ta_status(j) := 'OVERLAP_EXIST_START_DATE';
3917 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3918 t_tl_status(i) := 'INVALID_MEMBER';
3919 END IF;
3920 ***********************************************/
3921 ELSE
3922 t_adj_period_flag(i) := 'Y';
3923 END IF; -- adj_count >0
3924 END IF; -- attribute is start_date
3925 END IF; -- special checks for 'CAL_PERIOD' dimension
3926 --End Special Checks for CAL Period
3927 ----------------------------------------------------------------
3928 EXCEPTION
3929 WHEN e_invalid_calp_start_date THEN
3930 ta_status(j) := 'INVALID_CAL_PERIOD_START_DATE';
3931 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3932 t_tl_status(i) := 'INVALID_MEMBER';
3933 WHEN e_invalid_cal_period_end_date THEN
3934 ta_status(j) := 'INVALID_CAL_PERIOD_END_DATE';
3935 t_b_status(i) := 'INVALID_CAL_PERIOD_END_DATE';
3936 t_tl_status(i) := 'INVALID_CAL_PERIOD_END_DATE';
3937 WHEN e_date_string_too_long THEN
3938 ta_status(j) := 'INVALID_DATE';
3939 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3940 t_tl_status(i) := 'INVALID_MEMBER';
3941 WHEN e_invalid_date_format THEN
3942 ta_status(j) := 'INVALID_DATE';
3943 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3944 t_tl_status(i) := 'INVALID_MEMBER';
3945 WHEN e_invalid_date THEN
3946 ta_status(j) := 'INVALID_DATE';
3947 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3948 t_tl_status(i) := 'INVALID_MEMBER';
3949 WHEN e_invalid_date_numeric THEN
3950 ta_status(j) := 'INVALID_DATE';
3951 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3952 t_tl_status(i) := 'INVALID_MEMBER';
3953 WHEN e_invalid_date_between THEN
3954 ta_status(j) := 'INVALID_DATE';
3955 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3956 t_tl_status(i) := 'INVALID_MEMBER';
3957 WHEN e_invalid_date_year THEN
3958 ta_status(j) := 'INVALID_DATE';
3959 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3960 t_tl_status(i) := 'INVALID_MEMBER';
3961 WHEN e_invalid_date_day THEN
3962 ta_status(j) := 'INVALID_DATE';
3963 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3964 t_tl_status(i) := 'INVALID_MEMBER';
3965
3966 END; -- DATE_ASSIGN_VALUE
3967 ELSIF (ta_attr_value_column_name(j) IN
3968 ('DIM_ATTRIBUTE_VARCHAR_MEMBER', 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
3969 AND ta_attribute_assign_value(j) IS NOT NULL
3970 AND ta_version_id(j) IS NOT NULL) THEN
3971
3972 --------------------------------------------------
3973 -- get the Value Set ID for the assigned attribute
3974 -- 9/15/2004 RCF Modify this section so that if the
3975 -- attr_assign_vs_dc doesn't exist for the specified dimension
3976 -- the row fails
3977 -- Note that the INVALID_ATTR_ASSIGN_VS status will never
3978 -- appear, since the INVALID_DIM_ASSIGNMENT will overwrite it
3979 -- in the case of a bad VS being specified for a member
3980 --------------------------------------------------
3981 IF (ta_attr_assign_vs_dc(j) IS NOT NULL) THEN
3982 BEGIN
3983 SELECT value_set_id
3984 INTO ta_attr_assign_vs_id(j)
3985 FROM fem_value_sets_b
3986 WHERE value_set_display_code = ta_attr_assign_vs_dc(j)
3987 AND dimension_id = ta_attribute_dimension_id(j);
3988 EXCEPTION
3989 WHEN no_data_found THEN
3990 ta_status(j) := 'INVALID_ATTR_ASSIGN_VALUE_SET';
3991 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3992 t_tl_status(i) := 'INVALID_MEMBER';
3993 END;
3994 END IF;
3995
3996 verify_attr_member (ta_attribute_varchar_label(j)
3997 ,p_dimension_varchar_label
3998 ,ta_attribute_assign_value(j)
3999 ,ta_attr_assign_vs_dc(j)
4000 ,v_attr_success
4001 ,v_temp_member);
4002 FEM_ENGINES_PKG.TECH_MESSAGE
4003 (c_log_level_1,c_block||'.'||c_proc_name||'.verify_attribute_success'
4004 ,v_attr_success);
4005
4006 IF (v_attr_success = 'N') THEN
4007 ta_status(j) := 'INVALID_DIM_ASSIGNMENT';
4008 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4009 t_tl_status(i) := 'INVALID_MEMBER';
4010 ELSIF (v_attr_success = 'MISSING_ATTR_ASSIGN_VS') THEN
4011 ta_status(j) := 'MISSING_ATTR_ASSIGN_VS';
4012 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4013 t_tl_status(i) := 'INVALID_MEMBER';
4014 ELSE -- DIM Assignment is good
4015 IF (ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_VARCHAR_MEMBER') THEN
4016 ta_dim_attr_varchar_member(j) := to_char(v_temp_member);
4017 ELSE
4018 ta_dim_attr_numeric_member(j) := to_number(v_temp_member);
4019 END IF; -- Choice between VARCHAR and NUMERIC Dim members
4020 END IF; -- attr_req=Y and success=N
4021 ELSIF (ta_member_dc(j) IS NULL) THEN
4022 ta_status(j) := 'INVALID_MEMBER';
4023 t_b_status(i) := 'MISSING_REQUIRED_ATTRIBUTE';
4024 t_tl_status(i) := 'INVALID_MEMBER';
4025 ELSIF (ta_version_id(j) IS NULL) THEN-- Version is NULL
4026 ta_status(j) := 'INVALID_VERSION';
4027 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4028 t_tl_status(i) := 'INVALID_MEMBER';
4029 ELSE -- Assignment is NULL or Assignment Column not valid
4030 ta_status(j) := 'INVALID_ATTRIBUTE_ASSIGNMENT';
4031 t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4032 t_tl_status(i) := 'INVALID_MEMBER';
4033 END IF; -- Main IF on validating the attributes
4034
4035 FEM_ENGINES_PKG.TECH_MESSAGE
4036 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_status'
4037 ,ta_status(j));
4038 FEM_ENGINES_PKG.TECH_MESSAGE
4039 (c_log_level_1,c_block||'.'||c_proc_name||'.member_status'
4040 ,t_b_status(i));
4041
4042 IF (t_b_status(i) NOT IN ('LOAD')) THEN
4043 FEM_ENGINES_PKG.TECH_MESSAGE
4044 (c_log_level_1,c_block||'.'||c_proc_name
4045 ,'Invalid Member - exiting Attribute loop');
4046
4047 EXIT; -- member is no good so exit
4048 END IF;
4049 END LOOP; -- attribute validations
4050 END IF; -- If v_attr_last_row = v_req_attribute_count
4051 --------------------------------------------------------------------
4052 FEM_ENGINES_PKG.TECH_MESSAGE
4053 (c_log_level_1,c_block||'.'||c_proc_name||'.member status'
4054 ,t_b_status(i));
4055
4056 FEM_ENGINES_PKG.TECH_MESSAGE
4057 (c_log_level_1,c_block||'.'||c_proc_name||'.tl_member status'
4058 ,t_tl_status(i));
4059
4060 IF (t_b_status(i) NOT IN ('LOAD')) THEN
4061 FEM_ENGINES_PKG.TECH_MESSAGE
4062 (c_log_level_1,c_block||'.'||c_proc_name
4063 ,'Invalid Member - Reset all attributes of the member to INVALID_MEMBER');
4064
4065 FOR k IN 1..v_attr_last_row
4066 LOOP
4067 IF (ta_status(k) = 'LOAD') THEN
4068 ta_status(k) := 'INVALID_MEMBER';
4069 END IF;
4070 END LOOP;
4071 END IF;
4072
4073 -----------------------------------------------------------------
4074 -- Copy ATTR Collection for good members in prep for insert later
4075 -----------------------------------------------------------------
4076 IF (t_b_status(i) = 'LOAD') THEN
4077
4078 v_attr_count := 1;
4079 WHILE v_attr_count <= v_attr_last_row
4080 LOOP
4081 IF (ta_status(v_attr_count) = 'LOAD') THEN
4082 v_attr_final_count := v_attr_final_count + 1;
4083
4084 tfa_rowid(v_attr_final_count) := ta_rowid(v_attr_count);
4085 tfa_attribute_id(v_attr_final_count) := ta_attribute_id(v_attr_count);
4086 tfa_member_dc(v_attr_final_count) := ta_member_dc(v_attr_count);
4087 tfa_value_set_dc(v_attr_final_count) := ta_value_set_dc(v_attr_count);
4088 tfa_dim_attr_numeric_member(v_attr_final_count) := ta_dim_attr_numeric_member(v_attr_count);
4089 tfa_dim_attr_varchar_member(v_attr_final_count) := ta_dim_attr_varchar_member(v_attr_count);
4090 tfa_number_assign_value(v_attr_final_count) := ta_number_assign_value(v_attr_count);
4091 tfa_varchar_assign_value(v_attr_final_count) := ta_varchar_assign_value(v_attr_count);
4092 tfa_date_assign_value(v_attr_final_count) := ta_date_assign_value(v_attr_count);
4093 tfa_version_id(v_attr_final_count) := ta_version_id(v_attr_count);
4094 tfa_attr_assign_vs_id(v_attr_final_count) := ta_attr_assign_vs_id(v_attr_count);
4095 tfa_status(v_attr_final_count) := ta_status(v_attr_count);
4096 tfa_attribute_varchar_label(v_attr_final_count) := ta_attribute_varchar_label(v_attr_count);
4097
4098
4099 END IF; -- Copy ATTR for good members
4100
4101 v_attr_count := v_attr_count + 1;
4102 END LOOP;
4103 ELSE
4104 ----------------------------------------------------------
4105 -- Count the error rows
4106 ----------------------------------------------------------
4107 v_temp_rows_rejected := v_temp_rows_rejected + v_attr_last_row;
4108
4109 END IF; -- Copy good members and ATTR
4110
4111 ----------------------------------------------------------
4112 -- Update Status of ATTR Collection for failed records
4113 ----------------------------------------------------------
4114 FORALL i IN 1..v_attr_last_row
4115 EXECUTE IMMEDIATE x_update_attr_status_stmt
4116 USING ta_status(i)
4117 ,ta_rowid(i)
4118 ,ta_status(i);
4119
4120 --------------------------------------------
4121 -- Delete ATTR Collection for Next Bulk Fetch --
4122 --------------------------------------------
4123 ta_rowid.DELETE;
4124 ta_member_read_only_flag.DELETE;
4125 ta_attribute_id.DELETE;
4126 ta_attribute_varchar_label.DELETE;
4127 ta_attribute_dimension_id.DELETE;
4128 ta_attr_value_column_name.DELETE;
4129 ta_attribute_data_type_code.DELETE;
4130 ta_attribute_required_flag.DELETE;
4131 ta_read_only_flag.DELETE;
4132 ta_allow_mult_versions_flag.DELETE;
4133 ta_allow_mult_assign_flag.DELETE;
4134 ta_member_dc.DELETE;
4135 ta_value_set_dc.DELETE;
4136 ta_attribute_assign_value.DELETE;
4137 ta_dim_attr_numeric_member.DELETE;
4138 ta_dim_attr_varchar_member.DELETE;
4139 ta_number_assign_value.DELETE;
4140 ta_varchar_assign_value.DELETE;
4141 ta_date_assign_value.DELETE;
4142 ta_version_display_code.DELETE;
4143 ta_version_id.DELETE;
4144 ta_language.DELETE;
4145 ta_attr_assign_vs_dc.DELETE;
4146 ta_attr_assign_vs_id.DELETE;
4147 ta_status.DELETE;
4148 ta_use_interim_table_flag.DELETE;
4149 ta_calpattr_cal_dc.DELETE;
4150 ta_calpattr_dimgrp_dc.DELETE;
4151 ta_calpattr_end_date.DELETE;
4152 ta_calpattr_period_num.DELETE;
4153
4154
4155 CLOSE cv_get_attr_rows;
4156 END IF; -- t_b_status(i) = 'LOAD'
4157 END IF; -- Simple Dimension Flag = N
4158 END LOOP; -- Begin Validations
4159
4160
4161 -----------------------------------------------------------------
4162 -- Copy Member Collection for good members in prep for insert later
4163 -----------------------------------------------------------------
4164 v_mbr_last_row := t_member_dc.LAST;
4165 v_mbr_count := 1;
4166
4167 FEM_ENGINES_PKG.TECH_MESSAGE
4168 (c_log_level_1,c_block||'.'||c_proc_name||'.before copy good members',
4169 v_mbr_last_row);
4170
4171
4172 ----------------------------------------------------------
4173 -- Count the attribute error rows
4174 ----------------------------------------------------------
4175 v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
4176 v_temp_rows_rejected := 0; -- initialize so we can use again
4177 FEM_ENGINES_PKG.TECH_MESSAGE
4178 (c_log_level_1,c_block||'.'||c_proc_name||'.attr error rows',
4179 v_rows_rejected);
4180
4181 WHILE v_mbr_count <= v_mbr_last_row
4182 LOOP
4183 IF (t_b_status(v_mbr_count) = 'LOAD') THEN
4184 /************************************
4185 Commenting out Array Date Overlap checks per bug#4030717
4186 Date Overlap checks within the load are now handled in the
4187 FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T tables
4188 so that we can use MP for CAL_PERIOD loads
4189 ______________________________________________________
4190
4191 FEM_ENGINES_PKG.TECH_MESSAGE
4192 (c_log_level_1,c_block||'.'||c_proc_name
4193 ,'Start Overlap Check - t_b_status = '||t_b_status(v_mbr_count));
4194
4195
4196 -- perform date overlap checks
4197 -- cycle thru every member in the array to look for
4198 -- date overlaps
4199 v_mbr_subcount := v_mbr_count + 1; -- we always start checking
4200 -- for date overlaps starting one
4201 -- member below our current position
4202 FEM_ENGINES_PKG.TECH_MESSAGE
4203 (c_log_level_1,c_block||'.'||c_proc_name
4204 ,'Overlap Check - v_mbr_count = '||v_mbr_count);
4205
4206 IF p_dimension_varchar_label = 'CAL_PERIOD'
4207 AND p_load_type NOT IN ('DIMENSION_GROUP')
4208 AND t_b_status(v_mbr_count) = 'LOAD'
4209 AND t_adj_period_flag(v_mbr_count) = 'N' THEN
4210
4211 FEM_ENGINES_PKG.TECH_MESSAGE
4212 (c_log_level_1,c_block||'.'||c_proc_name
4213 ,'Overlap Check inside CAL_PERIOD = ');
4214
4215 WHILE v_mbr_subcount <= v_mbr_last_row AND t_b_status(v_mbr_count) = 'LOAD'
4216 LOOP
4217
4218 FEM_ENGINES_PKG.TECH_MESSAGE
4219 (c_log_level_1,c_block||'.'||c_proc_name
4220 ,'Overlap Check - sub start_date = '||t_cal_period_start_date(v_mbr_subcount));
4221
4222 FEM_ENGINES_PKG.TECH_MESSAGE
4223 (c_log_level_1,c_block||'.'||c_proc_name
4224 ,'Overlap Check - start_date = '||t_cal_period_start_date(v_mbr_count));
4225
4226 FEM_ENGINES_PKG.TECH_MESSAGE
4227 (c_log_level_1,c_block||'.'||c_proc_name
4228 ,'Overlap Check - sub end_date = '||t_cal_period_end_date(v_mbr_subcount));
4229
4230 FEM_ENGINES_PKG.TECH_MESSAGE
4231 (c_log_level_1,c_block||'.'||c_proc_name
4232 ,'Overlap Check - end_date = '||t_cal_period_end_date(v_mbr_count));
4233
4234 FEM_ENGINES_PKG.TECH_MESSAGE
4235 (c_log_level_1,c_block||'.'||c_proc_name
4236 ,'Overlap Check - sub adj_flag = '||t_adj_period_flag(v_mbr_subcount));
4237
4238 IF t_adj_period_flag(v_mbr_subcount) = 'N'
4239 AND ((t_cal_period_start_date(v_mbr_subcount) <=
4240 t_cal_period_start_date(v_mbr_count)
4241 AND t_cal_period_end_date(v_mbr_subcount) >=
4242 t_cal_period_start_date(v_mbr_count))
4243 OR (t_cal_period_start_date(v_mbr_subcount) >=
4244 t_cal_period_start_date(v_mbr_count)
4245 AND t_cal_period_start_date(v_mbr_subcount) <=
4246 t_cal_period_end_date(v_mbr_count)))
4247 THEN
4248 v_attr_last_row := NVL(tfa_attribute_id.LAST,0);
4249 v_attr_count := 0;
4250 FEM_ENGINES_PKG.TECH_MESSAGE
4251 (c_log_level_1,c_block||'.'||c_proc_name
4252 ,'Overlap Member - Reset all attributes of the member to INVALID_MEMBER');
4253
4254 FOR k IN 1..v_attr_last_row
4255 LOOP
4256 IF ((tfa_member_dc(k) = t_member_dc(v_mbr_count) OR
4257 tfa_member_dc(k) = t_member_dc(v_mbr_subcount))) AND
4258 (tfa_attribute_varchar_label(k) = 'CAL_PERIOD_START_DATE') AND
4259 tfa_status(k) = 'LOAD' THEN
4260 tfa_status(k) := 'OVERLAP_START_DATE_IN_LOAD';
4261 v_rows_rejected := v_rows_rejected + 1;
4262 ELSIF ((tfa_member_dc(k) = t_member_dc(v_mbr_count) OR
4263 tfa_member_dc(k) = t_member_dc(v_mbr_subcount))) AND
4264 (tfa_attribute_varchar_label(k) NOT IN ('CAL_PERIOD_START_DATE')) AND
4265 tfa_status(k) = 'LOAD' THEN
4266 tfa_status(k) := 'INVALID_MEMBER';
4267 v_rows_rejected := v_rows_rejected + 1;
4268 END IF;
4269 END LOOP;
4270 t_tl_status(v_mbr_count) := 'INVALID_MEMBER';
4271 t_b_status(v_mbr_count) := 'INVALID_REQUIRED_ATTRIBUTE';
4272 t_tl_status(v_mbr_subcount) := 'INVALID_MEMBER';
4273 t_b_status(v_mbr_subcount) := 'INVALID_REQUIRED_ATTRIBUTE';
4274 END IF; -- overlap checking
4275 v_mbr_subcount := v_mbr_subcount + 1;
4276 END LOOP;
4277 END IF; -- CAL_PERIOD and not a dimension group load
4278
4279 IF (t_b_status(v_mbr_count) = 'LOAD') THEN
4280 -- end commented out Array date overlap check
4281 */
4282 ------------------------------------------------------------
4283
4284 -- if the member is still in LOAD status, we copy it to the final array
4285 v_mbr_final_count := v_mbr_final_count + 1;
4286
4287 IF (p_load_type = 'DIMENSION_GROUP') THEN
4288 SELECT fem_dimension_grps_b_s.nextval
4289 INTO tf_dimgrp_dimension_group_id(v_mbr_final_count)
4290 FROM dual;
4291
4292 SELECT fem_time_dimension_group_key_s.nextval
4293 INTO tf_time_dimension_group_key(v_mbr_final_count)
4294 FROM dual;
4295
4296 tf_time_group_type_code(v_mbr_final_count) :=t_time_group_type_code(v_mbr_count);
4297 tf_dimension_group_seq(v_mbr_final_count) :=t_dimension_group_seq(v_mbr_count);
4298
4299 END IF;
4300 FEM_ENGINES_PKG.TECH_MESSAGE
4301 (c_log_level_1,c_block||'.'||c_proc_name||'.In the copy',
4302 null);
4303
4304
4305 tf_rowid(v_mbr_final_count) := t_rowid(v_mbr_count);
4306 tf_tl_rowid(v_mbr_final_count) := t_tl_rowid(v_mbr_count);
4307 tf_member_dc(v_mbr_final_count) := t_member_dc(v_mbr_count);
4308 tf_calendar_id(v_mbr_final_count) := t_calendar_id(v_mbr_count);
4309 tf_cal_period_end_date(v_mbr_final_count) := t_cal_period_end_date(v_mbr_count);
4310 tf_cal_period_number(v_mbr_final_count) := t_cal_period_number(v_mbr_count);
4311 tf_value_set_id(v_mbr_final_count) := t_value_set_id(v_mbr_count);
4312 tf_dimension_group_id(v_mbr_final_count) := t_dimension_group_id(v_mbr_count);
4313 tf_member_name(v_mbr_final_count) := t_member_name(v_mbr_count);
4314 tf_member_desc(v_mbr_final_count) := t_member_desc(v_mbr_count);
4315 tf_language(v_mbr_final_count) := t_language(v_mbr_count);
4316 tf_status(v_mbr_final_count) := t_b_status(v_mbr_count);
4317 tf_dimension_id(v_mbr_final_count) := p_dimension_id;
4318 tf_calendar_dc(v_mbr_final_count) := t_calendar_dc(v_mbr_count);
4319 tf_dimension_group_dc(v_mbr_final_count) := t_dimension_group_dc(v_mbr_count);
4320 tf_cal_period_start_date(v_mbr_final_count) := t_cal_period_start_date(v_mbr_count);
4321 tf_adj_period_flag(v_mbr_final_count) := t_adj_period_flag(v_mbr_count);
4322
4323
4324 /*
4325 Commented out Array Date Overlap checks per bug#4030717
4326 ELSE
4327 -- count the error members
4328 -- we add 2 because every new member always has 1 B_T record
4329 -- and a TL_T record
4330 v_temp_rows_rejected := v_temp_rows_rejected + 2;
4331 FEM_ENGINES_PKG.TECH_MESSAGE
4332 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected',
4333 v_temp_rows_rejected);
4334
4335 END IF; -- Copy good members
4336 ***************/
4337 ELSE
4338 -- count the error members
4339 -- we add 2 because every new member always has 1 B_T record
4340 -- and a TL_T record
4341 v_temp_rows_rejected := v_temp_rows_rejected + 2;
4342 FEM_ENGINES_PKG.TECH_MESSAGE
4343 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected',
4344 v_temp_rows_rejected);
4345
4346 END IF; -- status = LOAD
4347 v_mbr_count := v_mbr_count + 1;
4348 END LOOP;
4349
4350 ------------------------------------------------------------------------
4351 -- INSERTING
4352 ------------------------------------------------------------------------
4353 FEM_ENGINES_PKG.TECH_MESSAGE
4354 (c_log_level_3,c_block||'.'||c_proc_name||'.Member_Insert',
4355 null);
4356
4357 ---------------------------------------------------------
4358 -- set the v_final_mbr_last_row in case a member was removed
4359 ---------------------------------------------------------
4360 v_final_mbr_last_row := tf_member_dc.LAST;
4361 FEM_ENGINES_PKG.TECH_MESSAGE
4362 (c_log_level_3,c_block||'.'||c_proc_name||'.v_attr_final_count',
4363 v_final_mbr_last_row);
4364
4365
4366 IF (v_final_mbr_last_row IS NULL) THEN
4367 v_final_mbr_last_row := 0;
4368 ELSIF v_final_mbr_last_row >0 THEN
4369 v_rows_loaded := v_rows_loaded + v_final_mbr_last_row;
4370 END IF;
4371 ---------------------------------------------------------
4372 -- Call table handler for the remaining good members
4373 ---------------------------------------------------------
4374 IF (p_load_type = 'DIMENSION_GROUP') THEN
4375 FORALL i IN 1..v_final_mbr_last_row
4376 EXECUTE IMMEDIATE x_insert_member_stmt
4377 USING tf_member_dc(i)
4378 ,tf_member_name(i)
4379 ,tf_member_desc(i)
4380 ,gv_apps_user_id
4381 ,gv_apps_user_id
4382 ,tf_time_dimension_group_key(i)
4383 ,tf_dimension_group_seq(i)
4384 ,tf_time_group_type_code(i)
4385 ,tf_dimgrp_dimension_group_id(i)
4386 ,tf_dimension_id(i);
4387
4388 END IF;
4389 FEM_ENGINES_PKG.TECH_MESSAGE
4390 (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.p_value_set_req_flag'
4391 ,p_value_set_required_flag);
4392
4393 FEM_ENGINES_PKG.TECH_MESSAGE
4394 (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.p_hier_dim_flag'
4395 ,p_hier_dimension_flag);
4396
4397
4398 FEM_ENGINES_PKG.TECH_MESSAGE
4399 (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.gv_apps_user_id'
4400 ,gv_apps_user_id);
4401
4402 IF (p_load_type = 'DIMENSION_MEMBER') THEN
4403 IF (p_value_set_required_flag = 'Y'
4404 AND p_hier_dimension_flag = 'Y') THEN
4405
4406 FEM_ENGINES_PKG.TECH_MESSAGE
4407 (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.in the forall'
4408 ,null);
4409
4410 FORALL i IN 1..v_final_mbr_last_row
4411 EXECUTE IMMEDIATE x_insert_member_stmt
4412 USING tf_value_set_id(i)
4413 ,tf_dimension_group_id(i)
4414 ,tf_member_dc(i)
4415 ,tf_member_name(i)
4416 ,tf_member_desc(i)
4417 ,gv_apps_user_id
4418 ,gv_apps_user_id;
4419 ELSIF (p_value_set_required_flag = 'Y'
4420 AND p_hier_dimension_flag = 'N') THEN
4421 FORALL i IN 1..v_final_mbr_last_row
4422 EXECUTE IMMEDIATE x_insert_member_stmt
4423 USING tf_value_set_id(i)
4424 ,tf_member_dc(i)
4425 ,tf_member_name(i)
4426 ,tf_member_desc(i)
4427 ,gv_apps_user_id
4428 ,gv_apps_user_id;
4429 ELSIF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
4430 -- Members for the CAL_PERIOD dimensions are inserted into an
4431 -- Interim table for further processing
4432 FORALL i IN 1 .. v_final_mbr_last_row
4433 EXECUTE IMMEDIATE x_calp_interim_stmt
4434 USING tf_cal_period_end_date(i)
4435 ,tf_cal_period_number(i)
4436 ,tf_calendar_dc(i)
4437 ,tf_dimension_group_dc(i)
4438 ,tf_cal_period_start_date(i)
4439 ,tf_member_dc(i)
4440 ,tf_dimension_group_id(i)
4441 ,tf_calendar_id(i)
4442 ,tf_member_name(i)
4443 ,tf_member_desc(i)
4444 ,tf_adj_period_flag(i)
4445 ,'Y' -- use_interim_table_flag
4446 ,'LOAD';
4447
4448
4449 /**********************************
4450 Commented out per bug#4030717
4451 This statement is replaced with an insert into the
4452 CAL_PERIOD INTERIM tables.
4453 FORALL i IN 1..v_final_mbr_last_row
4454 EXECUTE IMMEDIATE x_insert_member_stmt
4455 USING tf_cal_period_end_date(i)
4456 ,tf_cal_period_number(i)
4457 ,tf_calendar_id(i)
4458 ,tf_dimension_group_id(i)
4459 ,tf_member_name(i)
4460 ,tf_member_desc(i);
4461 ************************/
4462 ELSIF (p_value_set_required_flag = 'N'
4463 AND p_hier_dimension_flag = 'Y') THEN
4464 FORALL i IN 1..v_final_mbr_last_row
4465 EXECUTE IMMEDIATE x_insert_member_stmt
4466 USING tf_dimension_group_id(i)
4467 ,tf_member_dc(i)
4468 ,tf_member_name(i)
4469 ,tf_member_desc(i)
4470 ,gv_apps_user_id
4471 ,gv_apps_user_id;
4472 ELSE
4473 FORALL i IN 1..v_final_mbr_last_row
4474 EXECUTE IMMEDIATE x_insert_member_stmt
4475 USING tf_member_dc(i)
4476 ,tf_member_name(i)
4477 ,tf_member_desc(i)
4478 ,gv_apps_user_id
4479 ,gv_apps_user_id;
4480
4481 END IF; -- checking the p_dimenson_varchar_label
4482 END IF; -- Load_Type = Dimension Member
4483
4484 ----------------------------------------------------------
4485 -- Count the member loaded and error rows
4486 ----------------------------------------------------------
4487 --x_rows_loaded := x_rows_loaded + v_mbr_last_row;
4488 v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
4489 v_temp_rows_rejected := 0;
4490
4491 ---------------------------------------------------------
4492 -- Insert attributes for the good dimension members
4493 ---------------------------------------------------------
4494 IF (p_value_set_required_flag = 'Y') THEN
4495 FORALL i IN 1..v_attr_final_count
4496 EXECUTE IMMEDIATE x_insert_attr_stmt
4497 USING tfa_attribute_id(i)
4498 ,tfa_version_id(i)
4499 ,tfa_dim_attr_numeric_member(i)
4500 ,tfa_attr_assign_vs_id(i)
4501 ,tfa_dim_attr_varchar_member(i)
4502 ,tfa_number_assign_value(i)
4503 ,tfa_varchar_assign_value(i)
4504 ,tfa_date_assign_value(i)
4505 ,gv_apps_user_id
4506 ,gv_apps_user_id
4507 ,tfa_member_dc(i)
4508 ,tfa_value_set_dc(i)
4509 ,tfa_status(i);
4510 ELSIF (p_value_set_required_flag = 'N') AND
4511 (p_dimension_varchar_label NOT IN ('CAL_PERIOD')) THEN
4512 FORALL i IN 1..v_attr_final_count
4513 EXECUTE IMMEDIATE x_insert_attr_stmt
4514 USING tfa_attribute_id(i)
4515 ,tfa_version_id(i)
4516 ,tfa_dim_attr_numeric_member(i)
4517 ,tfa_attr_assign_vs_id(i)
4518 ,tfa_dim_attr_varchar_member(i)
4519 ,tfa_number_assign_value(i)
4520 ,tfa_varchar_assign_value(i)
4521 ,tfa_date_assign_value(i)
4522 ,gv_apps_user_id
4523 ,gv_apps_user_id
4524 ,tfa_member_dc(i)
4525 ,tfa_status(i);
4526 ELSIF p_dimension_varchar_label = 'CAL_PERIOD' THEN
4527 FORALL i IN 1..v_attr_final_count
4528 EXECUTE IMMEDIATE x_calp_attr_interim_stmt
4529 USING tfa_member_dc(i)
4530 ,tfa_attribute_id(i)
4531 ,tfa_version_id(i)
4532 ,tfa_dim_attr_numeric_member(i)
4533 ,tfa_attr_assign_vs_id(i)
4534 ,tfa_dim_attr_varchar_member(i)
4535 ,tfa_number_assign_value(i)
4536 ,tfa_varchar_assign_value(i)
4537 ,tfa_date_assign_value(i)
4538 ,'Y' -- use_interim_table_flag
4539 ,'LOAD';
4540 END IF;
4541 ----------------------------------------------------------
4542 -- Count the attribute rows loaded
4543 ----------------------------------------------------------
4544 --x_rows_loaded := x_rows_loaded + v_attr_final_count;
4545
4546 -----------------------------------------------------------------------------------------
4547
4548 ----------------------------------------------------------
4549 -- Update Status of Member Collection for failed records
4550 ----------------------------------------------------------
4551 FORALL i IN 1..v_mbr_last_row
4552 EXECUTE IMMEDIATE x_update_mbr_status_stmt
4553 USING t_b_status(i)
4554 ,t_rowid(i)
4555 ,t_b_status(i);
4556 FEM_ENGINES_PKG.TECH_MESSAGE
4557 (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.v_mbr_last_row'
4558 ,v_mbr_last_row);
4559
4560 FORALL i IN 1..v_mbr_last_row
4561 EXECUTE IMMEDIATE x_update_tl_status_stmt
4562 USING t_tl_status(i)
4563 ,t_tl_rowid(i)
4564 ,t_tl_status(i);
4565
4566 FEM_ENGINES_PKG.TECH_MESSAGE
4567 (c_log_level_1,c_block||'.'||c_proc_name||'.update tl status.v_mbr_last_row'
4568 ,v_mbr_last_row);
4569
4570
4571 /************************************
4572 Commenting out Array Date Overlap per bug#4030717
4573 --------------------------------------------------------------------
4574 -- Update Status of ATTR Final Collection for failed overlap records
4575 --------------------------------------------------------------------
4576 FORALL i IN 1..v_attr_final_count
4577 EXECUTE IMMEDIATE x_update_attr_status_stmt
4578 USING tfa_status(i)
4579 ,tfa_rowid(i)
4580 ,tfa_status(i);
4581 **********************************************************************/
4582
4583 ----------------------------------------------------------
4584 -- Update Status of dependent ATTR records for bad members
4585 ----------------------------------------------------------
4586 IF (p_load_type NOT IN ('DIMENSION_GROUP') AND p_simple_dimension_flag = 'N') THEN
4587
4588 /* 9/14/2004 RCF Commenting this out because this update is already handled
4589 in the attr_update step for bad_versions and bad_members
4590
4591 IF (p_value_set_required_flag = 'Y') THEN
4592 FORALL i IN 1..v_mbr_last_row
4593 EXECUTE IMMEDIATE x_update_dep_attr_status_stmt
4594 USING t_member_dc(i)
4595 ,t_value_set_dc(i)
4596 ,t_b_status(i);
4597
4598 ELSIF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
4599
4600 FORALL i IN 1..v_mbr_last_row
4601 EXECUTE IMMEDIATE x_update_dep_attr_status_stmt
4602 USING t_calendar_dc(i)
4603 ,t_dimension_group_dc(i)
4604 ,t_cal_period_end_date(i)
4605 ,t_cal_period_number(i)
4606 ,t_b_status(i);
4607 END IF; */
4608
4609 ----------------------------------------------------------------
4610 -- Delete Loaded records and clear Collections for Next Bulk Fetch
4611 ----------------------------------------------------------------
4612 ---------------------------------------------------------
4613 -- Delete Loaded attribute records from the _ATTR_T table
4614 -- exception: CAL_PERIOD loads
4615 -- Interface rows for CAL_PERIOD loads not deleted at this time since we
4616 -- have not yet completed the date overlap checks in the Interim table
4617 ---------------------------------------------------------
4618 IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') THEN
4619 FORALL i IN 1..v_attr_final_count
4620 EXECUTE IMMEDIATE x_delete_attr_stmt
4621 USING tfa_rowid(i)
4622 ,tfa_status(i)
4623 ,'N'; -- use_interim_table_flag
4624 END IF;
4625
4626 --------------------------------------------
4627 -- Delete ATTR Collection for Next Bulk Fetch
4628 --------------------------------------------
4629 tfa_rowid.DELETE;
4630 tfa_attribute_id.DELETE;
4631 tfa_attribute_varchar_label.DELETE;
4632 tfa_member_dc.DELETE;
4633 tfa_value_set_dc.DELETE;
4634 tfa_dim_attr_numeric_member.DELETE;
4635 tfa_dim_attr_varchar_member.DELETE;
4636 tfa_number_assign_value.DELETE;
4637 tfa_varchar_assign_value.DELETE;
4638 tfa_date_assign_value.DELETE;
4639 tfa_version_id.DELETE;
4640 tfa_attr_assign_vs_id.DELETE;
4641 tfa_status.DELETE;
4642 END IF; -- load_type not Dimension Group and Simple dimension_flag='N'
4643
4644 ---------------------------------------------------------
4645 -- Delete Loaded member records from the _B_T and _TL_T tables
4646 -- exception: CAL_PERIOD Member loads
4647 -- Interface rows for CAL_PERIOD loads not deleted at this time since we
4648 -- have not yet completed the date overlap checks in the Interim table
4649 ---------------------------------------------------------
4650 IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') AND
4651 p_load_type NOT IN ('DIMENSION_GROUP') THEN
4652 FORALL i IN 1..v_mbr_final_count
4653 EXECUTE IMMEDIATE x_delete_mbr_stmt
4654 USING tf_rowid(i)
4655 ,tf_status(i)
4656 ,'N'; -- use_interim_table_flag
4657
4658 FORALL i IN 1..v_mbr_final_count
4659 EXECUTE IMMEDIATE x_delete_tl_stmt
4660 USING tf_tl_rowid(i)
4661 ,tf_status(i)
4662 ,'N'; -- use_interim_table_flag
4663 END IF;
4664
4665
4666 tf_rowid.DELETE;
4667 tf_tl_rowid.DELETE;
4668 tf_member_dc.DELETE;
4669 tf_calendar_id.DELETE;
4670 tf_cal_period_end_date.DELETE;
4671 tf_cal_period_number.DELETE;
4672 tf_value_set_id.DELETE;
4673 tf_dimension_group_id.DELETE;
4674 tf_member_name.DELETE;
4675 tf_member_desc.DELETE;
4676 tf_language.DELETE;
4677 tf_status.DELETE;
4678 tf_dimension_group_seq.DELETE;
4679 tf_time_group_type_code.DELETE;
4680 tf_time_dimension_group_key.DELETE;
4681 tf_calendar_dc.DELETE;
4682 tf_dimension_group_dc.DELETE;
4683 tf_cal_period_start_date.DELETE;
4684 tf_adj_period_flag.DELETE;
4685
4686 t_rowid.DELETE;
4687 t_tl_rowid.DELETE;
4688 t_member_dc.DELETE;
4689 t_calendar_dc.DELETE;
4690 t_calendar_id.DELETE;
4691 t_cal_period_end_date.DELETE;
4692 t_cal_period_start_date.DELETE;
4693 t_cal_period_number.DELETE;
4694 t_value_set_dc.DELETE;
4695 t_value_set_id.DELETE;
4696 t_dimension_group_dc.DELETE;
4697 t_dimension_group_id.DELETE;
4698 t_b_status.DELETE;
4699 t_member_name.DELETE;
4700 t_member_desc.DELETE;
4701 t_language.DELETE;
4702 t_tl_status.DELETE;
4703 t_dimension_group_seq.DELETE;
4704 t_time_group_type_code.DELETE;
4705 -- t_periods_in_year.DELETE;
4706 t_adj_period_flag.DELETE;
4707
4708 v_attr_final_count := 0;
4709 v_attr_count := 0;
4710 v_mbr_last_row := 0;
4711 v_mbr_count := 0;
4712 v_mbr_final_count := 0;
4713
4714
4715 COMMIT;
4716 END LOOP; -- New Members
4717
4718 IF p_load_type <> ('DIMENSION_GROUP') THEN
4719 FEM_Multi_Proc_Pkg.Post_Data_Slice(
4720 p_req_id => p_master_request_id,
4721 p_slc_id => v_slc_id,
4722 p_status => v_mp_status,
4723 p_message => v_mp_message,
4724 p_rows_processed => 0,
4725 p_rows_loaded => v_rows_loaded,
4726 p_rows_rejected => v_rows_rejected);
4727 END IF;
4728
4729 END LOOP; -- get data slice
4730
4731 IF p_load_type = ('DIMENSION_GROUP') THEN
4732 gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
4733 END IF;
4734
4735 IF cv_get_rows%ISOPEN THEN CLOSE cv_get_rows;
4736 END IF;
4737 --x_rows_rejected := v_rows_rejected;
4738 --x_rows_loaded := v_rows_loaded;
4739
4740 FEM_ENGINES_PKG.TECH_MESSAGE
4741 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
4742
4743 EXCEPTION
4744 WHEN OTHERS THEN
4745 IF cv_get_rows%ISOPEN THEN
4746 CLOSE cv_get_rows;
4747 END IF;
4748 IF cv_get_attr_rows%ISOPEN THEN
4749 CLOSE cv_get_attr_rows;
4750 END IF;
4751
4752 --x_status:= 2;
4753 --x_message := 'COMPLETE:ERROR';
4754
4755 gv_prg_msg := sqlerrm;
4756 gv_callstack := dbms_utility.format_call_stack;
4757
4758 FEM_ENGINES_PKG.TECH_MESSAGE
4759 (p_severity => c_log_level_6
4760 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
4761 ,p_msg_text => gv_prg_msg);
4762
4763 FEM_ENGINES_PKG.TECH_MESSAGE
4764 (p_severity => c_log_level_6
4765 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
4766 ,p_msg_text => gv_callstack);
4767
4768 FEM_ENGINES_PKG.USER_MESSAGE
4769 (p_app_name => c_fem
4770 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
4771 ,P_TOKEN1 => 'ERR_MSG'
4772 ,P_VALUE1 => gv_prg_msg);
4773
4774 -- FEM_ENGINES_PKG.USER_MESSAGE
4775 -- (p_app_name => c_fem
4776 -- ,p_msg_text => gv_prg_msg);
4777
4778 RAISE e_main_terminate;
4779
4780 END New_Members;
4781
4782 /*===========================================================================+
4783 | PROCEDURE
4784 | TL_Update
4785 |
4786 | DESCRIPTION
4787 | This step updates the translatable names and descriptions for existing
4788 | Dimension members.
4789 |
4790 | SCOPE - PRIVATE
4791 |
4792 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4793 |
4794 | ARGUMENTS : IN:
4795 |
4796 |
4797 | OUT:
4798 |
4799 | IN/ OUT:
4800 |
4801 | RETURNS : NONE
4802 |
4803 | NOTES
4804 |
4805 |
4806 | 1. Other language rows in FEM are updated for the member if they exist.
4807 | 2. Delete any TL rows that are successfully updated.
4808 |
4809 | Update Base (Dimension Group and Simple Dim = 'N' only)
4810 | Note: This module only performs error checks. It does not perform any updates.
4811 | Therefore, the Base status will remain unchanged, unless
4812 | there is something invalid about one of the values in a base columns, in which
4813 | case the Base Update module identifies the error and updates the status
4814 | 1. Base columns for the member or Group are updated for any base records in
4815 | the _B_T table. This update only occurs if the member exists in FEM.
4816 | 2. Delete any _B_T records that are successful.
4817 |
4818 | MODIFICATION HISTORY
4819 | Rob Flippo 8-MAR-04 Created
4820 | Rob Flippo 10-MAR-06 Bug#5068022 add error checking to identify
4821 | translatable names in the TL_T table that
4822 | already exist in the target TL table for
4823 | other members
4824 | Rob Flippo 04-APR-06 Bug#5117594 Remove unique name check for Customer
4825 | dimension
4826 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
4827 | Rob Flippo 15-MAR-07 Bug#5905501 Modify execute immediate on tl_update
4828 | to pass in the source_lang = language
4829 +===========================================================================*/
4830
4831 PROCEDURE TL_Update (p_eng_sql IN VARCHAR2
4832 ,p_data_slc IN VARCHAR2
4833 ,p_proc_num IN VARCHAR2
4834 ,p_partition_code IN NUMBER
4835 ,p_fetch_limit IN NUMBER
4836 ,p_load_type IN VARCHAR2
4837 ,p_dimension_varchar_label IN VARCHAR2
4838 ,p_dimension_id IN VARCHAR2
4839 ,p_target_b_table IN VARCHAR2
4840 ,p_target_tl_table IN VARCHAR2
4841 ,p_source_b_table IN VARCHAR2
4842 ,p_source_tl_table IN VARCHAR2
4843 ,p_member_col IN VARCHAR2
4844 ,p_member_dc_col IN VARCHAR2
4845 ,p_member_name_col IN VARCHAR2
4846 ,p_member_t_dc_col IN VARCHAR2
4847 ,p_member_t_name_col IN VARCHAR2
4848 ,p_member_description_col IN VARCHAR2
4849 ,p_value_set_required_flag IN VARCHAR2
4850 ,p_simple_dimension_flag IN VARCHAR2
4851 ,p_shared_dimension_flag IN VARCHAR2
4852 ,p_hier_dimension_flag IN VARCHAR2
4853 ,p_exec_mode_clause IN VARCHAR2
4854 ,p_master_request_id IN NUMBER)
4855
4856 IS
4857 -- Constants
4858 c_proc_name VARCHAR2(30) := 'TL_Update';
4859
4860 -- Dynamic SQL statement variables
4861 x_bad_tl_select_stmt VARCHAR2(4000);
4862 x_select_stmt VARCHAR2(4000);
4863 x_update_stmt VARCHAR2(4000);
4864 x_update_tl_stmt VARCHAR2(4000);
4865 x_update_tl_status_stmt VARCHAR2(4000);
4866 x_delete_tl_stmt VARCHAR2(4000);
4867 x_bad_lang_upd_stmt VARCHAR2(4000);
4868 x_ro_mbr_upd_stmt VARCHAR2(4000);
4869 x_dupname_count_stmt VARCHAR2(4000);
4870
4871 -- Count variables for manipulating the member and attribute arrays
4872 v_mbr_last_row NUMBER;
4873 v_temp_rows_rejected NUMBER :=0;
4874 v_rows_rejected NUMBER :=0;
4875 v_rows_fetched NUMBER :=0;
4876 v_bulk_rows_rejected NUMBER; -- rejected row count for any status bulk
4877 -- update statements
4878
4879
4880 -- Other variables
4881 v_fetch_limit NUMBER;
4882 v_dupname_count NUMBER :=0;
4883
4884 -- MP variables
4885 v_loop_counter NUMBER;
4886 v_slc_id NUMBER;
4887 v_slc_val VARCHAR2(100);
4888 v_slc_val2 VARCHAR2(100);
4889 v_slc_val3 VARCHAR2(100);
4890 v_slc_val4 VARCHAR2(100);
4891 v_mp_status VARCHAR2(30);
4892 v_mp_message VARCHAR2(4000);
4893 v_num_vals NUMBER;
4894 v_part_name VARCHAR2(4000);
4895
4896 -------------------------------------
4897 -- Declare bulk collection columns --
4898 -------------------------------------
4899
4900 -- Common abbreviations:
4901 -- t_ = array of raw interface table member rows
4902 -- tf = "final" array of interface table member rows that have been validated for insert
4903 -- ta = array of raw interface table attribute rows
4904 -- tfa = "final" array of interface table attribute rows that have been validated for insert
4905
4906 t_rowid rowid_type;
4907 t_tl_rowid rowid_type;
4908 t_value_set_id number_type;
4909 t_dimension_group_id number_type;
4910 t_calendar_id number_type;
4911 t_cal_period_number number_type;
4912 t_cal_period_end_date date_type;
4913 t_b_status varchar2_std_type;
4914 t_tl_status varchar2_std_type;
4915 t_member_dc varchar2_150_type;
4916 t_calendar_dc varchar2_150_type;
4917 t_value_set_dc varchar2_150_type;
4918 t_dimension_group_dc varchar2_150_type;
4919 t_member_name varchar2_150_type;
4920 t_member_desc desc_type;
4921 t_language lang_type;
4922 t_dimension_group_seq number_type;
4923 t_time_group_type_code varchar2_std_type;
4924
4925 ---------------------
4926 -- Declare cursors --
4927 ---------------------
4928 cv_get_rows cv_curs;
4929
4930 BEGIN
4931 FEM_ENGINES_PKG.TECH_MESSAGE
4932 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
4933
4934 --x_status := 0; -- initialize status of the TL_Update procedure
4935 --x_message := 'COMPLETE:NORMAL';
4936
4937 -- Build Update for the _TL_T table where the LANGUAGE is not installed
4938 build_bad_lang_upd_stmt (p_load_type
4939 ,p_dimension_varchar_label
4940 ,p_dimension_id
4941 ,p_source_tl_table
4942 ,p_exec_mode_clause
4943 ,p_shared_dimension_flag
4944 ,p_value_set_required_flag
4945 ,x_bad_lang_upd_stmt);
4946 IF p_data_slc IS NOT NULL THEN
4947 x_bad_lang_upd_stmt := REPLACE(x_bad_lang_upd_stmt,'{{data_slice}}',p_data_slc);
4948 ELSE
4949 x_bad_lang_upd_stmt := REPLACE(x_bad_lang_upd_stmt,'{{data_slice}}','1=1');
4950 END IF;
4951
4952 -- Build Update for the _TL_T table where
4953 -- the member is a read_only_member
4954 build_tl_ro_mbr_upd_stmt (p_load_type
4955 ,p_dimension_varchar_label
4956 ,p_dimension_id
4957 ,p_source_tl_table
4958 ,p_target_b_table
4959 ,p_member_dc_col
4960 ,p_member_t_dc_col
4961 ,p_exec_mode_clause
4962 ,p_shared_dimension_flag
4963 ,p_value_set_required_flag
4964 ,x_ro_mbr_upd_stmt);
4965
4966 IF p_data_slc IS NOT NULL THEN
4967 x_ro_mbr_upd_stmt := REPLACE(x_ro_mbr_upd_stmt,'{{data_slice}}',p_data_slc);
4968 ELSE
4969 x_ro_mbr_upd_stmt := REPLACE(x_ro_mbr_upd_stmt,'{{data_slice}}','1=1');
4970 END IF;
4971
4972 FEM_ENGINES_PKG.TECH_MESSAGE
4973 (c_log_level_1,c_block||'.'||c_proc_name||'.ro_mbr_upd stmt'
4974 ,x_ro_mbr_upd_stmt);
4975
4976
4977 ------------------------------------------------------------------------------
4978 -- Build the select stmt for exising Dimension members using the information
4979 -- returned from get_dimension_info
4980 ------------------------------------------------------------------------------
4981 build_mbr_select_stmt (p_load_type
4982 ,p_dimension_varchar_label
4983 ,p_dimension_id
4984 ,p_target_b_table
4985 ,p_target_tl_table
4986 ,p_source_b_table
4987 ,p_source_tl_table
4988 ,p_member_dc_col
4989 ,p_member_t_dc_col
4990 ,p_member_t_name_col
4991 ,p_member_description_col
4992 ,p_value_set_required_flag
4993 ,p_shared_dimension_flag
4994 ,p_hier_dimension_flag
4995 ,'Y'
4996 ,p_exec_mode_clause
4997 ,x_select_stmt);
4998
4999 build_bad_tl_select_stmt (p_load_type
5000 ,p_dimension_varchar_label
5001 ,p_dimension_id
5002 ,p_target_b_table
5003 ,p_target_tl_table
5004 ,p_source_b_table
5005 ,p_source_tl_table
5006 ,p_member_dc_col
5007 ,p_member_t_dc_col
5008 ,p_value_set_required_flag
5009 ,p_shared_dimension_flag
5010 ,p_hier_dimension_flag
5011 ,p_exec_mode_clause
5012 ,x_bad_tl_select_stmt);
5013
5014 IF p_data_slc IS NOT NULL THEN
5015 x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}',p_data_slc);
5016 x_bad_tl_select_stmt := REPLACE(x_bad_tl_select_stmt,'{{data_slice}}',p_data_slc);
5017 ELSE
5018 x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}','1=1');
5019 x_bad_tl_select_stmt := REPLACE(x_bad_tl_select_stmt,'{{data_slice}}','1=1');
5020 END IF;
5021
5022 -- set the local fetch limit variable based on the parameter
5023 -- this will be null for Dimension Group loads
5024 v_fetch_limit := p_fetch_limit;
5025 IF v_fetch_limit IS NULL THEN
5026 v_fetch_limit := 10000;
5027 END IF;
5028
5029
5030 FEM_ENGINES_PKG.TECH_MESSAGE
5031 (c_log_level_1,c_block||'.'||c_proc_name||'.member select stmt'
5032 ,x_select_stmt);
5033
5034 FEM_ENGINES_PKG.TECH_MESSAGE
5035 (c_log_level_1,c_block||'.'||c_proc_name||'.bad_tl_select_stmt'
5036 ,x_bad_tl_select_stmt);
5037
5038
5039 build_tl_update_stmt (p_dimension_varchar_label
5040 ,p_dimension_id
5041 ,p_load_type
5042 ,p_target_b_table
5043 ,p_target_tl_table
5044 ,p_member_col
5045 ,p_member_dc_col
5046 ,p_member_name_col
5047 ,p_member_description_col
5048 ,p_value_set_required_flag
5049 ,x_update_tl_stmt);
5050
5051 FEM_ENGINES_PKG.TECH_MESSAGE
5052 (c_log_level_1,c_block||'.'||c_proc_name||'.tl table update stmt'
5053 ,x_update_tl_stmt);
5054
5055 build_delete_stmt (p_source_tl_table
5056 ,x_delete_tl_stmt);
5057
5058
5059 FEM_ENGINES_PKG.TECH_MESSAGE
5060 (c_log_level_1,c_block||'.'||c_proc_name||'.delete stmt'
5061 ,x_delete_tl_stmt);
5062
5063 build_status_update_stmt (p_source_tl_table
5064 ,x_update_tl_status_stmt);
5065
5066 build_tl_dupname_stmt (p_dimension_varchar_label
5067 ,p_dimension_id
5068 ,p_load_type
5069 ,p_target_b_table
5070 ,p_target_tl_table
5071 ,p_member_col
5072 ,p_member_dc_col
5073 ,p_member_name_col
5074 ,p_value_set_required_flag
5075 ,'TL_UPDATE'
5076 ,x_dupname_count_stmt);
5077
5078 FEM_ENGINES_PKG.TECH_MESSAGE
5079 (c_log_level_1,c_block||'.'||c_proc_name||'.dupname select stmt'
5080 ,x_dupname_count_stmt);
5081
5082
5083
5084
5085 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
5086 -- the data slice loop
5087
5088 -- Begin the Data Slice Loop
5089 LOOP
5090
5091 IF p_load_type <> ('DIMENSION_GROUP') THEN
5092
5093 FEM_Multi_Proc_Pkg.Get_Data_Slice(
5094 x_slc_id => v_slc_id,
5095 x_slc_val1 => v_slc_val,
5096 x_slc_val2 => v_slc_val2,
5097 x_slc_val3 => v_slc_val3,
5098 x_slc_val4 => v_slc_val4,
5099 x_num_vals => v_num_vals,
5100 x_part_name => v_part_name,
5101 p_req_id => p_master_request_id,
5102 p_proc_num => p_proc_num);
5103
5104 FEM_ENGINES_PKG.TECH_MESSAGE
5105 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
5106 ,v_slc_val);
5107 FEM_ENGINES_PKG.TECH_MESSAGE
5108 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
5109 ,v_slc_val2);
5110 FEM_ENGINES_PKG.TECH_MESSAGE
5111 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
5112 ,v_slc_val3);
5113 FEM_ENGINES_PKG.TECH_MESSAGE
5114 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
5115 ,v_slc_val4);
5116
5117
5118 EXIT WHEN (v_slc_id IS NULL);
5119 ELSE
5120 EXIT WHEN (v_loop_counter > 0);
5121 v_loop_counter := v_loop_counter + 1;
5122 END IF;
5123
5124
5125 --------------------------------------------------------------------------
5126 -- Execute the Updates
5127 IF p_load_type <> ('DIMENSION_GROUP') THEN
5128 EXECUTE IMMEDIATE x_bad_lang_upd_stmt USING v_slc_val, v_slc_val2;
5129 ELSE
5130 EXECUTE IMMEDIATE x_bad_lang_upd_stmt;
5131 END IF;
5132 v_bulk_rows_rejected := SQL%ROWCOUNT;
5133
5134 COMMIT;
5135 --------------------------------------------------------------------------
5136
5137 IF p_load_type <> ('DIMENSION_GROUP') THEN
5138 EXECUTE IMMEDIATE x_ro_mbr_upd_stmt USING v_slc_val, v_slc_val2;
5139 ELSE
5140 EXECUTE IMMEDIATE x_ro_mbr_upd_stmt;
5141 END IF;
5142 v_bulk_rows_rejected := v_bulk_rows_rejected + SQL%ROWCOUNT;
5143
5144 COMMIT;
5145 --------------------------------------------------------------------------
5146
5147
5148 ------------------------------------------------------------------------------
5149 -- Loop through the members that already exist
5150 -- to perform updates on name/description columns
5151 ------------------------------------------------------------------------------
5152 IF p_load_type <> ('DIMENSION_GROUP') THEN
5153 OPEN cv_get_rows FOR x_select_stmt USING v_slc_val, v_slc_val2;
5154 ELSE
5155 OPEN cv_get_rows FOR x_select_stmt;
5156 END IF;
5157
5158 LOOP
5159 -------------------------------------------
5160 -- Bulk Collect Rows from the source _T tables
5161 -- Using Dynamic SELECT Statement
5162 -------------------------------------------
5163 FETCH cv_get_rows BULK COLLECT INTO
5164 t_rowid
5165 ,t_tl_rowid
5166 ,t_member_dc
5167 ,t_calendar_dc
5168 ,t_calendar_id
5169 ,t_cal_period_end_date
5170 ,t_cal_period_number
5171 ,t_value_set_dc
5172 ,t_value_set_id
5173 ,t_dimension_group_dc
5174 ,t_dimension_group_id
5175 ,t_b_status
5176 ,t_member_name
5177 ,t_member_desc
5178 ,t_language
5179 ,t_tl_status
5180 ,t_dimension_group_seq
5181 ,t_time_group_type_code
5182 LIMIT v_fetch_limit;
5183
5184 ----------------------------------------------
5185 -- EXIT Fetch LOOP If No Rows are Retrieved --
5186 ----------------------------------------------
5187 v_mbr_last_row := t_member_dc.LAST;
5188
5189 IF (v_mbr_last_row IS NULL)
5190 THEN
5191 EXIT;
5192 END IF;
5193
5194 FEM_ENGINES_PKG.TECH_MESSAGE
5195 (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
5196
5197 --v_rows_fetched := v_rows_fetched + v_mbr_last_row;
5198
5199 FOR i IN 1..v_mbr_last_row
5200 LOOP
5201
5202 ----------------------------------------------
5203 -- Begin Duplicate Name Validations (only if dim <> 'CUSTOMER')
5204 -- Check to see if the translatabe name that will be load
5205 -- already exists for ANY language in the target TL table
5206 -- Set STATUS = 'DUPLICATE_NAME' if the name already exists
5207 ----------------------------------------------
5208 IF p_dimension_varchar_label <> 'CUSTOMER' THEN
5209 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
5210 p_load_type <> 'DIMENSION_GROUP' THEN
5211
5212 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5213 USING t_member_name(i)
5214 ,t_member_dc(i)
5215 ,t_language(i)
5216 ,t_dimension_group_id(i)
5217 ,t_calendar_id(i);
5218
5219 ELSE
5220 IF p_value_set_required_flag = 'Y' THEN
5221 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5222 USING t_member_name(i)
5223 ,t_member_dc(i)
5224 ,t_language(i)
5225 ,t_value_set_dc(i);
5226 ELSE
5227 EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5228 USING t_member_name(i)
5229 ,t_member_dc(i)
5230 ,t_language(i);
5231 END IF;
5232 END IF;
5233 IF v_dupname_count > 0 THEN
5234 t_tl_status(i) := 'DUPLICATE_NAME';
5235 ----------------------------------------------------------
5236 -- Count the error rows
5237 ----------------------------------------------------------
5238 v_rows_rejected := v_rows_rejected + 1;
5239
5240 END IF;
5241 END IF; -- p_dim_label <> 'CUSTOMER'
5242
5243 END LOOP;
5244
5245 --------------------------------------------------------------------------------------
5246 -- Perform the update on the TL table
5247 --------------------------------------------------------------------------------------
5248 IF (p_value_set_required_flag = 'Y') THEN
5249 FORALL i IN 1..v_mbr_last_row
5250 EXECUTE IMMEDIATE x_update_tl_stmt
5251 USING t_member_name(i)
5252 ,t_member_desc(i)
5253 ,t_language(i)
5254 ,gv_apps_user_id
5255 ,gv_login_id
5256 ,t_member_dc(i)
5257 ,t_value_set_dc(i)
5258 ,t_value_set_dc(i)
5259 ,t_language(i)
5260 ,t_tl_status(i);
5261
5262 ELSE
5263 FORALL i IN 1..v_mbr_last_row
5264 EXECUTE IMMEDIATE x_update_tl_stmt
5265 USING t_member_name(i)
5266 ,t_member_desc(i)
5267 ,t_language(i)
5268 ,gv_apps_user_id
5269 ,gv_login_id
5270 ,t_member_dc(i)
5271 ,t_language(i)
5272 ,t_tl_status(i);
5273 END IF;
5274
5275 ---------------------------------------------------------
5276 -- Delete Loaded member records from the _TL_T table
5277 ---------------------------------------------------------
5278 FEM_ENGINES_PKG.TECH_MESSAGE
5279 (c_log_level_1,c_block||'.'||c_proc_name||'.Deleting TL_T rows','start');
5280 FORALL i IN 1..v_mbr_last_row
5281 EXECUTE IMMEDIATE x_delete_tl_stmt
5282 USING t_tl_rowid(i)
5283 ,t_tl_status(i)
5284 ,'N';
5285
5286 ----------------------------------------------------------
5287 -- Update Status of Error TL records
5288 ----------------------------------------------------------
5289 FORALL i IN 1..v_mbr_last_row
5290 EXECUTE IMMEDIATE x_update_tl_status_stmt
5291 USING t_tl_status(i)
5292 ,t_tl_rowid(i)
5293 ,t_tl_status(i);
5294
5295 COMMIT;
5296
5297
5298 --------------------------------------------
5299 -- Delete Collections for Next Bulk Fetch --
5300 --------------------------------------------
5301 t_rowid.DELETE;
5302 t_tl_rowid.DELETE;
5303 t_member_dc.DELETE;
5304 t_calendar_dc.DELETE;
5305 t_calendar_id.DELETE;
5306 t_cal_period_end_date.DELETE;
5307 t_cal_period_number.DELETE;
5308 t_value_set_dc.DELETE;
5309 t_value_set_id.DELETE;
5310 t_dimension_group_dc.DELETE;
5311 t_dimension_group_id.DELETE;
5312 t_b_status.DELETE;
5313 t_member_name.DELETE;
5314 t_member_desc.DELETE;
5315 t_language.DELETE;
5316 t_tl_status.DELETE;
5317 t_dimension_group_seq.DELETE;
5318 t_time_group_type_code.DELETE;
5319
5320 COMMIT;
5321 END LOOP; -- Existing Members
5322 IF cv_get_rows%ISOPEN THEN
5323 CLOSE cv_get_rows;
5324 END IF;
5325
5326 ---------------------------------------------------------------
5327 -- Identify records in TL_T table that do not exist in FEM
5328 -- and also do not have a "new" base record in the _B_T table
5329 ---------------------------------------------------------------
5330 IF p_load_type <> ('DIMENSION_GROUP') THEN
5331 OPEN cv_get_rows FOR x_bad_tl_select_stmt USING v_slc_val, v_slc_val2;
5332 ELSE
5333 OPEN cv_get_rows FOR x_bad_tl_select_stmt;
5334 END IF;
5335
5336 LOOP
5337 -------------------------------------------
5338 -- Bulk Collect Rows from the source TL_T table
5339 -- Using Dynamic SELECT Statement
5340 -------------------------------------------
5341 FETCH cv_get_rows BULK COLLECT INTO
5342 t_rowid
5343 ,t_member_dc
5344 ,t_calendar_dc
5345 ,t_calendar_id
5346 ,t_cal_period_end_date
5347 ,t_cal_period_number
5348 ,t_value_set_dc
5349 ,t_b_status
5350 LIMIT v_fetch_limit;
5351
5352 ----------------------------------------------
5353 -- EXIT Fetch LOOP If No Rows are Retrieved --
5354 ----------------------------------------------
5355 v_mbr_last_row := t_member_dc.LAST;
5356
5357 IF (v_mbr_last_row IS NULL)
5358 THEN
5359 EXIT;
5360 END IF;
5361
5362 FEM_ENGINES_PKG.TECH_MESSAGE
5363 (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
5364
5365 ----------------------------------------------------------
5366 -- Update Status of Bad TL Collection
5367 ----------------------------------------------------------
5368 FORALL i IN 1..v_mbr_last_row
5369 EXECUTE IMMEDIATE x_update_tl_status_stmt
5370 USING t_b_status(i)
5371 ,t_rowid(i)
5372 ,t_b_status(i);
5373
5374 COMMIT;
5375
5376 ----------------------------------------------------------
5377 -- Count the error rows
5378 ----------------------------------------------------------
5379 v_rows_rejected := v_rows_rejected + v_mbr_last_row;
5380
5381 --------------------------------------------
5382 -- Delete Collections for Next Bulk Fetch --
5383 --------------------------------------------
5384 t_rowid.DELETE;
5385 t_tl_rowid.DELETE;
5386 t_member_dc.DELETE;
5387 t_calendar_dc.DELETE;
5388 t_calendar_id.DELETE;
5389 t_cal_period_end_date.DELETE;
5390 t_cal_period_number.DELETE;
5391 t_value_set_dc.DELETE;
5392 t_value_set_id.DELETE;
5393 t_dimension_group_dc.DELETE;
5394 t_dimension_group_id.DELETE;
5395 t_b_status.DELETE;
5396 t_member_name.DELETE;
5397 t_member_desc.DELETE;
5398 t_language.DELETE;
5399 t_tl_status.DELETE;
5400 t_dimension_group_seq.DELETE;
5401 t_time_group_type_code.DELETE;
5402
5403 COMMIT;
5404 END LOOP; -- Bad TL members
5405
5406 IF p_load_type <> ('DIMENSION_GROUP') THEN
5407 FEM_Multi_Proc_Pkg.Post_Data_Slice(
5408 p_req_id => p_master_request_id,
5409 p_slc_id => v_slc_id,
5410 p_status => v_mp_status,
5411 p_message => v_mp_message,
5412 p_rows_processed => 0,
5413 p_rows_loaded => 0,
5414 p_rows_rejected => v_rows_rejected+v_bulk_rows_rejected);
5415 END IF;
5416
5417 END LOOP; -- get_data_slice
5418
5419 IF p_load_type = ('DIMENSION_GROUP') THEN
5420 gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected + v_bulk_rows_rejected;
5421 END IF;
5422
5423 IF cv_get_rows%ISOPEN THEN
5424 CLOSE cv_get_rows;
5425 END IF;
5426
5427 --x_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
5428
5429 FEM_ENGINES_PKG.TECH_MESSAGE
5430 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5431
5432 EXCEPTION
5433 WHEN OTHERS THEN
5434 IF cv_get_rows%ISOPEN THEN
5435 CLOSE cv_get_rows;
5436 END IF;
5437
5438 --x_status:= 2;
5439 --x_message := 'COMPLETE:ERROR';
5440
5441 gv_prg_msg := sqlerrm;
5442 gv_callstack := dbms_utility.format_call_stack;
5443
5444 FEM_ENGINES_PKG.TECH_MESSAGE
5445 (p_severity => c_log_level_6
5446 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5447 ,p_msg_text => gv_prg_msg);
5448
5449 FEM_ENGINES_PKG.TECH_MESSAGE
5450 (p_severity => c_log_level_6
5451 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5452 ,p_msg_text => gv_callstack);
5453
5454 FEM_ENGINES_PKG.USER_MESSAGE
5455 (p_app_name => c_fem
5456 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
5457 ,P_TOKEN1 => 'ERR_MSG'
5458 ,P_VALUE1 => gv_prg_msg);
5459
5460 -- FEM_ENGINES_PKG.USER_MESSAGE
5461 -- (p_app_name => c_fem
5462 -- ,p_msg_text => gv_prg_msg);
5463
5464 RAISE e_main_terminate;
5465 END TL_Update;
5466
5467 /*===========================================================================+
5468 | PROCEDURE
5469 | Base_Update
5470 |
5471 | DESCRIPTION
5472 | These are all of the records in the _B_T table that are existing
5473 | dimension members in FEM. For these we will update any
5474 | "Base" table columns.
5475 | Note: Inserts of new attribute assignments for existing members, as well
5476 | as updates of existing attribute assignments, are handled in the Update_Attr module
5477 |
5478 | SCOPE - PRIVATE
5479 |
5480 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
5481 |
5482 | ARGUMENTS : IN:
5483 |
5484 |
5485 | OUT:
5486 |
5487 | IN/ OUT:
5488 |
5489 | RETURNS : NONE
5490 |
5491 | NOTES
5492 | This procedure does not perform any updates of the FEM tables at the moment
5493 | since the rules for updating the Dimension Group are unclear
5494 |
5495 | MODIFICATION HISTORY
5496 | Rob Flippo 8-MAR-04 Created
5497 | Rob Flippo 28-SEP-04 Bug#3906218 Ability undelete members
5498 | Rob Flippo 03-MAR-05 Modify so that for dim grp load we don't get a
5499 | unique dimgrp seq error unless the conflict is
5500 | caused by a dimension group other than the one
5501 | that is being loaded.
5502 | Rob Flippo 16-MAR-05 Bug#4244082 Modify to update dimgrp as long as
5503 | member does not participate in a sequence enforced
5504 | hier
5505 | -- note - if the dimgrp doesn't change, the loader
5506 | won't mark the _b_t record as an error (for seq
5507 | enf hier situation)
5508 | Rob Flippo 22-MAR-05 Add p_dimension_id as parm for build_remain_mbr_select
5509 +===========================================================================*/
5510 PROCEDURE Base_Update (p_eng_sql IN VARCHAR2
5511 ,p_data_slc IN VARCHAR2
5512 ,p_proc_num IN VARCHAR2
5513 ,p_partition_code IN NUMBER
5514 ,p_fetch_limit IN NUMBER
5515 ,p_load_type IN VARCHAR2
5516 ,p_dimension_varchar_label IN VARCHAR2
5517 ,p_simple_dimension_flag IN VARCHAR2
5518 ,p_shared_dimension_flag IN VARCHAR2
5519 ,p_dimension_id IN NUMBER
5520 ,p_value_set_required_flag IN VARCHAR2
5521 ,p_hier_table_name IN VARCHAR2
5522 ,p_hier_dimension_flag IN VARCHAR2
5523 ,p_source_b_table IN VARCHAR2
5524 ,p_target_b_table IN VARCHAR2
5525 ,p_member_dc_col IN VARCHAR2
5526 ,p_member_t_dc_col IN VARCHAR2
5527 ,p_member_col IN VARCHAR2
5528 ,p_exec_mode_clause IN VARCHAR2
5529 ,p_master_request_id IN NUMBER)
5530 IS
5531 -- Consants
5532 c_proc_name VARCHAR2(30) := 'Base_Update';
5533
5534 -- Dynamic SQL statement variables
5535 x_remain_mbr_select_stmt VARCHAR2(4000);
5536 x_update_stmt VARCHAR2(4000);
5537 x_update_mbr_status_stmt VARCHAR2(4000);
5538 x_update_dimgrp_stmt VARCHAR2(4000);
5539 x_delete_mbr_stmt VARCHAR2(4000);
5540 x_enabled_flag_update_stmt VARCHAR2(4000);
5541 x_seq_enf_hiercount_stmt VARCHAR2(4000);
5542
5543 -- Count variables
5544 v_mbr_last_row NUMBER;
5545 v_seq_conflict_count NUMBER;
5546 v_count NUMBER;
5547 v_temp_rows_rejected NUMBER :=0;
5548 v_rows_rejected NUMBER :=0;
5549 v_rows_loaded NUMBER :=0;
5550 v_seq_enf_hiercount NUMBER;
5551 v_calp_dimgrp_count NUMBER; -- used to identify is the dimgrp
5552 -- for an existing cal period member
5553 -- matches the dimgrp in the target_b
5554 -- for that member
5555
5556 -- Other variables
5557 v_fetch_limit NUMBER;
5558
5559 -- MP variables
5560 v_loop_counter NUMBER;
5561 v_slc_id NUMBER;
5562 v_slc_val VARCHAR2(100);
5563 v_slc_val2 VARCHAR2(100);
5564 v_slc_val3 VARCHAR2(100);
5565 v_slc_val4 VARCHAR2(100);
5566 v_mp_status VARCHAR2(30);
5567 v_mp_message VARCHAR2(4000);
5568 v_num_vals NUMBER;
5569 v_part_name VARCHAR2(4000);
5570
5571 -------------------------------------
5572 -- Declare bulk collection columns --
5573 -------------------------------------
5574
5575 -- Common abbreviations:
5576 -- t_ = array of raw interface table member rows
5577 -- tf = "final" array of interface table member rows that have been validated for insert
5578 -- ta = array of raw interface table attribute rows
5579 -- tfa = "final" array of interface table attribute rows that have been validated for insert
5580
5581 t_rowid rowid_type;
5582 t_member_id varchar2_150_type;
5583 t_value_set_id number_type;
5584 t_dimension_group_id number_type;
5585 t_old_dimension_group_id number_type; -- dimgrp of the member as it exists in
5586 -- in the _B table
5587 t_b_status varchar2_std_type;
5588 t_member_dc varchar2_150_type;
5589 t_value_set_dc varchar2_150_type;
5590 t_dimension_group_dc varchar2_150_type;
5591 t_dimension_group_seq number_type;
5592 t_time_group_type_code varchar2_std_type;
5593
5594 ---------------------
5595 -- Declare cursors --
5596 ---------------------
5597 cv_get_remain_mbr cv_curs;
5598
5599 BEGIN
5600 FEM_ENGINES_PKG.TECH_MESSAGE
5601 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5602
5603 --x_status := 0; -- initialize status of the Base_Update procedure
5604 --x_message := 'COMPLETE:NORMAL';
5605
5606 -- set the local fetch limit variable based on the parameter
5607 -- this will be null for Dimension Group loads
5608 v_fetch_limit := p_fetch_limit;
5609 IF v_fetch_limit IS NULL THEN
5610 v_fetch_limit := 10000;
5611 END IF;
5612
5613
5614 build_remain_mbr_select_stmt (p_load_type
5615 ,p_dimension_id
5616 ,p_dimension_varchar_label
5617 ,p_shared_dimension_flag
5618 ,p_value_set_required_flag
5619 ,p_hier_dimension_flag
5620 ,p_source_b_table
5621 ,p_target_b_table
5622 ,p_member_col
5623 ,p_member_dc_col
5624 ,p_member_t_dc_col
5625 ,p_exec_mode_clause
5626 ,x_remain_mbr_select_stmt);
5627
5628 IF p_data_slc IS NOT NULL THEN
5629 x_remain_mbr_select_stmt := REPLACE(x_remain_mbr_select_stmt,'{{data_slice}}',p_data_slc);
5630 ELSE
5631 x_remain_mbr_select_stmt := REPLACE(x_remain_mbr_select_stmt,'{{data_slice}}','1=1');
5632 END IF;
5633
5634 FEM_ENGINES_PKG.TECH_MESSAGE
5635 (c_log_level_1,c_block||'.'||c_proc_name||'.member select stmt'
5636 ,x_remain_mbr_select_stmt);
5637
5638 build_status_update_stmt (p_source_b_table
5639 ,x_update_mbr_status_stmt);
5640
5641 FEM_ENGINES_PKG.TECH_MESSAGE
5642 (c_log_level_1,c_block||'.'||c_proc_name||'.status update stmt'
5643 ,x_update_mbr_status_stmt);
5644
5645 build_delete_stmt (p_source_b_table
5646 ,x_delete_mbr_stmt);
5647
5648 FEM_ENGINES_PKG.TECH_MESSAGE
5649 (c_log_level_1,c_block||'.'||c_proc_name||'.delete stmt'
5650 ,x_delete_mbr_stmt);
5651
5652 build_seq_enf_hiercount_stmt (p_value_set_required_flag
5653 ,p_hier_table_name
5654 ,x_seq_enf_hiercount_stmt);
5655
5656 FEM_ENGINES_PKG.TECH_MESSAGE
5657 (c_log_level_1,c_block||'.'||c_proc_name||'.seq_enf_hiercount_stmt'
5658 ,x_seq_enf_hiercount_stmt);
5659
5660 build_dimgrp_update_stmt (p_target_b_table
5661 ,p_value_set_required_flag
5662 ,p_member_dc_col
5663 ,x_update_dimgrp_stmt);
5664
5665 FEM_ENGINES_PKG.TECH_MESSAGE
5666 (c_log_level_1,c_block||'.'||c_proc_name||'.update member base table stmt'
5667 ,x_update_dimgrp_stmt);
5668
5669 build_enable_update_stmt (p_dimension_varchar_label
5670 ,p_dimension_id
5671 ,p_load_type
5672 ,p_target_b_table
5673 ,p_member_col
5674 ,p_member_dc_col
5675 ,p_value_set_required_flag
5676 ,x_enabled_flag_update_stmt);
5677 IF p_data_slc IS NOT NULL THEN
5678 x_enabled_flag_update_stmt := REPLACE(x_enabled_flag_update_stmt,'{{data_slice}}',p_data_slc);
5679 ELSE
5680 x_enabled_flag_update_stmt := REPLACE(x_enabled_flag_update_stmt,'{{data_slice}}','1=1');
5681 END IF;
5682
5683 FEM_ENGINES_PKG.TECH_MESSAGE
5684 (c_log_level_1,c_block||'.'||c_proc_name||'.update member enabled_flag stmt'
5685 ,x_enabled_flag_update_stmt);
5686
5687
5688 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
5689 -- the data slice loop
5690
5691 LOOP
5692
5693 IF p_load_type <> ('DIMENSION_GROUP') THEN
5694
5695 FEM_Multi_Proc_Pkg.Get_Data_Slice(
5696 x_slc_id => v_slc_id,
5697 x_slc_val1 => v_slc_val,
5698 x_slc_val2 => v_slc_val2,
5699 x_slc_val3 => v_slc_val3,
5700 x_slc_val4 => v_slc_val4,
5701 x_num_vals => v_num_vals,
5702 x_part_name => v_part_name,
5703 p_req_id => p_master_request_id,
5704 p_proc_num => p_proc_num);
5705
5706 FEM_ENGINES_PKG.TECH_MESSAGE
5707 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
5708 ,v_slc_val);
5709 FEM_ENGINES_PKG.TECH_MESSAGE
5710 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
5711 ,v_slc_val2);
5712 FEM_ENGINES_PKG.TECH_MESSAGE
5713 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
5714 ,v_slc_val3);
5715 FEM_ENGINES_PKG.TECH_MESSAGE
5716 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
5717 ,v_slc_val4);
5718
5719
5720 EXIT WHEN (v_slc_id IS NULL);
5721 ELSE
5722 EXIT WHEN (v_loop_counter > 0);
5723 v_loop_counter := v_loop_counter + 1;
5724 END IF;
5725
5726 ------------------------------------------------------------------------------
5727 -- Loop through the remaining members that already exist in the _B_T table
5728 -- to perform update on the Dimension Group
5729 ------------------------------------------------------------------------------
5730 IF p_load_type <> ('DIMENSION_GROUP') THEN
5731 OPEN cv_get_remain_mbr FOR x_remain_mbr_select_stmt USING v_slc_val, v_slc_val2;
5732 ELSE
5733 OPEN cv_get_remain_mbr FOR x_remain_mbr_select_stmt;
5734 END IF;
5735
5736 LOOP
5737 -------------------------------------------
5738 -- Bulk Collect Rows from the source _B table
5739 -- Using Dynamic SELECT Statement
5740 -------------------------------------------
5741 FETCH cv_get_remain_mbr BULK COLLECT INTO
5742 t_rowid
5743 ,t_member_id
5744 ,t_member_dc
5745 ,t_value_set_dc
5746 ,t_value_set_id
5747 ,t_dimension_group_dc
5748 ,t_dimension_group_id
5749 ,t_old_dimension_group_id
5750 ,t_dimension_group_seq
5751 ,t_time_group_type_code
5752 ,t_b_status
5753 LIMIT v_fetch_limit;
5754 ----------------------------------------------
5755 -- EXIT Fetch LOOP If No Rows are Retrieved --
5756 ----------------------------------------------
5757 v_mbr_last_row := t_member_dc.LAST;
5758
5759 IF (v_mbr_last_row IS NULL)
5760 THEN
5761 EXIT;
5762 END IF;
5763
5764 FOR i IN 1..v_mbr_last_row
5765 LOOP
5766 ----------------------------------------------
5767 -- Begin Load_Type = 'DIMENSION_GROUP' Validations
5768 ----------------------------------------------
5769 IF (p_load_type = 'DIMENSION_GROUP') THEN
5770 SELECT count(*)
5771 INTO v_seq_conflict_count
5772 FROM fem_dimension_grps_b
5773 WHERE dimension_group_seq = t_dimension_group_seq(i)
5774 AND dimension_id = p_dimension_id
5775 AND dimension_group_id <> t_dimension_group_id(i);
5776
5777 IF v_seq_conflict_count > 0 THEN
5778 t_b_status(i) := 'DIMENSION_GROUP_SEQ_NOT_UNIQUE';
5779 ----------------------------------------------------------
5780 -- Count the error rows
5781 ----------------------------------------------------------
5782 v_temp_rows_rejected := v_temp_rows_rejected + 1;
5783 FEM_ENGINES_PKG.TECH_MESSAGE
5784 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected1',v_temp_rows_rejected);
5785 END IF; -- seq_conflict_count
5786
5787 IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
5788 SELECT count(*)
5789 INTO v_count
5790 FROM fem_time_group_types_b
5791 WHERE time_group_type_code = t_time_group_type_code(i);
5792
5793 IF v_count =0 THEN
5794 t_b_status(i) := 'INVALID_TIME_GROUP_TYPE';
5795 ----------------------------------------------------------
5796 -- Count the error rows
5797 ----------------------------------------------------------
5798 v_temp_rows_rejected := v_temp_rows_rejected + 1;
5799 END IF;
5800 END IF; -- CAL_PERIOD
5801 ELSE
5802 ----------------------------------------------
5803 -- Load_Type = 'DIMENSION_MEMBER' validations
5804 ----------------------------------------------
5805 IF p_hier_dimension_flag = 'Y' THEN
5806 -- Validate the Dimension Group for the member
5807
5808 IF (t_dimension_group_dc(i) IS NOT NULL
5809 AND t_dimension_group_id(i) IS NULL
5810 AND p_dimension_varchar_label NOT IN ('CAL_PERIOD')) THEN
5811 t_b_status(i) := 'INVALID_DIMENSION_GROUP';
5812 ----------------------------------------------------------
5813 -- Count the error rows
5814 ----------------------------------------------------------
5815 v_temp_rows_rejected := v_temp_rows_rejected + 1;
5816 FEM_ENGINES_PKG.TECH_MESSAGE
5817 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected2',v_temp_rows_rejected);
5818 END IF; -- validation on dimgrp being not null
5819
5820 -- Get count of sequence enforced hiers in which the member participates
5821 IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') THEN
5822 IF p_value_set_required_flag = 'Y' THEN
5823 EXECUTE IMMEDIATE x_seq_enf_hiercount_stmt
5824 INTO v_seq_enf_hiercount
5825 USING t_member_id(i)
5826 ,t_value_set_id(i);
5827 ELSE
5828 EXECUTE IMMEDIATE x_seq_enf_hiercount_stmt
5829 INTO v_seq_enf_hiercount
5830 USING t_member_id(i);
5831 END IF; -- hiercount immediate
5832
5833 IF v_seq_enf_hiercount > 0
5834 AND t_dimension_group_id(i) <> t_old_dimension_group_id(i) THEN
5835 t_b_status(i) := 'INVALID_DIMGRP_MBR_IN_SEQ_HIER';
5836 ----------------------------------------------------------
5837 -- Count the error rows
5838 ----------------------------------------------------------
5839 v_temp_rows_rejected := v_temp_rows_rejected + 1;
5840 FEM_ENGINES_PKG.TECH_MESSAGE
5841 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected3',v_temp_rows_rejected);
5842 ELSE -- update the dimension_group
5843 IF p_value_set_required_flag = 'Y' THEN
5844 EXECUTE IMMEDIATE x_update_dimgrp_stmt
5845 USING t_dimension_group_id(i)
5846 ,gv_apps_user_id
5847 ,gv_login_id
5848 ,t_member_dc(i)
5849 ,t_value_set_id(i)
5850 ,t_b_status(i);
5851 ELSE
5852 EXECUTE IMMEDIATE x_update_dimgrp_stmt
5853 USING t_dimension_group_id(i)
5854 ,gv_apps_user_id
5855 ,gv_login_id
5856 ,t_member_dc(i)
5857 ,t_b_status(i);
5858 END IF; -- execute immediate x_update_dimgrp_stmt
5859 END IF; -- v_seq_enf_hiercount
5860 END IF; -- not CAL_PERIOD
5861 END IF; -- dimensions that use_groups
5862 END IF; -- Load_Type 'DIMENSION_GROUP' v.s. 'DIMENSION_MEMBER'
5863 END LOOP;
5864 FEM_ENGINES_PKG.TECH_MESSAGE
5865 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected4',v_temp_rows_rejected);
5866
5867 ---------------------------------------------------------
5868 -- Update member records in the _B table for Rejected records
5869 ---------------------------------------------------------
5870 FEM_ENGINES_PKG.TECH_MESSAGE
5871 (c_log_level_1,c_block||'.'||c_proc_name||'.updating mbr status','start');
5872 FORALL i IN 1..v_mbr_last_row
5873 EXECUTE IMMEDIATE x_update_mbr_status_stmt
5874 USING t_b_status(i)
5875 ,t_rowid(i)
5876 ,t_b_status(i);
5877
5878 ---------------------------------------------------------
5879 -- Delete member records from the _B_T table
5880 ---------------------------------------------------------
5881 FORALL i IN 1..v_mbr_last_row
5882 EXECUTE IMMEDIATE x_delete_mbr_stmt
5883 USING t_rowid(i)
5884 ,t_b_status(i)
5885 ,'N';
5886
5887 ---------------------------------------------------------
5888 -- Bug#3906218 NEED ABILITY TO UNDELETE DIMENSIONS
5889 -- Perform the Enabled Flag update on the B table
5890 ---------------------------------------------------------
5891 FEM_ENGINES_PKG.TECH_MESSAGE
5892 (c_log_level_1,c_block||'.'||c_proc_name||'.updating enabled flag','start');
5893
5894 IF (p_value_set_required_flag = 'Y') THEN
5895 FORALL i IN 1..v_mbr_last_row
5896 EXECUTE IMMEDIATE x_enabled_flag_update_stmt
5897 USING t_member_dc(i)
5898 ,t_value_set_dc(i)
5899 ,t_value_set_dc(i)
5900 ,t_b_status(i);
5901
5902 ELSE
5903 FORALL i IN 1..v_mbr_last_row
5904 EXECUTE IMMEDIATE x_enabled_flag_update_stmt
5905 USING t_member_dc(i)
5906 ,t_b_status(i);
5907 END IF;
5908
5909
5910 ----------------------------------------------------------
5911 -- Count the error and loaded rows
5912 ----------------------------------------------------------
5913 v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
5914 v_rows_loaded := v_rows_loaded + (v_mbr_last_row - v_temp_rows_rejected);
5915 FEM_ENGINES_PKG.TECH_MESSAGE
5916 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected',v_rows_rejected);
5917
5918 --x_rows_loaded := x_rows_loaded + (v_mbr_last_row - v_temp_rows_rejected);
5919 v_temp_rows_rejected := 0; -- initialize for next pass of the loop
5920 v_rows_loaded := 0;
5921
5922 --------------------------------------------
5923 -- Delete Collections for Next Bulk Fetch --
5924 --------------------------------------------
5925 t_rowid.DELETE;
5926 t_member_id.DELETE;
5927 t_member_dc.DELETE;
5928 t_value_set_dc.DELETE;
5929 t_value_set_id.DELETE;
5930 t_dimension_group_dc.DELETE;
5931 t_dimension_group_id.DELETE;
5932 t_b_status.DELETE;
5933
5934 COMMIT;
5935 END LOOP; -- Remaining members BULK Collect
5936
5937 IF p_load_type <> ('DIMENSION_GROUP') THEN
5938 FEM_Multi_Proc_Pkg.Post_Data_Slice(
5939 p_req_id => p_master_request_id,
5940 p_slc_id => v_slc_id,
5941 p_status => v_mp_status,
5942 p_message => v_mp_message,
5943 p_rows_processed => 0,
5944 p_rows_loaded => 0,
5945 p_rows_rejected => v_rows_rejected);
5946 END IF;
5947
5948 END LOOP; -- get_data_slice
5949
5950 IF p_load_type = ('DIMENSION_GROUP') THEN
5951 gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
5952 END IF;
5953
5954
5955 IF cv_get_remain_mbr%ISOPEN THEN
5956 CLOSE cv_get_remain_mbr;
5957 END IF;
5958
5959 --x_rows_rejected := v_rows_rejected;
5960 FEM_ENGINES_PKG.TECH_MESSAGE
5961 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5962
5963 EXCEPTION
5964 WHEN OTHERS THEN
5965 IF cv_get_remain_mbr%ISOPEN THEN
5966 CLOSE cv_get_remain_mbr;
5967 END IF;
5968
5969 --x_status:= 2;
5970 --x_message := 'COMPLETE:ERROR';
5971
5972 gv_prg_msg := sqlerrm;
5973 gv_callstack := dbms_utility.format_call_stack;
5974
5975 FEM_ENGINES_PKG.TECH_MESSAGE
5976 (p_severity => c_log_level_6
5977 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5978 ,p_msg_text => gv_prg_msg);
5979
5980 FEM_ENGINES_PKG.TECH_MESSAGE
5981 (p_severity => c_log_level_6
5982 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5983 ,p_msg_text => gv_callstack);
5984
5985 FEM_ENGINES_PKG.USER_MESSAGE
5986 (p_app_name => c_fem
5987 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
5988 ,P_TOKEN1 => 'ERR_MSG'
5989 ,P_VALUE1 => gv_prg_msg);
5990
5991 -- FEM_ENGINES_PKG.USER_MESSAGE
5992 -- (p_app_name => c_fem
5993 -- ,p_msg_text => gv_prg_msg);
5994
5995 RAISE e_main_terminate;
5996
5997
5998 END Base_Update;
5999
6000 /*===========================================================================+
6001 | PROCEDURE
6002 | Attr_Assign_Update
6003 |
6004 | DESCRIPTION
6005 | This step updates attribute rows for existing members. It also inserts
6006 | new attribute rows for existing members. It is not necessary for users
6007 | to populate the _B_T table in order for this step to run - it just queries
6008 | attribute assignments from the _ATTR_T table
6009 |
6010 | SCOPE - PRIVATE
6011 |
6012 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6013 |
6014 | ARGUMENTS : IN:
6015 |
6016 |
6017 | OUT:
6018 |
6019 | IN/ OUT:
6020 |
6021 | RETURNS : NONE
6022 |
6023 | NOTES
6024 |
6025 | Update Attribute Assign (Simple Dim = 'N' only)
6026 | 1. Attribute assignment rows for members that exist in FEM can be updated
6027 | where the assignment already exists. Also, assignment rows for
6028 | additional versions can be loaded as long as the attribute supports multiple versions.
6029 | If a DIMENSION assignment, then assignment value must exist in the
6030 | attribute dimension table. Status = 'INVALID_DIM_ASSIGNMENT' for failure
6031 | If a DATE assignment, then assignment value must be a valid date.
6032 | Status='INVALID_DATE' for failure
6033 | If a NUMBER assignment, then assignment value must be a valid number.
6034 | Status = 'INVALID_NUMBER' for failure.
6035 | If an assignment exists for the VERSION_DISPLAY_CODE and the attribute
6036 | is Read Only, then record is rejected and
6037 | Status = 'READ_ONLY_ATTRIBUTE'
6038 | If an assignment does not exist for the VERSION_DISPLAY_CODE and
6039 | and an assignment does exist for one or more versions and the attribute
6040 | is a "Single Version Only", then record is rejected and
6041 | Status = 'MULT_VERSION_NOT_ALLOWED'
6042 |
6043 | -If the attribute assignment already exists for the provided version, it will be
6044 | updated in FEM with the new value as long as it is not a "read only"
6045 | version and as long as the attribute is not a "multiple assignment" attribute.
6046 |
6047 | -If the assignment exists for the provided version and the attribute
6048 | is a "multiple assignment" attribute, then a new attribute row will be
6049 | inserted for that version.
6050 |
6051 | -If the attribute assignment exists for the member but for a different version,
6052 | then a new assignment row will be created only if the attribute "allows
6053 | multiple versions".
6054 |
6055 | -If the attribute assignment does not exist at all for the member (either for
6056 | provided version or for any version), then a new assignment row will be
6057 | inserted.
6058 | 2. Delete any _ATTR_T rows that are successful.
6059 |
6060 | MODIFICATION HISTORY
6061 | Rob Flippo 22-MAR-04 Created
6062 | Rob Flippo 13-SEP-04 Bug#3835758 Validation on the attr_Assign_vs
6063 | was modified to include dimension_id
6064 | in the where condition
6065 | Rob Flippo 15-SEP-04 Bug#3835758 Added exception handler so no failure
6066 | if VS didn't exist. Also moved the section
6067 | that verifies the VS so that only called
6068 | for DIMENSION attributes;
6069 | Rob Flippo 30-SEP-04 Bug#3925655 For assignment_is_read_only='Y' attr,
6070 | if the new value = the existing value,
6071 | go ahead and do the update so that the
6072 | interface row can be deleted and not
6073 | show up as an error
6074 | Logic for assignment_is_read_only is as follows:
6075 | If assignment_is_read_only_flag = 'Y', and there is an existing
6076 | assignment record for the same version (i.e., - using build_does_attr_exist
6077 | with version_flag = 'Y'), then
6078 | query the target ATTR table again for that member, attribute, version,
6079 | and include the appropriate assignment columns to see if you get 1 row
6080 | back. If you do, then go ahead an update, since it is identical
6081 | If no row comes back, then error as normal for when user tries to update
6082 | assignment_is_read_only attribute
6083 |
6084 | Rob Flippo 01-OCT-04 Added logic so that if member is read
6085 | only, the attribute update is not
6086 |
6087 | Rob Flippo 22-NOV-04 Bug#4019066 Add validation on Accounting_Year
6088 | and GL_PERIOD_NUM for CAL_PERIOD; ACCOUNTING_YEAR
6089 | must be >=1900 and <= 2599 while GL_PERIOD_NUM
6090 | must be <= periods_in_year for the Time Group Type
6091 | allowed
6092 | Bug#4019853 - Fix Data Overlap logic -
6093 | Added section that checks within the
6094 | attr array for date overlaps. This logic
6095 | assumes num_of_processes = 1 for CAL_PEIOD
6096 | load
6097 | Rob Flippo 05-MAR-05 Bug#4170444 Add check to see if READ_ONLY_FLAG='Y'
6098 | in the target ATTR table for existing rows. If
6099 | it is, then set STATUS = 'PROTECTED_ATTR_ASSIGN'
6100 | Rob Flippo 11-AUG-05 Bug#4547868 Performance issue - change ATTR
6101 | Select to get member_id and value_set_id
6102 | Rob Flippo 07-OCT-05 Bug#4630742 10G issue - Attr_assign_update fails
6103 | on does_attr_exist checks: Modified the fetch
6104 | so that both the "version" and "non-version" queries
6105 | are identical for output variables;
6106 | Rob Flippo 28-APR-06 Bug 5174039 Added validation that calp start_date
6107 | must be <= calp end date
6108 | Rob Flippo 18-JUL-06 Bug 5024575 Updates for Many-to-many attributes
6109 +===========================================================================*/
6110 PROCEDURE Attr_Assign_Update (p_eng_sql IN VARCHAR2
6111 ,p_data_slc IN VARCHAR2
6112 ,p_proc_num IN VARCHAR2
6113 ,p_partition_code IN NUMBER
6114 ,p_fetch_limit IN NUMBER
6115 ,p_dimension_varchar_label IN VARCHAR2
6116 ,p_date_format_mask IN VARCHAR2
6117 ,p_dimension_id IN VARCHAR2
6118 ,p_target_b_table IN VARCHAR2
6119 ,p_target_attr_table IN VARCHAR2
6120 ,p_source_b_table IN VARCHAR2
6121 ,p_source_attr_table IN VARCHAR2
6122 ,p_member_col IN VARCHAR2
6123 ,p_member_dc_col IN VARCHAR2
6124 ,p_member_t_dc_col IN VARCHAR2
6125 ,p_value_set_required_flag IN VARCHAR2
6126 ,p_hier_dimension_flag IN VARCHAR2
6127 ,p_simple_dimension_flag IN VARCHAR2
6128 ,p_shared_dimension_flag IN VARCHAR2
6129 ,p_exec_mode_clause IN VARCHAR2
6130 ,p_master_request_id IN NUMBER )
6131 IS
6132 -- Constants
6133 c_proc_name VARCHAR2(30) := 'Attr_Assign_Update';
6134
6135 -- variables storing temporary state information
6136 v_attr_success VARCHAR2(30);
6137 v_temp_member VARCHAR2(100);
6138 v_temp_rows_rejected NUMBER :=0;
6139 v_rows_rejected NUMBER :=0;
6140 v_rows_loaded NUMBER :=0;
6141
6142 -- MP variables
6143 v_loop_counter NUMBER;
6144 v_slc_id NUMBER;
6145 v_slc_val VARCHAR2(100);
6146 v_slc_val2 VARCHAR2(100);
6147 v_slc_val3 VARCHAR2(100);
6148 v_slc_val4 VARCHAR2(100);
6149 v_mp_status VARCHAR2(30);
6150 v_mp_message VARCHAR2(4000);
6151 v_num_vals NUMBER;
6152 v_part_name VARCHAR2(4000);
6153
6154 -- Dynamic SQL statement variables
6155 x_select_stmt VARCHAR2(4000);
6156 x_attr_select_stmt VARCHAR2(4000);
6157 x_remain_mbr_select_stmt VARCHAR2(4000);
6158 x_insert_member_stmt VARCHAR2(4000);
6159 x_insert_attr_stmt VARCHAR2(4000);
6160 x_update_stmt VARCHAR2(4000);
6161 x_attr_update_stmt VARCHAR2(4000);
6162 x_update_tl_stmt VARCHAR2(4000);
6163 x_update_attr_status_stmt VARCHAR2(4000);
6164 x_update_mbr_status_stmt VARCHAR2(4000);
6165 x_update_tl_status_stmt VARCHAR2(4000);
6166 x_update_dimgrp_stmt VARCHAR2(4000);
6167 x_delete_attr_stmt VARCHAR2(4000);
6168 x_special_delete_attr_stmt VARCHAR2(4000);
6169 x_delete_mbr_stmt VARCHAR2(4000);
6170 x_delete_tl_stmt VARCHAR2(4000);
6171 x_does_attr_exist_stmt VARCHAR2(4000);
6172 x_does_multattr_exist_stmt VARCHAR2(4000);
6173 x_does_attr_exist_novers_stmt VARCHAR2(4000);
6174 x_identical_attr_select_stmt VARCHAR2(4000);
6175 x_adj_period_stmt VARCHAR2(4000);
6176 x_overlap_sql_stmt VARCHAR2(4000);
6177 x_calp_interim_stmt VARCHAR2(4000);
6178 x_calp_attr_interim_stmt VARCHAR2(4000);
6179
6180 -- Count variables for manipulating the member and attribute arrays
6181 v_attr_final_count NUMBER := 0;
6182 v_mbr_final_count NUMBER := 0;
6183 v_mbr_count NUMBER := 0;
6184 v_attr_count NUMBER := 0;
6185 v_attr_subcount NUMBER := 0;
6186 v_final_mbr_last_row NUMBER;
6187 v_attr_last_row NUMBER;
6188 v_mbr_last_row NUMBER;
6189 v_nonadj_period_count NUMBER :=0;
6190 v_overlap_count NUMBER :=0;
6191
6192 -------------------------------------
6193 -- Declare bulk collection columns --
6194 -------------------------------------
6195
6196 -- Common abbreviations:
6197 -- t_ = array of raw interface table member rows
6198 -- tf = "final" array of interface table member rows that have been validated for insert
6199 -- ta = array of raw interface table attribute rows
6200 -- tfa = "final" array of interface table attribute rows that have been validated for insert
6201
6202 ta_rowid rowid_type;
6203 tfa_rowid rowid_type;
6204
6205 ta_member_id number_type;
6206 ta_value_set_id number_type;
6207 ta_attribute_id number_type;
6208 ta_attribute_dimension_id number_type;
6209 ta_dim_attr_numeric_member number_type;
6210 ta_number_assign_value number_type;
6211 ta_version_id number_type;
6212 ta_attr_assign_vs_id number_type;
6213 ta_attr_exists_count number_type; -- count of existing attr assign with version_id
6214 ta_multattr_exists_count number_type; -- count of existing attr assign with version_id and same assignment key
6215 ta_attr_exists_novers_count number_type; -- count of existing attr assign without version_id
6216 ta_attr_identical_count number_type; -- count where the assignment values in the
6217 -- target attr table are identical to the assignment
6218 -- from the interface table
6219
6220 tfa_attribute_id number_type;
6221 tfa_dim_attr_numeric_member number_type;
6222 tfa_number_assign_value number_type;
6223 tfa_version_id number_type;
6224 tfa_attr_assign_vs_id number_type;
6225
6226 ta_date_assign_value date_type;
6227 ta_temp_date_assign_value date_type;
6228 tfa_date_assign_value date_type;
6229 ta_cal_period_end_date date_type;
6230
6231 ta_attribute_varchar_label varchar2_std_type;
6232 ta_attr_value_column_name varchar2_std_type;
6233 ta_attribute_data_type_code varchar2_std_type;
6234 ta_dim_attr_varchar_member varchar2_std_type;
6235 ta_status varchar2_std_type;
6236 ta_adj_period_flag flag_type;
6237 ta_protected_assign_flag flag_type;
6238 ta_use_interim_table_flag flag_type; -- identifies assignment rows where
6239 -- we need to insert into the interim
6240 -- tables prior to moving into FEM
6241
6242 tfa_dim_attr_varchar_member varchar2_std_type;
6243 tfa_status varchar2_std_type;
6244
6245 ta_member_dc varchar2_150_type;
6246 ta_value_set_dc varchar2_150_type;
6247 ta_version_display_code varchar2_150_type;
6248 ta_attr_assign_vs_dc varchar2_150_type;
6249
6250 tfa_member_dc varchar2_150_type;
6251 tfa_value_set_dc varchar2_150_type;
6252
6253 ta_attribute_required_flag flag_type;
6254 ta_allow_mult_assign_flag flag_type;
6255 ta_read_only_flag flag_type;
6256 ta_allow_mult_versions_flag flag_type;
6257
6258 ta_language lang_type;
6259
6260 ta_varchar_assign_value varchar2_1000_type;
6261 ta_attribute_assign_value varchar2_1000_type;
6262 tfa_varchar_assign_value varchar2_1000_type;
6263
6264 ta_member_read_only_flag flag_type; -- member read_only flag; If
6265 -- 'Y', no attributes can be
6266 -- modified by the loader
6267
6268 -- table variables used in Interim processing for Cal Periods
6269 ta_cal_period_number number_type;
6270 ta_calendar_dc varchar2_std_type;
6271 ta_dimension_group_dc varchar2_std_type;
6272 ta_dimension_group_id number_type;
6273 ta_calendar_id number_type;
6274
6275 -- variables for holding attributes of CAL_PERIOD
6276 ta_calpattr_cal_dc varchar2_std_type;
6277 ta_calpattr_dimgrp_dc varchar2_std_type;
6278 ta_calpattr_end_date date_type;
6279 ta_calpattr_period_num number_type;
6280
6281
6282 ---------------------
6283 -- Declare cursors --
6284 ---------------------
6285 cv_get_attr_rows cv_curs;
6286
6287 v_session_sql varchar2(1000);
6288
6289 BEGIN
6290 FEM_ENGINES_PKG.TECH_MESSAGE
6291 (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
6292
6293 FEM_ENGINES_PKG.TECH_MESSAGE
6294 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_final_count'
6295 ,v_attr_final_count);
6296
6297 --x_status := 0; -- initialize status of the Attr_Assign_Update procedure
6298 --x_message := 'COMPLETE:NORMAL';
6299
6300 v_temp_rows_rejected := 0; -- reset this temp counter so we can count invalid
6301 -- attr records as we go
6302
6303 build_attr_select_stmt (p_dimension_varchar_label
6304 ,p_dimension_id
6305 ,p_source_b_table
6306 ,p_source_attr_table
6307 ,p_target_b_table
6308 ,p_member_t_dc_col
6309 ,p_member_dc_col
6310 ,p_member_col
6311 ,p_value_set_required_flag
6312 ,p_shared_dimension_flag
6313 ,p_hier_dimension_flag
6314 ,'N'
6315 ,'N'
6316 ,p_exec_mode_clause
6317 ,x_attr_select_stmt);
6318
6319 IF p_data_slc IS NOT NULL THEN
6320 x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}',p_data_slc);
6321 ELSE
6322 x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}','1=1');
6323 END IF;
6324
6325
6326 FEM_ENGINES_PKG.TECH_MESSAGE
6327 (c_log_level_1,c_block||'.'||c_proc_name||'.attr select stmt'
6328 ,x_attr_select_stmt);
6329
6330 build_does_attr_exist_stmt (p_target_attr_table
6331 ,p_target_b_table
6332 ,p_member_col
6333 ,p_member_dc_col
6334 ,p_value_set_required_flag
6335 ,'Y'
6336 ,x_does_attr_exist_stmt);
6337
6338
6339 FEM_ENGINES_PKG.TECH_MESSAGE
6340 (c_log_level_1,c_block||'.'||c_proc_name||'.does attr exist for version stmt'
6341 ,x_does_attr_exist_stmt);
6342
6343
6344 build_does_attr_exist_stmt (p_target_attr_table
6345 ,p_target_b_table
6346 ,p_member_col
6347 ,p_member_dc_col
6348 ,p_value_set_required_flag
6349 ,'N'
6350 ,x_does_attr_exist_novers_stmt);
6351
6352 build_get_identical_assgn_stmt (p_target_attr_table
6353 ,p_target_b_table
6354 ,p_member_col
6355 ,p_member_dc_col
6356 ,p_value_set_required_flag
6357 ,p_date_format_mask
6358 ,x_identical_attr_select_stmt);
6359
6360 build_attr_update_stmt (p_target_attr_table
6361 ,p_target_b_table
6362 ,p_member_dc_col
6363 ,p_member_col
6364 ,p_value_set_required_flag
6365 ,x_attr_update_stmt);
6366
6367 FEM_ENGINES_PKG.TECH_MESSAGE
6368 (c_log_level_1,c_block||'.'||c_proc_name||'.attr update stmt'
6369 ,x_attr_update_stmt);
6370
6371 build_delete_stmt (p_source_attr_table
6372 ,x_delete_attr_stmt);
6373
6374 build_special_delete_stmt (p_source_attr_table
6375 ,x_special_delete_attr_stmt);
6376
6377
6378 build_insert_attr_stmt (p_target_attr_table
6379 ,p_target_b_table
6380 ,p_member_col
6381 ,p_member_dc_col
6382 ,p_value_set_required_flag
6383 ,x_insert_attr_stmt);
6384
6385 FEM_ENGINES_PKG.TECH_MESSAGE
6386 (c_log_level_1,c_block||'.'||c_proc_name||'.insert attr stmt'
6387 ,x_insert_attr_stmt);
6388
6389 build_status_update_stmt (p_source_attr_table
6390 ,x_update_attr_status_stmt);
6391
6392 -- special insert stmts for the INTERIM tables for CAL_PERIOD loads
6393 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
6394 build_calp_interim_insert_stmt(x_calp_interim_stmt
6395 ,x_calp_attr_interim_stmt);
6396 END IF;
6397
6398
6399 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
6400 -- the data slice loop
6401 LOOP
6402
6403 FEM_Multi_Proc_Pkg.Get_Data_Slice(
6404 x_slc_id => v_slc_id,
6405 x_slc_val1 => v_slc_val,
6406 x_slc_val2 => v_slc_val2,
6407 x_slc_val3 => v_slc_val3,
6408 x_slc_val4 => v_slc_val4,
6409 x_num_vals => v_num_vals,
6410 x_part_name => v_part_name,
6411 p_req_id => p_master_request_id,
6412 p_proc_num => p_proc_num);
6413
6414 FEM_ENGINES_PKG.TECH_MESSAGE
6415 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
6416 ,v_slc_val);
6417 FEM_ENGINES_PKG.TECH_MESSAGE
6418 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
6419 ,v_slc_val2);
6420 FEM_ENGINES_PKG.TECH_MESSAGE
6421 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
6422 ,v_slc_val3);
6423 FEM_ENGINES_PKG.TECH_MESSAGE
6424 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
6425 ,v_slc_val4);
6426
6427 EXIT WHEN (v_slc_id IS NULL);
6428
6429 -----------------------------------------------------
6430 -- Bulk Collect ATTR_T Rows for non-simple dimensions
6431 -- Using Dynamic SELECT Statement
6432 -----------------------------------------------------
6433 OPEN cv_get_attr_rows FOR x_attr_select_stmt USING v_slc_val, v_slc_val2;
6434
6435 LOOP -- ATTR Collection Loop
6436 FETCH cv_get_attr_rows BULK COLLECT INTO
6437 ta_rowid
6438 ,ta_member_read_only_flag
6439 ,ta_attribute_id
6440 ,ta_attribute_varchar_label
6441 ,ta_attribute_dimension_id
6442 ,ta_attr_value_column_name
6443 ,ta_attribute_data_type_code
6444 ,ta_attribute_required_flag
6445 ,ta_read_only_flag
6446 ,ta_allow_mult_versions_flag
6447 ,ta_allow_mult_assign_flag
6448 ,ta_member_dc
6449 ,ta_value_set_dc
6450 ,ta_member_id
6451 ,ta_value_set_id
6452 ,ta_attribute_assign_value
6453 ,ta_dim_attr_numeric_member
6454 ,ta_dim_attr_varchar_member
6455 ,ta_number_assign_value
6456 ,ta_varchar_assign_value
6457 ,ta_date_assign_value
6458 ,ta_version_display_code
6459 ,ta_version_id
6460 ,ta_attr_assign_vs_dc
6461 ,ta_attr_assign_vs_id
6462 ,ta_cal_period_end_date
6463 ,ta_status
6464 ,ta_use_interim_table_flag
6465 ,ta_cal_period_number
6466 ,ta_calendar_dc
6467 ,ta_calendar_id
6468 ,ta_dimension_group_dc
6469 ,ta_dimension_group_id
6470 ,ta_calpattr_cal_dc
6471 ,ta_calpattr_dimgrp_dc
6472 ,ta_calpattr_end_date
6473 ,ta_calpattr_period_num
6474 LIMIT p_fetch_limit;
6475
6476 v_attr_last_row := ta_attribute_id.LAST;
6477 IF (v_attr_last_row IS NULL) THEN
6478 EXIT;
6479 END IF;
6480
6481 FEM_ENGINES_PKG.TECH_MESSAGE
6482 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_last_row'
6483 ,v_attr_last_row);
6484
6485 FOR j IN 1..v_attr_last_row
6486 LOOP
6487
6488 FEM_ENGINES_PKG.TECH_MESSAGE
6489 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_label'
6490 ,ta_attribute_varchar_label(j));
6491
6492 FEM_ENGINES_PKG.TECH_MESSAGE
6493 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_assign_value'
6494 ,ta_attribute_assign_value(j));
6495
6496 FEM_ENGINES_PKG.TECH_MESSAGE
6497 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_value_column_name'
6498 ,ta_attr_value_column_name(j));
6499
6500 FEM_ENGINES_PKG.TECH_MESSAGE
6501 (c_log_level_1,c_block||'.'||c_proc_name||'.use_interim_table_flag'
6502 ,ta_use_interim_table_flag(j));
6503
6504 -- Bug#4429725
6505 -- reset the attr_final_count variable
6506 v_attr_final_count := 0;
6507
6508 -----------------------------------------
6509 -- BEGIN ATTR VALIDATIONS
6510
6511 -----------------------------------------
6512 -- Bug#3822561 Support for attributes of CAL_PERIOD
6513 -- if the attribute_dimension_id = 1 (CAL_PERIOD)
6514 -- then we construct a CAL_PERIOD_ID from the
6515 -- special CALP columns and move it into the
6516 -- ta_attribute_assign_value(j)
6517 -----------------------------------------
6518 IF ta_attribute_dimension_id(j) = 1 THEN
6519 get_attr_assign_calp(ta_attribute_assign_value(j)
6520 ,ta_status(j)
6521 ,ta_calpattr_cal_dc(j)
6522 ,ta_calpattr_dimgrp_dc(j)
6523 ,ta_calpattr_end_date(j)
6524 ,ta_calpattr_period_num(j));
6525 END IF;
6526 FEM_ENGINES_PKG.TECH_MESSAGE
6527 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_assign_value - post conv'
6528 ,ta_attribute_assign_value(j));
6529
6530 FEM_ENGINES_PKG.TECH_MESSAGE
6531 (c_log_level_1,c_block||'.'||c_proc_name||'.status post conv'
6532 ,ta_status(j));
6533
6534 -----------------------------------------
6535 -- validate version_display_code
6536 -----------------------------------------
6537 get_attr_version (p_dimension_varchar_label
6538 ,ta_attribute_varchar_label(j)
6539 ,ta_version_display_code(j)
6540 ,ta_version_id(j));
6541
6542 FEM_ENGINES_PKG.TECH_MESSAGE
6543 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute version id'
6544 ,ta_version_id(j));
6545
6546 ----------------------------------------------------------
6547 -- Initialize variables - in case status <> 'LOAD'
6548 -- we still need values for the variables so we don't
6549 -- array element error
6550 ----------------------------------------------------------
6551 -- assume adj_period_flag = 'Y' for all cal_period
6552 -- this will get updated to 'N' later if appropriate
6553 IF p_dimension_Varchar_label = 'CAL_PERIOD' THEN
6554 ta_adj_period_flag(j) := 'Y';
6555 END IF;
6556 -- Assume the attr assignment doesn't exist
6557 ta_attr_exists_count(j) := 0;
6558 ta_multattr_exists_count(j) := 0;
6559 -- initializing the date field
6560 -- this will get updated appropriately for CAL_PERIOD members
6561 -- during the overlap check
6562 -- we use the temp variable later on for comparisons
6563 -- where we would expect it to be null
6564 ta_temp_date_assign_value(j) := ta_date_assign_value(j);
6565 ta_date_assign_value(j) := to_date('12/31/2499','MM/DD/YYYY');
6566 ------------------------------------------------------------------
6567
6568
6569 ------------------------------------------
6570 -- Member Read Only Flag validation
6571 -- Main IF for attr validation
6572 ------------------------------------------
6573 IF ta_member_read_only_flag(j) = 'N' AND ta_status(j) = 'LOAD'THEN
6574
6575 -----------------------------------------
6576 -- validate attribute_assign_value
6577 -----------------------------------------
6578 -- VARCHAR_ASSIGN_VALUE
6579 IF (ta_attr_value_column_name(j) = 'VARCHAR_ASSIGN_VALUE'
6580 AND ta_attribute_assign_value(j) IS NOT NULL
6581 AND ta_version_id(j) IS NOT NULL) THEN
6582
6583 ta_varchar_assign_value(j)
6584 := to_char(ta_attribute_assign_value(j));
6585 -- NUMBER_ASSIGN_VALUE
6586 ELSIF (ta_attr_value_column_name(j) = 'NUMBER_ASSIGN_VALUE'
6587 AND ta_attribute_assign_value(j) IS NOT NULL
6588 AND ta_version_id(j) IS NOT NULL) THEN
6589 BEGIN
6590 ta_number_assign_value(j) := to_number(ta_attribute_assign_value(j));
6591
6592 -- Special validation for ACCOUNTING_YEAR
6593 -- ensures that the ACCOUNTING_YEAR value
6594 -- is within the year range supported
6595 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
6596 ta_attribute_varchar_label(j) = 'ACCOUNTING_YEAR' AND
6597 (ta_number_assign_value(j) < 1900 OR
6598 ta_number_assign_value(j) >= 2599) THEN
6599 RAISE e_invalid_acct_year;
6600 END IF;
6601
6602 EXCEPTION
6603 WHEN e_invalid_number THEN
6604 ta_status(j) := 'INVALID_NUMBER';
6605 WHEN e_invalid_number1722 THEN
6606 ta_status(j) := 'INVALID_NUMBER';
6607 WHEN e_invalid_acct_year THEN
6608 ta_status(j) := 'INVALID_ACCOUNTING_YEAR';
6609
6610 END; -- NUMBER_ASSIGN_VALUE
6611 -- DATE_ASSIGN_VALUE
6612 ELSIF (ta_attr_value_column_name(j) = 'DATE_ASSIGN_VALUE'
6613 AND ta_attribute_assign_value(j) IS NOT NULL
6614 AND ta_version_id(j) IS NOT NULL) THEN
6615 BEGIN
6616 ta_date_assign_value(j) := to_date(ta_attribute_assign_value(j),p_date_format_mask);
6617 ta_temp_date_assign_value(j) := to_date(ta_attribute_assign_value(j),p_date_format_mask);
6618
6619 -- Special validation for CAL_PERIOD_START_DATE
6620 -- looking for existing cal periods where adj_period_flag='N'
6621 -- where there is a start_date entry in the ATTR_T table
6622 -- that overlaps with the start_date that is being "updated"
6623 -- We are only checking within our data slice, since
6624 -- if the overlap is in a separate data slice, the main
6625 -- check on "existing" overlap records will catch it
6626
6627 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
6628 ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
6629
6630 IF ta_cal_period_end_date(j) < ta_date_assign_value(j) THEN
6631 RAISE e_invalid_calp_start_date;
6632 END IF;
6633
6634 -- First check to see if the cal period with the new start
6635 -- date is not an adj. period and it does not have an identical
6636 -- start_date to its existing record in the "real" db
6637 -- we exlude situations where the start_date is identical for
6638 -- the same cal_period_id because the load is not changing
6639 -- anything
6640 x_adj_period_stmt := 'select count(*)'||
6641 ' from fem_cal_periods_attr A1, fem_dim_attributes_b DA1'||
6642 ',fem_dim_attr_versions_b V1'||
6643 ',fem_cal_periods_attr A2, fem_dim_attributes_b DA2'||
6644 ',fem_dim_attr_Versions_b V2'||
6645 ' where to_char(A1.cal_period_id) = :b_mbr_dc'||
6646 ' and A1.attribute_id = DA1.attribute_id'||
6647 ' and DA1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6648 ' and DA1.dimension_id = 1'||
6649 ' and A1.dim_attribute_varchar_member = ''N'''||
6650 ' and A1.version_id = V1.version_id'||
6651 ' and V1.attribute_id = DA1.attribute_id'||
6652 ' and V1.aw_snapshot_flag = ''N'''||
6653 ' and V1.default_version_flag =''Y'''||
6654 ' and A1.cal_period_id = A2.cal_period_id'||
6655 ' and A2.date_assign_value '||
6656 ' <> :b_date_assign'||
6657 ' and A2.attribute_id = DA2.attribute_id'||
6658 ' and DA2.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
6659 ' and DA2.dimension_id=1'||
6660 ' and A2.version_id = V2.version_id'||
6661 ' and V2.attribute_id = DA2.attribute_id'||
6662 ' and V2.aw_snapshot_flag = ''N'''||
6663 ' and V2.default_version_flag = ''Y''';
6664
6665 /*************************************************
6666 bug#5060746 comment out to use bind variables
6667 x_adj_period_stmt := 'select count(*)'||
6668 ' from fem_cal_periods_attr A1, fem_dim_attributes_b DA1'||
6669 ',fem_dim_attr_versions_b V1'||
6670 ',fem_cal_periods_attr A2, fem_dim_attributes_b DA2'||
6671 ',fem_dim_attr_Versions_b V2'||
6672 ' where to_char(A1.cal_period_id) = '''||ta_member_dc(j)||''''||
6673 ' and A1.attribute_id = DA1.attribute_id'||
6674 ' and DA1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6675 ' and DA1.dimension_id = 1'||
6676 ' and A1.dim_attribute_varchar_member = ''N'''||
6677 ' and A1.version_id = V1.version_id'||
6678 ' and V1.attribute_id = DA1.attribute_id'||
6679 ' and V1.aw_snapshot_flag = ''N'''||
6680 ' and V1.default_version_flag =''Y'''||
6681 ' and A1.cal_period_id = A2.cal_period_id'||
6682 ' and A2.date_assign_value '||
6683 ' <> to_date('''||to_char(ta_date_assign_value(j),p_date_format_mask)||''','''||p_date_format_mask||''')'||
6684 ' and A2.attribute_id = DA2.attribute_id'||
6685 ' and DA2.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
6686 ' and DA2.dimension_id=1'||
6687 ' and A2.version_id = V2.version_id'||
6688 ' and V2.attribute_id = DA2.attribute_id'||
6689 ' and V2.aw_snapshot_flag = ''N'''||
6690 ' and V2.default_version_flag = ''Y''';
6691 *****************************************************************/
6692
6693 EXECUTE IMMEDIATE x_adj_period_stmt INTO v_nonadj_period_count
6694 USING ta_member_dc(j),ta_date_assign_value(j);
6695
6696 -- If not an adjustment period, then we need to check for
6697 -- date overlap
6698 IF v_nonadj_period_count > 0 THEN
6699 ta_adj_period_flag(j) := 'N';
6700 -- query to see if any records exist for the same
6701 -- calendar/dimgrp in the offical db
6702 -- where:
6703 -- (new) array_start_date <= table.end_date AND
6704 -- array_end_date >= table.start_date
6705 -- and the existing periods are not adj periods
6706 -- and the offending records have a diff cal_period_id
6707 -- than the one being loaded
6708 -- and the offending cal_periods are enabled=Y
6709 x_overlap_sql_stmt :=
6710 'select count(*)'||
6711 ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
6712 ' fem_cal_periods_b C,'||
6713 ' fem_dimension_grps_b D,'||
6714 ' fem_dim_attributes_b AE,'||
6715 ' fem_dim_attr_Versions_b VE,'||
6716 ' fem_cal_periods_attr CP,'||
6717 ' fem_dim_attributes_b AP,'||
6718 ' fem_dim_attr_versions_b VP'||
6719 ' where CS.cal_period_id = C.cal_period_id'||
6720 ' and to_char(C.cal_period_id) <> :b_mbr_dc'||
6721 ' and C.cal_period_id = CP.cal_period_id'||
6722 ' and C.enabled_flag = ''Y'''||
6723 ' and CP.attribute_id = AP.attribute_id'||
6724 ' and CP.version_id = VP.version_id'||
6725 ' and CP.dim_attribute_varchar_member = ''N'''||
6726 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6727 ' and AP.dimension_id = 1'||
6728 ' and AP.attribute_id = VP.attribute_id'||
6729 ' and VP.default_version_flag = ''Y'''||
6730 ' and VP.aw_snapshot_flag = ''N'''||
6731 ' and C.calendar_id = :b_cal_id'||
6732 ' and C.dimension_group_id = D.dimension_group_id'||
6733 ' and D.time_dimension_group_key = :b_dimgrp_key'||
6734 ' and D.dimension_id = 1'||
6735 ' and CS.attribute_id = :b_attr_id'||
6736 ' and CS.version_id = :b_vers_id'||
6737 ' and CE.date_assign_value'||
6738 ' >= :b_new_start_date'||
6739 ' and CS.cal_period_id = CE.cal_period_id'||
6740 ' and CE.attribute_id = AE.attribute_id'||
6741 ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
6742 ' and AE.dimension_id = 1'||
6743 ' and CE.version_id = VE.version_id'||
6744 ' and VE.aw_snapshot_flag = ''N'''||
6745 ' and VE.default_version_flag = ''Y'''||
6746 ' and VE.attribute_id = AE.attribute_id'||
6747 ' and CS.date_assign_value'||
6748 ' <= :b_new_end_date';
6749
6750
6751 /*************************************************
6752 bug#5060746 comment out to use bind variables
6753
6754 x_overlap_sql_stmt :=
6755 'select count(*)'||
6756 ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
6757 ' fem_cal_periods_b C,'||
6758 ' fem_dimension_grps_b D,'||
6759 ' fem_dim_attributes_b AE,'||
6760 ' fem_dim_attr_Versions_b VE,'||
6761 ' fem_cal_periods_attr CP,'||
6762 ' fem_dim_attributes_b AP,'||
6763 ' fem_dim_attr_versions_b VP'||
6764 ' where CS.cal_period_id = C.cal_period_id'||
6765 ' and to_char(C.cal_period_id) <>'''||ta_member_dc(j)||''''||
6766 ' and C.cal_period_id = CP.cal_period_id'||
6767 ' and C.enabled_flag = ''Y'''||
6768 ' and CP.attribute_id = AP.attribute_id'||
6769 ' and CP.version_id = VP.version_id'||
6770 ' and CP.dim_attribute_varchar_member = ''N'''||
6771 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6772 ' and AP.dimension_id = 1'||
6773 ' and AP.attribute_id = VP.attribute_id'||
6774 ' and VP.default_version_flag = ''Y'''||
6775 ' and VP.aw_snapshot_flag = ''N'''||
6776 ' and C.calendar_id = '||substr(ta_member_dc(j),23,5)||
6777 ' and C.dimension_group_id = D.dimension_group_id'||
6778 ' and D.time_dimension_group_key = '||substr(ta_member_dc(j),28,5)||
6779 ' and D.dimension_id = 1'||
6780 ' and CS.attribute_id = '||ta_attribute_id(j)||
6781 ' and CS.version_id = '||ta_version_id(j)||
6782 ' and CE.date_assign_value'||
6783 ' >= :b_new_start_date'||
6784 ' and CS.cal_period_id = CE.cal_period_id'||
6785 ' and CE.attribute_id = AE.attribute_id'||
6786 ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
6787 ' and AE.dimension_id = 1'||
6788 ' and CE.version_id = VE.version_id'||
6789 ' and VE.aw_snapshot_flag = ''N'''||
6790 ' and VE.default_version_flag = ''Y'''||
6791 ' and VE.attribute_id = AE.attribute_id'||
6792 ' and CS.date_assign_value'||
6793 ' <= :b_new_end_date';
6794
6795 **************************************************/
6796
6797 FEM_ENGINES_PKG.TECH_MESSAGE
6798 (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt3'
6799 ,x_overlap_sql_stmt);
6800
6801 EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count
6802 USING ta_member_dc(j)
6803 ,substr(ta_member_dc(j),23,5)
6804 ,substr(ta_member_dc(j),28,5)
6805 ,ta_attribute_id(j)
6806 ,ta_version_id(j)
6807 ,ta_date_assign_value(j)
6808 ,ta_cal_period_end_date(j);
6809
6810 IF v_overlap_count > 0 THEN
6811 ta_status(j) := 'OVERLAP_EXIST_START_DATE';
6812 FEM_ENGINES_PKG.TECH_MESSAGE
6813 (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_count'
6814 ,v_overlap_count);
6815
6816 END IF;
6817 /************************************************8
6818 ELSE -- query to see if any records exist for the same
6819 -- calendar/dimgrp in the offical db
6820 -- where start_date >= x and start_date <= y
6821 -- (where x is the new start date and
6822 -- y is the new end date)
6823 -- and the existing periods are not adj periods
6824 -- and the offending records have a diff cal_period_id
6825 -- than the one being loaded
6826 -- and the offending cal_periods are enabled=Y
6827 x_overlap_sql_stmt :=
6828 'select count(*)'||
6829 ' from fem_cal_periods_attr CS'||
6830 ',fem_cal_periods_b C'||
6831 ',fem_dimension_grps_b D'||
6832 ',fem_cal_periods_attr CP'||
6833 ',fem_dim_attributes_b AP'||
6834 ',fem_dim_attr_versions_b VP'||
6835 ' where CS.cal_period_id = C.cal_period_id'||
6836 ' and to_char(C.cal_period_id) <>'''||ta_member_dc(j)||''''||
6837 ' and C.cal_period_id = CP.cal_period_id'||
6838 ' and C.enabled_flag = ''Y'''||
6839 ' and CP.attribute_id = AP.attribute_id'||
6840 ' and CP.version_id = VP.version_id'||
6841 ' and CP.dim_attribute_varchar_member = ''N'''||
6842 ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6843 ' and AP.dimension_id = 1'||
6844 ' and AP.attribute_id = VP.attribute_id'||
6845 ' and VP.default_version_flag = ''Y'''||
6846 ' and VP.aw_snapshot_flag = ''N'''||
6847 ' and C.calendar_id = '||substr(ta_member_dc(j),23,5)||
6848 ' and C.dimension_group_id = D.dimension_group_id'||
6849 ' and D.time_dimension_group_key = '||substr(ta_member_dc(j),28,5)||
6850 ' and CS.attribute_id = '||ta_attribute_id(j)||
6851 ' and CS.version_id = '||ta_version_id(j)||
6852 ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
6853 ' >= '''||to_char(ta_date_assign_value(j),p_date_format_mask)||''''||
6854 ' and to_char(CS.date_assign_value,''j'')'||
6855 ' <= '||to_char(substr(ta_member_dc(j),1,7));
6856
6857 FEM_ENGINES_PKG.TECH_MESSAGE
6858 (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt4'
6859 ,x_overlap_sql_stmt);
6860 EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count;
6861
6862 IF v_overlap_count > 0 THEN
6863 ta_status(j) := 'OVERLAP_EXIST_START_DATE';
6864 END IF;
6865 END IF; -- overlap if */
6866 ELSE
6867 ta_adj_period_flag(j) := 'Y';
6868 END IF; -- adj_period_flag count if
6869 END IF; -- attribute is start_date
6870 --End Special Checks for CAL Period
6871 ----------------------------------------------------------------
6872 EXCEPTION
6873 WHEN e_invalid_calp_start_date THEN
6874 ta_status(j) := 'INVALID_CAL_PERIOD_START_DATE';
6875 WHEN e_date_string_too_long THEN
6876 ta_status(j) := 'INVALID_DATE';
6877 WHEN e_invalid_date THEN
6878 ta_status(j) := 'INVALID_DATE';
6879 WHEN e_invalid_date_format THEN
6880 ta_status(j) := 'INVALID_DATE';
6881 WHEN e_invalid_date_numeric THEN
6882 ta_status(j) := 'INVALID_DATE';
6883 WHEN e_invalid_date_between THEN
6884 ta_status(j) := 'INVALID_DATE';
6885 WHEN e_invalid_date_year THEN
6886 ta_status(j) := 'INVALID_DATE';
6887 WHEN e_invalid_date_day THEN
6888 ta_status(j) := 'INVALID_DATE';
6889 END; -- DATE_ASSIGN_VALUE
6890 ELSIF (ta_attr_value_column_name(j) IN
6891 ('DIM_ATTRIBUTE_VARCHAR_MEMBER', 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
6892 AND ta_attribute_assign_value(j) IS NOT NULL
6893 AND ta_version_id(j) IS NOT NULL) THEN
6894
6895 --------------------------------------------------
6896 -- get the Value Set ID for the assigned attribute
6897 -- 9/15/2004 RCF Modify this section so that if the
6898 -- attr_assign_vs_dc doesn't exist for the specified dimension
6899 -- the row fails
6900 -- Note that the INVALID_ATTR_ASSIGN_VS status will never
6901 -- appear, since the INVALID_DIM_ASSIGNMENT will overwrite it
6902 -- in the case of a bad VS being specified for a member
6903 --------------------------------------------------
6904 IF (ta_attr_assign_vs_dc(j) IS NOT NULL) THEN
6905 BEGIN
6906 SELECT value_set_id
6907 INTO ta_attr_assign_vs_id(j)
6908 FROM fem_value_sets_b
6909 WHERE value_set_display_code = ta_attr_assign_vs_dc(j)
6910 AND dimension_id = ta_attribute_dimension_id(j);
6911 EXCEPTION
6912 WHEN no_data_found THEN
6913 ta_status(j) := 'INVALID_ATTR_ASSIGN_VALUE_SET';
6914 END;
6915 END IF;
6916
6917 verify_attr_member (ta_attribute_varchar_label(j)
6918 ,p_dimension_varchar_label
6919 ,ta_attribute_assign_value(j)
6920 ,ta_attr_assign_vs_dc(j)
6921 ,v_attr_success
6922 ,v_temp_member);
6923 IF (v_attr_success = 'N') THEN
6924 ta_status(j) := 'INVALID_DIM_ASSIGNMENT';
6925 ELSIF (v_attr_success = 'MISSING_ATTR_ASSIGN_VS') THEN
6926 ta_status(j) := 'MISSING_ATTR_ASSIGN_VS';
6927 ELSE -- DIM Assignment is good
6928 IF (ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_VARCHAR_MEMBER') THEN
6929 ta_dim_attr_varchar_member(j) := to_char(v_temp_member);
6930 ELSE
6931 ta_dim_attr_numeric_member(j) := to_number(v_temp_member);
6932 END IF; -- Choice between VARCHAR and NUMERIC Dim members
6933 END IF; -- attr_success=N
6934 ELSIF (ta_version_id(j) IS NULL) THEN-- Version is NULL
6935 ta_status(j) := 'INVALID_VERSION';
6936
6937 ELSE -- Assignment is NULL or Assignment Column not valid
6938 ta_status(j) := 'INVALID_ATTRIBUTE_ASSIGNMENT';
6939
6940 END IF; -- Main IF on validating the attributes
6941 FEM_ENGINES_PKG.TECH_MESSAGE
6942 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_status'
6943 ,ta_status(j));
6944
6945 -----------------------------------------------------------------
6946 -- Check to see if the attribute row already exists in the _ATTR table
6947 -----------------------------------------------------------------
6948 FEM_ENGINES_PKG.TECH_MESSAGE
6949 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_id'
6950 ,ta_attribute_id(j));
6951
6952 FEM_ENGINES_PKG.TECH_MESSAGE
6953 (c_log_level_1,c_block||'.'||c_proc_name||'.version_id'
6954 ,ta_version_id(j));
6955
6956 FEM_ENGINES_PKG.TECH_MESSAGE
6957 (c_log_level_1,c_block||'.'||c_proc_name||'.member display code'
6958 ,ta_member_dc(j));
6959
6960 FEM_ENGINES_PKG.TECH_MESSAGE
6961 (c_log_level_1,c_block||'.'||c_proc_name||'.value_set display code'
6962 ,ta_value_set_dc(j));
6963
6964 FEM_ENGINES_PKG.TECH_MESSAGE
6965 (c_log_level_1,c_block||'.'||c_proc_name||'.value_set_id'
6966 ,ta_value_set_id(j));
6967
6968 FEM_ENGINES_PKG.TECH_MESSAGE
6969 (c_log_level_1,c_block||'.'||c_proc_name||'.member_id'
6970 ,ta_member_id(j));
6971
6972
6973 -- Check if the attribute assignment exists for any version
6974 IF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'Y' ) THEN
6975 EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6976 INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6977 USING ta_attribute_id(j)
6978 ,ta_member_id(j)
6979 ,ta_value_set_id(j);
6980 ELSIF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'N' ) THEN
6981 IF p_member_col = p_member_dc_col THEN
6982 EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6983 INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6984 USING ta_attribute_id(j)
6985 ,ta_member_dc(j);
6986 ELSE
6987 EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6988 INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6989 USING ta_attribute_id(j)
6990 ,ta_member_id(j);
6991
6992 END IF;
6993 ELSE
6994 ta_attr_exists_novers_count(j) := 0;
6995 END IF; -- value_set_required
6996
6997 -- Check if the attr assignment exists for the specific version
6998 IF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'Y' )
6999 AND (ta_allow_mult_assign_flag(j) = 'N') THEN
7000 EXECUTE IMMEDIATE x_does_attr_exist_stmt
7001 INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7002 USING ta_attribute_id(j)
7003 ,ta_version_id(j)
7004 ,ta_member_id(j)
7005 ,ta_value_set_id(j);
7006
7007 ELSIF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'N' )
7008 AND (ta_allow_mult_assign_flag(j) = 'N') THEN
7009 IF p_member_col = p_member_dc_col THEN
7010
7011 EXECUTE IMMEDIATE x_does_attr_exist_stmt
7012 INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7013 USING ta_attribute_id(j)
7014 ,ta_version_id(j)
7015 ,ta_member_dc(j);
7016 ELSE
7017 EXECUTE IMMEDIATE x_does_attr_exist_stmt
7018 INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7019 USING ta_attribute_id(j)
7020 ,ta_version_id(j)
7021 ,ta_member_id(j);
7022 END IF;
7023 ELSIF (ta_status(j) = 'LOAD')
7024 AND (p_value_set_required_flag = 'Y')
7025 AND (ta_allow_mult_assign_flag(j) = 'Y') THEN
7026
7027 build_does_multattr_exist_stmt (p_target_attr_table
7028 ,p_target_b_table
7029 ,p_member_col
7030 ,p_member_dc_col
7031 ,p_value_set_required_flag
7032 ,ta_attr_value_column_name(j)
7033 ,ta_attr_assign_vs_id(j)
7034 ,x_does_multattr_exist_stmt);
7035
7036 FEM_ENGINES_PKG.TECH_MESSAGE
7037 (c_log_level_1,c_block||'.'||c_proc_name||'.does multattr vs exist stmt'
7038 ,x_does_multattr_exist_stmt);
7039
7040 IF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7041 AND ta_attr_assign_vs_id(j) IS NOT NULL THEN
7042
7043 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7044 INTO ta_multattr_exists_count(j)
7045 USING ta_attribute_id(j)
7046 ,ta_version_id(j)
7047 ,ta_member_id(j)
7048 ,ta_value_set_id(j)
7049 ,ta_dim_attr_numeric_member(j)
7050 ,ta_attr_assign_vs_id(j);
7051
7052 ELSIF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7053 AND ta_attr_assign_vs_id(j) IS NULL THEN
7054
7055 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7056 INTO ta_multattr_exists_count(j)
7057 USING ta_attribute_id(j)
7058 ,ta_version_id(j)
7059 ,ta_member_id(j)
7060 ,ta_value_set_id(j)
7061 ,ta_dim_attr_numeric_member(j);
7062
7063 ELSE
7064 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7065 INTO ta_multattr_exists_count(j)
7066 USING ta_attribute_id(j)
7067 ,ta_version_id(j)
7068 ,ta_member_id(j)
7069 ,ta_value_set_id(j)
7070 ,ta_dim_attr_varchar_member(j);
7071 END IF;
7072
7073 ELSIF (ta_status(j) = 'LOAD')
7074 AND (p_value_set_required_flag = 'N')
7075 AND (ta_allow_mult_assign_flag(j) = 'Y') THEN
7076
7077 build_does_multattr_exist_stmt (p_target_attr_table
7078 ,p_target_b_table
7079 ,p_member_col
7080 ,p_member_dc_col
7081 ,p_value_set_required_flag
7082 ,ta_attr_value_column_name(j)
7083 ,ta_attr_assign_vs_id(j)
7084 ,x_does_multattr_exist_stmt);
7085
7086 FEM_ENGINES_PKG.TECH_MESSAGE
7087 (c_log_level_1,c_block||'.'||c_proc_name||'.does multattr exist stmt'
7088 ,x_does_multattr_exist_stmt);
7089
7090 IF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7091 AND ta_attr_assign_vs_id(j) IS NOT NULL THEN
7092
7093 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7094 INTO ta_multattr_exists_count(j)
7095 USING ta_attribute_id(j)
7096 ,ta_version_id(j)
7097 ,ta_member_id(j)
7098 ,ta_dim_attr_numeric_member(j)
7099 ,ta_attr_assign_vs_id(j);
7100
7101 ELSIF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7102 AND ta_attr_assign_vs_id(j) IS NULL THEN
7103
7104 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7105 INTO ta_multattr_exists_count(j)
7106 USING ta_attribute_id(j)
7107 ,ta_version_id(j)
7108 ,ta_member_id(j)
7109 ,ta_dim_attr_numeric_member(j);
7110
7111 ELSE
7112 EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7113 INTO ta_multattr_exists_count(j)
7114 USING ta_attribute_id(j)
7115 ,ta_version_id(j)
7116 ,ta_member_id(j)
7117 ,ta_dim_attr_varchar_member(j);
7118 END IF;
7119
7120
7121 ELSE
7122 ta_attr_exists_count(j) := 0;
7123 ta_multattr_exists_count(j) := 0;
7124 END IF; -- value_set_required
7125 FEM_ENGINES_PKG.TECH_MESSAGE
7126 (c_log_level_1,c_block||'.'||c_proc_name||'.does_attr_exist'
7127 ,null);
7128
7129 ---------------------------------------------------
7130 -- Bug#5024575
7131 -- 7/6/2006 For Multi-assignment attributes, we can't update,
7132 -- we can only insert. Because of this, when we encounter
7133 -- an assignment that already exists for the specific
7134 -- dim_attribute_numeric_member/varchar_member/vs combination,
7135 -- we update the STATUS as an error.
7136 --
7137 -- In the future, if users decide they don't want this to be
7138 -- an error, we can make a special delete to remove the row
7139 -- from the interface table. The important thing is that we
7140 -- cannot insert (since the key for that assignment already exists)
7141 ---------------------------------------------------
7142 IF ta_status(j) = 'LOAD' THEN
7143 IF (ta_attr_exists_count(j) = 0 AND ta_attr_exists_novers_count(j) > 0
7144 AND ta_allow_mult_assign_flag(j) = 'N') THEN
7145 ta_status(j) := 'MULT_VERSION_NOT_ALLOWED';
7146 ELSIF ta_allow_mult_assign_flag(j) = 'N'
7147 AND ta_protected_assign_flag(j) = 'Y' THEN
7148 ta_status(j) := 'PROTECTED_ATTR_ASSIGN';
7149 ELSIF ta_allow_mult_assign_flag(j) = 'Y'
7150 AND ta_multattr_exists_count(j) >0 THEN
7151 ta_status(j) := 'DUPLICATE_MULTI_ASSIGN';
7152 END IF;
7153 END IF;
7154
7155 ----------------------------------------------------------------------
7156 --Bug#3925655 For assignment_is_read_only_flag='Y' attributes,
7157 -- we need to identify if the assignment coming from the interface
7158 -- table is identical to the existing assignment. If it is, we want
7159 -- to go ahead and let it update.
7160 -- If it is not identical, we want to mark the row with an ERROR status
7161 ----------------------------------------------------------------------
7162 IF (ta_status(j) = 'LOAD') AND (ta_read_only_flag(j) = 'Y') THEN
7163 FEM_ENGINES_PKG.TECH_MESSAGE
7164 (c_log_level_1,c_block||'.'||c_proc_name||'.identical attr select stmt'
7165 ,x_identical_attr_select_stmt);
7166
7167 FEM_ENGINES_PKG.TECH_MESSAGE
7168 (c_log_level_1,c_block||'.'||c_proc_name||'.dim_attr_numeric'
7169 ,ta_dim_attr_numeric_member(j));
7170 FEM_ENGINES_PKG.TECH_MESSAGE
7171 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_assign_vs'
7172 ,ta_attr_assign_vs_id(j));
7173 FEM_ENGINES_PKG.TECH_MESSAGE
7174 (c_log_level_1,c_block||'.'||c_proc_name||'.dim_attr_varchar'
7175 ,ta_dim_attr_varchar_member(j));
7176 FEM_ENGINES_PKG.TECH_MESSAGE
7177 (c_log_level_1,c_block||'.'||c_proc_name||'.number_assign'
7178 ,ta_number_assign_value(j));
7179 FEM_ENGINES_PKG.TECH_MESSAGE
7180 (c_log_level_1,c_block||'.'||c_proc_name||'.varchar_assign'
7181 ,ta_varchar_assign_value(j));
7182 FEM_ENGINES_PKG.TECH_MESSAGE
7183 (c_log_level_1,c_block||'.'||c_proc_name||'.date_assign'
7184 ,to_char(ta_temp_date_assign_value(j),'YYYY/MM/DD'));
7185
7186 -- we use a temp variable to handle the case where
7187 -- we have set the date_assign_value to 2499/12/31
7188
7189 IF (p_value_set_required_flag = 'Y' ) THEN
7190 EXECUTE IMMEDIATE x_identical_attr_select_stmt
7191 INTO ta_attr_identical_count(j)
7192 USING ta_attribute_id(j)
7193 ,ta_version_id(j)
7194 ,ta_value_set_dc(j)
7195 ,ta_member_dc(j)
7196 ,ta_dim_attr_numeric_member(j)
7197 ,ta_dim_attr_numeric_member(j)
7198 ,ta_dim_attr_numeric_member(j)
7199 ,ta_attr_assign_vs_id(j)
7200 ,ta_attr_assign_vs_id(j)
7201 ,ta_attr_assign_vs_id(j)
7202 ,ta_dim_attr_varchar_member(j)
7203 ,ta_dim_attr_varchar_member(j)
7204 ,ta_dim_attr_varchar_member(j)
7205 ,ta_number_assign_value(j)
7206 ,ta_number_assign_value(j)
7207 ,ta_number_assign_value(j)
7208 ,ta_varchar_assign_value(j)
7209 ,ta_varchar_assign_value(j)
7210 ,ta_varchar_assign_value(j)
7211 ,ta_temp_date_assign_value(j)
7212 ,ta_temp_date_assign_value(j)
7213 ,ta_temp_date_assign_value(j);
7214
7215 ELSIF (p_value_set_required_flag = 'N' ) THEN
7216 EXECUTE IMMEDIATE x_identical_attr_select_stmt
7217 INTO ta_attr_identical_count(j)
7218 USING ta_attribute_id(j)
7219 ,ta_version_id(j)
7220 ,ta_member_dc(j)
7221 ,ta_dim_attr_numeric_member(j)
7222 ,ta_dim_attr_numeric_member(j)
7223 ,ta_dim_attr_numeric_member(j)
7224 ,ta_attr_assign_vs_id(j)
7225 ,ta_attr_assign_vs_id(j)
7226 ,ta_attr_assign_vs_id(j)
7227 ,ta_dim_attr_varchar_member(j)
7228 ,ta_dim_attr_varchar_member(j)
7229 ,ta_dim_attr_varchar_member(j)
7230 ,ta_number_assign_value(j)
7231 ,ta_number_assign_value(j)
7232 ,ta_number_assign_value(j)
7233 ,ta_varchar_assign_value(j)
7234 ,ta_varchar_assign_value(j)
7235 ,ta_varchar_assign_value(j)
7236 ,ta_temp_date_assign_value(j)
7237 ,ta_temp_date_assign_value(j)
7238 ,ta_temp_date_assign_value(j);
7239 END IF; -- value_set_required
7240
7241 FEM_ENGINES_PKG.TECH_MESSAGE
7242 (c_log_level_1,c_block||'.'||c_proc_name||'.identical_count'
7243 ,ta_attr_identical_count(j));
7244
7245 IF ta_attr_identical_count(j) = 0 THEN
7246 ta_status(j) := 'READ_ONLY_ATTRIBUTE';
7247 END IF;
7248 END IF; -- read_only_flag validation
7249 ------------------------------------------------------------------
7250 ELSIF ta_member_read_only_flag(j) = 'Y'
7251 AND ta_status(j) = 'LOAD' THEN
7252 BEGIN
7253 ta_status(j) := 'MEMBER_IS_READ_ONLY';
7254 ta_attr_exists_count(j) := 1;
7255 END;
7256 END IF; -- Member_read_only_flag = 'N'
7257
7258
7259 -- Count the error rows
7260 IF ta_status(j) <> 'LOAD' THEN
7261 v_temp_rows_rejected := v_temp_rows_rejected + 1;
7262 END IF;
7263
7264 FEM_ENGINES_PKG.TECH_MESSAGE
7265 (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected'
7266 ,v_temp_rows_rejected);
7267
7268 END LOOP; -- attr_validations
7269 FEM_ENGINES_PKG.TECH_MESSAGE
7270 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_validation'
7271 ,'end');
7272
7273 /*********************************************************
7274 Commented Out per bug#4030717
7275 ---------------------------------------------------------------------
7276 -- Overlap Date checks
7277 -- we loop over the entire attribute array one final time
7278 -- looking for start/end date ranges that conflict
7279 ---------------------------------------------------------------------
7280 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
7281 v_attr_count := 1;
7282 WHILE v_attr_count <= v_attr_last_row
7283 LOOP
7284 FEM_ENGINES_PKG.TECH_MESSAGE
7285 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_varchar_label'
7286 ,ta_attribute_varchar_label(v_attr_count));
7287
7288 FEM_ENGINES_PKG.TECH_MESSAGE
7289 (c_log_level_1,c_block||'.'||c_proc_name||'.status'
7290 ,ta_status(v_attr_count));
7291
7292 FEM_ENGINES_PKG.TECH_MESSAGE
7293 (c_log_level_1,c_block||'.'||c_proc_name||'.adj_period_flag'
7294 ,ta_adj_period_flag(v_attr_count));
7295
7296 v_attr_subcount := v_attr_count + 1; -- we always check 1 lower than
7297 -- current position
7298 IF ta_attribute_varchar_label(v_attr_count) = 'CAL_PERIOD_START_DATE' AND
7299 ta_status(v_attr_count) = 'LOAD' AND
7300 ta_adj_period_flag(v_attr_count) = 'N' THEN
7301 WHILE v_attr_subcount <= v_attr_last_row AND
7302 ta_status(v_attr_count) = 'LOAD' LOOP
7303 IF ta_adj_period_flag(v_attr_subcount) = 'N'
7304 AND ta_attribute_varchar_label(v_attr_subcount) = 'CAL_PERIOD_START_DATE'
7305 AND ((ta_date_assign_value(v_attr_subcount) <=
7306 ta_date_assign_value(v_attr_count)
7307 AND ta_cal_period_end_date(v_attr_subcount) >=
7308 ta_date_assign_value(v_attr_count))
7309 OR (ta_date_assign_value(v_attr_subcount) >=
7310 ta_date_assign_value(v_attr_count)
7311 AND ta_date_assign_value(v_attr_subcount) <=
7312 ta_cal_period_end_date(v_attr_count)))
7313 THEN
7314 ta_status(v_attr_count) := 'OVERLAP_START_DATE_IN_LOAD';
7315 ta_status(v_attr_subcount) := 'OVERLAP_START_DATE_IN_LOAD';
7316 v_temp_rows_rejected := v_temp_rows_rejected + 2;
7317 END IF;
7318 v_attr_subcount := v_attr_subcount + 1;
7319 END LOOP;
7320 END IF; -- label = 'CAL_PERIOD_START_DATE' and status = 'LOAD'
7321 v_attr_count := v_attr_count + 1;
7322 END LOOP;
7323 END IF; -- overlap check for CAL_PERIOD
7324 ******************************************************************/
7325
7326 -----------------------------------------------------------------
7327 -- Update existing ATTR rows
7328 -- Note: Only attributes where "allow_multiple_assign_flag" = 'N'
7329 -- are updated. For many to many attributes, only inserts are performed.
7330 -- Also - only attributes marked with "use_interim_table_flag = 'N' are
7331 -- updated in this step.
7332 -- Attributes with use_interim_table_flag = 'Y' are put into an interim
7333 -- table for further processing
7334 -----------------------------------------------------------------
7335 IF (p_value_set_required_flag = 'Y') THEN
7336
7337 FORALL j IN 1..v_attr_last_row
7338 EXECUTE IMMEDIATE x_attr_update_stmt
7339 USING ta_dim_attr_numeric_member(j)
7340 ,ta_attr_assign_vs_id(j)
7341 ,ta_dim_attr_varchar_member(j)
7342 ,ta_number_assign_value(j)
7343 ,ta_varchar_assign_value(j)
7344 ,ta_temp_date_assign_value(j)
7345 ,gv_apps_user_id
7346 ,gv_login_id
7347 ,ta_member_id(j)
7348 ,ta_value_set_id(j)
7349 ,ta_attribute_id(j)
7350 ,ta_version_id(j)
7351 ,ta_allow_mult_assign_flag(j)
7352 ,ta_attr_exists_count(j)
7353 ,ta_status(j);
7354 ELSE
7355 IF p_member_col = p_member_dc_col THEN
7356 FORALL j IN 1..v_attr_last_row
7357 EXECUTE IMMEDIATE x_attr_update_stmt
7358 USING ta_dim_attr_numeric_member(j)
7359 ,ta_attr_assign_vs_id(j)
7360 ,ta_dim_attr_varchar_member(j)
7361 ,ta_number_assign_value(j)
7362 ,ta_varchar_assign_value(j)
7363 ,ta_temp_date_assign_value(j)
7364 ,gv_apps_user_id
7365 ,gv_login_id
7366 ,ta_member_dc(j)
7367 ,ta_attribute_id(j)
7368 ,ta_version_id(j)
7369 ,ta_allow_mult_assign_flag(j)
7370 ,ta_attr_exists_count(j)
7371 ,ta_status(j)
7372 ,ta_use_interim_table_flag(j);
7373 ELSE
7374 FORALL j IN 1..v_attr_last_row
7375 EXECUTE IMMEDIATE x_attr_update_stmt
7376 USING ta_dim_attr_numeric_member(j)
7377 ,ta_attr_assign_vs_id(j)
7378 ,ta_dim_attr_varchar_member(j)
7379 ,ta_number_assign_value(j)
7380 ,ta_varchar_assign_value(j)
7381 ,ta_temp_date_assign_value(j)
7382 ,gv_apps_user_id
7383 ,gv_login_id
7384 ,ta_member_id(j)
7385 ,ta_attribute_id(j)
7386 ,ta_version_id(j)
7387 ,ta_allow_mult_assign_flag(j)
7388 ,ta_attr_exists_count(j)
7389 ,ta_status(j)
7390 ,ta_use_interim_table_flag(j);
7391
7392 END IF;
7393 END IF;
7394
7395 -- insert rows into the INTERIM tables
7396 -- for CAL_PERIOD loads for date overlap
7397 -- checks
7398 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
7399 -- Insert a row into the interim table for each
7400 -- Calendar Period member that has an assignment
7401 -- for the CALENDAR_PERIOD_START_DATE attribute
7402 -- in the array (such rows have been marked with
7403 -- use_interim_table_flag = 'Y'
7404 FORALL j IN 1 .. v_attr_last_row
7405 EXECUTE IMMEDIATE x_calp_interim_stmt
7406 USING ta_cal_period_end_date(j)
7407 ,ta_cal_period_number(j)
7408 ,ta_calendar_dc(j)
7409 ,ta_dimension_group_dc(j)
7410 ,ta_date_assign_value(j)
7411 ,ta_member_dc(j)
7412 ,ta_dimension_group_id(j)
7413 ,ta_calendar_id(j)
7414 ,'' -- this is cal period name
7415 ,'' -- this is cal period desc
7416 ,ta_adj_period_flag(j)
7417 ,ta_use_interim_table_flag(j)
7418 ,ta_status(j);
7419
7420 -- insert a row into the CALP_ATTR Interim table for each
7421 -- assignment row where the attribute = CALENDAR_PERIOD_START_DATE
7422 -- (such rows have been marked with use_interim_table_flag = 'Y')
7423 FORALL j IN 1..v_attr_last_row
7424 EXECUTE IMMEDIATE x_calp_attr_interim_stmt
7425 USING ta_member_dc(j)
7426 ,ta_attribute_id(j)
7427 ,ta_version_id(j)
7428 ,'' --dim_attr_numeric_member
7429 ,'' --attr_assign_vs_id
7430 ,'' --dim_attr_varchar_member(j)
7431 ,'' --number_assign_value
7432 ,'' -- varchar_assign_value
7433 ,ta_date_assign_value(j)
7434 ,ta_use_interim_table_flag(j)
7435 ,ta_status(j);
7436
7437 END IF;
7438
7439 ----------------------------------------------------------------
7440 -- Delete records that successfully updated
7441 ----------------------------------------------------------------
7442 FEM_ENGINES_PKG.TECH_MESSAGE
7443 (c_log_level_1,c_block||'.'||c_proc_name||'.prior_to_special_delete'
7444 ,null);
7445
7446 FORALL j IN 1..v_attr_last_row
7447 EXECUTE IMMEDIATE x_special_delete_attr_stmt
7448 USING ta_rowid(j)
7449 ,ta_allow_mult_assign_flag(j)
7450 ,ta_attr_exists_count(j)
7451 ,ta_status(j)
7452 ,ta_use_interim_table_flag(j);
7453
7454 -----------------------------------------------------------------
7455 -- Copy ATTR Collection for good members in prep for insert later
7456 -- This final collection only includes multi-assign attributes
7457 -- (where it doesn't matter whether or not an assignment exists
7458 -- for any version or for the specific version being loaded)
7459 -- and non-multi-assign attributes where assignment rows do not
7460 -- exist for either the specific version being loaded, or any other
7461 -- version
7462 -- NOTE: By definition, this insert collection does NOT include
7463 -- the CALENDAR_PERIOD_START_DATE attribute rows, since
7464 -- that attribute is non-multi assign. This means that
7465 -- we don't have to worry about checking the use_interim_table_flag='Y'
7466 -- condition at this time. In the future, if additional attributes
7467 -- appear that require an Interim table for processing, we can
7468 -- modify this insert to include recognition of that flag
7469 -----------------------------------------------------------------
7470 v_attr_last_row := ta_attribute_id.LAST;
7471 v_attr_count := 1;
7472
7473 FEM_ENGINES_PKG.TECH_MESSAGE
7474 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_final_count'
7475 ,v_attr_final_count);
7476 FEM_ENGINES_PKG.TECH_MESSAGE
7477 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_count'
7478 ,v_attr_count);
7479 FEM_ENGINES_PKG.TECH_MESSAGE
7480 (c_log_level_1,c_block||'.'||c_proc_name||'.attr_last_row'
7481 ,v_attr_last_row);
7482
7483
7484 WHILE v_attr_count <= v_attr_last_row
7485 LOOP
7486 IF ( (ta_status(v_attr_count) = 'LOAD'
7487 AND ta_attr_exists_count(v_attr_count) >= 0
7488 AND ta_attr_exists_novers_count(v_attr_count) > 0
7489 AND ta_allow_mult_assign_flag(v_attr_count) = 'Y') OR
7490 (ta_status(v_attr_count) = 'LOAD'
7491 AND ta_attr_exists_count(v_attr_count) = 0
7492 AND ta_attr_exists_novers_count(v_attr_count) = 0) ) THEN
7493
7494 v_attr_final_count := v_attr_final_count + 1;
7495
7496 tfa_rowid(v_attr_final_count) := ta_rowid(v_attr_count);
7497 tfa_attribute_id(v_attr_final_count) := ta_attribute_id(v_attr_count);
7498 tfa_member_dc(v_attr_final_count) := ta_member_dc(v_attr_count);
7499 tfa_value_set_dc(v_attr_final_count) := ta_value_set_dc(v_attr_count);
7500 tfa_dim_attr_numeric_member(v_attr_final_count) := ta_dim_attr_numeric_member(v_attr_count);
7501 tfa_dim_attr_varchar_member(v_attr_final_count) := ta_dim_attr_varchar_member(v_attr_count);
7502 tfa_number_assign_value(v_attr_final_count) := ta_number_assign_value(v_attr_count);
7503 tfa_varchar_assign_value(v_attr_final_count) := ta_varchar_assign_value(v_attr_count);
7504 tfa_date_assign_value(v_attr_final_count) := ta_temp_date_assign_value(v_attr_count);
7505 tfa_version_id(v_attr_final_count) := ta_version_id(v_attr_count);
7506 tfa_attr_assign_vs_id(v_attr_final_count) := ta_attr_assign_vs_id(v_attr_count);
7507 tfa_status(v_attr_final_count) := ta_status(v_attr_count);
7508
7509 END IF; -- Copy ATTR for good members
7510 v_attr_count := v_attr_count + 1;
7511 END LOOP; -- WHILE loop
7512
7513 FEM_ENGINES_PKG.TECH_MESSAGE
7514 (c_log_level_1,c_block||'.'||c_proc_name||'.after_the_copy'
7515 ,null);
7516
7517 FEM_ENGINES_PKG.TECH_MESSAGE
7518 (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_final_count'
7519 ,v_attr_final_count);
7520
7521 ----------------------------------------------------------
7522 -- Update Status of ATTR Collection for failed records
7523 ----------------------------------------------------------
7524 FORALL j IN 1..v_attr_last_row
7525 EXECUTE IMMEDIATE x_update_attr_status_stmt
7526 USING ta_status(j)
7527 ,ta_rowid(j)
7528 ,ta_status(j);
7529
7530 FEM_ENGINES_PKG.TECH_MESSAGE
7531 (c_log_level_1,c_block||'.'||c_proc_name||'.after_status_update'
7532 ,null);
7533
7534 ---------------------------------------------------------
7535 -- Insert attributes for the good dimension members
7536 ---------------------------------------------------------
7537 IF (p_value_set_required_flag = 'Y') THEN
7538 FORALL j IN 1..v_attr_final_count
7539 EXECUTE IMMEDIATE x_insert_attr_stmt
7540 USING tfa_attribute_id(j)
7541 ,tfa_version_id(j)
7542 ,tfa_dim_attr_numeric_member(j)
7543 ,tfa_attr_assign_vs_id(j)
7544 ,tfa_dim_attr_varchar_member(j)
7545 ,tfa_number_assign_value(j)
7546 ,tfa_varchar_assign_value(j)
7547 ,tfa_date_assign_value(j)
7548 ,gv_apps_user_id
7549 ,gv_apps_user_id
7550 ,tfa_member_dc(j)
7551 ,tfa_value_set_dc(j)
7552 ,tfa_status(j);
7553 ELSE
7554 FORALL j IN 1..v_attr_final_count
7555 EXECUTE IMMEDIATE x_insert_attr_stmt
7556 USING tfa_attribute_id(j)
7557 ,tfa_version_id(j)
7558 ,tfa_dim_attr_numeric_member(j)
7559 ,tfa_attr_assign_vs_id(j)
7560 ,tfa_dim_attr_varchar_member(j)
7561 ,tfa_number_assign_value(j)
7562 ,tfa_varchar_assign_value(j)
7563 ,tfa_date_assign_value(j)
7564 ,gv_apps_user_id
7565 ,gv_apps_user_id
7566 ,tfa_member_dc(j)
7567 ,tfa_status(j);
7568 END IF; -- v_value_set_required = 'Y'
7569
7570 ----------------------------------------------------------
7571 -- Count the loaded rows and error rows
7572 ----------------------------------------------------------
7573 v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
7574 --x_rows_loaded := x_rows_loaded + (v_attr_last_row - v_temp_rows_rejected);
7575 v_temp_rows_rejected := 0; -- initialize for next pass of the loop
7576
7577 FEM_ENGINES_PKG.TECH_MESSAGE
7578 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
7579 ,v_rows_rejected);
7580
7581 ----------------------------------------------------------------
7582 -- Delete Loaded records and clear Collections for Next Bulk Fetch
7583 ----------------------------------------------------------------
7584 FORALL j IN 1..v_attr_final_count
7585 EXECUTE IMMEDIATE x_delete_attr_stmt
7586 USING tfa_rowid(j)
7587 ,tfa_status(j)
7588 ,ta_use_interim_table_flag(j);
7589
7590 tfa_rowid.DELETE;
7591 tfa_attribute_id.DELETE;
7592 tfa_member_dc.DELETE;
7593 tfa_value_set_dc.DELETE;
7594 tfa_dim_attr_numeric_member.DELETE;
7595 tfa_dim_attr_varchar_member.DELETE;
7596 tfa_number_assign_value.DELETE;
7597 tfa_varchar_assign_value.DELETE;
7598 tfa_date_assign_value.DELETE;
7599 tfa_version_id.DELETE;
7600 tfa_attr_assign_vs_id.DELETE;
7601 tfa_status.DELETE;
7602
7603 ta_rowid.DELETE;
7604 ta_member_read_only_flag.DELETE;
7605 ta_attribute_id.DELETE;
7606 ta_attribute_varchar_label.DELETE;
7607 ta_attribute_dimension_id.DELETE;
7608 ta_attr_value_column_name.DELETE;
7609 ta_attribute_data_type_code.DELETE;
7610 ta_attribute_required_flag.DELETE;
7611 ta_read_only_flag.DELETE;
7612 ta_allow_mult_assign_flag.DELETE;
7613 ta_member_dc.DELETE;
7614 ta_value_set_dc.DELETE;
7615 ta_attribute_assign_value.DELETE;
7616 ta_dim_attr_numeric_member.DELETE;
7617 ta_dim_attr_varchar_member.DELETE;
7618 ta_number_assign_value.DELETE;
7619 ta_varchar_assign_value.DELETE;
7620 ta_date_assign_value.DELETE;
7621 ta_temp_date_assign_value.DELETE;
7622 ta_version_display_code.DELETE;
7623 ta_version_id.DELETE;
7624 ta_language.DELETE;
7625 ta_attr_assign_vs_dc.DELETE;
7626 ta_attr_assign_vs_id.DELETE;
7627 ta_status.DELETE;
7628 ta_attr_exists_count.DELETE;
7629 ta_multattr_exists_count.DELETE;
7630 ta_attr_identical_count.DELETE;
7631 ta_cal_period_end_date.DELETE;
7632 ta_adj_period_flag.DELETE;
7633 ta_use_interim_table_flag.DELETE;
7634 ta_cal_period_number.DELETE;
7635 ta_calendar_dc.DELETE;
7636 ta_calendar_id.DELETE;
7637 ta_protected_assign_flag.DELETE;
7638 ta_dimension_group_dc.DELETE;
7639 ta_dimension_group_id.DELETE;
7640 ta_calpattr_cal_dc.DELETE;
7641 ta_calpattr_dimgrp_dc.DELETE;
7642 ta_calpattr_end_date.DELETE;
7643 ta_calpattr_period_num.DELETE;
7644 ta_member_id.DELETE;
7645 ta_value_set_id.DELETE;
7646
7647
7648
7649 COMMIT;
7650 END LOOP; -- attribute loop
7651
7652 FEM_Multi_Proc_Pkg.Post_Data_Slice(
7653 p_req_id => p_master_request_id,
7654 p_slc_id => v_slc_id,
7655 p_status => v_mp_status,
7656 p_message => v_mp_message,
7657 p_rows_processed => 0,
7658 p_rows_loaded => 0,
7659 p_rows_rejected => v_rows_rejected);
7660
7661 END LOOP; -- get_data_slice
7662 IF cv_get_attr_rows%ISOPEN THEN
7663 CLOSE cv_get_attr_rows;
7664 END IF;
7665 --x_rows_rejected := v_rows_rejected;
7666
7667 FEM_ENGINES_PKG.TECH_MESSAGE
7668 (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
7669
7670 EXCEPTION
7671 WHEN OTHERS THEN
7672 IF cv_get_attr_rows%ISOPEN THEN
7673 CLOSE cv_get_attr_rows;
7674 END IF;
7675
7676 --x_status:= 2;
7677 --x_message := 'COMPLETE:ERROR';
7678
7679 gv_prg_msg := sqlerrm;
7680 gv_callstack := dbms_utility.format_call_stack;
7681
7682 FEM_ENGINES_PKG.TECH_MESSAGE
7683 (p_severity => c_log_level_6
7684 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
7685 ,p_msg_text => gv_prg_msg);
7686
7687 FEM_ENGINES_PKG.TECH_MESSAGE
7688 (p_severity => c_log_level_6
7689 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
7690 ,p_msg_text => gv_callstack);
7691
7692 FEM_ENGINES_PKG.USER_MESSAGE
7693 (p_app_name => c_fem
7694 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
7695 ,P_TOKEN1 => 'ERR_MSG'
7696 ,P_VALUE1 => gv_prg_msg);
7697
7698
7699 -- FEM_ENGINES_PKG.USER_MESSAGE
7700 -- (p_app_name => c_fem
7701 -- ,p_msg_text => gv_prg_msg);
7702
7703 RAISE e_main_terminate;
7704
7705
7706 END Attr_Assign_Update;
7707
7708 /*===========================================================================+
7709 | PROCEDURE
7710 | Src_Sys_select_stmt
7711 |
7712 | DESCRIPTION
7713 | Identifies the Source System Codes for the load
7714 | specifically, for the purposes of updating FEM_DIM_LOAD_STATUS
7715 | after the load is complete
7716 | SCOPE - PRIVATE
7717 |
7718 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7719 |
7720 | ARGUMENTS : IN:
7721 |
7722 |
7723 | OUT:
7724 |
7725 | IN/ OUT:
7726 |
7727 | RETURNS : NONE
7728 |
7729 | NOTES
7730 |
7731 |
7732 | MODIFICATION HISTORY
7733 | Rob Flippo 8-MAR-04 Created
7734 | Rob Flippo 31-JAN-05 Added where condition on dimension_varchar_label
7735 | for dimensions that use the shared ATTR_T table
7736 |
7737 +===========================================================================*/
7738
7739 procedure build_src_sys_select_stmt (p_dimension_varchar_label IN VARCHAR2
7740 ,p_source_attr_table IN VARCHAR2
7741 ,p_shared_dimension_flag IN VARCHAR2
7742 ,x_src_sys_select_stmt OUT NOCOPY VARCHAR2)
7743 IS
7744
7745 v_dim_label_where_cond VARCHAR2(1000);
7746
7747 BEGIN
7748 IF p_shared_dimension_flag = 'Y' THEN
7749 v_dim_label_where_cond :=
7750 ' AND dimension_varchar_label = '''||p_dimension_varchar_label||'''';
7751 ELSE
7752 v_dim_label_where_cond := '';
7753 END IF;
7754
7755
7756 x_src_sys_select_stmt := 'SELECT DISTINCT(attribute_assign_value)'||
7757 ' FROM '||p_source_attr_table||
7758 ' WHERE attribute_varchar_label = ''SOURCE_SYSTEM_CODE'''||
7759 v_dim_label_where_cond;
7760
7761 END build_src_sys_select_stmt;
7762
7763
7764 /*===========================================================================+
7765 | PROCEDURE
7766 | LOAD_DIM_GROUPS
7767 |
7768 | DESCRIPTION
7769 | Creates new and updates existing Dimension Groups from the
7770 | interface tables
7771 |
7772 | SCOPE - PUBLIC
7773 |
7774 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7775 |
7776 | ARGUMENTS : IN:
7777 |
7778 |
7779 | OUT:
7780 |
7781 |
7782 |
7783 | IN/ OUT:
7784 |
7785 | RETURNS : NONE
7786 |
7787 | NOTES
7788 | The Dimension Group Loader has 5 main categories of records for loading. These are:
7789 | 1) Bad New Groups
7790 | 2) New Groups
7791 | 3) Existing Groups for name/desc update
7792 | 4) Remaining Groups for base table update
7793 | 5) Groups that exist but for a different Dimension_ID
7794 |
7795 | The records that belong in each of the above categories are described
7796 | in detail below in the Introduction to each section.
7797 |
7798 | For each step, the following sub-steps are involved:
7799 | a) BULK Collect members for the category
7800 | b) Validate (if necessary)
7801 | c) Update _B_T or _TL_T table for invalid records
7802 | d) Update/insert FEM with the new record (or new name/description)
7803 | e) Delete records from _B_T or _TL_T tables where appropriate
7804 |
7805 |
7806 | MODIFICATION HISTORY
7807 | Rob Flippo 10-NOV-03 Created
7808 |
7809 +===========================================================================*/
7810
7811
7812
7813
7814 /*===========================================================================+
7815 | PROCEDURE
7816 | get_dimension_info
7817 |
7818 | DESCRIPTION
7819 | Validates the inputs and obtains object and column names
7820 | for the dimension
7821 |
7822 | SCOPE - PRIVATE
7823 |
7824 | NOTES
7825 |
7826 |
7827 |
7828 |
7829 | MODIFICATION HISTORY
7830 | Rob Flippo 21-OCT-03 Created
7831 | Rob Flippo 12-JAN-05 Bug#4030756 Retieve interface table names
7832 | from fem_xdim_dimensions metadata rather than
7833 | rely on naming convention
7834 | Rob Flippo 16-MAR-05 Bug#4244082 properly identify dimensions that have
7835 | dimension_group_id on their tables
7836 | Previously, the hier_dimension_flag designated
7837 | if the dim had a HIER table or not. Now it
7838 | designates that the dim uses dimension_groups.
7839 | -- p_simple_dimension_flag now means no attributes
7840 | (as opposed to no hierarchies and no attributes)
7841 | so it will not necessarily match what is in the table
7842 +===========================================================================*/
7843
7844 procedure get_dimension_info (p_dimension_varchar_label IN VARCHAR2
7845 ,x_dimension_id OUT NOCOPY NUMBER
7846 ,x_target_b_table OUT NOCOPY VARCHAR2
7847 ,x_target_tl_table OUT NOCOPY VARCHAR2
7848 ,x_target_attr_table OUT NOCOPY VARCHAR2
7849 ,x_source_b_table OUT NOCOPY VARCHAR2
7850 ,x_source_tl_table OUT NOCOPY VARCHAR2
7851 ,x_source_attr_table OUT NOCOPY VARCHAR2
7852 ,x_member_col OUT NOCOPY VARCHAR2
7853 ,x_member_dc_col OUT NOCOPY VARCHAR2
7854 ,x_member_t_dc_col OUT NOCOPY VARCHAR2
7855 ,x_member_name_col OUT NOCOPY VARCHAR2
7856 ,x_member_t_name_col OUT NOCOPY VARCHAR2
7857 ,x_member_description_col OUT NOCOPY VARCHAR2
7858 ,x_value_set_required_flag OUT NOCOPY VARCHAR2
7859 ,x_user_defined_flag OUT NOCOPY VARCHAR2
7860 ,x_simple_dimension_flag OUT NOCOPY VARCHAR2
7861 ,x_shared_dimension_flag OUT NOCOPY VARCHAR2
7862 ,x_hier_table_name OUT NOCOPY VARCHAR2
7863 ,x_hier_dimension_flag OUT NOCOPY VARCHAR2
7864 ,x_member_id_method_code OUT NOCOPY VARCHAR2
7865 ,x_table_handler_name OUT NOCOPY VARCHAR2
7866 ,x_composite_dimension_flag OUT NOCOPY VARCHAR2 --
7867 ,x_structure_id OUT NOCOPY NUMBER) --
7868 IS
7869 v_hierarchy_table_name VARCHAR2(30);
7870 v_use_groups_flag VARCHAR2(1);
7871 v_hier_editor_managed_flag VARCHAR2(1);
7872 v_xdim_read_only_flag VARCHAR2(1);
7873
7874
7875 BEGIN
7876
7877 FEM_ENGINES_PKG.TECH_MESSAGE
7878 (c_log_level_2,c_block||'.'||'get_dimension_info','Begin');
7879
7880 SELECT dimension_id
7881 ,member_b_table_name
7882 ,member_tl_table_name
7883 ,attribute_table_name
7884 ,intf_member_b_table_name
7885 ,intf_member_tl_table_name
7886 ,intf_attribute_table_name
7887 ,member_col
7888 ,member_display_code_col
7889 ,member_name_col
7890 ,member_description_col
7891 ,value_set_required_flag
7892 ,user_defined_flag
7893 ,hierarchy_table_name
7894 ,decode(group_use_code,'OPTIONAL','Y','REQUIRED','Y','N')
7895 ,hier_editor_managed_flag
7896 ,read_only_flag
7897 ,member_id_method_code
7898 ,SUBSTR(member_b_table_name,1,length(member_b_table_name)-2)||'_PKG'
7899 ,composite_dimension_flag --
7900 ,id_flex_num --
7901 INTO x_dimension_id
7902 ,x_target_b_table
7903 ,x_target_tl_table
7904 ,x_target_attr_table
7905 ,x_source_b_table
7906 ,x_source_tl_table
7907 ,x_source_attr_table
7908 ,x_member_col
7909 ,x_member_dc_col
7910 ,x_member_name_col
7911 ,x_member_description_col
7912 ,x_value_set_required_flag
7913 ,x_user_defined_flag
7914 ,x_hier_table_name
7915 ,v_use_groups_flag
7916 ,v_hier_editor_managed_flag
7917 ,v_xdim_read_only_flag
7918 ,x_member_id_method_code
7919 ,x_table_handler_name
7920 ,x_composite_dimension_flag --
7921 ,x_structure_id
7922 FROM fem_xdim_dimensions_vl
7923 WHERE dimension_varchar_label = p_dimension_varchar_label;
7924
7925 IF x_source_b_table = 'FEM_SIMPLE_DIMS_B_T' THEN
7926 x_shared_dimension_flag := 'Y';
7927 x_member_t_dc_col := 'MEMBER_CODE';
7928 x_member_t_name_col := 'MEMBER_NAME';
7929
7930 ELSE x_shared_dimension_flag := 'N';
7931 x_member_t_dc_col := x_member_dc_col;
7932 x_member_t_name_col := x_member_name_col;
7933
7934 END IF;
7935
7936 IF x_target_attr_table IS NULL THEN
7937 x_simple_dimension_flag := 'Y';
7938 ELSE x_simple_dimension_flag := 'N';
7939 END IF;
7940
7941 x_hier_dimension_flag := v_use_groups_flag; --bug#4244082 use_groups_flag
7942 -- instead of hier_dim_flag
7943
7944 /**********************************************************
7945 Obsolete because we have use_groups_flag logic instead
7946 due to bug#4244082
7947 IF v_hierarchy_table_name IS NOT NULL THEN
7948 x_hier_dimension_flag := 'Y';
7949 ELSE
7950 x_hier_dimension_flag := 'N';
7951 END IF;
7952 *******************/
7953
7954 FEM_ENGINES_PKG.TECH_MESSAGE
7955 (c_log_level_2,c_block||'.'||'get_dimension_info','End');
7956
7957 EXCEPTION
7958 WHEN no_data_found THEN
7959 RAISE e_dimension_not_found;
7960 --p_Err_Code := 2;
7961 --p_Err_Msg := G_DIM_NOT_FOUND;
7962
7963
7964 END get_dimension_info;
7965
7966
7967
7968 /*===========================================================================+
7969 | PROCEDURE
7970 | build_mbr_select_stmt
7971 |
7972 | DESCRIPTION
7973 | Builds the dynamic SELECT statement for retrieving
7974 | the member data from the _T interface tables
7975 |
7976 | SCOPE - PRIVATE
7977 |
7978 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7979 |
7980 | NOTES
7981 |
7982 |
7983 |
7984 |
7985 | MODIFICATION HISTORY
7986 | Rob Flippo 22-OCT-03 Created
7987 | Rob Flippo 08-SEP-04 Added where condition exists = 'Y' query so that
7988 | when querying from the TL_T table, only rows of
7989 | installed languages are retrieved. This is for
7990 | bug#3857097 where it was retrieving rows for all
7991 | languages, trying to update, and when no update row
7992 | found it would just delete the source row
7993 |
7994 | Rob Flippo 08-Sep-04 Bug#3835758 Modified the vs_where_cond so that it
7995 | joins to fem_value_set_b where the dimension_id =
7996 | the dimension being loaded
7997 | Rob Flippo 16-FEB-05 Bug#4189544 DIMENSION GROUP LOADER ISSUE
7998 | add dimension_id where condition when target
7999 | table is fem_dimension_grps_b
8000 | -- also fix so only load grps of the specific dim
8001 | Rob Flippo 10-JUN-05 Bug#3928148 For TL update, only allow updates for
8002 | members that are not read_only_flag = Y
8003 +===========================================================================*/
8004 procedure build_mbr_select_stmt (p_load_type IN VARCHAR2
8005 ,p_dimension_varchar_label IN VARCHAR2
8006 ,p_dimension_id IN NUMBER
8007 ,p_target_b_table IN VARCHAR2
8008 ,p_target_tl_table IN VARCHAR2
8009 ,p_source_b_table IN VARCHAR2
8010 ,p_source_tl_table IN VARCHAR2
8011 ,p_member_dc_col IN VARCHAR2
8012 ,p_member_t_dc_col IN VARCHAR2
8013 ,p_member_t_name_col IN VARCHAR2
8014 ,p_member_description_col IN VARCHAR2
8015 ,p_value_set_required_flag IN VARCHAR2
8016 ,p_shared_dimension_flag IN VARCHAR2
8017 ,p_hier_dimension_flag IN VARCHAR2
8018 ,p_exists_flag IN VARCHAR2
8019 ,p_exec_mode_clause IN VARCHAR2
8020 ,x_select_stmt OUT NOCOPY VARCHAR2)
8021
8022
8023 IS
8024 -- Value Set Where conditions
8025 v_vs_where_cond VARCHAR2(1000);
8026 v_vs_t_where_cond VARCHAR2(1000);
8027 v_vs_table VARCHAR2(1000);
8028 v_vs_col VARCHAR2(1000);
8029 v_vs_subq_where_cond VARCHAR2(1000);
8030 v_vs_subq_table VARCHAR2(1000);
8031 v_data_slice_pred VARCHAR2(100);
8032
8033 -- Dimension Label where condition (for Simple dimensions)
8034 v_dim_label_where_cond VARCHAR2(1000);
8035 v_dim_label_join_cond VARCHAR2(1000);
8036 v_dim_id_where_cond VARCHAR2(1000);
8037
8038 -- Dimension Group Where Conditions (for member loads)
8039 v_dimension_grp_col VARCHAR2(1000);
8040 v_dimension_grp_table VARCHAR2(1000);
8041 v_dimension_grp_where_cond VARCHAR2(1000);
8042
8043 -- Special conditions to handle CAL_PERIOD
8044 v_member_code VARCHAR2(1000);
8045 v_cal_period_cols VARCHAR2(1000);
8046 v_calendar_table VARCHAR2(100);
8047 v_calendar_where_cond VARCHAR2(1000);
8048 v_member_dc_where_cond VARCHAR2(1000);
8049
8050 -- Columns for loading Dimension Groups
8051 v_dimgrp_load_col VARCHAR2(1000);
8052
8053 BEGIN
8054
8055 FEM_ENGINES_PKG.TECH_MESSAGE
8056 (c_log_level_2,c_block||'.'||'build_mbr_select_stmt','Begin Build member select statement');
8057
8058 IF p_value_set_required_flag = 'Y' THEN
8059
8060 v_vs_col := ',B.value_set_display_code, V1.value_set_id ';
8061 v_vs_t_where_cond := ' AND B.value_set_display_code = T.value_set_display_code';
8062
8063 v_vs_table := ', FEM_VALUE_SETS_B V1';
8064 v_vs_where_cond := ' AND B.value_set_display_code = V1.value_set_display_code (+)'||
8065 ' AND V1.dimension_id (+) = '||p_dimension_id;
8066
8067 v_vs_subq_table := ', FEM_VALUE_SETS_B V2';
8068 v_vs_subq_where_cond := ' AND G.value_set_id = V2.value_set_id AND '||
8069 'V2.value_set_display_code = B.value_set_display_code';
8070 ELSE
8071
8072 v_vs_col := ', null, null';
8073 v_vs_t_where_cond := '';
8074
8075 v_vs_table := '';
8076 v_vs_where_cond := '';
8077
8078 v_vs_subq_table := '';
8079 v_vs_subq_where_cond := '';
8080 END IF;
8081
8082 -- setting the Dim Label conditions
8083 IF ((p_value_set_required_flag = 'N'
8084 AND p_shared_dimension_flag = 'Y') OR
8085 (p_load_type = 'DIMENSION_GROUP'))
8086 AND (p_exists_flag = 'N') THEN
8087 v_dim_label_where_cond :=
8088 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8089 v_dim_label_join_cond :=
8090 ' AND B.dimension_varchar_label = T.dimension_varchar_label';
8091 ELSIF ((p_value_set_required_flag = 'N'
8092 AND p_shared_dimension_flag = 'Y') OR
8093 (p_load_type = 'DIMENSION_GROUP'))
8094 AND (p_exists_flag = 'Y') THEN
8095 v_dim_label_where_cond :=
8096 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8097 v_dim_label_join_cond := '';
8098 ELSE
8099 v_dim_label_where_cond := '';
8100 v_dim_label_join_cond := '';
8101
8102 END IF; -- setting the Dim Label conditions
8103
8104 -- Use Dimension Groups only when query for New members from the _B_T table
8105 -- for Hierarchy dimensions
8106 IF (p_hier_dimension_flag = 'Y'
8107 AND p_exists_flag = 'N') OR (p_dimension_varchar_label = 'CAL_PERIOD') THEN
8108 v_dimension_grp_col := ',B.dimension_group_display_code, D.dimension_group_id';
8109 v_dimension_grp_table := ', FEM_DIMENSION_GRPS_B D';
8110 v_dimension_grp_where_cond := ' AND B.dimension_group_display_code = '||
8111 'D.dimension_group_display_code (+) '||
8112 ' AND D.dimension_id (+) = '||p_dimension_id;
8113 ELSE
8114 v_dimension_grp_col := ',null, null';
8115 v_dimension_grp_table := '';
8116 v_dimension_grp_where_cond := '';
8117 END IF;
8118
8119 -- Setting the special conditions for CAL_PERIOD
8120 IF (p_dimension_varchar_label = 'CAL_PERIOD')
8121 AND (p_load_type NOT IN ('DIMENSION_GROUP')) THEN
8122 v_member_code :=
8123 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8124 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8125 'LPAD(to_char(C.calendar_id),5,''0'')||'||
8126 'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8127 v_cal_period_cols := ', C.calendar_display_code, C.calendar_id, B.cal_period_end_date,B.cal_period_number';
8128 v_calendar_table := ', FEM_CALENDARS_VL C';
8129 v_calendar_where_cond := ' AND B.calendar_display_code = C.calendar_display_code (+) ';
8130 v_member_dc_where_cond := ' AND B.calendar_display_code = T.calendar_display_code'||
8131 ' AND B.cal_period_number = T.cal_period_number'||
8132 ' AND B.cal_period_end_date = T.cal_period_end_date'||
8133 ' AND B.dimension_group_display_code = T.dimension_group_display_code';
8134
8135 ELSE
8136 v_member_code := 'B.'||p_member_t_dc_col;
8137 v_cal_period_cols := ',null ,null, null, null';
8138 v_calendar_table := '';
8139 v_calendar_where_cond := '';
8140 v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
8141 '=T.'||p_member_t_dc_col;
8142 END IF; -- p_dimension_varchar_label = 'CAL_PERIOD'
8143
8144 -- Because we load both Dimension Groups and Members using the same
8145 -- dynamic query, we have to allow for the extra columns on FEM_DIMENSION_GRPS_B
8146 IF (p_load_type = 'DIMENSION_GROUP') THEN
8147 v_dimgrp_load_col := ',B.dimension_group_seq, B.time_group_type_code';
8148 v_data_slice_pred := '';
8149 v_dim_id_where_cond := ' AND G.dimension_id ='||p_dimension_id;
8150 ELSE
8151 v_dimgrp_load_col := ',null,null';
8152 v_data_slice_pred := 'AND {{data_slice}} ';
8153 v_dim_id_where_cond := '';
8154 END IF;
8155
8156
8157 IF (p_exists_flag = 'N') THEN
8158 x_select_stmt :=
8159 'SELECT B.rowid'||
8160 ',T.rowid'||
8161 ','||v_member_code||
8162 v_cal_period_cols||
8163 v_vs_col||
8164 v_dimension_grp_col||
8165 ', ''LOAD'' '||
8166 ',T.'||p_member_t_name_col||
8167 ',T.'||p_member_description_col||
8168 ',T.language'||
8169 ', ''LOAD'' '||
8170 ', to_date(''12/31/2499'',''MM/DD/YYYY'')'||
8171 v_dimgrp_load_col||
8172 ' FROM '||p_source_b_table||' B,'||
8173 p_source_tl_table||' T'||
8174 v_dimension_grp_table||
8175 v_vs_table||
8176 v_calendar_table||
8177 ' WHERE B.status'||p_exec_mode_clause||
8178 v_data_slice_pred||
8179 ' AND T.status'||p_exec_mode_clause||
8180 v_member_dc_where_cond||
8181 v_vs_t_where_cond||
8182 v_dim_label_where_cond||
8183 v_dim_label_join_cond||
8184 ' AND NOT EXISTS (SELECT 0 FROM '||
8185 p_target_b_table||' G'||v_vs_subq_table||
8186 ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8187 v_dim_id_where_cond||
8188 v_vs_subq_where_cond||')'||
8189 v_dimension_grp_where_cond||
8190 v_calendar_where_cond||
8191 v_vs_where_cond||
8192 ' AND T.language = userenv(''LANG'')';
8193
8194 ELSE
8195 -- "B" now refers to the TL table
8196 x_select_stmt :=
8197 'SELECT null'||
8198 ',B.rowid'||
8199 ','||v_member_code||
8200 v_cal_period_cols||
8201 v_vs_col||
8202 ',null,null'||
8203 ',null'||
8204 ',B.'||p_member_t_name_col||
8205 ',B.'||p_member_description_col||
8206 ',B.language'||
8207 ', ''LOAD'' '||
8208 ',null,null'||
8209 ' FROM '||p_source_tl_table||' B'||
8210 v_dimension_grp_table||
8211 v_vs_table||
8212 v_calendar_table||
8213 ' WHERE B.status'||p_exec_mode_clause||
8214 v_data_slice_pred||
8215 v_dim_label_where_cond||
8216 ' AND EXISTS (SELECT 0 FROM '||
8217 p_target_b_table||' G'||v_vs_subq_table||
8218 ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8219 ' AND G.read_only_flag = ''N'''||
8220 v_dim_id_where_cond||
8221 v_vs_subq_where_cond||')'||
8222 ' AND B.language in (SELECT language_code from FND_LANGUAGES '||
8223 ' WHERE installed_flag in (''I'',''B'')) '||
8224 v_dimension_grp_where_cond||
8225 v_calendar_where_cond||
8226 v_vs_where_cond;
8227
8228 END IF;
8229
8230 FEM_ENGINES_PKG.TECH_MESSAGE
8231 (c_log_level_2,c_block||'.'||'build_mbr_select_stmt','End');
8232
8233 END build_mbr_select_stmt;
8234
8235 /*===========================================================================+
8236 | PROCEDURE
8237 | build_bad_lang_upd_stmt
8238 |
8239 | DESCRIPTION
8240 | Builds the dynamic UPDATE statement for updating the TL_T
8241 | records where the LANGUAGE is not installed
8242 |
8243 | SCOPE - PRIVATE
8244 |
8245 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8246 |
8247 | NOTES
8248 |
8249 |
8250 |
8251 |
8252 | MODIFICATION HISTORY
8253 | Rob Flippo 17-Sep-04 Created
8254 +===========================================================================*/
8255 procedure build_bad_lang_upd_stmt (p_load_type IN VARCHAR2
8256 ,p_dimension_varchar_label IN VARCHAR2
8257 ,p_dimension_id IN NUMBER
8258 ,p_source_tl_table IN VARCHAR2
8259 ,p_exec_mode_clause IN VARCHAR2
8260 ,p_shared_dimension_flag IN VARCHAR2
8261 ,p_value_set_required_flag IN VARCHAR2
8262 ,x_update_stmt OUT NOCOPY VARCHAR2)
8263 IS
8264 v_dim_label_where_cond VARCHAR2(1000); -- where condition for when updating
8265 -- dimension grp TL table
8266
8267 BEGIN
8268
8269 FEM_ENGINES_PKG.TECH_MESSAGE
8270 (c_log_level_2,c_block||'.'||'build_bad_tl_lang_upd_stmt','Begin');
8271
8272 IF (p_load_type = 'DIMENSION_GROUP')
8273 OR (p_shared_dimension_flag ='Y' AND p_value_set_required_flag = 'N') THEN
8274 v_dim_label_where_cond :=
8275 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8276 ELSE
8277 v_dim_label_where_cond := '';
8278 END IF;
8279
8280 x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8281 ' SET B.status = ''LANGUAGE_NOT_INSTALLED'' '||
8282 ' WHERE B.language NOT IN '||
8283 ' (SELECT language_code from FND_LANGUAGES '||
8284 ' WHERE installed_flag in (''I'',''B'')) '||
8285 v_dim_label_where_cond||
8286 ' AND B.status'||p_exec_mode_clause||
8287 ' AND {{data_slice}} ';
8288
8289
8290 FEM_ENGINES_PKG.TECH_MESSAGE
8291 (c_log_level_2,c_block||'.'||'build_bad_tl_lang_upd_stmt','End');
8292
8293
8294 END build_bad_lang_upd_stmt;
8295
8296 /*===========================================================================+
8297 | PROCEDURE
8298 | build_tl_ro_mbr_upd_stmt
8299 |
8300 | DESCRIPTION
8301 | Builds the dynamic UPDATE statement for updating the TL_T
8302 | records where the member is read_only_flag='Y'
8303 |
8304 | SCOPE - PRIVATE
8305 |
8306 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8307 |
8308 | NOTES
8309 |
8310 |
8311 |
8312 |
8313 | MODIFICATION HISTORY
8314 | Rob Flippo 10-Jun-05 Created
8315 | Rob Flippo 07-OCT-05 Modified Cal period update statement for performance
8316 | issue encountered during regression testing (no bug)
8317 +===========================================================================*/
8318 procedure build_tl_ro_mbr_upd_stmt (p_load_type IN VARCHAR2
8319 ,p_dimension_varchar_label IN VARCHAR2
8320 ,p_dimension_id IN NUMBER
8321 ,p_source_tl_table IN VARCHAR2
8322 ,p_target_b_table IN VARCHAR2
8323 ,p_member_dc_col IN VARCHAR2
8324 ,p_member_t_dc_col IN VARCHAR2
8325 ,p_exec_mode_clause IN VARCHAR2
8326 ,p_shared_dimension_flag IN VARCHAR2
8327 ,p_value_set_required_flag IN VARCHAR2
8328 ,x_update_stmt OUT NOCOPY VARCHAR2)
8329 IS
8330 v_dim_label_where_cond VARCHAR2(1000); -- where condition for when updating
8331 -- dimension grp TL table
8332 v_vs_where_cond VARCHAR2(1000); -- for value set dimensions
8333 v_vs_from_cond VARCHAR2(1000);
8334 v_calp_from_cond VARCHAR2(1000);
8335
8336 BEGIN
8337
8338 FEM_ENGINES_PKG.TECH_MESSAGE
8339 (c_log_level_2,c_block||'.'||'build_tl_ro_mbr_upd_stmt','Begin');
8340
8341 IF (p_load_type = 'DIMENSION_GROUP')
8342 OR (p_shared_dimension_flag ='Y' AND p_value_set_required_flag = 'N') THEN
8343 v_dim_label_where_cond :=
8344 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8345 ELSE
8346 v_dim_label_where_cond := '';
8347 END IF;
8348
8349 IF p_value_set_required_flag = 'Y' and p_load_type NOT IN ('DIMENSION_GROUP') THEN
8350 v_vs_from_cond := ',fem_value_sets_b V ';
8351 v_vs_where_cond := ' AND V.value_set_display_code = B.value_set_display_code'||
8352 ' AND V.value_set_id = G.value_set_id'||
8353 ' AND V.dimension_id = '||p_dimension_id;
8354 ELSE
8355 v_vs_from_cond := '';
8356 v_vs_where_cond := '';
8357 END IF;
8358
8359 IF p_dimension_varchar_label = 'CAL_PERIOD' AND
8360 p_load_type NOT IN ('DIMENSION_GROUP') THEN
8361
8362 v_calp_from_cond := ',fem_calendars_b C, fem_dimension_grps_b D';
8363
8364 x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8365 ' SET B.status = ''READ_ONLY_MEMBER'' '||
8366 ' WHERE B.language IN '||
8367 ' (SELECT language_code from FND_LANGUAGES '||
8368 ' WHERE installed_flag in (''I'',''B'')) '||
8369 v_dim_label_where_cond||
8370 ' AND B.status'||p_exec_mode_clause||
8371 ' AND EXISTS (SELECT 0 FROM '||p_target_b_table||' G'||
8372 v_calp_from_cond||
8373 ' WHERE to_char(G.'||p_member_dc_col||') = '||
8374 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8375 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8376 'LPAD(to_char(C.calendar_id),5,''0'')||'||
8377 'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
8378 ' AND G.read_only_flag = ''Y'''||
8379 ' AND G.dimension_group_id = D.dimension_group_id '||
8380 ' AND C.calendar_id = G.calendar_id '||
8381 ')'||
8382 ' AND {{data_slice}} ';
8383
8384 ELSE
8385
8386 x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8387 ' SET B.status = ''READ_ONLY_MEMBER'' '||
8388 ' WHERE B.language IN '||
8389 ' (SELECT language_code from FND_LANGUAGES '||
8390 ' WHERE installed_flag in (''I'',''B'')) '||
8391 v_dim_label_where_cond||
8392 ' AND B.status'||p_exec_mode_clause||
8393 ' AND EXISTS (SELECT 0 FROM '||p_target_b_table||' G'||
8394 v_vs_from_cond||
8395 ' WHERE G.'||p_member_dc_col||'=B.'||p_member_t_dc_col||
8396 ' AND G.read_only_flag = ''Y'''||
8397 v_vs_where_cond||
8398 ')'||
8399 ' AND {{data_slice}} ';
8400
8401 END IF;
8402
8403 FEM_ENGINES_PKG.TECH_MESSAGE
8404 (c_log_level_2,c_block||'.'||'build_tl_ro_mbr_upd_stmt','End');
8405
8406
8407 END build_tl_ro_mbr_upd_stmt;
8408
8409
8410
8411 /*===========================================================================+
8412 | PROCEDURE
8413 | build_bad_tl_select_stmt
8414 |
8415 | DESCRIPTION
8416 | Builds the dynamic SELECT statement for retrieving
8417 | the TL records that are not for new members (i.e., no data
8418 | in _B_T table) and are not for existing members (i.e., member
8419 | doesn't exist in FEM)
8420 |
8421 | SCOPE - PRIVATE
8422 |
8423 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8424 |
8425 | NOTES
8426 |
8427 |
8428 |
8429 |
8430 | MODIFICATION HISTORY
8431 | Rob Flippo 04-May-04 Created
8432 | Rob Flippo 07-Sep-04 Bug#3848996 - Simple Dim load failing because
8433 | Invalid column name. The select was using the
8434 | wrong variable name - it should use p_member_t_dc_col
8435 | since that is the name of the member col on the
8436 | interface table
8437 |
8438 | Rob Flippo 16-Sep-04 Added condition on the NOT EXISTS subquery for the B2
8439 | table to check the dimension_Varchar_label when the
8440 | load is for a Simple Dimension
8441 | Rob Flippo 16-FEB-05 Bug#4189544 DIMENSION GROUP LOADER ISSUE
8442 | add dimension_id where condition when target
8443 | table is fem_dimension_grps_b
8444 | -- also modified so only load grps of specific
8445 | dimension
8446 +===========================================================================*/
8447 procedure build_bad_tl_select_stmt (p_load_type IN VARCHAR2
8448 ,p_dimension_varchar_label IN VARCHAR2
8449 ,p_dimension_id IN NUMBER
8450 ,p_target_b_table IN VARCHAR2
8451 ,p_target_tl_table IN VARCHAR2
8452 ,p_source_b_table IN VARCHAR2
8453 ,p_source_tl_table IN VARCHAR2
8454 ,p_member_dc_col IN VARCHAR2
8455 ,p_member_t_dc_col IN VARCHAR2
8456 ,p_value_set_required_flag IN VARCHAR2
8457 ,p_shared_dimension_flag IN VARCHAR2
8458 ,p_hier_dimension_flag IN VARCHAR2
8459 ,p_exec_mode_clause IN VARCHAR2
8460 ,x_select_stmt OUT NOCOPY VARCHAR2)
8461
8462 IS
8463 -- Value Set Where conditions
8464 v_vs_where_cond VARCHAR2(1000);
8465 v_vs_t_where_cond VARCHAR2(1000);
8466 v_vs_table VARCHAR2(1000);
8467 v_vs_col VARCHAR2(1000);
8468 v_vs_subq_where_cond VARCHAR2(1000);
8469 v_vs_subq_table VARCHAR2(1000);
8470 v_vs_subq_where_condB2 VARCHAR2(1000);
8471 v_data_slice_pred VARCHAR2(100);
8472
8473 -- Dimension Label where condition (for Simple dimensions)
8474 v_dim_label_where_cond VARCHAR2(1000);
8475 v_dim_label_subqwhere_cond VARCHAR2(1000);
8476 v_dim_label_join_cond VARCHAR2(1000);
8477 v_dim_id_where_cond VARCHAR2(1000);
8478
8479 -- Dimension Group Where Conditions (for member loads)
8480 v_dimension_grp_col VARCHAR2(1000);
8481 v_dimension_grp_table VARCHAR2(1000);
8482 v_dimension_grp_where_cond VARCHAR2(1000);
8483
8484
8485 -- Special conditions to handle CAL_PERIOD
8486 v_member_code VARCHAR2(1000);
8487 v_member_code_b_t VARCHAR2(1000);
8488 v_cal_period_cols VARCHAR2(1000);
8489 v_calendar_table VARCHAR2(100);
8490 v_calendar_where_cond VARCHAR2(1000);
8491 v_member_dc_where_cond VARCHAR2(1000);
8492
8493 -- Columns for loading Dimension Groups
8494 v_dimgrp_load_col VARCHAR2(1000);
8495
8496 BEGIN
8497
8498 FEM_ENGINES_PKG.TECH_MESSAGE
8499 (c_log_level_2,c_block||'.'||'build_bad_tl_select_stmt','Begin');
8500
8501 IF p_value_set_required_flag = 'Y' THEN
8502
8503 v_vs_col := ',B.value_set_display_code ';
8504 v_vs_t_where_cond := ' AND B.value_set_display_code = T.value_set_display_code';
8505
8506 v_vs_table := ', FEM_VALUE_SETS_B V1';
8507 v_vs_where_cond := ' AND B.value_set_display_code = V1.value_set_display_code (+)';
8508
8509 v_vs_subq_table := ', FEM_VALUE_SETS_B V2';
8510 v_vs_subq_where_cond := ' AND G.value_set_id = V2.value_set_id AND '||
8511 'V2.value_set_display_code = B.value_set_display_code';
8512 v_vs_subq_where_condB2 := ' AND B2.value_set_display_code = B.value_set_display_code';
8513
8514
8515 ELSE
8516
8517 v_vs_col := ', null';
8518 v_vs_t_where_cond := '';
8519
8520 v_vs_table := '';
8521 v_vs_where_cond := '';
8522
8523 v_vs_subq_table := '';
8524 v_vs_subq_where_cond := '';
8525 v_vs_subq_where_condB2 := '';
8526
8527 END IF;
8528
8529 -- setting the Dim Label conditions
8530 IF (p_value_set_required_flag = 'N'
8531 AND p_shared_dimension_flag = 'Y') OR
8532 (p_load_type = 'DIMENSION_GROUP') THEN
8533 v_dim_label_where_cond :=
8534 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8535 v_dim_label_subqwhere_cond :=
8536 ' AND B2.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8537 v_dim_label_join_cond :=
8538 ' AND B.dimension_varchar_label = T.dimension_varchar_label';
8539 ELSE
8540 v_dim_label_where_cond := '';
8541 v_dim_label_join_cond := '';
8542 v_dim_label_subqwhere_cond := '';
8543
8544 END IF; -- setting the Dim Label conditions
8545
8546 -- Setting the special conditions for CAL_PERIOD
8547 IF (p_dimension_varchar_label = 'CAL_PERIOD')
8548 AND (p_load_type NOT IN ('DIMENSION_GROUP')) THEN
8549 v_member_code :=
8550 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8551 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8552 'LPAD(to_char(C.calendar_id),5,''0'')||'||
8553 'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8554 v_member_code_b_t :=
8555 'LPAD(to_char(to_number(to_char(B2.cal_period_end_date,''j''))),7,''0'')||'||
8556 'LPAD(TO_CHAR(B2.cal_period_number),15,''0'')||'||
8557 'LPAD(to_char(C.calendar_id),5,''0'')||'||
8558 'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8559
8560 v_cal_period_cols := ', C.calendar_display_code, C.calendar_id, B.cal_period_end_date, B.cal_period_number';
8561 v_calendar_table := ', FEM_CALENDARS_VL C';
8562 v_calendar_where_cond := ' AND B.calendar_display_code = C.calendar_display_code (+) ';
8563 v_member_dc_where_cond := ' AND B.calendar_display_code = T.calendar_display_code'||
8564 ' AND B.cal_period_number = T.cal_period_number'||
8565 ' AND B.cal_period_end_date = T.cal_period_end_date'||
8566 ' AND B.dimension_group_display_code = T.dimension_group_display_code';
8567 v_dimension_grp_table := ', FEM_DIMENSION_GRPS_B D';
8568 v_dimension_grp_where_cond := ' AND B.dimension_group_display_code = '||
8569 'D.dimension_group_display_code (+) '||
8570 ' AND D.dimension_id (+) = '||p_dimension_id;
8571
8572 ELSE
8573 v_member_code := 'B.'||p_member_t_dc_col;
8574 v_member_code_b_t := 'B2.'||p_member_t_dc_col;
8575 v_cal_period_cols := ',null ,null, null, null';
8576 v_calendar_table := '';
8577 v_calendar_where_cond := '';
8578 v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
8579 '=T.'||p_member_t_dc_col;
8580 v_dimension_grp_table := '';
8581 v_dimension_grp_where_cond := '';
8582
8583 END IF; -- p_dimension_varchar_label = 'CAL_PERIOD'
8584
8585 -- Because we load both Dimension Groups and Members using the same
8586 -- dynamic query, we have to allow for the extra columns on FEM_DIMENSION_GRPS_B
8587 IF (p_load_type = 'DIMENSION_GROUP') THEN
8588 v_dimgrp_load_col := ',B.dimension_group_seq, B.time_group_type_code';
8589 v_data_slice_pred := '';
8590 v_dim_id_where_cond := ' AND G.dimension_id = '||p_dimension_id;
8591 ELSE
8592 v_dimgrp_load_col := ',null,null';
8593 v_data_slice_pred := 'AND {{data_slice}} ';
8594 v_dim_id_where_cond := '';
8595 END IF;
8596
8597 x_select_stmt :=
8598 'SELECT B.rowid'||
8599 ','||v_member_code||
8600 v_cal_period_cols||
8601 v_vs_col||
8602 ', ''INVALID_MEMBER'' '||
8603 ' FROM '||p_source_tl_table||' B'||
8604 v_dimension_grp_table||
8605 v_calendar_table||
8606 ' WHERE B.status'||p_exec_mode_clause||' '||
8607 v_data_slice_pred||
8608 v_dim_label_where_cond||
8609 ' AND NOT EXISTS (SELECT 0 FROM '||
8610 p_target_b_table||' G'||v_vs_subq_table||
8611 ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8612 v_dim_id_where_cond||
8613 v_vs_subq_where_cond||')'||
8614 ' AND NOT EXISTS (SELECT 0 FROM '||
8615 p_source_b_table||' B2'||
8616 ' WHERE to_char('||v_member_code_b_t||') = '||v_member_code||
8617 v_dim_label_subqwhere_cond||
8618 v_vs_subq_where_condB2||')'||
8619 v_dimension_grp_where_cond||
8620 v_calendar_where_cond;
8621
8622 FEM_ENGINES_PKG.TECH_MESSAGE
8623 (c_log_level_2,c_block||'.'||'build_bad_TL_select_stmt','End');
8624
8625 END build_bad_tl_select_stmt;
8626
8627
8628 /*===========================================================================+
8629 | PROCEDURE
8630 | BUILD_CALP_INTERM_INSERT_STMT
8631 |
8632 | DESCRIPTION
8633 | Builds the update statement for the inserts into the
8634 | FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T
8635 |
8636 | SCOPE - PRIVATE
8637 |
8638 | NOTES
8639 |
8640 |
8641 | MODIFICATION HISTORY
8642 | Rob Flippo 04-JAN-05 Created
8643 |
8644 +===========================================================================*/
8645
8646 procedure build_calp_interim_insert_stmt (x_insert_calp_stmt OUT NOCOPY VARCHAR2
8647 ,x_insert_calp_attr_stmt OUT NOCOPY VARCHAR2)
8648
8649 IS
8650
8651 BEGIN
8652
8653 x_insert_calp_stmt := 'INSERT INTO FEM_CALP_INTERIM_T'||
8654 '(CAL_PERIOD_END_DATE'||
8655 ',CAL_PERIOD_NUMBER'||
8656 ',CALENDAR_DISPLAY_CODE'||
8657 ',DIMENSION_GROUP_DISPLAY_CODE'||
8658 ',CAL_PERIOD_START_DATE'||
8659 ',CAL_PERIOD_ID'||
8660 ',DIMENSION_GROUP_ID'||
8661 ',CALENDAR_ID'||
8662 ',CAL_PERIOD_NAME'||
8663 ',DESCRIPTION'||
8664 ',OVERLAP_FLAG'||
8665 ',ADJUSTMENT_PERIOD_FLAG)'||
8666 ' SELECT'||
8667 ':b_end_date'||
8668 ',:b_period_number'||
8669 ',:b_calendar_display_code'||
8670 ',:b_dimgrp_display_code'||
8671 ',:b_start_date'||
8672 ',:b_cal_period_id'||
8673 ',:b_dimgrp_id'||
8674 ',:b_calendar_id'||
8675 ',:b_cal_period_name'||
8676 ',:b_description'||
8677 ',''N'''||
8678 ',:b_adj_period_flag'||
8679 ' FROM dual'||
8680 ' WHERE :b_use_interim_table_flag = ''Y'''||
8681 ' AND :b_status = ''LOAD''';
8682 x_insert_calp_attr_stmt := 'INSERT INTO fem_calp_attr_interim_t'||
8683 '(CAL_PERIOD_ID'||
8684 ',ATTRIBUTE_ID'||
8685 ',VERSION_ID'||
8686 ',DIM_ATTRIBUTE_NUMERIC_MEMBER'||
8687 ',DIM_ATTRIBUTE_VALUE_SET_ID'||
8688 ',DIM_ATTRIBUTE_VARCHAR_MEMBER'||
8689 ',NUMBER_ASSIGN_VALUE'||
8690 ',VARCHAR_ASSIGN_VALUE'||
8691 ',DATE_ASSIGN_VALUE'||
8692 ',OVERLAP_FLAG)'||
8693 ' SELECT'||
8694 ':b_cal_period_id'||
8695 ',:b_attribute_id'||
8696 ',:b_version_id'||
8697 ',:b_dim_attr_numeric_member'||
8698 ',:b_dim_attr_value_set_id'||
8699 ',:b_dim_attr_varchar_member'||
8700 ',:b_number_assign_value'||
8701 ',:b_varchar_assign_value'||
8702 ',:b_date_assign_value'||
8703 ',''N'''||
8704 ' FROM dual'||
8705 ' WHERE :b_use_interim_table_flag = ''Y'''||
8706 ' AND :b_status = ''LOAD''';
8707
8708
8709
8710 END build_calp_interim_insert_stmt;
8711
8712
8713 /*===========================================================================+
8714 | PROCEDURE
8715 | TRUNCATE_CALP_INTERIM
8716 |
8717 | DESCRIPTION
8718 | Truncates the INTERIM tables used in CAL_PERIOD loads
8719 |
8720 | SCOPE - PRIVATE
8721 |
8722 | NOTES
8723 |
8724 |
8725 | MODIFICATION HISTORY
8726 | Rob Flippo 11-JAN-05 Created
8727 |
8728 +===========================================================================*/
8729 PROCEDURE truncate_calp_interim
8730
8731 IS
8732
8733 v_truncate_stmt VARCHAR2(4000);
8734
8735 BEGIN
8736
8737 FEM_ENGINES_PKG.TECH_MESSAGE
8738 (c_log_level_2,c_block||'.'||'Truncate_calp_interim'||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8739
8740 v_truncate_stmt := 'delete from fem_calp_interim_t';
8741 EXECUTE IMMEDIATE v_truncate_stmt;
8742
8743 commit;
8744 v_truncate_stmt := 'delete from fem_calp_attr_interim_t';
8745 EXECUTE IMMEDIATE v_truncate_stmt;
8746
8747 commit;
8748
8749 FEM_ENGINES_PKG.TECH_MESSAGE
8750 (c_log_level_2,c_block||'.'||'Truncate_calp_interim'||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8751
8752
8753 END truncate_calp_interim;
8754
8755 /*===========================================================================+
8756 | PROCEDURE
8757 | GET_ATTR_ASSIGN_CALP
8758 |
8759 | DESCRIPTION
8760 | Identifies the CAL_PERIOD_ID for the attribute assignment
8761 | when the attribute LOV comes from the CAL_PERIOD dimension
8762 |
8763 | SCOPE - PRIVATE
8764 |
8765 | NOTES
8766 |
8767 |
8768 | MODIFICATION HISTORY
8769 | Rob Flippo 11-JAN-05 Created
8770 |
8771 +===========================================================================*/
8772 procedure get_attr_assign_calp (x_cal_period_id OUT NOCOPY VARCHAR2
8773 ,x_record_status OUT NOCOPY VARCHAR2
8774 ,p_calendar_dc IN VARCHAR2
8775 ,p_dimension_group_dc IN VARCHAR2
8776 ,p_end_date IN DATE
8777 ,p_cal_period_number IN NUMBER)
8778 IS
8779
8780 v_calendar_id NUMBER;
8781 v_dimension_group_id NUMBER;
8782 v_cal_period_id NUMBER;
8783
8784 BEGIN
8785
8786 BEGIN
8787 SELECT calendar_id
8788 INTO v_calendar_id
8789 FROM fem_calendars_b
8790 WHERE calendar_display_code = p_calendar_dc;
8791 EXCEPTION
8792 WHEN no_data_found THEN x_record_status := 'INVALID_CALPATTR_CALENDAR';
8793 END;
8794
8795 BEGIN
8796 SELECT dimension_group_id
8797 INTO v_dimension_group_id
8798 FROM fem_dimension_grps_b
8799 WHERE dimension_group_display_code = p_dimension_group_dc;
8800 EXCEPTION
8801 WHEN no_data_found THEN x_record_status := 'INVALID_CALPATTR_DIMGRP';
8802 END;
8803
8804 v_cal_period_id := fem_dimension_util_pkg.generate_member_id(
8805 P_END_DATE => p_end_date
8806 ,P_PERIOD_NUM => p_cal_period_number
8807 ,P_CALENDAR_ID => v_calendar_id
8808 ,P_DIM_GRP_ID => v_dimension_group_id);
8809
8810 IF x_record_status IS NULL
8811 AND (v_cal_period_id IS NULL
8812 OR v_cal_period_id <= 0) THEN
8813 x_record_status := 'INVALID_CALPATTR';
8814 ELSIF x_record_status IS NULL
8815 AND v_cal_period_id > 0 THEN
8816 x_record_status := 'LOAD';
8817 END IF;
8818
8819 x_cal_period_id := to_char(v_cal_period_id);
8820
8821 END get_attr_assign_calp;
8822
8823
8824 /*===========================================================================+
8825 | PROCEDURE
8826 | POST_CAL_PERIODS
8827 |
8828 | DESCRIPTION
8829 | Moves Cal Periods from the Interim table into
8830 | FEM
8831 |
8832 | SCOPE - PRIVATE
8833 |
8834 | NOTES
8835 |
8836 |
8837 | MODIFICATION HISTORY
8838 | Rob Flippo 06-JAN-05 Created
8839 | Rob Flippo 22-APR-05 Bug#4305050 Calendar_ID and Dimension_Group_ID
8840 | were being swapped on insert member
8841 | Rob Flippo 07-OCT-05 Bug#4628009 Fixed problem in Post_Cal_Periods where
8842 | the Cal Period Name and Description table variables
8843 | had a type of varchar2(30) instead of 150 and 255.
8844 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
8845 |
8846 +===========================================================================*/
8847 PROCEDURE Post_Cal_Periods (p_eng_sql IN VARCHAR2
8848 ,p_data_slc IN VARCHAR2
8849 ,p_proc_num IN VARCHAR2
8850 ,p_partition_code IN NUMBER
8851 ,p_fetch_limit IN NUMBER
8852 ,p_operation_mode IN VARCHAR2
8853 ,p_master_request_id IN NUMBER)
8854 IS
8855
8856 c_proc_name VARCHAR2(30) := 'Post_Cal_Periods';
8857
8858 v_fetch_limit NUMBER;
8859 v_mbr_last_row NUMBER;
8860 v_attribute_id NUMBER; -- of the CAL_PERIOD_START_DATE attribute
8861 v_version_id NUMBER; -- Default version of CAL_PERIOD_START_DATE
8862
8863 t_cal_period_id number_type;
8864 t_calendar_id number_type;
8865 t_dimension_group_id number_type;
8866 t_cal_period_name varchar2_150_type;
8867 t_description desc_type;
8868 t_start_date date_type;
8869 t_cal_period_number number_type;
8870 t_cal_period_end_date date_type;
8871 t_calendar_display_code varchar2_std_type;
8872 t_dimension_group_display_code varchar2_std_type;
8873
8874 x_insert_mbr_stmt VARCHAR2(4000);
8875 x_insert_attr_stmt VARCHAR2(4000);
8876 x_select_mbr_stmt VARCHAR2(4000);
8877 x_update_attr_stmt VARCHAR2(4000);
8878 x_delete_b_stmt VARCHAR2(4000);
8879 x_delete_tl_stmt VARCHAR2(4000);
8880 x_delete_attr_stmt VARCHAR2(4000);
8881
8882 -- MP variables
8883 v_loop_counter NUMBER;
8884 v_slc_id NUMBER;
8885 v_slc_val VARCHAR2(100);
8886 v_slc_val2 VARCHAR2(100);
8887 v_slc_val3 VARCHAR2(100);
8888 v_slc_val4 VARCHAR2(100);
8889 v_mp_status VARCHAR2(30);
8890 v_mp_message VARCHAR2(4000);
8891 v_num_vals NUMBER;
8892 v_part_name VARCHAR2(4000);
8893
8894
8895 ---------------------
8896 -- Declare cursors --
8897 ---------------------
8898 cv_get_rows cv_curs;
8899
8900 BEGIN
8901
8902 FEM_ENGINES_PKG.TECH_MESSAGE
8903 (c_log_level_2,c_block||'.'||'Post_Cal_Periods'||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8904
8905 FEM_ENGINES_PKG.TECH_MESSAGE
8906 (c_log_level_1,c_block||'.'||'Post_Cal_Periods'||'.p_operation_mode',p_operation_mode);
8907
8908 --x_status := 0; -- initialize status of the New_Members procedure
8909 --x_message := 'COMPLETE:NORMAL';
8910
8911 -- set the local fetch limit variable based on the parameter
8912 v_fetch_limit := p_fetch_limit;
8913 IF v_fetch_limit IS NULL THEN
8914 v_fetch_limit := 10000;
8915 END IF;
8916
8917 ----------------------------------------------
8918 -- build the statement to fetch the members for processing
8919 -- This statement is used by both modes (New Members and Attr Update)
8920 ----------------------------------------------
8921 x_select_mbr_stmt := 'SELECT '||
8922 'B.cal_period_id'||
8923 ', B.calendar_id'||
8924 ', B.dimension_group_id'||
8925 ', B.cal_period_name'||
8926 ', B.description'||
8927 ', B.cal_period_start_date'||
8928 ', B.cal_period_end_date'||
8929 ', B.cal_period_number'||
8930 ', B.calendar_display_code'||
8931 ', B.dimension_group_display_code'||
8932 ' FROM fem_calp_interim_t B'||
8933 ' WHERE B.overlap_flag = ''N'''||
8934 ' AND {{data_slice}} ';
8935 IF p_data_slc IS NOT NULL THEN
8936 x_select_mbr_stmt := REPLACE(x_select_mbr_stmt,'{{data_slice}}',p_data_slc);
8937 ELSE
8938 x_select_mbr_stmt := REPLACE(x_select_mbr_stmt,'{{data_slice}}','1=1');
8939 END IF;
8940 ----------------------------------------------------------------------
8941 FEM_ENGINES_PKG.TECH_MESSAGE
8942 (c_log_level_1,c_block||'.'||c_proc_name||'.select_mbr_stmt'
8943 ,x_select_mbr_stmt);
8944
8945 IF p_operation_mode = 'NEW_MEMBERS' THEN
8946 x_insert_mbr_stmt :=
8947 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER;'||
8948 'BEGIN FEM_CAL_PERIODS_PKG.INSERT_ROW '||
8949 '(x_rowid => v_row_id '||
8950 ',x_cal_period_id => :b_cal_period_id'||
8951 ',x_dimension_group_id => :b_dimension_group_id '||
8952 ',x_calendar_id => :b_calendar_id '||
8953 ',x_enabled_flag => ''Y'' '||
8954 ',x_personal_flag => ''N'' '||
8955 ',x_read_only_flag => ''N'' '||
8956 ',x_object_version_number => '||c_object_version_number||
8957 ',x_cal_period_name => :b_member_name'||
8958 ',x_description => :b_member_desc '||
8959 ',x_creation_date => sysdate '||
8960 ',x_created_by => :b_apps_user_id'||
8961 ',x_last_update_date => sysdate '||
8962 ',x_last_updated_by => :b_apps_user_id2'||
8963 ',x_last_update_login => null ); END;';
8964
8965 FEM_ENGINES_PKG.TECH_MESSAGE
8966 (c_log_level_1,c_block||'.'||c_proc_name||'.insert_mbr_stmt'
8967 ,x_insert_mbr_stmt);
8968
8969 x_insert_attr_stmt := 'INSERT INTO FEM_CAL_PERIODS_ATTR '||
8970 '(CAL_PERIOD_ID'||
8971 ',ATTRIBUTE_ID'||
8972 ',VERSION_ID'||
8973 ',DIM_ATTRIBUTE_NUMERIC_MEMBER'||
8974 ',DIM_ATTRIBUTE_VALUE_SET_ID'||
8975 ',DIM_ATTRIBUTE_VARCHAR_MEMBER'||
8976 ',NUMBER_ASSIGN_VALUE'||
8977 ',VARCHAR_ASSIGN_VALUE'||
8978 ',DATE_ASSIGN_VALUE'||
8979 ',CREATION_DATE'||
8980 ',CREATED_BY'||
8981 ',LAST_UPDATED_BY'||
8982 ',LAST_UPDATE_DATE'||
8983 ',LAST_UPDATE_LOGIN'||
8984 ',OBJECT_VERSION_NUMBER'||
8985 ',AW_SNAPSHOT_FLAG) '||
8986 'SELECT cal_period_id'||
8987 ',attribute_id'||
8988 ',version_id'||
8989 ',dim_attribute_numeric_member'||
8990 ',dim_attribute_value_set_id'||
8991 ',dim_attribute_varchar_member'||
8992 ',number_assign_value'||
8993 ',varchar_assign_value'||
8994 ',date_assign_value'||
8995 ', sysdate'||
8996 ',:b_apps_user_id'||
8997 ',:b_apps_user_id2'||
8998 ', sysdate'||
8999 ', null'||
9000 ', 1'||
9001 ', ''N'''||
9002 ' FROM fem_calp_attr_interim_t'||
9003 ' WHERE cal_period_id = :b_cal_period_id';
9004 FEM_ENGINES_PKG.TECH_MESSAGE
9005 (c_log_level_1,c_block||'.'||c_proc_name||'.insert_attr_stmt'
9006 ,x_insert_attr_stmt);
9007
9008 build_calp_delete_stmt ('FEM_CAL_PERIODS_B_T'
9009 ,p_operation_mode
9010 ,x_delete_b_stmt);
9011
9012 build_calp_delete_stmt ('FEM_CAL_PERIODS_TL_T'
9013 ,p_operation_mode
9014 ,x_delete_tl_stmt);
9015
9016 build_calp_delete_stmt ('FEM_CAL_PERIODS_ATTR_T'
9017 ,p_operation_mode
9018 ,x_delete_attr_stmt);
9019
9020
9021 ELSE
9022 x_update_attr_stmt := 'UPDATE fem_cal_periods_attr'||
9023 ' SET date_assign_value = :b_start_date'||
9024 ',creation_date = sysdate'||
9025 ',last_update_date = sysdate'||
9026 ',last_updated_by = :b_apps_user_id'||
9027 ' WHERE cal_period_id = :b_cal_period_id'||
9028 ' AND attribute_id = :b_attribute_id'||
9029 ' AND version_id = :b_version_id';
9030
9031 FEM_ENGINES_PKG.TECH_MESSAGE
9032 (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_stmt'
9033 ,x_update_attr_stmt);
9034
9035 build_calp_delete_stmt ('FEM_CAL_PERIODS_ATTR_T'
9036 ,p_operation_mode
9037 ,x_delete_attr_stmt);
9038
9039 FEM_ENGINES_PKG.TECH_MESSAGE
9040 (c_log_level_1,c_block||'.'||c_proc_name||'.delete_attr_stmt'
9041 ,x_delete_attr_stmt);
9042
9043 -- identify the attribute_id and default version for the START_DATE attribute
9044 SELECT attribute_id
9045 INTO v_attribute_id
9046 FROM fem_dim_attributes_b
9047 WHERE attribute_varchar_label = 'CAL_PERIOD_START_DATE';
9048
9049 SELECT version_id
9050 INTO v_version_id
9051 FROM fem_dim_attr_versions_b
9052 WHERE attribute_id = v_attribute_id
9053 AND default_version_flag = 'Y';
9054
9055 END IF;
9056
9057 v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
9058 -- the data slice loop
9059 LOOP
9060
9061 FEM_Multi_Proc_Pkg.Get_Data_Slice(
9062 x_slc_id => v_slc_id,
9063 x_slc_val1 => v_slc_val,
9064 x_slc_val2 => v_slc_val2,
9065 x_slc_val3 => v_slc_val3,
9066 x_slc_val4 => v_slc_val4,
9067 x_num_vals => v_num_vals,
9068 x_part_name => v_part_name,
9069 p_req_id => p_master_request_id,
9070 p_proc_num => p_proc_num);
9071
9072 FEM_ENGINES_PKG.TECH_MESSAGE
9073 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
9074 ,v_slc_val);
9075 FEM_ENGINES_PKG.TECH_MESSAGE
9076 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
9077 ,v_slc_val2);
9078 FEM_ENGINES_PKG.TECH_MESSAGE
9079 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
9080 ,v_slc_val3);
9081 FEM_ENGINES_PKG.TECH_MESSAGE
9082 (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
9083 ,v_slc_val4);
9084
9085
9086 EXIT WHEN (v_slc_id IS NULL);
9087
9088 ----------------------------------------------
9089 -- Fetch the new members into the array
9090 ----------------------------------------------
9091 OPEN cv_get_rows FOR x_select_mbr_stmt USING v_slc_val, v_slc_val2;
9092
9093 LOOP
9094
9095 FETCH cv_get_rows BULK COLLECT INTO
9096 t_cal_period_id
9097 ,t_calendar_id
9098 ,t_dimension_group_id
9099 ,t_cal_period_name
9100 ,t_description
9101 ,t_start_date
9102 ,t_cal_period_end_date
9103 ,t_cal_period_number
9104 ,t_calendar_display_code
9105 ,t_dimension_group_display_code
9106 LIMIT v_fetch_limit;
9107 ----------------------------------------------
9108 -- EXIT Fetch LOOP If No Rows are Retrieved --
9109 ----------------------------------------------
9110 v_mbr_last_row := t_cal_period_id.LAST;
9111
9112 IF (v_mbr_last_row IS NULL) THEN
9113 EXIT;
9114 END IF;
9115
9116 -- If running in NEW_MEMBERS mode, we do the following:
9117 -- 1) call table handler to create the new CAL_PERIOD members
9118 -- 2) run an insert statement to move the attribute assignments from the
9119 -- INTERIM table into FEM_CAL_PERIODS_ATTR
9120 -- 3) Remove the rows from the _B_T, TL_T and ATTR_T tables for the successful
9121 -- members
9122 IF p_operation_mode = 'NEW_MEMBERS' THEN
9123 ----------------------------------------------------------
9124 -- Call the table handler insert stmt for each new member
9125 ----------------------------------------------------------
9126 FORALL i IN 1..v_mbr_last_row
9127 EXECUTE IMMEDIATE x_insert_mbr_stmt
9128 USING t_cal_period_id(i)
9129 ,t_dimension_group_id(i)
9130 ,t_calendar_id(i)
9131 ,t_cal_period_name(i)
9132 ,t_description(i)
9133 ,gv_apps_user_id
9134 ,gv_apps_user_id;
9135
9136 ----------------------------------------------------------
9137 -- Call the insert attr stmt for each new member
9138 ----------------------------------------------------------
9139 FORALL i IN 1..v_mbr_last_row
9140 EXECUTE IMMEDIATE x_insert_attr_stmt
9141 USING gv_apps_user_id
9142 ,gv_apps_user_id
9143 ,t_cal_period_id(i);
9144
9145 ----------------------------------------------------------
9146 -- Delete the records from the _B_T table
9147 ----------------------------------------------------------
9148 FORALL i IN 1..v_mbr_last_row
9149 EXECUTE IMMEDIATE x_delete_b_stmt
9150 USING t_cal_period_number(i)
9151 ,t_cal_period_end_date(i)
9152 ,t_calendar_display_code(i)
9153 ,t_dimension_group_display_code(i);
9154
9155 ----------------------------------------------------------
9156 -- Delete the records from the _TL_T table
9157 ----------------------------------------------------------
9158 FORALL i IN 1..v_mbr_last_row
9159 EXECUTE IMMEDIATE x_delete_tl_stmt
9160 USING t_cal_period_number(i)
9161 ,t_cal_period_end_date(i)
9162 ,t_calendar_display_code(i)
9163 ,t_dimension_group_display_code(i);
9164
9165 ----------------------------------------------------------
9166 -- Delete the records from the _ATTR_T table
9167 ----------------------------------------------------------
9168 IF p_operation_mode = 'NEW_MEMBERS' THEN
9169 FORALL i IN 1..v_mbr_last_row
9170 EXECUTE IMMEDIATE x_delete_attr_stmt
9171 USING t_cal_period_number(i)
9172 ,t_cal_period_end_date(i)
9173 ,t_calendar_display_code(i)
9174 ,t_dimension_group_display_code(i);
9175
9176 ELSE
9177 FORALL i IN 1..v_mbr_last_row
9178 EXECUTE IMMEDIATE x_delete_attr_stmt
9179 USING t_cal_period_number(i)
9180 ,t_cal_period_end_date(i)
9181 ,t_calendar_display_code(i)
9182 ,t_dimension_group_display_code(i)
9183 ,t_cal_period_id(i);
9184 END IF;
9185
9186 ELSE -- we only update an existing assignment
9187 -- since the START_DATE attribute is required and must
9188 -- therefore always already exist
9189 FORALL i IN 1..v_mbr_last_row
9190 EXECUTE IMMEDIATE x_update_attr_stmt
9191 USING t_start_date(i)
9192 ,gv_apps_user_id
9193 ,t_cal_period_id(i)
9194 ,v_attribute_id
9195 ,v_version_id;
9196
9197 ----------------------------------------------------------
9198 -- Delete the records from the _ATTR_T table
9199 ----------------------------------------------------------
9200 IF p_operation_mode = 'NEW_MEMBERS' THEN
9201 FORALL i IN 1..v_mbr_last_row
9202 EXECUTE IMMEDIATE x_delete_attr_stmt
9203 USING t_cal_period_number(i)
9204 ,t_cal_period_end_date(i)
9205 ,t_calendar_display_code(i)
9206 ,t_dimension_group_display_code(i);
9207
9208 ELSE
9209 FORALL i IN 1..v_mbr_last_row
9210 EXECUTE IMMEDIATE x_delete_attr_stmt
9211 USING t_cal_period_number(i)
9212 ,t_cal_period_end_date(i)
9213 ,t_calendar_display_code(i)
9214 ,t_dimension_group_display_code(i)
9215 ,t_cal_period_id(i);
9216 END IF;
9217
9218 END IF;
9219
9220 t_cal_period_id.DELETE;
9221 t_calendar_id.DELETE;
9222 t_dimension_group_id.DELETE;
9223 t_cal_period_name.DELETE;
9224 t_description.DELETE;
9225 t_start_date.DELETE;
9226 t_cal_period_end_date.DELETE;
9227 t_cal_period_number.DELETE;
9228 t_calendar_display_code.DELETE;
9229 t_dimension_group_display_code.DELETE;
9230
9231
9232 COMMIT;
9233
9234 END LOOP;
9235 END LOOP; --get_data_slice
9236 IF cv_get_rows%ISOPEN THEN
9237 CLOSE cv_get_rows;
9238 END IF;
9239
9240 FEM_ENGINES_PKG.TECH_MESSAGE
9241 (c_log_level_2,c_block||'.'||'Post_Cal_Periods'||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
9242
9243 END Post_Cal_Periods;
9244
9245
9246
9247 /*===========================================================================+
9248 | PROCEDURE
9249 | BUILD_ENABLE_UPDATE_STMT
9250 |
9251 | DESCRIPTION
9252 | Builds the dynamic UPDATE statement for updating
9253 | the enabled flag for dimension members. This procedure
9254 | allows users to "undelete" a member by populating the
9255 | _B_T table with the member for a load. The loader will
9256 | automatically undelete any existing members from the _B_T
9257 | table.
9258 |
9259 | SCOPE - PRIVATE
9260 |
9261 | NOTES
9262 |
9263 |
9264 |
9265 | MODIFICATION HISTORY
9266 | Rob Flippo 27-SEP-04 Created
9267 | Rob Flippo 03-MAR-05 Modified so that is updating a Dim Grp we use
9268 | where condition on dimension_id so that dim grps
9269 | with the same name for other dimensions don't get
9270 | mixed into the update
9271 | Rob Flippo 15-MAR-05 Modify value set update so that use value_set
9272 | in the subquery (otherwise get too many rows if
9273 | 2 members have same display_code)
9274 +===========================================================================*/
9275
9276
9277 procedure build_enable_update_stmt (p_dimension_varchar_label IN VARCHAR2
9278 ,p_dimension_id IN NUMBER
9279 ,p_load_type IN VARCHAR2
9280 ,p_target_b_table IN VARCHAR2
9281 ,p_member_col IN VARCHAR2
9282 ,p_member_dc_col IN VARCHAR2
9283 ,p_value_set_required_flag IN VARCHAR2
9284 ,x_update_stmt OUT NOCOPY VARCHAR2)
9285
9286 IS
9287
9288 v_dimlabel_cond VARCHAR2(1000);
9289
9290 BEGIN
9291 FEM_ENGINES_PKG.TECH_MESSAGE
9292 (c_log_level_2,c_block||'.'||
9293 'build_enable_update_stmt','Begin Build Enabled flag update statement');
9294
9295 IF p_load_type = 'DIMENSION_GROUP' THEN
9296 v_dimlabel_cond := ' AND dimension_id = '||p_dimension_id;
9297 ELSE
9298 v_dimlabel_cond := '';
9299 END IF;
9300
9301
9302 IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
9303
9304 x_update_stmt :=
9305 'UPDATE '||p_target_b_table||
9306 ' SET enabled_flag = ''Y'''||
9307 ',last_update_date = sysdate '||
9308 ',last_updated_by = '||gv_apps_user_id||
9309 ',last_update_login = '||gv_login_id||
9310 ' WHERE to_char('||p_member_col||') = :b_member_code'||
9311 ' AND :b_t_a_status = ''LOAD''';
9312
9313 ELSIF (p_value_set_required_flag = 'Y') THEN
9314
9315 x_update_stmt :=
9316 'UPDATE '||p_target_b_table||
9317 ' SET enabled_flag = ''Y'''||
9318 ',last_update_date = sysdate '||
9319 ',last_updated_by = '||gv_apps_user_id||
9320 ',last_update_login = '||gv_login_id||
9321 ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9322 ' FROM '||p_target_b_table||' T'||
9323 ', fem_value_sets_b V'||
9324 ' WHERE to_char(T.'||p_member_dc_col||') = :b_member_display_code'||
9325 ' AND T.value_set_id = V.value_set_id'||
9326 ' AND V.value_set_display_code = :b_value_set_display_code)'||
9327 ' AND value_set_id = (SELECT value_set_id FROM FEM_VALUE_SETS_B'||
9328 ' WHERE value_set_display_code = :b_value_set_display_code)'||
9329 ' AND :b_t_a_status = ''LOAD''';
9330
9331
9332 ELSE
9333
9334 x_update_stmt :=
9335 'UPDATE '||p_target_b_table||
9336 ' SET enabled_flag = ''Y'''||
9337 ',last_update_date = sysdate '||
9338 ',last_updated_by = '||gv_apps_user_id||
9339 ',last_update_login = '||gv_login_id||
9340 ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9341 ' FROM '||p_target_b_table||
9342 ' WHERE to_char('||p_member_dc_col||') = :b_member_display_code'||
9343 v_dimlabel_cond||
9344 ')'||
9345 ' AND :b_t_a_status = ''LOAD''';
9346
9347 END IF;
9348 FEM_ENGINES_PKG.TECH_MESSAGE
9349 (c_log_level_2,c_block||'.'||
9350 'build_enable_update_stmt','End');
9351
9352 END build_enable_update_stmt;
9353
9354 /*===========================================================================+
9355 | PROCEDURE
9356 | BUILD_TL_DUPNAME_STMT
9357 |
9358 | DESCRIPTION
9359 | Builds the dynamic SELECT statement for verifying if
9360 | a translatable name already exists for another dimension
9361 | member
9362 |
9363 | SCOPE - PRIVATE
9364 |
9365 | NOTES
9366 |
9367 | MODIFICATION HISTORY
9368 | Rob Flippo 13-MAR-06 Created
9369 |
9370 +===========================================================================*/
9371
9372 procedure build_tl_dupname_stmt (p_dimension_varchar_label IN VARCHAR2
9373 ,p_dimension_id IN NUMBER
9374 ,p_load_type IN VARCHAR2
9375 ,p_target_b_table IN VARCHAR2
9376 ,p_target_tl_table IN VARCHAR2
9377 ,p_member_col IN VARCHAR2
9378 ,p_member_dc_col IN VARCHAR2
9379 ,p_member_name_col IN VARCHAR2
9380 ,p_value_set_required_flag IN VARCHAR2
9381 ,p_calling_mode IN VARCHAR2
9382 ,x_select_stmt OUT NOCOPY VARCHAR2)
9383 IS
9384
9385 v_dim_id_where_cond VARCHAR2(1000);
9386 v_vs_where_cond VARCHAR2(1000);
9387
9388 BEGIN
9389 FEM_ENGINES_PKG.TECH_MESSAGE
9390 (c_log_level_2,c_block||'.'||
9391 'build_tl_dupname_stmt','Begin Build select statement for dupname check');
9392
9393 IF p_load_type IN ('DIMENSION_GROUP') THEN
9394 v_dim_id_where_cond := ' AND B.dimension_id = '||p_dimension_id;
9395 ELSE
9396 v_dim_id_where_cond := '';
9397 END IF;
9398
9399
9400 IF p_dimension_varchar_label = 'CAL_PERIOD'
9401 AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9402 IF p_calling_mode = 'NEW_MEMBERS' THEN
9403 x_select_stmt :=
9404 'SELECT count(*) FROM '||p_target_tl_table||
9405 ' WHERE '||p_member_name_col||' = :b_member_name'||
9406 ' AND dimension_group_id = :b_dimgrp_id'||
9407 ' AND calendar_id = :b_calendar_id';
9408 ELSE
9409 x_select_stmt :=
9410 'SELECT count(*) FROM '||
9411 p_target_tl_table||' T, '||p_target_b_table||' B'||
9412 ' WHERE T.'||p_member_name_col||' = :b_member_name'||
9413 ' AND T.'||p_member_col||' = B.'||p_member_col||
9414 ' AND to_char(B.'||p_member_dc_col||') <> :b_member_dc'||
9415 ' AND T.language = :b_lang'||
9416 ' AND T.dimension_group_id = :b_dimgrp_id'||
9417 ' AND T.calendar_id = :b_calendar_id';
9418 END IF;
9419
9420
9421 ELSE
9422 IF p_calling_mode = 'NEW_MEMBERS' THEN
9423 IF p_value_set_required_flag = 'Y'
9424 AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9425 v_vs_where_cond := ' AND value_set_id = (SELECT value_set_id'||
9426 ' FROM fem_value_sets_b '||
9427 ' WHERE value_set_display_code = :vs_dc)';
9428 ELSE v_vs_where_cond := '';
9429 END IF;
9430
9431 x_select_stmt :=
9432 'SELECT count(*) FROM '||p_target_tl_table||
9433 ' WHERE '||p_member_name_col||' = :b_member_name'||
9434 v_vs_where_cond;
9435 ELSE
9436 IF p_value_set_required_flag = 'Y'
9437 AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9438 v_vs_where_cond := ' AND B.value_set_id = T.value_set_id'||
9439 ' AND B.value_set_id = (SELECT value_set_id'||
9440 ' FROM fem_value_sets_b '||
9441 ' WHERE value_set_display_code = :vs_dc)';
9442 ELSE v_vs_where_cond := '';
9443 END IF;
9444
9445 x_select_stmt :=
9446 'SELECT count(*) FROM '||
9447 p_target_tl_table||' T, '||p_target_b_table||' B'||
9448 ' WHERE T.'||p_member_name_col||' = :b_member_name'||
9449 ' AND T.'||p_member_col||' = B.'||p_member_col||
9450 ' AND to_char(B.'||p_member_dc_col||') <> :b_member_dc'||
9451 ' AND T.language = :b_lang'||
9452 v_vs_where_cond||
9453 v_dim_id_where_cond;
9454 END IF;
9455
9456 END IF; -- cal_period
9457
9458 FEM_ENGINES_PKG.TECH_MESSAGE
9459 (c_log_level_2,c_block||'.'||
9460 'build_tl_dupname_stmt','End');
9461
9462
9463 END build_tl_dupname_stmt;
9464
9465
9466
9467 /*===========================================================================+
9468 | PROCEDURE
9469 | BUILD_TL_UPDATE_STMT
9470 |
9471 | DESCRIPTION
9472 | Builds the dynamic UPDATE statement for updating
9473 | the translatable names/descriptions for dimension members
9474 |
9475 | SCOPE - PRIVATE
9476 |
9477 | NOTES
9478 | This procedure does not use the table handlers for performing the update,
9479 | since we may be updating multiple languages.
9480 |
9481 |
9482 | MODIFICATION HISTORY
9483 | Rob Flippo 22-OCT-03 Created
9484 |
9485 | Rob Flippo 16-FEB-05 Bug#4189544 DIMENSION GROUP LOADER ISSUE
9486 | add dimension_id where condition when target
9487 | table is fem_dimension_grps_b
9488 | Rob Flippo 22-MAR-05 Fix problem with same display_code in multiple
9489 | value sets (single row query returns multiple rows)
9490 | Rob Flippo 10-MAR-06 Bug#5068022 modify update so that only
9491 | records where status in the array = 'LOAD' get
9492 | updated
9493 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
9494 | Rob Flippo 15-MAR-07 Bug#5905501 Need to update source_lang so that
9495 | translated rows get marked properly
9496 +===========================================================================*/
9497
9498
9499 procedure build_tl_update_stmt (p_dimension_varchar_label IN VARCHAR2
9500 ,p_dimension_id IN NUMBER
9501 ,p_load_type IN VARCHAR2
9502 ,p_target_b_table IN VARCHAR2
9503 ,p_target_tl_table IN VARCHAR2
9504 ,p_member_col IN VARCHAR2
9505 ,p_member_dc_col IN VARCHAR2
9506 ,p_member_name_col IN VARCHAR2
9507 ,p_member_description_col IN VARCHAR2
9508 ,p_value_set_required_flag IN VARCHAR2
9509 ,x_update_stmt OUT NOCOPY VARCHAR2)
9510
9511 IS
9512
9513 v_dim_id_where_cond VARCHAR2(1000);
9514
9515 BEGIN
9516 FEM_ENGINES_PKG.TECH_MESSAGE
9517 (c_log_level_2,c_block||'.'||
9518 'build_tl_update_stmt','Begin Build update statement for TL table');
9519
9520 IF p_load_type IN ('DIMENSION_GROUP') THEN
9521 v_dim_id_where_cond := ' AND dimension_id = '||p_dimension_id;
9522 ELSE
9523 v_dim_id_where_cond := '';
9524 END IF;
9525
9526 IF (p_dimension_varchar_label = 'CAL_PERIOD') AND
9527 p_load_type NOT IN ('DIMENSION_GROUP') THEN
9528
9529 x_update_stmt :=
9530 'UPDATE '||p_target_tl_table||
9531 ' SET '||p_member_name_col||' = :b_member_name,'||
9532 p_member_description_col||' = :b_member_desc'||
9533 ',source_lang = :b_source_lang'||
9534 ',last_update_date = sysdate '||
9535 ',last_updated_by = :b_apps_user_id'||
9536 ',last_update_login = :b_login_id'||
9537 ' WHERE to_char('||p_member_col||') = :b_member_code'||
9538 ' AND language = :b_language'||
9539 ' AND :b_status = ''LOAD''';
9540
9541 ELSIF (p_value_set_required_flag = 'Y') AND
9542 p_load_type NOT IN ('DIMENSION_GROUP') THEN
9543
9544 x_update_stmt :=
9545 'UPDATE '||p_target_tl_table||
9546 ' SET '||p_member_name_col||' = :b_member_name,'||
9547 p_member_description_col||' = :b_member_desc'||
9548 ',source_lang = :b_source_lang'||
9549 ',last_update_date = sysdate '||
9550 ',last_updated_by = :b_apps_user_id'||
9551 ',last_update_login = :b_login_id'||
9552 ' WHERE '||p_member_col||' = (SELECT T.'||p_member_col||
9553 ' FROM '||p_target_b_table||' T'||
9554 ',fem_value_sets_b V'||
9555 ' WHERE to_char(T.'||p_member_dc_col||') = :b_member_display_code'||
9556 ' AND T.value_set_id = V.value_set_id'||
9557 ' AND V.value_set_display_code = :b_value_set_display_code'||
9558 ')'||
9559 ' AND value_set_id = (SELECT value_set_id FROM FEM_VALUE_SETS_B'||
9560 ' WHERE value_set_display_code = :b_value_set_display_code)'||
9561 ' AND language = :b_language'||
9562 ' AND :b_status = ''LOAD''';
9563
9564
9565 ELSE
9566
9567 x_update_stmt :=
9568 'UPDATE '||p_target_tl_table||
9569 ' SET '||p_member_name_col||' = :b_member_name,'||
9570 p_member_description_col||' = :b_member_desc'||
9571 ',source_lang = :b_source_lang'||
9572 ',last_update_date = sysdate '||
9573 ',last_updated_by = :b_apps_user_id'||
9574 ',last_update_login = :b_login_id'||
9575 ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9576 ' FROM '||p_target_b_table||
9577 ' WHERE to_char('||p_member_dc_col||') = :b_member_display_code'||
9578 v_dim_id_where_cond||
9579 ')'||
9580 ' AND language = :b_language'||
9581 ' AND :b_status = ''LOAD''';
9582
9583 END IF;
9584 FEM_ENGINES_PKG.TECH_MESSAGE
9585 (c_log_level_2,c_block||'.'||
9586 'build_tl_update_stmt','End');
9587
9588 END build_tl_update_stmt;
9589
9590
9591 /*===========================================================================+
9592 | PROCEDURE
9593 | BUILD_ATTR_LVLSPEC_SELECT_STMT
9594 |
9595 | DESCRIPTION
9596 | Procedure for building the dynamic SELECT statement for
9597 | retrieving attribute rows from the ATTR_T table
9598 | where the attribute is level specific but the member
9599 | does not belong to the level. This is so we can update
9600 | the row with status = 'INVALID_LVL_SPEC_ATTR_LABEL'.
9601 |
9602 | SCOPE - PRIVATE
9603 |
9604 | NOTES
9605 |
9606 |
9607 | MODIFICATION HISTORY
9608 | Rob Flippo 09-JUN-05 Created
9609 |
9610 +===========================================================================*/
9611
9612 procedure build_attr_lvlspec_select_stmt (p_dimension_varchar_label IN VARCHAR2
9613 ,p_dimension_id IN NUMBER
9614 ,p_source_b_table IN VARCHAR2
9615 ,p_source_attr_table IN VARCHAR2
9616 ,p_target_b_table IN VARCHAR2
9617 ,p_member_t_dc_col IN VARCHAR2
9618 ,p_member_dc_col IN VARCHAR2
9619 ,p_value_set_required_flag IN VARCHAR2
9620 ,p_shared_dimension_flag IN VARCHAR2
9621 ,p_hier_dimension_flag IN VARCHAR2
9622 ,p_outer_join_flag IN VARCHAR2
9623 ,p_exec_mode_clause IN VARCHAR2
9624 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
9625 IS
9626 -- Value Set where conditions
9627 v_value_set_where_cond VARCHAR2(1000);
9628 v_value_set_select_T1 VARCHAR2(1000);
9629 v_value_set_select_T2 VARCHAR2(1000);
9630 v_vs_where_M2 VARCHAR2(1000); -- where condition for Specific Member='No'
9631 v_vs_table VARCHAR2(1000);
9632
9633 -- Special conditions to handle CAL_PERIOD
9634 v_member_code VARCHAR2(1000);
9635 v_calendar_id VARCHAR2(100);
9636 v_calendar_table VARCHAR2(100);
9637 v_calendar_where_cond VARCHAR2(1000);
9638 v_member_dc_where_cond VARCHAR2(1000);
9639
9640 -- additional conditions
9641 v_outer_join VARCHAR2(3);
9642 v_dim_label_where_cond VARCHAR2(1000);
9643
9644
9645 BEGIN
9646 FEM_ENGINES_PKG.TECH_MESSAGE
9647 (c_log_level_2,c_block||'.'||
9648 'build_attr_lvlspec_select_stmt',
9649 'Begin Build select statement for level specific attribute assignments from source _ATTR_T table');
9650
9651 IF p_outer_join_flag = 'Y' THEN
9652 v_outer_join := '(+)';
9653 ELSE
9654 v_outer_join := '';
9655 END IF; -- p_outer_join_flag
9656
9657 IF p_shared_dimension_flag = 'Y' THEN
9658 v_dim_label_where_cond :=
9659 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9660 ELSE
9661 v_dim_label_where_cond := '';
9662 END IF;
9663
9664
9665 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
9666
9667 v_member_code :=
9668 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
9669 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
9670 'LPAD(to_char(C.calendar_id),5,''0'')||'||
9671 'LPAD(to_char(D.time_dimension_group_key),5,''0'') ';
9672
9673 x_attr_select_stmt :=
9674 'SELECT T2.base_rowid'||
9675 ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9676 ' FROM fem_dim_attributes_b A1'||
9677 ',fem_dim_attr_versions_b V1'||
9678 ',fem_dimensions_b B1'||
9679 ',(SELECT B.rowid base_rowid'||
9680 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9681 ', B.cal_period_number CAL_PERIOD_NUMBER'||
9682 ', C.calendar_id CALENDAR_ID'||
9683 ', C.calendar_display_code CALENDAR_DC'||
9684 ', D.dimension_group_id DIMENSION_GROUP_ID'||
9685 ', D.dimension_group_display_code DIMENSION_GROUP_DC'||
9686 ', B.version_display_code'||
9687 ', B.attribute_assign_value'||
9688 ', B.attr_assign_vs_display_code'||
9689 ', B.cal_period_end_date'||
9690 ', B.CALPATTR_CAL_DISPLAY_CODE'||
9691 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9692 ', B.CALPATTR_END_DATE'||
9693 ', B.CALPATTR_PERIOD_NUM'||
9694 ' FROM '||p_source_attr_table||' B'||
9695 ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
9696 ' WHERE B.calendar_display_code = C.calendar_display_code '||
9697 ' AND B.status'||p_exec_mode_clause||
9698 ' AND {{data_slice}} '||
9699 ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
9700 ' AND D.dimension_id = '||p_dimension_id||') T2'||
9701 ', '||p_target_b_table||' M2'||
9702 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9703 ' AND B1.dimension_id = A1.dimension_id'||
9704 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9705 ' AND T2.version_display_code = V1.version_display_code'||
9706 ' AND V1.attribute_id = A1.attribute_id'||
9707 ' AND V1.aw_snapshot_flag = ''N'''||
9708 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9709 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9710 ' AND ('||
9711 ' ((A1.attribute_required_flag =''N'') '||
9712 ' AND (A1.attribute_id IN (SELECT attribute_id'||
9713 ' FROM fem_dim_attr_grps AG2)))'||
9714 ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9715 ' FROM fem_dim_attr_grps AG3'||
9716 ' WHERE AG3.dimension_group_id = T2.dimension_group_id)))';
9717
9718 ELSE -- not a Cal Period
9719 v_member_code := p_member_t_dc_col;
9720
9721 IF (p_hier_dimension_flag = 'Y')
9722 AND (p_value_set_required_flag = 'Y') THEN
9723
9724 x_attr_select_stmt :=
9725 'SELECT T2.base_rowid'||
9726 ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9727 ' FROM fem_dim_attributes_b A1'||
9728 ',fem_dim_attr_versions_b V1'||
9729 ',fem_dimensions_b B1'||
9730 ',(SELECT B.rowid base_rowid'||
9731 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9732 ', B.value_set_display_code'||
9733 ', B.version_display_code'||
9734 ', B.attribute_assign_value'||
9735 ', B.attr_assign_vs_display_code'||
9736 ', B.CALPATTR_CAL_DISPLAY_CODE'||
9737 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9738 ', B.CALPATTR_END_DATE'||
9739 ', B.CALPATTR_PERIOD_NUM'||
9740 ' FROM '||p_source_attr_table||' B'||
9741 ' WHERE B.status'||p_exec_mode_clause||
9742 ' AND {{data_slice}} '||
9743 ') T2'||
9744 ', '||p_target_b_table||' M2'||
9745 ', fem_value_sets_b V2'||
9746 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9747 ' AND B1.dimension_id = A1.dimension_id'||
9748 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9749 ' AND T2.version_display_code = V1.version_display_code'||
9750 ' AND V1.attribute_id = A1.attribute_id'||
9751 ' AND V1.aw_snapshot_flag = ''N'''||
9752 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9753 ' AND M2.value_set_id = V2.value_set_id '||
9754 ' AND V2.value_set_display_code = T2.value_set_display_code'||
9755 ' AND V2.dimension_id = '||p_dimension_id||
9756 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9757 ' AND ('||
9758 ' ((A1.attribute_required_flag =''N'') '||
9759 ' AND (A1.attribute_id IN (SELECT attribute_id'||
9760 ' FROM fem_dim_attr_grps AG2)))'||
9761 ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9762 ' FROM fem_dim_attr_grps AG3'||
9763 ' WHERE AG3.dimension_group_id = M2.dimension_group_id)))';
9764
9765 ELSIF (p_hier_dimension_flag = 'Y')
9766 AND (p_value_set_required_flag = 'N') THEN
9767
9768 x_attr_select_stmt :=
9769 'SELECT T2.base_rowid'||
9770 ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9771 ' FROM fem_dim_attributes_b A1'||
9772 ',fem_dim_attr_versions_b V1'||
9773 ',fem_dimensions_b B1'||
9774 ',(SELECT B.rowid base_rowid'||
9775 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9776 ', B.version_display_code'||
9777 ', B.attribute_assign_value'||
9778 ', B.attr_assign_vs_display_code'||
9779 ', B.CALPATTR_CAL_DISPLAY_CODE'||
9780 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9781 ', B.CALPATTR_END_DATE'||
9782 ', B.CALPATTR_PERIOD_NUM'||
9783 ' FROM '||p_source_attr_table||' B'||
9784 ' WHERE B.status'||p_exec_mode_clause||
9785 v_dim_label_where_cond||
9786 ' AND {{data_slice}} '||
9787 ') T2'||
9788 ', '||p_target_b_table||' M2'||
9789 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9790 ' AND B1.dimension_id = A1.dimension_id'||
9791 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9792 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9793 ' AND T2.version_display_code = V1.version_display_code'||
9794 ' AND V1.attribute_id = A1.attribute_id'||
9795 ' AND V1.aw_snapshot_flag = ''N'''||
9796 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9797 ' AND ('||
9798 ' ((A1.attribute_required_flag =''N'') '||
9799 ' AND (A1.attribute_id IN (SELECT attribute_id'||
9800 ' FROM fem_dim_attr_grps AG2)))'||
9801 ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9802 ' FROM fem_dim_attr_grps AG3'||
9803 ' WHERE AG3.dimension_group_id = M2.dimension_group_id)))';
9804
9805 END IF;
9806 END IF; -- IF Cal Period 'Y' or 'N'
9807
9808
9809 FEM_ENGINES_PKG.TECH_MESSAGE
9810 (c_log_level_2,c_block||'.'||
9811 'build_attr_lvlspec_select_stmt',
9812 'End');
9813
9814
9815 END build_attr_lvlspec_select_stmt;
9816
9817
9818
9819 /*===========================================================================+
9820 | PROCEDURE
9821 | BUILD_ATTR_SELECT_STMT
9822 |
9823 | DESCRIPTION
9824 | Procedure for building the dynamic SELECT statement for
9825 | retrieving attribute rows from the ATTR_T table
9826 | along with the corresponding attribute metadata from
9827 | FEM_DIM_ATTRIBUTES_B
9828 |
9829 | SCOPE - PRIVATE
9830 |
9831 | NOTES
9832 | Procedure is split into 4 sections:
9833 | For CAL Period - getting for new specific member
9834 | getting only where member exists, but multiple members
9835 | For Value Set Dim - getting for new specific member
9836 | getting only where member exists but mult members
9837 |
9838 | When getting for new specific member:
9839 | Only get default version of 'Req' attributes
9840 |
9841 | This means that when processing new members, only required attributes
9842 | are read. All other attribute assignments get loaded only after
9843 | the member is already created.
9844 |
9845 |
9846 | MODIFICATION HISTORY
9847 | Rob Flippo 23-OCT-03 Created
9848 | Rob Flippo 13-SEP-04 Modified so that when looking for required attributes
9849 | (in the specific member select), we don't care if
9850 | any rows exist in FEM_DIM_ATTR_GRPS, because Req
9851 | attributes not allowed to be assigned in that table
9852 | However, when specific_member = 'N', we do need to
9853 | check FEM_DIM_ATTR_GRPS.
9854 |
9855 | The logic for checking is as follows:
9856 | If attribute_required_flag = 'N', then we
9857 | check FEM_DIM_ATTR_GRPS to see if it has been
9858 | assigned specifically to any groups. But if the
9859 | attribute_required_flag='Y', then we don't check.
9860 |
9861 | Also - modified all of the queries to join with the
9862 | fem_dim_attr_versions_b table and restrict on min(version_id)
9863 | Previously, this was only occuring for specific_member='Y'.
9864 | This needs to occur for every attribute query since
9865 | the pre_validation_attr procedure already exists to mark
9866 | rows with invalid version_display_code.
9867 | Rob Flippo 01-OCT-04 Modified query to retieve member read_only_flag
9868 | for the "specific_member=Y" queries (i.e., the queries used
9869 | by the attr_assign_update procedure to update attr
9870 | of existing members); For "specific_member=N", it returns
9871 | null for that flag;
9872 | Rob Flippo 12-NOV-04 Add where condition on aw_snapshot_flag = 'N' so that
9873 | users can't try to update snapshot versions using the
9874 | loader
9875 | Rob Flippo 04-JAN-05 For CAL_PERIOD, added a new column
9876 | to the select for "use_interim_table_flag = Y". This
9877 | info is only queried during the ATTR_ASSIGN_UPDATE
9878 | to identify any CAL Period attributes that require
9879 | use of the FEM_CALP_ATTR_INTERIM_T table prior to
9880 | moving the assignment into FEM
9881 |
9882 | Also added selection of new columns for Spec Mbr =N
9883 | for CAL_PERIOD so that we have enough information to
9884 | insert into the INTERIM tables for overlap checking
9885 |
9886 | Bug#3822561 Added 4 new CALPATTR columns to all
9887 | Select statements to support attributes of CAL_PERIOD
9888 |
9889 | Also - for non-value set dims, added where condition
9890 | for dimension_varchar_label if the dim uses the shared
9891 | attr table
9892 | Rob Flippo 15-MAR-05 Bug#4226011 Modified to only retreive attributes where
9893 | user_assign_allowed_flag not in ('N');
9894 | Rob Flippo 09-JUN-05 Modify for Specific_mbr_flag='N' case
9895 | where dim supports levels (hier_flag=Y)
9896 | but is value_set_required='N'
9897 | Rob Flippo 11-AUG-05 Bug#4547868 get member_id and value_set_id
9898 | for the attr_update phase
9899 +===========================================================================*/
9900
9901 procedure build_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
9902 ,p_dimension_id IN NUMBER
9903 ,p_source_b_table IN VARCHAR2
9904 ,p_source_attr_table IN VARCHAR2
9905 ,p_target_b_table IN VARCHAR2
9906 ,p_member_t_dc_col IN VARCHAR2
9907 ,p_member_dc_col IN VARCHAR2
9908 ,p_member_col IN VARCHAR2
9909 ,p_value_set_required_flag IN VARCHAR2
9910 ,p_shared_dimension_flag IN VARCHAR2
9911 ,p_hier_dimension_flag IN VARCHAR2
9912 ,p_outer_join_flag IN VARCHAR2
9913 ,p_specific_member_flag IN VARCHAR2
9914 ,p_exec_mode_clause IN VARCHAR2
9915 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
9916 IS
9917 -- Value Set where conditions
9918 v_value_set_where_cond VARCHAR2(1000);
9919 v_value_set_select_T1 VARCHAR2(1000);
9920 v_value_set_select_T2 VARCHAR2(1000);
9921 v_vs_where_M2 VARCHAR2(1000); -- where condition for Specific Member='No'
9922 v_vs_table VARCHAR2(1000);
9923
9924 -- Special conditions to handle CAL_PERIOD
9925 v_member_code VARCHAR2(1000);
9926 v_calendar_id VARCHAR2(100);
9927 v_calendar_table VARCHAR2(100);
9928 v_calendar_where_cond VARCHAR2(1000);
9929 v_member_dc_where_cond VARCHAR2(1000);
9930
9931 -- additional conditions
9932 v_outer_join VARCHAR2(3);
9933 v_dim_label_where_cond VARCHAR2(1000);
9934 v_spcmbr_dim_label_where_cond VARCHAR2(1000);
9935
9936
9937 BEGIN
9938 FEM_ENGINES_PKG.TECH_MESSAGE
9939 (c_log_level_2,c_block||'.'||
9940 'build_attr_select_stmt',
9941 'Begin Build select statement for attributes from source _ATTR_T table');
9942
9943 -- The Specific Member Flag indicates if we are looking for attributes of a
9944 -- given Member ID and Value Set where attribute_required_flag = 'Y'.
9945 -- If we are not looking for a specific member, then we are looking only
9946 -- for attributes where the member already exists
9947 -- The SQL for "specific Member" is used when creating new members,
9948 -- since it does not require that the member exist, and also only gets
9949 -- attr assignments for the "default" version
9950
9951
9952 IF p_outer_join_flag = 'Y' THEN
9953 v_outer_join := '(+)';
9954 ELSE
9955 v_outer_join := '';
9956 END IF; -- p_outer_join_flag
9957
9958 IF p_shared_dimension_flag = 'Y' THEN
9959 v_dim_label_where_cond :=
9960 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9961 v_spcmbr_dim_label_where_cond :=
9962 ' AND S1.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9963 ELSE
9964 v_dim_label_where_cond := '';
9965 v_spcmbr_dim_label_where_cond := '';
9966 END IF;
9967
9968 /*
9969 IF p_value_set_required_flag = 'Y' THEN
9970 v_value_set_where_cond := ' AND T2.value_set_display_code'||v_outer_join||' = :b_value_set_display_code';
9971 v_value_set_select_T1 := ', T1.value_set_display_code';
9972 v_value_set_select_T2 := ', T2.value_set_display_code';
9973 v_vs_where_M2 := ' AND M2.value_set_id = V2.value_set_id '||
9974 ' AND V2.value_set_display_code = T2.value_set_display_code';
9975 v_vs_table := ', fem_value_sets_b V2';
9976
9977
9978 ELSE
9979 v_value_set_where_cond := '';
9980 v_value_set_select_T1 := ',null';
9981 v_value_set_select_T2 := ',null';
9982 v_vs_where_M2 := '';
9983 v_vs_table := '';
9984
9985 END IF; */
9986
9987 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
9988
9989 v_member_code :=
9990 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
9991 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
9992 'LPAD(to_char(C.calendar_id),5,''0'')||'||
9993 'LPAD(to_char(D.time_dimension_group_key),5,''0'') ';
9994 /*
9995 v_calendar_id := ', C.calendar_id';
9996 v_calendar_table := ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D';
9997 v_calendar_where_cond := ' WHERE T1.calendar_display_code = C.calendar_display_code '||
9998 ' AND T1.dimension_group_display_code = D.dimension_group_display_code';
9999 */
10000
10001 IF (p_specific_member_flag = 'Y') THEN
10002 -- Data_slc predicate does not apply
10003 x_attr_select_stmt :=
10004 'SELECT T2.base_rowid'||
10005 ' ,null'||
10006 ' ,A1.attribute_id'||
10007 ' ,A1.attribute_varchar_label'||
10008 ' ,A1.attribute_dimension_id'||
10009 ' ,A1.attribute_value_column_name'||
10010 ' ,A1.attribute_data_type_code'||
10011 ' ,A1.attribute_required_flag'||
10012 ' ,A1.assignment_is_read_only_flag'||
10013 ' ,A1.allow_multiple_versions_flag'||
10014 ' ,A1.allow_multiple_assignment_flag'||
10015 ' ,T2.member_code'||
10016 ' ,null'||
10017 ' ,T2.attribute_assign_value'||
10018 ' ,null, null, null, null, null'||
10019 ' ,T2.version_display_code, null'||
10020 ' ,T2.attr_assign_vs_display_code, null'||
10021 ' ,''LOAD'''||
10022 ',''Y'''||
10023 ', T2.CALPATTR_CAL_DISPLAY_CODE'||
10024 ', T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10025 ', T2.CALPATTR_END_DATE'||
10026 ', T2.CALPATTR_PERIOD_NUM'||
10027 ' FROM fem_dim_attributes_b A1'||
10028 ',fem_dim_attr_versions_b V1'||
10029 ',fem_dimensions_b B1'||
10030 ',(SELECT B.rowid base_rowid'||
10031 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10032 ', D.dimension_group_id'||
10033 ', B.version_display_code'||
10034 ', B.attribute_assign_value'||
10035 ', B.attr_assign_vs_display_code'||
10036 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10037 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10038 ', B.CALPATTR_END_DATE'||
10039 ', B.CALPATTR_PERIOD_NUM'||
10040 ' FROM '||p_source_attr_table||' B'||
10041 ','||p_source_b_table||' S1'||
10042 ', fem_dimension_grps_b D'||
10043 ', FEM_CALENDARS_VL C'||
10044 ' WHERE B.calendar_display_code = C.calendar_display_code'||
10045 ' AND S1.calendar_display_code = B.calendar_display_code'||
10046 ' AND S1.dimension_group_display_code = B.dimension_group_display_code'||
10047 ' AND S1.cal_period_end_date = B.cal_period_end_date'||
10048 ' AND S1.cal_period_number = B.cal_period_number'||
10049 ' AND B.status'||p_exec_mode_clause||
10050 ' AND S1.dimension_group_display_code = D.dimension_group_display_code'||
10051 ' AND D.dimension_id = '||p_dimension_id||') T2'||
10052 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10053 ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10054 ' AND B1.dimension_id = A1.dimension_id'||
10055 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10056 ' AND T2.version_display_code = V1.version_display_code'||
10057 ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10058 ' WHERE V3.default_version_flag = ''Y'''||
10059 ' AND V3.aw_snapshot_flag = ''N'''||
10060 ' AND V3.attribute_id = A1.attribute_id)'||
10061 ' AND A1.attribute_id = V1.attribute_id'||
10062 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10063 ' AND A1.attribute_required_flag = ''Y''';
10064
10065
10066 ELSE
10067 x_attr_select_stmt :=
10068 'SELECT T2.base_rowid'||
10069 ' ,M2.read_only_flag'||
10070 ' ,A1.attribute_id'||
10071 ' ,A1.attribute_varchar_label'||
10072 ' ,A1.attribute_dimension_id'||
10073 ' ,A1.attribute_value_column_name'||
10074 ' ,A1.attribute_data_type_code'||
10075 ' ,A1.attribute_required_flag'||
10076 ' ,A1.assignment_is_read_only_flag'||
10077 ' ,A1.allow_multiple_versions_flag'||
10078 ' ,A1.allow_multiple_assignment_flag'||
10079 ' ,T2.member_code'||
10080 ' ,null'||
10081 ' ,T2.member_code'||
10082 ' ,null'||
10083 ' ,T2.attribute_assign_value'||
10084 ' ,null, null, null, null, null'||
10085 ' ,T2.version_display_code, null'||
10086 ' ,T2.attr_assign_vs_display_code, null'||
10087 ' ,T2.cal_period_end_date'||
10088 ' ,''LOAD'' '||
10089 ',decode(A1.attribute_varchar_label,''CAL_PERIOD_START_DATE'',''Y'',''N'')'||
10090 ' ,T2.cal_period_number'||
10091 ' ,T2.calendar_dc'||
10092 ' ,T2.calendar_id'||
10093 ' ,T2.dimension_group_dc'||
10094 ' ,T2.dimension_group_id'||
10095 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10096 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10097 ' ,T2.CALPATTR_END_DATE'||
10098 ' ,T2.CALPATTR_PERIOD_NUM'||
10099 ' FROM fem_dim_attributes_b A1'||
10100 ',fem_dim_attr_versions_b V1'||
10101 ',fem_dimensions_b B1'||
10102 ',(SELECT B.rowid base_rowid'||
10103 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10104 ', B.cal_period_number CAL_PERIOD_NUMBER'||
10105 ', C.calendar_id CALENDAR_ID'||
10106 ', C.calendar_display_code CALENDAR_DC'||
10107 ', D.dimension_group_id DIMENSION_GROUP_ID'||
10108 ', D.dimension_group_display_code DIMENSION_GROUP_DC'||
10109 ', B.version_display_code'||
10110 ', B.attribute_assign_value'||
10111 ', B.attr_assign_vs_display_code'||
10112 ', B.cal_period_end_date'||
10113 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10114 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10115 ', B.CALPATTR_END_DATE'||
10116 ', B.CALPATTR_PERIOD_NUM'||
10117 ' FROM '||p_source_attr_table||' B'||
10118 ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
10119 ' WHERE B.calendar_display_code = C.calendar_display_code '||
10120 ' AND B.status'||p_exec_mode_clause||
10121 ' AND {{data_slice}} '||
10122 ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
10123 ' AND D.dimension_id = '||p_dimension_id||') T2'||
10124 ', '||p_target_b_table||' M2'||
10125 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10126 ' AND B1.dimension_id = A1.dimension_id'||
10127 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10128 ' AND T2.version_display_code = V1.version_display_code'||
10129 ' AND V1.attribute_id = A1.attribute_id'||
10130 ' AND V1.aw_snapshot_flag = ''N'''||
10131 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10132 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10133 ' AND (((A1.attribute_required_flag = ''Y''))'||
10134 ' OR ((A1.attribute_required_flag =''N'') AND '||
10135 ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10136 ' FROM fem_dim_attr_grps AG1))'||
10137 ' OR (A1.attribute_id IN (SELECT attribute_id'||
10138 ' FROM fem_dim_attr_grps AG2'||
10139 ' WHERE AG2.dimension_group_id = T2.dimension_group_id))))';
10140
10141
10142 END IF; -- specific member flag 'Y' or 'N' for Cal Period
10143
10144 ELSE -- not a Cal Period
10145 v_member_code := p_member_t_dc_col;
10146 /*
10147 v_calendar_id := '';
10148 v_calendar_table := '';
10149 v_calendar_where_cond := '';
10150 v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
10151 '=T.'||p_member_t_dc_col; */
10152
10153
10154 IF (p_specific_member_flag = 'Y')
10155 AND ((p_hier_dimension_flag = 'Y') OR (p_hier_dimension_flag = 'N'))
10156 AND (p_value_set_required_flag = 'Y') THEN
10157 -- Data_slc predicate does not apply
10158 x_attr_select_stmt :=
10159 'SELECT T2.base_rowid'||
10160 ' ,null'||
10161 ' ,A1.attribute_id'||
10162 ' ,A1.attribute_varchar_label'||
10163 ' ,A1.attribute_dimension_id'||
10164 ' ,A1.attribute_value_column_name'||
10165 ' ,A1.attribute_data_type_code'||
10166 ' ,A1.attribute_required_flag'||
10167 ' ,A1.assignment_is_read_only_flag'||
10168 ' ,A1.allow_multiple_versions_flag'||
10169 ' ,A1.allow_multiple_assignment_flag'||
10170 ',T2.member_code'||
10171 ', T2.value_set_display_code'||
10172 ' ,T2.attribute_assign_value'||
10173 ' ,null, null, null, null, null'||
10174 ' ,T2.version_display_code, null'||
10175 ' ,T2.attr_assign_vs_display_code, null'||
10176 ' ,''LOAD'' '||
10177 ' ,''N'''||
10178 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10179 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10180 ' ,T2.CALPATTR_END_DATE'||
10181 ' ,T2.CALPATTR_PERIOD_NUM'||
10182 ' FROM fem_dim_attributes_b A1'||
10183 ',fem_dim_attr_versions_b V1'||
10184 ',fem_dimensions_b B1'||
10185 ',(SELECT B.rowid base_rowid'||
10186 ', B.attribute_varchar_label,B.'||v_member_code||' MEMBER_CODE'||
10187 ', B.value_set_display_code'||
10188 ', B.version_display_code'||
10189 ', B.attribute_assign_value'||
10190 ', B.attr_assign_vs_display_code'||
10191 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10192 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10193 ', B.CALPATTR_END_DATE'||
10194 ', B.CALPATTR_PERIOD_NUM'||
10195 ' FROM '||p_source_attr_table||' B'||
10196 ','||p_source_b_table||' S1'||
10197 ' WHERE S1.'||v_member_code||' = B.'||v_member_code||
10198 ' AND S1.value_set_display_code = B.value_set_display_code'||
10199 ' AND B.status'||p_exec_mode_clause||') T2 '||
10200 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10201 ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10202 ' AND B1.dimension_id = A1.dimension_id'||
10203 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10204 ' AND T2.version_display_code = V1.version_display_code'||
10205 ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10206 ' WHERE V3.default_version_flag = ''Y'''||
10207 ' AND V3.aw_snapshot_flag = ''N'''||
10208 ' AND V3.attribute_id = A1.attribute_id)'||
10209 ' AND A1.attribute_id = V1.attribute_id'||
10210 ' AND T2.value_set_display_code'||v_outer_join||' = :b_value_set_display_code'||
10211 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10212 ' AND A1.attribute_required_flag = ''Y''';
10213
10214
10215 ELSIF (p_specific_member_flag = 'Y')
10216 AND ((p_hier_dimension_flag = 'N') OR (p_hier_dimension_flag = 'Y'))
10217 AND (p_value_set_required_flag = 'N') THEN
10218 -- Data_slc predicate does not apply
10219 x_attr_select_stmt :=
10220 'SELECT T2.base_rowid'||
10221 ' ,null'||
10222 ' ,A1.attribute_id'||
10223 ' ,A1.attribute_varchar_label'||
10224 ' ,A1.attribute_dimension_id'||
10225 ' ,A1.attribute_value_column_name'||
10226 ' ,A1.attribute_data_type_code'||
10227 ' ,A1.attribute_required_flag'||
10228 ' ,A1.assignment_is_read_only_flag'||
10229 ' ,A1.allow_multiple_versions_flag'||
10230 ' ,A1.allow_multiple_assignment_flag'||
10231 ',T2.member_code'||
10232 ', null'||
10233 ' ,T2.attribute_assign_value'||
10234 ' ,null, null, null, null, null'||
10235 ' ,T2.version_display_code, null'||
10236 ' ,T2.attr_assign_vs_display_code, null'||
10237 ' ,''LOAD'' '||
10238 ' ,''N'''||
10239 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10240 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10241 ' ,T2.CALPATTR_END_DATE'||
10242 ' ,T2.CALPATTR_PERIOD_NUM'||
10243 ' FROM fem_dim_attributes_b A1'||
10244 ',fem_dim_attr_versions_b V1'||
10245 ',fem_dimensions_b B1'||
10246 ',(SELECT B.rowid base_rowid'||
10247 ', B.attribute_varchar_label,B.'||v_member_code||' MEMBER_CODE'||
10248 ', B.version_display_code'||
10249 ', B.attribute_assign_value'||
10250 ', B.attr_assign_vs_display_code'||
10251 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10252 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10253 ', B.CALPATTR_END_DATE'||
10254 ', B.CALPATTR_PERIOD_NUM'||
10255 ' FROM '||p_source_attr_table||' B'||
10256 ','||p_source_b_table||' S1'||
10257 ' WHERE S1.'||v_member_code||' = B.'||v_member_code||
10258 v_dim_label_where_cond||
10259 v_spcmbr_dim_label_where_cond||
10260 ' AND B.status'||p_exec_mode_clause||') T2 '||
10261 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10262 ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10263 ' AND B1.dimension_id = A1.dimension_id'||
10264 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10265 ' AND T2.version_display_code = V1.version_display_code'||
10266 ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10267 ' WHERE V3.default_version_flag = ''Y'''||
10268 ' AND V3.aw_snapshot_flag = ''N'''||
10269 ' AND V3.attribute_id = A1.attribute_id)'||
10270 ' AND A1.attribute_id = V1.attribute_id'||
10271 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10272 ' AND A1.attribute_required_flag = ''Y''';
10273
10274
10275 ELSIF (p_specific_member_flag = 'N')
10276 AND (p_hier_dimension_flag = 'Y')
10277 AND (p_value_set_required_flag = 'Y') THEN
10278
10279 x_attr_select_stmt :=
10280 'SELECT T2.base_rowid'||
10281 ' ,M2.read_only_flag'||
10282 ' ,A1.attribute_id'||
10283 ' ,A1.attribute_varchar_label'||
10284 ' ,A1.attribute_dimension_id'||
10285 ' ,A1.attribute_value_column_name'||
10286 ' ,A1.attribute_data_type_code'||
10287 ' ,A1.attribute_required_flag'||
10288 ' ,A1.assignment_is_read_only_flag'||
10289 ' ,A1.allow_multiple_versions_flag'||
10290 ' ,A1.allow_multiple_assignment_flag'||
10291 ',T2.member_code'||
10292 ', T2.value_set_display_code'||
10293 ', M2.'||p_member_col||
10294 ', M2.value_set_id'||
10295 ' ,T2.attribute_assign_value'||
10296 ' ,null, null, null, null, null'||
10297 ' ,T2.version_display_code, null'||
10298 ' ,T2.attr_assign_vs_display_code, null,null'||
10299 ' ,''LOAD'' '||
10300 ' ,''N'''||
10301 ' ,null'||
10302 ' ,null'||
10303 ' ,null'||
10304 ' ,null'||
10305 ' ,null'||
10306 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10307 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10308 ' ,T2.CALPATTR_END_DATE'||
10309 ' ,T2.CALPATTR_PERIOD_NUM'||
10310 ' FROM fem_dim_attributes_b A1'||
10311 ',fem_dim_attr_versions_b V1'||
10312 ',fem_dimensions_b B1'||
10313 ',(SELECT B.rowid base_rowid'||
10314 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10315 ', B.value_set_display_code'||
10316 ', B.version_display_code'||
10317 ', B.attribute_assign_value'||
10318 ', B.attr_assign_vs_display_code'||
10319 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10320 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10321 ', B.CALPATTR_END_DATE'||
10322 ', B.CALPATTR_PERIOD_NUM'||
10323 ' FROM '||p_source_attr_table||' B'||
10324 ' WHERE B.status'||p_exec_mode_clause||
10325 ' AND {{data_slice}} '||
10326 ') T2'||
10327 ', '||p_target_b_table||' M2'||
10328 ', fem_value_sets_b V2'||
10329 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10330 ' AND B1.dimension_id = A1.dimension_id'||
10331 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10332 ' AND T2.version_display_code = V1.version_display_code'||
10333 ' AND V1.attribute_id = A1.attribute_id'||
10334 ' AND V1.aw_snapshot_flag = ''N'''||
10335 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10336 ' AND M2.value_set_id = V2.value_set_id '||
10337 ' AND V2.value_set_display_code = T2.value_set_display_code'||
10338 ' AND V2.dimension_id = '||p_dimension_id||
10339 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10340 ' AND (((A1.attribute_required_flag = ''Y''))'||
10341 ' OR ((A1.attribute_required_flag =''N'') AND '||
10342 ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10343 ' FROM fem_dim_attr_grps AG1))'||
10344 ' OR (A1.attribute_id IN (SELECT attribute_id'||
10345 ' FROM fem_dim_attr_grps AG2'||
10346 ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10347
10348
10349 ELSIF (p_specific_member_flag = 'N')
10350 AND (p_hier_dimension_flag = 'N')
10351 AND (p_value_set_required_flag = 'Y') THEN
10352
10353 x_attr_select_stmt :=
10354 'SELECT T2.base_rowid'||
10355 ' ,M2.read_only_flag'||
10356 ' ,A1.attribute_id'||
10357 ' ,A1.attribute_varchar_label'||
10358 ' ,A1.attribute_dimension_id'||
10359 ' ,A1.attribute_value_column_name'||
10360 ' ,A1.attribute_data_type_code'||
10361 ' ,A1.attribute_required_flag'||
10362 ' ,A1.assignment_is_read_only_flag'||
10363 ' ,A1.allow_multiple_versions_flag'||
10364 ' ,A1.allow_multiple_assignment_flag'||
10365 ',T2.member_code'||
10366 ', T2.value_set_display_code'||
10367 ', M2.'||p_member_col||
10368 ', M2.value_set_id'||
10369 ' ,T2.attribute_assign_value'||
10370 ' ,null, null, null, null, null'||
10371 ' ,T2.version_display_code, null'||
10372 ' ,T2.attr_assign_vs_display_code, null,null'||
10373 ' ,''LOAD'' '||
10374 ' ,''N'''||
10375 ' ,null'||
10376 ' ,null'||
10377 ' ,null'||
10378 ' ,null'||
10379 ' ,null'||
10380 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10381 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10382 ' ,T2.CALPATTR_END_DATE'||
10383 ' ,T2.CALPATTR_PERIOD_NUM'||
10384 ' FROM fem_dim_attributes_b A1'||
10385 ',fem_dim_attr_versions_b V1'||
10386 ',fem_dimensions_b B1'||
10387 ',(SELECT B.rowid base_rowid'||
10388 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10389 ', B.value_set_display_code'||
10390 ', B.version_display_code'||
10391 ', B.attribute_assign_value'||
10392 ', B.attr_assign_vs_display_code'||
10393 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10394 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10395 ', B.CALPATTR_END_DATE'||
10396 ', B.CALPATTR_PERIOD_NUM'||
10397 ' FROM '||p_source_attr_table||' B'||
10398 ' WHERE B.status'||p_exec_mode_clause||
10399 ' AND {{data_slice}} '||
10400 ') T2'||
10401 ', '||p_target_b_table||' M2'||
10402 ', fem_value_sets_b V2'||
10403 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10404 ' AND B1.dimension_id = A1.dimension_id'||
10405 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10406 ' AND T2.version_display_code = V1.version_display_code'||
10407 ' AND V1.attribute_id = A1.attribute_id'||
10408 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10409 ' AND V1.aw_snapshot_flag = ''N'''||
10410 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10411 ' AND M2.value_set_id = V2.value_set_id '||
10412 ' AND V2.dimension_id = '||p_dimension_id||
10413 ' AND V2.value_set_display_code = T2.value_set_display_code';
10414
10415 -- surrogate key
10416 ELSIF (p_specific_member_flag = 'N')
10417 AND (p_hier_dimension_flag = 'Y')
10418 AND (p_value_set_required_flag = 'N')
10419 AND (p_member_col <> p_member_dc_col) THEN
10420
10421 x_attr_select_stmt :=
10422 'SELECT T2.base_rowid'||
10423 ' ,M2.read_only_flag'||
10424 ' ,A1.attribute_id'||
10425 ' ,A1.attribute_varchar_label'||
10426 ' ,A1.attribute_dimension_id'||
10427 ' ,A1.attribute_value_column_name'||
10428 ' ,A1.attribute_data_type_code'||
10429 ' ,A1.attribute_required_flag'||
10430 ' ,A1.assignment_is_read_only_flag'||
10431 ' ,A1.allow_multiple_versions_flag'||
10432 ' ,A1.allow_multiple_assignment_flag'||
10433 ',T2.member_code'||
10434 ', null'||
10435 ', M2.'||p_member_col||
10436 ', null'||
10437 ' ,T2.attribute_assign_value'||
10438 ' ,null, null, null, null, null'||
10439 ' ,T2.version_display_code, null'||
10440 ' ,T2.attr_assign_vs_display_code, null,null'||
10441 ' ,''LOAD'' '||
10442 ' ,''N'''||
10443 ' ,null'||
10444 ' ,null'||
10445 ' ,null'||
10446 ' ,null'||
10447 ' ,null'||
10448 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10449 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10450 ' ,T2.CALPATTR_END_DATE'||
10451 ' ,T2.CALPATTR_PERIOD_NUM'||
10452 ' FROM fem_dim_attributes_b A1'||
10453 ',fem_dim_attr_versions_b V1'||
10454 ',fem_dimensions_b B1'||
10455 ',(SELECT B.rowid base_rowid'||
10456 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10457 ', B.version_display_code'||
10458 ', B.attribute_assign_value'||
10459 ', B.attr_assign_vs_display_code'||
10460 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10461 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10462 ', B.CALPATTR_END_DATE'||
10463 ', B.CALPATTR_PERIOD_NUM'||
10464 ' FROM '||p_source_attr_table||' B'||
10465 ' WHERE B.status'||p_exec_mode_clause||
10466 v_dim_label_where_cond||
10467 ' AND {{data_slice}} '||
10468 ') T2'||
10469 ', '||p_target_b_table||' M2'||
10470 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10471 ' AND B1.dimension_id = A1.dimension_id'||
10472 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10473 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10474 ' AND T2.version_display_code = V1.version_display_code'||
10475 ' AND V1.attribute_id = A1.attribute_id'||
10476 ' AND V1.aw_snapshot_flag = ''N'''||
10477 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10478 ' AND (((A1.attribute_required_flag = ''Y''))'||
10479 ' OR ((A1.attribute_required_flag =''N'') AND '||
10480 ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10481 ' FROM fem_dim_attr_grps AG1))'||
10482 ' OR (A1.attribute_id IN (SELECT attribute_id'||
10483 ' FROM fem_dim_attr_grps AG2'||
10484 ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10485
10486 -- No surrogate key
10487 ELSIF (p_specific_member_flag = 'N')
10488 AND (p_hier_dimension_flag = 'Y')
10489 AND (p_value_set_required_flag = 'N')
10490 AND (p_member_col = p_member_dc_col) THEN
10491
10492 x_attr_select_stmt :=
10493 'SELECT T2.base_rowid'||
10494 ' ,M2.read_only_flag'||
10495 ' ,A1.attribute_id'||
10496 ' ,A1.attribute_varchar_label'||
10497 ' ,A1.attribute_dimension_id'||
10498 ' ,A1.attribute_value_column_name'||
10499 ' ,A1.attribute_data_type_code'||
10500 ' ,A1.attribute_required_flag'||
10501 ' ,A1.assignment_is_read_only_flag'||
10502 ' ,A1.allow_multiple_versions_flag'||
10503 ' ,A1.allow_multiple_assignment_flag'||
10504 ',T2.member_code'||
10505 ', null'||
10506 ', null'||
10507 ', null'||
10508 ' ,T2.attribute_assign_value'||
10509 ' ,null, null, null, null, null'||
10510 ' ,T2.version_display_code, null'||
10511 ' ,T2.attr_assign_vs_display_code, null,null'||
10512 ' ,''LOAD'' '||
10513 ' ,''N'''||
10514 ' ,null'||
10515 ' ,null'||
10516 ' ,null'||
10517 ' ,null'||
10518 ' ,null'||
10519 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10520 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10521 ' ,T2.CALPATTR_END_DATE'||
10522 ' ,T2.CALPATTR_PERIOD_NUM'||
10523 ' FROM fem_dim_attributes_b A1'||
10524 ',fem_dim_attr_versions_b V1'||
10525 ',fem_dimensions_b B1'||
10526 ',(SELECT B.rowid base_rowid'||
10527 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10528 ', B.version_display_code'||
10529 ', B.attribute_assign_value'||
10530 ', B.attr_assign_vs_display_code'||
10531 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10532 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10533 ', B.CALPATTR_END_DATE'||
10534 ', B.CALPATTR_PERIOD_NUM'||
10535 ' FROM '||p_source_attr_table||' B'||
10536 ' WHERE B.status'||p_exec_mode_clause||
10537 v_dim_label_where_cond||
10538 ' AND {{data_slice}} '||
10539 ') T2'||
10540 ', '||p_target_b_table||' M2'||
10541 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10542 ' AND B1.dimension_id = A1.dimension_id'||
10543 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10544 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10545 ' AND T2.version_display_code = V1.version_display_code'||
10546 ' AND V1.attribute_id = A1.attribute_id'||
10547 ' AND V1.aw_snapshot_flag = ''N'''||
10548 ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10549 ' AND (((A1.attribute_required_flag = ''Y''))'||
10550 ' OR ((A1.attribute_required_flag =''N'') AND '||
10551 ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10552 ' FROM fem_dim_attr_grps AG1))'||
10553 ' OR (A1.attribute_id IN (SELECT attribute_id'||
10554 ' FROM fem_dim_attr_grps AG2'||
10555 ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10556
10557 -- surrogate key
10558 ELSIF p_member_col <> p_member_dc_col THEN
10559
10560 x_attr_select_stmt :=
10561 'SELECT T2.base_rowid'||
10562 ' ,M2.read_only_flag'||
10563 ' ,A1.attribute_id'||
10564 ' ,A1.attribute_varchar_label'||
10565 ' ,A1.attribute_dimension_id'||
10566 ' ,A1.attribute_value_column_name'||
10567 ' ,A1.attribute_data_type_code'||
10568 ' ,A1.attribute_required_flag'||
10569 ' ,A1.assignment_is_read_only_flag'||
10570 ' ,A1.allow_multiple_versions_flag'||
10571 ' ,A1.allow_multiple_assignment_flag'||
10572 ',T2.member_code'||
10573 ', null'||
10574 ',M2.'||p_member_col||
10575 ', null'||
10576 ' ,T2.attribute_assign_value'||
10577 ' ,null, null, null, null, null'||
10578 ' ,T2.version_display_code, null'||
10579 ' ,T2.attr_assign_vs_display_code, null,null'||
10580 ' ,''LOAD'' '||
10581 ' ,''N'''||
10582 ' ,null'||
10583 ' ,null'||
10584 ' ,null'||
10585 ' ,null'||
10586 ' ,null'||
10587 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10588 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10589 ' ,T2.CALPATTR_END_DATE'||
10590 ' ,T2.CALPATTR_PERIOD_NUM'||
10591 ' FROM fem_dim_attributes_b A1'||
10592 ',fem_dim_attr_versions_b V1'||
10593 ',fem_dimensions_b B1'||
10594 ',(SELECT B.rowid base_rowid'||
10595 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10596 ', B.version_display_code'||
10597 ', B.attribute_assign_value'||
10598 ', B.attr_assign_vs_display_code'||
10599 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10600 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10601 ', B.CALPATTR_END_DATE'||
10602 ', B.CALPATTR_PERIOD_NUM'||
10603 ' FROM '||p_source_attr_table||' B'||
10604 ' WHERE B.status'||p_exec_mode_clause||
10605 v_dim_label_where_cond||
10606 ' AND {{data_slice}} '||
10607 ') T2'||
10608 ', '||p_target_b_table||' M2'||
10609 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10610 ' AND B1.dimension_id = A1.dimension_id'||
10611 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10612 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10613 ' AND T2.version_display_code = V1.version_display_code'||
10614 ' AND V1.attribute_id = A1.attribute_id'||
10615 ' AND V1.aw_snapshot_flag = ''N'''||
10616 ' AND M2.'||p_member_dc_col||' = T2.member_code';
10617
10618 -- no surrogate key
10619 ELSE
10620
10621 x_attr_select_stmt :=
10622 'SELECT T2.base_rowid'||
10623 ' ,M2.read_only_flag'||
10624 ' ,A1.attribute_id'||
10625 ' ,A1.attribute_varchar_label'||
10626 ' ,A1.attribute_dimension_id'||
10627 ' ,A1.attribute_value_column_name'||
10628 ' ,A1.attribute_data_type_code'||
10629 ' ,A1.attribute_required_flag'||
10630 ' ,A1.assignment_is_read_only_flag'||
10631 ' ,A1.allow_multiple_versions_flag'||
10632 ' ,A1.allow_multiple_assignment_flag'||
10633 ',T2.member_code'||
10634 ', null'||
10635 ', null'||
10636 ', null'||
10637 ' ,T2.attribute_assign_value'||
10638 ' ,null, null, null, null, null'||
10639 ' ,T2.version_display_code, null'||
10640 ' ,T2.attr_assign_vs_display_code, null,null'||
10641 ' ,''LOAD'' '||
10642 ' ,''N'''||
10643 ' ,null'||
10644 ' ,null'||
10645 ' ,null'||
10646 ' ,null'||
10647 ' ,null'||
10648 ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10649 ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10650 ' ,T2.CALPATTR_END_DATE'||
10651 ' ,T2.CALPATTR_PERIOD_NUM'||
10652 ' FROM fem_dim_attributes_b A1'||
10653 ',fem_dim_attr_versions_b V1'||
10654 ',fem_dimensions_b B1'||
10655 ',(SELECT B.rowid base_rowid'||
10656 ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10657 ', B.version_display_code'||
10658 ', B.attribute_assign_value'||
10659 ', B.attr_assign_vs_display_code'||
10660 ', B.CALPATTR_CAL_DISPLAY_CODE'||
10661 ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10662 ', B.CALPATTR_END_DATE'||
10663 ', B.CALPATTR_PERIOD_NUM'||
10664 ' FROM '||p_source_attr_table||' B'||
10665 ' WHERE B.status'||p_exec_mode_clause||
10666 v_dim_label_where_cond||
10667 ' AND {{data_slice}} '||
10668 ') T2'||
10669 ', '||p_target_b_table||' M2'||
10670 ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10671 ' AND B1.dimension_id = A1.dimension_id'||
10672 ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10673 ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10674 ' AND T2.version_display_code = V1.version_display_code'||
10675 ' AND V1.attribute_id = A1.attribute_id'||
10676 ' AND V1.aw_snapshot_flag = ''N'''||
10677 ' AND M2.'||p_member_dc_col||' = T2.member_code';
10678
10679 END IF; -- Specific member flag 'Y' or 'N'
10680 END IF; -- IF Cal Period 'Y' or 'N'
10681
10682
10683 FEM_ENGINES_PKG.TECH_MESSAGE
10684 (c_log_level_2,c_block||'.'||
10685 'build_attr_select_stmt',
10686 'End');
10687
10688
10689 END build_attr_select_stmt;
10690
10691 /*===========================================================================+
10692 | PROCEDURE
10693 | BUILD_BAD_ATTR_SELECT_STMT
10694 |
10695 | DESCRIPTION
10696 | Procedure for building the dynamic SELECT statement for
10697 | retrieving attribute rows from the ATTR_T table
10698 | where the Member does not exist in FEM and does not exist
10699 | in the _B_T interface table. Such attribute rows are bad
10700 | because the member isn't value, and we want to update their
10701 | STATUS since otherwise it would left as 'LOAD'.
10702 |
10703 | This procedure runs after the Attribute loader sections
10704 | to ensure that we don't retrieve any ATTR_T records for members
10705 | that would be created by the loader
10706 |
10707 | SCOPE - PRIVATE
10708 |
10709 | NOTES
10710 | We are getting ATTR_T records where the member does not exist in
10711 | either the "real" FEM dimension member table and does not exist in
10712 | the join of the _B_T with the _TL_T. In the case of the join, any
10713 | bad attr records that have a member in the join of _B_T/TL_T will be identified
10714 | during the NEW_MEMBERS module.
10715 |
10716 | Procedure is split into 2 sections:
10717 | For CAL PERIOD
10718 | Only need to look for records where the
10719 | CALENDAR_DISPLAY_CODE and DIMENSION_GROUP_DISPLAY_CODE are valid, since
10720 | the New Members module performs validations on those columns already.
10721 |
10722 | For Value Set Dim
10723 |
10724 | MODIFICATION HISTORY
10725 | Rob Flippo 26-MAR-04 Created
10726 | Rob Flippo 14-SEP-04 Modify so that it excludes records
10727 | where the version is actually valid.
10728 | This allows the
10729 | Bad version cursor to find the bad version rows
10730 | and update
10731 | them appropriately;
10732 | Also modify so that don't join with the source
10733 | B_T and _TL_T
10734 | tables - since this procedure gets called after
10735 | NEW_MEMBER
10736 | is already complete, we don't have worry if the
10737 | new_members
10738 | have been processed or not
10739 | Rob Flippo 27-OCT-04 Bug#3973837
10740 | FEM.C.DP3.4: DIMENSION LOADER ERRORS
10741 | ALL ATTRIBUTES IN ATTR_T TABLE
10742 | Fixed the select stmt to select rows as follows:
10743 | 1) the attribute is not required AND the member
10744 | does not exist in the official _B table OR
10745 | 2) the attribute is required AND the member does
10746 | not exist in the official _B table AND the
10747 | member does not exist in a join of the
10748 | interface _B_T/_TL_T tables
10749 |
10750 | Rob Flippo 01-NOV-04 Modified so that members with invalid grp
10751 | or bad value_set continue to be processed
10752 | so that their attr records can get updated
10753 | with an invalid_member status
10754 | Rob Flippo 15-MAR-05 Bug#4226011 add user_assign_allowed_flag not in ('N')
10755 | to all queries against the fem_dim_attributes_b table
10756 +===========================================================================*/
10757
10758 procedure build_bad_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
10759 ,p_dimension_id IN NUMBER
10760 ,p_source_b_table IN VARCHAR2
10761 ,p_source_tl_table IN VARCHAR2
10762 ,p_source_attr_table IN VARCHAR2
10763 ,p_target_b_table IN VARCHAR2
10764 ,p_member_t_dc_col IN VARCHAR2
10765 ,p_member_dc_col IN VARCHAR2
10766 ,p_value_set_required_flag IN VARCHAR2
10767 ,p_shared_dimension_flag IN VARCHAR2
10768 ,p_exec_mode_clause IN VARCHAR2
10769 ,x_bad_attr_select_stmt OUT NOCOPY VARCHAR2)
10770 IS
10771
10772 -- Value Set where conditions
10773 v_value_set_where_cond VARCHAR2(1000);
10774 v_value_set_select_T1 VARCHAR2(1000);
10775 v_value_set_select_T2 VARCHAR2(1000);
10776 v_vs_where_M2 VARCHAR2(1000); -- where condition for Specific Member='No'
10777 v_vs_table VARCHAR2(1000);
10778
10779 -- Special conditions to handle CAL_PERIOD
10780 v_member_code VARCHAR2(1000);
10781 v_calendar_id VARCHAR2(100);
10782 v_calendar_table VARCHAR2(100);
10783 v_calendar_where_cond VARCHAR2(1000);
10784 v_member_dc_where_cond VARCHAR2(1000);
10785
10786 -- other conditions
10787 v_dim_label_where_cond VARCHAR2(1000);
10788
10789 BEGIN
10790
10791 FEM_ENGINES_PKG.TECH_MESSAGE
10792 (c_log_level_2,c_block||'.'||
10793 'build_bad_attr_select_stmt',
10794 'Begin Build_bad_attr_select_stmt');
10795
10796 IF p_shared_dimension_flag = 'Y' THEN
10797 v_dim_label_where_cond :=
10798 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
10799 ELSE
10800 v_dim_label_where_cond := '';
10801 END IF;
10802
10803
10804 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
10805
10806 x_bad_attr_select_stmt :=
10807 'SELECT B.rowid'||
10808 ',''INVALID_MEMBER'''||
10809 ' FROM '||p_source_attr_table||' B'||
10810 ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
10811 ', FEM_DIM_ATTR_VERSIONS_B V'||
10812 ', FEM_DIM_ATTRIBUTES_B A'||
10813 ' WHERE B.calendar_display_code = C.calendar_display_code '||
10814 ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
10815 ' AND B.STATUS'||p_exec_mode_clause||
10816 ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10817 ' AND A.dimension_id = '||p_dimension_id||
10818 ' AND B.version_display_code = V.version_display_code'||
10819 ' AND V.attribute_id = A.attribute_id'||
10820 ' AND LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
10821 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
10822 'LPAD(to_char(C.calendar_id),5,''0'')||'||
10823 'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
10824 ' NOT IN (SELECT cal_period_id FROM fem_cal_periods_b) '||
10825 ' AND ((A.attribute_required_flag = ''N'')'||
10826 ' OR (A.attribute_required_flag = ''Y'''||
10827 ' AND NOT EXISTS (SELECT 0 FROM fem_cal_periods_b_t B2'||
10828 ' ,fem_cal_periods_tl_t TL2'||
10829 ' WHERE B2.cal_period_end_date = B.cal_period_end_date'||
10830 ' AND B2.cal_period_number = B.cal_period_number'||
10831 ' AND B2.calendar_display_code = B.calendar_display_code'||
10832 ' AND B2.dimension_group_display_code = B.dimension_group_display_code'||
10833 ' AND B2.cal_period_end_date = TL2.cal_period_end_date'||
10834 ' AND B2.calendar_display_code = TL2.calendar_display_code'||
10835 ' AND B2.dimension_group_display_code = TL2.dimension_group_display_code'||
10836 ' AND B2.cal_period_number = TL2.cal_period_number'||
10837 ' AND B2.STATUS'||p_exec_mode_clause||
10838 ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10839 ' AND {{data_slice}} ';
10840
10841 /* RCF 9-14-2004 Removing this since we should always update in the _ATTR table
10842 when the member doesn't exist in the _B table. That's because this
10843 update occurs after the NEW_MEMBER procedure is complete
10844 ' AND B.cal_period_number NOT IN (SELECT B1.cal_period_number '||
10845 ' FROM fem_cal_periods_b_t B1, fem_cal_periods_tl_t TL '||
10846 ' WHERE B1.calendar_display_code = B.calendar_display_code '||
10847 ' AND B1.dimension_group_display_code = B.dimension_group_display_code '||
10848 ' AND B1.cal_period_end_date = B.cal_period_end_date'||
10849 ' AND B1.calendar_display_code = TL.calendar_display_code'||
10850 ' AND B1.dimension_group_display_code = TL.dimension_group_display_code'||
10851 ' AND B1.cal_period_end_date = TL.cal_period_end_date'||
10852 ' AND B1.cal_period_number = TL.cal_period_number) '||
10853
10854 */
10855
10856 ELSIF p_value_set_required_flag = 'Y' THEN
10857 x_bad_attr_select_stmt :=
10858 'SELECT B.rowid'||
10859 ',''INVALID_MEMBER'''||
10860 ' FROM '||p_source_attr_table||' B'||
10861 ', FEM_DIM_ATTR_VERSIONS_B V'||
10862 ', FEM_DIM_ATTRIBUTES_B A'||
10863 ' WHERE B.STATUS'||p_exec_mode_clause||
10864 ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10865 ' AND A.dimension_id = '||p_dimension_id||
10866 ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N'')'||
10867 ' AND B.version_display_code = V.version_display_code'||
10868 ' AND V.attribute_id = A.attribute_id'||
10869 ' AND NOT EXISTS (SELECT 0'||
10870 ' FROM '||p_target_b_table||' T'||
10871 ',fem_value_sets_b V'||
10872 ' WHERE T.value_set_id = V.value_set_id'||
10873 ' AND V.value_set_display_code = B.value_set_display_code'||
10874 ' AND T.'||p_member_dc_col||' = B.'||p_member_t_dc_col||')'||
10875 ' AND ((A.attribute_required_flag = ''N'')'||
10876 ' OR (A.attribute_required_flag = ''Y'''||
10877 ' AND NOT EXISTS (SELECT 0 FROM '||p_source_b_table||' B2'||
10878 ', '||p_source_tl_table||' TL2'||
10879 ' WHERE B2.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
10880 ' AND B2.value_set_display_code = B.value_set_display_code'||
10881 ' AND B2.'||p_member_t_dc_col||' = TL2.'||p_member_t_dc_col||
10882 ' AND B2.value_set_display_code = TL2.value_set_display_code'||
10883 ' AND B2.STATUS'||p_exec_mode_clause||
10884 ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10885 ' AND {{data_slice}} ';
10886
10887 /* RCF 9-14-2004 Removing this since we should always update in the _ATTR table
10888 when the member doesn't exist in the _B table. That's because this
10889 update occurs after the NEW_MEMBER procedure is complete
10890 ' AND NOT EXISTS (SELECT 0'||
10891 ' FROM '||p_source_b_table||' B1'||
10892 ','||p_source_tl_table||' TL'||
10893 ' WHERE B1.value_set_display_code = B.value_set_display_code'||
10894 ' AND B1.value_set_display_code = TL.value_set_display_code'||
10895 ' AND B1.'||p_member_t_dc_col||' = TL.'||p_member_t_dc_col||
10896 ' AND B1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||')'||
10897
10898 */
10899 ELSE
10900 x_bad_attr_select_stmt :=
10901 'SELECT B.rowid'||
10902 ',''INVALID_MEMBER'''||
10903 ' FROM '||p_source_attr_table||' B'||
10904 ',FEM_DIM_ATTR_VERSIONS_B V'||
10905 ',FEM_DIM_ATTRIBUTES_B A'||
10906 ' WHERE B.STATUS'||p_exec_mode_clause||
10907 v_dim_label_where_cond||
10908 ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10909 ' AND A.dimension_id = '||p_dimension_id||
10910 ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N'')'||
10911 ' AND B.version_display_code = V.version_display_code'||
10912 ' AND V.attribute_id = A.attribute_id'||
10913 ' AND NOT EXISTS (SELECT 0'||
10914 ' FROM '||p_target_b_table||' T'||
10915 ' WHERE T.'||p_member_dc_col||' = B.'||p_member_t_dc_col||')'||
10916 ' AND ((A.attribute_required_flag = ''N'')'||
10917 ' OR (A.attribute_required_flag = ''Y'''||
10918 ' AND NOT EXISTS (SELECT 0 FROM '||p_source_b_table||' B2'||
10919 ', '||p_source_tl_table||' TL2'||
10920 ' WHERE B2.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
10921 ' AND B2.'||p_member_t_dc_col||' = TL2.'||p_member_t_dc_col||
10922 ' AND B2.STATUS'||p_exec_mode_clause||
10923 ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10924 ' AND {{data_slice}} ';
10925
10926 /* RCF 9-14-2004 Removing this since we should always update in the _ATTR table
10927 when the member doesn't exist in the _B table. That's because this
10928 update occurs after the NEW_MEMBER procedure is complete
10929 ' AND NOT EXISTS (SELECT 0'||
10930 ' FROM '||p_source_b_table||' B1'||
10931 ','||p_source_tl_table||' TL'||
10932 ' WHERE B1.'||p_member_t_dc_col||' = TL.'||p_member_t_dc_col||
10933 ' AND B1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||')'||
10934
10935 */
10936 END IF;
10937
10938 FEM_ENGINES_PKG.TECH_MESSAGE
10939 (c_log_level_2,c_block||'.'||
10940 'build_bad_attr_select_stmt',
10941 'End Build_bad_attr_select_stmt');
10942
10943
10944 END build_bad_attr_select_stmt;
10945
10946 /*===========================================================================+
10947 | PROCEDURE
10948 | BUILD_SEQ_ENF_HIERCOUNT_STMT
10949 |
10950 | DESCRIPTION
10951 | Procedure for building the dynamic SELECT statement for
10952 | identifying if a member participates in a sequence enforced hierarchy
10953 |
10954 | SCOPE - PRIVATE
10955 |
10956 | NOTES
10957 |
10958 | MODIFICATION HISTORY
10959 | Rob Flippo 16-MAR-05 Created
10960 |
10961 +===========================================================================*/
10962
10963 procedure build_seq_enf_hiercount_stmt (p_value_set_required_flag IN VARCHAR2
10964 ,p_hier_table_name IN VARCHAR2
10965 ,x_select_stmt OUT NOCOPY VARCHAR2)
10966 IS
10967
10968 BEGIN
10969 FEM_ENGINES_PKG.TECH_MESSAGE
10970 (c_log_level_2,c_block||'.'||'build_seq_enf_hiercount_stmt',
10971 'Begin Build SQL statement to identify if member participates in sequence enf hier');
10972
10973 IF p_value_set_required_flag = 'Y' THEN
10974 x_select_stmt := 'SELECT count(*)'||
10975 ' FROM '||p_hier_table_name||' H'||
10976 ',fem_object_definition_b D'||
10977 ',fem_hierarchies O'||
10978 ' WHERE H.hierarchy_obj_def_id = D.object_definition_id'||
10979 ' AND D.object_id = O.hierarchy_obj_id'||
10980 ' AND O.group_sequence_enforced_code '||
10981 ' IN (''SEQUENCE_ENFORCED'',''SEQUENCE_ENFORCED_SKIP_LEVEL'')'||
10982 ' AND to_char(child_id) = to_char(:b_member_id)'||
10983 ' AND H.child_value_set_id = :b_value_set_id';
10984 ELSE
10985 x_select_stmt := 'SELECT count(*)'||
10986 ' FROM '||p_hier_table_name||' H'||
10987 ',fem_object_definition_b D'||
10988 ',fem_hierarchies O'||
10989 ' WHERE H.hierarchy_obj_def_id = D.object_definition_id'||
10990 ' AND D.object_id = O.hierarchy_obj_id'||
10991 ' AND O.group_sequence_enforced_code '||
10992 ' IN (''SEQUENCE_ENFORCED'',''SEQUENCE_ENFORCED_SKIP_LEVEL'')'||
10993 ' AND to_char(child_id) = to_char(:b_member_id)';
10994
10995 END IF;
10996
10997 FEM_ENGINES_PKG.TECH_MESSAGE
10998 (c_log_level_2,c_block||'.'||'build_seq_enf_hiercount_stmt',
10999 'End Build SQL statement to identify if member participates in sequence enf hier');
11000
11001 END build_seq_enf_hiercount_stmt;
11002
11003
11004 /*===========================================================================+
11005 | PROCEDURE
11006 | BUILD_DOES_ATTR_EXIST_STMT
11007 |
11008 | DESCRIPTION
11009 | Procedure for building the dynamic SELECT statement for
11010 | identifying if an attribute row already exists in the _ATTR table
11011 |
11012 | SCOPE - PRIVATE
11013 |
11014 | NOTES
11015 |
11016 |
11017 |
11018 |
11019 | MODIFICATION HISTORY
11020 | Rob Flippo 23-OCT-03 Created
11021 | Rob Flippo 02-MAR-05 Bug#4170444 Modified to return value for the
11022 | READ_ONLY_FLAG from the ATTR table
11023 | Rob Flippo 11-AUG-05 Bug#4547868 performance issue on query
11024 | - remove join to _B table
11025 |
11026 +===========================================================================*/
11027
11028 procedure build_does_attr_exist_stmt (p_target_attr_table IN VARCHAR2
11029 ,p_target_b_table IN VARCHAR2
11030 ,p_member_col IN VARCHAR2
11031 ,p_member_dc_col IN VARCHAR2
11032 ,p_value_set_required_flag IN VARCHAR2
11033 ,p_version_flag IN VARCHAR2
11034 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11035 IS
11036
11037 v_value_set_where_cond VARCHAR2(1000);
11038 v_value_set_table VARCHAR2(100);
11039 v_version_where_cond VARCHAR2(1000);
11040
11041
11042 BEGIN
11043 FEM_ENGINES_PKG.TECH_MESSAGE
11044 (c_log_level_2,c_block||'.'||
11045 'build_does_attr_exist_stmt',
11046 'Begin Build SQL statement to identify if attribute assignment already exists');
11047
11048 IF p_value_set_required_flag = 'Y' THEN
11049 v_value_set_where_cond := ' and A.value_set_id = :b_value_set_id';
11050
11051 /*** commented out 8/11/2005
11052 ' AND A.value_set_id = V.value_set_id'||
11053 ' AND V.value_set_display_code = :b_value_set_dc'||
11054 ' AND A.value_set_id = B.value_set_id'; */
11055
11056 v_value_set_table := ',fem_value_sets_b V ';
11057 ELSE
11058 v_value_set_where_cond := '';
11059 v_value_set_table := '';
11060 END IF;
11061
11062 IF p_version_flag = 'Y' THEN
11063 v_version_where_cond := ' AND A.version_id = :b_version_id';
11064
11065 ELSE
11066 v_version_where_cond := '';
11067 END IF;
11068
11069 x_attr_select_stmt :=
11070 'SELECT count(*), max(A.read_only_flag)'||
11071 ' FROM '||p_target_attr_table||' A'||
11072 ' WHERE A.attribute_id = :b_attribute_id'||
11073 v_version_where_cond||
11074 ' AND A.'||p_member_col||' = :b_member_id'||
11075 v_value_set_where_cond;
11076
11077 FEM_ENGINES_PKG.TECH_MESSAGE
11078 (c_log_level_2,c_block||'.'||
11079 'build_does_attr_exist_stmt',
11080 'End');
11081
11082
11083 END build_does_attr_exist_stmt;
11084
11085
11086 /*===========================================================================+
11087 | PROCEDURE
11088 | BUILD_DOES_MULTATTR_EXIST_STMT
11089 |
11090 | DESCRIPTION
11091 | Procedure for building the dynamic SELECT statement for
11092 | identifying if an attribute row already exists in the _ATTR table
11093 | when the attribute is Multi-assignment
11094 |
11095 | SCOPE - PRIVATE
11096 |
11097 | NOTES
11098 |
11099 |
11100 |
11101 |
11102 | MODIFICATION HISTORY
11103 | Rob Flippo 06-JUL-06 Created
11104 |
11105 +===========================================================================*/
11106
11107 procedure build_does_multattr_exist_stmt (p_target_attr_table IN VARCHAR2
11108 ,p_target_b_table IN VARCHAR2
11109 ,p_member_col IN VARCHAR2
11110 ,p_member_dc_col IN VARCHAR2
11111 ,p_value_set_required_flag IN VARCHAR2
11112 ,p_attr_value_column_name IN VARCHAR2
11113 ,p_attr_assign_vs_id IN NUMBER
11114 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11115 IS
11116
11117 v_value_set_where_cond VARCHAR2(1000);
11118 v_value_set_table VARCHAR2(100);
11119 v_version_where_cond VARCHAR2(1000);
11120 v_assign_where_cond VARCHAR2(4000);
11121
11122
11123 BEGIN
11124 FEM_ENGINES_PKG.TECH_MESSAGE
11125 (c_log_level_2,c_block||'.'||
11126 'build_does_multattr_exist_stmt',
11127 'Begin Build SQL statement to identify if attribute assignment already exists for multi-assign attributes');
11128
11129 IF p_value_set_required_flag = 'Y' THEN
11130 v_value_set_where_cond := ' and A.value_set_id = :b_value_set_id';
11131 v_value_set_table := ',fem_value_sets_b V ';
11132 ELSE
11133 v_value_set_where_cond := '';
11134 v_value_set_table := '';
11135 END IF;
11136
11137 IF p_attr_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
11138 AND p_attr_assign_vs_id IS NOT NULL THEN
11139
11140 v_assign_where_cond :=
11141 ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_mbr'||
11142 ' AND A.dim_attribute_value_set_id = :b_dim_attr_vs';
11143 ELSIF p_attr_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
11144 AND p_attr_assign_vs_id IS NULL THEN
11145 v_assign_where_cond :=
11146 ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_mbr';
11147 ELSE
11148 v_assign_where_cond :=
11149 ' AND A.dim_attribute_varchar_member = :b_dim_attr_varchar_mbr';
11150
11151 END IF;
11152
11153 v_version_where_cond := ' AND A.version_id = :b_version_id';
11154
11155 x_attr_select_stmt :=
11156 'SELECT count(*)'||
11157 ' FROM '||p_target_attr_table||' A'||
11158 ' WHERE A.attribute_id = :b_attribute_id'||
11159 v_version_where_cond||
11160 ' AND A.'||p_member_col||' = :b_member_id'||
11161 v_value_set_where_cond||
11162 v_assign_where_cond;
11163
11164 FEM_ENGINES_PKG.TECH_MESSAGE
11165 (c_log_level_2,c_block||'.'||
11166 'build_does_multattr_exist_stmt',
11167 'End');
11168
11169
11170 END build_does_multattr_exist_stmt;
11171
11172
11173 /*===========================================================================+
11174 | PROCEDURE
11175 | build_get_identical_assgn_stmt
11176 |
11177 | DESCRIPTION
11178 | Procedure for building the dynamic SELECT statement for
11179 | identifying if the attribute assignment from the interface
11180 | table is exactly the same as an existing attr assignment row
11181 |
11182 | SCOPE - PRIVATE
11183 |
11184 | NOTES
11185 |
11186 |
11187 | MODIFICATION HISTORY
11188 | Rob Flippo 30-SEP-04 Created
11189 |
11190 +===========================================================================*/
11191
11192 procedure build_get_identical_assgn_stmt (p_target_attr_table IN VARCHAR2
11193 ,p_target_b_table IN VARCHAR2
11194 ,p_member_col IN VARCHAR2
11195 ,p_member_dc_col IN VARCHAR2
11196 ,p_value_set_required_flag IN VARCHAR2
11197 ,p_date_format_mask IN VARCHAR2
11198 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11199 IS
11200
11201 v_value_set_where_cond VARCHAR2(1000);
11202 v_value_set_table VARCHAR2(100);
11203
11204
11205 BEGIN
11206 FEM_ENGINES_PKG.TECH_MESSAGE
11207 (c_log_level_2,c_block||'.'||
11208 'build_get_identical_assgn_stmt',
11209 'Begin Build SQL statement to identify if existing attr assignment is identical to one from the interface table');
11210
11211 IF p_value_set_required_flag = 'Y' THEN
11212 v_value_set_where_cond := ' AND A.value_set_id = V.value_set_id'||
11213 ' AND V.value_set_display_code = :b_value_set_dc'||
11214 ' AND A.value_set_id = B.value_set_id';
11215 v_value_set_table := ',fem_value_sets_b V ';
11216 ELSE
11217 v_value_set_where_cond := '';
11218 v_value_set_table := '';
11219 END IF;
11220
11221
11222 x_attr_select_stmt :=
11223 'SELECT count(*)'||
11224 ' FROM '||p_target_attr_table||' A'||
11225 ','||p_target_b_table||' B'||
11226 v_value_set_table||
11227 ' WHERE A.attribute_id = :b_attribute_id'||
11228 ' AND A.version_id = :b_version_id'||
11229 ' AND A.'||p_member_col||' = B.'||p_member_col||
11230 v_value_set_where_cond||
11231 ' AND B.'||p_member_dc_col||' = :b_member_dc'||
11232 ' AND ((:b_dim_attr_numeric_member IS NULL '||
11233 ' AND A.dim_attribute_numeric_member IS NULL)'||
11234 ' OR (:b_dim_attr_numeric_member IS NOT NULL '||
11235 ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_member))'||
11236 ' AND ((:b_dim_attr_vs_id IS NULL '||
11237 ' AND A.dim_attribute_value_set_id IS NULL)'||
11238 ' OR (:b_dim_attr_vs_id IS NOT NULL '||
11239 ' AND A.dim_attribute_value_set_id = :b_dim_attr_vs_id))'||
11240 ' AND ((:b_dim_attr_varchar_member IS NULL '||
11241 ' AND A.dim_attribute_varchar_member IS NULL)'||
11242 ' OR (:b_dim_attr_varchar_member IS NOT NULL '||
11243 ' AND A.dim_attribute_varchar_member = :b_dim_attr_varchar_member))'||
11244 ' AND ((:b_number_assign_value IS NULL '||
11245 ' AND A.number_assign_value IS NULL)'||
11246 ' OR (:b_number_assign_value IS NOT NULL '||
11247 ' AND A.number_assign_value = :b_number_assign_value))'||
11248 ' AND ((:b_varchar_assign_value IS NULL '||
11249 ' AND A.varchar_assign_value IS NULL)'||
11250 ' OR (:b_varchar_assign_value IS NOT NULL '||
11251 ' AND A.varchar_assign_value = :b_varchar_assign_value))'||
11252 ' AND ((:b_date_assign_value IS NULL '||
11253 ' AND A.date_assign_value IS NULL) '||
11254 ' OR (:b_date_assign_value IS NOT NULL '||
11255 ' AND A.date_assign_value = :b_date_assign_value))';
11256
11257
11258 FEM_ENGINES_PKG.TECH_MESSAGE
11259 (c_log_level_2,c_block||'.'||
11260 'build_get_identical_assgn_stmt',
11261 'End');
11262
11263
11264 END build_get_identical_assgn_stmt;
11265
11266
11267 /*===========================================================================+
11268 | PROCEDURE
11269 | VERIFY_ATTR_MEMBER
11270 |
11271 | DESCRIPTION
11272 | Procedure for checking if the Attribute assignment value
11273 | exists in the appropriate dimension member table
11274 | for DIM_ATTRIBUTE_VARCHAR_MEMBER and DIM_ATTRIBUTE_NUMERIC_MEMBER
11275 | attributes
11276 |
11277 | SCOPE - PRIVATE
11278 |
11279 | NOTES
11280 |
11281 |
11282 |
11283 |
11284 | MODIFICATION HISTORY
11285 | Rob Flippo 27-OCT-03 Created
11286 | Rob Flippo 03-MAR-05 Added new return status MISSING_ATTR_ASSIGN_VS to
11287 | identify when the user forgets to populate the
11288 | ATTR_ASSIGN_VS_DISPLAY_CODE column for attributes
11289 | that point to value set required dimensions
11290 |
11291 +===========================================================================*/
11292
11293 procedure verify_attr_member (p_attribute_varchar_label IN VARCHAR2
11294 ,p_dimension_varchar_label IN VARCHAR2
11295 ,p_attr_member_dc IN VARCHAR2
11296 ,p_attr_member_vs_dc IN VARCHAR2
11297 ,x_attr_success OUT NOCOPY VARCHAR2
11298 ,x_member OUT NOCOPY VARCHAR2)
11299 IS
11300
11301 v_dimension_id NUMBER;
11302 v_attr_dimension_varchar_label VARCHAR2(30);
11303 v_get_dim_status VARCHAR2(30); -- ignore this in this procedure
11304 v_target_b_table VARCHAR2(30);
11305 v_target_tl_table VARCHAR2(30);
11306 v_target_attr_table VARCHAR2(30);
11307 v_source_b_table VARCHAR2(30);
11308 v_source_tl_table VARCHAR2(30);
11309 v_source_attr_table VARCHAR2(30);
11310 v_member_col VARCHAR2(30);
11311 v_member_dc_col VARCHAR2(30);
11312 v_member_t_dc_col VARCHAR2(30);
11313 v_member_name_col VARCHAR2(30);
11314 v_member_t_name_col VARCHAR2(30);
11315 v_member_description_col VARCHAR2(30);
11316 v_value_set_required_flag VARCHAR2(1);
11317 v_user_defined_flag VARCHAR2(1);
11318 v_hier_table_name VARCHAR2(30);
11319 v_simple_dimension_flag VARCHAR2(1);
11320 v_shared_dimension_flag VARCHAR2(1);
11321 v_hier_dimension_flag VARCHAR2(1);
11322 v_member_id_method_code VARCHAR2(30);
11323 v_table_handler_name VARCHAR2(30);
11324 v_err_code NUMBER := 0;
11325 v_err_msg VARCHAR2(255);
11326 v_composite_dimension_flag VARCHAR2(1); --
11327 v_structure_id NUMBER; --
11328
11329 x_member_exists_stmt VARCHAR2(4000);
11330
11331
11332 BEGIN
11333 FEM_ENGINES_PKG.TECH_MESSAGE
11334 (c_log_level_2,c_block||'.'||
11335 'verify_attr_member',
11336 'Begin identify if attribute assignment member is valid');
11337
11338 FEM_ENGINES_PKG.TECH_MESSAGE
11339 (c_log_level_1,c_block||'.'||
11340 'verify_attr_member.p_attr_member_vs_dc',
11341 p_attr_member_vs_dc);
11342
11343
11344 SELECT B2.dimension_varchar_label
11345 INTO v_attr_dimension_varchar_label
11346 FROM fem_dimensions_b B1, fem_dim_attributes_b A1, fem_dimensions_b B2
11347 WHERE B1.dimension_id = A1.dimension_id
11348 AND A1.attribute_varchar_label = p_attribute_varchar_label
11349 AND B1.dimension_varchar_label = p_dimension_varchar_label
11350 AND B2.dimension_id = A1.attribute_dimension_id;
11351
11352
11353 --dbms_output.put_line('attr label = '||v_attr_dimension_varchar_label);
11354
11355 get_dimension_info (v_attr_dimension_varchar_label
11356 ,v_dimension_id
11357 ,v_target_b_table
11358 ,v_target_tl_table
11359 ,v_target_attr_table
11360 ,v_source_b_table
11361 ,v_source_tl_table
11362 ,v_source_attr_table
11363 ,v_member_col
11364 ,v_member_dc_col
11365 ,v_member_t_dc_col
11366 ,v_member_name_col
11367 ,v_member_t_name_col
11368 ,v_member_description_col
11369 ,v_value_set_required_flag
11370 ,v_user_defined_flag
11371 ,v_simple_dimension_flag
11372 ,v_shared_dimension_flag
11373 ,v_hier_table_name
11374 ,v_hier_dimension_flag
11375 ,v_member_id_method_code
11376 ,v_table_handler_name
11377 ,v_composite_dimension_flag --
11378 ,v_structure_id); --
11379
11380 build_member_exists_stmt (v_target_b_table
11381 ,v_member_col
11382 ,v_member_dc_col
11383 ,v_value_set_required_flag
11384 ,x_member_exists_stmt);
11385 --dbms_output.put_line(substr(x_member_exists_stmt, 1,200));
11386 --dbms_output.put_line(substr(x_member_exists_stmt, 201,200));
11387
11388 -- add check to see if the attr_vs_display_code is populated for an
11389 -- attribute that points to a value set required dimension. If it is
11390 -- null, then we should skip the check altogether and report
11391 -- a special status to the calling procedure
11392 IF v_value_set_required_flag = 'Y' AND p_attr_member_vs_dc is not null THEN
11393 EXECUTE IMMEDIATE x_member_exists_stmt
11394 INTO x_member
11395 USING p_attr_member_dc
11396 ,p_attr_member_vs_dc;
11397 ELSIF v_value_set_required_flag = 'N' THEN
11398 EXECUTE IMMEDIATE x_member_exists_stmt
11399 INTO x_member
11400 USING p_attr_member_dc;
11401 END IF;
11402
11403 FEM_ENGINES_PKG.TECH_MESSAGE
11404 (c_log_level_1,c_block||'.'||
11405 'verify_attr_member.after the member exists query',
11406 null);
11407
11408
11409 IF x_member IS NOT NULL THEN
11410 x_attr_success := 'Y';
11411 ELSIF v_value_set_required_flag = 'Y' AND p_attr_member_vs_dc is null THEN
11412 x_attr_success := 'MISSING_ATTR_ASSIGN_VS';
11413 ELSE
11414 x_attr_success := 'N';
11415 END IF;
11416
11417 FEM_ENGINES_PKG.TECH_MESSAGE
11418 (c_log_level_1,c_block||'.'||
11419 'x_attr_sucess',
11420 x_attr_success);
11421 FEM_ENGINES_PKG.TECH_MESSAGE
11422 (c_log_level_2,c_block||'.'||
11423 'verify_attr_member',
11424 'End');
11425
11426 EXCEPTION
11427 WHEN no_data_found THEN
11428 x_attr_success := 'N';
11429
11430 END verify_attr_member;
11431
11432
11433 /*===========================================================================+
11434 | PROCEDURE
11435 | BUILD_MEMBER_EXISTS_STMT
11436 |
11437 | DESCRIPTION
11438 | Procedure for building the SQL statement that checks
11439 | if a member exists in a dimension table
11440 |
11441 | SCOPE - PRIVATE
11442 |
11443 |
11444 | MODIFICATION HISTORY
11445 | Rob Flippo 27-OCT-03 Created
11446 |
11447 +===========================================================================*/
11448
11449 procedure build_member_exists_stmt (p_member_table IN VARCHAR2
11450 ,p_member_col IN VARCHAR2
11451 ,p_member_dc_col IN VARCHAR2
11452 ,p_value_set_required_flag IN VARCHAR2
11453 ,x_member_exists_stmt OUT NOCOPY VARCHAR2)
11454
11455
11456 IS
11457
11458 v_value_set_where_cond VARCHAR2(1000);
11459 v_value_set_table VARCHAR2(1000);
11460
11461 BEGIN
11462 FEM_ENGINES_PKG.TECH_MESSAGE
11463 (c_log_level_2,c_block||'.'||
11464 'build_member_exists_stmt',
11465 'Begin Build SQL statement to identify if a dimension member exists in FEM');
11466
11467 IF (p_value_set_required_flag = 'Y') THEN
11468 v_value_set_where_cond := ' AND V1.value_set_id = B1.value_set_id '||
11469 ' AND V1.value_set_display_code = :b_value_set_display_code';
11470 v_value_set_table := ', FEM_VALUE_SETS_B V1';
11471
11472 ELSE
11473 v_value_set_where_cond := '';
11474 v_value_set_table := '';
11475 END IF;
11476
11477
11478 x_member_exists_stmt :=
11479 'SELECT '||p_member_col||
11480 ' FROM '||p_member_table||' B1 '||v_value_set_table||
11481 ' WHERE to_char('||p_member_dc_col||') = to_char(:b_member_dc)'||
11482 v_value_set_where_cond;
11483
11484 FEM_ENGINES_PKG.TECH_MESSAGE
11485 (c_log_level_1,c_block||'.'||
11486 'build_member_exists_stmt',
11487 x_member_exists_stmt);
11488
11489 FEM_ENGINES_PKG.TECH_MESSAGE
11490 (c_log_level_2,c_block||'.'||
11491 'build_member_exists_stmt',
11492 'End');
11493
11494 END build_member_exists_stmt;
11495
11496
11497 /*===========================================================================+
11498 | PROCEDURE
11499 | BUILD_BAD_NEW_MBRS_STMT
11500 |
11501 | DESCRIPTION
11502 | Retrieves any members from the _B_T table that do not exist
11503 | in FEM but also do not have a corresponding _TL_T name/desc record.
11504 | Such members are considered invalid and cannot be loaded.
11505 |
11506 |
11507 | SCOPE - PRIVATE
11508 |
11509 | NOTES
11510 |
11511 |
11512 | MODIFICATION HISTORY
11513 | Rob Flippo 28-OCT-03 Created
11514 | Rob Flippo 28-SEP-04 Bug#3906218 Ability undelete members
11515 | Modified the select stmt so that it excludes
11516 | members that already exist in the target table
11517 |
11518 +===========================================================================*/
11519
11520 procedure build_bad_new_mbrs_stmt (p_load_type IN VARCHAR2
11521 ,p_dimension_varchar_label IN VARCHAR2
11522 ,p_source_b_table IN VARCHAR2
11523 ,p_source_tl_table IN VARCHAR2
11524 ,p_target_b_table IN VARCHAR2
11525 ,p_member_t_dc_col IN VARCHAR2
11526 ,p_member_dc_col IN VARCHAR2
11527 ,p_value_set_required_flag IN VARCHAR2
11528 ,p_shared_dimension_flag IN VARCHAR2
11529 ,p_exec_mode_clause IN VARCHAR2
11530 ,x_bad_member_select_stmt OUT NOCOPY VARCHAR2)
11531 IS
11532
11533 v_member_code VARCHAR2(1000); -- used only in the CAL_PERIOD select
11534
11535 BEGIN
11536 FEM_ENGINES_PKG.TECH_MESSAGE
11537 (c_log_level_2,c_block||'.'||
11538 'build_bad_new_members_stmt',
11539 'Begin Build SQL statement to retrieve invalid new members from the source _B_T table');
11540
11541 --dbms_output.put_line('Building the Bad New Members Select');
11542
11543 IF (p_load_type = 'DIMENSION_MEMBER') AND
11544 (p_dimension_varchar_label = 'CAL_PERIOD') THEN
11545
11546 -- Setting the special conditions for CAL_PERIOD
11547 v_member_code :=
11548 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
11549 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
11550 'LPAD(to_char(C.calendar_id),5,''0'')||'||
11551 'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
11552
11553
11554 x_bad_member_select_stmt :=
11555 'SELECT B.rowid'||
11556 ',''MISSING_NAME'''||
11557 ' FROM '||p_source_b_table||' B'||
11558 ', fem_calendars_b C, fem_dimension_grps_b D'||
11559 ' WHERE B.status'||p_exec_mode_clause||
11560 ' AND B.calendar_display_code = C.calendar_display_code'||
11561 ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
11562
11563 ' AND {{data_slice}} '||
11564 ' AND NOT EXISTS (SELECT 0 FROM '||
11565 p_source_tl_table||' S1'||
11566 ' WHERE S1.CALENDAR_DISPLAY_CODE = B.CALENDAR_DISPLAY_CODE'||
11567 ' AND S1.DIMENSION_GROUP_DISPLAY_CODE = B.DIMENSION_GROUP_DISPLAY_CODE'||
11568 ' AND S1.CAL_PERIOD_END_DATE = B.CAL_PERIOD_END_DATE'||
11569 ' AND S1.CAL_PERIOD_NUMBER = B.CAL_PERIOD_NUMBER'||
11570 ' AND S1.STATUS'||p_exec_mode_clause||')'||
11571 ' AND NOT EXISTS (SELECT 0 FROM '||
11572 p_target_b_table||' G'||
11573 ' WHERE to_char(G.cal_period_id) = '||v_member_code||')';
11574
11575
11576 ELSIF (p_load_type = 'DIMENSION_MEMBER')
11577 AND (p_value_set_required_flag = 'Y') THEN
11578 x_bad_member_select_stmt :=
11579 'SELECT B.rowid'||
11580 ',''MISSING_NAME'''||
11581 ' FROM '||p_source_b_table||' B'||
11582 ' WHERE B.status'||p_exec_mode_clause||
11583 ' AND {{data_slice}} '||
11584 ' AND NOT EXISTS (SELECT 0 FROM '||
11585 p_source_tl_table||' S1'||
11586 ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11587 ' AND S1.value_set_display_code = B.value_set_display_code'||
11588 ' AND S1.status'||p_exec_mode_clause||')'||
11589 ' AND NOT EXISTS (SELECT 0 FROM '||
11590 p_target_b_table||' G'||
11591 ', fem_value_sets_b V'||
11592 ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||
11593 ' AND G.value_set_id = V.value_set_id'||
11594 ' AND V.value_set_display_code = B.value_set_display_code)';
11595 ELSIF (p_load_type = 'DIMENSION_MEMBER')
11596 AND (p_value_set_required_flag = 'N')
11597 AND (p_shared_dimension_flag = 'N') THEN
11598 x_bad_member_select_stmt :=
11599 'SELECT B.rowid'||
11600 ',''MISSING_NAME'''||
11601 ' FROM '||p_source_b_table||' B'||
11602 ' WHERE B.status'||p_exec_mode_clause||
11603 ' AND {{data_slice}} '||
11604 ' AND NOT EXISTS (SELECT 0 FROM '||
11605 p_source_tl_table||' S1'||
11606 ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11607 ' AND S1.status'||p_exec_mode_clause||')'||
11608 ' AND NOT EXISTS (SELECT 0 FROM '||
11609 p_target_b_table||' G'||
11610 ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||')';
11611 ELSE
11612 x_bad_member_select_stmt :=
11613 'SELECT B.rowid'||
11614 ',''MISSING_NAME'''||
11615 ' FROM '||p_source_b_table||' B'||
11616 ' WHERE B.status'||p_exec_mode_clause||
11617 ' AND {{data_slice}} '||
11618 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
11619 ' AND NOT EXISTS (SELECT 0 FROM '||
11620 p_source_tl_table||' S1'||
11621 ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11622 ' AND S1.dimension_varchar_label = B.dimension_varchar_label'||
11623 ' AND S1.status'||p_exec_mode_clause||')'||
11624 ' AND NOT EXISTS (SELECT 0 FROM '||
11625 p_target_b_table||' G'||
11626 ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||')';
11627
11628
11629 END IF;
11630
11631
11632 FEM_ENGINES_PKG.TECH_MESSAGE
11633 (c_log_level_2,c_block||'.'||
11634 'build_bad_new_members_stmt',
11635 'End');
11636
11637 END build_bad_new_mbrs_stmt;
11638
11639
11640 /*===========================================================================+
11641 | PROCEDURE
11642 | BUILD_BAD_ATTR_VERS_STMT
11643 |
11644 | DESCRIPTION
11645 | Retrieves any attribute assignment records from the _ATTR_T
11646 | table that have version_display_code values that do not exist
11647 | in FEM.
11648 |
11649 |
11650 | SCOPE - PRIVATE
11651 |
11652 | NOTES
11653 |
11654 |
11655 |
11656 |
11657 | MODIFICATION HISTORY
11658 | Rob Flippo 10-MAR-04 Created
11659 | Rob Flippo 12-NOV-04 Added where condition on aw_snapshot_flag = N
11660 | to prevent users from trying update snapshot
11661 | versions
11662 | Rob Flippo 31-JAN-05 Added where condition on dimension_varchar_label
11663 | when the dimension uses the shared ATTR_T table
11664 | Rob Flippo 15-MAR-05 Bug#4226011 add where user_assign_allowed_flag
11665 | not in 'N' to the select stmt
11666 +===========================================================================*/
11667
11668 procedure build_bad_attr_vers_stmt (p_dimension_varchar_label IN VARCHAR2
11669 ,p_source_attr_table IN VARCHAR2
11670 ,p_shared_dimension_flag IN VARCHAR2
11671 ,p_exec_mode_clause IN VARCHAR2
11672 ,x_bad_attr_vers_select_stmt OUT NOCOPY VARCHAR2)
11673 IS
11674 v_dim_label_where_cond VARCHAR2(1000);
11675
11676 BEGIN
11677 FEM_ENGINES_PKG.TECH_MESSAGE
11678 (c_log_level_2,c_block||'.'||
11679 'build_bad_attr_vers_stmt',
11680 'Begin Build SQL statement to retrieve invalid attribute assignments from the source _ATTR_T table');
11681
11682 IF p_shared_dimension_flag = 'Y' THEN
11683 v_dim_label_where_cond :=
11684 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
11685 ELSE
11686 v_dim_label_where_cond := '';
11687 END IF;
11688
11689
11690 x_bad_attr_vers_select_stmt :=
11691 'SELECT B.rowid'||
11692 ',''INVALID_VERSION'''||
11693 ' FROM '||p_source_attr_table||' B'||
11694 ' WHERE B.status'||p_exec_mode_clause||
11695 v_dim_label_where_cond||
11696 ' AND NOT EXISTS (SELECT 0 FROM fem_dim_attr_versions_b V'||
11697 ' ,fem_dim_attributes_b D'||
11698 ' WHERE V.version_display_code = B.version_display_code'||
11699 ' AND V.attribute_id = D.attribute_id'||
11700 ' AND V.aw_snapshot_flag = ''N'''||
11701 ' AND D.attribute_varchar_label = B.attribute_varchar_label)'||
11702 ' AND EXISTS (SELECT 0 FROM fem_dim_attributes_b A'||
11703 ' WHERE A.attribute_varchar_label = B.attribute_varchar_label'||
11704 ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N''))'||
11705 ' AND {{data_slice}} ';
11706
11707 FEM_ENGINES_PKG.TECH_MESSAGE
11708 (c_log_level_2,c_block||'.'||
11709 'build_bad_attr_vers_stmt',
11710 'End');
11711
11712 END build_bad_attr_vers_stmt;
11713
11714
11715 /*===========================================================================+
11716 | PROCEDURE
11717 | GET_ATTR_VERSION
11718 |
11719 | DESCRIPTION
11720 | Verifies that a version name for a particular attribute
11721 | exists for the given Language and returns the VERSION_ID
11722 |
11723 |
11724 |
11725 | SCOPE - PRIVATE
11726 |
11727 | NOTES
11728 |
11729 |
11730 |
11731 |
11732 | MODIFICATION HISTORY
11733 | Rob Flippo 28-OCT-03 Created
11734 |
11735 +===========================================================================*/
11736
11737
11738 procedure get_attr_version (p_dimension_varchar_label IN VARCHAR2
11739 ,p_attribute_varchar_label IN VARCHAR2
11740 ,p_version_display_code IN VARCHAR2
11741 ,x_version_id OUT NOCOPY NUMBER)
11742 IS
11743
11744
11745 BEGIN
11746 FEM_ENGINES_PKG.TECH_MESSAGE
11747 (c_log_level_2,c_block||'.'||
11748 'get_attr_version',
11749 'Begin verify that a version display_code exists for an attribute');
11750
11751 FEM_ENGINES_PKG.TECH_MESSAGE
11752 (c_log_level_1,c_block||'.'||
11753 'get_attr_version.attribute_varchar_label',
11754 p_attribute_varchar_label);
11755
11756 FEM_ENGINES_PKG.TECH_MESSAGE
11757 (c_log_level_1,c_block||'.'||
11758 'get_attr_version.version_display_code',
11759 p_version_display_code);
11760
11761 SELECT B.version_id
11762 INTO x_version_id
11763 FROM fem_dim_attr_versions_b B, fem_dim_attributes_b A, fem_dimensions_b D
11764 WHERE B.version_display_code = p_version_display_code
11765 AND B.attribute_id = A.attribute_id
11766 AND A.attribute_varchar_label = p_attribute_varchar_label
11767 AND D.dimension_varchar_label = p_dimension_varchar_label
11768 AND D.dimension_id = A.dimension_id;
11769
11770 FEM_ENGINES_PKG.TECH_MESSAGE
11771 (c_log_level_2,c_block||'.'||
11772 'get_attr_version',
11773 'End');
11774
11775 EXCEPTION
11776 WHEN no_data_found THEN
11777 x_version_id := '';
11778
11779 END get_attr_version;
11780
11781
11782 /*===========================================================================+
11783 | PROCEDURE
11784 | BUILD_INSERT_MEMBER_STMT
11785 |
11786 | DESCRIPTION
11787 | Procedure that constructs the dynamic statement that calls the
11788 | INSERT_ROW procedure of the table handler
11789 |
11790 |
11791 |
11792 | SCOPE - PRIVATE
11793 |
11794 | NOTES
11795 |
11796 |
11797 |
11798 |
11799 | MODIFICATION HISTORY
11800 | Rob Flippo 28-OCT-03 Created
11801 | Rob Flippo 04-AUG-06 Bug5060746 Change literals to bind variables
11802 | whereever possible
11803 |
11804 +===========================================================================*/
11805
11806
11807 procedure build_insert_member_stmt (p_table_handler_name IN VARCHAR2
11808 ,p_dimension_id IN NUMBER
11809 ,p_value_set_required_flag IN VARCHAR2
11810 ,p_hier_dimension_flag IN VARCHAR2
11811 ,p_simple_dimension_flag IN VARCHAR2
11812 ,p_member_id_method_code IN VARCHAR2
11813 ,p_member_col IN VARCHAR2
11814 ,p_member_dc_col IN VARCHAR
11815 ,p_member_name_col IN VARCHAR2
11816 ,x_insert_member_stmt OUT NOCOPY VARCHAR2)
11817
11818 IS
11819
11820 BEGIN
11821 FEM_ENGINES_PKG.TECH_MESSAGE
11822 (c_log_level_2,c_block||'.'||
11823 'build_insert_member_stmt',
11824 'Begin SQL statement to insert new dimension members');
11825
11826 IF p_table_handler_name = 'FEM_CAL_PERIODS_PKG' THEN
11827 x_insert_member_stmt :=
11828 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER;'||
11829 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11830 '(x_rowid => v_row_id '||
11831 ',x_'||p_member_col||' => fem_dimension_util_pkg.generate_member_id('||
11832 ':b_end_date,:b_period_number,:b_calendar_id, :b_dimension_group_id,v_err_code,x_num_msg) '||
11833 ',x_dimension_group_id => :b_dimension_group_id '||
11834 ',x_calendar_id => :b_calendar_id '||
11835 ',x_enabled_flag => ''Y'' '||
11836 ',x_personal_flag => ''N'' '||
11837 ',x_read_only_flag => ''N'' '||
11838 ',x_object_version_number => '||c_object_version_number||
11839 ',x_'||p_member_name_col||' => :b_member_name'||
11840 ',x_description => :b_member_desc '||
11841 ',x_creation_date => sysdate '||
11842 ',x_created_by => :b_apps_user_id'||
11843 ',x_last_update_date => sysdate '||
11844 ',x_last_updated_by => :b_apps_user_id2'||
11845 ',x_last_update_login => null ); END;';
11846 ELSIF (p_table_handler_name = 'FEM_DIMENSION_GRPS_PKG') THEN
11847 x_insert_member_stmt :=
11848 'DECLARE v_row_id VARCHAR2(1000); '||
11849 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11850 '(x_rowid => v_row_id '||
11851 ',x_'||p_member_dc_col||' => :b_member_dc '||
11852 ',x_enabled_flag => ''Y'' '||
11853 ',x_personal_flag => ''N'' '||
11854 ',x_read_only_flag => ''N'' '||
11855 ',x_object_version_number => '||c_object_version_number||
11856 ',x_'||p_member_name_col||' => :b_member_name'||
11857 ',x_description => :b_member_desc '||
11858 ',x_creation_date => sysdate '||
11859 ',x_created_by => :b_apps_user_id'||
11860 ',x_last_update_date => sysdate '||
11861 ',x_last_updated_by => :b_apps_user_id2'||
11862 ',x_last_update_login => null '||
11863 ',x_time_dimension_group_key => :b_time_dimension_group_key '||
11864 ',x_dimension_group_seq => :b_dimension_group_seq'||
11865 ',x_time_group_type_code => :b_time_group_type_code'||
11866 ',x_dimension_group_id => :b_dimension_group_id'||
11867 ',x_dimension_id => :b_dimension_id ); END;';
11868
11869 ELSIF (p_value_set_required_flag = 'Y'
11870 AND p_hier_dimension_flag = 'Y'
11871 AND p_member_id_method_code = 'FUNCTION') THEN
11872 x_insert_member_stmt :=
11873 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11874 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11875 '(x_rowid => v_row_id'||
11876 ',x_'||p_member_col||' =>'||
11877 'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11878 ',x_value_set_id => :b_value_set_id '||
11879 ',x_dimension_group_id =>:b_dimension_group_id '||
11880 ',x_'||p_member_dc_col||' => :b_member_dc'||
11881 ',x_enabled_flag => ''Y'' '||
11882 ',x_personal_flag => ''N'' '||
11883 ',x_read_only_flag => ''N'' '||
11884 ',x_object_version_number => '||c_object_version_number||
11885 ',x_'||p_member_name_col||' => :b_member_name'||
11886 ',x_description => :b_member_desc '||
11887 ',x_creation_date => sysdate '||
11888 ',x_created_by => :b_apps_user_id'||
11889 ',x_last_update_date => sysdate '||
11890 ',x_last_updated_by => :b_apps_user_id2'||
11891 ',x_last_update_login => null ); END;';
11892
11893 ELSIF (p_value_set_required_flag = 'Y'
11894 AND p_hier_dimension_flag = 'N'
11895 AND p_member_id_method_code = 'FUNCTION') THEN
11896 x_insert_member_stmt :=
11897 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11898 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11899 '(x_rowid => v_row_id'||
11900 ',x_'||p_member_col||' =>'||
11901 'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11902 ',x_value_set_id => :b_value_set_id '||
11903 ',x_'||p_member_dc_col||' => :b_member_dc'||
11904 ',x_enabled_flag => ''Y'' '||
11905 ',x_personal_flag => ''N'' '||
11906 ',x_read_only_flag => ''N'' '||
11907 ',x_object_version_number => '||c_object_version_number||
11908 ',x_'||p_member_name_col||' => :b_member_name'||
11909 ',x_description => :b_member_desc '||
11910 ',x_creation_date => sysdate '||
11911 ',x_created_by => :b_apps_user_id'||
11912 ',x_last_update_date => sysdate '||
11913 ',x_last_updated_by => :b_apps_user_id2'||
11914 ',x_last_update_login => null ); END;';
11915 ELSIF (p_value_set_required_flag = 'N'
11916 AND p_hier_dimension_flag = 'Y'
11917 AND p_member_id_method_code = 'FUNCTION') THEN
11918 x_insert_member_stmt :=
11919 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11920 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11921 '(x_rowid => v_row_id'||
11922 ',x_'||p_member_col||' =>'||
11923 'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11924 ',x_dimension_group_id =>:b_dimension_group_id '||
11925 ',x_'||p_member_dc_col||' => :b_member_dc'||
11926 ',x_enabled_flag => ''Y'' '||
11927 ',x_personal_flag => ''N'' '||
11928 ',x_read_only_flag => ''N'' '||
11929 ',x_object_version_number => '||c_object_version_number||
11930 ',x_'||p_member_name_col||' => :b_member_name'||
11931 ',x_description => :b_member_desc '||
11932 ',x_creation_date => sysdate '||
11933 ',x_created_by => :b_apps_user_id'||
11934 ',x_last_update_date => sysdate '||
11935 ',x_last_updated_by => :b_apps_user_id2'||
11936 ',x_last_update_login => null ); END;';
11937 ELSIF (p_value_set_required_flag = 'N'
11938 AND p_hier_dimension_flag = 'N'
11939 AND p_member_id_method_code = 'FUNCTION') THEN
11940 x_insert_member_stmt :=
11941 'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11942 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11943 '(x_rowid => v_row_id'||
11944 ',x_'||p_member_col||' =>'||
11945 'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11946 ',x_'||p_member_dc_col||' => :b_member_dc'||
11947 ',x_enabled_flag => ''Y'' '||
11948 ',x_personal_flag => ''N'' '||
11949 ',x_read_only_flag => ''N'' '||
11950 ',x_object_version_number => '||c_object_version_number||
11951 ',x_'||p_member_name_col||' => :b_member_name'||
11952 ',x_description => :b_member_desc '||
11953 ',x_creation_date => sysdate '||
11954 ',x_created_by => :b_apps_user_id'||
11955 ',x_last_update_date => sysdate '||
11956 ',x_last_updated_by => :b_apps_user_id2'||
11957 ',x_last_update_login => null ); END;';
11958
11959 ELSE
11960 x_insert_member_stmt :=
11961 'DECLARE v_row_id VARCHAR2(1000); '||
11962 'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11963 '(x_rowid => v_row_id '||
11964 ',x_'||p_member_col||' => :b_member_dc '||
11965 ',x_enabled_flag => ''Y'' '||
11966 ',x_personal_flag => ''N'' '||
11967 ',x_read_only_flag => ''N'' '||
11968 ',x_object_version_number => '||c_object_version_number||
11969 ',x_'||p_member_name_col||' => :b_member_name'||
11970 ',x_description => :b_member_desc '||
11971 ',x_creation_date => sysdate '||
11972 ',x_created_by => :b_apps_user_id'||
11973 ',x_last_update_date => sysdate '||
11974 ',x_last_updated_by => :b_apps_user_id2'||
11975 ',x_last_update_login => null ); END;';
11976
11977 END IF;
11978
11979 FEM_ENGINES_PKG.TECH_MESSAGE
11980 (c_log_level_2,c_block||'.'||
11981 'build_insert_member_stmt',
11982 'End');
11983
11984 END build_insert_member_stmt;
11985
11986
11987 /*===========================================================================+
11988 | PROCEDURE
11989 | BUILD_INSERT_ATTR_STMT
11990 |
11991 | DESCRIPTION
11992 | Procedure that constructs the dynamic insert statement
11993 | for inserting into the ATTR table
11994 |
11995 |
11996 |
11997 | SCOPE - PRIVATE
11998 |
11999 | NOTES
12000 |
12001 |
12002 |
12003 |
12004 | MODIFICATION HISTORY
12005 | Rob Flippo 28-OCT-03 Created
12006 | Rob Flippo 04-AUG-06 Bug5060746 Change literals to bind variables
12007 | whereever possible
12008 |
12009 +===========================================================================*/
12010
12011
12012 procedure build_insert_attr_stmt (p_target_attr_table IN VARCHAR2
12013 ,p_target_b_table IN VARCHAR2
12014 ,p_member_col IN VARCHAR2
12015 ,p_member_dc_col IN VARCHAR2
12016 ,p_value_set_required_flag IN VARCHAR2
12017 ,x_insert_attr_stmt OUT NOCOPY VARCHAR2)
12018
12019 IS
12020
12021 v_value_set_parm VARCHAR2(100);
12022 v_value_set_column VARCHAR2(30);
12023 v_value_set_select VARCHAR2(100);
12024 v_value_set_where_cond VARCHAR2(1000);
12025 v_value_set_table VARCHAR2(100);
12026
12027 BEGIN
12028 FEM_ENGINES_PKG.TECH_MESSAGE
12029 (c_log_level_2,c_block||'.'||
12030 'build_insert_attr_stmt',
12031 'Begin SQL statement to insert new attribute assignments');
12032
12033 IF p_value_set_required_flag = 'Y' THEN
12034 v_value_set_parm := ', :b_value_set_id';
12035 v_value_set_column := ', value_set_id';
12036 v_value_set_select := ', V1.value_set_id';
12037 v_value_set_where_cond := ' AND B1.value_set_id = V1.value_set_id '||
12038 ' AND V1.value_set_display_code = :b_value_set_display_code';
12039 v_value_set_table := ', FEM_VALUE_SETS_B V1';
12040 ELSE
12041 v_value_set_parm := '';
12042 v_value_set_column := '';
12043 v_value_set_select := '';
12044 v_value_set_where_cond := '';
12045 v_value_set_table := '';
12046 END IF;
12047
12048
12049 x_insert_attr_stmt := 'INSERT INTO '||p_target_attr_table||' ('||
12050 'attribute_id'||
12051 ',version_id'||
12052 ','||p_member_col||
12053 v_value_set_column||
12054 ', dim_attribute_numeric_member'||
12055 ', dim_attribute_value_set_id'||
12056 ', dim_attribute_varchar_member'||
12057 ', number_assign_value'||
12058 ', varchar_assign_value'||
12059 ', date_assign_value'||
12060 ', creation_date'||
12061 ', created_by'||
12062 ', last_updated_by'||
12063 ', last_update_date'||
12064 ', last_update_login'||
12065
12066 ', object_version_number'||
12067 ', aw_snapshot_flag)'||
12068 ' SELECT'||
12069 ' :b_attribute_id '||
12070 ', :b_version_id '||
12071 ','||p_member_col||
12072 v_value_set_select||
12073 ', :b_dim_attribute_numeric_member'||
12074 ', :b_attr_assign_vs_id'||
12075 ', :b_dim_attribute_varchar_member'||
12076 ', :b_number_assign_value'||
12077 ', :b_varchar_assign_value'||
12078 ', :b_date_assign_value'||
12079 ', sysdate'||
12080 ',:b_apps_user_id'||
12081 ',:b_apps_user_id2'||
12082 ', sysdate'||
12083 ', null'||
12084 ', 1'||
12085 ', ''N'''||
12086 ' FROM '||p_target_b_table||' B1 '||
12087 v_value_set_table||
12088 ' WHERE B1.'||p_member_dc_col||' = :b_member_dc'||
12089 v_value_set_where_cond||
12090 ' AND :b_status = ''LOAD''';
12091
12092 FEM_ENGINES_PKG.TECH_MESSAGE
12093 (c_log_level_2,c_block||'.'||
12094 'build_insert_attr_stmt',
12095 'End');
12096
12097 END build_insert_attr_stmt;
12098
12099
12100 /*===========================================================================+
12101 | PROCEDURE
12102 | BUILD_STATUS_UPDATE_STMT
12103 |
12104 | DESCRIPTION
12105 | Procedure that constructs the dynamic update statement
12106 | for setting the status in the _T table for any records
12107 | not loaded.
12108 |
12109 | SCOPE - PRIVATE
12110 |
12111 | NOTES
12112 |
12113 | MODIFICATION HISTORY
12114 | Rob Flippo 04-NOV-03 Created
12115 |
12116 +===========================================================================*/
12117
12118 procedure build_status_update_stmt (p_source_table IN VARCHAR2
12119 ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12120
12121 IS
12122
12123 BEGIN
12124 FEM_ENGINES_PKG.TECH_MESSAGE
12125 (c_log_level_2,c_block||'.'||
12126 'build_status_update_stmt',
12127 'Begin SQL statement to update the status in the source interface table');
12128
12129
12130 x_update_status_stmt := 'UPDATE '||p_source_table||
12131 ' SET status = :b_t_a_status '||
12132 ' WHERE rowid = :b_rowid'||
12133 ' AND :b_t_a_status <> ''LOAD''';
12134
12135 FEM_ENGINES_PKG.TECH_MESSAGE
12136 (c_log_level_2,c_block||'.'||
12137 'build_status_update_stmt',
12138 'End');
12139
12140 END build_status_update_stmt;
12141
12142 /*===========================================================================+
12143 | PROCEDURE
12144 | BUILD_CALP_STATUS_UPDATE_STMT
12145 |
12146 | DESCRIPTION
12147 | Procedure that constructs the dynamic update statement
12148 | for setting the status in the various CAL_PERIOD
12149 | _T table for any records identified in the Interim table
12150 | as having an error
12151 |
12152 | SCOPE - PRIVATE
12153 |
12154 | NOTES
12155 |
12156 | MODIFICATION HISTORY
12157 | Rob Flippo 05-JAN-05 Created
12158 |
12159 +===========================================================================*/
12160
12161 procedure build_calp_status_update_stmt (p_operation_mode IN VARCHAR2
12162 ,p_source_table IN VARCHAR2
12163 ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12164
12165 IS
12166
12167 BEGIN
12168 FEM_ENGINES_PKG.TECH_MESSAGE
12169 (c_log_level_2,c_block||'.'||
12170 'build_calp_status_update_stmt',
12171 'Begin SQL statement to update the status in the interface table based on bad records from the CALP Interim table');
12172
12173 IF p_operation_mode = 'ATTRIBUTE_LABEL' THEN
12174
12175 x_update_status_stmt := 'UPDATE '||p_source_table||
12176 ' SET status = :b_t_a_status '||
12177 ' WHERE cal_period_number = :b_cal_period_number'||
12178 ' AND cal_period_end_date = :b_cal_period_end_date'||
12179 ' AND calendar_display_code = :b_calendar_dc'||
12180 ' AND dimension_group_display_code = :b_dimension_group_dc'||
12181 ' AND :b_overlap_flag = ''Y'''||
12182 ' AND attribute_varchar_label = ''CAL_PERIOD_START_DATE''';
12183 ELSE
12184 x_update_status_stmt := 'UPDATE '||p_source_table||
12185 ' SET status = :b_t_a_status '||
12186 ' WHERE cal_period_number = :b_cal_period_number'||
12187 ' AND cal_period_end_date = :b_cal_period_end_date'||
12188 ' AND calendar_display_code = :b_calendar_dc'||
12189 ' AND dimension_group_display_code = :b_dimension_group_dc'||
12190 ' AND :b_overlap_flag = ''Y''';
12191
12192 END IF;
12193
12194 FEM_ENGINES_PKG.TECH_MESSAGE
12195 (c_log_level_2,c_block||'.'||
12196 'build_calp_status_update_stmt',
12197 'End');
12198
12199 END build_calp_status_update_stmt;
12200 /*===========================================================================+
12201 | PROCEDURE
12202 | BUILD_CALP_DELETE_STMT
12203 |
12204 | DESCRIPTION
12205 | Procedure that constructs the dynamic delete statement
12206 | for setting CAL_PERIOD members from the INTERIM table
12207 | that were successfully moved into FEM
12208 |
12209 | SCOPE - PRIVATE
12210 |
12211 | NOTES
12212 |
12213 | MODIFICATION HISTORY
12214 | Rob Flippo 25-JAN-05 Created
12215 | Rob Flippo 15-MAR-07 Bug#5900463 - TL rows for other languages
12216 | getting deleted when new members are being
12217 | loaded
12218 |
12219 +===========================================================================*/
12220
12221 procedure build_calp_delete_stmt (p_source_table IN VARCHAR2
12222 ,p_operation_mode IN VARCHAR2
12223 ,x_calp_delete_stmt OUT NOCOPY VARCHAR2)
12224
12225 IS
12226
12227 v_attr_where_cond VARCHAR2(4000);
12228 v_tl_where_cond VARCHAR2(4000);
12229
12230 BEGIN
12231 FEM_ENGINES_PKG.TECH_MESSAGE
12232 (c_log_level_2,c_block||'.'||
12233 'build_calp_delete_stmt',
12234 'Begin SQL statement to delete rows from the CAL_PERIOD interface tables');
12235 IF p_source_table = 'FEM_CAL_PERIODS_ATTR_T' THEN
12236 v_tl_where_cond := null;
12237 IF p_operation_mode = 'NEW_MEMBERS' THEN
12238 v_attr_where_cond := ' AND attribute_varchar_label IN '||
12239 ' (SELECT attribute_varchar_label'||
12240 ' FROM fem_dim_attributes_b'||
12241 ' WHERE dimension_id=1'||
12242 ' AND attribute_required_flag = ''Y'')';
12243 ELSE
12244 v_attr_where_cond := ' AND attribute_varchar_label IN '||
12245 ' (SELECT attribute_varchar_label'||
12246 ' FROM fem_dim_attributes_b A, fem_calp_attr_interim_t I'||
12247 ' WHERE A.dimension_id=1'||
12248 ' AND A.attribute_id = I.attribute_id'||
12249 ' AND I.cal_period_id = :cal_period_id'||
12250 ' AND overlap_flag = ''N'')';
12251
12252 END IF;
12253 ELSIF p_source_table = 'FEM_CAL_PERIODS_TL_T' THEN
12254 v_attr_where_cond := null;
12255 v_tl_where_cond := ' AND language = userenv(''LANG'')';
12256 ELSE
12257 v_attr_where_cond := null;
12258 v_tl_where_cond := null;
12259 END IF;
12260
12261
12262
12263 x_calp_delete_stmt := 'DELETE FROM '||p_source_table||
12264 ' WHERE cal_period_number = :b_cal_period_number'||
12265 ' AND cal_period_end_date = :b_cal_period_end_date'||
12266 ' AND calendar_display_code = :b_calendar_dc'||
12267 ' AND dimension_group_display_code = :b_dimension_group_dc'||
12268 v_attr_where_cond||v_tl_where_cond;
12269
12270
12271 FEM_ENGINES_PKG.TECH_MESSAGE
12272 (c_log_level_2,c_block||'.'||
12273 'build_calp_delete_stmt',
12274 'End');
12275
12276 END build_calp_delete_stmt;
12277
12278
12279
12280 /*===========================================================================+
12281 | PROCEDURE
12282 | BUILD_DEP_STATUS_UPDATE_STMT
12283 |
12284 | DESCRIPTION
12285 | Procedure that constructs the dynamic update statement
12286 | for setting the status in the depended _T tables (_ATTR and _TL_T)
12287 | for records with the same member identifier as records
12288 | that were identified in the _B_T table as having a bad Dimension Group,
12289 | Bad Value Set, or Missing Name
12290 |
12291 |
12292 | SCOPE - PRIVATE
12293 |
12294 | NOTES
12295 | We only want to update dependent attribute records where the status='LOAD'
12296 | And the member failed for some other reason. This is just so that all attr
12297 | records for failed members have some sort of error status, thus enabling
12298 | the records to be all reprocessed with an Error Reprocessing run
12299 | MODIFICATION HISTORY
12300 | Rob Flippo 29-MAR-04 Created
12301 | Rob Flippo 17-SEP-04 This procedure is obsolete and is no longer called
12302 |
12303 +===========================================================================*/
12304
12305 procedure build_dep_status_update_stmt (p_dimension_varchar_label IN VARCHAR2
12306 ,p_source_table IN VARCHAR2
12307 ,p_member_t_dc_col IN VARCHAR2
12308 ,p_value_set_required_flag IN VARCHAR2
12309 ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12310
12311 IS
12312
12313 BEGIN
12314 FEM_ENGINES_PKG.TECH_MESSAGE
12315 (c_log_level_2,c_block||'.'||
12316 'build_dep_status_update_stmt',
12317 'Begin');
12318
12319 IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
12320
12321 x_update_status_stmt := 'UPDATE '||p_source_table||
12322 ' SET status = ''INVALID_MEMBER'' '||
12323 ' WHERE calendar_display_code = :b_calendar_display_code'||
12324 ' AND dimension_group_display_code = :b_dimension_group_display_code'||
12325 ' AND cal_period_end_date = :b_cal_period_end_date'||
12326 ' AND cal_period_number = :b_cal_period_number'||
12327 ' AND :b_t_a_status <> ''LOAD'''||
12328 ' AND status IN (''LOAD'')';
12329
12330 ELSIF (p_value_set_required_flag = 'Y') THEN
12331 x_update_status_stmt := 'UPDATE '||p_source_table||
12332 ' SET status = ''INVALID_MEMBER'' '||
12333 ' WHERE '||p_member_t_dc_col||' = :b_member_dc'||
12334 ' AND value_set_display_code = :b_value_set_display_code'||
12335 ' AND :b_t_a_status <> ''LOAD'''||
12336 ' AND status IN (''LOAD'')';
12337 END IF;
12338
12339 FEM_ENGINES_PKG.TECH_MESSAGE
12340 (c_log_level_2,c_block||'.'||
12341 'build_dep_status_update_stmt',
12342 'End');
12343
12344 END build_dep_status_update_stmt;
12345
12346
12347 /*===========================================================================+
12348 | PROCEDURE
12349 | BUILD_ATTRLAB_UPDATE_STMT
12350 |
12351 | DESCRIPTION
12352 | Procedure that constructs the dynamic update statement
12353 | for setting the status in the ATTR_T tables
12354 | for records where the ATTRIBUTE_VARCHAR_LABEL does not exist;
12355 | such records would not otherwise be updated
12356 |
12357 |
12358 | SCOPE - PRIVATE
12359 |
12360 | NOTES
12361 | MODIFICATION HISTORY
12362 | Rob Flippo 14-SEP-04 Created
12363 |
12364 +===========================================================================*/
12365
12366 procedure build_attrlab_update_stmt (p_dimension_varchar_label IN VARCHAR2
12367 ,p_source_attr_table IN VARCHAR2
12368 ,p_shared_dimension_flag IN VARCHAR2
12369 ,p_exec_mode_clause IN VARCHAR2
12370 ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12371
12372 IS
12373
12374 v_dim_label_where_cond VARCHAR2(1000);
12375
12376 BEGIN
12377 FEM_ENGINES_PKG.TECH_MESSAGE
12378 (c_log_level_2,c_block||'.'||
12379 'build_attrlab_update_stmt',
12380 'Begin');
12381
12382 IF p_shared_dimension_flag = 'Y' THEN
12383 v_dim_label_where_cond :=
12384 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12385 ELSE
12386 v_dim_label_where_cond := '';
12387 END IF;
12388
12389
12390 x_update_status_stmt := 'UPDATE '||p_source_attr_table||' B'||
12391 ' SET status = ''INVALID_ATTRIBUTE_LABEL'' '||
12392 ' WHERE attribute_varchar_label NOT IN (SELECT '||
12393 ' attribute_varchar_label FROM fem_dim_attributes_b A'||
12394 ' ,fem_dimensions_b D '||
12395 ' WHERE D.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
12396 ' AND D.dimension_id = A.dimension_id)'||
12397 ' AND B.status '||p_exec_mode_clause||
12398 v_dim_label_where_cond||
12399 ' AND {{data_slice}} ';
12400
12401
12402 FEM_ENGINES_PKG.TECH_MESSAGE
12403 (c_log_level_2,c_block||'.'||
12404 'build_attrlab_update_stmt',
12405 'End');
12406
12407 END build_attrlab_update_stmt;
12408
12409 /*===========================================================================+
12410 | PROCEDURE
12411 | BUILD_NOT_USER_LABEL_UPD_STMT
12412 |
12413 | DESCRIPTION
12414 | Procedure that constructs the dynamic update statement
12415 | for setting the status in the ATTR_T tables
12416 | for records where the ATTRIBUTE_VARCHAR_LABEL is
12417 | user_assign_allowed_flag = 'N';
12418 | such records would not otherwise be updated
12419 |
12420 |
12421 | SCOPE - PRIVATE
12422 |
12423 | NOTES
12424 | MODIFICATION HISTORY
12425 | Rob Flippo 15-MAR-05 Created
12426 |
12427 +===========================================================================*/
12428
12429 procedure build_not_user_label_upd_stmt (p_dimension_varchar_label IN VARCHAR2
12430 ,p_source_attr_table IN VARCHAR2
12431 ,p_shared_dimension_flag IN VARCHAR2
12432 ,p_exec_mode_clause IN VARCHAR2
12433 ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12434
12435 IS
12436
12437 v_dim_label_where_cond VARCHAR2(1000);
12438
12439 BEGIN
12440 FEM_ENGINES_PKG.TECH_MESSAGE
12441 (c_log_level_2,c_block||'.'||
12442 'build_attrlab_update_stmt',
12443 'Begin');
12444
12445 IF p_shared_dimension_flag = 'Y' THEN
12446 v_dim_label_where_cond :=
12447 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12448 ELSE
12449 v_dim_label_where_cond := '';
12450 END IF;
12451
12452
12453 x_update_status_stmt := 'UPDATE '||p_source_attr_table||' B'||
12454 ' SET status = ''ATTR_LABEL_NOT_USER_ASSIGN'' '||
12455 ' WHERE attribute_varchar_label IN (SELECT '||
12456 ' attribute_varchar_label FROM fem_dim_attributes_b A'||
12457 ' ,fem_dimensions_b D '||
12458 ' WHERE D.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
12459 ' AND nvl(A.user_assign_allowed_flag,''Y'') = ''N'''||
12460 ' AND D.dimension_id = A.dimension_id)'||
12461 ' AND B.status '||p_exec_mode_clause||
12462 v_dim_label_where_cond||
12463 ' AND {{data_slice}} ';
12464
12465
12466 FEM_ENGINES_PKG.TECH_MESSAGE
12467 (c_log_level_2,c_block||'.'||
12468 'build_attrlab_update_stmt',
12469 'End');
12470
12471 END build_not_user_label_upd_stmt;
12472
12473
12474
12475 /*===========================================================================+
12476 | PROCEDURE
12477 | BUILD_DELETE_STMT
12478 |
12479 | DESCRIPTION
12480 | Procedure that constructs the dynamic delete statement
12481 | for removing loaded records from the _ATTR_T and _TL_T tables
12482 |
12483 |
12484 |
12485 | SCOPE - PRIVATE
12486 |
12487 | NOTES
12488 |
12489 |
12490 |
12491 |
12492 | MODIFICATION HISTORY
12493 | Rob Flippo 04-NOV-03 Created
12494 | Rob Flippo 05-JAN-05 Modified to include use_interim_table_flag
12495 +===========================================================================*/
12496
12497 procedure build_delete_stmt (p_source_table IN VARCHAR2
12498 ,x_delete_stmt OUT NOCOPY VARCHAR2)
12499
12500 IS
12501
12502 BEGIN
12503 FEM_ENGINES_PKG.TECH_MESSAGE
12504 (c_log_level_2,c_block||'.'||
12505 'build_delete_stmt',
12506 'Begin');
12507
12508 x_delete_stmt := 'DELETE FROM '||p_source_table||
12509 ' WHERE rowid = :b_rowid'||
12510 ' AND :b_t_a_status = ''LOAD'''||
12511 ' AND :b_use_interim_table_flag = ''N''';
12512
12513 FEM_ENGINES_PKG.TECH_MESSAGE
12514 (c_log_level_2,c_block||'.'||
12515 'build_delete_stmt',
12516 'End');
12517
12518 END build_delete_stmt;
12519
12520
12521 /*===========================================================================+
12522 | PROCEDURE
12523 | BUILD_SPECIAL_DELETE_STMT
12524 |
12525 | DESCRIPTION
12526 | Procedure that constructs the dynamic delete statement
12527 | for removing records from the _ATTR_T that successfully updated
12528 |
12529 |
12530 |
12531 | SCOPE - PRIVATE
12532 |
12533 | NOTES
12534 |
12535 |
12536 |
12537 |
12538 | MODIFICATION HISTORY
12539 | Rob Flippo 04-NOV-03 Created
12540 |
12541 +===========================================================================*/
12542
12543 procedure build_special_delete_stmt (p_source_table IN VARCHAR2
12544 ,x_delete_stmt OUT NOCOPY VARCHAR2)
12545
12546 IS
12547
12548 BEGIN
12549 FEM_ENGINES_PKG.TECH_MESSAGE
12550 (c_log_level_2,c_block||'.'||
12551 'build_special_delete_stmt',
12552 'Begin');
12553
12554 x_delete_stmt := 'DELETE FROM '||p_source_table||
12555 ' WHERE rowid = :b_rowid'||
12556 ' AND :b_allow_mult_assign_flag = ''N'''||
12557 ' AND :b_attr_exists_count > 0'||
12558 ' AND :b_status = ''LOAD'''||
12559 ' AND :b_use_interim_table_flag = ''N''';
12560
12561
12562 FEM_ENGINES_PKG.TECH_MESSAGE
12563 (c_log_level_2,c_block||'.'||
12564 'build_special_delete_stmt',
12565 'End');
12566
12567 END build_special_delete_stmt;
12568
12569
12570
12571 /*===========================================================================+
12572 | PROCEDURE
12573 | build_remain_mbr_select_stmt
12574 |
12575 | DESCRIPTION
12576 | Builds the dynamic SELECT statement for retrieving
12577 | the remaining members from the _B_T interface table.
12578 | When this SELECT is run, only the only records remaining
12579 | in the _B_T table with "LOAD" status are those for Value Set Required
12580 | dimensions that already exist in FEM.
12581 | Note that this SELECT stmt is not run for CAL_PERIOD and Simple dimensions
12582 | since the Dimension Group for members of those dimensions either
12583 | doesn't apply (Simple Dimensions) or can't be changed (CAL_PERIOD)
12584 |
12585 | SCOPE - PRIVATE
12586 |
12587 | NOTES
12588 |
12589 |
12590 |
12591 |
12592 | MODIFICATION HISTORY
12593 | Rob Flippo 06-NOV-03 Created
12594 | Rob Flippo 16-MAR-05 Bug34244082 Modify to return the member_id
12595 | in the select so that we can use that to
12596 | query the HIER table in Base_update
12597 | Rob Flippo 22-MAR-05 Fix query so that dimension_id is part of where
12598 | condition when joining to FEM_DIMENSION_GRPS_B
12599 +===========================================================================*/
12600
12601
12602 procedure build_remain_mbr_select_stmt (p_load_type IN VARCHAR2
12603 ,p_dimension_id IN NUMBER
12604 ,p_dimension_varchar_label IN VARCHAR2
12605 ,p_shared_dimension_flag IN VARCHAR2
12606 ,p_value_set_required_flag IN VARCHAR2
12607 ,p_hier_dimension_flag IN VARCHAR2
12608 ,p_source_b_table IN VARCHAR2
12609 ,p_target_b_table IN VARCHAR2
12610 ,p_member_col IN VARCHAR2
12611 ,p_member_dc_col IN VARCHAR2
12612 ,p_member_t_dc_col IN VARCHAR2
12613 ,p_exec_mode_clause IN VARCHAR2
12614 ,x_remain_mbr_select_stmt OUT NOCOPY VARCHAR2)
12615 IS
12616 -- Dimension Label where condition (for shared dimensions)
12617 v_dim_label_where_cond VARCHAR2(1000);
12618
12619
12620 BEGIN
12621 FEM_ENGINES_PKG.TECH_MESSAGE
12622 (c_log_level_2,c_block||'.'||
12623 'build_remain_mbr_select_stmt',
12624 'Begin');
12625
12626 -- setting the Dim Label conditions
12627 IF (p_value_set_required_flag = 'N'
12628 AND p_shared_dimension_flag = 'Y') THEN
12629 v_dim_label_where_cond :=
12630 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12631 ELSE
12632 v_dim_label_where_cond := '';
12633 END IF; -- setting the Dim Label conditions
12634
12635
12636 IF (p_load_type = 'DIMENSION_MEMBER') AND
12637 (p_value_set_required_flag = 'Y') AND
12638 (p_hier_dimension_flag = 'Y') THEN
12639 x_remain_mbr_select_stmt :=
12640 'SELECT B.rowid'||
12641 ', to_char(TB.'||p_member_col||')'||
12642 ', B.'||p_member_t_dc_col||
12643 ', B.value_set_display_code'||
12644 ', V.value_set_id'||
12645 ', B.dimension_group_display_code'||
12646 ', D.dimension_group_id'||
12647 ', TB.dimension_group_id'||
12648 ',null'||
12649 ',null'||
12650 ', ''LOAD'' '||
12651 ' FROM '||p_source_b_table||' B'||
12652 ', FEM_DIMENSION_GRPS_B D'||
12653 ', FEM_VALUE_SETS_B V'||
12654 ', '||p_target_b_table||' TB'||
12655 ' WHERE B.status'||p_exec_mode_clause||
12656 ' AND {{data_slice}} '||
12657 ' AND B.value_set_display_code = V.value_set_display_code'||
12658 ' AND B.dimension_group_display_code = D.dimension_group_display_code (+)'||
12659 ' AND D.dimension_id (+) = '||p_dimension_id||
12660 ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12661 ' AND TB.value_set_id = V.value_set_id';
12662
12663 /*****************************************************
12664 3/16/05 commented out because doing join now to target b table
12665 ' AND EXISTS (SELECT 0'||
12666 ' FROM '||p_target_b_table||
12667 ' WHERE '||p_member_dc_col||' = B.'||p_member_t_dc_col||
12668 ' AND value_set_id = (SELECT value_set_id FROM fem_value_sets_b'||
12669 ' WHERE value_set_display_code = B.value_set_display_code))';
12670 ********************************************************/
12671
12672 ELSIF (p_load_type = 'DIMENSION_MEMBER') AND
12673 (p_value_set_required_flag = 'Y') AND
12674 (p_hier_dimension_flag = 'N') THEN
12675 x_remain_mbr_select_stmt :=
12676 'SELECT B.rowid'||
12677 ', to_char(TB.'||p_member_col||')'||
12678 ', B.'||p_member_t_dc_col||
12679 ', B.value_set_display_code'||
12680 ', V.value_set_id'||
12681 ', null'||
12682 ', null'||
12683 ',null'||
12684 ',null'||
12685 ',null'||
12686 ', ''LOAD'' '||
12687 ' FROM '||p_source_b_table||' B'||
12688 ', FEM_VALUE_SETS_B V'||
12689 ', '||p_target_b_table||' TB'||
12690 ' WHERE B.status'||p_exec_mode_clause||
12691 ' AND {{data_slice}} '||
12692 ' AND B.value_set_display_code = V.value_set_display_code'||
12693 ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12694 ' AND TB.value_set_id = V.value_set_id';
12695
12696 /*****************************************************
12697 3/16/05 commented out because doing join now to target b table
12698 ' AND EXISTS (SELECT 0'||
12699 ' FROM '||p_target_b_table||
12700 ' WHERE '||p_member_dc_col||' = B.'||p_member_t_dc_col||
12701 ' AND value_set_id = (SELECT value_set_id FROM fem_value_sets_b'||
12702 ' WHERE value_set_display_code = B.value_set_display_code))';
12703 ********************************************************/
12704
12705 ELSIF (p_load_type = 'DIMENSION_MEMBER')
12706 AND (p_dimension_varchar_label = 'CAL_PERIOD') THEN
12707
12708 -- keeping the where exists clause rather than straight join due to
12709 -- the fact that source_b table doesn't have a single display_code col
12710 -- for CAL_PERIOD
12711 x_remain_mbr_select_stmt :=
12712 'SELECT B.rowid'||
12713 ',LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12714 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12715 'LPAD(to_char(C.calendar_id),5,''0'')||'||
12716 'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
12717 ',LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12718 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12719 'LPAD(to_char(C.calendar_id),5,''0'')||'||
12720 'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
12721 ', null'||
12722 ', null'||
12723 ', null'||
12724 ', null'||
12725 ',null'||
12726 ',null'||
12727 ',null'||
12728 ', ''LOAD'' '||
12729 ' FROM '||p_source_b_table||' B'||
12730 ', FEM_CALENDARS_B C'||
12731 ', FEM_DIMENSION_GRPS_B D'||
12732 ' WHERE B.calendar_display_code = C.calendar_display_code'||
12733 ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
12734 ' AND EXISTS (SELECT 0'||
12735 ' FROM '||p_target_b_table||
12736 ' WHERE to_char('||p_member_dc_col||') = '||
12737 'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12738 'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12739 'LPAD(to_char(C.calendar_id),5,''0'')||'||
12740 'LPAD(to_char(D.time_dimension_group_key),5,''0'')) '||
12741 ' AND B.status'||p_exec_mode_clause||
12742 ' AND {{data_slice}} ';
12743 ELSIF (p_load_type = 'DIMENSION_MEMBER') AND
12744 (p_value_set_required_flag = 'N') AND
12745 (p_dimension_varchar_label NOT IN ('CAL_PERIOD')) THEN
12746 x_remain_mbr_select_stmt :=
12747 'SELECT B.rowid'||
12748 ', to_char(TB.'||p_member_col||')'||
12749 ', B.'||p_member_t_dc_col||
12750 ', null'||
12751 ', null'||
12752 ', null'||
12753 ', null'||
12754 ',null'||
12755 ',null'||
12756 ',null'||
12757 ', ''LOAD'' '||
12758 ' FROM '||p_source_b_table||' B'||
12759 ', '||p_target_b_table||' TB'||
12760 ' WHERE B.status'||p_exec_mode_clause||
12761 v_dim_label_where_cond||
12762 ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12763 ' AND {{data_slice}} ';
12764
12765 /*****************************************************
12766 3/16/05 commented out because doing join now to target b table
12767 ' WHERE EXISTS (SELECT 0'||
12768 ' FROM '||p_target_b_table||
12769 ' WHERE '||p_member_dc_col||' = '||
12770 ' B.'||p_member_t_dc_col||')'||
12771 ******************************************************/
12772
12773 ELSIF (p_load_type = 'DIMENSION_GROUP') THEN
12774 x_remain_mbr_select_stmt :=
12775 'SELECT B.rowid'||
12776 ', to_char(TB.'||p_member_col||')'||
12777 ', B.'||p_member_t_dc_col||
12778 ', null'||
12779 ', null'||
12780 ', null'||
12781 ', null'||
12782 ', null'||
12783 ',B.dimension_group_seq'||
12784 ',B.time_group_type_code'||
12785 ', ''LOAD'' '||
12786 ' FROM '||p_source_b_table||' B'||
12787 ', '||p_target_b_table||' TB'||
12788 ', fem_dimensions_b D'||
12789 ' WHERE B.status'||p_exec_mode_clause||
12790 ' AND B.dimension_varchar_label = D.dimension_varchar_label'||
12791 ' AND D.dimension_id = TB.dimension_id'||
12792 ' AND TB.dimension_group_display_code = B.dimension_group_display_code'||
12793 ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12794
12795 /*****************************************************
12796 3/16/05 commented out because doing join now to target b table
12797 ' WHERE EXISTS (SELECT 0'||
12798 ' FROM '||p_target_b_table||
12799 ' WHERE '||p_member_dc_col||' = '||
12800 ' B.'||p_member_t_dc_col||')'||
12801 *******************************************************/
12802
12803 END IF;
12804
12805 FEM_ENGINES_PKG.TECH_MESSAGE
12806 (c_log_level_2,c_block||'.'||
12807 'build_remain_mbr_select_stmt',
12808 'End');
12809
12810 END build_remain_mbr_select_stmt;
12811
12812
12813 /*===========================================================================+
12814 | PROCEDURE
12815 | BUILD_DIMGRP_UPDATE_STMT
12816 |
12817 | DESCRIPTION
12818 | Builds the dynamic UPDATE statement for updating
12819 | the DIMENSION_GROUP_ID column on the _B member table
12820 |
12821 | SCOPE - PRIVATE
12822 |
12823 | NOTES
12824 | This procedure does not use the table handlers for performing the update
12825 |
12826 |
12827 |
12828 | MODIFICATION HISTORY
12829 | Rob Flippo 06-NOV-03 Created
12830 | Rob Flippo 16-MAR-05 Bug#4244082 requires this procedure
12831 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
12832 +===========================================================================*/
12833
12834
12835 procedure build_dimgrp_update_stmt (p_target_b_table IN VARCHAR2
12836 ,p_value_set_required_flag IN VARCHAR2
12837 ,p_member_dc_col IN VARCHAR2
12838 ,x_update_stmt OUT NOCOPY VARCHAR2)
12839
12840 IS
12841
12842
12843 BEGIN
12844 FEM_ENGINES_PKG.TECH_MESSAGE
12845 (c_log_level_2,c_block||'.'||
12846 'build_dimgrp_update_stmt',
12847 'Begin');
12848
12849
12850 IF p_value_set_required_flag = 'Y' THEN
12851 x_update_stmt :=
12852 'UPDATE '||p_target_b_table||
12853 ' SET dimension_group_id = :b_dimension_group_id'||
12854 ',last_update_date = sysdate '||
12855 ',last_updated_by = :b_apps_user_id'||
12856 ',last_update_login = :b_login_id'||
12857 ' WHERE '||p_member_dc_col||' = :b_member_dc'||
12858 ' AND value_set_id = :b_value_set_id'||
12859 ' AND :b_status = ''LOAD''';
12860
12861 ELSE
12862 x_update_stmt :=
12863 'UPDATE '||p_target_b_table||
12864 ' SET dimension_group_id = :b_dimension_group_id'||
12865 ',last_update_date = sysdate '||
12866 ',last_updated_by = :b_apps_user_id'||
12867 ',last_update_login = :b_login_id'||
12868 ' WHERE '||p_member_dc_col||' = :b_member_dc'||
12869 ' AND :b_status = ''LOAD''';
12870
12871 END IF;
12872 FEM_ENGINES_PKG.TECH_MESSAGE
12873 (c_log_level_2,c_block||'.'||
12874 'build_dimgrp_update_stmt',
12875 'End');
12876
12877 END build_dimgrp_update_stmt;
12878
12879
12880
12881 /*===========================================================================+
12882 | PROCEDURE
12883 | BUILD_ATTR_UPDATE_STMT
12884 |
12885 | DESCRIPTION
12886 | Builds the dynamic UPDATE statement for updating
12887 | existing ATTR rows using the interface source _ATTR_T rows
12888 |
12889 | SCOPE - PRIVATE
12890 |
12891 | NOTES
12892 |
12893 |
12894 |
12895 |
12896 | MODIFICATION HISTORY
12897 | Rob Flippo 13-NOV-03 Created
12898 | Rob Flippo 04-JAN-05 Added "use_interim_table_flag" condition
12899 | so that the update only happens for rows that are
12900 | not going to the FEM_CALP_ATTR_INTERIM_T table for
12901 | additional processing
12902 | Rob Flippo 11-AUG-05 Bug#4547868 performance issue - fix update
12903 | so no subquery against base table
12904 | Rob Flippo 04-AUG-06 Bug 5060746 Change literals to bind variables wherever possible
12905 +===========================================================================*/
12906
12907
12908 procedure build_attr_update_stmt (p_target_attr_table IN VARCHAR2
12909 ,p_target_b_table IN VARCHAR2
12910 ,p_member_dc_col IN VARCHAR2
12911 ,p_member_col IN VARCHAR2
12912 ,p_value_set_required_flag IN VARCHAR2
12913 ,x_update_stmt OUT NOCOPY VARCHAR2)
12914
12915 IS
12916
12917
12918 BEGIN
12919 FEM_ENGINES_PKG.TECH_MESSAGE
12920 (c_log_level_2,c_block||'.'||
12921 'build_attr_update_stmt',
12922 'Begin');
12923
12924 IF p_value_set_required_flag = 'Y' THEN
12925 x_update_stmt :=
12926
12927 'UPDATE '||p_target_attr_table||' A'||
12928 ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12929 ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12930 ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12931 ' ,number_assign_value = :b_number_assign_value'||
12932 ' ,varchar_assign_value = :b_varchar_assign_value'||
12933 ' ,date_assign_value = :b_date_assign_value'||
12934 ',last_update_date = sysdate '||
12935 ',last_updated_by = :b_apps_user_id'||
12936 ',last_update_login = :b_login_id'||
12937 ' WHERE A.'||p_member_col||' = :b_member_id'||
12938 ' AND A.value_set_id = :value_set_id'||
12939 ' AND A.attribute_id = :b_attribute_id'||
12940 ' AND A.version_id = :b_version_id'||
12941 ' AND :b_allow_mult_assign_flag = ''N'''||
12942 ' AND :b_attr_exists_count > 0'||
12943 ' AND :b_status = ''LOAD''';
12944
12945
12946 /*************************8
12947 commented out per bug#4547868
12948 'UPDATE '||p_target_attr_table||' A'||
12949 ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12950 ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12951 ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12952 ' ,number_assign_value = :b_number_assign_value'||
12953 ' ,varchar_assign_value = :b_varchar_assign_value'||
12954 ' ,date_assign_value = :b_date_assign_value'||
12955 ',last_update_date = sysdate '||
12956 ',last_updated_by = '||gv_apps_user_id||
12957 ',last_update_login = '||gv_login_id||
12958 ' WHERE A.'||p_member_col||' = (SELECT '||p_member_col||
12959 ' FROM '||p_target_b_table||' B'||
12960 ', fem_value_sets_b V'||
12961 ' WHERE B.'||p_member_dc_col||' = :b_member_dc'||
12962 ' AND B.value_set_id = V.value_set_id'||
12963 ' AND V.value_set_display_code = :value_set_dc)'||
12964 ' AND A.attribute_id = :b_attribute_id'||
12965 ' AND A.version_id = :b_version_id'||
12966 ' AND :b_allow_mult_assign_flag = ''N'''||
12967 ' AND :b_attr_exists_count > 0'||
12968 ' AND :b_status = ''LOAD''';
12969 ****************************************************/
12970 ELSE
12971 x_update_stmt :=
12972 'UPDATE '||p_target_attr_table||' A'||
12973 ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12974 ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12975 ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12976 ' ,number_assign_value = :b_number_assign_value'||
12977 ' ,varchar_assign_value = :b_varchar_assign_value'||
12978 ' ,date_assign_value = :b_date_assign_value'||
12979 ',last_update_date = sysdate '||
12980 ',last_updated_by = :b_apps_user_id'||
12981 ',last_update_login = :b_login_id'||
12982 ' WHERE A.'||p_member_col||' = :b_member_id'||
12983 ' AND A.attribute_id = :b_attribute_id'||
12984 ' AND A.version_id = :b_version_id'||
12985 ' AND :b_allow_mult_assig_flag = ''N'''||
12986 ' AND :b_attr_exists_count > 0'||
12987 ' AND :b_status = ''LOAD'''||
12988 ' AND :b_use_interim_table_flag = ''N''';
12989 /***********************************
12990 commented out per bug#4547868
12991 'UPDATE '||p_target_attr_table||' A'||
12992 ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12993 ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12994 ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12995 ' ,number_assign_value = :b_number_assign_value'||
12996 ' ,varchar_assign_value = :b_varchar_assign_value'||
12997 ' ,date_assign_value = :b_date_assign_value'||
12998 ',last_update_date = sysdate '||
12999 ',last_updated_by = '||gv_apps_user_id||
13000 ',last_update_login = '||gv_login_id||
13001 ' WHERE A.'||p_member_col||' = (SELECT '||p_member_col||
13002 ' FROM '||p_target_b_table||' B'||
13003 ' WHERE to_char(B.'||p_member_dc_col||') = :b_member_dc)'||
13004 ' AND A.attribute_id = :b_attribute_id'||
13005 ' AND A.version_id = :b_version_id'||
13006 ' AND :b_allow_mult_assig_flag = ''N'''||
13007 ' AND :b_attr_exists_count > 0'||
13008 ' AND :b_status = ''LOAD'''||
13009 ' AND :b_use_interim_table_flag = ''N''';
13010 *******************************************/
13011
13012
13013 END IF; -- p_value_set_required_flag
13014 FEM_ENGINES_PKG.TECH_MESSAGE
13015 (c_log_level_2,c_block||'.'||
13016 'build_attr_update_stmt',
13017 'End');
13018
13019 END build_attr_update_stmt;
13020
13021 /*===========================================================================+
13022 | PROCEDURE
13023 | Calp_Date_Overlap_Check
13024 |
13025 | DESCRIPTION
13026 | Called after New_Members and ATTR_ASSIGN_UPDATE
13027 | procedures are complete
13028 | Identifies Date Overlap records for CAL_PERIOD loads
13029 | This procedure does not employ MP - it is single threaded
13030 | because all cal_periods to be loaded must be evaluated
13031 | for each member to be loaded
13032 |
13033 | SCOPE - PRIVATE
13034 |
13035 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
13036 |
13037 | ARGUMENTS : IN:
13038 |
13039 |
13040 | OUT:
13041 |
13042 |
13043 |
13044 | IN/ OUT:
13045 |
13046 | RETURNS : NONE
13047 |
13048 | NOTES
13049 | If operation_mode = 'NEW_MEMBERS', then Bulk Collect CAL_PERIOD_IDs
13050 | to check from FEM_CALP_INTERIM_T
13051 | Else operation_mode = 'ATTR_UPDATE', then Bulk Collect CAL_PERIOD_IDs
13052 | to check from join of FEM_CALP_ATTR_INTERIM_T and FEM_CALP_INTERIM_T
13053 | where the attribute = CAL_PERIOD_START_DATE
13054 | Note that FEM_CALP_INTERIM_T is always populated, even for Attr Update,
13055 | which is why we can use this table to perform the overlap checks
13056 |
13057 | Once the list of CAL_PERIOD_IDs to check is populated query the
13058 | FEM_CALP_INTERIM_T table for each one to see if any date overlaps exist
13059 | This table will be populated for all CAL_PERIODs in the load, whether
13060 | for a New_Member phase or an ATTR_ASSIGN_UPDATE phase
13061 |
13062 | For NEW_MEMBER phase, if an overlap is found, update the OVERLAP_FLAG = 'Y'
13063 | in FEM_CALP_INTERIM_T for that cal_period_id.
13064 | -- also update the STATUS in the _B_T, _TL_T and ATTR_T tables for CAL_PERIOD
13065 | for each member as follows:
13066 | ATTR_T table: CALENDAR_PERIOD_START_DATE attr row = "OVERLAP_START_DATE_IN_LOAD"
13067 | ATTR_T table: all other attr rows = "INVALID_MEMBER"
13068 | TL_T table: "INVALID_MEMBER"
13069 | B_T table: "INVALID_REQUIRED_ATTRIBUTE"
13070 |
13071 | For ATTR_UPDATE phase, if an overlap is found, update the OVERLAP_FLAG = 'Y'
13072 | in FEM_CALP_ATTR_INTERIM_T for the "START_DATE" attribute rows
13073 | -- also update the STATUS in the _ATTR_T table as follows:
13074 | CALENDAR_PERIOD_START_DATE attr row = "OVERLAP_START_DATE_IN_LOAD"
13075 |
13076 | Note: We perform the STATUS updates on the interface tables in this procedure
13077 | since we already have the bad rows in our array. Rather than require
13078 | a requery of the Interim tables in another procedure, it's more performant just
13079 | to perform the status update now, even though it is single threaded
13080 |
13081 | MODIFICATION HISTORY
13082 | Rob Flippo 03-JAN-05 Created
13083 |
13084 +===========================================================================*/
13085
13086 procedure calp_date_overlap_check(x_rows_rejected OUT NOCOPY NUMBER
13087 ,p_operation_mode IN VARCHAR2
13088 )
13089 IS
13090
13091 t_cal_period_id number_type;
13092 t_calendar_id number_type;
13093 t_dimension_group_id number_type;
13094 t_start_date date_type;
13095 t_end_date date_type;
13096 t_rowid rowid_type;
13097 t_overlap_flag flag_type;
13098 t_calendar_dc varchar2_std_type;
13099 t_dimension_group_dc varchar2_std_type;
13100 t_cal_period_number number_type;
13101
13102
13103 v_bulk_rows_rejected NUMBER;
13104 v_rows_rejected NUMBER;
13105 v_mbr_last_row NUMBER;
13106 v_count NUMBER;
13107 v_fetch_limit NUMBER;
13108 v_interim_table_name VARCHAR2(30); -- this holds the interim table_name for sql operations
13109
13110 x_select_stmt VARCHAR2(4000);
13111 x_date_check_stmt VARCHAR2(4000);
13112 x_update_stmt VARCHAR2(4000);
13113 x_update_mbr_status_stmt VARCHAR2(4000);
13114 x_update_tl_status_stmt VARCHAR2(4000);
13115 x_update_attr_status_stmt VARCHAR2(4000);
13116 x_update_attrlab_status_stmt VARCHAR2(4000);
13117
13118 -- Declare Table names for status updates
13119 v_source_b_table VARCHAR2(4000);
13120 v_source_tl_table VARCHAR2(4000);
13121 v_source_attr_table VARCHAR2(4000);
13122
13123 ---------------------
13124 -- Declare cursors --
13125 ---------------------
13126 cv_get_rows cv_curs;
13127
13128 BEGIN
13129
13130 FEM_ENGINES_PKG.TECH_MESSAGE
13131 (c_log_level_2,c_block||'.'||'calp_date_overlap_check','Begin Date Overlap Check for CAL_PERIOD load');
13132
13133 -- initialize the fetch limit to 10,000 rows
13134 -- since calp_date_overlap_check is not an MP procedure, we can't get
13135 -- the fetch limit from the MP parameters. So we set it manually
13136 -- here
13137 v_fetch_limit := 10000;
13138
13139 -- initialize the table name variables for CAL_PERIOD interface table names
13140 v_source_b_table := 'FEM_CAL_PERIODS_B_T';
13141 v_source_tl_table := 'FEM_CAL_PERIODS_TL_T';
13142 v_source_attr_table := 'FEM_CAL_PERIODS_ATTR_T';
13143
13144 -- initialize the rejected row count
13145 v_rows_rejected := 0;
13146
13147 build_calp_status_update_stmt ('ATTRIBUTE_LABEL'
13148 ,v_source_attr_table
13149 ,x_update_attrlab_status_stmt);
13150
13151
13152 IF p_operation_mode = 'NEW_MEMBERS' THEN
13153 v_interim_table_name := 'FEM_CALP_INTERIM_T';
13154
13155 x_select_stmt := 'SELECT rowid'||
13156 ', cal_period_id'||
13157 ', calendar_id'||
13158 ', dimension_group_id'||
13159 ', cal_period_end_date'||
13160 ', cal_period_start_date'||
13161 ', overlap_flag'||
13162 ', cal_period_number'||
13163 ', calendar_display_code'||
13164 ', dimension_group_display_code'||
13165 ' FROM fem_calp_interim_t'||
13166 ' WHERE adjustment_period_flag = ''N''';
13167
13168 -- When processing Members, we have to perform status
13169 -- updates on the other interface tables, plus the other
13170 -- rows in the ATTR_T table
13171 build_calp_status_update_stmt ('NO_LABEL'
13172 ,v_source_b_table
13173 ,x_update_mbr_status_stmt);
13174
13175 build_calp_status_update_stmt ('NO_LABEL'
13176 ,v_source_tl_table
13177 ,x_update_tl_status_stmt);
13178
13179 build_calp_status_update_stmt ('NO_LABEL'
13180 ,v_source_attr_table
13181 ,x_update_attr_status_stmt);
13182
13183
13184 ELSE
13185 v_interim_table_name := 'FEM_CALP_ATTR_INTERIM_T';
13186 x_select_stmt := 'SELECT AI.rowid'||
13187 ', AI.cal_period_id'||
13188 ', I.calendar_id'||
13189 ', I.dimension_group_id'||
13190 ', I.cal_period_end_date'||
13191 ', I.cal_period_start_date'||
13192 ', I.overlap_flag'||
13193 ', I.cal_period_number'||
13194 ', I.calendar_display_code'||
13195 ', I.dimension_group_display_code'||
13196 ' FROM fem_calp_attr_interim_t AI'||
13197 ',fem_calp_interim_t I'||
13198 ',fem_dim_attributes_b A'||
13199 ' WHERE AI.cal_period_id = I.cal_period_id'||
13200 ' AND AI.attribute_id = A.attribute_id'||
13201 ' AND A.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
13202 ' AND I.adjustment_period_flag = ''N''';
13203
13204
13205 END IF;
13206 x_date_check_stmt := 'SELECT count(*) FROM fem_calp_interim_t'||
13207 ' WHERE cal_period_end_date >= :b_start_date'||
13208 ' AND cal_period_start_date <= :b_end_date'||
13209 ' AND calendar_id = :b_calendar_id'||
13210 ' AND dimension_group_id = :b_dimension_group_id'||
13211 ' AND adjustment_period_flag = ''N'''||
13212 ' AND cal_period_id <> :b_cal_period_id';
13213
13214 x_update_stmt := 'UPDATE '||v_interim_table_name||
13215 ' SET overlap_flag = ''Y'''||
13216 ' WHERE rowid = :b_rowid'||
13217 ' AND :b_overlap_flag = ''Y''';
13218
13219 FEM_ENGINES_PKG.TECH_MESSAGE
13220 (c_log_level_1,c_block||'.'||'x_select_stmt',x_select_stmt);
13221
13222 OPEN cv_get_rows FOR x_select_stmt;
13223
13224 LOOP
13225
13226 FETCH cv_get_rows BULK COLLECT INTO
13227 t_rowid
13228 ,t_cal_period_id
13229 ,t_calendar_id
13230 ,t_dimension_group_id
13231 ,t_end_date
13232 ,t_start_date
13233 ,t_overlap_flag
13234 ,t_cal_period_number
13235 ,t_calendar_dc
13236 ,t_dimension_group_dc
13237 LIMIT v_fetch_limit;
13238 ----------------------------------------------
13239 -- EXIT Fetch LOOP If No Rows are Retrieved --
13240 ----------------------------------------------
13241 v_mbr_last_row := t_cal_period_id.LAST;
13242
13243 IF (v_mbr_last_row IS NULL)
13244 THEN
13245 EXIT;
13246 END IF;
13247
13248 --------------------------------------------------------------------------
13249 -- Begin Looking for Overlaps
13250 -- process each calendar period id in the array row by row
13251 -- when an overlap condition found, mark the selected cal_period_id
13252 -- in the interim table. Note that we don't attempt to mark any of the
13253 -- cal_period_ids that caused the overlap, because to do so would be
13254 -- expensive in terms of code and even performance because it would require
13255 -- an additional I/O since the overlaps might not exist within the array
13256 ------------------------------------------------------------------------
13257 FEM_ENGINES_PKG.TECH_MESSAGE
13258 (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Begin looking for overlaps');
13259
13260 FOR i IN 1..v_mbr_last_row
13261 LOOP
13262 EXECUTE IMMEDIATE x_date_check_stmt
13263 INTO v_count
13264 USING t_start_date(i)
13265 ,t_end_date(i)
13266 ,t_calendar_id(i)
13267 ,t_dimension_group_id(i)
13268 ,t_cal_period_id(i);
13269
13270 IF v_count > 0 THEN
13271 t_overlap_flag(i) := 'Y';
13272 END IF;
13273
13274 END LOOP; -- Begin Looking for Overlaps
13275 ------------------------------------------------------------
13276 -- Update the Interim table Overlap Flag for all bad records
13277 -- this statement either updates FEM_CALP_INTERIM_T or
13278 -- FEM_CALP_ATTR_INTERIM_T, depending on the Operation Mode
13279 ------------------------------------------------------------
13280 FEM_ENGINES_PKG.TECH_MESSAGE
13281 (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Update interim table');
13282
13283 FORALL i IN 1..v_mbr_last_row
13284 EXECUTE IMMEDIATE x_update_stmt
13285 USING t_rowid(i)
13286 ,t_overlap_flag(i);
13287
13288 -- For mode = NEW_MEMBERS, we update the status in the
13289 -- following interface tables:
13290 -- FEM_CAL_PERIODS_B_T
13291 -- FEM_CAL_PERIODS_TL_T
13292 -- FEM_CAL_PERIODS_ATTR_T (for the START_DATE attribute)
13293 -- FEM_CAL_PERIODS_ATTR_T (for any other attr rows of that member)
13294 --
13295 -- Otherwise (Attr Assign Update mode), we only update the
13296 -- following interface table:
13297 -- FEM_CAL_PERIODS_ATTR_T (for the START_DATE attribute)
13298 FEM_ENGINES_PKG.TECH_MESSAGE
13299 (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Update status of bad records');
13300
13301 IF p_operation_mode = 'NEW_MEMBERS' THEN
13302 ----------------------------------------------------------
13303 -- Update Status of _B_T table for failed members
13304 ----------------------------------------------------------
13305 FORALL i IN 1..v_mbr_last_row
13306 EXECUTE IMMEDIATE x_update_mbr_status_stmt
13307 USING 'INVALID_REQUIRED_ATTRIBUTE'
13308 ,t_cal_period_number(i)
13309 ,t_end_date(i)
13310 ,t_calendar_dc(i)
13311 ,t_dimension_group_dc(i)
13312 ,t_overlap_flag(i);
13313
13314 v_bulk_rows_rejected := SQL%ROWCOUNT;
13315 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13316
13317 ----------------------------------------------------------
13318 -- Update Status of _TL_T table for failed members
13319 ----------------------------------------------------------
13320 FORALL i IN 1..v_mbr_last_row
13321 EXECUTE IMMEDIATE x_update_tl_status_stmt
13322 USING 'INVALID_MEMBER'
13323 ,t_cal_period_number(i)
13324 ,t_end_date(i)
13325 ,t_calendar_dc(i)
13326 ,t_dimension_group_dc(i)
13327 ,t_overlap_flag(i);
13328
13329 v_bulk_rows_rejected := SQL%ROWCOUNT;
13330 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13331 ----------------------------------------------------------
13332 -- Update Status of other (non START_DATE) attr assignments for the member
13333 -- in the _ATTR_T table
13334 ----------------------------------------------------------
13335 FORALL i IN 1..v_mbr_last_row
13336 EXECUTE IMMEDIATE x_update_attr_status_stmt
13337 USING 'INVALID_MEMBER'
13338 ,t_cal_period_number(i)
13339 ,t_end_date(i)
13340 ,t_calendar_dc(i)
13341 ,t_dimension_group_dc(i)
13342 ,t_overlap_flag(i);
13343
13344 v_bulk_rows_rejected := SQL%ROWCOUNT;
13345 v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13346
13347 END IF;
13348
13349 ----------------------------------------------------------
13350 -- Update Status of Attr Collection for failed START_DATE records
13351 -- this update applies to both NEW_MEMBERS and ATTR_ASSIGN_UPDATE
13352 -- modes
13353 -- We do this last since we are overwriting the previous
13354 -- status update for the single record where attribute_varchar_label =
13355 -- CAL_PERIOD_START_DATE
13356 ----------------------------------------------------------
13357 FORALL i IN 1..v_mbr_last_row
13358 EXECUTE IMMEDIATE x_update_attrlab_status_stmt
13359 USING 'OVERLAP_START_DATE_IN_LOAD'
13360 ,t_cal_period_number(i)
13361 ,t_end_date(i)
13362 ,t_calendar_dc(i)
13363 ,t_dimension_group_dc(i)
13364 ,t_overlap_flag(i);
13365 -- NOTE: We do not count the error rows for this particular
13366 -- status update because we have already counted the
13367 -- row in the previous ATTR_T update (i.e., we don't want
13368 -- to double-count)
13369
13370
13371 --------------------------------------------
13372 -- Delete CAL_PERIOD Collection for Next Bulk Fetch --
13373 --------------------------------------------
13374 t_rowid.DELETE;
13375 t_cal_period_id.DELETE;
13376 t_calendar_id.DELETE;
13377 t_dimension_group_id.DELETE;
13378 t_start_date.DELETE;
13379 t_end_date.DELETE;
13380 t_overlap_flag.DELETE;
13381 t_cal_period_number.DELETE;
13382 t_calendar_dc.DELETE;
13383 t_dimension_group_dc.DELETE;
13384
13385 --COMMIT;
13386 END LOOP; -- main bulk collect
13387 CLOSE cv_get_rows;
13388 x_rows_rejected := v_rows_rejected;
13389
13390 FEM_ENGINES_PKG.TECH_MESSAGE
13391 (c_log_level_2,c_block||'.'||'calp_date_overlap_check','End Date Overlap Check for CAL_PERIOD load');
13392
13393
13394 END calp_date_overlap_check;
13395
13396
13397 ----------------------------------------------------------------------
13398 -- Post Dimension Status (called by Main)
13399 --
13400 -- This procedure puts an entry into FEM_DIM_LOAD_STATUS
13401 -- for each source system code in the load
13402 --
13403 -- If # of records in source attr table =0, the entry is 'INCOMPLETE'
13404 -- Otherwise, it is 'INCOMPLETE'
13405 ------------------------------------------------------------------------
13406 PROCEDURE Post_dim_status (p_dimension_id IN VARCHAR2
13407 ,p_source_system_dc IN VARCHAR2
13408 ,p_source_attr_table IN VARCHAR2)
13409 IS
13410 v_src_sys_select_stmt VARCHAR2(4000);
13411 v_src_sys_status VARCHAR2(30);
13412 v_status_count NUMBER;
13413 v_attr_count NUMBER;
13414 v_dim_load_status VARCHAR2(30);
13415 v_source_system_code NUMBER;
13416 v_sql_stmt VARCHAR2(4000);
13417 c_proc_name VARCHAR2(30) := 'Post_dim_status';
13418
13419 e_invalid_src_sys EXCEPTION;
13420
13421 BEGIN
13422 -- Get the source_system_code for the input source_system_dc
13423 BEGIN
13424 FEM_ENGINES_PKG.TECH_MESSAGE
13425 (c_log_level_3,c_block||'.'||c_proc_name,'Begin');
13426
13427 SELECT source_system_code
13428 INTO v_source_system_code
13429 FROM fem_source_systems_b
13430 WHERE source_system_display_code = p_source_system_dc;
13431
13432 EXCEPTION
13433 WHEN no_data_found THEN
13434 RAISE e_invalid_src_sys;
13435 END;
13436
13437 -- Is there an existing status row in FEM_DIM_LOAD_STATUS
13438 -- for the Source System Code and Dimension combination?
13439 SELECT count(*)
13440 INTO v_status_count
13441 FROM fem_dim_load_status
13442 WHERE dimension_id = p_dimension_id
13443 AND source_system_code = v_source_system_code;
13444
13445 -- Check the record count in the source ATTR_T table
13446 -- This is the only table we check for error rows, since it is the
13447 -- only table that has a source system context
13448 v_src_sys_select_stmt := 'SELECT count(*) FROM '||p_source_attr_table||
13449 ' WHERE attribute_varchar_label = ''SOURCE_SYSTEM_CODE'''||
13450 ' AND attribute_assign_value = '''||p_source_system_dc||''''||
13451 ' AND rownum=1';
13452
13453 EXECUTE IMMEDIATE v_src_sys_select_stmt
13454 INTO v_attr_count;
13455
13456 IF v_attr_count = 0 THEN
13457 v_dim_load_status := 'COMPLETE';
13458 ELSE v_dim_load_status := 'INCOMPLETE';
13459 END IF;
13460
13461 IF v_status_count = 0 THEN
13462 INSERT INTO fem_dim_load_status (DIMENSION_ID
13463 ,SOURCE_SYSTEM_CODE
13464 ,LOAD_STATUS
13465 ,REPROCESS_ERRORS_FLAG
13466 ,CREATION_DATE
13467 ,CREATED_BY
13468 ,LAST_UPDATED_BY
13469 ,LAST_UPDATE_DATE
13470 ,LAST_UPDATE_LOGIN
13471 ,OBJECT_VERSION_NUMBER)
13472 SELECT p_dimension_id
13473 ,v_source_system_code
13474 ,v_dim_load_status
13475 ,'N'
13476 ,sysdate
13477 ,gv_apps_user_id
13478 ,gv_apps_user_id
13479 ,sysdate
13480 ,gv_login_id
13481 ,1
13482 FROM dual;
13483 ELSE
13484 UPDATE fem_dim_load_status
13485 SET load_status = v_dim_load_status,
13486 last_updated_by = gv_apps_user_id,
13487 last_update_date = sysdate,
13488 last_update_login = gv_login_id
13489 WHERE dimension_id = p_dimension_id
13490 AND source_system_code = v_source_system_code;
13491 END IF;
13492
13493 FEM_ENGINES_PKG.TECH_MESSAGE
13494 (c_log_level_3,c_block||'.'||c_proc_name,'End');
13495
13496 EXCEPTION
13497 WHEN e_invalid_src_sys THEN
13498 null;
13499
13500 END Post_dim_status;
13501
13502 --------------------------------------------------------------------------
13503 -- This Procedure is to intialize the TABLE TYPE variable which stores
13504 -- the flex field information of the Activity and Cost Objects
13505
13506
13507 -- The TABLE TYPE variable holds the following values for each
13508 -- component Dimension
13509
13510 -- ATTRIBUTE VALUE
13511
13512 -- dimension_varchar_label Component Dimension varchar label
13513 -- dimension_id -999
13514 -- member_col null
13515 -- member_display_code_col null
13516 -- member_b_table_name null
13517 -- value_set_required_flag null
13518 -- member_sql null
13519
13520
13521 -- PARAMETER Information
13522
13523 -- p_dimension_varchar_label The Varchar Label of Composite Dimension
13524
13525 -- MODIFICATION HISTORY
13526 -- sshanmug 11-May-05 Created.
13527 ----------------------------------------------------------------------------
13528
13529 /* PROCEDURE Metadata_Initialize(p_dimension_varchar_label IN VARCHAR2)
13530
13531 IS
13532
13533 c_proc_name CONSTANT VARCHAR2(20) := 'Metadata_Initialize';
13534 i NUMBER; -- counting variable for no:of segments of Flex Field
13535
13536 BEGIN
13537
13538 fem_engines_pkg.tech_message (
13539 p_severity => c_log_level_1
13540 ,p_module => c_block||'.'||c_proc_name||'.Begin'
13541 ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13542
13543 ----------------------------------------------------------------------------
13544 --Clean the previous Values
13545 ----------------------------------------------------------------------------
13546
13547 t_component_dim_dc.DELETE;
13548
13549 ----------------------------------------------------------------------------
13550 -- "t_component_dim_dc" is a TABLE TYPE which holds the display code
13551 -- values of all the component dimension members of Activity/Cost Object
13552 ----------------------------------------------------------------------------
13553
13554 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13555
13556 t_component_dim_dc(1) := 'FINANCIAL_ELEM_DISPLAY_CODE';
13557 t_component_dim_dc(2) := 'LEDGER_DISPLAY_CODE';
13558 t_component_dim_dc(3) := 'PRODUCT_DISPLAY_CODE';
13559 t_component_dim_dc(4) := 'CCTR_ORG_DISPLAY_CODE';
13560 t_component_dim_dc(5) := 'CUSTOMER_DISPLAY_CODE';
13561 t_component_dim_dc(6) := 'CHANNEL_DISPLAY_CODE';
13562 t_component_dim_dc(7) := 'PROJECT_DISPLAY_CODE';
13563 t_component_dim_dc(8) := 'USER_DIM1_DISPLAY_CODE';
13564 t_component_dim_dc(9) := 'USER_DIM2_DISPLAY_CODE';
13565 t_component_dim_dc(10) := 'USER_DIM3_DISPLAY_CODE';
13566 t_component_dim_dc(11) := 'USER_DIM4_DISPLAY_CODE';
13567 t_component_dim_dc(12) := 'USER_DIM5_DISPLAY_CODE';
13568 t_component_dim_dc(13) := 'USER_DIM6_DISPLAY_CODE';
13569 t_component_dim_dc(14) := 'USER_DIM7_DISPLAY_CODE';
13570 t_component_dim_dc(15) := 'USER_DIM8_DISPLAY_CODE';
13571 t_component_dim_dc(16) := 'USER_DIM9_DISPLAY_CODE';
13572 t_component_dim_dc(17) := 'USER_DIM10_DISPLAY_CODE';
13573
13574 --------------------------------------------------------------------------
13575 --As per Cost Object HLD, the Cost Object FF can have 17 segments and
13576 --hence initializing it to 17
13577 --------------------------------------------------------------------------
13578 i := 17;
13579
13580
13581 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13582
13583 t_component_dim_dc(1) := 'TASK_DISPLAY_CODE';
13584 t_component_dim_dc(2) := 'CCTR_ORG_DISPLAY_CODE';
13585 t_component_dim_dc(3) := 'CUSTOMER_DISPLAY_CODE';
13586 t_component_dim_dc(4) := 'CHANNEL_DISPLAY_CODE';
13587 t_component_dim_dc(5) := 'PRODUCT_DISPLAY_CODE';
13588 t_component_dim_dc(6) := 'PROJECT_DISPLAY_CODE';
13589 t_component_dim_dc(7) := 'USER_DIM1_DISPLAY_CODE';
13590 t_component_dim_dc(8) := 'USER_DIM2_DISPLAY_CODE';
13591 t_component_dim_dc(9) := 'USER_DIM3_DISPLAY_CODE';
13592 t_component_dim_dc(10) := 'USER_DIM4_DISPLAY_CODE';
13593 t_component_dim_dc(11) := 'USER_DIM5_DISPLAY_CODE';
13594 t_component_dim_dc(12) := 'USER_DIM6_DISPLAY_CODE';
13595 t_component_dim_dc(13) := 'USER_DIM7_DISPLAY_CODE';
13596 t_component_dim_dc(14) := 'USER_DIM8_DISPLAY_CODE';
13597 t_component_dim_dc(15) := 'USER_DIM9_DISPLAY_CODE';
13598 t_component_dim_dc(16) := 'USER_DIM10_DISPLAY_CODE';
13599
13600 --------------------------------------------------------------------------
13601 --As per Activity HLD, the Cost Object FF can have 16 segments and
13602 --hence initializing it to 16
13603 --------------------------------------------------------------------------
13604 i := 16;
13605
13606 END IF;
13607
13608 ---------------------------------------------------------------------------
13609 --Initialize the TABLE TYPE variable 't_metadata' with default values.
13610 ---------------------------------------------------------------------------
13611
13612 FOR j IN 1 .. i LOOP
13613
13614 t_metadata(j).dimension_varchar_label := NULL;
13615 t_metadata(j).member_display_code_col := t_component_dim_dc(j);
13616 t_metadata(j).dimension_id := -999;
13617 t_metadata(j).member_col := NULL;
13618 t_metadata(j).member_b_table_name := NULL;
13619 t_metadata(j).value_set_required_flag := NULL;
13620 t_metadata(j).member_sql := NULL;
13621
13622 END LOOP;
13623
13624 fem_engines_pkg.tech_message (
13625 p_severity => c_log_level_1
13626 ,p_module => c_block||'.'||c_proc_name||'.End'
13627 ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13628
13629 EXCEPTION
13630
13631 WHEN others THEN
13632
13633 fem_engines_pkg.tech_message (
13634 p_severity => c_log_level_4
13635 ,p_module => c_block||'.'||c_proc_name||'.Exception'
13636 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13637 'Code'||SQLCODE||'Err'||SQLERRM);
13638
13639 RAISE e_terminate;
13640
13641 END Metadata_Initialize;
13642
13643
13644 /*===========================================================================+
13645 | PROCEDURE
13646 | Get_Display_Code
13647 |
13648 | DESCRIPTION
13649 | This procedure concatenates the individual component dimension members
13650 | of the Composite Dimensions(Activity and Cost Objects).
13651 |
13652 | The component dimension members are concatenated to form a
13653 | single Composite Dimension Member.The component dimension members
13654 | are separated by the delimiter of the corresponding flex filed.
13655 |
13656 |ARGUMENTS : IN:
13657 |
13658 | p_dimension_varchar_label - Composite Dimension Name
13659 | p_structure_id - FF structure Code
13660 |
13661 | MODIFICATION HISTORY
13662 | Aturlapa 06-APR-05 Created
13663 | sshanmug 11-May-05 Generalised the common piece of code both AC/CO.
13664 +===========================================================================*/
13665
13666 /* PROCEDURE Get_Display_Codes (p_dimension_varchar_label IN VARCHAR2,
13667 p_structure_id IN NUMBER)
13668
13669 IS
13670
13671 c_proc_name CONSTANT VARCHAR2(20) := 'Get_Display_Codes';
13672
13673 -- FF Details
13674 l_segment_delimiter VARCHAR2(1);
13675 p_ff_code_activity VARCHAR2(4) := 'FEAC';
13676 p_ff_code_cost VARCHAR2(4) := 'FECO';
13677
13678 --Counting Variable
13679 v_last_row NUMBER;
13680
13681 BEGIN
13682
13683 fem_engines_pkg.tech_message (
13684 p_severity => c_log_level_1
13685 ,p_module => c_block||'.'||c_proc_name||'.Begin'
13686 ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13687
13688 ----------------------------------------------------------------------------
13689 --Get the count of records in the interface table (this fetch)
13690 ----------------------------------------------------------------------------
13691
13692 v_last_row := t_status.COUNT;
13693
13694 ----------------------------------------------------------------------------
13695 --Clean the previous Values
13696 ----------------------------------------------------------------------------
13697
13698 t_display_code.DELETE;
13699
13700 ----------------------------------------------------------------------
13701 --Get the segment delimiter
13702 ----------------------------------------------------------------------
13703
13704 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13705
13706 l_segment_delimiter := FND_FLEX_EXT.GET_DELIMITER('FEM',p_ff_code_cost,
13707 p_structure_id);
13708 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13709
13710 l_segment_delimiter := FND_FLEX_EXT.GET_DELIMITER('FEM',p_ff_code_activity,
13711 p_structure_id);
13712 END IF;
13713
13714
13715
13716 FOR i IN 1..v_last_row LOOP
13717
13718 --------------------------------------------------------------------------
13719 -- Concatenate only rows with STATUS = 'LOAD'
13720 --------------------------------------------------------------------------
13721
13722 IF t_status(i) = 'LOAD' THEN
13723
13724 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13725
13726 ----------------------------------------------------------------------
13727 --Fin Elem and Ledger are mandatory for CO hence it is concatenated
13728 ----------------------------------------------------------------------
13729
13730 t_display_code(i) := t_fin_elem_dc(i) || l_segment_delimiter;
13731 t_display_code(i) := t_display_code(i) || t_ledger_dc(i);
13732
13733 ----------------------------------------------------------------------
13734 --Concatenate other segments only if they are not null.
13735 ----------------------------------------------------------------------
13736
13737 IF t_product_dc(i) IS NOT NULL THEN
13738 t_display_code(i) := t_display_code(i) ||
13739 l_segment_delimiter||t_product_dc(i);
13740 END IF;
13741 IF t_cctr_org_dc(i) IS NOT NULL THEN
13742 t_display_code(i) := t_display_code(i) ||
13743 l_segment_delimiter||t_cctr_org_dc(i);
13744 END IF;
13745 IF t_customer_dc(i) IS NOT NULL THEN
13746 t_display_code(i) := t_display_code(i) ||
13747 l_segment_delimiter||t_customer_dc(i);
13748 END IF;
13749 IF t_channel_dc(i) IS NOT NULL THEN
13750 t_display_code(i) := t_display_code(i) ||
13751 l_segment_delimiter||t_channel_dc(i);
13752 END IF;
13753 IF t_project_dc(i) IS NOT NULL THEN
13754 t_display_code(i) := t_display_code(i) ||
13755 l_segment_delimiter||t_project_dc(i);
13756 END IF;
13757
13758 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13759
13760 ----------------------------------------------------------------------
13761 --Task is mandatory for Activity hence it is concatenated
13762 ----------------------------------------------------------------------
13763
13764 t_display_code(i) := t_task_dc(i);
13765
13766 -----------------------------------------------------------------------
13767 --Concatenate other segments only if they are not null.
13768 -----------------------------------------------------------------------
13769
13770 IF t_cctr_org_dc(i) IS NOT NULL THEN
13771 t_display_code(i) := t_display_code(i) ||
13772 l_segment_delimiter||t_cctr_org_dc(i);
13773 END IF;
13774 IF t_customer_dc(i) IS NOT NULL THEN
13775 t_display_code(i) := t_display_code(i) ||
13776 l_segment_delimiter||t_customer_dc(i);
13777 END IF;
13778 IF t_channel_dc(i) IS NOT NULL THEN
13779 t_display_code(i) := t_display_code(i) ||
13780 l_segment_delimiter||t_channel_dc(i);
13781 END IF;
13782 IF t_product_dc(i) IS NOT NULL THEN
13783 t_display_code(i) := t_display_code(i) ||
13784 l_segment_delimiter||t_product_dc(i);
13785 END IF;
13786 IF t_project_dc(i) IS NOT NULL THEN
13787 t_display_code(i) := t_display_code(i) ||
13788 l_segment_delimiter||t_project_dc(i);
13789 END IF;
13790
13791 END IF;
13792
13793 ------------------------------------------------------------------------
13794 -- The following component Dimensions are common for both Activity and
13795 -- Cost Object. Hence it will be common code for both dimensions.
13796 ------------------------------------------------------------------------
13797
13798 IF t_user_dim1_dc(i) IS NOT NULL THEN
13799 t_display_code(i) := t_display_code(i) ||
13800 l_segment_delimiter||t_user_dim1_dc(i);
13801 END IF;
13802 IF t_user_dim2_dc(i) IS NOT NULL THEN
13803 t_display_code(i) := t_display_code(i) ||
13804 l_segment_delimiter||t_user_dim2_dc(i);
13805 END IF;
13806 IF t_user_dim3_dc(i) IS NOT NULL THEN
13807 t_display_code(i) := t_display_code(i) ||
13808 l_segment_delimiter||t_user_dim3_dc(i);
13809 END IF;
13810 IF t_user_dim4_dc(i) IS NOT NULL THEN
13811 t_display_code(i) := t_display_code(i) ||
13812 l_segment_delimiter||t_user_dim4_dc(i);
13813 END IF;
13814 IF t_user_dim5_dc(i) IS NOT NULL THEN
13815 t_display_code(i) := t_display_code(i) ||
13816 l_segment_delimiter||t_user_dim5_dc(i);
13817 END IF;
13818 IF t_user_dim6_dc(i) IS NOT NULL THEN
13819 t_display_code(i) := t_display_code(i) ||
13820 l_segment_delimiter||t_user_dim6_dc(i);
13821 END IF;
13822 IF t_user_dim7_dc(i) IS NOT NULL THEN
13823 t_display_code(i) := t_display_code(i) ||
13824 l_segment_delimiter||t_user_dim7_dc(i);
13825 END IF;
13826 IF t_user_dim8_dc(i) IS NOT NULL THEN
13827 t_display_code(i) := t_display_code(i) ||
13828 l_segment_delimiter||t_user_dim8_dc(i);
13829 END IF;
13830 IF t_user_dim9_dc(i) IS NOT NULL THEN
13831 t_display_code(i) := t_display_code(i) ||
13832 l_segment_delimiter||t_user_dim9_dc(i);
13833 END IF;
13834 IF t_user_dim10_dc(i) IS NOT NULL THEN
13835 t_display_code(i) := t_display_code(i) ||
13836 l_segment_delimiter||t_user_dim10_dc(i);
13837 END IF;
13838
13839 ELSE
13840
13841 t_display_code(i) := NULL;
13842
13843 END IF; -- STATUS = 'LOAD'
13844
13845 END LOOP;
13846
13847 -----------------------------------------------------------------------------
13848 ---End Concatenate the segments
13849 -----------------------------------------------------------------------------
13850
13851 fem_engines_pkg.tech_message (
13852 p_severity => c_log_level_1
13853 ,p_module => c_block||'.'||c_proc_name||'.End'
13854 ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13855
13856 EXCEPTION
13857
13858 WHEN others THEN
13859 fem_engines_pkg.tech_message (
13860 p_severity => c_log_level_4
13861 ,p_module => c_block||'.'||c_proc_name||'.Exception'
13862 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13863 'Code'||SQLCODE||'Err'||SQLERRM);
13864
13865 RAISE e_terminate;
13866
13867 END Get_Display_Codes;
13868
13869 /*===========================================================================+
13870 | PROCEDURE
13871 | pre_process
13872 |
13873 | DESCRIPTION
13874 |
13875 | This Procedure is used to get the flexfield information of the composite
13876 | Dimensions (Activity and Cost Object).It populates the component dimension
13877 | information into a TABLE TYPE variable.
13878 |
13879 | SCOPE - PRIVATE
13880 |
13881 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
13882 |
13883 | ARGUMENTS : IN:
13884 |
13885 | p_execution_mode - 'S'(Snapshot) / 'E'(Error Reprocessing) Mode.
13886 | p_dimension_varchar_label - Indicates the Dimension
13887 |
13888 | OUT:
13889 |
13890 | x_pre_process_status - Status of the Procedure.
13891 |
13892 | RETURNS : NONE
13893 |
13894 | NOTES
13895 |
13896 |
13897 | MODIFICATION HISTORY
13898 | Aturlapa 31-MAR-05 Created
13899 | sshanmug 10-May-05 Incorporated the comments from Nico.
13900 +===========================================================================*/
13901
13902 /* PROCEDURE Pre_Process (x_pre_process_status OUT NOCOPY VARCHAR2
13903 ,p_execution_mode IN VARCHAR2
13904 ,p_dimension_varchar_label IN VARCHAR2)
13905 IS
13906
13907 c_proc_name CONSTANT varchar2(20) := 'Pre_Process';
13908
13909 -- variable to get the status of AC/CO FF Definition.
13910 l_dim_active_flag VARCHAR2(1);
13911
13912 BEGIN
13913
13914 -- Initialize the return status
13915 x_pre_process_status := 'SUCCESS';
13916
13917 fem_engines_pkg.tech_message (
13918 p_severity => c_log_level_1
13919 ,p_module => c_block||'.'||c_proc_name||'.Begin'
13920 ,p_msg_text => 'Mode'||p_execution_mode
13921 ||'Dimension'||p_dimension_varchar_label);
13922
13923 --------------------------------------------------------------------------
13924 -- Check whether the AC/CO structure is defined or not
13925 -- Raise the Exception if the AC / CO Structure is not freezed.
13926 --------------------------------------------------------------------------
13927 BEGIN
13928
13929 SELECT dimension_active_flag
13930 INTO l_dim_active_flag
13931 FROM Fem_Xdim_Dimensions_VL
13932 WHERE dimension_varchar_label = p_dimension_varchar_label;
13933
13934 EXCEPTION
13935
13936 WHEN no_data_found THEN
13937 fem_engines_pkg.tech_message (
13938 p_severity => c_log_level_4
13939 ,p_module => c_block||'.'||c_proc_name||'.Freeze_Exception'
13940 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13941 'Code'||SQLCODE||'Err'||SQLERRM);
13942 END;
13943
13944 IF l_dim_active_flag = 'N' THEN
13945
13946 fem_engines_pkg.tech_message (
13947 p_severity => c_log_level_5
13948 ,p_module => c_block||'.'||c_proc_name
13949 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||' Flex Field
13950 Definition Not Freezed');
13951
13952 RAISE e_no_structure_defined;
13953 END IF;
13954
13955 ---------------------------------------------------------------------------
13956 --Clean up the MetaData Variable
13957 ---------------------------------------------------------------------------
13958
13959 t_metadata.DELETE;
13960
13961 ---------------------------------------------------------------------------
13962 --Initialize the TABLE TYPE Variable which holds the metadata information
13963 ---------------------------------------------------------------------------
13964 Metadata_Initialize(p_dimension_varchar_label);
13965
13966 fem_engines_pkg.tech_message (
13967 p_severity => c_log_level_1
13968 ,p_module => c_block||'.'||c_proc_name
13969 ,p_msg_text => 'After Metadata_Initialize');
13970
13971 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13972
13973 -------------------------------------------------------------------------
13974 --This loop runs for all the component Dimension members of
13975 --the Cost Object Dimension and populates their details into
13976 --'t_metadata' variable
13977 -------------------------------------------------------------------------
13978
13979 FOR c_metadata_cost IN (
13980 SELECT x.dimension_id
13981 ,x.dimension_varchar_label
13982 ,x.member_col
13983 ,x.member_display_code_col
13984 ,x.member_b_table_name
13985 ,x.value_set_required_flag
13986 FROM FEM_COLUMN_REQUIREMNT_VL c
13987 ,FEM_XDIM_DIMENSIONS_VL x
13988 WHERE c.dimension_id = x.dimension_id
13989 AND c.cost_obj_dim_component_flag = 'Y'
13990 ORDER BY 1 )
13991 LOOP
13992 FOR i IN 1 .. t_metadata.COUNT LOOP
13993 IF c_metadata_cost.member_display_code_col = t_component_dim_dc(i) THEN
13994 t_metadata(i).dimension_id := c_metadata_cost.dimension_id;
13995 t_metadata(i).dimension_varchar_label :=
13996 c_metadata_cost.dimension_varchar_label;
13997 t_metadata(i).member_col := c_metadata_cost.member_col;
13998 t_metadata(i).member_b_table_name :=
13999 c_metadata_cost.member_b_table_name;
14000 t_metadata(i).value_set_required_flag :=
14001 c_metadata_cost.value_set_required_flag;
14002 t_metadata(i).member_sql :=
14003 ' SELECT '||c_metadata_cost.member_col||
14004 ' FROM '||c_metadata_cost.member_b_table_name||
14005 ' WHERE enabled_flag = ''Y'''||
14006 ' AND '||c_metadata_cost.member_display_code_col||' = :b_dc_val';
14007
14008 IF (c_metadata_cost.value_set_required_flag = 'Y') THEN
14009 t_metadata(i).member_sql := t_metadata(i).member_sql||
14010 ' AND value_set_id = :b_value_set_id';
14011 END IF;
14012 END IF;
14013 END LOOP;
14014 END LOOP;
14015
14016 -------------------------------------------------------------------------
14017 -- Build Engine SQL --
14018 -------------------------------------------------------------------------
14019
14020 g_select_statement :=
14021 'SELECT rowid,'||
14022 ' GLOBAL_VS_COMBO_DISPLAY_CODE,'||
14023 ' financial_elem_display_code,'||
14024 ' ledger_display_code,'||
14025 ' product_display_code,'||
14026 ' CCTR_ORG_DISPLAY_CODE,'||
14027 ' customer_display_code,'||
14028 ' channel_display_code,'||
14029 ' project_display_code,'||
14030 ' user_dim1_display_code,'||
14031 ' user_dim2_display_code,'||
14032 ' user_dim3_display_code,'||
14033 ' user_dim4_display_code,'||
14034 ' user_dim5_display_code,'||
14035 ' user_dim6_display_code,'||
14036 ' user_dim7_display_code,'||
14037 ' user_dim8_display_code,'||
14038 ' user_dim9_display_code,'||
14039 ' user_dim10_display_code,'||
14040 ' status'||
14041 ' FROM FEM_COST_OBJECTS_T '||
14042 ' WHERE {{data_slice}} ';
14043
14044 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
14045
14046 -------------------------------------------------------------------------
14047 --Initialize the TABLE TYPE Variable which holds the metadata information
14048 -------------------------------------------------------------------------
14049
14050 Metadata_Initialize(p_dimension_varchar_label);
14051
14052 -------------------------------------------------------------------------
14053 --Thid loop runs for all the component Dimension members of
14054 --the Activity Dimension and populates their details into
14055 --'t_metadata' variable
14056 -------------------------------------------------------------------------
14057
14058 FOR c_metadata_activity IN (
14059 SELECT x.dimension_id
14060 ,x.dimension_varchar_label
14061 ,x.member_col
14062 ,x.member_display_code_col
14063 ,x.member_b_table_name
14064 ,x.value_set_required_flag
14065 FROM FEM_COLUMN_REQUIREMNT_VL c
14066 ,FEM_XDIM_DIMENSIONS_VL x
14067 WHERE c.dimension_id = x.dimension_id
14068 AND c.activity_dim_component_flag = 'Y'
14069 ORDER BY 1 )
14070 LOOP
14071 FOR i IN 1 .. t_metadata.COUNT LOOP
14072 IF c_metadata_activity.member_display_code_col
14073 = t_component_dim_dc(i) THEN
14074 t_metadata(i).dimension_id := c_metadata_activity.dimension_id;
14075 t_metadata(i).dimension_varchar_label :=
14076 c_metadata_activity.dimension_varchar_label;
14077 t_metadata(i).member_col := c_metadata_activity.member_col;
14078 t_metadata(i).member_b_table_name :=
14079 c_metadata_activity.member_b_table_name;
14080 t_metadata(i).value_set_required_flag :=
14081 c_metadata_activity.value_set_required_flag;
14082 t_metadata(i).member_sql :=
14083 ' SELECT '||c_metadata_activity.member_col||
14084 ' FROM '||c_metadata_activity.member_b_table_name||
14085 ' WHERE enabled_flag = ''Y'''||
14086 ' AND '||c_metadata_activity.member_display_code_col||' = :b_dc_val';
14087
14088 IF (c_metadata_activity.value_set_required_flag = 'Y') THEN
14089 t_metadata(i).member_sql := t_metadata(i).member_sql||
14090 ' AND value_set_id = :b_value_set_id';
14091 END IF;
14092 END IF;
14093 END LOOP;
14094 END LOOP;
14095
14096 -------------------------------------------------------------------------
14097 -- Build Engine SQL --
14098 -------------------------------------------------------------------------
14099
14100 g_select_statement :=
14101 'SELECT rowid,'||
14102 ' GLOBAL_VS_COMBO_DISPLAY_CODE,'||
14103 ' TASK_DISPLAY_CODE,'||
14104 ' CCTR_ORG_DISPLAY_CODE,'||
14105 ' customer_display_code,'||
14106 ' channel_display_code,'||
14107 ' product_display_code,'||
14108 ' project_display_code,'||
14109 ' user_dim1_display_code,'||
14110 ' user_dim2_display_code,'||
14111 ' user_dim3_display_code,'||
14112 ' user_dim4_display_code,'||
14113 ' user_dim5_display_code,'||
14114 ' user_dim6_display_code,'||
14115 ' user_dim7_display_code,'||
14116 ' user_dim8_display_code,'||
14117 ' user_dim9_display_code,'||
14118 ' user_dim10_display_code,'||
14119 ' status'||
14120 ' FROM FEM_ACTIVITIES_T '||
14121 ' WHERE {{data_slice}} ';
14122 END IF;
14123
14124
14125
14126 fem_engines_pkg.tech_message (
14127 p_severity => c_log_level_1
14128 ,p_module => c_block||'.'||c_proc_name||'.End'
14129 ,p_msg_text => 'Mode'||p_execution_mode
14130 ||'Dimension'||p_dimension_varchar_label);
14131
14132 EXCEPTION
14133
14134 WHEN e_no_structure_defined THEN
14135
14136 fem_engines_pkg.tech_message (
14137 p_severity => c_log_level_4
14138 ,p_module => c_block||'.'||c_proc_name||'.Exception'
14139 ,p_app_name => c_fem
14140 ,p_msg_name => G_NO_STRUCTURE_DEFINED
14141 ,P_TOKEN1 => 'OPERATION'
14142 ,P_VALUE1 => p_dimension_varchar_label);
14143
14144 x_pre_process_status := 'ERROR';
14145
14146 WHEN others THEN
14147
14148 fem_engines_pkg.tech_message (
14149 p_severity => c_log_level_4
14150 ,p_module => c_block||'.'||c_proc_name||'.Exception'
14151 ,p_msg_text => 'Mode'||p_execution_mode||
14152 'Dimension'||p_dimension_varchar_label||
14153 'Code'||SQLCODE||'Err'||SQLERRM);
14154
14155 x_pre_process_status := 'ERROR';
14156
14157 END Pre_Process;
14158
14159 /*===========================================================================+
14160 | PROCEDURE
14161 | process_rows
14162 |
14163 | DESCRIPTION
14164 |
14165 | This procedure is used to process all the rows in the interface
14166 | table of composite dimensions (FEM_ACTIVITIES_T/FEM_COST_OBJECTS_T) and
14167 | performs various validations on these records,concatenate the component
14168 | dimension members and inserts only the valid records into the member table
14169 | of Composite Dimensions.The invalid records will be processed in
14170 | 'Error Reproceesing' Mode.
14171 |
14172 | SCOPE - PRIVATE
14173 |
14174 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
14175 |
14176 | ARGUMENTS :
14177 |
14178 | RETURNS : NONE
14179 |
14180 | NOTES
14181 |
14182 |
14183 | MODIFICATION HISTORY
14184 | Aturlapa 31-MAR-05 Created
14185 | sshanmug 17-MAY-05 Incorporated comments from Nico
14186 |
14187 +===========================================================================*/
14188
14189 /* procedure Process_Rows (x_status OUT NOCOPY NUMBER
14190 ,x_message OUT NOCOPY VARCHAR2
14191 ,x_rows_processed OUT NOCOPY NUMBER
14192 ,x_rows_loaded OUT NOCOPY NUMBER
14193 ,x_rows_rejected OUT NOCOPY NUMBER
14194 ,p_eng_sql IN VARCHAR2
14195 ,p_data_slc IN VARCHAR2
14196 ,p_proc_num IN VARCHAR2
14197 ,p_slice_id IN VARCHAR2
14198 ,p_fetch_limit IN NUMBER
14199 ,p_load_type IN VARCHAR2
14200 ,p_dimension_varchar_label IN VARCHAR2
14201 ,p_execution_mode IN VARCHAR2
14202 ,p_structure_id IN NUMBER)
14203 IS
14204
14205 c_proc_name CONSTANT varchar2(20) := 'Process_Rows';
14206
14207 lv_status VARCHAR2(200);
14208
14209 v_fetch_limit NUMBER;
14210 v_rows_processed NUMBER;
14211 v_rows_rejected NUMBER;
14212 v_rows_loaded NUMBER;
14213
14214 v_cost_object_dc FEM_COST_OBJECTS.cost_object_display_code%TYPE;
14215 v_activity_dc FEM_ACTIVITIES.activity_display_code%TYPE;
14216
14217 -- Follwoing 3 params are needed for FEM_DIM_UTILS_PVT.Check_Unique_Member
14218
14219 v_return_status VARCHAR2(20);
14220 v_msg_count NUMBER;
14221 v_msg_data VARCHAR2(200);
14222
14223 v_cost_structure_id NUMBER;
14224 v_activity_structure_id NUMBER;
14225
14226 v_select_stmt LONG;
14227 v_data_slc VARCHAR2(4000);
14228
14229 v_update_stmt VARCHAR2(4000);
14230 v_delete_stmt VARCHAR2(4000);
14231 v_member_table_name VARCHAR2(200);
14232
14233 v_CREATED_BY NUMBER := fnd_global.user_id;
14234 v_LAST_UPDATED_BY NUMBER := fnd_global.user_id;
14235 v_LAST_UPDATE_LOGIN NUMBER := fnd_global.login_id;
14236
14237 v_last_row NUMBER;
14238 v_mbr_last_row NUMBER;
14239
14240 x_pre_process_status VARCHAR2(30);
14241
14242 l_count NUMBER;-- var to keep track of inavlid values for each validation
14243
14244 ------------------------------------------
14245 -- DML Statements used in the procedure --
14246 -------------------------------------------
14247
14248 v_insert_cost_stmt CONSTANT LONG :=
14249 'INSERT INTO FEM_COST_OBJECTS ('||
14250 ' COST_OBJECT_ID, '||
14251 ' COST_OBJECT_DISPLAY_CODE, '||
14252 ' SUMMARY_FLAG, '||
14253 ' START_DATE_ACTIVE, '||
14254 ' END_DATE_ACTIVE, '||
14255 ' COST_OBJECT_STRUCTURE_ID, '||
14256 ' LOCAL_VS_COMBO_ID, '||
14257 ' UOM_CODE, '||
14258 ' FINANCIAL_ELEM_ID, '||
14259 ' LEDGER_ID, '||
14260 ' PRODUCT_ID, '||
14261 ' COMPANY_COST_CENTER_ORG_ID, '||
14262 ' CUSTOMER_ID, '||
14263 ' CHANNEL_ID, '||
14264 ' PROJECT_ID, '||
14265 ' USER_DIM1_ID, '||
14266 ' USER_DIM2_ID, '||
14267 ' USER_DIM3_ID, '||
14268 ' USER_DIM4_ID, '||
14269 ' USER_DIM5_ID, '||
14270 ' USER_DIM6_ID, '||
14271 ' USER_DIM7_ID, '||
14272 ' USER_DIM8_ID, '||
14273 ' USER_DIM9_ID, '||
14274 ' USER_DIM10_ID, '||
14275 ' SEGMENT1, '||
14276 ' SEGMENT2, '||
14277 ' SEGMENT3, '||
14278 ' SEGMENT4, '||
14279 ' SEGMENT5, '||
14280 ' SEGMENT6, '||
14281 ' SEGMENT7, '||
14282 ' SEGMENT8, '||
14283 ' SEGMENT9, '||
14284 ' SEGMENT10, '||
14285 ' SEGMENT11, '||
14286 ' SEGMENT12, '||
14287 ' SEGMENT13, '||
14288 ' SEGMENT14, '||
14289 ' SEGMENT15, '||
14290 ' SEGMENT16, '||
14291 ' SEGMENT17, '||
14292 ' SEGMENT18, '||
14293 ' SEGMENT19, '||
14294 ' SEGMENT20, '||
14295 ' SEGMENT21, '||
14296 ' SEGMENT22, '||
14297 ' SEGMENT23, '||
14298 ' SEGMENT24, '||
14299 ' SEGMENT25, '||
14300 ' SEGMENT26, '||
14301 ' SEGMENT27, '||
14302 ' SEGMENT28, '||
14303 ' SEGMENT29, '||
14304 ' SEGMENT30, '||
14305 ' CREATION_DATE, '||
14306 ' CREATED_BY, '||
14307 ' LAST_UPDATED_BY, '||
14308 ' LAST_UPDATE_DATE, '||
14309 ' LAST_UPDATE_LOGIN, '||
14310 ' OBJECT_VERSION_NUMBER, '||
14311 ' ENABLED_FLAG, '||
14312 ' PERSONAL_FLAG, '||
14313 ' READ_ONLY_FLAG )'||
14314 ' SELECT fem_cost_objects_s.nextval,'||
14315 ' :b_COST_OBJECT_DISPLAY_CODE, '||
14316 ' :b_SUMMARY_FLAG, '||
14317 ' :b_START_DATE_ACTIVE, '||
14318 ' :b_END_DATE_ACTIVE, '||
14319 ' :b_COST_OBJECT_STRUCTURE_ID, '||
14320 ' :b_LOCAL_VS_COMBO_ID, '||
14321 ' :b_UOM_CODE, '||
14322 ' :b_FINANCIAL_ELEM_ID, '||
14323 ' :b_LEDGER_ID, '||
14324 ' :b_PRODUCT_ID, '||
14325 ' :b_COMPANY_COST_CENTER_ORG_ID, '||
14326 ' :b_CUSTOMER_ID, '||
14327 ' :b_CHANNEL_ID, '||
14328 ' :b_PROJECT_ID, '||
14329 ' :b_USER_DIM1_ID, '||
14330 ' :b_USER_DIM2_ID, '||
14331 ' :b_USER_DIM3_ID, '||
14332 ' :b_USER_DIM4_ID, '||
14333 ' :b_USER_DIM5_ID, '||
14334 ' :b_USER_DIM6_ID, '||
14335 ' :b_USER_DIM7_ID, '||
14336 ' :b_USER_DIM8_ID, '||
14337 ' :b_USER_DIM9_ID, '||
14338 ' :b_USER_DIM10_ID, '||
14339 ' :b_SEGMENT1, '||
14340 ' :b_SEGMENT2, '||
14341 ' :b_SEGMENT3, '||
14342 ' :b_SEGMENT4, '||
14343 ' :b_SEGMENT5, '||
14344 ' :b_SEGMENT6, '||
14345 ' :b_SEGMENT7, '||
14346 ' :b_SEGMENT8, '||
14347 ' :b_SEGMENT9, '||
14348 ' :b_SEGMENT10, '||
14349 ' :b_SEGMENT11, '||
14350 ' :b_SEGMENT12, '||
14351 ' :b_SEGMENT13, '||
14352 ' :b_SEGMENT14, '||
14353 ' :b_SEGMENT15, '||
14354 ' :b_SEGMENT16, '||
14355 ' :b_SEGMENT17, '||
14356 ' :b_SEGMENT18, '||
14357 ' :b_SEGMENT19, '||
14358 ' :b_SEGMENT20, '||
14359 ' :b_SEGMENT21, '||
14360 ' :b_SEGMENT22, '||
14361 ' :b_SEGMENT23, '||
14362 ' :b_SEGMENT24, '||
14363 ' :b_SEGMENT25, '||
14364 ' :b_SEGMENT26, '||
14365 ' :b_SEGMENT27, '||
14366 ' :b_SEGMENT28, '||
14367 ' :b_SEGMENT29, '||
14368 ' :b_SEGMENT30, '||
14369 ' :b_CREATION_DATE, '||
14370 ' :b_CREATED_BY, '||
14371 ' :b_LAST_UPDATED_BY, '||
14372 ' :b_LAST_UPDATE_DATE, '||
14373 ' :b_LAST_UPDATE_LOGIN, '||
14374 ' :b_OBJECT_VERSION_NUMBER, '||
14375 ' :b_ENABLED_FLAG, '||
14376 ' :b_PERSONAL_FLAG, '||
14377 ' :b_read_only_flag '||
14378 ' FROM dual'||
14379 ' WHERE :b_status = ''LOAD''';
14380
14381 v_insert_activity_stmt CONSTANT LONG :=
14382 'INSERT INTO FEM_ACTIVITIES ('||
14383 ' ACTIVITY_ID, '||
14384 ' ACTIVITY_DISPLAY_CODE, '||
14385 ' SUMMARY_FLAG, '||
14386 ' START_DATE_ACTIVE, '||
14387 ' END_DATE_ACTIVE, '||
14388 ' ACTIVITY_STRUCTURE_ID, '||
14389 ' LOCAL_VS_COMBO_ID, '||
14390 ' TASK_ID, '||
14391 ' COMPANY_COST_CENTER_ORG_ID, '||
14392 ' CUSTOMER_ID, '||
14393 ' CHANNEL_ID, '||
14394 ' PRODUCT_ID, '||
14395 ' PROJECT_ID, '||
14396 ' USER_DIM1_ID, '||
14397 ' USER_DIM2_ID, '||
14398 ' USER_DIM3_ID, '||
14399 ' USER_DIM4_ID, '||
14400 ' USER_DIM5_ID, '||
14401 ' USER_DIM6_ID, '||
14402 ' USER_DIM7_ID, '||
14403 ' USER_DIM8_ID, '||
14404 ' USER_DIM9_ID, '||
14405 ' USER_DIM10_ID, '||
14406 ' SEGMENT1, '||
14407 ' SEGMENT2, '||
14408 ' SEGMENT3, '||
14409 ' SEGMENT4, '||
14410 ' SEGMENT5, '||
14411 ' SEGMENT6, '||
14412 ' SEGMENT7, '||
14413 ' SEGMENT8, '||
14414 ' SEGMENT9, '||
14415 ' SEGMENT10, '||
14416 ' SEGMENT11, '||
14417 ' SEGMENT12, '||
14418 ' SEGMENT13, '||
14419 ' SEGMENT14, '||
14420 ' SEGMENT15, '||
14421 ' SEGMENT16, '||
14422 ' SEGMENT17, '||
14423 ' SEGMENT18, '||
14424 ' SEGMENT19, '||
14425 ' SEGMENT20, '||
14426 ' SEGMENT21, '||
14427 ' SEGMENT22, '||
14428 ' SEGMENT23, '||
14429 ' SEGMENT24, '||
14430 ' SEGMENT25, '||
14431 ' SEGMENT26, '||
14432 ' SEGMENT27, '||
14433 ' SEGMENT28, '||
14434 ' SEGMENT29, '||
14435 ' SEGMENT30, '||
14436 ' CREATION_DATE, '||
14437 ' CREATED_BY, '||
14438 ' LAST_UPDATED_BY, '||
14439 ' LAST_UPDATE_DATE, '||
14440 ' LAST_UPDATE_LOGIN, '||
14441 ' OBJECT_VERSION_NUMBER, '||
14442 ' ENABLED_FLAG, '||
14443 ' PERSONAL_FLAG, '||
14444 ' READ_ONLY_FLAG )'||
14445 ' SELECT fem_activities_s.nextval,'||
14446 ' :b_ACTIVITY_DISPLAY_CODE, '||
14447 ' :b_SUMMARY_FLAG, '||
14448 ' :b_START_DATE_ACTIVE, '||
14449 ' :b_END_DATE_ACTIVE, '||
14450 ' :b_ACTIVITY_STRUCTURE_ID, '||
14451 ' :b_LOCAL_VS_COMBO_ID, '||
14452 ' :b_TASK_ID, '||
14453 ' :b_COMPANY_COST_CENTER_ORG_ID, '||
14454 ' :b_CUSTOMER_ID, '||
14455 ' :b_CHANNEL_ID, '||
14456 ' :b_PRODUCT_ID, '||
14457 ' :b_PROJECT_ID, '||
14458 ' :b_USER_DIM1_ID, '||
14459 ' :b_USER_DIM2_ID, '||
14460 ' :b_USER_DIM3_ID, '||
14461 ' :b_USER_DIM4_ID, '||
14462 ' :b_USER_DIM5_ID, '||
14463 ' :b_USER_DIM6_ID, '||
14464 ' :b_USER_DIM7_ID, '||
14465 ' :b_USER_DIM8_ID, '||
14466 ' :b_USER_DIM9_ID, '||
14467 ' :b_USER_DIM10_ID, '||
14468 ' :b_SEGMENT1, '||
14469 ' :b_SEGMENT2, '||
14470 ' :b_SEGMENT3, '||
14471 ' :b_SEGMENT4, '||
14472 ' :b_SEGMENT5, '||
14473 ' :b_SEGMENT6, '||
14474 ' :b_SEGMENT7, '||
14475 ' :b_SEGMENT8, '||
14476 ' :b_SEGMENT9, '||
14477 ' :b_SEGMENT10, '||
14478 ' :b_SEGMENT11, '||
14479 ' :b_SEGMENT12, '||
14480 ' :b_SEGMENT13, '||
14481 ' :b_SEGMENT14, '||
14482 ' :b_SEGMENT15, '||
14483 ' :b_SEGMENT16, '||
14484 ' :b_SEGMENT17, '||
14485 ' :b_SEGMENT18, '||
14486 ' :b_SEGMENT19, '||
14487 ' :b_SEGMENT20, '||
14488 ' :b_SEGMENT21, '||
14489 ' :b_SEGMENT22, '||
14490 ' :b_SEGMENT23, '||
14491 ' :b_SEGMENT24, '||
14492 ' :b_SEGMENT25, '||
14493 ' :b_SEGMENT26, '||
14494 ' :b_SEGMENT27, '||
14495 ' :b_SEGMENT28, '||
14496 ' :b_SEGMENT29, '||
14497 ' :b_SEGMENT30, '||
14498 ' :b_CREATION_DATE, '||
14499 ' :b_CREATED_BY, '||
14500 ' :b_LAST_UPDATED_BY, '||
14501 ' :b_LAST_UPDATE_DATE, '||
14502 ' :b_LAST_UPDATE_LOGIN, '||
14503 ' :b_OBJECT_VERSION_NUMBER, '||
14504 ' :b_ENABLED_FLAG, '||
14505 ' :b_PERSONAL_FLAG, '||
14506 ' :b_read_only_flag '||
14507 ' FROM dual'||
14508 ' WHERE :b_status = ''LOAD''';
14509
14510 v_update_cost_stmt CONSTANT VARCHAR2(4000) :=
14511 'UPDATE FEM_COST_OBJECTS_T '||
14512 ' SET status = :b_status'||
14513 ' WHERE rowid = :b_rowid';
14514
14515 v_update_activity_stmt CONSTANT VARCHAR2(4000) :=
14516 'UPDATE FEM_ACTIVITIES_T '||
14517 ' SET status = :b_status'||
14518 ' WHERE rowid = :b_rowid';
14519
14520 v_delete_cost_stmt CONSTANT VARCHAR2(4000) :=
14521 'DELETE FROM FEM_COST_OBJECTS_T '||
14522 ' WHERE rowid = :b_rowid'||
14523 ' AND :b_status = ''LOAD''';
14524
14525 v_delete_activity_stmt CONSTANT VARCHAR2(4000) :=
14526 'DELETE FROM FEM_ACTIVITIES_T '||
14527 ' WHERE rowid = :b_rowid'||
14528 ' AND :b_status = ''LOAD''';
14529
14530 -------------------------------------
14531 -- Declare bulk collection columns --
14532 -------------------------------------
14533
14534 TYPE rowid_type IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
14535 t_rowid rowid_type;
14536
14537 TYPE number_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
14538 t_global_vs_combo_id number_type;
14539 t_fin_elem_id number_type;
14540 t_ledger_id number_type;
14541 t_cctr_org_id number_type;
14542 t_product_id number_type;
14543 t_channel_id number_type;
14544 t_project_id number_type;
14545 t_customer_id number_type;
14546 t_task_id number_type;
14547 t_user_dim1_id number_type;
14548 t_user_dim2_id number_type;
14549 t_user_dim3_id number_type;
14550 t_user_dim4_id number_type;
14551 t_user_dim5_id number_type;
14552 t_user_dim6_id number_type;
14553 t_user_dim7_id number_type;
14554 t_user_dim8_id number_type;
14555 t_user_dim9_id number_type;
14556 t_user_dim10_id number_type;
14557
14558 ----------------------------------------
14559 -- Ref cursors used in this Procedure --
14560 ----------------------------------------
14561
14562 TYPE cv_curs IS REF CURSOR;
14563 cv_get_rows cv_curs;
14564 cv_get_invalid_fin_elems cv_curs;
14565 cv_get_invalid_ledgers cv_curs;
14566 cv_get_invalid_gvscs cv_curs;
14567 cv_get_invalid_comp_dims cv_curs;
14568
14569
14570 BEGIN
14571
14572 fem_engines_pkg.tech_message(
14573 p_severity => c_log_level_2
14574 ,p_module => c_block||'.'||c_proc_name||'.Begin'
14575 ,p_msg_text => 'Execution Mode' || p_execution_mode||
14576 'Dimension' || p_dimension_varchar_label);
14577
14578
14579 --------------------------------------------------------------------------
14580 -- Initialize all OUT params
14581 --------------------------------------------------------------------------
14582 x_status := 0;
14583 x_message := 'COMPLETE:NORMAL';
14584 --Need to initialize X_rows_processed,X_rows_loaded and x_rows_rejected
14585
14586 --------------------------------------------------------------------------
14587 -- This procedure gets the flexfield info of the Composite Dimension
14588 -- and populates the TABLE Type variable
14589 --------------------------------------------------------------------------
14590
14591 pre_process (x_pre_process_status
14592 ,p_execution_mode
14593 ,p_dimension_varchar_label);
14594
14595
14596
14597 fem_engines_pkg.tech_message(
14598 p_severity => c_log_level_5
14599 ,p_module => c_block||'.'||c_proc_name||'.After Pre_Process'
14600 ,p_msg_text => 'Pre_Process Error '||x_pre_process_status);
14601
14602
14603 --------------------------------------------------------------------------
14604 -- Check for the error message from procedure pre-process
14605 --------------------------------------------------------------------------
14606
14607
14608 IF x_pre_process_status = 'ERROR' THEN
14609
14610 fem_engines_pkg.tech_message (
14611 p_severity => c_log_level_4
14612 ,p_module => c_block||'.'||c_proc_name||'Pre_Process Error'
14613 ,p_msg_text => 'Code'||SQLCODE||'Err'||SQLERRM);
14614
14615 RAISE e_terminate;
14616
14617 END IF;
14618
14619 -----------------------------------------------------------------------------
14620 --Initialize MultiProcessing variables
14621 -----------------------------------------------------------------------------
14622
14623 v_data_slc := p_data_slc;
14624
14625 IF v_data_slc IS NULL THEN
14626 v_data_slc := '1=1';
14627 END IF;
14628
14629 IF (p_fetch_limit IS NOT NULL) THEN
14630 v_fetch_limit := p_fetch_limit;
14631 ELSE
14632 v_fetch_limit := c_fetch_limit;
14633 END IF;
14634
14635 -----------------------------------------------------------------------------
14636 -- Add data slice to select statement
14637 -----------------------------------------------------------------------------
14638
14639 v_select_stmt := REPLACE(p_eng_sql,'{{data_slice}}',v_data_slc);
14640 -- v_select_stmt := REPLACE(g_select_statement,'{{data_slice}}',v_data_slc);
14641
14642 -----------------------------------------------------------------------------
14643 --Assign the update/delete statement according to the dimension
14644 -----------------------------------------------------------------------------
14645
14646
14647 IF (p_dimension_varchar_label = 'COST_OBJECT') THEN
14648 v_update_stmt := v_update_cost_stmt;
14649 v_delete_stmt := v_delete_cost_stmt;
14650 v_member_table_name := 'fem_cost_objects_t';
14651
14652 ELSIF (p_dimension_varchar_label = 'ACTIVITY') THEN
14653 v_update_stmt := v_update_activity_stmt;
14654 v_delete_stmt := v_delete_activity_stmt;
14655 v_member_table_name := 'fem_activities_t';
14656
14657 END IF;
14658
14659
14660 fem_engines_pkg.tech_message (
14661 p_severity => c_log_level_1
14662 ,p_module => c_block||'.'||c_proc_name
14663 ,p_msg_text => 'v_update_stmt '||v_update_stmt||
14664 'v_member_table_name'||v_member_table_name);
14665
14666
14667 fem_engines_pkg.tech_message (
14668 p_severity => c_log_level_1
14669 ,p_module => c_block||'.'||c_proc_name
14670 ,p_msg_text => 'v_delete_stmt '||v_delete_stmt||
14671 'v_member_table_name'||v_member_table_name);
14672
14673 -----------------------------------------------------------------------------
14674 -- In Error Reprocessing mode, update status to LOAD
14675 -----------------------------------------------------------------------------
14676
14677 IF (p_execution_mode = 'E') THEN
14678 EXECUTE IMMEDIATE
14679 ' UPDATE '||v_member_table_name||' b'||
14680 ' SET status = ''LOAD'''||
14681 ' WHERE status <> ''LOAD'''||
14682 ' AND '||v_data_slc;
14683
14684 fem_engines_pkg.tech_message (
14685 p_severity => c_log_level_1
14686 ,p_module => c_block||'.'||c_proc_name||'.Error Reproceesing Mode'
14687 ,p_msg_text => 'v_data_slc '||v_data_slc||
14688 'v_member_table_name'||v_member_table_name);
14689 END IF;
14690
14691
14692 /*------------------------------------------------------------------------------
14693 VALIDATION#1
14694
14695 This validation checks whether the values in GLOBAL_VS_COMBO_DISPLAY_CODE
14696 column of interface table is valid.
14697 -------------------------------------------------------------------------------*/
14698
14699 /* l_count :=0 ;
14700
14701 OPEN cv_get_invalid_gvscs FOR
14702 ' SELECT a.rowid '||
14703 ' FROM '||v_member_table_name||' a'||
14704 ' WHERE not exists '||
14705 ' (SELECT 1 FROM fem_global_vs_combos_b b '||
14706 ' WHERE a.global_vs_combo_display_code= b.global_vs_combo_display_code)'||
14707 ' AND a.status = ''LOAD'''||
14708 ' AND '||v_data_slc;
14709
14710 LOOP
14711 EXIT WHEN cv_get_invalid_gvscs%NOTFOUND;
14712 FETCH cv_get_invalid_gvscs BULK COLLECT
14713 INTO t_rowid
14714 LIMIT v_fetch_limit;
14715
14716 -- local var which holds the no : of invalid values
14717
14718 l_count := l_count + t_rowid.COUNT;
14719
14720 --Get the count of no : of records this fetch
14721 v_last_row := t_rowid.COUNT;
14722
14723 IF (v_last_row IS NOT NULL) THEN
14724 lv_status := 'INVALID_GVSC';
14725
14726 FORALL i IN 1..v_last_row
14727 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14728 t_rowid.DELETE;
14729 COMMIT;
14730
14731 END IF; -- v_last_row
14732
14733 END LOOP;
14734
14735 fem_engines_pkg.tech_message (
14736 p_severity => c_log_level_1
14737 ,p_module => c_block||'.'||c_proc_name||'.Validation#1'
14738 ,p_msg_text => 'v_data_slc '||v_data_slc||
14739 'v_member_table_name'||v_member_table_name||
14740 'No:of Invalid Records'|| l_count);
14741
14742
14743 CLOSE cv_get_invalid_gvscs;
14744
14745 /*------------------------------------------------------------------------------
14746 VALIDATION#2:
14747
14748 ***This is only for Cost Object Dimension ***
14749
14750 1. The members of the Financial Element should have the value of
14751 COST_OBJECT_UNIT_FLAG attribute as 'Y' and 'DATA_TYPE_CODE' attribute
14752 as 'RATE"
14753
14754 2.The Members of Ledger Dimension and Global_VS_Combo Column should be in sync.
14755 -------------------------------------------------------------------------------*/
14756
14757 /* IF p_dimension_varchar_label = 'COST_OBJECT' THEN
14758
14759 FOR c_attr IN (
14760 SELECT a.attribute_id
14761 ,v.version_id
14762 ,a.attribute_varchar_label
14763 ,a.dimension_id
14764 FROM fem_dim_attributes_vl a
14765 ,fem_dim_attr_versions_vl v
14766 WHERE a.attribute_id = v.attribute_id
14767 AND v.default_version_flag = 'Y'
14768 AND (
14769 (a.attribute_varchar_label IN ('COST_OBJECT_UNIT_FLAG','DATA_TYPE_CODE')
14770 AND a.dimension_id = 12) -- Financial Element
14771 OR
14772 (a.attribute_varchar_label IN ('GLOBAL_VS_COMBO')
14773 AND a.dimension_id = 7) -- Ledger
14774 )
14775 AND v.default_version_flag = 'Y' )
14776 LOOP
14777 IF c_attr.dimension_id = 12 THEN -- Financial Element
14778
14779 IF c_attr.attribute_varchar_label = 'COST_OBJECT_UNIT_FLAG' THEN
14780
14781 l_count :=0 ;
14782
14783 OPEN cv_get_invalid_fin_elems FOR
14784 ' SELECT b.rowid'||
14785 ' FROM fem_cost_objects_t b'||
14786 ' ,fem_fin_elems_attr a'||
14787 ' ,fem_fin_elems_vl m'||
14788 ' WHERE a.financial_elem_id = m.financial_elem_id'||
14789 ' AND m.financial_elem_display_code = b.financial_elem_display_code'||
14790 ' AND a.attribute_id = '||c_attr.attribute_id||
14791 ' AND a.version_id = '||c_attr.version_id||
14792 ' AND a.dim_attribute_varchar_member <> ''Y'''||
14793 ' AND b.status = ''LOAD'''||
14794 ' AND '||v_data_slc;
14795 LOOP
14796
14797 EXIT WHEN cv_get_invalid_fin_elems%NOTFOUND;
14798 FETCH cv_get_invalid_fin_elems BULK COLLECT
14799 INTO t_rowid
14800 LIMIT v_fetch_limit;
14801
14802 -- local var which holds the no : of invalid values
14803
14804 l_count := l_count + t_rowid.COUNT;
14805
14806 v_last_row := t_rowid.COUNT;
14807
14808 IF (v_last_row IS NOT NULL) THEN
14809 lv_status := 'INVALID_FIN_ELEMS_NOT_COUC_FLAG';
14810 FORALL i IN 1..v_last_row
14811 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14812 END IF; -- v_last_row
14813
14814 END LOOP;
14815
14816 CLOSE cv_get_invalid_fin_elems;
14817
14818 fem_engines_pkg.tech_message (
14819 p_severity => c_log_level_1
14820 ,p_module => c_block||'.'||c_proc_name||'.Validation#2.1'
14821 ,p_msg_text => 'v_data_slc '||v_data_slc||
14822 'v_member_table_name'||v_member_table_name||
14823 'No:of Invalid Records'|| l_count);
14824
14825 ELSE -- DATA_TYPE_CODE = 'RATE'
14826
14827 l_count :=0 ;
14828
14829 OPEN cv_get_invalid_fin_elems FOR
14830 ' SELECT b.rowid'||
14831 ' FROM fem_cost_objects_t b'||
14832 ' ,fem_fin_elems_attr a'||
14833 ' ,fem_fin_elems_vl m'||
14834 ' WHERE a.financial_elem_id = m.financial_elem_id'||
14835 ' AND m.financial_elem_display_code = b.financial_elem_display_code'||
14836 ' AND a.attribute_id = '||c_attr.attribute_id||
14837 ' AND a.version_id = '||c_attr.version_id||
14838 ' AND a.dim_attribute_varchar_member <> ''RATE'''||
14839 ' AND b.status = ''LOAD'''||
14840 ' AND '||v_data_slc;
14841
14842 LOOP
14843
14844 EXIT WHEN cv_get_invalid_fin_elems%NOTFOUND;
14845 FETCH cv_get_invalid_fin_elems BULK COLLECT
14846 INTO t_rowid
14847 LIMIT v_fetch_limit;
14848
14849 -- local var which holds the no : of invalid values
14850
14851 l_count := l_count + t_rowid.COUNT;
14852
14853 v_last_row := t_rowid.COUNT;
14854 IF (v_last_row IS NOT NULL) THEN
14855 lv_status := 'INVALID_FIN_ELEMS_NOT_RATE_DATA_TYPE';
14856 FORALL i IN 1..v_last_row
14857 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14858 END IF; -- v_last_row
14859
14860 END LOOP;
14861
14862 CLOSE cv_get_invalid_fin_elems;
14863
14864 fem_engines_pkg.tech_message (
14865 p_severity => c_log_level_1
14866 ,p_module => c_block||'.'||c_proc_name||'.Validation#2.2'
14867 ,p_msg_text => 'v_data_slc '||v_data_slc||
14868 'v_member_table_name'||v_member_table_name||
14869 'No:of Invalid Records'|| l_count);
14870
14871 END IF; -- attribute_varchar_label = 'COST_OBJECT_UNIT_FLAG'
14872
14873 ELSE --- if the dimension_id = 7(ledger)
14874
14875 l_count :=0 ;
14876
14877 OPEN cv_get_invalid_ledgers FOR
14878 ' SELECT b.rowid'||
14879 ' FROM fem_cost_objects_t b'||
14880 ' WHERE NOT EXISTS ('||
14881 ' SELECT 1'||
14882 ' FROM fem_ledgers_b l'||
14883 ' ,fem_ledgers_attr a'||
14884 ' ,fem_global_vs_combos_b g'||
14885 ' WHERE l.ledger_display_code = b.ledger_display_code'||
14886 ' AND a.ledger_id = l.ledger_id'||
14887 ' AND a.attribute_id = '||c_attr.attribute_id||
14888 ' AND a.version_id = '||c_attr.version_id||
14889 ' AND a.dim_attribute_numeric_member = g.global_vs_combo_id'||
14890 ' AND g.global_vs_combo_display_code = b.global_vs_combo_display_code'||
14891 ' )'||
14892 ' AND status = ''LOAD'''||
14893 ' AND '||v_data_slc;
14894 LOOP
14895
14896 EXIT WHEN cv_get_invalid_ledgers%NOTFOUND;
14897 FETCH cv_get_invalid_ledgers BULK COLLECT
14898 INTO t_rowid
14899 LIMIT v_fetch_limit;
14900
14901 -- local var which holds the no : of invalid values
14902
14903 l_count := l_count + t_rowid.COUNT;
14904
14905 v_last_row := t_rowid.COUNT;
14906
14907 IF (v_last_row IS NOT NULL) THEN
14908 lv_status := 'INVALID_LEDGER_FOR_GVSC';
14909 FORALL i IN 1..v_last_row
14910 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14911 END IF; -- v_last_row
14912
14913 END LOOP;
14914
14915 CLOSE cv_get_invalid_ledgers;
14916
14917 fem_engines_pkg.tech_message (
14918 p_severity => c_log_level_1
14919 ,p_module=> c_block||'.'||c_proc_name||'.Validation#2.3'
14920 ,p_msg_text => 'v_data_slc '||v_data_slc||
14921 'v_member_table_name'||v_member_table_name||
14922 'No:of Invalid Records'|| l_count);
14923
14924 END IF; -- dimension_id = 7(ledger)
14925
14926 t_rowid.DELETE;
14927
14928 END LOOP; -- c_attr
14929
14930 END IF; --- p_dimension_varchar_label = 'COST_OBJECT'
14931
14932 COMMIT;
14933 /*------------------------------------------------------------------------------
14934 VALIDATION#3:
14935
14936 --This validation ensures that the strucutre of the composite
14937 --dimension flex field is in synch with the records of the interface table.
14938 --(ie) Those component dimensions defined as a part of FlexField should only
14939 --have the 'DISPLAY_CODE' values in the interface table.Other component
14940 --dimension's display code values should be null.Moreover the display code of
14941 --component dimension which is a part of Flex Field Definition should not be
14942 -- null(Inverse of the above scenario).
14943
14944 ------------------------------------------------------------------------------*/
14945
14946 /* l_count := 0;
14947
14948 FOR i IN 1..t_metadata.COUNT LOOP -- Loop within the component dimensions
14949
14950 IF (t_metadata(i).dimension_id <> -999) THEN
14951
14952 OPEN cv_get_invalid_comp_dims FOR
14953 ' SELECT b.rowid '||
14954 ' FROM '||v_member_table_name||' b'||
14955 ' WHERE '||t_metadata(i).member_display_code_col||' is null'||
14956 ' AND status = ''LOAD'''||
14957 ' AND '||v_data_slc;
14958
14959 ELSE
14960
14961 OPEN cv_get_invalid_comp_dims FOR
14962 ' SELECT b.rowid '||
14963 ' FROM '||v_member_table_name||' b'||
14964 ' WHERE '||t_metadata(i).member_display_code_col||' is not null'||
14965 ' AND status = ''LOAD'''||
14966 ' AND '||v_data_slc;
14967
14968 END IF;
14969
14970 LOOP
14971 EXIT WHEN cv_get_invalid_comp_dims%NOTFOUND;
14972 FETCH cv_get_invalid_comp_dims BULK COLLECT
14973 INTO t_rowid
14974 LIMIT v_fetch_limit;
14975
14976 -- local var which holds the no : of invalid values
14977
14978 l_count := l_count + t_rowid.COUNT;
14979
14980 v_last_row := t_rowid.COUNT;
14981
14982 IF (v_last_row IS NOT NULL) THEN
14983
14984 lv_status := 'INVALID_STR_'||t_metadata(i).member_display_code_col;
14985
14986 FORALL i IN 1..v_last_row
14987 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14988 t_rowid.DELETE;
14989
14990 END IF; -- v_last_row
14991
14992 END LOOP; -- cursor
14993
14994 CLOSE cv_get_invalid_comp_dims;
14995
14996 -- END IF;
14997
14998 END LOOP; -- FOR LOOP
14999
15000 COMMIT;
15001
15002 fem_engines_pkg.tech_message (
15003 p_severity => c_log_level_1
15004 ,p_module=> c_block||'.'||c_proc_name||'.Validation#3'
15005 ,p_msg_text => 'v_data_slc '||v_data_slc||
15006 'v_member_table_name'||v_member_table_name||
15007 'No:of Invalid Records'|| l_count);
15008
15009 ------------------------------------------------------------------------------
15010 -- end of Validation # 3
15011 ------------------------------------------------------------------------------
15012
15013 ------------------------------------------------------------------------------
15014 -- Start processing Rows from Interface table.
15015 -- Open the cursor to get the rows from interface table
15016 ------------------------------------------------------------------------------
15017
15018 OPEN cv_get_rows FOR v_select_stmt;
15019
15020 LOOP
15021 EXIT WHEN cv_get_rows%NOTFOUND;
15022 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15023 FETCH cv_get_rows BULK COLLECT
15024 INTO t_rowid,
15025 t_global_vs_combo_dc,
15026 t_fin_elem_dc,
15027 t_ledger_dc,
15028 t_product_dc,
15029 t_cctr_org_dc,
15030 t_customer_dc,
15031 t_channel_dc,
15032 t_project_dc,
15033 t_user_dim1_dc,
15034 t_user_dim2_dc,
15035 t_user_dim3_dc,
15036 t_user_dim4_dc,
15037 t_user_dim5_dc,
15038 t_user_dim6_dc,
15039 t_user_dim7_dc,
15040 t_user_dim8_dc,
15041 t_user_dim9_dc,
15042 t_user_dim10_dc,
15043 t_status
15044 LIMIT v_fetch_limit;
15045
15046 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
15047 FETCH cv_get_rows BULK COLLECT
15048 INTO t_rowid,
15049 t_global_vs_combo_dc,
15050 t_task_dc,
15051 t_cctr_org_dc,
15052 t_customer_dc,
15053 t_channel_dc,
15054 t_product_dc,
15055 t_project_dc,
15056 t_user_dim1_dc,
15057 t_user_dim2_dc,
15058 t_user_dim3_dc,
15059 t_user_dim4_dc,
15060 t_user_dim5_dc,
15061 t_user_dim6_dc,
15062 t_user_dim7_dc,
15063 t_user_dim8_dc,
15064 t_user_dim9_dc,
15065 t_user_dim10_dc,
15066 t_status
15067 LIMIT v_fetch_limit;
15068
15069 END IF; -- End of Fetch rows
15070
15071 -- Get the no:of rows this fetch
15072 v_mbr_last_row := t_status.COUNT;
15073
15074 fem_engines_pkg.tech_message (
15075 p_severity => c_log_level_1
15076 ,p_module=> c_block||'.'||c_proc_name||'.Validation#3'
15077 ,p_msg_text => 'v_data_slc '||v_data_slc||
15078 'v_member_table_name'||v_member_table_name||
15079 'No:of Invalid Records'|| l_count);
15080
15081 /* IF (x_rows_loaded IS NULL) THEN
15082 x_rows_loaded := 0;
15083 END IF;
15084
15085 x_rows_loaded := x_rows_loaded + v_mbr_last_row; */
15086
15087
15088 /*------------------------------------------------------------------------------
15089 VALIDATION#4:
15090 -- The Member Ids of component dimension members are populated in the
15091 -- following piece of code.
15092 -- If the member is not present in the component dimension member table
15093 -- that row will be marked as invalid.
15094 ------------------------------------------------------------------------------*/
15095
15096 -- Loop within the number of records in interface table
15097 /* FOR j IN 1..v_mbr_last_row LOOP
15098 -- Initialize the TABLE TYPE Varible
15099 t_channel_id(j) := NULL;
15100 t_cctr_org_id(j) := NULL;
15101 t_customer_id(j) := NULL;
15102 t_fin_elem_id(j) := NULL;
15103 t_ledger_id(j) := NULL;
15104 t_product_id(j) := NULL;
15105 t_project_id(j) := NULL;
15106 t_task_id(j) := NULL;
15107 t_user_dim1_id(j) := NULL;
15108 t_user_dim2_id(j) := NULL;
15109 t_user_dim3_id(j) := NULL;
15110 t_user_dim4_id(j) := NULL;
15111 t_user_dim5_id(j) := NULL;
15112 t_user_dim6_id(j) := NULL;
15113 t_user_dim7_id(j) := NULL;
15114 t_user_dim8_id(j) := NULL;
15115 t_user_dim9_id(j) := NULL;
15116 t_user_dim10_id(j):= NULL;
15117
15118 t_global_vs_combo_id(j) := -1;
15119
15120 FOR i IN 1..t_metadata.COUNT LOOP
15121
15122 IF (t_metadata(i).dimension_id <> '-999') AND (t_status(j) = 'LOAD')THEN
15123
15124 FOR c_value_set IN (
15125 SELECT g.dimension_id
15126 ,g.value_set_id
15127 ,g.global_vs_combo_id
15128 FROM FEM_GLOBAL_VS_COMBO_DEFS g,
15129 FEM_GLOBAL_VS_COMBOS_b m
15130 WHERE g.global_vs_combo_id = m.global_vs_combo_id
15131 AND g.dimension_id = t_metadata(i).dimension_id
15132 AND m.global_vs_combo_display_code = t_global_vs_combo_dc(j)
15133 ORDER BY 1)
15134 LOOP
15135
15136 t_global_vs_combo_id(j) := c_value_set.global_vs_combo_id;
15137
15138 --Ledger is not handled here as it is non VSR Dimension
15139
15140 CASE t_metadata(i).member_display_code_col
15141
15142 WHEN 'FINANCIAL_ELEM_DISPLAY_CODE' THEN
15143
15144 BEGIN
15145 EXECUTE IMMEDIATE t_metadata(i).member_sql
15146 INTO t_fin_elem_id(j)
15147 USING t_fin_elem_dc(j),c_value_set.value_set_id;
15148
15149 EXCEPTION
15150 WHEN no_data_found THEN
15151 t_status(j) := 'INAVLID_FIN_ELEM';
15152 END;
15153
15154 WHEN 'TASK_DISPLAY_CODE' THEN
15155
15156 BEGIN
15157 EXECUTE IMMEDIATE t_metadata(i).member_sql
15158 INTO t_task_id(j)
15159 USING t_task_dc(j),c_value_set.value_set_id;
15160
15161 EXCEPTION
15162 WHEN no_data_found THEN
15163 t_status(j) := 'INAVLID_TASK';
15164 END;
15165
15166 WHEN 'CHANNEL_DISPLAY_CODE' THEN
15167
15168 BEGIN
15169 EXECUTE IMMEDIATE t_metadata(i).member_sql
15170 INTO t_channel_id(j)
15171 USING t_channel_dc(j), c_value_set.value_set_id;
15172
15173 EXCEPTION
15174 WHEN no_data_found THEN
15175 t_status(j) := 'INAVLID_CHANNEL';
15176 END;
15177
15178 WHEN 'CCTR_ORG_DISPLAY_CODE' THEN
15179
15180 BEGIN
15181 EXECUTE IMMEDIATE t_metadata(i).member_sql
15182 INTO t_cctr_org_id(j)
15183 USING t_cctr_org_dc(j),c_value_set.value_set_id;
15184
15185 EXCEPTION
15186 WHEN no_data_found THEN
15187 t_status(j) := 'INAVLID_CCTR_ORG';
15188 END;
15189
15190 WHEN 'CUSTOMER_DISPLAY_CODE' THEN
15191
15192 BEGIN
15193 EXECUTE IMMEDIATE t_metadata(i).member_sql
15194 INTO t_customer_id(j)
15195 USING t_customer_dc(j),c_value_set.value_set_id;
15196
15197 EXCEPTION
15198 WHEN no_data_found THEN
15199 t_status(j) := 'INAVLID_CUSTOMER';
15200 END;
15201
15202 WHEN 'PRODUCT_DISPLAY_CODE' THEN
15203
15204 BEGIN
15205 EXECUTE IMMEDIATE t_metadata(i).member_sql
15206 INTO t_product_id(j)
15207 USING t_product_dc(j),c_value_set.value_set_id;
15208
15209 EXCEPTION
15210 WHEN no_data_found THEN
15211 t_status(j) := 'INAVLID_PRODUCT';
15212 END;
15213
15214 WHEN 'PROJECT_DISPLAY_CODE' THEN
15215
15216 BEGIN
15217 EXECUTE IMMEDIATE t_metadata(i).member_sql
15218 INTO t_project_id(j)
15219 USING t_project_dc(j),c_value_set.value_set_id;
15220
15221 EXCEPTION
15222 WHEN no_data_found THEN
15223 t_status(j) := 'INAVLID_PROJECT';
15224 END;
15225
15226 WHEN 'USER_DIM1_DISPLAY_CODE' THEN
15227
15228 BEGIN
15229 EXECUTE IMMEDIATE t_metadata(i).member_sql
15230 INTO t_user_dim1_id(j)
15231 USING t_user_dim1_dc(j),c_value_set.value_set_id;
15232
15233 EXCEPTION
15234 WHEN no_data_found THEN
15235 t_status(j) := 'INAVLID_USER_DIM1';
15236 END;
15237
15238 WHEN 'USER_DIM2_DISPLAY_CODE' THEN
15239
15240 BEGIN
15241 EXECUTE IMMEDIATE t_metadata(i).member_sql
15242 INTO t_user_dim2_id(j)
15243 USING t_user_dim2_dc(j),c_value_set.value_set_id;
15244
15245 EXCEPTION
15246 WHEN no_data_found THEN
15247 t_status(j) := 'INAVLID_USER_DIM2';
15248 END;
15249
15250 WHEN 'USER_DIM3_DISPLAY_CODE' THEN
15251
15252 BEGIN
15253 EXECUTE IMMEDIATE t_metadata(i).member_sql
15254 INTO t_user_dim3_id(j)
15255 USING t_user_dim3_dc(j),c_value_set.value_set_id;
15256
15257 EXCEPTION
15258 WHEN no_data_found THEN
15259 t_status(j) := 'INAVLID_USER_DIM3';
15260 END;
15261
15262 WHEN 'USER_DIM4_DISPLAY_CODE' THEN
15263
15264 BEGIN
15265 EXECUTE IMMEDIATE t_metadata(i).member_sql
15266 INTO t_user_dim4_id(j)
15267 USING t_user_dim4_dc(j),c_value_set.value_set_id;
15268
15269 EXCEPTION
15270 WHEN no_data_found THEN
15271 t_status(j) := 'INAVLID_USER_DIM4';
15272 END;
15273
15274 WHEN 'USER_DIM5_DISPLAY_CODE' THEN
15275
15276 BEGIN
15277 EXECUTE IMMEDIATE t_metadata(i).member_sql
15278 INTO t_user_dim5_id(j)
15279 USING t_user_dim5_dc(j),c_value_set.value_set_id;
15280
15281 EXCEPTION
15282 WHEN no_data_found THEN
15283 t_status(j) := 'INAVLID_USER_DIM5';
15284 END;
15285
15286 WHEN 'USER_DIM6_DISPLAY_CODE' THEN
15287
15288 BEGIN
15289 EXECUTE IMMEDIATE t_metadata(i).member_sql
15290 INTO t_user_dim6_id(j)
15291 USING t_user_dim6_dc(j),c_value_set.value_set_id;
15292
15293 EXCEPTION
15294 WHEN no_data_found THEN
15295 t_status(j) := 'INAVLID_USER_DIM6';
15296 END;
15297
15298 WHEN 'USER_DIM7_DISPLAY_CODE' THEN
15299
15300 BEGIN
15301 EXECUTE IMMEDIATE t_metadata(i).member_sql
15302 INTO t_user_dim7_id(j)
15303 USING t_user_dim7_dc(j),c_value_set.value_set_id;
15304
15305 EXCEPTION
15306 WHEN no_data_found THEN
15307 t_status(j) := 'INAVLID_USER_DIM7';
15308 END;
15309
15310 WHEN 'USER_DIM8_DISPLAY_CODE' THEN
15311
15312 BEGIN
15313 EXECUTE IMMEDIATE t_metadata(i).member_sql
15314 INTO t_user_dim8_id(j)
15315 USING t_user_dim8_dc(j),c_value_set.value_set_id;
15316
15317 EXCEPTION
15318 WHEN no_data_found THEN
15319 t_status(j) := 'INAVLID_USER_DIM8';
15320 END;
15321
15322 WHEN 'USER_DIM9_DISPLAY_CODE' THEN
15323
15324 BEGIN
15325 EXECUTE IMMEDIATE t_metadata(i).member_sql
15326 INTO t_user_dim9_id(j)
15327 USING t_user_dim9_dc(j),c_value_set.value_set_id;
15328
15329 EXCEPTION
15330 WHEN no_data_found THEN
15331 t_status(j) := 'INAVLID_USER_DIM9';
15332 END;
15333
15334 WHEN 'USER_DIM10_DISPLAY_CODE' THEN
15335
15336 BEGIN
15337 EXECUTE IMMEDIATE t_metadata(i).member_sql
15338 INTO t_user_dim10_id(j)
15339 USING t_user_dim10_dc(j),c_value_set.value_set_id;
15340
15341 EXCEPTION
15342 WHEN no_data_found THEN
15343 t_status(j) := 'INAVLID_USER_DIM10';
15344 END;
15345
15346 ELSE NULL;
15347
15348 END CASE;
15349
15350 END LOOP; -- c_value_Set
15351
15352
15353
15354 /* IF (t_status(j) <> 'LOAD') THEN
15355 x_rows_rejected := x_rows_rejected + 1;
15356 END IF;*/
15357
15358 -- This piece of code is not needed as this validation is done already
15359 /* ELSIF p_dimension_varchar_label = 'COST_OBJECT'
15360 AND t_metadata(i).member_display_code_col = 'LEDGER_DISPLAY_CODE'
15361 AND t_status(j) = 'LOAD' THEN
15362
15363 BEGIN
15364 /* SELECT ledger_id
15365 INTO t_ledger_id(j)
15366 FROM fem_ledgers_vl
15367 WHERE ledger_display_code = t_ledger_dc(j);
15368
15369 EXECUTE IMMEDIATE t_metadata(i).member_sql
15370 INTO t_ledger_id(j)
15371 USING t_ledger_dc(j);
15372 EXCEPTION
15373 WHEN no_data_found THEN
15374 t_status(j) := 'INAVLID_LEDGER';
15375 END;*/
15376
15377 /* END IF; -- if dim_id <> -999
15378
15379
15380 END LOOP; --1..17(i)
15381
15382 --------------------------------------------------------------------------
15383 -- Initialize UOM_CODE column for cost objects
15384 --------------------------------------------------------------------------
15385
15386 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15387 --we can use FEM_DIM_UTILS_PVT.Get_UOM_Code as well.
15388 t_uom_code(j) := 'Ea';
15389
15390 IF t_product_id(j) IS NOT NULL THEN
15391 BEGIN
15392 SELECT prod.dim_attribute_varchar_member AS uom_code
15393 INTO t_uom_code(j)
15394 FROM fem_products_attr prod,
15395 fem_dim_attributes_b attr,
15396 fem_dim_attr_versions_vl ver
15397 WHERE prod.product_id = t_product_id(j)
15398 AND prod.attribute_id = attr.attribute_id
15399 AND prod.version_id = ver.version_id
15400 AND attr.attribute_varchar_label = 'PRODUCT_UOM'
15401 AND ver.attribute_id = attr.attribute_id
15402 AND ver.default_version_flag = 'Y';
15403 EXCEPTION
15404 WHEN no_data_found THEN
15405 t_uom_code(j) := 'Ea';
15406 END;
15407 END IF; -- UOM code
15408
15409 END IF; -- Cost Object
15410
15411 END LOOP; -- 1...v_member_last_row.(j)
15412
15413 fem_engines_pkg.tech_message (
15414 p_severity => c_log_level_1
15415 ,p_module=> c_block||'.'||c_proc_name||'.Validation#4 - End');
15416
15417
15418
15419 ----------------------------------------------------------------------------
15420 -- Get the concatenated display code
15421 -----------------------------------------------------------------------------
15422
15423 Get_Display_Codes(p_dimension_varchar_label, p_structure_id);
15424
15425 ----------------------------------------------------------------------------
15426 -- VALIDATION#5
15427 -- check for existence of unique member (eliminate unique records in
15428 -- set of records selected for insertion)
15429 -- (ie) The following combination must be unique
15430 -- Display Code + GVSC id
15431 -----------------------------------------------------------------------------
15432
15433 FOR i IN 1..v_mbr_last_row LOOP
15434 FOR j IN (i+1) .. v_mbr_last_row LOOP
15435 IF t_display_code(i) = t_display_code(j)
15436 AND t_global_vs_combo_id(i) = t_global_vs_combo_id(j) THEN
15437 t_status(i) := 'MEMBER_EXISTS';
15438 END IF;
15439 END LOOP;
15440 END LOOP;
15441
15442
15443 fem_engines_pkg.tech_message (
15444 p_severity => c_log_level_1
15445 ,p_module=> c_block||'.'||c_proc_name||'.Validation#5 - End');
15446
15447 ----------------------------------------------------------------------------
15448 -- VALIDATION#6
15449 -- Check for uniqueness of records in the interface table and
15450 -- Composite Dimension member table
15451 ----------------------------------------------------------------------------
15452
15453 FOR i IN 1..v_mbr_last_row LOOP
15454 IF t_status(i) = 'LOAD' THEN
15455
15456 FEM_DIM_UTILS_PVT.Check_Unique_Member( p_api_version => 1.0,
15457 p_return_status => v_return_status,
15458 p_msg_count => v_msg_count,
15459 p_msg_data => v_msg_data,
15460 p_comp_dim_flag => 'Y',
15461 p_member_name => NULL,
15462 p_member_display_code => t_display_code(i),
15463 p_dimension_varchar_label => p_dimension_varchar_label,
15464 p_value_set_id => NULL,
15465 p_global_vs_combo_id => t_global_vs_combo_id(i));
15466
15467 IF v_return_status = FND_API.G_RET_STS_ERROR THEN
15468 t_status(i) := 'MEMBER_EXISTS';
15469 END IF;
15470 END IF;
15471 END LOOP;
15472
15473
15474 fem_engines_pkg.tech_message (
15475 p_severity => c_log_level_1
15476 ,p_module=> c_block||'.'||c_proc_name||'.Validation#6 - End');
15477
15478 ----------------------------------------------------------------------------
15479 -- Insert the valid record into composite dimension member table
15480 ----------------------------------------------------------------------------
15481
15482 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15483 FORALL i IN 1..v_mbr_last_row
15484 EXECUTE IMMEDIATE v_insert_cost_stmt
15485 USING t_display_code(i),
15486 'N',
15487 sysdate,
15488 sysdate,
15489 p_structure_id,
15490 t_global_vs_combo_id(i),
15491 t_uom_code(i),
15492 t_fin_elem_id(i),
15493 t_ledger_id(i),
15494 t_product_id(i),
15495 t_cctr_org_id(i),
15496 t_customer_id(i),
15497 t_channel_id(i),
15498 t_project_id(i),
15499 t_user_dim1_id(i),
15500 t_user_dim2_id(i),
15501 t_user_dim3_id(i),
15502 t_user_dim4_id(i),
15503 t_user_dim5_id(i),
15504 t_user_dim6_id(i),
15505 t_user_dim7_id(i),
15506 t_user_dim8_id(i),
15507 t_user_dim9_id(i),
15508 t_user_dim10_id(i),
15509 t_fin_elem_dc(i),
15510 t_ledger_dc(i),
15511 t_product_dc(i),
15512 t_cctr_org_dc(i),
15513 t_customer_dc(i),
15514 t_channel_dc(i),
15515 t_project_dc(i),
15516 t_user_dim1_dc(i),
15517 t_user_dim2_dc(i),
15518 t_user_dim3_dc(i),
15519 t_user_dim4_dc(i),
15520 t_user_dim5_dc(i),
15521 t_user_dim6_dc(i),
15522 t_user_dim7_dc(i),
15523 t_user_dim8_dc(i),
15524 t_user_dim9_dc(i),
15525 t_user_dim10_dc(i),
15526 '',
15527 '',
15528 '',
15529 '',
15530 '',
15531 '',
15532 '',
15533 '',
15534 '',
15535 '',
15536 '',
15537 '',
15538 '',
15539 sysdate,
15540 v_CREATED_BY,
15541 v_LAST_UPDATED_BY,
15542 sysdate,
15543 v_LAST_UPDATE_LOGIN,
15544 1,
15545 'Y',
15546 'N',
15547 'N',
15548 t_status(i);
15549
15550 ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
15551 FORALL i IN 1..v_mbr_last_row
15552 EXECUTE IMMEDIATE v_insert_activity_stmt
15553 USING t_display_code(i),
15554 'N',
15555 sysdate,
15556 sysdate,
15557 p_structure_id,
15558 t_global_vs_combo_id(i),
15559 t_task_id(i),
15560 t_cctr_org_id(i),
15561 t_customer_id(i),
15562 t_channel_id(i),
15563 t_product_id(i),
15564 t_project_id(i),
15565 t_user_dim1_id(i),
15566 t_user_dim2_id(i),
15567 t_user_dim3_id(i),
15568 t_user_dim4_id(i),
15569 t_user_dim5_id(i),
15570 t_user_dim6_id(i),
15571 t_user_dim7_id(i),
15572 t_user_dim8_id(i),
15573 t_user_dim9_id(i),
15574 t_user_dim10_id(i),
15575 t_task_dc(i),
15576 t_cctr_org_dc(i),
15577 t_customer_dc(i),
15578 t_channel_dc(i),
15579 t_product_dc(i),
15580 t_project_dc(i),
15581 t_user_dim1_dc(i),
15582 t_user_dim2_dc(i),
15583 t_user_dim3_dc(i),
15584 t_user_dim4_dc(i),
15585 t_user_dim5_dc(i),
15586 t_user_dim6_dc(i),
15587 t_user_dim7_dc(i),
15588 t_user_dim8_dc(i),
15589 t_user_dim9_dc(i),
15590 t_user_dim10_dc(i),
15591 '',
15592 '',
15593 '',
15594 '',
15595 '',
15596 '',
15597 '',
15598 '',
15599 '',
15600 '',
15601 '',
15602 '',
15603 '',
15604 '',
15605 sysdate,
15606 v_CREATED_BY,
15607 v_LAST_UPDATED_BY,
15608 sysdate,
15609 v_LAST_UPDATE_LOGIN,
15610 1,
15611 'Y',
15612 'N',
15613 'N',
15614 t_status(i);
15615
15616 END IF; -- Actvity / Cost Object
15617
15618 ----------------------------------------------------------------------------
15619 --Populate the parameters for logging
15620 ----------------------------------------------------------------------------
15621 v_rows_loaded := v_rows_loaded + SQL%ROWCOUNT;
15622 v_rows_processed := v_rows_processed + cv_get_rows%ROWCOUNT;
15623 v_rows_rejected := v_rows_rejected + (v_rows_processed - v_rows_loaded);
15624
15625 ----------------------------------------------------------------------------
15626 -- This is common for both Activity and Cost Object
15627 -- Update the 'STATUS' column of Interface table
15628 -- Delete the insertes rows from interface tables ((ie) STATUS = LOAD )
15629 ----------------------------------------------------------------------------
15630
15631 FORALL i IN 1..v_mbr_last_row
15632 EXECUTE IMMEDIATE v_update_stmt USING t_status(i),t_rowid(i);
15633
15634 FORALL i IN 1..v_mbr_last_row
15635 EXECUTE IMMEDIATE v_delete_stmt USING t_rowid(i),t_status(i);
15636
15637 END LOOP; --- Bulk fetch from interface tables.
15638
15639 CLOSE cv_get_rows;
15640
15641
15642 fem_engines_pkg.tech_message (
15643 p_severity => c_log_level_4
15644 ,p_module => c_block||'.'||c_proc_name
15645 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15646 'Data Slice'||v_data_slc||
15647 'Rows Processed'||v_rows_processed||
15648 'Rows Loaded'||v_rows_loaded||
15649 'Rows Rejected'||v_rows_rejected );
15650
15651 --x_rows_rejected := get_mp_rows_rejected (x_rows_rejected)
15652
15653 --------------------------
15654 -- Commit the transaaction
15655 --------------------------
15656
15657 COMMIT;
15658
15659 --------------------------------------------
15660 -- Delete Collections for Next Bulk Fetch --
15661 --------------------------------------------
15662
15663 t_fin_elem_id.DELETE;
15664 t_ledger_id.DELETE;
15665 t_rowid.DELETE;
15666 t_global_vs_combo_id.DELETE;
15667 t_task_id.DELETE;
15668 t_cctr_org_id.DELETE;
15669 t_channel_id.DELETE;
15670 t_customer_id.DELETE;
15671 t_product_id.DELETE;
15672 t_project_id.DELETE;
15673 t_user_dim1_id.DELETE;
15674 t_user_dim2_id.DELETE;
15675 t_user_dim3_id.DELETE;
15676 t_user_dim4_id.DELETE;
15677 t_user_dim5_id.DELETE;
15678 t_user_dim6_id.DELETE;
15679 t_user_dim7_id.DELETE;
15680 t_user_dim8_id.DELETE;
15681 t_user_dim9_id.DELETE;
15682 t_user_dim10_id.DELETE;
15683 t_global_vs_combo_dc.DELETE;
15684 t_task_dc.DELETE;
15685 t_cctr_org_dc.DELETE;
15686 t_channel_dc.DELETE;
15687 t_customer_dc.DELETE;
15688 t_product_dc.DELETE;
15689 t_project_dc.DELETE;
15690 t_fin_elem_dc.DELETE;
15691 t_ledger_dc.DELETE;
15692 t_user_dim1_dc.DELETE;
15693 t_user_dim2_dc.DELETE;
15694 t_user_dim3_dc.DELETE;
15695 t_user_dim4_dc.DELETE;
15696 t_user_dim5_dc.DELETE;
15697 t_user_dim6_dc.DELETE;
15698 t_user_dim7_dc.DELETE;
15699 t_user_dim8_dc.DELETE;
15700 t_user_dim9_dc.DELETE;
15701 t_user_dim10_dc.DELETE;
15702 t_display_code.DELETE;
15703 t_status.DELETE;
15704
15705 EXCEPTION
15706 WHEN e_terminate THEN
15707
15708 fem_engines_pkg.tech_message(
15709 p_severity => c_log_level_4
15710 ,p_module => c_block||'.'||c_proc_name||'Exception');
15711
15712 IF cv_get_rows%ISOPEN THEN
15713 CLOSE cv_get_rows;
15714 END IF;
15715
15716 IF cv_get_invalid_fin_elems%ISOPEN THEN
15717 CLOSE cv_get_invalid_fin_elems;
15718 END IF;
15719
15720 IF cv_get_invalid_ledgers%ISOPEN THEN
15721 CLOSE cv_get_invalid_ledgers;
15722 END IF;
15723
15724 IF cv_get_invalid_gvscs%ISOPEN THEN
15725 CLOSE cv_get_invalid_gvscs;
15726 END IF;
15727
15728 IF cv_get_invalid_comp_dims%ISOPEN THEN
15729 CLOSE cv_get_invalid_comp_dims;
15730 END IF;
15731
15732 x_status := 2;
15733 x_message := 'INCOMPLETE:EXCEPTION';
15734
15735 RAISE e_main_terminate;
15736
15737 WHEN OTHERS THEN
15738 fem_engines_pkg.tech_message (
15739 p_severity => c_log_level_4
15740 ,p_module => c_block||'.'||c_proc_name||'.Exception'
15741 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15742 'Code'||SQLCODE||'Err'||SQLERRM);
15743
15744 IF cv_get_rows%ISOPEN THEN
15745 CLOSE cv_get_rows;
15746 END IF;
15747
15748 IF cv_get_invalid_fin_elems%ISOPEN THEN
15749 CLOSE cv_get_invalid_fin_elems;
15750 END IF;
15751
15752 IF cv_get_invalid_ledgers%ISOPEN THEN
15753 CLOSE cv_get_invalid_ledgers;
15754 END IF;
15755
15756 IF cv_get_invalid_gvscs%ISOPEN THEN
15757 CLOSE cv_get_invalid_gvscs;
15758 END IF;
15759
15760 IF cv_get_invalid_comp_dims%ISOPEN THEN
15761 CLOSE cv_get_invalid_comp_dims;
15762 END IF;
15763
15764 x_status := 2;
15765 x_message := 'INCOMPLETE:EXCEPTION';
15766
15767 RAISE e_main_terminate;
15768
15769 END process_rows;
15770
15771
15772 /*===========================================================================+
15773 | PROCEDURE
15774 | Load Dimension
15775 |
15776 | DESCRIPTION
15777 | Main engine procedure for loading dimension members
15778 | and attribute assignments into FEM
15779 |
15780 |
15781 |
15782 | SCOPE - PUBLIC
15783 |
15784 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
15785 |
15786 | ARGUMENTS : IN:
15787 | p_dimension_varchar_label (identifies the Dimension being loaded)
15788 |
15789 | OUT:
15790 |
15791 | IN/ OUT:
15792 |
15793 | RETURNS : NONE
15794 |
15795 | NOTES
15796 |
15797 | The Load_Dimension procedure performs the following:
15798 | 1) Engine_Master_Prep - gets the metadata for the dimension
15799
15800 | 2) Determines the Source System Codes for the load
15801 | 3) Load Dimension Grps (of that dimension) -
15802 | Pre-validation - identifies and updates bad records
15803 | New Members - creates new dimension groups
15804 | TL Update - updates the name/desc of groups
15805 | Base Update - updates base properties of the groups
15806 | 4) Load Dimension Members
15807 | Pre-validation - identifies and updates bad records
15808 | New Members - creates new dim members and their req. attr assignments
15809 | TL Update - updates name/desc of members
15810 | Base Update - updates base properties of members
15811 | Pre-valid Attr - identifies bad optional attr records
15812 | Attr Update - loads new optional attr assignments and updates existing
15813 | assignments
15814 | 5) Engine_Master_Post - post error counts and PL status
15815 |
15816 | SPECIAL NOTE: The x_rows_loaded output variable is only populated if a
15817 | new member is created. It does not represent the number of
15818 | rows loaded. Rather, it is just serving as a flag to indicate
15819 | that at least one new member was created. The other procedures
15820 | such as TL_UPDATE, BASE_UPDATE and ATTR_ASSIGN_UPDATE do not
15821 | populate this output value.
15822 |
15823 |
15824 |
15825 | MODIFICATION HISTORY
15826 | Rob Flippo 21-OCT-03 Created
15827 | Rob Flippo 08-SEP-04 Added condition on the MP Master return status so
15828 | that if no data slices found on Pre Validation, the
15829 | loader continues rather than terminating
15830 | sshanmug 28-APR-05 Added Logic for Composite_dimension_loader
15831 | Rob Flippo 31-MAY-05 Bug#3923485 Removed p_date_format_mask input parm
15832 | now using ICX: Date Format Mask profile option
15833 | navekuma 26-APR-06 Bug#4736810. Added the call to get_mp_rows_rejected
15834 | after the call to MP engine for composite dimensions.
15835 +===========================================================================*/
15836
15837 PROCEDURE Load_Dimension (
15838 x_rows_rejected_accum OUT NOCOPY NUMBER
15839 ,x_rows_to_load OUT NOCOPY NUMBER
15840 ,p_execution_mode IN VARCHAR2
15841 ,p_object_id IN NUMBER
15842 ,p_object_definition_id IN NUMBER
15843 ,p_dimension_varchar_label IN VARCHAR2
15844 ,p_master_request_id IN NUMBER
15845 )
15846
15847 IS
15848
15849 -----------------------
15850 -- Declare constants --
15851 -----------------------
15852 c_proc_name VARCHAR2(30) := 'load_dimension_members';
15853
15854 -- Constants for Dimension Group loading
15855 c_dimgrp_tbl_handler VARCHAR2(30) := 'FEM_DIMENSION_GRPS_PKG';
15856 c_dimgrp_b_t_table VARCHAR2(30) := 'FEM_DIMENSION_GRPS_B_T';
15857 c_dimgrp_tl_t_table VARCHAR2(30) := 'FEM_DIMENSION_GRPS_TL_T';
15858 c_dimgrp_b_table VARCHAR2(30) := 'FEM_DIMENSION_GRPS_B';
15859 c_dimgrp_tl_table VARCHAR2(30) := 'FEM_DIMENSION_GRPS_TL';
15860 c_dimgrp_label VARCHAR2(30) := 'DIMENSION_GROUP';
15861 c_dimgrp_dc_col VARCHAR2(30) := 'DIMENSION_GROUP_DISPLAY_CODE';
15862 c_dimgrp_col VARCHAR2(30) := 'DIMENSION_GROUP_ID';
15863 c_dimgrp_name_col VARCHAR2(30) := 'DIMENSION_GROUP_NAME';
15864 c_dimgrp_desc_col VARCHAR2(30) := 'DESCRIPTION';
15865 -----------------------
15866 -- Declare variables --
15867 -----------------------
15868
15869 ----------------------------------------------------------
15870 -- Variables for Object ID and Proces Locks Processing architecture
15871 v_object_id NUMBER;
15872 v_object_definition_id NUMBER;
15873 v_num_msg NUMBER; -- number of error messages on the stack
15874 v_completion_status VARCHAR2(30); -- return code for PL registration
15875 -- values are 'SUCCESS' and 'ERROR'
15876 v_eng_master_prep_status VARCHAR2(30) := 'SUCCESS'; -- return code for Engine Master Prep
15877 -- values are 'SUCCESS' and 'ERROR'
15878
15879 v_mp_prg_status VARCHAR2(30);
15880 v_mp_exception_code VARCHAR2(240);
15881 i NUMBER; -- counting variable for loops
15882
15883 v_date_format_mask VARCHAR2(100); -- result from FEM_INTF_ATTR_DATE_FORMAT_MASK for site
15884
15885 -- Common abbreviations: dc = display_code
15886 -- _t = interface table
15887 -- mbr = member
15888 -- attr = attribute
15889 -- source = interface table
15890 -- target = FEM table
15891
15892 -- Variable designating whether we are loading Dimension Groups or Members
15893 v_load_type VARCHAR2(30);
15894
15895 -- These variables are retrieved as part of GET_DIMENSION_INFO
15896 v_dimension_id NUMBER;
15897 v_get_dim_status VARCHAR2(30);
15898 v_target_b_table VARCHAR2(30);
15899 v_target_tl_table VARCHAR2(30);
15900 v_target_attr_table VARCHAR2(30);
15901 v_source_b_table VARCHAR2(30);
15902 v_source_tl_table VARCHAR2(30);
15903 v_source_attr_table VARCHAR2(30);
15904 v_member_col VARCHAR2(30);
15905 v_member_dc_col VARCHAR2(30);
15906 v_member_t_dc_col VARCHAR2(30);
15907 v_member_name_col VARCHAR2(30);
15908 v_member_t_name_col VARCHAR2(30);
15909 v_member_description_col VARCHAR2(30);
15910 v_value_set_required_flag VARCHAR2(1);
15911 v_simple_dimension_flag VARCHAR2(1);
15912 v_shared_dimension_flag VARCHAR2(1);
15913 v_hier_table_name VARCHAR2(30);
15914 v_hier_dimension_flag VARCHAR2(1);
15915 v_member_id_method_code VARCHAR2(30);
15916 v_user_defined_flag VARCHAR2(1);
15917 v_table_handler_name VARCHAR2(30);
15918
15919 -- These variables are needed for Composite Dimension Loader
15920 v_composite_dimension_flag VARCHAR2(1);
15921 v_structure_id NUMBER;
15922
15923 -- variables storing temporary state information
15924 v_attr_success VARCHAR2(1);
15925 v_temp_member VARCHAR2(100);
15926 v_status NUMBER;
15927 v_message VARCHAR2(4000);
15928 v_rows_processed NUMBER :=0;
15929 v_rows_processed_accum NUMBER :=0; -- running total
15930 v_rows_loaded NUMBER :=0; -- used as a placeholder for when
15931 -- calling get_mp_rows_rejected; The value
15932 -- is only meaningful for identifying if
15933 -- >0 new members were created - otherwise
15934 -- it is ignored
15935 v_rows_loaded_accum NUMBER :=0; -- running total
15936 v_rows_rejected NUMBER :=0;
15937 v_rows_rejected_accum NUMBER :=0; -- running total
15938
15939 -- Dynamic SQL statement variables
15940 x_src_sys_select_stmt VARCHAR2(4000);
15941
15942 -- Count variables for manipulating the member and attribute arrays
15943 v_src_sys_last_row NUMBER;
15944
15945 -- STATUS clause for all WHERE conditions
15946 v_exec_mode_clause VARCHAR2(100);
15947
15948 ---------------------
15949 -- Declare cursors --
15950 ---------------------
15951 cv_get_src_sys cv_curs; -- Retreives Source System Codes for the load
15952
15953
15954 /**************************************************************************
15955 * *
15956 * Load Dimension *
15957 * Execution Block *
15958 * *
15959 **************************************************************************/
15960
15961 BEGIN
15962 v_object_definition_id := p_object_definition_id;
15963 IF v_object_definition_id IS NULL THEN
15964 v_object_definition_id := 1200;
15965 END IF;
15966
15967 -- initialize the dimension group error count
15968 gv_dimgrp_rows_rejected := 0;
15969
15970 -----------------------------------------------------------------------------
15971 -- populate the composite dimension information
15972 -- Needed for composite dimension loader
15973 -----------------------------------------------------------------------------
15974
15975 IF p_dimension_varchar_label IN ('ACTIVITY','COST_OBJECT') THEN
15976 BEGIN
15977
15978 SELECT composite_dimension_flag,id_flex_num
15979 INTO v_composite_dimension_flag,v_structure_id
15980 FROM Fem_XDim_Dimensions_VL
15981 WHERE dimension_varchar_label = p_dimension_varchar_label;
15982
15983 EXCEPTION
15984
15985 WHEN no_data_found THEN
15986 fem_engines_pkg.tech_message (
15987 p_severity => c_log_level_4
15988 ,p_module => c_block||'.'||c_proc_name||'.Comp Dim Params not found'
15989 ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15990 'Code'||SQLCODE||'Err'||SQLERRM);
15991 RAISE e_main_terminate;
15992 END;
15993 END IF;
15994
15995
15996
15997 FEM_ENGINES_PKG.TECH_MESSAGE
15998 (c_log_level_3,c_block||'.'||c_proc_name||'.Preparation','Get dimension information');
15999 FEM_ENGINES_PKG.TECH_MESSAGE
16000 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.p_dimension_varchar_label',p_dimension_varchar_label);
16001 FEM_ENGINES_PKG.TECH_MESSAGE
16002 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.c_user_id',c_user_id);
16003 FEM_ENGINES_PKG.TECH_MESSAGE
16004 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.v_obj_def_id',v_object_definition_id);
16005 FEM_ENGINES_PKG.TECH_MESSAGE
16006 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.p_object_id',p_object_id);
16007
16008 Engine_Master_Prep (p_dimension_varchar_label
16009 ,v_object_definition_id
16010 ,p_execution_mode
16011 ,v_dimension_id
16012 ,v_target_b_table
16013 ,v_target_tl_table
16014 ,v_target_attr_table
16015 ,v_source_b_table
16016 ,v_source_tl_table
16017 ,v_source_attr_table
16018 ,v_member_col
16019 ,v_member_dc_col
16020 ,v_member_t_dc_col
16021 ,v_member_name_col
16022 ,v_member_t_name_col
16023 ,v_member_description_col
16024 ,v_value_set_required_flag
16025 ,v_user_defined_flag
16026 ,v_simple_dimension_flag
16027 ,v_shared_dimension_flag
16028 ,v_table_handler_name
16029 ,v_composite_dimension_flag
16030 ,v_structure_id
16031 ,v_exec_mode_clause
16032 ,v_eng_master_prep_status
16033 ,v_hier_table_name
16034 ,v_hier_dimension_flag
16035 ,v_member_id_method_code
16036 ,x_rows_to_load
16037 ,v_date_format_mask
16038 );
16039
16040 IF v_eng_master_prep_status IN ('ERROR') THEN
16041 RAISE e_terminate;
16042 END IF;
16043
16044 FEM_ENGINES_PKG.TECH_MESSAGE
16045 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_b_table ',v_source_b_table);
16046
16047 ------------------------------------------------------------------------------
16048 --Composite Dimensions dont have _TL and _ATTR tables.
16049 ------------------------------------------------------------------------------
16050
16051 IF v_composite_dimension_flag = 'N' THEN
16052 FEM_ENGINES_PKG.TECH_MESSAGE
16053 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_tl_table ',v_source_tl_table);
16054 FEM_ENGINES_PKG.TECH_MESSAGE
16055 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_attr_table ',v_source_attr_table);
16056 END IF;
16057
16058
16059 FEM_ENGINES_PKG.TECH_MESSAGE
16060 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.value_set_required_flag ',v_value_set_required_flag);
16061 FEM_ENGINES_PKG.TECH_MESSAGE
16062 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.table handler ',v_table_handler_name);
16063
16064 FEM_ENGINES_PKG.TECH_MESSAGE
16065 (c_log_level_1,c_block||'.'||c_proc_name||'.v_exec_mode_clause ',v_exec_mode_clause);
16066
16067 FEM_ENGINES_PKG.TECH_MESSAGE
16068 (c_log_level_1,c_block||'.'||c_proc_name||'.v_date_format_mask ',v_date_format_mask);
16069
16070 -- The following are not needed composite dimension
16071
16072 IF v_composite_dimension_flag = 'N' THEN
16073
16074 ------------------------------------------------------------------------------
16075 -- Preparation STEP: Determing the Source System Codes in the load
16076 ------------------------------------------------------------------------------
16077 IF v_simple_dimension_flag = 'N' THEN
16078
16079 FEM_ENGINES_PKG.TECH_MESSAGE
16080 (c_log_level_3,c_block||'.'||c_proc_name||
16081 '.Preparation STEP','Determing Source System Codes for the load');
16082 build_src_sys_select_stmt (p_dimension_varchar_label
16083 ,v_source_attr_table
16084 ,v_shared_dimension_flag
16085 ,x_src_sys_select_stmt);
16086 FEM_ENGINES_PKG.TECH_MESSAGE
16087 (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.src_sys_select_stmt',x_src_sys_select_stmt);
16088 OPEN cv_get_src_sys FOR x_src_sys_select_stmt;
16089 FETCH cv_get_src_sys BULK COLLECT INTO
16090 tg_src_system_dc;
16091 v_src_sys_last_row := tg_src_system_dc.LAST;
16092 FEM_ENGINES_PKG.TECH_MESSAGE
16093 (c_log_level_1,c_block||'.'||c_proc_name||'.Source_System_Step.v_src_sys_last_row'
16094 ,v_src_sys_last_row);
16095 END IF; -- src system selection
16096
16097 IF (v_hier_dimension_flag = 'Y') THEN
16098 ------------------------------------------------------------------------------
16099 -- Load Dimension Groups
16100 ------------------------------------------------------------------------------
16101 FEM_ENGINES_PKG.TECH_MESSAGE
16102 (c_log_level_3,c_block||'.'||c_proc_name||
16103 '.Dimension Groups','Starting the Dimension Group load section');
16104 v_load_type := 'DIMENSION_GROUP';
16105
16106 ------------------------------------------------------------------------------
16107 -- Pre_Validation
16108 -- This step identifies new Dimension Groups missing TL records
16109 ------------------------------------------------------------------------------
16110 FEM_ENGINES_PKG.TECH_MESSAGE
16111 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16112
16113 Pre_Validation (P_ENG_SQL => null
16114 ,P_DATA_SLC => null
16115 ,P_PROC_NUM => null
16116 ,P_PARTITION_CODE => null
16117 ,P_FETCH_LIMIT => null
16118 ,P_LOAD_TYPE => v_load_type
16119 ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16120 ,P_DIMENSION_ID => v_dimension_id
16121 ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16122 ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16123 ,P_SOURCE_ATTR_TABLE => null
16124 ,P_TARGET_B_TABLE => c_dimgrp_b_table
16125 ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16126 ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16127 ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16128 ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16129 ,P_SHARED_DIMENSION_FLAG => 'N'
16130 ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16131 ,P_MASTER_REQUEST_ID => p_master_request_id);
16132 FEM_ENGINES_PKG.TECH_MESSAGE
16133 (c_log_level_1,c_block||'.'||c_proc_name||
16134 '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16135
16136 FEM_ENGINES_PKG.TECH_MESSAGE
16137 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp Pre_Valdation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16138
16139
16140 ------------------------------------------------------------------------------
16141 -- New Dimension Groups
16142 ------------------------------------------------------------------------------
16143 FEM_ENGINES_PKG.TECH_MESSAGE
16144 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16145
16146 New_Members (P_ENG_SQL => null
16147 ,P_DATA_SLC => null
16148 ,P_PROC_NUM => null
16149 ,P_PARTITION_CODE => null
16150 ,P_FETCH_LIMIT => null
16151 ,P_LOAD_TYPE => v_load_type
16152 ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16153 ,P_DATE_FORMAT_MASK => v_date_format_mask
16154 ,P_DIMENSION_ID => v_dimension_id
16155 ,P_TARGET_B_TABLE => c_dimgrp_b_table
16156 ,P_TARGET_TL_TABLE => c_dimgrp_tl_table
16157 ,P_TARGET_ATTR_TABLE => null
16158 ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16159 ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16160 ,P_SOURCE_ATTR_TABLE => null
16161 ,P_TABLE_HANDLER_NAME => c_dimgrp_tbl_handler
16162 ,P_MEMBER_COL => c_dimgrp_col
16163 ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16164 ,P_MEMBER_NAME_COL => c_dimgrp_name_col
16165 ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16166 ,P_MEMBER_T_NAME_COL => c_dimgrp_name_col
16167 ,P_MEMBER_DESCRIPTION_COL => c_dimgrp_desc_col
16168 ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16169 ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16170 ,P_SHARED_DIMENSION_FLAG => 'N'
16171 ,P_HIER_DIMENSION_FLAG => 'N'
16172 ,P_MEMBER_ID_METHOD_CODE => 'FUNCTION'
16173 ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16174 ,P_MASTER_REQUEST_ID => p_master_request_id);
16175 FEM_ENGINES_PKG.TECH_MESSAGE
16176 (c_log_level_1,c_block||'.'||c_proc_name||
16177 '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16178
16179 FEM_ENGINES_PKG.TECH_MESSAGE
16180 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16181
16182 ------------------------------------------------------------------------------
16183 -- Update Name/Descriptions for existing Members
16184 ------------------------------------------------------------------------------
16185 FEM_ENGINES_PKG.TECH_MESSAGE
16186 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16187
16188 TL_Update (P_ENG_SQL => null
16189 ,P_DATA_SLC => null
16190 ,P_PROC_NUM => null
16191 ,P_PARTITION_CODE => null
16192 ,P_FETCH_LIMIT => null
16193 ,P_LOAD_TYPE => v_load_type
16194 ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16195 ,P_DIMENSION_ID => v_dimension_id
16196 ,P_TARGET_B_TABLE => c_dimgrp_b_table
16197 ,P_TARGET_TL_TABLE => c_dimgrp_tl_table
16198 ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16199 ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16200 ,P_MEMBER_COL => c_dimgrp_col
16201 ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16202 ,P_MEMBER_NAME_COL => c_dimgrp_name_col
16203 ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16204 ,P_MEMBER_T_NAME_COL => c_dimgrp_name_col
16205 ,P_MEMBER_DESCRIPTION_COL => c_dimgrp_desc_col
16206 ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16207 ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16208 ,P_SHARED_DIMENSION_FLAG => 'N'
16209 ,P_HIER_DIMENSION_FLAG => 'N'
16210 ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16211 ,P_MASTER_REQUEST_ID => p_master_request_id);
16212
16213 FEM_ENGINES_PKG.TECH_MESSAGE
16214 (c_log_level_1,c_block||'.'||c_proc_name||
16215 '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16216
16217 FEM_ENGINES_PKG.TECH_MESSAGE
16218 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16219
16220 ----------------------------------------------------------------------------------
16221 -- Base_Update
16222 ----------------------------------------------------------------------------------
16223 FEM_ENGINES_PKG.TECH_MESSAGE
16224 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16225
16226 Base_Update (P_ENG_SQL => null
16227 ,P_DATA_SLC => null
16228 ,P_PROC_NUM => null
16229 ,P_PARTITION_CODE => null
16230 ,P_FETCH_LIMIT => null
16231 ,P_LOAD_TYPE => v_load_type
16232 ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16233 ,P_SIMPLE_DIMENSION_FLAG => 'N'
16234 ,P_SHARED_DIMENSION_FLAG => 'N'
16235 ,P_DIMENSION_ID => v_dimension_id
16236 ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16237 ,P_HIER_TABLE_NAME => null
16238 ,P_HIER_DIMENSION_FLAG => 'N'
16239 ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16240 ,P_TARGET_B_TABLE => c_dimgrp_b_table
16241 ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16242 ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16243 ,P_MEMBER_COL => c_dimgrp_col
16244 ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16245 ,P_MASTER_REQUEST_ID => p_master_request_id);
16246
16247 FEM_ENGINES_PKG.TECH_MESSAGE
16248 (c_log_level_1,c_block||'.'||c_proc_name||
16249 '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16250
16251 FEM_ENGINES_PKG.TECH_MESSAGE
16252 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16253
16254 END IF; -- Dimension Group Processing only happens for v_hier_dimension_flag = 'Y'
16255 v_rows_rejected_accum := gv_dimgrp_rows_rejected;
16256 FEM_ENGINES_PKG.TECH_MESSAGE
16257 (c_log_level_1,c_block||'.'||c_proc_name||
16258 '.v_rows_rejected_accum',v_rows_rejected_accum);
16259
16260 ------------------------------------------------------------------------------
16261 -- Load Dimension Members
16262 ------------------------------------------------------------------------------
16263 FEM_ENGINES_PKG.TECH_MESSAGE
16264 (c_log_level_3,c_block||'.'||c_proc_name||
16265 '.Dimension Members','Starting the Dimension Member load section');
16266
16267 v_load_type := 'DIMENSION_MEMBER';
16268 ------------------------------------------------------------------------------
16269 -- Pre_Validation
16270 -- This step identifies new members missing TL records
16271 ------------------------------------------------------------------------------
16272
16273 FEM_ENGINES_PKG.TECH_MESSAGE
16274 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16275
16276 fem_multi_proc_pkg.MASTER
16277 (X_PRG_STAT => v_mp_prg_status
16278 ,X_EXCEPTION_CODE => v_mp_exception_code
16279 ,P_RULE_ID => p_object_id
16280 ,P_ENG_STEP => 'ALL'
16281 ,P_DATA_TABLE => v_source_b_table
16282 ,P_ENG_SQL => null
16283 ,P_TABLE_ALIAS => 'B'
16284 ,P_RUN_NAME => 'Pre_Validation'
16285 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Pre_Validation'
16286 ,P_CONDITION => null
16287 ,P_FAILED_REQ_ID => null
16288 ,P_ARG1 => v_load_type
16289 ,P_ARG2 => p_dimension_varchar_label
16290 ,P_ARG3 => v_dimension_id
16291 ,P_ARG4 => v_source_b_table
16292 ,P_ARG5 => v_source_tl_table
16293 ,P_ARG6 => v_source_attr_table
16294 ,P_ARG7 => v_target_b_table
16295 ,P_ARG8 => v_member_t_dc_col
16296 ,P_ARG9 => v_member_dc_col
16297 ,P_ARG10 => v_value_set_required_flag
16298 ,P_ARG11 => v_simple_dimension_flag
16299 ,P_ARG12 => v_shared_dimension_flag
16300 ,P_ARG13 => v_exec_mode_clause
16301 ,P_ARG14 => p_master_request_id);
16302
16303 FEM_ENGINES_PKG.TECH_MESSAGE
16304 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_pgr_status',v_mp_prg_status);
16305 FEM_ENGINES_PKG.TECH_MESSAGE
16306 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception_code',v_mp_exception_code);
16307
16308 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16309 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16310 null;
16311 ELSE
16312 RAISE e_terminate;
16313 END IF;
16314 END IF;
16315
16316 -- accumulate rejected row count
16317 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16318 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16319
16320 FEM_ENGINES_PKG.TECH_MESSAGE
16321 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16322
16323 FEM_ENGINES_PKG.TECH_MESSAGE
16324 (c_log_level_1,c_block||'.'||c_proc_name||
16325 '.v_rows_rejected_accum',v_rows_rejected_accum);
16326
16327
16328 ------------------------------------------------------------------------------
16329 -- New Dimension Members
16330 ------------------------------------------------------------------------------
16331
16332 -- truncate the INTERIM tables in preparation for CALP processing
16333 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16334 truncate_calp_interim;
16335 END IF;
16336
16337 FEM_ENGINES_PKG.TECH_MESSAGE
16338 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16339
16340
16341 fem_multi_proc_pkg.MASTER
16342 (X_PRG_STAT => v_mp_prg_status
16343 ,X_EXCEPTION_CODE => v_mp_exception_code
16344 ,P_RULE_ID => p_object_id
16345 ,P_ENG_STEP => 'ALL'
16346 ,P_DATA_TABLE => v_source_b_table
16347 ,P_ENG_SQL => null
16348 ,P_TABLE_ALIAS => 'B'
16349 ,P_RUN_NAME => 'New_Members'
16350 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.New_Members'
16351 ,P_CONDITION => null
16352 ,P_FAILED_REQ_ID => null
16353 ,P_ARG1 => v_load_type
16354 ,P_ARG2 => p_dimension_varchar_label
16355 ,P_ARG3 => v_date_format_mask
16356 ,P_ARG4 => v_dimension_id
16357 ,P_ARG5 => v_target_b_table
16358 ,P_ARG6 => v_target_tl_table
16359 ,P_ARG7 => v_target_attr_table
16360 ,P_ARG8 => v_source_b_table
16361 ,P_ARG9 => v_source_tl_table
16362 ,P_ARG10 => v_source_attr_table
16363 ,P_ARG11 => v_table_handler_name
16364 ,P_ARG12 => v_member_col
16365 ,P_ARG13 => v_member_dc_col
16366 ,P_ARG14 => v_member_name_col
16367 ,P_ARG15 => v_member_t_dc_col
16368 ,P_ARG16 => v_member_t_name_col
16369 ,P_ARG17 => v_member_description_col
16370 ,P_ARG18 => v_value_set_required_flag
16371 ,P_ARG19 => v_simple_dimension_flag
16372 ,P_ARG20 => v_shared_dimension_flag
16373 ,P_ARG21 => v_hier_dimension_flag
16374 ,P_ARG22 => v_member_id_method_code
16375 ,P_ARG23 => v_exec_mode_clause
16376 ,P_ARG24 => p_master_request_id
16377 );
16378 FEM_ENGINES_PKG.TECH_MESSAGE
16379 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16380
16381
16382 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16383 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16384 null;
16385 ELSE
16386 RAISE e_terminate;
16387 END IF;
16388 END IF;
16389 -- accumulate rejected row count
16390 v_rows_loaded := 0; -- initializing this variable so we can use it to
16391 -- figure out if any new members were created
16392 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16393 FEM_ENGINES_PKG.TECH_MESSAGE
16394 (c_log_level_1,c_block||'.'||c_proc_name||
16395 '.v_rows_loaded',v_rows_loaded);
16396
16397 IF v_rows_loaded > 0 THEN
16398 raise_member_bus_event (p_dimension_varchar_label);
16399 END IF;
16400
16401 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16402 FEM_ENGINES_PKG.TECH_MESSAGE
16403 (c_log_level_1,c_block||'.'||c_proc_name||
16404 '.v_rows_rejected_accum',v_rows_rejected_accum);
16405 FEM_ENGINES_PKG.TECH_MESSAGE
16406 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16407
16408 FEM_ENGINES_PKG.TECH_MESSAGE
16409 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16410 --------------------------------------------------------------
16411 -- Perform the Date Overlap Check for CAL_PERIOD loads
16412 -- and move all valid new members into FEM
16413 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16414 calp_date_overlap_check(v_rows_rejected
16415 ,'NEW_MEMBERS');
16416 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16417
16418 fem_multi_proc_pkg.MASTER
16419 (X_PRG_STAT => v_mp_prg_status
16420 ,X_EXCEPTION_CODE => v_mp_exception_code
16421 ,P_RULE_ID => p_object_id
16422 ,P_ENG_STEP => 'ALL'
16423 ,P_DATA_TABLE => 'FEM_CALP_INTERIM_T'
16424 ,P_ENG_SQL => null
16425 ,P_TABLE_ALIAS => 'B'
16426 ,P_RUN_NAME => 'Post_Cal_Periods'
16427 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Post_Cal_Periods'
16428 ,P_CONDITION => null
16429 ,P_FAILED_REQ_ID => null
16430 ,P_ARG1 => 'NEW_MEMBERS'
16431 ,P_ARG2 => p_master_request_id);
16432
16433 FEM_ENGINES_PKG.TECH_MESSAGE
16434 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16435
16436 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16437 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16438 null;
16439 ELSE
16440 RAISE e_terminate;
16441 END IF;
16442 END IF;
16443
16444 -- accumulate rejected row count
16445 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16446 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16447 FEM_ENGINES_PKG.TECH_MESSAGE
16448 (c_log_level_1,c_block||'.'||c_proc_name||
16449 '.v_rows_rejected_accum',v_rows_rejected_accum);
16450
16451 FEM_ENGINES_PKG.TECH_MESSAGE
16452 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16453
16454 END IF; -- overlap check for CAL_PERIOD load
16455 --------------------------------------------------------------
16456
16457
16458 ----------------------------------------------------------------------------------
16459 -- Base_Update
16460 ----------------------------------------------------------------------------------
16461
16462
16463 FEM_ENGINES_PKG.TECH_MESSAGE
16464 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16465
16466 fem_multi_proc_pkg.MASTER
16467 (X_PRG_STAT => v_mp_prg_status
16468 ,X_EXCEPTION_CODE => v_mp_exception_code
16469 ,P_RULE_ID => p_object_id
16470 ,P_ENG_STEP => 'ALL'
16471 ,P_DATA_TABLE => v_source_b_table
16472 ,P_ENG_SQL => null
16473 ,P_TABLE_ALIAS => 'B'
16474 ,P_RUN_NAME => 'Base_Update'
16475 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Base_Update'
16476 ,P_CONDITION => null
16477 ,P_FAILED_REQ_ID => null
16478 ,P_ARG1 => v_load_type
16479 ,P_ARG2 => p_dimension_varchar_label
16480 ,P_ARG3 => v_simple_dimension_flag
16481 ,P_ARG4 => v_shared_dimension_flag
16482 ,P_ARG5 => v_dimension_id
16483 ,P_ARG6 => v_value_set_required_flag
16484 ,P_ARG7 => v_hier_table_name
16485 ,P_ARG8 => v_hier_dimension_flag
16486 ,P_ARG9 => v_source_b_table
16487 ,P_ARG10 => v_target_b_table
16488 ,P_ARG11 => v_member_dc_col
16489 ,P_ARG12 => v_member_t_dc_col
16490 ,P_ARG13 => v_member_col
16491 ,P_ARG14 => v_exec_mode_clause
16492 ,P_ARG15 => p_master_request_id
16493 );
16494 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16495 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16496 null;
16497 ELSE
16498 RAISE e_terminate;
16499 END IF;
16500 END IF;
16501
16502 FEM_ENGINES_PKG.TECH_MESSAGE
16503 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16504
16505 -- accumulate rejected row count
16506 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16507 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16508 FEM_ENGINES_PKG.TECH_MESSAGE
16509 (c_log_level_1,c_block||'.'||c_proc_name||
16510 '.v_rows_rejected_accum',v_rows_rejected_accum);
16511 --END IF; -- simple dim = 'N' (for Base Update)
16512
16513 ------------------------------------------------------------------------------
16514 -- Update Name/Descriptions for existing Members
16515 ------------------------------------------------------------------------------
16516
16517 FEM_ENGINES_PKG.TECH_MESSAGE
16518 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16519
16520 fem_multi_proc_pkg.MASTER
16521 (X_PRG_STAT => v_mp_prg_status
16522 ,X_EXCEPTION_CODE => v_mp_exception_code
16523 ,P_RULE_ID => p_object_id
16524 ,P_ENG_STEP => 'ALL'
16525 ,P_DATA_TABLE => v_source_tl_table
16526 ,P_ENG_SQL => null
16527 ,P_TABLE_ALIAS => 'B'
16528 ,P_RUN_NAME => 'TL_Update'
16529 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.TL_Update'
16530 ,P_CONDITION => null
16531 ,P_FAILED_REQ_ID => null
16532 ,P_ARG1 => v_load_type
16533 ,P_ARG2 => p_dimension_varchar_label
16534 ,P_ARG3 => v_dimension_id
16535 ,P_ARG4 => v_target_b_table
16536 ,P_ARG5 => v_target_tl_table
16537 ,P_ARG6 => v_source_b_table
16538 ,P_ARG7 => v_source_tl_table
16539 ,P_ARG8 => v_member_col
16540 ,P_ARG9 => v_member_dc_col
16541 ,P_ARG10 => v_member_name_col
16542 ,P_ARG11 => v_member_t_dc_col
16543 ,P_ARG12 => v_member_t_name_col
16544 ,P_ARG13 => v_member_description_col
16545 ,P_ARG14 => v_value_set_required_flag
16546 ,P_ARG15 => v_simple_dimension_flag
16547 ,P_ARG16 => v_shared_dimension_flag
16548 ,P_ARG17 => v_hier_dimension_flag
16549 ,P_ARG18 => v_exec_mode_clause
16550 ,P_ARG19 => p_master_request_id
16551 );
16552 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16553 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16554 null;
16555 ELSE
16556 RAISE e_terminate;
16557 END IF;
16558 END IF;
16559
16560 FEM_ENGINES_PKG.TECH_MESSAGE
16561 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16562
16563 -- accumulate rejected row count
16564 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16565 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16566 FEM_ENGINES_PKG.TECH_MESSAGE
16567 (c_log_level_1,c_block||'.'||c_proc_name||
16568 '.v_rows_rejected_accum',v_rows_rejected_accum);
16569
16570 ------------------------------------------------------------------------------
16571 -- Pre_Validation_Attr
16572 --This step identifies bad attr records (only run for Simple_dim='N'
16573 ------------------------------------------------------------------------------
16574 IF (v_simple_dimension_flag = 'N') THEN
16575 FEM_ENGINES_PKG.TECH_MESSAGE
16576 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Pre_Validation_Attr',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16577
16578 fem_multi_proc_pkg.MASTER
16579 (X_PRG_STAT => v_mp_prg_status
16580 ,X_EXCEPTION_CODE => v_mp_exception_code
16581 ,P_RULE_ID => p_object_id
16582 ,P_ENG_STEP => 'ALL'
16583 ,P_DATA_TABLE => v_source_attr_table
16584 ,P_ENG_SQL => null
16585 ,P_TABLE_ALIAS => 'B'
16586 ,P_RUN_NAME => 'Pre_Validation_Attr'
16587 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Pre_Validation_Attr'
16588 ,P_CONDITION => null
16589 ,P_FAILED_REQ_ID => null
16590 ,P_ARG1 => v_load_type
16591 ,P_ARG2 => p_dimension_varchar_label
16592 ,P_ARG3 => v_dimension_id
16593 ,P_ARG4 => v_source_b_table
16594 ,P_ARG5 => v_source_tl_table
16595 ,P_ARG6 => v_source_attr_table
16596 ,P_ARG7 => v_target_b_table
16597 ,P_ARG8 => v_member_t_dc_col
16598 ,P_ARG9 => v_member_dc_col
16599 ,P_ARG10 => v_value_set_required_flag
16600 ,P_ARG11 => v_simple_dimension_flag
16601 ,P_ARG12 => v_shared_dimension_flag
16602 ,P_ARG13 => v_hier_dimension_flag
16603 ,P_ARG14 => v_exec_mode_clause
16604 ,P_ARG15 => p_master_request_id
16605 );
16606 FEM_ENGINES_PKG.TECH_MESSAGE
16607 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16608
16609 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16610 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16611 null;
16612 ELSE
16613 RAISE e_terminate;
16614 END IF;
16615 END IF;
16616
16617 FEM_ENGINES_PKG.TECH_MESSAGE
16618 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Pre_Validation_Attr',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16619
16620 -- accumulate rejected row count
16621 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16622 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16623 FEM_ENGINES_PKG.TECH_MESSAGE
16624 (c_log_level_1,c_block||'.'||c_proc_name||
16625 '.v_rows_rejected_accum',v_rows_rejected_accum);
16626
16627 ----------------------------------------------------------------------------------
16628 -- Update attributes
16629 ----------------------------------------------------------------------------------
16630
16631 -- truncate the INTERIM tables in preparation for CALP processing
16632 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16633 truncate_calp_interim;
16634 END IF;
16635
16636 FEM_ENGINES_PKG.TECH_MESSAGE
16637 (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Attr_Assign_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16638
16639 fem_multi_proc_pkg.MASTER
16640 (X_PRG_STAT => v_mp_prg_status
16641 ,X_EXCEPTION_CODE => v_mp_exception_code
16642 ,P_RULE_ID => p_object_id
16643 ,P_ENG_STEP => 'ALL'
16644 ,P_DATA_TABLE => v_source_attr_table
16645 ,P_ENG_SQL => null
16646 ,P_TABLE_ALIAS => 'B'
16647 ,P_RUN_NAME => 'Attr_Assign_Update'
16648 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Attr_Assign_Update'
16649 ,P_CONDITION => null
16650 ,P_FAILED_REQ_ID => null
16651 -- ,P_REUSE_SLICES => 'R'
16652 ,P_ARG1 => p_dimension_varchar_label
16653 ,P_ARG2 => v_date_format_mask
16654 ,P_ARG3 => v_dimension_id
16655 ,P_ARG4 => v_target_b_table
16656 ,P_ARG5 => v_target_attr_table
16657 ,P_ARG6 => v_source_b_table
16658 ,P_ARG7 => v_source_attr_table
16659 ,P_ARG8 => v_member_col
16660 ,P_ARG9 => v_member_dc_col
16661 ,P_ARG10 => v_member_t_dc_col
16662 ,P_ARG11 => v_value_set_required_flag
16663 ,P_ARG12 => v_hier_dimension_flag
16664 ,P_ARG13 => v_simple_dimension_flag
16665 ,P_ARG14 => v_shared_dimension_flag
16666 ,P_ARG15 => v_exec_mode_clause
16667 ,P_ARG16 => p_master_request_id
16668 );
16669 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16670 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16671 null;
16672 ELSE
16673 RAISE e_terminate;
16674 END IF;
16675 END IF;
16676
16677 -- accumulate rejected row count
16678 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16679 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16680 FEM_ENGINES_PKG.TECH_MESSAGE
16681 (c_log_level_1,c_block||'.'||c_proc_name||
16682 '.v_rows_rejected_accum',v_rows_rejected_accum);
16683
16684 FEM_ENGINES_PKG.TECH_MESSAGE
16685 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Attr_Assign',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16686
16687 FEM_ENGINES_PKG.TECH_MESSAGE
16688 (c_log_level_3,c_block||'.'||c_proc_name||'.Begin Attr Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16689
16690 --------------------------------------------------------------
16691 -- Perform the Date Overlap Check for CAL_PERIOD loads
16692 -- and update valid START_DATE attributes in FEM
16693 IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16694 calp_date_overlap_check(v_rows_rejected
16695 ,'ATTR_ASSIGN_UPDATE');
16696 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16697
16698 fem_multi_proc_pkg.MASTER
16699 (X_PRG_STAT => v_mp_prg_status
16700 ,X_EXCEPTION_CODE => v_mp_exception_code
16701 ,P_RULE_ID => p_object_id
16702 ,P_ENG_STEP => 'ALL'
16703 ,P_DATA_TABLE => v_source_attr_table
16704 ,P_ENG_SQL => null
16705 ,P_TABLE_ALIAS => 'B'
16706 ,P_RUN_NAME => 'Post_Cal_Periods'
16707 ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Post_Cal_Periods'
16708 ,P_CONDITION => null
16709 ,P_FAILED_REQ_ID => null
16710 ,P_ARG1 => 'ATTR_ASSIGN_UPDATE'
16711 ,P_ARG2 => p_master_request_id);
16712
16713 FEM_ENGINES_PKG.TECH_MESSAGE
16714 (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16715
16716 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16717 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16718 null;
16719 ELSE
16720 RAISE e_terminate;
16721 END IF;
16722 END IF;
16723 -- accumulate rejected row count
16724 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16725 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16726 FEM_ENGINES_PKG.TECH_MESSAGE
16727 (c_log_level_1,c_block||'.'||c_proc_name||
16728 '.v_rows_rejected_accum',v_rows_rejected_accum);
16729 FEM_ENGINES_PKG.TECH_MESSAGE
16730 (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Attr Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16731
16732 END IF; -- overlap check for CAL_PERIOD load
16733
16734 --------------------------------------------------------------
16735
16736 END IF; -- Simple Dimension Flag = 'N' (for Attr validation and Attr Update)
16737
16738 ----------------------------------------------------------------------------------
16739 -- Post Dimension Member load status to FEM_DIM_LOAD_STATUS
16740 ----------------------------------------------------------------------------------
16741 IF v_simple_dimension_flag = 'N' THEN
16742 v_src_sys_last_row := NVL(tg_src_system_dc.LAST,0);
16743 FEM_ENGINES_PKG.TECH_MESSAGE
16744 (c_log_level_1,c_block||'.'||c_proc_name||'.Step10.v_src_sys_last_row'
16745 ,v_src_sys_last_row);
16746
16747 FOR i IN 1..v_src_sys_last_row
16748 LOOP
16749 FEM_ENGINES_PKG.TECH_MESSAGE
16750 (c_log_level_1,c_block||'.'||c_proc_name||'.Step10.tg_src_system_dc'
16751 ,tg_src_system_dc(i));
16752
16753 Post_dim_status (v_dimension_id
16754 ,tg_src_system_dc(i)
16755 ,v_source_attr_table);
16756 END LOOP;
16757 END IF; -- src_system Post_dim_status
16758
16759 x_rows_rejected_accum := v_rows_rejected_accum;
16760 FEM_ENGINES_PKG.TECH_MESSAGE
16761 (c_log_level_1,c_block||'.'||c_proc_name||
16762 '.x_rows_rejected_accum',x_rows_rejected_accum);
16763
16764 -----------------------------------------------------------------------------------
16765 -- Close any open cursors
16766 -----------------------------------------------------------------------------------
16767 IF cv_get_src_sys%ISOPEN THEN
16768 CLOSE cv_get_src_sys;
16769 END IF;
16770
16771
16772 --------------------------------------------------------------------------
16773 -- The following piece of code is for loading
16774 -- Composite Dimensions
16775 --------------------------------------------------------------------------
16776
16777
16778 ELSIF v_composite_dimension_flag = 'Y' THEN
16779
16780
16781 fem_engines_pkg.tech_message(
16782 p_severity => c_log_level_2
16783 ,p_module => c_block||'.'||c_proc_name||'.Before Process_Rows'
16784 ,p_msg_text => 'Calling Process_Rows via MP Framework');
16785
16786 --------------------------------------------------------------------------
16787 -- This procedure calls the MP Engine for the proc 'Process_rows'
16788 --------------------------------------------------------------------------
16789
16790 fem_multi_proc_pkg.MASTER
16791 (X_PRG_STAT => v_mp_prg_status
16792 ,X_EXCEPTION_CODE => v_mp_exception_code
16793 ,P_RULE_ID => p_object_id
16794 ,P_ENG_STEP => 'ALL'
16795 ,P_DATA_TABLE => v_source_b_table
16796 ,P_ENG_SQL => g_select_statement
16797 ,P_TABLE_ALIAS => 'B'
16798 ,P_RUN_NAME => 'Process_Rows'
16799 ,P_ENG_PRG => 'FEM_COMP_DIM_MEMBER_LOADER_PKG.Process_Rows'
16800 ,P_CONDITION => null
16801 ,P_FAILED_REQ_ID => null
16802 ,P_ARG1 => p_dimension_varchar_label
16803 ,P_ARG2 => p_execution_mode
16804 ,P_ARG3 => v_structure_id
16805 ,P_ARG4 => p_master_request_id);
16806 --Bug#4736810
16807 get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16808 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16809 x_rows_rejected_accum := v_rows_rejected_accum;
16810
16811 fem_engines_pkg.tech_message(
16812 p_severity => c_log_level_5
16813 ,p_module => c_block||'.'||c_proc_name||'.After Process_Rows'
16814 ,p_msg_text => 'Process_Rows Status '||v_mp_prg_status||
16815 'Process_Rows Err Code '||v_mp_exception_code);
16816
16817 --------------------------------------------------------------------------
16818 -- Check for the MP error message from process_rows
16819 --------------------------------------------------------------------------
16820
16821 IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16822
16823 IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16824
16825 fem_engines_pkg.tech_message(
16826 p_severity => c_log_level_1
16827 ,p_module => c_block||'.'||c_proc_name||'.After Process_Rows'
16828 ,p_msg_text => 'Process_Rows Error '||v_mp_exception_code);
16829
16830 ELSE
16831
16832 RAISE e_terminate;
16833
16834 END IF;
16835
16836 END IF;
16837
16838
16839 fem_engines_pkg.tech_message(
16840 p_severity => c_log_level_1
16841 ,p_module => c_block||'.'||c_proc_name||'.After Process_Rows'
16842 ,p_msg_text => 'End of Process_Rows');
16843
16844 END IF;
16845
16846
16847 --COMMIT;
16848
16849
16850
16851 --------------------------------------------------------------------------------
16852 -- Load Dimension
16853 -- Exception Block
16854 --------------------------------------------------------------------------------
16855
16856 EXCEPTION
16857 WHEN e_terminate THEN
16858
16859 fem_engines_pkg.tech_message(
16860 p_severity => c_log_level_4
16861 ,p_module => c_block||'.'||c_proc_name||'. Load_Dimension'
16862 ,p_msg_text => 'Process_Rows Error '||v_mp_exception_code);
16863
16864 RAISE e_main_terminate;
16865
16866 WHEN e_exec_lock_exists THEN
16867 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
16868 IF v_num_msg > 0 THEN
16869 FOR i IN 1 .. v_num_msg LOOP
16870 FEM_ENGINES_PKG.User_Message
16871 (p_msg_text => FND_MSG_PUB.Get(p_encoded => 'F'));
16872 END LOOP;
16873 END IF;
16874
16875 FEM_ENGINES_PKG.TECH_MESSAGE
16876 (p_severity => c_log_level_5
16877 ,p_module => c_block||'.'||c_proc_name||'.Exception'
16878 ,p_app_name => c_fem
16879 ,p_msg_name => G_EXEC_LOCK_EXISTS
16880 ,P_TOKEN1 => 'OBJECT_ID'
16881 ,P_VALUE1 => v_object_id);
16882
16883 FEM_ENGINES_PKG.USER_MESSAGE
16884 (P_APP_NAME => c_fem
16885 ,P_MSG_NAME => G_EXEC_LOCK_EXISTS
16886 ,P_TOKEN1 => 'OBJECT_ID'
16887 ,P_VALUE1 => v_object_id);
16888
16889
16890 WHEN OTHERS THEN
16891 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
16892 gv_prg_msg := sqlerrm;
16893 gv_callstack := dbms_utility.format_call_stack;
16894
16895 FEM_ENGINES_PKG.TECH_MESSAGE
16896 (p_severity => c_log_level_6
16897 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
16898 ,p_msg_text => gv_prg_msg);
16899
16900 FEM_ENGINES_PKG.TECH_MESSAGE
16901 (p_severity => c_log_level_6
16902 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
16903 ,p_msg_text => gv_callstack);
16904
16905 FEM_ENGINES_PKG.USER_MESSAGE
16906 (p_app_name => c_fem
16907 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
16908 ,P_TOKEN1 => 'ERR_MSG'
16909 ,P_VALUE1 => gv_prg_msg);
16910
16911 -- FEM_ENGINES_PKG.USER_MESSAGE
16912 -- (p_app_name => c_fem
16913 -- ,p_msg_text => gv_prg_msg);
16914
16915 RAISE e_main_terminate;
16916
16917 END Load_Dimension;
16918
16919
16920
16921 /*===========================================================================+
16922 | PROCEDURE
16923 | Main
16924 |
16925 | DESCRIPTION
16926 | Main engine procedure for loading dimension members
16927 | and attribute assignments into FEM
16928 |
16929 |
16930 |
16931 | SCOPE - PUBLIC
16932 |
16933 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
16934 |
16935 | ARGUMENTS : IN:
16936 |
16937 | OUT:
16938 |
16939 | IN/ OUT:
16940 |
16941 | RETURNS : NONE
16942 |
16943 | NOTES
16944 | This procedure is called by Concurrent Manager when the loader is launched
16945 | It performs the following:
16946 | 1) Validates the parameters passed by CM
16947 | 2) Obtains the associated object_Definition_id and dimension_Varchar_label
16948 | for the dimension_id passed in as a parm
16949 | 3) Registers the Process Execution
16950 | 4) Loads the dimension
16951 |
16952 | HISTORY
16953 | 5/31/2005 Rob Flippo Bug#3923485 Removed p_date_format_mask input parm
16954 | now using ICX: Date Format Mask profile option
16955 ===========================================================================*/
16956 PROCEDURE Main (
16957 errbuf OUT NOCOPY VARCHAR2
16958 ,retcode OUT NOCOPY VARCHAR2
16959 ,p_execution_mode IN VARCHAR2
16960 ,p_dimension_id IN NUMBER
16961 )
16962
16963 IS
16964
16965 -- Nested Procedure declarations
16966 PROCEDURE Get_Object_Def (p_dimension_id IN NUMBER
16967 ,x_object_definition_id OUT NOCOPY NUMBER
16968 ,x_dimension_varchar_label OUT NOCOPY VARCHAR2);
16969
16970 -- Constants for body of Main
16971 c_proc_name VARCHAR2(30) := 'Main';
16972
16973 -- Variables for body of Main
16974 v_completion_status VARCHAR2(30);
16975 v_object_id NUMBER(9);
16976 v_object_definition_id NUMBER(9);
16977 v_dimension_varchar_label VARCHAR2(30);
16978 v_pl_status VARCHAR2(30);
16979 v_rows_rejected NUMBER :=0;
16980 v_rows_rejected_accum NUMBER :=0;
16981 v_rows_to_load NUMBER :=0;
16982 v_rows_to_load_accum NUMBER :=0;
16983 v_bulk_rows_rejected NUMBER :=0;
16984
16985 v_obj_def_display_name VARCHAR2(150); -- used when terminating and want to show
16986 -- the type of load in the log
16987
16988 /*************************************************
16989 obsolete variables
16990 -- these are variables for counting from fem_simple_dims_b_t/tl_t
16991 -- to see if there are any rows for loading
16992 v_source_b_count NUMBER :=0;
16993 v_source_tl_count NUMBER :=0;
16994 v_source_count_accum NUMBER :=0;
16995
16996 -- Variables to determine valid Simple Dimensions for loading
16997 -- when loading from the Object = "Simple Dimensions"
16998 v_hier_editor_managed_flag VARCHAR2(1);
16999 v_xdim_read_only_flag VARCHAR2(1);
17000 v_value_set_required_flag VARCHAR2(1);
17001 v_simple_dimension_flag VARCHAR2(1);
17002 ****************************************************/
17003
17004 v_msg_count NUMBER;
17005 v_sec_folder_count NUMBER; -- used to see if user has privs to the Integrations folder
17006 v_msg_data VARCHAR2(4000);
17007 v_API_return_status VARCHAR2(30);
17008 v_sec_folder_name VARCHAR2(150); -- folder name that the user must have privs in
17009
17010 ----------------------------------------------------------------
17011 -- Nested Procedure bodies
17012 ----------------------------------------------------------------
17013
17014 -- Get_Object Def
17015 -- This procedure gets Object Definition associated with the dimension.
17016 -- Each dimension has a hard-coded associated object_definition where the
17017 -- MP settings are located.
17018 -- This procedure also gets the Dimension Varchar label for the dimension
17019 -- being loaded so that we can use that to identify the dimension in the code
17020 -- rather than the _ID
17021 --
17022 PROCEDURE Get_Object_Def (p_dimension_id IN NUMBER
17023 ,x_object_definition_id OUT NOCOPY NUMBER
17024 ,x_dimension_varchar_label OUT NOCOPY VARCHAR2)
17025
17026 IS
17027
17028 BEGIN
17029
17030 BEGIN
17031 SELECT loader_object_def_id, dimension_varchar_label
17032 INTO x_object_definition_id, x_dimension_varchar_label
17033 FROM fem_xdim_dimensions_vl
17034 WHERE dimension_id = p_dimension_id;
17035
17036 IF x_object_definition_id IS NULL THEN
17037 RAISE e_dim_load_not_enabled;
17038 END IF;
17039 EXCEPTION
17040 WHEN no_data_found THEN
17041 raise e_dimension_not_found;
17042 END;
17043 EXCEPTION
17044 WHEN e_dimension_not_found THEN
17045
17046 FEM_ENGINES_PKG.TECH_MESSAGE
17047 (p_severity => c_log_level_5
17048 ,p_module => c_block||'.'||c_proc_name||'.Exception'
17049 ,p_app_name => c_fem
17050 ,p_msg_name => G_DIM_NOT_FOUND);
17051
17052 FEM_ENGINES_PKG.USER_MESSAGE
17053 (p_app_name => c_fem
17054 ,p_msg_name => G_DIM_NOT_FOUND);
17055
17056 RAISE e_main_terminate;
17057
17058 WHEN e_dim_load_not_enabled THEN
17059
17060 FEM_ENGINES_PKG.TECH_MESSAGE
17061 (p_severity => c_log_level_5
17062 ,p_module => c_block||'.'||c_proc_name||'.Exception'
17063 ,p_app_name => c_fem
17064 ,p_msg_name => G_INVALID_SIMPLE_DIM);
17065
17066 FEM_ENGINES_PKG.USER_MESSAGE
17067 (p_app_name => c_fem
17068 ,p_msg_name => G_INVALID_SIMPLE_DIM);
17069
17070 RAISE e_main_terminate;
17071
17072
17073 END Get_Object_Def;
17074
17075 ---------------------------------------------------------------------------
17076 -- Main body of the "Main" procedure
17077 ---------------------------------------------------------------------------
17078 BEGIN
17079
17080 -- Get the OBject Definition ID and the label of the dimension_id to be loaded
17081 Get_Object_Def (p_dimension_id
17082 ,v_object_definition_id
17083 ,v_dimension_varchar_label);
17084
17085 -- Get Object ID
17086 BEGIN
17087 SELECT object_id
17088 INTO v_object_id
17089 FROM fem_object_definition_b
17090 WHERE object_definition_id = v_object_definition_id
17091 AND object_id IN (SELECT object_id FROM fem_object_catalog_b
17092 WHERE object_type_code = 'DIM_MEMBER_LOADER');
17093 EXCEPTION
17094 WHEN no_data_found THEN
17095 RAISE e_invalid_obj_def;
17096 END;
17097 -----------------------------------------------------
17098 -- Validate Security - does user have privs to the Integrations folder
17099 -----------------------------------------------------
17100 SELECT count(*)
17101 INTO v_sec_folder_count
17102 FROM fem_user_folders
17103 WHERE user_id=c_user_id
17104 AND folder_id=1000;
17105
17106 IF v_sec_folder_count = 0 THEN
17107 RAISE e_no_folder_privs;
17108 END IF;
17109
17110
17111
17112 -----------------------------------------------------
17113 -- Validate the execution mode
17114 -----------------------------------------------------
17115 IF p_execution_mode NOT IN ('S','E') THEN
17116 RAISE e_invalid_exec_mode;
17117 END IF;
17118 -----------------------------------------------------
17119
17120
17121 Register_process_execution (v_object_id
17122 ,v_object_definition_id
17123 ,p_execution_mode
17124 ,v_completion_status);
17125
17126 IF v_pl_status IN ('ERROR') THEN
17127 raise e_pl_registration_failed;
17128 END IF;
17129
17130 Load_Dimension (
17131 v_rows_rejected
17132 ,v_rows_to_load
17133 ,p_execution_mode
17134 ,v_object_id
17135 ,v_object_definition_id
17136 ,v_dimension_varchar_label
17137 ,gv_request_id);
17138
17139 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
17140 v_rows_to_load_accum := v_rows_to_load_accum + v_rows_to_load;
17141
17142
17143 /*****************************************************************
17144 Obsolete code for updating rows in a shared interface table
17145 when the dimension is invalid. In this case, we are not
17146 updating the records with a STATUS
17147 FOR dim IN cv_dimension LOOP
17148 v_dimension_varchar_label := dim.dimension_varchar_label;
17149 FEM_ENGINES_PKG.TECH_MESSAGE
17150 (c_log_level_1,c_block||'.'||c_proc_name||'.dimension'
17151 ,v_dimension_varchar_label);
17152
17153
17154 -- Only process simple dims that are Value Set = N and
17155 -- Hier Edtitor Managed Flag = 'Y'. All other records
17156 -- in FEM_SIMPLE_DIMS_B_T/TL_T will be updated with
17157 -- INVALID_SIMPLE_DIM status
17158 BEGIN
17159 SELECT X.hier_editor_managed_flag
17160 ,X.read_only_flag
17161 ,X.value_set_required_flag
17162 ,X.simple_dimension_flag
17163 INTO v_hier_editor_managed_flag
17164 ,v_xdim_read_only_flag
17165 ,v_value_set_required_flag
17166 ,v_simple_dimension_flag
17167 FROM fem_xdim_dimensions X, fem_dimensions_b B
17168 WHERE B.dimension_varchar_label = v_dimension_varchar_label
17169 AND B.dimension_id = X.dimension_id;
17170 EXCEPTION
17171 WHEN no_data_found THEN
17172 v_simple_dimension_flag := 'N';
17173 v_value_set_required_flag := 'N';
17174 v_xdim_read_only_flag := 'Y';
17175 v_hier_editor_managed_flag := 'N';
17176
17177 END; -- sub block
17178
17179 IF (v_simple_dimension_flag = 'Y') AND
17180 (v_value_set_required_flag = 'N') AND
17181 (v_xdim_read_only_flag = 'N') AND
17182 (v_hier_editor_managed_flag = 'Y') THEN
17183
17184 Load_Dimension (
17185 v_rows_rejected
17186 ,v_rows_to_load
17187 ,p_execution_mode
17188 ,v_object_id
17189 ,p_object_definition_id
17190 ,v_dimension_varchar_label
17191 ,p_date_format_mask);
17192
17193 v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
17194 v_rows_to_load_accum := v_rows_to_load_accum + v_rows_to_load;
17195 ELSE
17196 UPDATE fem_simple_dims_b_t
17197 SET STATUS = 'INVALID_SIMPLE_DIM'
17198 WHERE dimension_varchar_label = v_dimension_varchar_label;
17199
17200 v_bulk_rows_rejected := SQL%ROWCOUNT;
17201 v_rows_rejected_accum := v_rows_rejected_accum + v_bulk_rows_rejected;
17202 -- rows to load gets incremented because these invalid_simple_dim rows
17203 -- don't appear in the original total since they don't belong to a legal
17204 -- dimension
17205 v_rows_to_load_accum := v_rows_to_load_accum + v_bulk_rows_rejected;
17206 UPDATE fem_simple_dims_tl_t
17207 SET STATUS = 'INVALID_SIMPLE_DIM'
17208 WHERE dimension_varchar_label = v_dimension_varchar_label;
17209
17210 v_bulk_rows_rejected := SQL%ROWCOUNT;
17211 v_rows_rejected_accum := v_rows_rejected_accum + v_bulk_rows_rejected;
17212 -- rows to load gets incremented because these invalid_simple_dim rows
17213 -- don't appear in the original total since they don't belong to a legal
17214 -- dimension
17215 v_rows_to_load_accum := v_rows_to_load_accum + v_bulk_rows_rejected;
17216
17217 COMMIT;
17218 END IF;
17219 END LOOP;
17220 *******************************************************************/
17221 ----------------------------------------------------------------------------------
17222 -- Engine Master Post Processing
17223 -- This step updates the status tables with number of rows processed,
17224 -- number of error rows, etc.
17225 ----------------------------------------------------------------------------------
17226 FEM_ENGINES_PKG.TECH_MESSAGE
17227 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected_accum',v_rows_rejected_accum);
17228
17229 FEM_ENGINES_PKG.TECH_MESSAGE
17230 (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_to_load_accum',v_rows_to_load_accum);
17231
17232 Eng_Master_Post_Proc (v_object_id
17233 ,v_rows_rejected_accum
17234 ,v_rows_to_load_accum);
17235
17236
17237 EXCEPTION
17238 WHEN e_no_folder_privs THEN
17239
17240 SELECT folder_name
17241 INTO v_sec_folder_name
17242 FROM fem_folders_vl
17243 WHERE folder_id=1000;
17244
17245
17246 FEM_ENGINES_PKG.TECH_MESSAGE
17247 (p_severity => c_log_level_5
17248 ,p_module => c_block||'.'||c_proc_name||'.Exception'
17249 ,p_app_name => c_fem
17250 ,p_msg_name => G_NO_FOLDER_PRIVS
17251 ,P_TOKEN1 => 'FOLDER'
17252 ,P_VALUE1 => v_sec_folder_name);
17253
17254 FEM_ENGINES_PKG.USER_MESSAGE
17255 (p_app_name => c_fem
17256 ,p_msg_name => G_NO_FOLDER_PRIVS
17257 ,P_TOKEN1 => 'FOLDER'
17258 ,P_VALUE1 => v_sec_folder_name);
17259
17260 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17261
17262 WHEN e_invalid_exec_mode THEN
17263
17264 FEM_ENGINES_PKG.TECH_MESSAGE
17265 (p_severity => c_log_level_5
17266 ,p_module => c_block||'.'||c_proc_name||'.Exception'
17267 ,p_app_name => c_fem
17268 ,p_msg_name => G_INVALID_EXEC_MODE);
17269
17270 FEM_ENGINES_PKG.USER_MESSAGE
17271 (p_app_name => c_fem
17272 ,p_msg_name => G_INVALID_EXEC_MODE);
17273
17274 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17275
17276 WHEN e_main_terminate THEN
17277
17278 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17279
17280 FEM_PL_PKG.Update_Obj_Exec_Status(
17281 P_API_VERSION => c_api_version,
17282 P_COMMIT => c_true,
17283 P_REQUEST_ID => gv_request_id,
17284 P_OBJECT_ID => v_object_id,
17285 P_EXEC_STATUS_CODE => 'ERROR_RERUN',
17286 P_USER_ID => gv_apps_user_id,
17287 P_LAST_UPDATE_LOGIN => null,
17288 X_MSG_COUNT => v_msg_count,
17289 X_MSG_DATA => v_msg_data,
17290 X_RETURN_STATUS => v_API_return_status);
17291
17292 ---------------------------
17293 -- Update Request Status --
17294 ---------------------------
17295 FEM_PL_PKG.Update_Request_Status(
17296 P_API_VERSION => c_api_version,
17297 P_COMMIT => c_true,
17298 P_REQUEST_ID => gv_request_id,
17299 P_EXEC_STATUS_CODE => 'ERROR_RERUN',
17300 P_USER_ID => gv_apps_user_id,
17301 P_LAST_UPDATE_LOGIN => null,
17302 X_MSG_COUNT => v_msg_count,
17303 X_MSG_DATA => v_msg_data,
17304 X_RETURN_STATUS => v_API_return_status);
17305
17306 WHEN e_invalid_obj_def THEN
17307
17308 FEM_ENGINES_PKG.TECH_MESSAGE
17309 (p_severity => c_log_level_5
17310 ,p_module => c_block||'.'||c_proc_name||'.Exception'
17311 ,p_app_name => c_fem
17312 ,p_msg_name => G_INVALID_OBJ_DEF);
17313
17314 FEM_ENGINES_PKG.USER_MESSAGE
17315 (p_app_name => c_fem
17316 ,p_msg_name => G_INVALID_OBJ_DEF
17317 ,P_TOKEN1 => 'OBJECT'
17318 ,P_VALUE1 => null);
17319
17320 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17321
17322 WHEN e_pl_registration_failed THEN
17323
17324 -- User and Tech messages have already been posted, so do nothing
17325 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17326
17327 WHEN OTHERS THEN
17328
17329 gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17330 gv_prg_msg := sqlerrm;
17331 gv_callstack := dbms_utility.format_call_stack;
17332
17333 FEM_ENGINES_PKG.TECH_MESSAGE
17334 (p_severity => c_log_level_6
17335 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
17336 ,p_msg_text => gv_prg_msg);
17337
17338 FEM_ENGINES_PKG.TECH_MESSAGE
17339 (p_severity => c_log_level_6
17340 ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
17341 ,p_msg_text => gv_callstack);
17342
17343 FEM_ENGINES_PKG.USER_MESSAGE
17344 (p_app_name => c_fem
17345 ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
17346 ,P_TOKEN1 => 'ERR_MSG'
17347 ,P_VALUE1 => gv_prg_msg);
17348 /*
17349 FEM_ENGINES_PKG.USER_MESSAGE
17350 (p_app_name => c_fem
17351 ,p_msg_text => gv_prg_msg); */
17352
17353
17354 END Main;
17355
17356 /***************************************************************************/
17357
17358 END FEM_DIM_MEMBER_LOADER_PKG;