首页 > 解决方案 > 如何扩展项目报价屏幕 (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;
    }
}

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

标签: c#asp.netwebformsuser-controlsacumatica

解决方案


正如 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 种不同类型的数据结构。一种是子记录(主从关系),它使用 [PXParent] 属性与 [PXDBDefault] 一起使用父表中的相关值填充字段。如果您的数据是“此报价的项目”,那么您需要在 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 让我相信这是一个关键链接,您不会将同一记录引用到其他报价。当您删除父 PMQuote 记录时,此方法会导致子记录被删除。

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


推荐阅读