You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:25:32