首页 > 其他分享 >EBS APP_CALCULATE.RUNNING_TOTAL的用法

EBS APP_CALCULATE.RUNNING_TOTAL的用法

时间:2023-03-06 14:11:52浏览次数:103  
标签:copy CALCULATE Field APP DB Value Source RUNNING Total

有时候需要显示某个栏位的汇总数量,且在例如新增、删除、修改记录的时候,汇总项的值要相应地改变,如果直接使用Form中的SUM属性功能,对于清除等操作要进行复杂处理。Oracle提供了APP_CALCULATE.RUNNING_TOTAL来实现这种需求,封装在APPCORE.PLL中。

举例:
要汇总的ITEM为:LINES.QUANTITY,要显示汇总结果的BLOCK为HEADERS
1.HEADERS里建立要显示的汇总结果ITEM,如QTY_SUM
2.HEADERS里建立两个非数据库项,分别命名为QTY_SUM_RTOT_OLD和QTY_SUM_RTOT_DB(Number型)
3.LINES里建立两个非数据库项,分别命名为QUANTITY_RTOT_OLD和QUANTITY_RTOT_DB(Number型)
4.建立存储过程来包装APP_CALCULATE.RUNNING_TOTAL
例:
包装一下APP_CALCULATE.RUNNING_TOTAL方法,让其对行中的QUANTITY进行汇总计算

PROCEDURE RUNNING_TOTAL_QUANTITY(EVENT VARCHAR2) IS 
BEGIN 
  APP_CALCULATE.RUNNING_TOTAL(EVENT, 'LINES.QUANTITY', 'HEADERS.QTY_SUM'); 
END; 

5.在TRIGGER中调用RUNNING_TOTAL_QUANTITY来进行计算处理
:LINES.QUANTITY的WHEN-VALIDATE-ITEM Trigger中写RUNNING_TOTAL_QUANTITY('WHEN-VALIDATE-ITEM');

如果要汇总的栏位来自多个栏位的运算,需要在每个栏位的WHEN-VALIDATE-ITEM时写运算重新计算值赋给要汇总的栏位。

6.:HEADERS的POST-QUERY Trigger中从数据库中抓取初始的汇总值,例:

Declare 
  V_SUM NUMBER; 
BEGIN 
  SELECT NVL(SUM(QUANTITY), 0) 
       INTO V_SUM 
     FROM LINES 
   WHERE HEADER_ID = :HEADERS.HEADER_ID; 
  :HEADERS.QTY_SUM                   := V_SUM; 
    :HEADERS.QTY_SUM_RTOT_DB := V_SUM;----------------------注① 
END;

7.:LINES的如下TRIGGER中写相应代码:

--KEY-DELREC 
RUNNING_TOTAL_QUANTITY('KEY-DELREC'); 
DELETE_RECORD;

RUNNING_TOTAL_QUANTITY('UNDELETE');----------------------注③

--KEY-DUPREC 
RUNNING_TOTAL_QUANTITY('KEY-DUPREC'); 
DUPLICATE_RECORD;

--KEY-CLRREC 
RUNNING_TOTAL_QUANTITY('KEY-CLRREC'); 
CLEAR_RECORD;--(网上例子为:APP_FOLDER.EVENT('KEY-CLRREC');)

--POST-QUERY 
RUNNING_TOTAL_QUANTITY( 'POST-QUERY' );

--WHEN-CLEAR-BLOCK 
RUNNING_TOTAL_QUANTITY( 'WHEN-CLEAR-BLOCK' );----------------------注②

另外上面的链接中,例子会有问题,作者需增加 注① 的代码 ,即 WHEN-CLEAR-BLOCK的代码需和注①同时存在(查询发现EBS中PO的画面也是这么做的)。

最初我没有写 注② 和 注① 的代码 ,后经测试, 缺少这两部分会出现问题 ,还是举个例子说吧:

例: Line项只有一条记录,值为100,

1)正常查询出来记录后,汇总栏显示100;

2)修改记录值为99,汇总栏变为99;

3)按F11,会提示“是否保存记录”,选择“否”;

  --此时汇总栏值为99(正常情况下此时汇总栏显示100)。

4)执行Ctrl+F11;

  --此时汇总栏值依然为99(正常情况下此时汇总栏显示100,(且很大问题是此时Line值为100,汇总为99))。

所以:注② + 注①一定要写。

