【问题标题】:Cannot get Events.CacheAttached to recognize custom Attribute in Acuamtica无法获取 Events.CacheAttached 以识别 Acuamtica 中的自定义属性
【发布时间】:2021-04-01 02:48:51
【问题描述】:

这是我在这里发布的问题Override action on curyOrigDiscAmt 的后续行动

按照那里的建议,我正在尝试:

  1. 根据原来的 TermsAttribute 创建自定义属性 类。

  2. 覆盖字段 APInvoice.TermsID

  3. 使用自定义属性装饰字段 APInvoice.TermsID 和 用它来替换原来的条款。

  4. 终于改变了CalcDisc()方法的逻辑

这是我所做的:

1.自定义属性:

public class CTERMSIDAttribute : PX.Objects.CS.TermsAttribute
{
    public CTERMSIDAttribute(Type DocDate, Type DueDate, Type DiscDate, Type CuryDocBal, Type CuryDiscBal) : base(DocDate, DueDate, DiscDate, CuryDocBal, CuryDiscBal)
    {
        var cBalance = _CuryDocBal;
        var cDiscount = _CuryDiscBal;
        int i = 0;
    }

    protected override void CalcDisc(PXCache sender, PXFieldUpdatedEventArgs e)
    {
        base.CalcDisc(sender, e);
        int i2 = 0;
        
    }
}

注意:目前没有任何事情要做。我只是在 int i = 0 上放了一个断点,以确保我的代码在运行时被执行。

我还创建了一个用新创建的属性装饰的类:

public class CTermID : Vendor.termsID
{
    [PXDBString(10, IsUnicode = true)]
    [PXDefault(typeof(Search<Vendor.termsID,
        Where<Vendor.bAccountID, Equal<Current<APInvoice.vendorID>>,
            And<Current<APInvoice.docType>, NotEqual<APDocType.debitAdj>>>>),
        PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Terms", Visibility = PXUIVisibility.Visible)]
    [APTermsSelector]
    [CTERMSIDAttribute(typeof(APInvoice.docDate), typeof(APInvoice.dueDate), typeof(APInvoice.discDate),
           typeof(APInvoice.curyOrigDocAmt), typeof(APInvoice.curyOrigDiscAmt))]
    public string termsID   { get;  set; }
}

我不确定这是否需要,也没有使用,但我在 sn-p 中看到了它,所以我实现了它。

2 & 3. 覆盖和装饰

    [PXMergeAttributes(Method = MergeMethod.Append)] // add to other properties 
    [PXRemoveBaseAttribute(typeof(Vendor.termsID))]  // remove existing property
    [CTERMSIDAttribute(typeof(APInvoice.docDate), typeof(APInvoice.dueDate), typeof(APInvoice.discDate),
               typeof(APInvoice.curyOrigDocAmt), typeof(APInvoice.curyOrigDiscAmt))]
    public CTermID termsID { get; set; }   // redefine termsID to use custom attribute
    protected virtual void _(Events.CacheAttached<APInvoice.termsID> e)
    {
        int i3 = 0;
    }

4. CalcDisc() 的覆盖方法

这是在新属性中(之前在步骤 1 中显示):

    protected override void CalcDisc(PXCache sender, PXFieldUpdatedEventArgs e)
    {
        base.CalcDisc(sender, e);
        int i2 = 0;            
    }

同样,它现在什么都不做,我只是在 int i2 = 0 处放置一个断点来检查它是否在运行时命中。事实并非如此。

发生的情况是第一个断点 (i=0) 命中......实际上它命中了好几次......但其他断点都没有,这告诉我覆盖工作不正常。

我错过了什么?

[编辑] 根据 Patrick Chen 的建议,我将其更改为:

[PXMergeAttributes(Method = MergeMethod.Replace)]
[CTERMSIDAttribute(typeof(APInvoice.docDate), typeof(APInvoice.dueDate), typeof(APInvoice.discDate), typeof(APInvoice.curyOrigDocAmt), typeof(APInvoice.curyOrigDiscAmt))]
public CTermID termsID { get; set; }   // redefine termsID to use custom attribute
protected virtual void _(Events.CacheAttached<APInvoice.termsID> e)
      {
        int i = 0;
      }

我的 DoCalc() 版本仍然没有被触发。

【问题讨论】:

    标签: c# acumatica


    【解决方案1】:

    我建议放弃此声明

     [PXRemoveBaseAttribute(typeof(Vendor.termsID))] 
    

    一起去

     [PXMergeAttributes(Method = MergeMethod.Replace)]
    

    以及您想要使用的供应商的任何库存属性。

    【讨论】:

    • 我可能误解了你的建议,但我做了你建议的改变(我认为),结果是一样的(参见原始问题中的编辑)谢谢!
    • 删除公共 CTermID termsID { get;放; } 声明。
    • 对。呸!但是,我仍然没有让我的属性覆盖运行。 (令人沮丧的一件事是我无法在其中设置断点以查看发生了什么。)
    • 对 CalcDisc 的调用在基类 FieldUpdated 事件中。因为调用在基类中,它将继续调用基类方法而不是覆盖。
    • 您有效地覆盖了自定义属性中的方法,但没有人调用它。这就是为什么您需要在自定义属性中而不是在基类中使用 FieldUpdated 方法,因为这是对 CalcDisc 的唯一调用。
    【解决方案2】:

    在您的自定义属性中没有调用CalcDisc 方法的机制。

    TermsAttribute 中,FieldUpdated 事件处理程序用于调用CalcDisc 方法:

    FieldUpdated 方法不存在于自定义属性中,因此该方法不会被任何机制调用。自定义属性必须更紧密地遵循具有大约十几个方法的原始实现。

    【讨论】:

    • 在哪里可以找到原始实现?
    • 在源代码页面 SM204570 上,搜索“class TermsAttribute”。结果只有一个。具有不同名称的原始属性的复制粘贴可能会产生与原始属性相同的结果。
    • 但是,这使得我正在做的自定义容易受到任何未来课程更新的影响。我宁愿简单地调用基本行为,然后在之后插入我的代码——例如我如何在 Windows 窗体应用程序中处理事件。但是,在这种情况下这是一个挑战,因为该属性具有私有方法,因此无法从我的属性扩展类中调用。无论如何...谢谢,我现在知道该怎么做。
    • 确切地说,无法覆盖私有/内部方法。
    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2020-07-15
    • 2017-05-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多