如何在Microsoft Dynamics D365的PO表单中设置必填下拉框?
PO表单下拉框强制必须选择Yes的实现方案
问题背景
采购订单(PO)表单上的ERPOverrideFixedAsset字段是绑定NoYesBlank类型EDT的下拉框,无法通过UI设置为必填项。之前写的COC代码在validateWrite里做校验,但因为下拉框始终有可选值(Blank/No/Yes),原生必填校验不会触发,需要通过代码强制用户必须选择Yes才能保存表单。
优化后的实现代码
保存时校验(基础版)
[ExtensionOf(formDataSourceStr(PurchTable, PurchTable))] final class PurchTable_DS_Extension { public boolean validateWrite() { boolean ret = next validateWrite(); PurchTable purchTable = this.cursor(); // 强制校验:只有选择Yes才能保存 if (ret && purchTable.ERPOverrideFixedAsset != NoYesBlank::Yes) { checkFailed("必须选择\"覆盖固定资产\"选项"); ret = false; } return ret; } }
实时校验(进阶版,字段值变化即提示)
如果需要在用户选择后立刻提示,而非等到保存时才报错,可以添加validateField方法:
[ExtensionOf(formDataSourceStr(PurchTable, PurchTable))] final class PurchTable_DS_Extension { public boolean validateWrite() { boolean ret = next validateWrite(); PurchTable purchTable = this.cursor(); if (ret && purchTable.ERPOverrideFixedAsset != NoYesBlank::Yes) { checkFailed("必须选择\"覆盖固定资产\"选项"); ret = false; } return ret; } public boolean validateField(FieldId _fieldId) { boolean ret = next validateField(_fieldId); if (ret && _fieldId == fieldNum(PurchTable, ERPOverrideFixedAsset)) { PurchTable purchTable = this.cursor(); if (purchTable.ERPOverrideFixedAsset != NoYesBlank::Yes) { checkFailed("必须选择\"覆盖固定资产\"选项"); ret = false; } } return ret; } }
核心说明
- 原代码逻辑本身没问题,调整后更清晰:只要字段值不是
NoYesBlank::Yes,就阻止保存并给出明确提示,直接绕开原生必填校验需要空值的限制。 - 进阶版的
validateField方法能在用户选择Blank或No时立刻触发提示,提升用户体验,避免到保存时才发现问题。 - 如果需要让下拉框初始状态看起来是空的,可以在表单数据源的
init方法里把字段默认值设为NoYesBlank::Blank,确保用户必须主动选择。
内容的提问来源于stack exchange,提问作者Saba Iqbal
相关产品推荐
相关产品推荐

