Oracle 10g XE Forms如何跨数据块取值求和赋值给目标块项
Oracle 10g Forms 跨数据块合计值赋值实现方案
你现有两个块的内部合计功能已经正常运行,不需要改动原有合计逻辑,只需要补全跨块取值赋值、触发时机配置即可,步骤如下:
前置确认
先到对象导航器中核对3个关键项的正式对象名(不要用画布上的显示标签当对象名):
- Menu Block下的合计display item名称,下文示例用
menu_total指代 - Drink Block下的合计display item名称,下文示例用
drink_total指代 - Payment Block下的目标赋值项
pay_amount,块名默认对应PAYMENT
第一步:新建通用计算过程
在Form级Program Units下新建一个存储过程,避免重复写相同代码,过程名设为update_pay_amount,代码如下:
PROCEDURE update_pay_amount IS BEGIN -- 空值按0处理,避免单块无数据时null参与运算导致结果为空 :PAYMENT.pay_amount := NVL(:MENU_BLOCK.menu_total, 0) + NVL(:DRINK_BLOCK.drink_total, 0); END;
注意把代码里的块名、项名替换成你自己环境里的实际对象名。
第二步:绑定触发时机
需要在所有可能导致两个块合计值变化的节点调用上面的过程,避免金额不刷新,按以下位置加触发器,触发器内只需要写一行调用代码update_pay_amount;即可:
- Menu Block、Drink Block的块级
WHEN-VALIDATE-RECORD触发器:用户修改、提交块内记录触发校验时,自动重算总金额 - Menu Block、Drink Block的块级
POST-QUERY触发器:注意执行顺序,先执行你原有块内合计的计算逻辑,最后再调用update_pay_amount;,保证取到的是最新的合计值,覆盖查询加载数据的场景 - 如果两个块允许用户手动新增、删除行,还要在两个块的块级
WHEN-CREATE-RECORD、WHEN-REMOVE-RECORD触发器中加调用逻辑,覆盖增删行的场景 - Form级
WHEN-NEW-FORM-INSTANCE触发器:表单初始化加载时自动计算一次,避免刚进入页面pay_amount为空
常见避坑
- 不要把计算逻辑写在单个字段的Item级触发器上,会漏触发块内其他行修改导致的合计变化
- 如果你两个块的合计项是通过设置项的
Calculation Mode=Summary实现的自动汇总,直接按块名.项名的方式引用即可,不需要额外写取值逻辑,Forms会自动返回汇总后的显示值 - 如果业务要求pay_amount完全自动计算不允许手动修改,直接把pay_amount项的
Insert Allowed、Update Allowed属性设为No,避免误操作;如果允许手动调整金额,就不要在POST-QUERY之外的触发器里强制覆盖用户输入的值 - 10g XE版本中null和任何数值做加法结果都是null,必须加
NVL处理空值,不要漏写
内容的提问来源于stack exchange,提问作者user17551842
相关产品推荐
相关产品推荐

