DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_DIMENSION_EDIT

Source


1 package body bsc_dimension_edit as
2 /* $Header: BSCEDITB.pls 120.4 2007/02/08 09:41:57 ankgoel ship $*/
3 /*===========================================================================+
4  |               Copyright (c) 1995 Oracle Corporation                       |
5  |                  Redwood Shores, California, USA                          |
6  |                       All rights reserved.                                |
7  | FILENAME                                                                  |
8  |      BSCEDITB.pls                                                         |
9  |                                                                           |
10  | DESCRIPTION                                                               |
11  |   Package for backend logic of BSC edit dimension page.                   |
12  |           20-Aug-03   Adeulgao fixed bug#3008243 eliminated hard coding   |
13  |                      of schema name                                       |
14  | 04-NOV-2003 PAJOHRI  Bug #3232366                                         |
15  | 07-Jan-04 SMULYE    Bug 3343979  Fixed API Delete_Codes_CascadeMN to      |
16  |  delete  only from base tables , not system tables.			     |
17  |									     |
18  | 14-Jan-04 MREZA	Bug 3363584 Fixed API checkUsercodeChange to	     |
19  |			increase width of l_old_user_code.		     |
20  | 16-NOV-2006 ankgoel  Color By KPI enh#5244136                             |
21  |									     |
22  +==========================================================================+*/
23 
24 h_installed_languages BSC_UPDATE_UTIL.t_array_of_varchar2;
25 h_num_installed_languages NUMBER;
26 
27 CURSOR LEVEL is
28  SELECT DISTINCT L.DIM_LEVEL_ID, D.LEVEL_TABLE_NAME
29     FROM BSC_SYS_COM_DIM_LEVELS L, BSC_SYS_DIM_LEVELS_B D
30     WHERE L.DIM_LEVEL_ID = D.DIM_LEVEL_ID;
31 
32 CURSOR CHILD (l_table_name varchar2) is
33      SELECT T.LEVEL_TABLE_NAME AS CHILDTABLE , P.level_pk_col
34      FROM BSC_SYS_DIM_LEVELS_B T, BSC_SYS_DIM_LEVEL_RELS R, BSC_SYS_DIM_LEVELS_B P
35    WHERE T.DIM_LEVEL_ID = R.DIM_LEVEL_ID
36      and R.PARENT_DIM_LEVEL_ID =P.dim_level_id
37         AND R.RELATION_TYPE = 1
38         and P.level_table_name=l_table_name;
39 
40 UNIQUE_CONSTRAINT_VIOLATED exception;
41 
42 procedure security_sync is
43 l_stmt varchar2(3000);
44 L_LEVEL_ID NUMBER;
45 L_TABLE_NAME VARCHAR2(30);
46 e_unexpected_error EXCEPTION;
47 begin
48         IF (LEVEL%isopen) THEN
49                 close LEVEL;
50         END IF;
51         open LEVEL;
52         LOOP
53          fetch LEVEL into L_LEVEL_ID, L_TABLE_NAME;
54          exit when LEVEL%notfound;
55          l_stmt:='DELETE FROM BSC_USER_LIST_ACCESS '||
56                 ' WHERE (RESPONSIBILITY_ID, TAB_ID) IN '||
57           '( SELECT LA.RESPONSIBILITY_ID, LA.TAB_ID '||
58           '  FROM BSC_SYS_COM_DIM_LEVELS L, BSC_USER_LIST_ACCESS LA '||
59           '  WHERE L.TAB_ID = LA.TAB_ID '||
60           ' AND L.DIM_LEVEL_INDEX = LA.DIM_LEVEL_INDEX '||
61           ' AND L.DIM_LEVEL_ID = :1 '||
62           ' AND LA.DIM_LEVEL_VALUE <> 0 '||
63           ' AND LA.DIM_LEVEL_VALUE NOT IN ( '||
64           ' SELECT CODE FROM '||L_TABLE_NAME||'))';
65          execute immediate l_stmt using L_LEVEL_ID;
66          commit;
67         END LOOP;
68 
69         close LEVEL;
70 
71     h_num_installed_languages := BSC_UPDATE_UTIL.Get_Installed_Languages(h_installed_languages);
72         IF h_num_installed_languages = -1 THEN
73             RAISE e_unexpected_error;
74         END IF;
75 
76 end security_sync;
77 
78 procedure deleteNormalRow(   l_dim_table IN VARCHAR2,
79         l_deleted_code IN NUMBER) is
80 deleted_code  BSC_UPDATE_UTIL.t_array_of_number;
81 temp boolean;
82 begin
83 deleted_code(1):=l_deleted_code;
84  temp:=BSC_UPDATE_DIM.Delete_Codes_Cascade(
85         l_dim_table,
86         deleted_code, 1);
87  --commit;
88   /* if (temp=FALSE) then raise program_error; end if; */
89 end;
90 
91 procedure deleteMNRow(l_dim_table IN VARCHAR2,
92                       l_key_column1 IN VARCHAR2,
93                       l_key_column2 IN VARCHAR2,
94                       l_rowid IN VARCHAR2)   is
95     TYPE CURSORTYPE IS REF CURSOR;
96     l_cursor CURSORTYPE;
97     l_code1  NUMBER;
98     l_code2  NUMBER;
99     l_stmt   VARCHAR2(2000);
100     result     BOOLEAN :=false;
101 begin
102     l_stmt := 'SELECT '||l_key_column1||', '||l_key_column2||' FROM '||l_dim_table||' WHERE rowid='''||l_rowid||'''';
103     open l_cursor for l_stmt;
104     fetch l_cursor into l_code1, l_code2;
105     close l_cursor;
106     result := Delete_Codes_CascadeMN(
107                 l_dim_table,
108                 l_key_column1,
109                 l_key_column2,
110                 l_code1 ,
111                 l_code2
112             );
113     --commit;
114 EXCEPTION
115     WHEN OTHERS THEN
116         BSC_MESSAGE.Add(x_message => SQLERRM,
117                         x_source => 'BSC_UPDATE_DIM.deleteMNRow');
118   end deleteMNRow;
119 
120 procedure markKPI( l_dim_table IN VARCHAR2) is
121 begin
122         UPDATE BSC_KPIS_B K
123         SET PROTOTYPE_FLAG = 6,
124             LAST_UPDATED_BY = BSC_APPS.fnd_global_user_id,
125             LAST_UPDATE_DATE = SYSDATE
126         WHERE INDICATOR IN (SELECT D.INDICATOR
127                             FROM BSC_KPI_DIM_LEVELS_B D
128                             WHERE K.INDICATOR = D.INDICATOR AND
129                                   (UPPER(D.LEVEL_TABLE_NAME) = UPPER(l_dim_table) OR
130                                    UPPER(D.TABLE_RELATION) = UPPER(l_dim_table))) AND
131               PROTOTYPE_FLAG in (0, 6, 7);
132 
133         -- Color By KPI: Mark KPIs for color re-calculation
134         UPDATE bsc_kpi_analysis_measures_b k
135 	  SET prototype_flag = 7
136           WHERE indicator IN (SELECT D.INDICATOR
137                               FROM BSC_KPI_DIM_LEVELS_B D
138                               WHERE K.INDICATOR = D.INDICATOR AND
139                                     (UPPER(D.LEVEL_TABLE_NAME) = UPPER(l_dim_table) OR
140                                      UPPER(D.TABLE_RELATION) = UPPER(l_dim_table)));
141     commit;
142 end markKPI;
143 
144 procedure saveNormalRowNW(l_dim_table in varchar2, l_fk in varchar2,
145 l_fk_user in varchar2, l_code in number, l_user_code in varchar2,
146 l_name in varchar2, l_fkcode in number, l_fkusercode in varchar2,
147 l_message out  nocopy varchar2) is
148 l_code_number number;
149 l_fkcode_number number;
150 l_name2 varchar2(2000);
151 begin
152    l_fkcode_number:=to_number(l_fkcode);
153    l_name2:=removeComma(l_name);
154    if (l_code is not null) then
155      l_code_number:=to_number(l_code);
156      updateNormalRowNW(l_dim_table,l_fk,l_fk_user,l_code_number,
157        l_user_code, l_name2, l_fkcode_number, l_fkusercode, l_message);
158    else
159      insertNormalRowNW(l_dim_table,l_fk,l_fk_user,
160        l_user_code, l_name2, l_fkcode_number, l_fkusercode, l_message);
161    end if;
162 end  saveNormalRowNW;
163 
164 procedure saveNormalRowNO(l_dim_table in varchar2, l_code in varchar2,
165     l_user_code in varchar2, l_name in varchar2, l_message out  nocopy varchar2) is
166 l_code_number number;
167 l_name2 varchar2(2000);
168 begin
169    l_name2:=removeComma(l_name);
170    if (l_code is not null) then
171      l_code_number:=to_number(l_code);
172      updateNormalRowNO(l_dim_table,l_code_number,l_user_code,l_name2,l_message);
173    else
174      insertNormalRowNO(l_dim_table,l_user_code,l_name2, l_message);
175    end if;
176 end  saveNormalRowNO;
177 
178 procedure saveMNRow(l_dim_table in varchar2,
179 l_key_column1 in varchar2, l_key_column2 in varchar2,
180 l_code1 in number,  l_code2 in number, l_rowid in varchar2,
181 l_message out  nocopy varchar2 ) is
182 l_stmt varchar2(3000);
183 begin
184  if (l_rowid is not null) then
185  if (checkMNrecord(l_dim_table, l_key_column1,l_key_column2,
186   l_code1,l_code2, l_rowid)) then
187     l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
188   else
189    l_stmt:='update '||l_dim_table ||' set '||
190     l_key_column1 ||'=:1, '||
191     l_key_column2 ||'=:2  ' ||
192     ' where rowid=:3 ';
193      execute immediate l_stmt using l_code1,l_code2, l_rowid;
194   end if;
195  else
196    if (checkMNrecord(l_dim_table, l_key_column1,l_key_column2, l_code1,l_code2)) then
197     l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
198       --raise_application_error(-20000,'UNIQUE_CONSTRAINT_VIOLATED');
199    else
200      l_stmt:='insert into '||l_dim_table ||'( '||
201       l_key_column1 ||','|| l_key_column2 ||')'||
202        'values(:1, :2)';
203      execute immediate l_stmt using l_code1,l_code2;
204      --commit;
205    end if;
206  end if;
207 
208 end saveMNRow;
209 
210 procedure updateNormalRowNO(l_dim_table in varchar2, l_code in number,
211     l_user_code in varchar2, l_name in varchar2,l_message out nocopy varchar2) is
212 l_stmt varchar2(3000);
213 l_source_lang varchar2(4);
214 UsercodeChange boolean ;
215 begin
216    if (checkrecord(l_dim_table, l_user_code, l_name, l_code)) then
217        l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
218    else
219       UsercodeChange:=checkUsercodeChange(l_dim_table, l_code, l_user_code);
220       l_source_lang:=USERENV('LANG');
221       l_stmt:=' update '||l_dim_table||' set '||
222               ' user_code=:1 where code=:2 ';
223       execute immediate l_stmt using l_user_code, l_code;
224       --commit;
225       --l_stmt:=' update '||l_dim_table||' set '||
226       --        ' name=:1, source_lang=:2 where code=:3 and language=:4 ';
227       --execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang;
228       l_stmt:=' update '||l_dim_table||' set '||
229               ' name=:1, source_lang=:2 where code=:3 and (language=:4 or source_lang=:5) ';
230       execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang, l_source_lang;
231       --commit;
232       if (UsercodeChange and checkChild(l_dim_table) > 0) then
233         cascadeUsercodeChange(l_dim_table, l_code, l_user_code);
234       end if;
235    end if;
236 end updateNormalRowNO;
237 
238 procedure insertNormalRowNO(l_dim_table in varchar2,
239     l_user_code in varchar2, l_name in varchar2, l_message out  nocopy varchar2)is
240 l_stmt varchar2(3000);
241 l_code number;
242 l_source_lang varchar2(4);
243 e_unexpected_error EXCEPTION;
244 begin
245    if (checkrecord(l_dim_table, l_user_code, l_name)) then
246        l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
247        -- raise_application_error(-20000,'UNIQUE_CONSTRAINT_VIOLATED');
248    else
249       l_code:=BSC_UPDATE_DIM.get_new_code(l_dim_table);
250       l_source_lang:=USERENV('LANG');
251 
252 	IF h_num_installed_languages is NULL THEN
253 	    h_num_installed_languages := BSC_UPDATE_UTIL.Get_Installed_Languages(h_installed_languages);
254 		IF h_num_installed_languages = -1 THEN
255 		    RAISE e_unexpected_error;
256 		END IF;
257 	END IF;
258 
259 
260       FOR h_i IN 1 .. h_num_installed_languages LOOP
261        l_stmt := 'INSERT INTO '||l_dim_table||' ('||
262                          ' code, user_code, name, language, source_lang)'||
263                          ' values (:1,:2,:3,:4,:5)';
264        execute immediate l_stmt using l_code,l_user_code, l_name, h_installed_languages(h_i),l_source_lang;
265       END LOOP;
266       --commit;
267    end if;
268 
269 end insertNormalRowNO;
270 
271 procedure updateNormalRowNW(l_dim_table in varchar2, l_fk in varchar2,
272 l_fk_user in varchar2, l_code in number, l_user_code in varchar2,
273 l_name in varchar2, l_fkcode in number, l_fkusercode in varchar2,
274 l_message out nocopy varchar2)is
275 TYPE curcode IS REF CURSOR;
276 cv curcode;
277 l_code_number number;
278 l_stmt varchar2(3000);
279 l_source_lang varchar2(4);
280 UsercodeChange boolean ;
281 begin
282    l_message := null;
283    if (checkrecord(l_dim_table, l_user_code, l_name, l_code)) then
284       l_stmt:='select code from '||l_dim_table ||' where (user_code=:1 or name=:2) and ('||l_fk||' is null or '||l_fk_user||' is null) and code!=:3';
285       open cv for l_stmt using l_user_code, l_name, l_code;
286       fetch cv into l_code_number;
287       close cv;
288       if (l_code_number is not null) then
289          deleteNormalRow(l_dim_table, l_code_number);
290       else
291          l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
292       end if;
293    end if;
294    if (l_message is null) then
295       UsercodeChange:=checkUsercodeChange(l_dim_table, l_code, l_user_code);
296       l_source_lang:=USERENV('LANG');
297       l_stmt:=' update '||l_dim_table||' set '||
298         ' user_code=:1, '||l_fk||'=:2, '||l_fk_user||'=:3  where code=:4 ';
299       execute immediate l_stmt using l_user_code, l_fkcode, l_fkusercode, l_code;
300       --commit;
301       --l_stmt:=' update '||l_dim_table||' set '||
302       --  ' name=:1, source_lang=:2 where code=:3 and language=:4 ';
303       --execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang;
304       l_stmt:=' update '||l_dim_table||' set '||
305         ' name=:1, source_lang=:2 where code=:3 and (language=:4 or source_lang=:5) ';
306       execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang, l_source_lang;
307       --commit;
308       if (UsercodeChange and checkChild(l_dim_table) > 0) then
309         cascadeUsercodeChange(l_dim_table, l_code, l_user_code);
310       end if;
311    end if;
312 end updateNormalRowNW;
313 
314 procedure insertNormalRowNW(l_dim_table in varchar2, l_fk in varchar2,
315 l_fk_user in varchar2, l_user_code in varchar2,
316 l_name in varchar2, l_fkcode in number, l_fkusercode in varchar2,
317 l_message out  nocopy varchar2) is
318 TYPE curcode IS REF CURSOR;
319 cv curcode;
320 l_stmt varchar2(3000);
321 l_code number;
322 l_source_lang varchar2(4);
323 e_unexpected_error EXCEPTION;
324 begin
325    if (checkrecord(l_dim_table, l_user_code, l_name)) then
326       l_stmt:='select code from '||l_dim_table ||' where (user_code=:1 or name=:2) and ('||l_fk||' is null or '||l_fk_user||' is null)';
327       open cv for l_stmt using l_user_code, l_name;
328       fetch cv into l_code;
329       close cv;
330       if (l_code is not null) then
331          updateNormalRowNW(l_dim_table, l_fk, l_fk_user, l_code, l_user_code, l_name, l_fkcode, l_fkusercode, l_message);
332       else
333          l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
334          --raise_application_error(-20000,'UNIQUE_CONSTRAINT_VIOLATED');
335       end if;
336    else
337       l_code:=BSC_UPDATE_DIM.get_new_code(l_dim_table);
338       l_source_lang:=USERENV('LANG');
339 
340 	IF h_num_installed_languages is NULL THEN
341 	    h_num_installed_languages := BSC_UPDATE_UTIL.Get_Installed_Languages(h_installed_languages);
342 		IF h_num_installed_languages = -1 THEN
343 		    RAISE e_unexpected_error;
344 		END IF;
345 	END IF;
346 
347       FOR h_i IN 1 .. h_num_installed_languages LOOP
348        l_stmt := 'INSERT INTO '||l_dim_table||' ('||
349                          ' code, user_code, name, language, source_lang,'||
350             l_fk||','||l_fk_user||')'||
351                          ' values (:1,:2,:3,:4,:5,:6,:7)';
352        execute immediate l_stmt using l_code,l_user_code, l_name, h_installed_languages(h_i),l_source_lang,l_fkcode, l_fkusercode;
353       END LOOP;
354     --commit;
355    end if;
356 
357 end insertNormalRowNW;
358 
359 FUNCTION  checkrecord(l_dim_table in varchar2, l_user_code in varchar2,
360  l_name in varchar2) return boolean is
361 TYPE curtyp IS REF CURSOR;
362 cv       curtyp;
363 l_stmt varchar2(3000);
364 l_count number:=0;
365 begin
366   l_stmt:='select count(*) from '||l_dim_table ||' where user_code=:1';
367   open cv for l_stmt using l_user_code;
368   fetch cv into l_count;
369   close cv;
370   if (l_count>0) then
371     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
372     return true;
373   end if;
374   l_stmt:='select count(*) from '||l_dim_table ||' where name=:1';
375   open cv for l_stmt using l_name;
376   fetch cv into l_count;
377   close cv;
378   if (l_count>0) then
379     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
380     return true;
381   end if;
382   return false;
383 end;
384 
385 FUNCTION  checkrecord(l_dim_table in varchar2, l_user_code in varchar2,
386  l_name in varchar2, l_code in number ) return boolean is
387 TYPE curtyp IS REF CURSOR;
388 cv       curtyp;
389 l_stmt varchar2(3000);
390 l_count number:=0;
391 begin
392   l_stmt:='select count(*) from '||l_dim_table ||' where user_code=:1 and code!=:2';
393   open cv for l_stmt using l_user_code, l_code;
394   fetch cv into l_count;
395   close cv;
396   if (l_count>0) then
397     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
398     return true;
399   end if;
400   l_stmt:='select count(*) from '||l_dim_table ||' where name=:1 and code!=:2';
401   open cv for l_stmt using l_name, l_code;
402   fetch cv into l_count;
403   close cv;
404   if (l_count>0) then
405     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
406     return true;
407   end if;
408   return false;
409 end;
410 
411 FUNCTION  checkMNrecord(l_dim_table in varchar2,
412 l_key_column1 in varchar2, l_key_column2 in varchar2,
413 l_code1 in number,  l_code2 in number) return boolean is
414 TYPE curtyp IS REF CURSOR;
415 cv       curtyp;
416 l_stmt varchar2(3000);
417 l_count number:=0;
418 begin
419   l_stmt:='select count(*) from '||l_dim_table ||' where '||l_key_column1
420    ||'=:1 and '||l_key_column2||' =:2';
421   open cv for l_stmt using l_code1, l_code2;
422   fetch cv into l_count;
423   close cv;
424   if (l_count>0) then
425     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
426     return true;
427   end if;
428   return false;
429 end;
430 
431 FUNCTION  checkMNrecord(l_dim_table in varchar2,
432 l_key_column1 in varchar2, l_key_column2 in varchar2,
433 l_code1 in number,  l_code2 in number, l_rowid in varchar2) return boolean is
434 TYPE curtyp IS REF CURSOR;
435 cv       curtyp;
436 l_stmt varchar2(3000);
437 l_count number:=0;
438 begin
439   l_stmt:='select count(*) from '||l_dim_table ||' where '||l_key_column1
440    ||'=:1 and '||l_key_column2||' =:2 and rowid!=:3 ';
441   open cv for l_stmt using l_code1, l_code2, l_rowid;
442   fetch cv into l_count;
443   close cv;
444   if (l_count>0) then
445     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
446     return true;
447   end if;
448   return false;
449 end;
450 
451 function removeComma(l_name varchar2) return varchar2
452 is
453 l_name2 varchar2(2000):=null;
454 l_position number;
455 TYPE curtyp IS REF CURSOR;
456 cv       curtyp;
457 --l_stmt varchar2(2000);
458 begin
459  /*l_stmt:='select instr('||''''||l_name||''''||','','') from dual';
460   open cv for l_stmt;
461   fetch cv into l_position;
462   close cv; */
463   l_position:= instr(l_name,',');
464   if (l_position>0) then
465     l_name2:=substr(l_name,1,l_position-1)||substr(l_name,l_position+1,length(l_name));
466   else l_name2:=l_name;
467   end if;
468   /*l_stmt:='select instr('||''''||l_name2||''''||','','') from dual';
469   open cv for l_stmt;
470   fetch cv into l_position;
471   close cv; */
472   l_position:= instr(l_name2,',');
473   if (l_position>0) then
474     l_name2:=removeComma(l_name2);
475   end if;
476   return l_name2;
477 end;
478 
479 FUNCTION Delete_Codes_CascadeMN(
480     x_dim_table IN VARCHAR2,
481     x_key_column1 IN VARCHAR2,
482     x_key_column2 IN VARCHAR2,
483     x_deleted_codes1 IN number,
484     x_deleted_codes2 IN number
485     ) RETURN BOOLEAN IS
486 
487     h_condition VARCHAR2(32700);
488     h_i NUMBER;
489 
490     TYPE t_cursor IS REF CURSOR;
491 
492     c_base_tables t_cursor; -- x_key_column1, x_key_column2,  h_column_type_p
493 
494      c_base_tables_sql VARCHAR2(2000) := 'SELECT DISTINCT bt.table_name '||
495                                         ' FROM (SELECT DISTINCT table_name'||
496 					' FROM bsc_db_tables_rels'||
497 					' WHERE source_table_name IN '||
498 					' ( SELECT table_name  FROM bsc_db_tables '||
499 					' WHERE table_type = 0 ) )bt,'||
500 					' bsc_db_tables_cols c '||
501 					' WHERE bt.table_name = c.table_name AND '||
502 					' (UPPER(c.column_name) = UPPER(:1)  OR '||
503 					' UPPER(c.column_name) = UPPER(:2)) AND '||
504 					' c.column_type = :3 '||
505 					' GROUP BY bt.table_name '||
506 					' HAVING COUNT(*) = 2 ';
507 
508     h_column_type_p VARCHAR2(1) := 'P';
509 
510     h_base_table VARCHAR2(30);
511     h_sql VARCHAR2(32700);
512 
513 BEGIN
514     h_condition := x_key_column1||'='||x_deleted_codes1||' and '
515     ||x_key_column2||'='||x_deleted_codes2;
516 
517     -- Delete from system tables
518   OPEN c_base_tables FOR c_base_tables_sql USING x_key_column1, x_key_column2,  h_column_type_p;
519   FETCH c_base_tables INTO h_base_table;
520   While c_base_tables%FOUND LOOP
521      	 h_sql := 'DELETE FROM '||h_base_table||
522                  ' WHERE '||h_condition;
523                BSC_UPDATE_UTIL.Execute_Immediate(h_sql);
524        FETCH c_base_tables INTO h_base_table;
525     END LOOP;
526     CLOSE c_base_tables;
527 
528 
529     -- Delete from dimension table
530     h_sql := 'DELETE FROM '||x_dim_table||
531              ' WHERE '||h_condition;
532     BSC_UPDATE_UTIL.Execute_Immediate(h_sql);
533 
534     RETURN TRUE;
535 
536 EXCEPTION
537     WHEN OTHERS THEN
538         BSC_MESSAGE.Add(x_message => SQLERRM,
539                         x_source => 'BSC_UPDATE_DIM.Delete_Codes_CascadeMN');
540         RETURN FALSE;
541 
542 END Delete_Codes_CascadeMN;
543 
544 FUNCTION  checkMVnot(l_table in varchar2) return boolean is
545     l_mv varchar2(100);
546 BEGIN
547   l_mv  :=  UPPER(l_table)||'_MV';
548   IF (BSC_UTILITY.is_MV_Exists(l_mv)) THEN
549     RETURN FALSE;
550     --dbms_output.put_line('UNIQUE_CONSTRAINT_VIOLATED');
551   ELSE
552     RETURN TRUE;
553   END IF;
554 end;
555 
556 procedure insertNormalRowNWM(l_dim_table in varchar2,
557 l_user_code in varchar2, l_name in varchar2, l_parentcount in number,
558 l_fklist in BSC_EDIT_VLIST,
559 l_fkvaluelist in BSC_EDIT_VLIST, l_fkuservaluelist in  BSC_EDIT_VLIST,
560 l_message out  nocopy varchar2) is
561 TYPE curcode IS REF CURSOR;
562 cv curcode;
563 l_stmt varchar2(5000);
564 l_code number;
565 l_source_lang varchar2(4);
566 l_t1 varchar2(1000):=null;
567 l_t2 varchar2(1000):=null;
568 l_t3 varchar2(1000):=null;
569 e_unexpected_error EXCEPTION;
570 begin
571    if (checkrecord(l_dim_table, l_user_code, l_name)) then
572       if (l_parentcount >= 1) then
573          l_t3 := '('||l_fklist(1)||' is null or '||l_fklist(1)||'_USR is null';
574          for i in 2 ..l_parentcount loop
575             l_t3 := l_t3||' or '||l_fklist(i)||' is null or '||l_fklist(i)||'_USR is null';
576          end loop;
577          l_t3 := l_t3||')';
578       end if;
579       l_stmt := 'select code from '||l_dim_table ||' where (user_code=:1 or name=:2) and '||l_t3;
580       open cv for l_stmt using l_user_code, l_name;
581       fetch cv into l_code;
582       close cv;
583       if (l_code is not null) then
584          updateNormalRowNWM(l_dim_table, l_code, l_user_code, l_name, l_parentcount, l_fklist, l_fkvaluelist, l_fkuservaluelist, l_message);
585       else
586          l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
587          --raise_application_error(-20000,'UNIQUE_CONSTRAINT_VIOLATED');
588       end if;
589    else
590       l_code:=BSC_UPDATE_DIM.get_new_code(l_dim_table);
591       l_source_lang:=USERENV('LANG');
592       for i in 1 ..l_parentcount loop
593         l_t1:=l_t1||' , '||l_fklist(i)||' , '||l_fklist(i)||'_USR';
594         l_t2:=l_t2||' , '||to_number(l_fkvaluelist(i))||' , '''||l_fkuservaluelist(i)||'''';
595       end loop;
596 
597 
598 	IF h_num_installed_languages is NULL THEN
599 	    h_num_installed_languages := BSC_UPDATE_UTIL.Get_Installed_Languages(h_installed_languages);
600 		IF h_num_installed_languages = -1 THEN
601 		    RAISE e_unexpected_error;
602 		END IF;
603 	END IF;
604 
605 
606 
607       FOR h_i IN 1 .. h_num_installed_languages LOOP
608       l_stmt := 'INSERT INTO '||l_dim_table||' ('||
609                          ' code, user_code, name, language, source_lang '||
610             l_t1||
611                          ' ) values (:1,:2,:3,:4,:5 ' ||l_t2 ||' )';
612         execute immediate l_stmt using l_code,l_user_code, l_name, h_installed_languages(h_i),l_source_lang;
613       END LOOP;
614     --commit;
615     end if;
616 
617 end insertNormalRowNWM;
618 
619 procedure updateNormalRowNWM(l_dim_table in varchar2, l_code in number,
620 l_user_code in varchar2, l_name in varchar2,l_parentcount in number,
621 l_fklist in BSC_EDIT_VLIST,
622 l_fkvaluelist in BSC_EDIT_VLIST, l_fkuservaluelist in  BSC_EDIT_VLIST,
623 l_message out nocopy varchar2
624 )is
625 TYPE curcode IS REF CURSOR;
626 cv curcode;
627 l_code_number number;
628 l_stmt varchar2(3000);
629 l_t1 varchar2(1000):=null;
630 l_t2 varchar2(1000):=null;
631 l_source_lang varchar2(4);
632 UsercodeChange boolean ;
633 begin
634    l_message := null;
635    if (checkrecord(l_dim_table, l_user_code, l_name, l_code)) then
636       if (l_parentcount >= 1) then
637          l_t2 := '('||l_fklist(1)||' is null or '||l_fklist(1)||'_USR is null';
638          for i in 2 ..l_parentcount loop
639             l_t2 := l_t2||' or '||l_fklist(i)||' is null or '||l_fklist(i)||'_USR is null';
640          end loop;
641          l_t2 := l_t2||')';
642       end if;
643       l_stmt:='select code from '||l_dim_table||' where (user_code=:1 or name=:2) and code!=:3 and '||l_t2;
644       open cv for l_stmt using l_user_code, l_name, l_code;
645       fetch cv into l_code_number;
646       close cv;
647       if (l_code_number is not null) then
648          deleteNormalRow(l_dim_table, l_code_number);
649       else
650          l_message:=fnd_message.get_string('BSC','BSC_PMD_LDR_UNICONSTR_VIOLATE');
651       end if;
652    end if;
653    if (l_message is null) then
654       UsercodeChange:=checkUsercodeChange(l_dim_table, l_code, l_user_code);
655       l_source_lang:=USERENV('LANG');
656       for i in 1 ..l_parentcount loop
657         l_t1:=l_t1||' , '||l_fklist(i)||'='||to_number(l_fkvaluelist(i))||
658         ' , '||l_fklist(i)||'_USR='''||l_fkuservaluelist(i)||'''';
659       end loop;
660       l_stmt:=' update '||l_dim_table||' set '||
661         ' user_code=:1 '||l_t1||'  where code=:2 ';
662       execute immediate l_stmt using l_user_code, l_code;
663       --commit;
664       --l_stmt:=' update '||l_dim_table||' set '||
665       --  ' name=:1, source_lang=:2 where code=:3 and language=:4 ';
666       --execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang;
667       l_stmt:=' update '||l_dim_table||' set '||
668         ' name=:1, source_lang=:2 where code=:3 and (language=:4 or source_lang=:5) ';
669       execute immediate l_stmt using l_name, l_source_lang, l_code, l_source_lang, l_source_lang;
670       --commit;
671 
672       if (UsercodeChange and checkChild(l_dim_table) > 0) then
673         cascadeUsercodeChange(l_dim_table,  l_code, l_user_code);
674       end if;
675     end if;
676 end updateNormalRowNWM;
677 
678 procedure saveNormalRowNWM(l_dim_table in varchar2,  l_code in number,
679 l_user_code in varchar2, l_name in varchar2, l_parentcount in number,
680 l_fklist in BSC_EDIT_VLIST,
681 l_fkvaluelist in BSC_EDIT_VLIST, l_fkuservaluelist in  BSC_EDIT_VLIST,
682 l_message out  nocopy varchar2) is
683 l_code_number number;
684 l_fkcode_number number;
685 l_name2 varchar2(2000);
686 begin
687    l_name2:=removeComma(l_name);
688    if (l_code is not null) then
689      l_code_number:=to_number(l_code);
690      updateNormalRowNWM(l_dim_table,l_code_number,
691       l_user_code,l_name2,l_parentcount,l_fklist,
692     l_fkvaluelist,l_fkuservaluelist,l_message );
693    else
694      insertNormalRowNWM(l_dim_table,
695       l_user_code,l_name2,l_parentcount,l_fklist,
696     l_fkvaluelist,l_fkuservaluelist,  l_message );
697    end if;
698 end  saveNormalRowNWM;
699 
700 FUNCTION  checkUsercodeChange(l_dim_table in varchar2, l_code in number,
701 l_user_code in varchar2) return boolean is
702 TYPE curtyp IS REF CURSOR;
703 cv       curtyp;
704 l_stmt varchar2(400);
705 l_old_user_code varchar2(2000);
706 begin
707  l_stmt:='select user_code from '||l_dim_table ||' where code=:1';
708  open cv for l_stmt using l_code;
709  fetch cv into l_old_user_code;
710  close cv;
711  if (l_old_user_code=l_user_code) then
712    return false;
713  else
714    return true;
715  end if;
716 end;
717 
718 Function checkChild(l_dim_table in varchar2) return number is
719 TYPE curtyp IS REF CURSOR;
720 cv       curtyp;
721 l_stmt varchar2(1500);
722 l_count number;
723 begin
724  l_stmt:='SELECT count(*) FROM BSC_SYS_DIM_LEVELS_B T, BSC_SYS_DIM_LEVEL_RELS R, BSC_SYS_DIM_LEVELS_B P WHERE T.DIM_LEVEL_ID = R.DIM_LEVEL_ID and R.PARENT_DIM_LEVEL_ID =P.dim_level_id AND R.RELATION_TYPE = 1  and P.level_table_name=:1';
725  open cv for l_stmt using l_dim_table;
726  fetch cv into l_count;
727  close cv;
728  return l_count;
729 end;
730 
731 procedure cascadeUsercodeChange(l_dim_table in varchar2,  l_code in number,
732 l_user_code in varchar2) is
733 l_childtable varchar2(50);
734 l_pk        varchar2(100);
735 l_stmt      varchar2(800);
736 begin
737 
738         IF (CHILD%isopen) THEN
739                 close CHILD;
740         END IF;
741         open CHILD(l_dim_table);
742         LOOP
743          fetch CHILD into l_childtable, l_pk;
744          exit when CHILD%notfound;
745      l_stmt:='update '||l_childtable ||' set '||l_pk||'_USR =:1 '||
746            ' where '||l_pk||' = :2';
747          execute immediate l_stmt using l_user_code, l_code;
748          commit;
749         END LOOP;
750 
751         close CHILD;
752 end;
753 
754 procedure checkViewExist(p_view_name varchar2,l_message out nocopy varchar2) is
755 l_sql varchar2(2000);
756 begin
757  l_sql:='select ''1'' from '||p_view_name||' where rownum=1';
758  execute immediate l_sql;
759  l_message:=null;
760  exception
761   when others then
762       l_message:=null;
763        fnd_message.set_name('BSC','BSC_PMD_LDR_VIEW_NOT_EXIST');
764        fnd_message.set_token('VIEW_NAME',p_view_name);
765        l_message:=fnd_message.get;
766 
767 
768 end;
769 
770 procedure checkMetadata(p_table_name varchar2,p_query varchar2, l_message out nocopy varchar2) is
771 l_sql varchar2(2000);
772 begin
773  -- l_sql:='select ''1'' from '||p_view_name||' where rownum=1';
774  execute immediate p_query;
775  l_message:=null;
776  exception
777   when others then
778       l_message:=null;
779        fnd_message.set_name('BSC','BSC_PMD_LDR_METADATACORRUPTION');
780        fnd_message.set_token('TABLE_NAME',p_table_name);
781        l_message:=fnd_message.get;
782 
783 
784 end;
785 
786 End bsc_dimension_edit;