Epicor自定义中如何按条件禁用字段?跨表调用RcvMisc报错求助
Epicor RcvHead中调用RcvMisc表并按条件禁用字段的解决方案
问题核心
在RcvHead场景下按条件禁用字段时,出现edvRcvMisc不存在于当前上下文的报错,本质是默认上下文未加载RcvMisc相关数据/视图,且错误引用了客户端数据视图而非对应上下文实体。
具体解决步骤
1. 服务器端BPM实现(推荐)
如果用BPM处理,直接通过Db上下文查询RcvMisc数据,不要用EDV(客户端数据视图):
- 先获取当前RcvHead的关联键(Company、PackNum),以此关联查询RcvMisc:
// 遍历ttRcvHead中的事务行 foreach(var rcvHeadRow in ttRcvHead) { // 查询关联的RcvMisc数据 var relatedMiscs = Db.RcvMisc .Where(rm => rm.Company == rcvHeadRow.Company && rm.PackNum == rcvHeadRow.PackNum) .ToList(); // 根据RcvMisc的条件判断,禁用目标字段 if(relatedMiscs.Any(rm => rm.MiscCode == "特定编码")) // 替换为你的实际判断条件 { rcvHeadRow.SetFieldEnabled("InvoiceNum", false); // 替换为要禁用的字段名 } else { rcvHeadRow.SetFieldEnabled("InvoiceNum", true); } }
2. 客户端UI自定义脚本实现
如果是在客户端自定义脚本中操作,需确保RcvMisc数据视图已加载:
- 先获取RcvMisc的数据视图,判断是否存在:
// 获取RcvMisc数据视图 EpiDataView edvRcvMisc = oTrans.EpiDataViews["RcvMisc"] as EpiDataView; if(edvRcvMisc == null) { // 若视图未加载,手动添加到当前事务 oTrans.Add("RcvMisc"); edvRcvMisc = oTrans.EpiDataViews["RcvMisc"] as EpiDataView; } // 获取当前RcvHead行 EpiDataView edvRcvHead = oTrans.EpiDataViews["RcvHead"] as EpiDataView; if(edvRcvHead.CurrentDataRow != null && edvRcvMisc != null) { // 关联查询RcvMisc数据 string company = edvRcvHead.CurrentDataRow["Company"].ToString(); int packNum = (int)edvRcvHead.CurrentDataRow["PackNum"]; var miscRow = edvRcvMisc.Rows.Find(new object[] { company, packNum }); // 条件判断并禁用字段 if(miscRow != null && miscRow["MiscCode"].ToString() == "特定编码") { edvRcvHead.CurrentDataRow.SetFieldEnabled("InvoiceNum", false); } }
关键注意点
- 服务器端BPM中不要用edv开头的数据视图,这类是客户端专属视图,服务器端直接用
Db.表名访问实体 - 关联RcvHead和RcvMisc的核心字段是
Company和PackNum,确保查询条件包含这两个字段 - 客户端脚本中若RcvMisc视图未加载,需调用
oTrans.Add("RcvMisc")手动添加到当前事务
内容的提问来源于stack exchange,提问作者Nadila
相关产品推荐
相关产品推荐

