Leading/trailing spaces amd invalid characters in the relevant tables (FND_USER in your case) may cause FRM-40654.
Please do your checks accordingly.
Also, one of the common causes of FRM-40654 is a truncation problem. This is usually caused by the difference between the format of a field in the form and a column in the database.
Your date format etc.. may be causing this as well..
Read this as well -> Troubleshooting FRM-40654 (Doc ID 1003629.6)
Following is a script for fixing these kinds of issue, but you need to get Oracle Support permission's to run this.!!!!Take a backup of the relevant table before executing this.
""If you are planning to run this script, the risk is yours"""
*********************************************************************************************************************************************
REM +=======================================================================+
REM | Copyright (c) 1992 Oracle Corporation, Redwood Shores, CA, USA |
REM | All rights reserved. |
REM +=======================================================================+
REM | FILENAME
REM | afshrchk.sql
REM | USAGE
REM | sqlplus applsys/pwd @afchrchk
<column>
REM | where and <column> are optional 'like'-style clauses
REM | DESCRIPTION
REM | Check requested table.columns for invalid trailing spaces and
REM | and control characters.
REM | These characters cause 'FRM-40654: Record has been updated.'
REM | errors when column is queried in a form.
REM +=======================================================================+
REM $Header: afchrchk.sql 120.3.12010000.1 2009/03/16 10:17:54 absandhw noship $
REM dbdrv: none
SET VERIFY OFF
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
WHENEVER OSERROR EXIT FAILURE ROLLBACK;
set serveroutput on
exec dbms_output.enable(1000000)
set verify off
prompt *** INSTRUCTIONS ***
prompt Enter the table and column names to check for leading or trailing
prompt spaces and control characters. Like-style expressions are ok.
prompt Leave either table or column blank to check table/column.
prompt
prompt Table name (blank for all):
define tblarg = '&1'
prompt Column name (blank for all):
define colarg = '&2'
prompt
prompt Newline characters are acceptable in columns never queried in
prompt Forms, on only queried in multi-line items.
prompt Enter Y to also look for newline characters.
prompt Check for newline characters (Y/N)?
define newlinearg = '&3'
prompt
prompt Enter Y to automatically strip all leading/trailing spaces
prompt and control characters found.
prompt *** WARNING ***
prompt It is highly recommended to run first without stripping
prompt to be sure all detected values really should be fixed!
prompt
prompt Automatically fix all errors found (Y/N)?
define fixarg = '&4'
declare
badchars varchar2(80);
-- Selecvt all columns to check
cursor colcurs is
select C.TABLE_NAME, C.COLUMN_NAME
from SYS.ALL_TAB_COLUMNS C, SYS.ALL_TABLES T
where T.TABLE_NAME = C.TABLE_NAME
and T.OWNER = C.OWNER
and C.DATA_TYPE = 'VARCHAR2'
and C.TABLE_NAME like nvl(upper('&tblarg'), '%')
and C.COLUMN_NAME like nvl(upper('&colarg'), '%')
order by 1, 2;
curs integer; -- Cursor
sqlbuf varchar2(2000); -- Sql stmt
ignore integer; -- Retcode
value varchar2(2000); -- Value with bad chars selected from table
newlineflag boolean; -- Check for newlines
fixflag boolean; -- Strip trailing spaces
badvalfound boolean; -- Bad value detected for this column
lang varchar2(255);
begin
-- Initialize badchars to non-printable chars (except newline)
-- Instead of using fnd_global.local_chr at all the following places, the
-- logic invloved in fnd_global.local_chr is added after building the
-- complete string of badchars. To exempt GSCC check 'File.Sql.10' on this
-- file, a bug # 4383895 is raised and got approved.
badchars :=
chr(1)||chr(2)||chr(3)||chr(4)||chr(5)||chr(6)||chr(7)||chr(8)||
chr(9)||chr(11)||chr(12)||chr(13)||chr(14)||chr(15)||
chr(16)||chr(17)||chr(18)||chr(19)||chr(20)||chr(21)||chr(22)||
chr(23)||chr(24)||chr(25)||chr(26)||chr(27)||chr(28)||chr(29)||
chr(30)||chr(31)||chr(127);
lang := userenv('LANGUAGE');
badchars := convert(badchars,
substr(lang, instr(lang,'.') + 1), 'US7ASCII');
newlineflag := (upper('&newlinearg') = 'Y');
fixflag := (upper('&fixarg') = 'Y');
if (newlineflag) then
-- Add in newline
badchars := badchars||chr(10);
end if;
-- Convert to local codeset
badchars := convert(badchars,
substr(userenv('LANGUAGE'), instr(userenv('LANGUAGE'),'.') +1),
'US7ASCII');
for col in colcurs loop
begin
dbms_output.put_line('Checking '||col.table_name||'.'||col.column_name);
badvalfound := FALSE;
-- Open cursor to check single table.column
curs := dbms_sql.open_cursor;
sqlbuf := 'SELECT '||col.column_name||' value '||
' FROM '||col.table_name||
' WHERE '||col.column_name||' != LTRIM(RTRIM(TRANSLATE('||
col.column_name||', '''||badchars||''', '' '')))';
dbms_sql.parse(curs, sqlbuf, dbms_sql.v7);
dbms_sql.define_column(curs, 1, value, 2000);
ignore := dbms_sql.execute(curs);
-- Select all values with bad chars
loop
if (dbms_sql.fetch_rows(curs) = 0) then
exit;
end if;
badvalfound := TRUE;
dbms_sql.column_value(curs, 1, value);
-- Print value selected
if (length(value) < 250) then
dbms_output.put_line('### '''||value||'''');
else
dbms_output.put_line('### (TRUNCATED) '''||
substr(value, 1, 235)||'''');
end if;
end loop;
dbms_sql.close_cursor(curs);
if (badvalfound and fixflag) then
-- Strip spaces and control characters
dbms_output.put_line('Fixing '||col.table_name||'.'||col.column_name);
curs := dbms_sql.open_cursor;
sqlbuf := 'UPDATE '||col.table_name||' SET '||
col.column_name||' = LTRIM(RTRIM(TRANSLATE('||
col.column_name||', '''||badchars||''', '||
'rpad('' '', length('''||badchars||''')))))';
dbms_sql.parse(curs, sqlbuf, dbms_sql.v7);
ignore := dbms_sql.execute(curs);
dbms_sql.close_cursor(curs);
end if;
exception
when others then
dbms_output.put_line('***'||sqlerrm); -- Continue if errors
end;
end loop;
exception
when others then
if (dbms_sql.is_open(curs)) then
dbms_sql.close_cursor(curs);
end if;
raise;
end;
/
|
Thanks for pointing us to right direction
|