分析与解决思路
难点
- (键/描述性)弹性域的LOV来自值集,但是值集不存在Form的LOV定义中,而且值集不支持:BLOCK.ITEM引用,也不支持全局变量:GLOBAL.XX 的引用
- (键)弹性域段不在当前 block 中,所以无法通过动态创建 record group 实现
- (键)弹性域段LOV值集应用于整个系统中,如何确保只动态改变当前session的LOV而不影响其他的地方。
解决思路
- 不同的FORM窗口、不同的USER等均为独立 session,所以能不能在session层次上控制值集的动态修改。这样即使同一用户、同一权限下打开多个窗口,值集的数据也互不影响。
- 如何在session层次上控制?创建Session 级临时表可以做到。
- 有了session级临时表,如何动态的创建值集?
只需要在原值集的基础上加 NOT EXISTS 临时表即可。
首先FORM打开时session临时表里并没有数据,那么NOT EXISTS 临时表后的值集依然是原值集,这就控制住了其他地方用此弹性域值集并不受影响。
而需要动态修改值集的地方,我们只需要动态修改session临时表里的数据即可。(详细见下面的实例分析)。 - 弹性域值集定义好后,此时就需要在相应的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临时表没法创建索引,导致查询显示效果慢。