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

  • 相关阅读:
    SQL Server 2005中 with as 使用介绍
    论信息系统项目的整体管理
    自定义控件的使用以及与用户控件的区别
    Sql Server2005 TransactSQL 新兵器学习总结之DDL触发器
    我的大学系分之路
    C#序列化与反序列化(Serializable and Deserialize)
    父子节点树形数据输出
    自定义枚举类型注释属性,并在程序中获取
    SSAS没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) 解决办法
    对ASP.NET网站的服务器端压缩
  • 原文地址:https://www.cnblogs.com/hopedba/p/5777281.html
Copyright © 2011-2022 走看看