我工作的公司生产门、视野板(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 个月内自学的。
谢谢大家, 亚历克斯
正如 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 行上标记它。