在 Oracle Apex 中保存之前进行交互式网格验证

问题描述 投票:0回答:2

我的数据库中有 2 个表:purchase_order 和purchase_order_details。

purchase_order
有一列
max_amount
代表可以按该顺序花费的总金额,并且
purchase_order_details
item_id
price
,在保存之前必须满足此条件
max_amount<sum(price)

我需要的是计算旧的总和,添加新插入的总和并验证它是否小于允许的最大金额。

所以我写了这个pl/sql验证函数

DECLARE
mx_amount number;
sum_prices number;
BEGIN
select max_amount into mx_amount from purchase_order where id=:P11_ID;
select sum(price) into sum_prices from purchase_order_details where order_id=:P11_ID;
IF mx_amount<=sum_prices then return true; 
else return false;
END IF;
END;

这段代码的问题是新插入的值不在数据库中,所以它总是返回 true 并且我不知道如何引用 IG 数据来执行类似的操作:

DECLARE
NEW_PRICES number;
BEGIN
select sum(:price) into NEW_PRICES from dual;

其中

:price
是每行的 IG 价格列。 那么我如何计算旧的总和,添加新插入的总和并验证它是否小于允许的最大金额,例如,如果我只有 1000 美元,用户不能购买 1500 美元,所以我必须检查总和是否小于或等于验证插入。

plsql oracle-apex
2个回答
0
投票

如果 IG 中显示序列,即主键,则列 SEQ。

DECLARE
mx_amount number;
sum_prices number;
BEGIN
select max_amount into mx_amount from purchase_order where id=:P11_ID;
select sum(price)+:price into sum_prices from purchase_order_details where order_id=:P11_ID and seq<>:seq;
IF mx_amount<=sum_prices then return true; 
else return false;
END IF;
END;

0
投票

如何在采购订单表中添加“amount_spent”列,并对其添加一个检查约束,使其金额小于 max_amount。 然后在您的 APEX 页面中,您需要在页面中放置 2 个模型(您可能已经拥有)。保存之前,您计算花费的金额并更新采购订单模型。您可以使用 apex.model.save() 执行保存:这将在 1 个事务中发送两个模型的更新。 通过这种方法,不仅当支出金额过高时,您会遇到交易约束违规,而且如果同时另一个用户更新了采购订单行,您也会收到错误。 如果数据库中的采购订单也可以通过 APEX 外部的其他方式进行更新,则此解决方案是不够的,您需要在数据库中使用更重型的解决方案来完全保护它。

© www.soinside.com 2019 - 2024. All rights reserved.