PriceDiscAdm窗体添加EcoResProduct字段触发异常新建记录问题
D365FO PriceDiscAdm窗体加EcoResProduct字段触发自动建产品记录修复方案
问题根因
问题出在新增关联数据源的属性和关联类型配置错误:新增InventTable、EcoResProduct作为关联展示用数据源时,保留了数据源默认的可写配置,系统识别关联链路后,会在主数据源PriceDiscAdmTrans新建记录时,顺着关联关系给上层关联的数据源初始化新记录缓冲区,最终触发EcoResProduct的插入逻辑,本质是把只读关联的展示数据源当成了和主表联动的业务数据源。
修复步骤
- 打开PriceDiscAdm窗体设计器,定位到你新增的
InventTable、EcoResProduct两个数据源 - 逐个修改两个数据源的核心属性:
AllowCreate:设为NoAllowEdit:设为NoAllowDelete:设为NoInsertIfEmpty:设为NoReadOnly:设为Yes
- 校验关联链路配置:
关联链路必须遵循外键逻辑:
PriceDiscAdmTrans(主数据源) ->InventTable->EcoResProduct,所有层级关联的LinkType统一设为OuterJoin,禁止使用会触发跨数据源记录联动的关联类型- InventTable数据源的
JoinSource绑定到PriceDiscAdmTrans,关联字段为PriceDiscAdmTrans.ItemId == InventTable.ItemId - EcoResProduct数据源的
JoinSource绑定到InventTable,直接使用表原生的InventTable.Product == EcoResProduct.RecId关联关系即可
- InventTable数据源的
- 兜底校验(属性配置完仍有问题时使用):给两个新增数据源重写
write、initValue方法,直接阻断写入逻辑:public void initValue() { // 只读展示数据源无需初始化新记录 return; } public void write() { // 只读展示数据源禁止写入操作 return; } - 保存修改后重新编译、同步数据库,清空客户端缓存后验证:新建PriceDiscAdmTrans记录时不会再触发EcoResProduct新建,网格中绑定的EcoResProduct字段可正常展示已有产品的对应信息。
避坑提示
不要跳过InventTable直接给PriceDiscAdmTrans加EcoResProduct引用数据源,PriceDiscAdmTrans的外键是通过ItemId关联InventTable,没有直接关联EcoResProduct的RecId字段,跨层直接关联会被系统识别为主数据新建场景。
内容的提问来源于stack exchange,提问作者LaSTeR
相关产品推荐
相关产品推荐

