Oracle Form 弹性域上的个性化

分析与解决思路

难点

  1. (键/描述性)弹性域的LOV来自值集,但是值集不存在Form的LOV定义中,而且值集不支持:BLOCK.ITEM引用,也不支持全局变量:GLOBAL.XX 的引用
  2. (键)弹性域段不在当前 block 中,所以无法通过动态创建 record group 实现
  3. (键)弹性域段LOV值集应用于整个系统中,如何确保只动态改变当前session的LOV而不影响其他的地方。

解决思路

  1. 不同的FORM窗口、不同的USER等均为独立 session,所以能不能在session层次上控制值集的动态修改。这样即使同一用户、同一权限下打开多个窗口,值集的数据也互不影响。
  2. 如何在session层次上控制?创建Session 级临时表可以做到。
  3. 有了session级临时表,如何动态的创建值集?
    只需要在原值集的基础上加 NOT EXISTS 临时表即可。
    首先FORM打开时session临时表里并没有数据,那么NOT EXISTS 临时表后的值集依然是原值集,这就控制住了其他地方用此弹性域值集并不受影响。
    而需要动态修改值集的地方,我们只需要动态修改session临时表里的数据即可。(详细见下面的实例分析)。
  4. 弹性域值集定义好后,此时就需要在相应的form调用地方,对临时表进行动态的赋值,从而实现弹性域的动态LOV。

这里写图片描述

案例分析

需求分析

  • 换件号业务,通过工单完工的形式把A物料发料掉换B物料完工。
    即:创建物料需求时,当通过任务号查出来装配件为A物料,则下方的组件的LOV应该替换成A对应的可换物料的LOV.(换件号物料映射关系存在一张表内)

这里写图片描述

  • 组件物料是一个键弹性域。

这里写图片描述

  • (键)弹性域段LOV值集应用于整个系统中,如何确保只动态改变当前session的LOV而不影响其他的地方。

实现步骤

  • 新建一个session级临时表
Create Global Temporary Table CUX.CUX_DWMS_ITEMS_TEMP
(
 ORGANIZATION_ID Number Not Null,
 ITEM_ID Number Not Null
) ON COMMIT PRESERVE ROWS;
comment on table CUX.CUX_DWMS_ITEMS_TEMP is '物料临时表';
comment on column CUX.CUX_DWMS_ITEMS_TEMP.ORGANIZATION_ID is '组织ID';
comment on column CUX.CUX_DWMS_ITEMS_TEMP.ITEM_ID is '物料ID';
Create Synonym apps.CUX_DWMS_ITEMS_TEMP For CUX.CUX_DWMS_ITEMS_TEMP;

  • 定义弹性域值集,在原值集基础上加NOT EXISTS 临时表

这里写图片描述

  • 通过个性化给临时表赋值
    装配件不为空且进入行块时触发。

这里写图片描述

通过FORMS_DDL功能更新临时表的数据从而更改值集(value set)的记录。

这里写图片描述

='BEGIN DELETE FROM cux_dwms_items_temp; 
INSERT INTO cux_dwms_items_temp SELECT msi.organization_id, msi.inventory_item_id 
FROM mtl_system_items_vl msi, mtl_parameters mp
WHERE 1 = 1 AND mp.organization_id = msi.organization_id AND mp.organization_code = ''WCM'' 
AND NOT EXISTS (SELECT 1 FROM cux_dwms_items_mapping cdip WHERE cdip.new_item_id = msi.inventory_item_id AND cdip.old_item_id = ''' || :WIPMRMDF_ENTITY.PRIMARY_ITEM_ID || ''');END;' 

  • 效果
    通过映射表可以查看装配件对应的组件。

这里写图片描述

则最终动态LOV显示效果:

这里写图片描述

待优化的问题

创建的session临时表没法创建索引,导致查询显示效果慢。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值