Acumatica PX投影问题

问题描述 投票:0回答:1

我工作的公司生产门、视野板(VP/窗户)以及墙壁和天花板。

我正在尝试在 SO 表格上制作一个新选项卡,该选项卡将用于门,并最终为 VP、墙壁和天花板制作一个选项卡。

为此,我尝试利用 PXProjection 并首先让它工作,但我没有任何运气,我的代码如下,如果有人有任何建议,我将不胜感激。

using System;

namespace PXProjectionTest
{
  public partial class DoorTab : SOLineExt
  {
    [PXProjection(typeof(SelectFrom<SOLineExt,
                              InnerJoin<SOLineExt>.
                                        On<SOLineExt.inventoryID.Equal<SOLine.inventoryID>>.
                             **Where<SOLineExt.usrIsDoor, Equal<true>>>))]**
    public class DoorTab : IBqlTable
    {
      
     #region UsrIsDoor
     [PXDBBool(IsKey = true, BqlField = typeof(SOLineExt.usrIsDoor))]
     [PXUIField(DisplayName = "Is a Door?")]
     public virtual bool? UsrIsDoor { get; set; }
     #endregion
    }
  }
}

我在第 10 行收到错误 CS1031: Type Expected,我已将其以粗体显示。 我尝试过不使用第一个公共部分类,不使用命名空间,也不使用 using.System,但似乎没有任何效果,并且根据我非常有限的知识,我无法找出代码中的错误。 我将非常感谢收到的任何建议,因为我的编码知识非常有限,都是在过去 3 个月内自学的。

谢谢大家, 亚历克斯

acumatica acumatica-kb
1个回答
0
投票

正如 Brendan 提到的,您不要在 DAC 字段的定义上使用 PXProjection 属性。

这是一个简单的 PXProjection 示例:

namespace SSCS.IN
{
    [PXProjection(typeof(Select5<INPIHeader,
        InnerJoin<INPIDetail,
            On<INPIDetail.FK.PIHeader>>,
        Where<INPIHeader.status, Equal<INPIHdrStatus.completed>,
            And<INPIDetail.status, Equal<INPIDetStatus.entered>>>,
        Aggregate<GroupBy<INPIHeader.siteID,
            GroupBy<INPIDetail.inventoryID,
            GroupBy<INPIDetail.subItemID,
            GroupBy<INPIDetail.locationID,
            Max<INPIHeader.countDate>>>>>>>))]
    [Serializable]
    [PXHidden]
    public partial class LastPICountDate : PX.Data.IBqlTable
    {
        #region SiteID
        public abstract class siteID : PX.Data.BQL.BqlInt.Field<siteID> { }
        [Site(BqlField = typeof(INPIHeader.siteID))]
        public virtual Int32? SiteID  {get; set; }
        #endregion
        
        #region InventoryID
        public abstract class inventoryID : PX.Data.BQL.BqlInt.Field<inventoryID> { }
        [Inventory(BqlField = typeof(INPIDetail.inventoryID))]
        public virtual Int32? InventoryID {get; set; }
        #endregion
        
        #region SubItemID
        public abstract class subItemID : PX.Data.BQL.BqlInt.Field<subItemID> { }
        [PXDefault(typeof(Search<InventoryItem.defaultSubItemID,
            Where<InventoryItem.inventoryID, Equal<Current<INPIDetail.inventoryID>>,
            And<InventoryItem.defaultSubItemOnEntry, Equal<boolTrue>>>>))]
        [SubItem(typeof(INPIDetail.inventoryID), BqlField = typeof(INPIDetail.subItemID))]
        public virtual Int32? SubItemID  {get; set; }
        #endregion

        #region LocationID
        public abstract class locationID : PX.Data.BQL.BqlInt.Field<locationID> { }
        [Location(typeof(INPIHeader.siteID), Visibility = PXUIVisibility.SelectorVisible, BqlField = typeof(INPIDetail.locationID))]
        public virtual Int32? LocationID {get; set; }
        #endregion

        #region CountDate
        public abstract class lastCountDate : PX.Data.BQL.BqlDateTime.Field<lastCountDate> { }
        [PXDBDate(BqlField = typeof(INPIHeader.countDate))]
        public virtual DateTime? LastCountDate {get; set; }
        #endregion
    }
}

也就是说,您似乎表示要在 SOOrderEntry 屏幕 (SO301000) 中添加一个新的选项卡项。如果是这种情况,您需要将门字段添加到 DAC 扩展中,然后希望在 SOOrderEntry 的图形扩展中创建一个视图,然后将该视图用于新选项卡的数据源。

DAC 扩展应该看起来像这样:

namespace SSCS.SO
{
    public sealed class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine>
    {
        public static bool IsActive() =>
            SSCSAccess.FeatureInstalled<SSCSFeaturesSet.main>();
        
        #region UsrIsDoor
        [PXDBBool]
        [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
        [PXUIField(DisplayName = "Door")]
        public bool? UsrIsDoor { get; set; }
        public abstract class usrIsDoor : PX.Data.BQL.BqlBool.Field<usrIsDoor> { }
        #endregion
    }
}

图形扩展应该看起来像这样:

namespace SSCS.SO
{

    public class SOOrderEntry_Extension : PXGraphExtension<PX.Objects.SOOrderEntry>
    {
        public static bool IsActive() =>
            SSCSAccess.FeatureInstalled<SSCSFeaturesSet.main>();
            
        [PXViewName(SSCS.SO.Messages.ViewMyDoorView)]
        public SelectFrom<SOLine>
            .Where<SOLine.orderType.IsEqual<SOOrder.orderType.FromCurrent>
                .And<SOLine.orderNbr.IsEqual<SOOrder.orderNbr.FromCurrent>
                .And<SOLineExt.isDoor.IsEqual<True>>>>
            .View.ReadOnly Doors;
            
    }
}

然后,您可以将新选项卡网格控件上的数据成员设置为 Doors 以从该视图中提取字段。

从此处冲洗并重复 VP 标签。

如果您想要做的只是确定 SO 的哪些行是门或 VP,那么您只需将字段添加到 DAC 扩展并进行相应设置,然后使用“事务”视图显示在主选项卡上。这对于最终用户来说会更简单、更清晰,除非您特别需要自定义视图。

更进一步,在我看来,这些都是库存物品,被识别为门或副总裁。因此,在库存物品上捕获这一点会更有意义。 (我们使用“项目类别”字段,但如果您愿意,您可以创建布尔复选框。)如果直接基于库存项目,则无需在每个 SO 行上标记它。

© www.soinside.com 2019 - 2024. All rights reserved.