繁体   English   中英

如何在行选择事件 Acumatica 上检索用户自定义字段

[英]How to retrieve user Custom Field on row selected event Acumatica

我的用例是,在制作账单时,客户希望能够指定未应用折扣的账单金额的一部分。 (例如,总账单为 125 美元,客户通过货到付款获得 10% 的折扣,但该折扣不适用于运费。所以,他们想说:“其中 25 美元不可折扣”)

然后,我想基于此自定义字段覆盖折扣金额字段。

我通过自定义编辑器向我的 APInvoice DAC 添加了一个数据字段,然后在我的 C# 代码中将其激活为扩展:

namespace AcmeCorp.DAC
{
    [PXCacheName("APInvoice")]
    public class APInvoiceExt : PXCacheExtension<APInvoice>
    {
        public static bool IsActive()  { return true; }
        // Auto-Generated from ERP Customization Editor
        #region UsrAmountExcludedFromDiscount
        [PXDBDouble()]
        [PXUIField(DisplayName = "Amt Excluded Discount")]
        public virtual double? UsrAmountExcludedFromDiscount { get; set; }
        public abstract class usrAmountExcludedFromDiscount : PX.Data.BQL.BqlDouble.Field<usrAmountExcludedFromDiscount> { }
        #endregion
    }
}

现在我想检查该字段中的值以了解如何调整折扣字段。 我如何获得这个值?

[编辑] 这允许我获取扩展名,但值是 null,即使我已经检查了记录,并且那里有一个值。

我首先设置了一个 using 语句:

using APInvoiceExtension = Acme.DAC.APInvoiceExt;

然后我可以在 GetExtension() 方法中使用它:

    protected virtual void _(Events.RowSelected<APInvoice> e)
    {
        if (e.Row == null) return;
        double? Amt2Exclude = null;

        APInvoice apInvoice = e.Row as APInvoice;

        var chkRef = apInvoice.RefNbr;
        var ext = PXCache<APInvoice>.GetExtension<APInvoiceExtension>(apInvoice);
        if (ext != null)
        {
            Amt2Exclude = ext.UsrAmountExcludedFromDiscount;
        }
    }

RefNbr 的值很好。 但是,正如我所说,UsrAmountExcludedFromDiscount 的值是 null。

[编辑] 我尝试了 Rick 的建议并得到了同样的错误: 在此处输入图像描述

怎么样

APInvoiceExt  ext = PXCache<APInvoice>.GetExtension<APInvoiceExt>(apInvoice);

编辑:

namespace PX.Objects.AP
{

  public class APRegisterExt : PXCacheExtension<PX.Objects.AP.APRegister>
  {
    #region UsrAmountExcludedFromDiscount
    [PXDBDecimal]
    [PXUIField(DisplayName="Amt Excluded Discount")]
    public virtual Decimal? UsrAmountExcludedFromDiscount { get; set; }
    public abstract class usrAmountExcludedFromDiscount : PX.Data.BQL.BqlDecimal.Field<usrAmountExcludedFromDiscount> { }
    #endregion
  }
  
  
  public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry>
  {
    #region Event Handlers

    protected void APInvoice_RowSelecting(PXCache cache, PXRowSelectingEventArgs e)
    {
      if (e.Row == null) return;
      decimal? Amt2Exclude = null;
      APRegister apInvoice = e.Row as APRegister;

      var chkRef = apInvoice.RefNbr;
      var ext = PXCache<APRegister>.GetExtension<APRegisterExt>(apInvoice);
      if (ext != null)
      {
          Amt2Exclude = ext.UsrAmountExcludedFromDiscount;
      }  
      PXTrace.WriteInformation($"REF : {apInvoice.RefNbr}");
    }

    #endregion
  }
}

有几件事我有点困惑,比如您的 DAC 在代码示例中具有命名空间 AcmeCorp.DAC,但您有一个使用不同命名空间的 using 语句。 在这种情况下,以及在使用货币的任何情况下,我也可能会为您的数据类型使用双精度的小数。

要检索扩展,您可以简单地执行以下操作。

protected virtual void _(Events.RowSelected<APInvoice> eventHandler)
{
    APInvoice row = eventHandler.Row;
    if (row is null) return;

    APInvoiceExtension rowExt = row.GetExtension<APInvoiceExtension>();

    if (rowExt != null)
    {
        excludedAmount = rowExt.UsrAmountExcludedFromDiscount;
    }
}

我可能会避免在您的 using 语句中将扩展名从 APInvoiceExt 重命名为 APInvoiceExtension,但上面的代码应该可以检索扩展名。 如果您的扩展程序中仍有 null 值,我会说这很可能是因为从未为其分配值,您可能需要发布更多代码供我们评估此处实际发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM