• Oracel EBS 头行结构金额汇总的实现


    一、背景

         有很多头行结构的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;

     

     

  • 相关阅读:
    【canvas】--------------处理canvas物理像素模糊问题-------------【劉】
    【js】--------------判断一个对象是否有某个属性-------------【劉】
    【vue】--------------vue+element-ui实现分页效果-------------【劉】
    【html】--------------iframe-------------【劉】
    【劉】---------------单页面和多页面的区别
    【react】--------------flux-------------【劉】
    【vue】--------------vue路由懒加载-------------【劉】
    【git】--------------git基本指令-------------【劉】
    【git】--------------git基本介绍-------------【劉】
    datatable 分组
  • 原文地址:https://www.cnblogs.com/yangzw478/p/2738538.html
Copyright © 2020-2023  润新知