为Portal DAC InventoryLines扩展PXCacheExtension后PXProjection字段不填充排障
问题分析与修正方案
你遇到的新字段无法填充数据,核心问题有三个:
1. PXProjection特性误用
你把[PXProjection]特性加在了**缓存扩展类(InventoryLinesExt)**上,但PXProjection是用来定义主DAC的投影查询的,不能直接加在扩展类上。原InventoryLines已经是PXProjection类型的DAC,扩展类只需扩展字段,不需要重复定义投影——重复定义会覆盖原查询逻辑,导致新字段无法关联到正确的数据源。
2. 字段未绑定到基础表对应字段
新增的StkItem和ItemClassID字段仅用了[PXDBBool]、[PXDBInt]属性,未指定它们对应的基础表字段。在投影DAC的扩展中,必须显式指定字段来自原投影查询中的表(比如InventoryItem),否则系统无法识别数据来源。
3. PXDefault中的字段上下文错误
ItemClassID的PXDefault逻辑里用了stkItem.FromCurrent,这里的stkItem是你在扩展类中定义的抽象字段,实际应该引用原InventoryItem表的stkItem字段,否则默认值逻辑无法获取正确的上下文数据。
修正后的代码
namespace SP.Objects.IN { public class InventoryLinesExt : PXCacheExtension<InventoryLines> { #region StkItem // 显式绑定到InventoryItem表的stkItem字段 [PXDBBool(typeof(InventoryItem.stkItem))] [PXUIField(DisplayName = "Stock Item")] public virtual Boolean? StkItem { get; set; } public abstract class stkItem : BqlBool.Field<stkItem> { } #endregion #region ItemClassID // 显式绑定到InventoryItem表的itemClassID字段 [PXDBInt(typeof(InventoryItem.itemClassID))] [PXUIField(DisplayName = "Item Class", Visibility = PXUIVisibility.SelectorVisible)] [PXDimensionSelector(INItemClass.Dimension, typeof(Search<INItemClass.itemClassID>), typeof(INItemClass.itemClassCD), DescriptionField = typeof(INItemClass.descr), CacheGlobal = true)] // 修正PXDefault中的字段引用,使用InventoryItem的stkItem [PXDefault(typeof( Search2<INItemClass.itemClassID, InnerJoin<INSetup, On<InventoryItem.stkItem.FromCurrent.IsEqual<False>.And<INSetup.dfltNonStkItemClassID.IsEqual<INItemClass.itemClassID>>. Or<InventoryItem.stkItem.FromCurrent.IsEqual<True>.And<INSetup.dfltStkItemClassID.IsEqual<INItemClass.itemClassID>>>>>>>>))] [PXUIRequired(typeof(INItemClass.stkItem))] public virtual int? ItemClassID { get; set; } public abstract class itemClassID : BqlInt.Field<itemClassID> { } #endregion } }
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

