如何扩展项目报价屏幕 (PM304500)?

How do I extend Project Quote Screen (PM304500)?

我被要求添加一个新选项卡,在项目报价屏幕 (PM304500) 上显示链接到项目报价的项目列表。我需要一些帮助来解决这个问题,因为我正在努力识别我需要扩展的图表(或 DAC)以便能够添加我的自定义视图。

这是我要在新选项卡上显示的项目的 DAC,仍需要处理。

using System;
using PX.Data;

namespace *******
{
  [Serializable]
  [PXCacheName("BOQUMaster")]
  public class BOQUMaster : IBqlTable
  {
    #region MasterID
    [PXDBIdentity(IsKey = true)]
    public virtual int? MasterID { get; set; }
    public abstract class masterID : PX.Data.BQL.BqlInt.Field<masterID> { }
    #endregion

    #region MasterCD
    [PXDBString(20, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Master CD")]
    public virtual string MasterCD { get; set; }
    public abstract class masterCD : PX.Data.BQL.BqlString.Field<masterCD> { }
    #endregion

    #region Description
    [PXDBString(100, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Description")]
    public virtual string Description { get; set; }
    public abstract class description : PX.Data.BQL.BqlString.Field<description> { }
    #endregion

    #region MasterOnProjectStatus
    [PXDBString(20, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Master On Project Status")]
    public virtual string MasterOnProjectStatus { get; set; }
    public abstract class masterOnProjectStatus : PX.Data.BQL.BqlString.Field<masterOnProjectStatus> { }
    #endregion

    #region DefaultInstallRatio
    [PXDBDecimal()]
    [PXUIField(DisplayName = "Default Install Ratio")]
    public virtual Decimal? DefaultInstallRatio { get; set; }
    public abstract class defaultInstallRatio : PX.Data.BQL.BqlDecimal.Field<defaultInstallRatio> { }
    #endregion

    #region ContractID
    [PXDBInt()]
    [PXUIField(DisplayName = "Contract ID")]
    public virtual int? ContractID { get; set; }
    public abstract class contractID : PX.Data.BQL.BqlInt.Field<contractID> { }
    #endregion

    #region QuoteID
    [PXDBGuid()]
    [PXUIField(DisplayName = "Quote ID")]
    public virtual Guid? QuoteID { get; set; }
    public abstract class quoteID : PX.Data.BQL.BqlGuid.Field<quoteID> { }
    #endregion

    #region Tstamp
    [PXDBTimestamp()]
    [PXUIField(DisplayName = "Tstamp")]
    public virtual byte[] Tstamp { get; set; }
    public abstract class tstamp : PX.Data.BQL.BqlByteArray.Field<tstamp> { }
    #endregion

    #region CreatedByID
    [PXDBCreatedByID()]
    public virtual Guid? CreatedByID { get; set; }
    public abstract class createdByID : PX.Data.BQL.BqlGuid.Field<createdByID> { }
    #endregion

    #region CreatedByScreenID
    [PXDBCreatedByScreenID()]
    public virtual string CreatedByScreenID { get; set; }
    public abstract class createdByScreenID : PX.Data.BQL.BqlString.Field<createdByScreenID> { }
    #endregion

    #region CreatedDateTime
    [PXDBCreatedDateTime()]
    public virtual DateTime? CreatedDateTime { get; set; }
    public abstract class createdDateTime : PX.Data.BQL.BqlDateTime.Field<createdDateTime> { }
    #endregion

    #region LastModifiedByID
    [PXDBLastModifiedByID()]
    public virtual Guid? LastModifiedByID { get; set; }
    public abstract class lastModifiedByID : PX.Data.BQL.BqlGuid.Field<lastModifiedByID> { }
    #endregion

    #region LastModifiedByScreenID
    [PXDBLastModifiedByScreenID()]
    public virtual string LastModifiedByScreenID { get; set; }
    public abstract class lastModifiedByScreenID : PX.Data.BQL.BqlString.Field<lastModifiedByScreenID> { }
    #endregion

    #region LastModifiedDateTime
    [PXDBLastModifiedDateTime()]
    public virtual DateTime? LastModifiedDateTime { get; set; }
    public abstract class lastModifiedDateTime : PX.Data.BQL.BqlDateTime.Field<lastModifiedDateTime> { }
    #endregion

    #region Noteid
    [PXNote()]
    public virtual Guid? Noteid { get; set; }
    public abstract class noteid : PX.Data.BQL.BqlGuid.Field<noteid> { }
    #endregion
  }
}

我想要的视图看起来像这样,但显然我需要修改我正在扩展的图表

using PX.Data.BQL.Fluent;
using PX.Objects.CR;
using PX.Objects.PM;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace *******
{
    //What graph do I need to extend here or do I need to think about another approach?
    public class PMQuoteMaint_Extension : PXGraphExtension<PMQuoteMaint>
    {
        // The data view I will need to add to the extend class will look something like this
        //public SelectFrom<BOQUMaster>.Where<BOQUMaster.quoteID.IsEqual<PMQuoteMaint.quoteID.FromCurrent>>.View BillOfQuantities;
    }
}

请随时在评论中添加任何有用的文章或链接。

正如 Rick 所说,您似乎来对地方了。但是,您定义的视图(已注释掉)尝试从 PMQuoteMaint 访问 quoteID,这是一个图形。您需要从 PMQuote 中提取,因为它是图表的主要 DAC。

您的代码(注释掉):

public SelectFrom<BOQUMaster>
    .Where<BOQUMaster.quoteID.IsEqual<PMQuoteMaint.quoteID.FromCurrent>>
    .View BillOfQuantities;

更正后的代码:

public SelectFrom<BOQUMaster>
    .Where<BOQUMaster.quoteID.IsEqual<PMQuote.quoteID.FromCurrent>>
    .View BillOfQuantities;

做这类工作时,可以利用 2 种不同类型的数据结构。一个是子记录(master-detail 关系),它使用 [PXParent] 属性与 [PXDBDefault] 结合使用父 table 中的相关值填充字段。如果您的数据是“此报价的项目”,那么您的 DAC 中需要类似于 PMQuoteTask 的东西...

public partial class PMQuoteTask : PX.Data.IBqlTable
{
    #region QuoteID
    public abstract class quoteID : PX.Data.BQL.BqlGuid.Field<quoteID> { }
    [PXDBGuid(IsKey = true)]
    [PXDBDefault(typeof(PMQuote.quoteID))]
    [PXParent(typeof(Select<PMQuote, Where<PMQuote.quoteID, Equal<Current<quoteID>>>>))]
    public virtual Guid? QuoteID { get; set; }
    #endregion

    #region TaskCD
    public abstract class taskCD : PX.Data.BQL.BqlString.Field<taskCD> { }
    [PXDimension(ProjectTaskAttribute.DimensionName)]
    [PXDBString(IsUnicode = true, IsKey = true, InputMask = "")]
    [PXDefault()]
    [PXUIField(DisplayName = "Project Task", Visibility = PXUIVisibility.SelectorVisible)]
    public virtual String TaskCD { get; set; }
    #endregion
...
}

请注意,DAC 具有 QuoteID 和 TaskCD 键。 QuoteID 定义了 PMQuote 的父级,它是图形的主要 DAC。在您的 DAC 中使用 QuoteID 让我相信这是一个关键 link,并且您不会将相同的记录引用到其他报价。当您删除父 PMQuote 记录时,此方法会导致子记录被删除。

但是,您的记录似乎是另一种类型的...相关数据。这实际上是使用选项卡来显示通常会在查询菜单中显示的 GI 中的数据。当业务案例需要时,您当然可以在选项卡中执行此操作。虽然可以在此处将数据检索到新选项卡的视图中,但我建议您使用 .View.ReadOnly,因为它只是参考数据。这将防止更改此屏幕上的数据,因为这不是该 DAC 的主要图形。防止在 DAC 的主要图表之外进行更改的原因是,主要图表中的事件处理程序的使用不会从此 (non-primary) 图表中触发。您可以考虑在选项卡中制作 BOQUMaster.MasterCD 的 link,以便可以从 BOQUMaster 的主要图表中进行更改。