zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SSM框架整合步骤
    Spring-data-jpa
    allure定制报告
    pytest常用选项
    staticmethod&classmethod&property
    __slot__
    python的参数传递
    闭包和装饰器
    内置高阶函数
    str
  • 原文地址:https://www.cnblogs.com/hopedba/p/5777281.html
Copyright © 2011-2022 走看看