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
相关产品推荐
相关产品推荐

