Daily Field Report Equipment标签切换时未保存记录丢失问题
问题描述
在Daily Field Report自定义界面中,为Equipment视图添加记录分组功能后出现异常:代码可正常实现分组展示效果,但存在未保存记录丢失问题——在Equipment标签页新增记录后不执行保存操作,切换到Inventory标签页新增记录,再切回Equipment标签页时,之前新增的未保存记录会从界面消失。
复现参考截图
- 未修改代码的原生运行效果

- 加入分组逻辑后的代码运行效果

问题根因
自定义的equipment()视图委托存在两个逻辑缺陷:
- 委托仅返回了数据库聚合查询的结果 + 缓存当前(Current)对象,没有遍历返回缓存中所有处于未持久化状态的新增/修改记录。切换标签页时框架会重新执行视图委托拉取数据重绘界面,未被委托返回的缓存未保存记录不会被加载到UI层,表现为记录"消失"。
- 代码末尾手动设置
cache.IsDirty = false,强制将缓存标记为已干净状态,干扰了框架本身对未保存变更的追踪逻辑。
修复方案
- 移除手动设置
cache.IsDirty = false的代码,缓存脏状态由框架自动管理,不要手动干预。 - 在数据库查询结果返回完成后,追加遍历缓存中所有插入状态的未保存记录,通过分组字段去重后一并返回,保证视图重绘时所有未保存记录都能被加载到界面。
- 对最后返回的Current对象也做去重判断,避免界面出现重复条目。
修复后参考代码
protected virtual IEnumerable equipment() { PXCache cache = Base.Caches[typeof(EquipmentProjection)]; HashSet<(int? dailyFieldReportId, string timeCardCD)> returnedRecordKeys = new HashSet<(int?, string)>(); int? currentReportId = Base.Caches<DailyFieldReport>().Current?.DailyFieldReportId; // 返回数据库聚合分组的已持久化记录 foreach (PXResult<EquipmentProjection> res in SelectFrom<EquipmentProjection> .Where<EquipmentProjection.dailyFieldReportId .IsEqual<DailyFieldReport.dailyFieldReportId.FromCurrent>> .AggregateTo<GroupBy<EquipmentProjection.timeCardCD>>.View.Select(Base)) { EquipmentProjection equipment = res; returnedRecordKeys.Add((equipment.DailyFieldReportId, equipment.TimeCardCD)); yield return equipment; } // 追加缓存中所有未持久化的新增记录 foreach (EquipmentProjection insertRecord in cache.CacheInserted) { if (insertRecord.DailyFieldReportId == currentReportId && !returnedRecordKeys.Contains((insertRecord.DailyFieldReportId, insertRecord.TimeCardCD))) { returnedRecordKeys.Add((insertRecord.DailyFieldReportId, insertRecord.TimeCardCD)); yield return insertRecord; } } // 最后返回当前缓存对象,避免重复 if (cache.Current is EquipmentProjection currentRecord && currentRecord.DailyFieldReportId == currentReportId && !returnedRecordKeys.Contains((currentRecord.DailyFieldReportId, currentRecord.TimeCardCD))) { yield return currentRecord; } }
补充说明:如果业务场景中存在未保存的修改记录也需要纳入分组展示,可以在遍历缓存新增记录的逻辑后,追加遍历
cache.CacheUpdated集合,用同样的去重逻辑返回即可。
内容的提问来源于stack exchange,提问作者Marco A.
相关产品推荐
相关产品推荐

