如何通过BLC代码打开带指定记录的通用查询(Generic Inquiry)界面并自动填充字段?
如何通过BLC代码打开带指定记录的通用查询(Generic Inquiry)界面并自动填充字段?
看起来你踩了一个常见的小坑——你现在打开的是通用查询的设计界面(GenericInquiryDesigner),而不是用来运行查询、展示数据的运行界面,这就是为啥手动打开能正常显示字段数据,但代码打开不行的核心原因!
问题分析
你的代码里实例化的GenericInquiryDesigner是Acumatica中用于创建、编辑通用查询的设计器图,它的职责是定义GI的结构(筛选、字段、关联等),而不是执行查询并展示结果。所以即便你设置了Designs.Current,它也不会自动加载数据或填充筛选字段。
正确的实现方法
要打开能自动加载数据、填充字段的GI运行界面,你需要使用GenericInquiryGraph(这是专门用于运行GI的图),并完成以下步骤:
- 获取目标GI的设计记录,拿到它的
DesignID - 实例化
GenericInquiryGraph并绑定目标GI - (可选)设置GI的筛选参数,自动填充指定字段
- 触发界面跳转
下面是完整的代码示例:
// 1. 根据GI名称获取对应的设计记录 string giName = "AM-Cost"; GIDesign giDesign = PXSelect<GIDesign, Where<GIDesign.name, Equal<Required<GIDesign.name>>>>.Select(this, giName); if (giDesign == null) return; // 2. 实例化通用查询的运行图 GenericInquiryGraph giGraph = PXGraph.CreateInstance<GenericInquiryGraph>(); // 绑定要运行的GI(通过DesignID) giGraph.GIID = giDesign.DesignID; // 3. 自动填充筛选字段(示例:假设你的GI有一个筛选字段对应记录ID) // 方式1:通过Filter的通用属性设置(对应GI设计里的filter1、filter2...) giGraph.Filter.Cache.SetValueExt<GenericInquiryFilter.filter1>(giGraph.Filter.Current, "你的目标记录ID"); // 方式2:如果筛选字段绑定了具体DAC字段(比如AMCost.docID),可以直接设置对应属性 // giGraph.Filter.Cache.SetValueExt<GenericInquiryFilter.docID>(giGraph.Filter.Current, Base.Document.Current.DocID); // 4. 刷新GI数据,确保筛选生效 giGraph.Views[giDesign.ResultView].Refresh(); // 5. 跳转到GI运行界面 throw new PXRedirectRequiredException(giGraph, "查看实体") { Mode = PXBaseRedirectException.WindowMode.NewWindow };
额外提示
- 如何确认筛选字段对应的属性?你可以在GI设计界面的「筛选」标签页,查看每个筛选字段的「属性名称」(比如
filter1),或者如果是绑定了DAC字段的筛选,直接使用DAC的字段名即可。 - 如果是从某个单据跳转(比如从资产卡片跳转到AM-Cost GI),可以从当前图的
Current记录中提取ID,再设置到GI的筛选参数里,实现上下文关联。
备注:内容来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

