You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle Apex中实现订单关联实体及相关功能

在Oracle Apex中实现订单-订单项主从结构的正确方案

一、先确认表结构约束(基础前提)

确保你的表满足以下关联规则:

  • COMMANDES表:ID_COMMANDE(主键,关联序列)、DATE_COMMANDE(默认SYSTIMESTAMP)、PRIX(数值类型,存储总价)
  • LIGNESCOMMANDES表:ID_LIGNE(主键)、ID_COMMANDE(外键关联COMMANDES.ID_COMMANDE)、ID_BIERE(外键关联BIERES.ID_BIERE)、QUANTITE(数值类型,订单数量)
  • BIERES表:ID_BIERE(主键)、PRIX_UNITAIRE(单价)、其他啤酒属性(如名称、类型)

二、主从(Master-Detail)页面的正确配置

主从结构是这类场景的最优选择,重点解决以下配置细节:

  1. 创建主从页面

    • 选择主表为COMMANDES,从表为LIGNESCOMMANDES,关联字段选ID_COMMANDE
    • 主表表单中:将ID_COMMANDE设置为隐藏,源选择对应序列,提交时自动获取序列值;DATE_COMMANDE设置为只读,默认值用SYSTIMESTAMP;PRIX设置为只读,后续自动计算填充
    • 从表用交互式网格,隐藏ID_COMMANDE列,设置其源为页面主表的ID_COMMANDE项(如:P100_ID_COMMANDE),确保新增订单项时自动关联当前订单
  2. 从表交互式网格优化

    • 将ID_BIERE列设置为选择列表,显示值选啤酒名称(如LIBELLE_BIERE),返回值选ID_BIERE,并添加额外显示字段PRIX_UNITAIRE(方便用户查看单价)
    • QUANTITE列设置为数字字段,添加验证规则确保输入正整数
    • 可选:新增计算列SOUS_TOTAL,公式为QUANTITE * PRIX_UNITAIRE,用于显示每行小计

三、自动计算订单总价的两种实现方式

方式1:数据库触发器(推荐,确保数据一致性)

通过触发器在订单项变更时自动更新订单总价,无需依赖页面逻辑:

CREATE OR REPLACE TRIGGER TRG_MAJ_PRIX_COMMANDE
AFTER INSERT OR UPDATE OR DELETE ON LIGNESCOMMANDES
FOR EACH ROW
DECLARE
    v_id_commande COMMANDES.ID_COMMANDE%TYPE;
BEGIN
    -- 获取关联的订单ID(新增取新值,删除取旧值)
    v_id_commande := COALESCE(:NEW.ID_COMMANDE, :OLD.ID_COMMANDE);
    
    -- 更新订单总价
    UPDATE COMMANDES c
    SET c.PRIX = (
        SELECT NVL(SUM(lc.QUANTITE * b.PRIX_UNITAIRE), 0)
        FROM LIGNESCOMMANDES lc
        JOIN BIERES b ON lc.ID_BIERE = b.ID_BIERE
        WHERE lc.ID_COMMANDE = v_id_commande
    )
    WHERE c.ID_COMMANDE = v_id_commande;
END;
/

页面上只需在从表交互式网格操作后,刷新主表的PRIX字段即可(添加动态动作:当从表行变更时,刷新主表区域)

方式2:页面动态动作(适合快速调试)

在从表交互式网格添加动态动作,当QUANTITE或ID_BIERE变化时执行计算:

  • 触发条件:QUANTITE或ID_BIERE字段值变更
  • 动作类型:执行PL/SQL代码
  • PL/SQL代码:
UPDATE COMMANDES c
SET c.PRIX = (
    SELECT SUM(lc.QUANTITE * b.PRIX_UNITAIRE)
    FROM LIGNESCOMMANDES lc
    JOIN BIERES b ON lc.ID_BIERE = b.ID_BIERE
    WHERE lc.ID_COMMANDE = :P100_ID_COMMANDE
)
WHERE c.ID_COMMANDE = :P100_ID_COMMANDE;
  • 执行后刷新主表的PRIX区域

四、常见问题排查

  • 主表ID_COMMANDE未自动填充:检查表单中ID_COMMANDE的源是否正确关联序列,提交方式是否为"提交时获取值"
  • 从表无法关联主表ID:确认从表ID_COMMANDE列的源设置为页面主表的ID项,且为隐藏状态
  • 总价不更新:检查触发器是否编译通过,或动态动作的触发条件是否覆盖所有订单项变更场景(新增、修改、删除)

内容的提问来源于stack exchange,提问作者ThomasT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:55:29