设为首页 收藏本站
查看: 1698|回复: 0

[经验分享] Oracel EBS 头行结构金额汇总的实现

[复制链接]

尚未签到

发表于 2015-9-23 08:12:00 | 显示全部楼层 |阅读模式
一、背景
       有很多头行结构的form,例如
  
  希望当行上的数量或者单价改变时,头块上的总金额随即更新,而不是需要重新打开form才能看到更新后的数据。
二、问题分析
  如果直接使用Form中的SUM属性功能,如果要实现这种及时更新,对于清除等操作要进行复杂处理,Oracle提供了APP_CALCULATE.RUNNING_TOTAL来实现这种需求,封装在APPCORE.PLL中。于是,只要利用重写这个过程,并添加一些触发器就能实现这个功能。(由于最近修改这个问题,结合资料对APP_CALCULATE.RUNNING_TOTAL的介绍和项目上的开发,做了如下总结)
三、开发步骤
       1、创建header块的汇总显示字段。由于此合同界面头上有三个字段是显示行上汇总合计的,我们已其中的一个为例,价税合计:TOTAL_AMOUNT_M。
       2、在合计显示的数据块中,创建合计项目的汇总临时项目, TOTAL_AMOUNT_M_RTOT_DB,子类信息为/DISPLAY_ITEM。
       3、在明细块中创建两个统计使用的item,TOTAL_AMOUNT_RTOT_OLD和TOTAL_AMOUNT_RTOT_DB,子类 DISPLAY_ITEM。
       4、调用app_calculate.running_total方法和编写AMOUNT,让其对明细块中的Amount(单价*数量*税率)进行汇总计算。
         PROCEDURE RUNNING_TOTAL(EVENT VARCHAR2) IS
     BEGIN
                   APP_CALCULATE.RUNNING_TOTAL(EVENT, 'LINES_V.TAX_VALUE', 'MAIN_V.TOTAL_TAX_AMOUNT_M');
        APP_CALCULATE.RUNNING_TOTAL(EVENT, 'LINES_V.TOTAL_AMOUNT', 'MAIN_V.TOTAL_AMOUNT_M');
        APP_CALCULATE.RUNNING_TOTAL(EVENT, 'LINES_V.LINE_AMOUNT', 'MAIN_V.TOTAL_LINE_AMOUNT_M');
     END RUNNING_TOTAL;
  
     PROCEDURE AMOUNT(EVENT VARCHAR2) IS
     BEGIN
        IF EVENT = 'INIT'
        THEN
        --added @20120828:16885]销售合同经常出现金额、税额、价税合计为空或与合同真实信息不一致的情况
          IF :Lines_V.Attribute14 IS NOT NULL THEN
                              --GET TAX RATE
                              Begin
                                 Select Zrv.Percentage_Rate,Decode(Zrv.inclusive_Tax_Flag,'N','1','2')
                                   Into :Lines_V.Tax_Rate,:Lines_V.INCLUSIVE_TAX_IND
                                   From Zx_Rates_Vl Zrv
                                  Where Zrv.Tax_Rate_Id = To_Number(:Lines_V.Attribute14)
                                    And Sysdate Between Nvl(Zrv.Effective_From, Sysdate - 1) And Nvl(Zrv.Effective_To, Sysdate + 1)
                                    And Zrv.Tax_Status_Code <> 'STAT'
                                    And Zrv.Active_Flag = 'Y';
                                 If Sql%Notfound
                                 Then
                                    :Lines_V.Tax_Rate := Null;
                                 End If;
                              End;
                            END IF;
           --added end
             IF :LINES_V.INCLUSIVE_TAX_IND = 2
           THEN
              :LINES_V.TAX_VALUE    := ROUND(NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0)* (NVL(:LINES_V.TAX_RATE,0) * 0.01 /(NVL(:LINES_V.TAX_RATE,0) * 0.01 + 1)), 2);
              :LINES_V.TOTAL_AMOUNT  := NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0);--价税合计
              :LINES_V.LINE_AMOUNT := NVL(:LINES_V.TOTAL_AMOUNT, 0) - NVL(:LINES_V.TAX_VALUE, 0);--不含税金额
           ELSE
              :LINES_V.TAX_VALUE    := ROUND(NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0) * (NVL(:LINES_V.TAX_RATE, 0) * 0.01), 2);
              :LINES_V.TOTAL_AMOUNT  := NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0);
              :LINES_V.LINE_AMOUNT := NVL(:LINES_V.TOTAL_AMOUNT, 0) - NVL(:LINES_V.TAX_VALUE, 0);
           END IF;
        END IF;
     END AMOUNT;
  
  5、创建数量和单价的WHEN-VALIDATE-ITEM触发器,使其调用app_calculate.running_total运算汇总值。
  QUANTITY :
  if :system.record_status <> 'QUERY'
                     THEN
                       line_item_ctl.amount('INIT');
                       line_item_ctl.running_total('WHEN-VALIDATE-ITEM');
  END IF;
  UNIT_SALE_PRICE :
  if :system.record_status <> 'QUERY'
                     THEN
                              line_item_ctl.amount('INIT');
                              line_item_ctl.running_total('WHEN-VALIDATE-ITEM');
  END IF;
  6、在汇总显示项目所在块中的POST-QUERY触发器中从数据库中计算出明细的初始汇总值。
   If Event = 'POST-QUERY'
           Then
              Begin
                 Select SUM(NVL(COL.UNIT_SALE_PRICE
                                ,0) * NVL(COL.QUANTITY
                                         ,0)) TOTAL_AMOUNT
                        ,SUM(DECODE(ZRV.INCLUSIVE_TAX_FLAG
                                   ,'N'
                                   ,NVL(COL.UNIT_SALE_PRICE
                                       ,0) * NVL(COL.QUANTITY
                                                ,0) * ZRV.PERCENTAGE_RATE * 0.01
                                   ,NVL(COL.UNIT_SALE_PRICE
                                       ,0) * NVL(COL.QUANTITY
                                                ,0) / 1.17 * ZRV.PERCENTAGE_RATE * 0.01)) TOTAL_TAX_AMOUNT
                        ,SUM(DECODE(ZRV.INCLUSIVE_TAX_FLAG
                                   ,'N'
                                   ,(NVL(COL.UNIT_SALE_PRICE
                                        ,0) * NVL(COL.QUANTITY
                                                  ,0) + NVL(COL.UNIT_SALE_PRICE
                                                            ,0) * NVL(COL.QUANTITY
                                                                                          ,0) * ZRV.PERCENTAGE_RATE * 0.01)
                                   ,(NVL(COL.UNIT_SALE_PRICE
                                        ,0) * NVL(COL.QUANTITY
                                                  ,0) -
                                    NVL(COL.UNIT_SALE_PRICE
                                        ,0) * NVL(COL.QUANTITY
                                                  ,0) / 1.17 * ZRV.PERCENTAGE_RATE * 0.01))) TOTAL_LINE_AMOUNT
                     /*Into :Main_V.Total_Amount_m
                       ,:Main_V.Total_Tax_Amount_m
                       ,:Main_V.Total_Line_Amount_m*/
                       --updated @20120911
                  Into  Ln_Total_Amount,
                        Ln_Total_Tax_Amount,
                        Ln_Total_Line_Amount
                   From Cux_Om_Order_Lines_All Col
                       ,Zx_Rates_Vl            Zrv
                  Where Sysdate Between Nvl(Zrv.Effective_From, Sysdate - 1) And Nvl(Zrv.Effective_To, Sysdate + 1)
                    And Zrv.Tax_Status_Code <> 'STAT'
                    And Zrv.Active_Flag = 'Y'
                    And To_Number(Col.Attribute14) = Zrv.Tax_Rate_Id
                    And Col.Order_Header_Id = :Main_V.Header_Id
                    And Col.Org_Id = :Main_V.Org_Id
                  Group By Col.Order_Header_Id
                          ,Col.Org_Id;
              
              Exception
                 When No_Data_Found Then
                     Ln_Total_Amount := null;
                    Ln_Total_Tax_Amount  := null;
                    Ln_Total_Line_Amount := null;
                    /*:Main_V.Total_Amount_m      := Null;
                    :Main_V.Total_Tax_Amount_m  := Null;
                    :Main_V.Total_Line_Amount_m := Null;*/
                    
              End;
              :Main_V.Total_Amount_m := Ln_Total_Amount;
              :Main_V.Total_Tax_Amount_m := Ln_Total_Tax_Amount;
              :Main_V.Total_Line_Amount_m := Ln_Total_Line_Amount;
              
              :Main_V.TOTAL_AMOUNT_M_RTOT_DB := Ln_Total_Amount;
              :Main_V.TOTAL_TAX_AMOUNT_M_RTOT_DB := Ln_Total_Tax_Amount;
              :Main_V.TOTAL_LINE_AMOUNT_M_RTOT_DB := Ln_Total_Line_Amount;
            End If;
  7、在明细块的以下触发器中添加相应的代码。
   A、KEY-CLRREC
  line_item_ctl.running_total('KEY-CLRREC');
  B、KEY-DUPREC
  DUPLICATE_RECORD;
  LINE_ITEM_CTL.RUNNING_TOTAL('KEY-DUPREC');  
  C、KEY-DELREC
  line_item_ctl.running_total('KEY-DELREC');--updated @20120910                    
  Delete_Record;
  line_item_ctl.running_total('UNDELETE');--updated @20120910  
  D、WHEN-CLEAR-BLOCK
  line_item_ctl.running_total('WHEN-CLEAR-BLOCK');--added @20120910
  F、POST-QUERY
    IF :LINES_V.INCLUSIVE_TAX_IND = 2
     THEN
        :LINES_V.TAX_VALUE    := ROUND(NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0)/1.17 * (NVL(:LINES_V.TAX_RATE, 0) * 0.01), 2);
        :LINES_V.TOTAL_AMOUNT  := NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0);--价税合计
        :LINES_V.LINE_AMOUNT := NVL(:LINES_V.TOTAL_AMOUNT, 0) - NVL(:LINES_V.TAX_VALUE, 0);--不含税金额
     ELSE
        :LINES_V.TAX_VALUE    := ROUND(NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0) * (NVL(:LINES_V.TAX_RATE, 0) * 0.01), 2);
        :LINES_V.TOTAL_AMOUNT  := NVL(:LINES_V.QUANTITY, 0) * NVL(:LINES_V.UNIT_SALE_PRICE, 0);
        :LINES_V.LINE_AMOUNT := NVL(:LINES_V.TOTAL_AMOUNT, 0) - NVL(:LINES_V.TAX_VALUE, 0);
     END IF;
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-117413-1-1.html 上篇帖子: Oracle EBS R12 通过供应商接口导入供应商 下篇帖子: ORACLE EBS-组织架构介绍 (引用)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表