Oracle Apps R12中如何基于条件设置DFF字段为必填项?
在Oracle Apps R12中实现DFF字段的条件必填
完全可以实现你说的需求——当某个DFF字段值为特定内容时,强制另一个DFF字段必填。你之前用表单个性化没捕获到事件,大概率是没找对DFF对应的实际表单项,或者选了不合适的触发事件。下面给你两种可行的方案:
方案一:表单个性化(针对DFF项的验证触发器)
定位DFF的实际表单项
打开销售订单表单,进入Help -> Diagnostics -> Examine,先选DFF所在的块(比如行级DFF对应OE_ORDER_LINES_UI下的LINE_DFF块,头级是HEADER_DFF),找到Field1和Field2对应的实际项名,一般是ATTRIBUTE1、ATTRIBUTE2这类命名(取决于你DFF的设置)。创建条件触发的个性化
- 进入表单个性化(
Help -> Diagnostics -> Custom Code -> Personalize),定位到目标表单。 - 新建第一个个性化:
- 触发事件选
When-Validate-Item,触发对象选Field1对应的实际项(比如ATTRIBUTE1)。 - 条件栏填写:
:LINE_DFF.ATTRIBUTE1 = 'Yes'(替换成你实际的块名和项名)。 - 动作类型选
Property,对象类型Item,对象选Field2的实际项(比如ATTRIBUTE2),属性选Required,值设为Y。
- 触发事件选
- 新建第二个反向个性化:
- 同样的触发事件和对象,条件改为
:LINE_DFF.ATTRIBUTE1 <> 'Yes'。 - 动作把
Required属性设为N。
- 同样的触发事件和对象,条件改为
- 进入表单个性化(
方案二:结合DFF值集验证+表单个性化
如果方案一的触发器没生效(比如DFF是弹出窗口式的),可以用值集验证配合个性化:
给Field2的DFF值集加自定义验证函数
写一个PL/SQL函数,逻辑是:检查当前会话中Field1的值(可以通过:BLOCK_NAME.ATTRIBUTE1获取),如果是Yes且Field2为空,就抛出错误。示例函数大概这样:FUNCTION VALIDATE_FIELD2 RETURN BOOLEAN IS BEGIN IF :LINE_DFF.ATTRIBUTE1 = 'Yes' AND :LINE_DFF.ATTRIBUTE2 IS NULL THEN FND_MESSAGE.SET_NAME('XX', 'XX_FIELD2_REQUIRED'); FND_MESSAGE.RAISE_ERROR; RETURN FALSE; END IF; RETURN TRUE; END;把这个函数关联到Field2的DFF值集的“验证函数”字段。
表单个性化强制验证
新建个性化,触发事件选When-New-Item-Instance(当用户从Field1切换到其他项时触发),动作类型选PL/SQL,执行代码:APP_ITEM_PROPERTY.VALIDATE_ITEM('LINE_DFF.ATTRIBUTE2');
注意事项
- 一定要用Examine工具确认DFF的块和项名,这是关键,别用自定义的显示名称去找。
- 如果你的DFF是弹出窗口(点击图标打开的那种),需要针对弹出窗口的表单块做个性化,而不是主表单的块。
- 测试时要覆盖新增记录、修改已有记录的场景,确保两种情况都生效。
内容的提问来源于stack exchange,提问作者Gopi
相关产品推荐
相关产品推荐

