【问题标题】:How to retrieve user Custom Field on row selected event Acumatica如何在行选择事件 Acumatica 上检索用户自定义字段
【发布时间】:2021-03-27 02:28:39
【问题描述】:

我的用例是,在制作账单时,客户希望能够指定未应用折扣的部分账单金额。 (例如,总账单为 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 的建议并得到了同样的错误:

【问题讨论】:

  • PXCache.GetExtension(apInvoice);

标签: c# acumatica


【解决方案1】:

有几件事我有点困惑,比如您的 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,但上面的代码应该可以检索扩展名。如果你的扩展中仍然有一个空值,我会说这很可能是因为一个值永远不会被分配给它,你可能需要发布更多代码让我们评估这里实际发生的事情。

【讨论】:

  • 我将把它标记为解决方案,因为它是最干净的例子。现实情况是,我在自定义数据脚本中更改了自定义字段的名称时发生了一些奇怪的事情。 IDK 如何或何时发生。但是在我在我的测试记录中设置了值之后。因此,它不在 SQL 数据库中,但仍显示在屏幕上。在我修复之后,一切正常。 (哦,我还把它从 Double 改成了 decimal...)
【解决方案2】:

怎么样

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
  }
}

【讨论】:

  • 很遗憾,没有。同样的错误。 (我截图了,我会添加到我的原帖中。)
  • 在上面进行了更改。自定义字段实际上是在 APRegister 上添加的。所以可能需要在 RowSelecting 事件中将 APInvoice 子类化为 APRegister。
  • 在 APRegister 上取得了不错的成绩。即使我没有在那里添加该字段,但不知何故,一个出现在那里,这是问题的一部分。我希望我知道是什么导致了问题,但是一旦我在 ERP 自定义编辑器中修复了它,其他一切都运行良好。感谢您的帮助。
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 2021-10-03
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多