注③: Block的Delete Allowed设置为No,由于种种原因,Delete按钮是亮的。这种情况下,点击 Delete按钮 的时候会提示

        FRM-41049:You cannot delete this record.但是汇总量会被减掉,一直点下去,会一直减掉..直至负NNNN... APP_CALCULATE.RUNNING_TOTAL用法

        所以加上  注③,以避免这种情况时汇总量的错误。

至于其它在 APP_CALCULATE.RUNNING_TOTAL 中涉及到的 Trigger中是否要写以及如何写,还未测试,目前为止,应用正常。

(有一点问题,即"新增一条记录,保存,然后点击clear-record按钮",数量会减掉,还未解决,其余Trigger应该也需要加上,但是有几个Trigger好像在Block下面没有,但又有其它Trigger调用在它们中产生的全局变量,暂时未过多测试。。Busy。。)

另外,如果汇总结果要拿来与其它值作比较,比如超过了某个值则raise error,则要注意running_total和比较大小两者的先后顺序。

如在when-validate-item时比较,则在此trigger中先running_total,后比较,否则...


附APP_CALCULATE.RUNNING_TOTAL原代码:

点击查看代码
PACKAGE BODY app_calculate IS

  PROCEDURE running_total(event        VARCHAR2, 
                          source_field VARCHAR2, 
                          total_field  VARCHAR2) IS 
    Last_Val_Field  VARCHAR2(61) := Source_Field || '_RTOT_OLD'; 
    DB_Source_Field VARCHAR2(61) := Source_Field || '_RTOT_DB'; 
    DB_Total_Field  VARCHAR2(61) := Total_Field || '_RTOT_DB'; 
    Last_Value      NUMBER; 
    Source_Value    NUMBER; 
    DB_Source_Value NUMBER; 
    Total_Value     NUMBER := NVL(name_in(Total_Field), 0); 
    DB_Total_Value  NUMBER := NVL(name_in(DB_Total_Field), 0); 
    New_Total       NUMBER; 
    Form_Id         FORMMODULE; 
  BEGIN 
    COPY('Entering app_calculate.running_total.  Event is ' || event || '.', 
         'global.frd_debug'); 
    IF (event <> 'WHEN-CLEAR-BLOCK') THEN 
      Last_Value      := NVL(name_in(Last_Val_Field), 0); 
      Source_Value    := NVL(name_in(Source_Field), 0); 
      DB_Source_Value := NVL(name_in(DB_Source_Field), 0); 
    END IF; 
   
    IF (event = 'POST-QUERY') THEN 
      copy(to_char(Source_Value), DB_Source_Field); 
      copy(to_char(Source_Value), Last_Val_Field); 
     
    ELSIF (event = 'WHEN-CLEAR-BLOCK') THEN 
      IF (Total_Value <> DB_Total_Value) THEN 
        copy(to_char(DB_Total_Value), Total_Field); 
      END IF; 
     
    ELSIF (event = 'WHEN-VALIDATE-ITEM') THEN 
      IF (Source_Value <> Last_Value) THEN 
        New_Total := Total_Value - Last_Value + Source_Value; 
        copy(to_char(New_Total), Total_Field); 
        copy(to_char(Source_Value), Last_Val_Field); 
      END IF; 
     
    ELSIF (event = 'KEY-DELREC') THEN 
      IF (Last_Value <> 0) THEN 
        New_Total := Total_Value - Last_Value; 
        copy(to_char(New_Total), Total_Field); 
      END IF; 
      copy(to_char(Source_Value), Last_Val_Field); 
     
    ELSIF (event IN ('POST-INSERT', 'POST-UPDATE')) THEN 
      IF (Source_Value <> DB_Source_Value) THEN 
        copy(to_char(DB_Source_Value), Last_Val_Field); 
        copy(to_char(Source_Value), DB_Source_Field); 
      END IF; 
     
    ELSIF (event = 'PRE-RECORD') THEN 
      IF (Source_Value <> Last_Value) THEN 
        Form_Id := Find_Form(Get_Application_Property(Current_Form_Name)); 
        IF (Name_In('GLOBAL.RTOT_' || 
                    substr(source_field, 
                           1, 
                           least(instr(source_field, '.') - 1, 15)) || 
                    to_char(Form_id.id)) = 'N') THEN 
          copy(to_char(Last_Value), DB_Source_Field); 
        END IF; 
        copy(to_char(Source_Value), Last_Val_Field); 
      END IF; 
     
    ELSIF (event = 'PRE-COMMIT') THEN 
      Form_Id := Find_Form(Get_Application_Property(Current_Form_Name)); 
      copy('N', 
           'GLOBAL.RTOT_' || 
           substr(source_field, 1, least(instr(source_field, '.') - 1, 15)) || 
           to_char(Form_id.id)); 
     
    ELSIF (event = 'POST-FORMS-COMMIT') THEN 
      Form_Id := Find_Form(Get_Application_Property(Current_Form_Name)); 
      copy('Y', 
           'GLOBAL.RTOT_' || 
           substr(source_field, 1, least(instr(source_field, '.') - 1, 15)) || 
           to_char(Form_id.id)); 
      IF (Total_Value <> DB_Total_Value) THEN 
        copy(to_char(Total_Value), DB_Total_Field); 
      END IF; 
     
    ELSIF (event = 'UNDELETE') THEN 
      New_Total := Total_Value + Source_Value; 
      copy(to_char(New_Total), Total_Field); 
      copy(to_char(Source_Value), Last_Val_Field); 
     
    ELSIF (event = 'KEY-DUPREC') THEN 
      New_Total := Total_Value + Source_Value; 
      copy(to_char(New_Total), Total_Field); 
      copy(to_char(Source_Value), Last_Val_Field); 
      copy(NULL, DB_Source_Field); 
     
    ELSIF (event = 'KEY-CLRREC') THEN 
      IF (Last_Value <> DB_Source_Value) THEN 
        New_Total := Total_Value - Last_Value + DB_Source_Value; 
        copy(to_char(New_Total), Total_Field); 
      END IF; 
    ELSE 
      message('Invalid event ' || event || 
              ' in app_calulate.running_total'); 
    END IF; 
    COPY('Completed app_calculate.running_total.  Event is ' || event || '.', 
         'global.frd_debug'); 
   
  END running_total;

