Acumatica PXProjection使用遇CS1031错误:SO表单新增门标签页求助
问题分析与修复方案
错误原因
你的代码存在几个关键问题导致CS1031错误:
- 投影类继承关系冗余:外层
DoorTab类继承SOLineExt完全没必要,投影类只需实现IBqlTable接口即可。 - BQL查询逻辑错误:你尝试自连接
SOLineExt,但筛选条件里引用了SOLine.inventoryID——SOLineExt是SOLine的扩展字段,正确逻辑应该是从SOLine主表关联其扩展表SOLineExt。 - BQL语法格式错误:代码里用了转义后的
<和>,实际编译时必须用原生的<和>;同时连接条件的写法不符合Acumatica BQL规范。
修复后的代码
using System; namespace PXProjectionTest { [PXProjection(typeof(SelectFrom<SOLine> .InnerJoin<SOLineExt>.On<SOLine.inventoryID.IsEqual<SOLineExt.inventoryID>> .Where<SOLineExt.usrIsDoor.IsEqual<True>>))] public class DoorTab : IBqlTable { #region UsrIsDoor [PXDBBool(IsKey = false, BqlField = typeof(SOLineExt.usrIsDoor))] [PXUIField(DisplayName = "Is a Door?")] public virtual bool? UsrIsDoor { get; set; } #endregion // 示例:添加SOLine主表字段,按需扩展 #region InventoryID [PXDBInt(BqlField = typeof(SOLine.inventoryID))] [PXUIField(DisplayName = "Inventory ID")] public virtual int? InventoryID { get; set; } public abstract class inventoryID : PX.Data.BQL.BqlInt.Field<inventoryID> { } #endregion } }
关键修改点说明
- 移除多余的外层继承类,直接将
PXProjection特性标记在实现IBqlTable的DoorTab类上。 - 修正BQL查询:从
SOLine主表出发关联扩展表SOLineExt,用Acumatica标准的IsEqual语法替代Equal,用BQL常量True替代原生true。 - 调整
UsrIsDoor的IsKey属性为false,该字段不适合作为投影表主键,主键应复用SOLine的OrderNbr、LineNbr等原有主键字段(可按需添加)。 - 新增
InventoryID字段示例,展示如何在投影类中关联主表字段,你可以根据需求添加更多需要展示的字段。
后续实现建议
- 为视窗、墙面/天花板面板创建投影类时,只需复制上述结构,修改
Where条件中的对应字段(如usrIsWindow、usrIsWallPanel)即可。 - 在SO表单的Graph中声明投影类视图,示例:
之后在ASPX页面添加标签页并绑定该视图即可。public PXSelect<DoorTab, Where<DoorTab.orderNbr, Equal<Current<SOOrder.orderNbr>>>> DoorTabView;
内容的提问来源于stack exchange,提问作者Aleks Iwan
相关产品推荐
相关产品推荐

