We can disable a responsibility, end-date the users' responsibility, change the responsibility name with the words "do not use", nullify the menu attached to this responsibility, or whatever means to make a responsibility obsolete.
However, we cannot change the Responsibility Key for that incorrect responsibility.
And more importantly, I have to reuse this responsibility key for the correct responsibility. Since the we have no way to change the Responsibility Key, the alternative is to get rid of this incorrect value from the system.
Using the following script you will able to delete a responsibility from the system, using the API FND_RESPONSIBILITY_PKG.DELETE_ROW. This script will abort if such responsibility is used by any FND user or referenced in other places (e.g. HR SIT & EIT Security).
This script DOES NOT remove a responsibility from a user. Please read my next blog for this kind of removal.
SET SERVEROUTPUT ON DECLARE -- Change these 2 variables to fit your needs p_respKey VARCHAR2 (100) := [RESP. KEY TO BE DELETED]; p_ForceDelete BOOLEAN := [TRUE|FALSE]; num_respID NUMBER; num_appID NUMBER; var_appName VARCHAR2 (100); var_sqlStmt VARCHAR2 (1000); var_respName VARCHAR2 (100); num_count NUMBER; boo_proceed BOOLEAN := TRUE; BEGIN SELECT A.RESPONSIBILITY_NAME , B.RESPONSIBILITY_ID , B.APPLICATION_ID , C.APPLICATION_NAME INTO var_respName , num_respID , num_appID , var_appName FROM FND_RESPONSIBILITY_TL A , FND_RESPONSIBILITY B , FND_APPLICATION_TL C WHERE A.RESPONSIBILITY_ID = B.RESPONSIBILITY_ID AND A.LANGUAGE = 'US' AND B.RESPONSIBILITY_KEY = p_respKey AND C.LANGUAGE = 'US' AND C.APPLICATION_ID = B.APPLICATION_ID; DBMS_OUTPUT.PUT_LINE ('Resp. ID : ' || num_respID); DBMS_OUTPUT.PUT_LINE ('Resp. Name: ' || var_respName); DBMS_OUTPUT.PUT_LINE ('Application ID : ' || num_appID); DBMS_OUTPUT.PUT_LINE ('Application Name : ' || var_appName); DBMS_OUTPUT.PUT_LINE ('-------------------------------------------'); DBMS_OUTPUT.PUT_LINE ('Scanning tables...'); FOR RS IN ( SELECT a.owner , a.table_name FROM dba_tab_columns a , dba_objects b WHERE a.column_name = 'RESPONSIBILITY_ID' AND a.table_name = b.object_name AND b.object_type = 'TABLE' AND a.table_name NOT IN ('FND_RESPONSIBILITY', 'FND_RESPONSIBILITY_TL') ORDER BY 1 , 2) LOOP var_sqlStmt := 'SELECT COUNT(*) FROM ' || RS.OWNER || '.' || RS.TABLE_NAME || ' WHERE RESPONSIBILITY_ID = ' || num_respID; EXECUTE IMMEDIATE var_sqlStmt INTO num_count; IF num_count > 0 THEN boo_proceed := FALSE; DBMS_OUTPUT.PUT_LINE (RS.TABLE_NAME || ' (' || num_count || ')'); END IF; END LOOP; SELECT COUNT (*) INTO num_count FROM WF_LOCAL_USER_ROLES WHERE ROLE_ORIG_SYSTEM_ID = num_respID AND ROLE_ORIG_SYSTEM LIKE 'FND_RESP%' AND ROLE_NAME LIKE 'FND_RESP%'; IF num_count > 0 THEN boo_proceed := FALSE; DBMS_OUTPUT.PUT_LINE ('WF_LOCAL_USER_ROLES (' || num_count || ')'); END IF; SELECT COUNT (*) INTO num_count FROM WF_USER_ROLE_ASSIGNMENTS WHERE ROLE_ORIG_SYSTEM_ID = num_respID AND ROLE_ORIG_SYSTEM LIKE 'FND_RESP%' AND ROLE_NAME LIKE 'FND_RESP%'; IF num_count > 0 THEN boo_proceed := FALSE; DBMS_OUTPUT.PUT_LINE ('WF_USER_ROLE_ASSIGNMENTS (' || num_count || ')'); END IF; DBMS_OUTPUT.PUT_LINE ('-------------------------------------------'); IF boo_proceed = TRUE OR p_ForceDelete = TRUE THEN FND_RESPONSIBILITY_PKG.DELETE_ROW (num_respID , num_appID); DBMS_OUTPUT.PUT_LINE ('Responsibility ' || var_respName || ' deleted successfully.'); ELSE DBMS_OUTPUT.PUT_LINE ('Responsibility ' || var_respName || ' cannot be deleted.'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('Responsibility key ' || p_respKey || ' is not found.'); END; /
No comments :
Post a Comment