END app_calculate;

标签:copy,CALCULATE,Field,APP,DB,Value,Source,RUNNING,Total
From: https://www.cnblogs.com/dengxing/p/17183600.html

相关文章

  • APP测试
    B/s与C/S的区别:B/s:浏览器/服务器,用浏览器打开的系统C/s: 客户端/服务器维护角度:c/s工作量更大,b/s的升级只需要在服务器上升级,c/s的升级需要同时升级服务器和客户端......
  • 如何对单个列使用 apply() 函数?
    我有一个包含两列的熊猫数据框。我需要在不影响第二列的情况下更改第一列的值,并在仅更改第一列值的情况下取回整个数据框。apply()我怎样才能在熊猫中使用它?解答......
  • EBS fnd_global.apps_initialize的使用
    在pl/sql中模拟ebs环境,其目的主要在于解除pvd对视图或者同义词的限制条件能够显示出数据库内容,所以先得初始化环境变量方法如下:fnd_global.apps_initialize(user_ID,Resp......
  • 【android】通过 PackageManager 获得你想要的 App 信息
    一、前言开门见山,开篇明义。有些场景下,我们会需要获取一些其它App的各项信息,例如:App名称,包名、Icon等。这个时候就需要使用到PackageManager这个类了。本篇就Pack......
  • Controller配置方式及RequestMapping说明
    一.控制器controller控制器复杂提供访问应用程序的行为,通常通过接口定义和注解定义两种方式实现控制器负责解析用户的请求并将其转化为一个模型在springMVC中一个控制......
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:UsbSerial串口通讯组件
    本文简述如何在Smobiler中使用UsbSerial。Step1.新建一个SmobilerForm窗体,再拖入UsbSerial和Button,布局如下按钮事件代码://连接privatevoidbut......
  • 有关 power apps model-driven apps (CRM)主题的问题。
    Themingisusedtoenhancetheappuserinterface,notdrasticallyalterit.themeEntityType(Microsoft.Dynamics.CRM)|MicrosoftLearnChangethecolorschem......
  • 配置 uni-app 导航栏上按钮
    {"pages":[//pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages{"path":"pages/index/index",......
  • Flappybird(基于Unity)修改与完善
    项目分析在引擎中运行原游戏这是一个经典的游戏FlappyBird。在游戏中,我们需要点击空格键来使角色向上飞行来避开管道(障碍物),而不让小鸟碰到这些障碍物或飞出屏幕。游戏......
  • 说一下在写Android APP时遇到的具体问题
    问题一:总是显示出nosuchtable错误不要担心这个问题(该担心还是得担心一下的哈),以我出错多次的经验来看,只需要在运行APP之后,回到虚拟机的主界面,然后找到相应的APP虚拟软件,......