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

原文地址:https://www.cnblogs.com/hopedba/p/5777281.html