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

Acumatica客户界面API数据Grid仅显示首行问题求助

解决方案:非持久化DAC + 内存缓存视图实现多数据展示

针对你遇到的PXFilter仅显示单条数据、PXSelect触发数据库查询报错的问题,可通过非持久化DAC+PXSelectReadOnly内存视图的方案实现无数据库依赖的多数据展示,具体步骤如下:

1. 修正BookMarkHistory DAC的非持久化标记

给DAC添加[PXNonPersistent]特性,明确告知Acumatica该对象无需数据库存储:

[PXNonPersistent]
[PXCacheName("Bookmark History")]
public class BookMarkHistory : IBqlTable
{
    [PXString(50)]
    [PXUIField(DisplayName = "Bookmark ID")]
    public virtual string BookmarkID { get; set; }
    public abstract class bookmarkID : PX.Data.BQL.BqlString.Field<bookmarkID> { }

    [PXString(200)]
    [PXUIField(DisplayName = "Bookmark Name")]
    public virtual string BookmarkName { get; set; }
    public abstract class bookmarkName : PX.Data.BQL.BqlString.Field<bookmarkName> { }

    // 其他自定义字段...
}

2. 在CustomerMaint扩展中替换视图类型

用PXSelectReadOnly替代PXFilter,该视图仅操作内存缓存,不会触发数据库查询:

public class CustomerMaint_Extension : PXGraphExtension<CustomerMaint>
{
    // 定义只读视图,关联非持久化DAC
    public PXSelectReadOnly<BookMarkHistory> BookmarkHistoryView;

    // 从API加载数据并填充缓存的方法
    public void LoadBookmarkHistory()
    {
        // 清空缓存避免旧数据残留
        BookmarkHistoryView.Cache.Clear();

        // 调用外部API获取数据(替换为你的实际API逻辑)
        var apiBookmarks = FetchBookmarksFromAPI(Base.CurrentCustomer.BAccountID);

        foreach (var apiItem in apiBookmarks)
        {
            var historyItem = new BookMarkHistory
            {
                BookmarkID = apiItem.Id,
                BookmarkName = apiItem.Name
                // 其他字段赋值...
            };
            // 将数据插入内存缓存
            BookmarkHistoryView.Cache.Insert(historyItem);
        }

        // 触发Grid刷新
        BookmarkHistoryView.View.RequestRefresh();
    }

    // 绑定客户选择事件,自动加载数据
    protected virtual void _(Events.RowSelected<BAccount> e)
    {
        if (e.Row != null)
        {
            LoadBookmarkHistory();
        }
    }

    // 模拟API数据返回(实际场景替换为真实API调用)
    private List<ExternalBookmark> FetchBookmarksFromAPI(string customerId)
    {
        return new List<ExternalBookmark>
        {
            new ExternalBookmark { Id = "BM001", Name = "最近发票" },
            new ExternalBookmark { Id = "BM002", Name = "付款历史" },
            new ExternalBookmark { Id = "BM003", Name = "信用额度查询" },
            new ExternalBookmark { Id = "BM004", Name = "联系人列表" },
            new ExternalBookmark { Id = "BM005", Name = "逾期账单" }
        };
    }

    // 外部API数据模型(按需定义)
    private class ExternalBookmark
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
}

3. 调整Grid数据源配置

在AR303000界面的Grid配置中,将数据源指定为扩展中的BookmarkHistoryView,并确保Grid的AutoRefresh属性开启,或通过代码中的RequestRefresh()触发界面更新。

关键注意事项

  • PXSelectReadOnly仅操作内存缓存,不会生成SQL查询,完美适配非持久化DAC场景。
  • 每次加载数据前必须清空缓存,避免新旧数据混淆。
  • 插入缓存时使用Cache.Insert()方法,确保数据被正确加入缓存集合。
  • 若需支持Grid编辑操作,可改用PXSelect配合PXNonPersistentDAC,并重写Graph的Persist方法处理自定义数据逻辑(只读场景用PXSelectReadOnly即可)。

内容的提问来源于stack exchange,提问作者TheCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:02