PXFilter<AgeingDAC>无法向内存缓存插入记录的技术问题
问题解决:无法向Acumatica内存缓存插入记录
问题根源
你使用PXFilter<AgeingDAC>定义DetailsView,但PXFilter的缓存是专门用于存储单一筛选条件的,并非设计用来存储多行数据集合,因此调用Cache.Insert无法成功插入多条记录到该缓存中。
解决方案
1. 更换视图类型
将DetailsView的类型从PXFilter改为适合存储多行内存数据的视图类型,比如PXSelectReadOnly<AgeingDAC>(仅展示)或PXSelect<AgeingDAC>(支持编辑),也可以用PXProcessing<AgeingDAC>(适合批量操作场景)。
修改后的Graph代码:
public class StockAgeing : PXGraph<StockAgeing> { public PXSave<AgeingDAC> Save; public PXCancel<AgeingDAC> Cancel; public PXFilter<AgeingFilter> MasterView; // 替换为PXSelectReadOnly用于只读展示,如需编辑则用PXSelect<AgeingDAC> public PXSelectReadOnly<AgeingDAC> DetailsView; }
2. 标记DAC为虚拟(可选但推荐)
为了明确该DAC仅用于内存存储、不绑定任何数据库表,可以添加[PXVirtual]属性:
[Serializable] [PXCacheName("AgeingDAC")] [PXVirtual] // 标记为虚拟DAC,完全基于内存 public class AgeingDAC : IBqlTable { #region UsrItemCode [PXInt(IsKey = true)] [PXUIField(DisplayName = "Item Code")] public virtual int? UsrItemCode { get; set; } public abstract class usrItemCode : PX.Data.BQL.BqlInt.Field<usrItemCode> { } #endregion #region UsrItemDesc [PXString(255)] [PXUIField(DisplayName = "Item Desc")] public virtual string UsrItemDesc { get; set; } public abstract class usrItemDesc : PX.Data.BQL.BqlString.Field<usrItemDesc> { } #endregion }
3. 确保主键唯一
由于UsrItemCode被标记为IsKey = true,插入的每条新记录必须拥有唯一的UsrItemCode值,否则缓存会因主键冲突拒绝插入。可以通过自增序号等方式生成唯一主键:
// 示例:生成自增主键 int nextKey = (DetailsView.Cache.Select().Count() + 1); AgeingDAC newRec = new AgeingDAC { UsrItemCode = nextKey, UsrItemDesc = "测试描述" }; AgeingDAC insertedRecord = DetailsView.Cache.Insert(newRec) as AgeingDAC;
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

