如何在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)页面的正确配置
主从结构是这类场景的最优选择,重点解决以下配置细节:
创建主从页面
- 选择主表为
COMMANDES,从表为LIGNESCOMMANDES,关联字段选ID_COMMANDE - 主表表单中:将
ID_COMMANDE设置为隐藏,源选择对应序列,提交时自动获取序列值;DATE_COMMANDE设置为只读,默认值用SYSTIMESTAMP;PRIX设置为只读,后续自动计算填充 - 从表用交互式网格,隐藏
ID_COMMANDE列,设置其源为页面主表的ID_COMMANDE项(如:P100_ID_COMMANDE),确保新增订单项时自动关联当前订单
- 选择主表为
从表交互式网格优化
- 将
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
相关产品推荐
相关产品推荐

