如何在行选择事件 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
}
}
现在我想检查该字段中的值以了解如何调整折扣字段。我如何获得这个值?
[编辑]
这允许我获得扩展名,但该值为空,即使我已经检查了记录,并且那里存在一个值。
我先设置了一条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 的值为空。
[编辑]
我尝试了 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,但是上面的代码应该可以检索扩展名。如果您的扩展中仍然有一个空值,我会说这很可能是因为一个值永远不会分配给它,您可能需要 post 更多代码以便我们评估这里实际发生的事情。
我的用例是,在开具账单时,客户希望能够指定账单金额中没有折扣的部分。 (例如,总账单是 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
}
}
现在我想检查该字段中的值以了解如何调整折扣字段。我如何获得这个值?
[编辑] 这允许我获得扩展名,但该值为空,即使我已经检查了记录,并且那里存在一个值。
我先设置了一条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 的值为空。
[编辑]
我尝试了 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,但是上面的代码应该可以检索扩展名。如果您的扩展中仍然有一个空值,我会说这很可能是因为一个值永远不会分配给它,您可能需要 post 更多代码以便我们评估这里实际发生的事情。