EBS_FORM_开发:FRM-40150的解决思路
今天在开发的时候遇到这样一个问题:
当要切换ITEM时,弹出错误:frm-41050: You cannot update this record.
检查了一下该item的WHEN-VALIDATE-ITEM发现有以下的代码:
--mend行 sum分拷贝到mid行 copy(name_in('mend.SUM_SCORE'),'mid.SUM_SCORE_M'); --mid行与难度系数比 copy(name_in('mid.SUM_SCORE_M') * nvl(name_in('mid.HARD_RATIO'),1),'mid.MID_AVG_SCORE'); --mid行平均分到line行 copy(name_in('mid.SMALL_AVG'),'lines.MID_AVG'); --line行算总分 copy(name_in('lines.MID_AVG')*name_in('lines.WPM_WEIGHTING'),'LINES.WPM_MEND_AVG_SCORE'); --header行算总分 copy(name_in('lines.BIG_SUM'),'headers.TOTAL_SCORE'); copy(name_in('HEADERS.PEOPLE_FINAL_SCORE'),'HEADERS.FINAL_SCORE');
然后查看MEND block的UPDATE状态,发现是true的,这里就很奇怪,仔细一思考发现,要赋值到mid行里面的值并没有赋值进去.
于是检查MID block的代码:发现两处地方:
1.在POST-QUERY:
IF :HEADERS.STATUS_TYPE = 'SU' THEN SET_BLOCK_PROPERTY('MID', INSERT_ALLOWED, PROPERTY_FALSE); SET_BLOCK_PROPERTY('MID', UPDATE_ALLOWED, PROPERTY_FALSE); SET_BLOCK_PROPERTY('MID', DELETE_ALLOWED, PROPERTY_FALSE); ELSIF :HEADERS.STATUS_TYPE = 'NS' THEN SET_BLOCK_PROPERTY('MID', INSERT_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('MID', UPDATE_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('MID', DELETE_ALLOWED, PROPERTY_TRUE); END IF;
2.在WHEN-NEW-RECORD-INSTANCE里:
IF :HEADERS.STATUS_TYPE = 'SU' THEN SET_BLOCK_PROPERTY('MID', INSERT_ALLOWED, PROPERTY_FALSE); SET_BLOCK_PROPERTY('MID', UPDATE_ALLOWED, PROPERTY_FALSE); SET_BLOCK_PROPERTY('MID', DELETE_ALLOWED, PROPERTY_FALSE); ELSIF :HEADERS.STATUS_TYPE = 'NS' THEN SET_BLOCK_PROPERTY('MID', INSERT_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('MID', UPDATE_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('MID', DELETE_ALLOWED, PROPERTY_TRUE); END IF; IF :HEADERS.STATUS_TYPE = 'SU' THEN SET_ITEM_PROPERTY('MID.WPM_KPI_SMALL', UPDATE_ALLOWED, PROPERTY_FALSE); SET_ITEM_PROPERTY('MID.WPM_MEASURE_FORMULA',UPDATE_ALLOWED, PROPERTY_FALSE); SET_ITEM_PROPERTY('MID.STD_SCORE', UPDATE_ALLOWED, PROPERTY_FALSE); SET_ITEM_PROPERTY('MID.HARD_RATIO', UPDATE_ALLOWED, PROPERTY_FALSE); SET_ITEM_PROPERTY('MID.WPM_COMPLETE_PROGRESS',UPDATE_ALLOWED, PROPERTY_FALSE); ELSIF :HEADERS.STATUS_TYPE = 'NS' THEN SET_ITEM_PROPERTY('MID.WPM_KPI_SMALL', UPDATE_ALLOWED, PROPERTY_TRUE); SET_ITEM_PROPERTY('MID.WPM_MEASURE_FORMULA',UPDATE_ALLOWED, PROPERTY_TRUE); SET_ITEM_PROPERTY('MID.STD_SCORE', UPDATE_ALLOWED, PROPERTY_TRUE); SET_ITEM_PROPERTY('MID.HARD_RATIO', UPDATE_ALLOWED, PROPERTY_TRUE); SET_ITEM_PROPERTY('MID.WPM_COMPLETE_PROGRESS',UPDATE_ALLOWED, PROPERTY_TRUE); END IF;
发现了问题的原因:
当进入FORM的时候,子行只是执行了POST-QUERY并没有执行WHEN-NEW-RECORD-INSTANCE,导致MID block的'mid.SUM_SCORE_M'的update状态为false(因为没有触发触发MID block的WHEN-NEW-RECORD-INSTANCE),所以并不能够copy(name_in),所以导致出现错误:FRM-40150 不能UPDATE.
这里有点个人心得:利用公式和copy(name_in)能够实现简单的form的实时汇总刷新功能,并不需要麻烦的调用:函数: APP_CALCULATE.RUNNING_TOTAL
复杂一点的可以用以下的两个思路:
http://oracleseeker.com/2009/08/19/calculate_detail_amount_or_quantity_for_master_block/
或者:
http://blog.itpub.net/9240380/viewspace-754425